亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? sermouse.c

?? EP9315 BSP for WinCE 源代碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
    }

    ctmo.ReadIntervalTimeout = MAXDWORD;
    ctmo.ReadTotalTimeoutMultiplier = 0;
    ctmo.ReadTotalTimeoutConstant = 0;

    if ( !SetCommTimeouts(g_hSerial, &ctmo) ) {
        DEBUGMSG(1, (TEXT("SetCommTimeouts error %d\r\n"), GetLastError()));
        return (FALSE);
    }

    if ( !SetCommMask (g_hSerial, EV_RXCHAR) ) {
        DEBUGMSG (ZONE_ERROR, (TEXT("Error from SetCommMask  %d\r\n"), GetLastError()));
        return (FALSE);
    }

    FUNC("-InitSerialPort");
    return (TRUE);
}



// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
DWORD 
SRM_Init(
        DWORD dwInitParam
        ) 
{
    BOOL fRet = FALSE;

    FUNC("+SRM_Init");

    g_hReadThread = NULL;
    g_hSerial = (HANDLE) NULL;
    g_hThreadStopped = CreateEvent (0, FALSE, FALSE, 0);
    g_fStopThread = FALSE;

    if ( DetectSerialMouse(dwInitParam) ) {

        DEBUGMSG(1, (TEXT("Serial Mouse Found.\r\n")));

        g_hReadThread = CreateThread(NULL, 0, ReadThread, 0, 0, NULL);
        if ( g_hReadThread == NULL ) {
            DEBUGMSG(1, (TEXT("Fatal Error!  Failed to create SerMouse Read thread.\r\n")));
            return (FALSE);
        } else {
            // We don't need the thread handle we just got, so we're going to 
            // close it right away.
            CloseHandle(g_hReadThread);
            g_hReadThread = NULL;
        }
        fRet = TRUE;
    }

    FUNC("-SRM_Init");
    return (fRet);
}   



// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
BOOL  
SRM_Deinit(
          DWORD dwData
          ) 
{
    FUNC("+SRM_Deinit");

    //
    // Tell the ReadThread to shut down as soon as possible.
    //
    g_fStopThread = TRUE;

    if ( g_hSerial ) {
        // 
        // WakeUp the WaitCommEvent if necessary
        //
        SetCommMask (g_hSerial, 0);
    }

    WaitForSingleObject(g_hThreadStopped, 2000);  // Don't wait forever. 
    DEBUGMSG(ZONE_INIT, (TEXT("THREAD EXIT...\r\n")));

    CloseHandle(g_hThreadStopped);

    if ( g_hSerial != NULL ) {
        CloseHandle(g_hSerial);
        g_hSerial = NULL;
    }

    if ( g_hReadThread != NULL ) {
        CloseHandle(g_hReadThread);
        g_hReadThread = NULL;
    }

    FUNC("-SRM_Deinit");
    return (TRUE);
}



// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
ULONG CALLBACK 
ReadThread(PVOID pv)
{
    const UINT8 cSyncBitMask = 0x40;

    UINT8   serialBytes[3];
    UINT8   rawData[3];
    UINT8   curByte = 0;
    BOOL    bSuccess;
    DWORD   dwBytesRead;
    DWORD   count;
    DWORD   fdwCommMask;


    FUNC("+ReadThread");

    //
    // The thread can be exitted by setting g_fStopThread.
    //
    while ( !g_fStopThread ) {
        //
        // We spend most of our time waiting for a serial event here.
        //
        WaitCommEvent (g_hSerial, &fdwCommMask, 0);

        DEBUGMSG(ZONE_READTHREAD, (TEXT("SerMouse : ReadThread : Past WaitCommEvent\r\n")));

        if ( fdwCommMask & EV_RXCHAR ) {
            //
            // We've woken up due to a real character arriving.
            //
            DEBUGMSG(ZONE_READTHREAD, (TEXT("SerMouse : ReadThread : Char ready\r\n")));

            do {
                //
                // Continue to read the serial port while data is available.
                //
                bSuccess = ReadFile(g_hSerial, &serialBytes, 3, &dwBytesRead, NULL);
                //
                // Only get 7-bits of data back from ReadFile here.
                //
                serialBytes[0] &= 0x7F;
                serialBytes[1] &= 0x7F;
                serialBytes[2] &= 0x7F;

                if ( !bSuccess ) {
                    DEBUGMSG(ZONE_ERROR, (TEXT("SerMouse : ReadFile error %d\r\n"), GetLastError()));
                } else if ( dwBytesRead == 0 ) {
                    //
                    // Timed out with no data read.  Do nothing.
                    //
                    DEBUGMSG(ZONE_DATA, (TEXT("SerMouse : ReadFile timed out with zero bytes\r\n")));
                } else {
                    //
                    // Successfully received commands from the mouse.
                    //
                    DEBUGMSG(ZONE_READTHREAD, (TEXT("SerMouse : ReadThread : Read %d bytes\r\n"), dwBytesRead));
                    for ( count = 0; count < dwBytesRead; count++ ) {
                        // Pick the byte up
                        rawData[curByte] = serialBytes[count];
                        switch ( curByte ) {
                        // First byte has the sync bit set, next two don't.
                        case 0:
                            if ( (rawData[0] & cSyncBitMask) != 0 ) {
                                curByte++;
                            }
                            break;
                        case 1:
                            if ( (rawData[1] & cSyncBitMask) == 0 ) {
                                curByte++;                          
                            } else {
                                curByte = 0;
                            }
                            break;
                        case 2:
                            if ( (rawData[2] & cSyncBitMask) == 0 ) {
                                SendData(rawData);
                            }
                            curByte = 0;
                            break;
                        }
                    }
                }               

            } while ( (!g_fStopThread) && dwBytesRead && bSuccess );
        } else {
            DEBUGMSG(ZONE_READTHREAD, (TEXT("SerMouse : ReadThread : NO CHAR!!!\r\n")));
        }
    }

    //
    // Signal to Deinit that we are exiting now, so it's safe to cleanup.
    //
    SetEvent (g_hThreadStopped);
    return (1);
}   



// -----------------------------------------------------------------------------
//	UINT8 rawData[]	assumed to be 3 long.
// -----------------------------------------------------------------------------
BOOL
SendData(
        UINT8 rawData[]
        )
{
    unsigned int evfMouse = 0;
    static BOOL bLastB0Down = FALSE;
    static BOOL bLastB1Down = FALSE;
    BOOL    bButton0Down;
    BOOL    bButton1Down;
    INT16   xOffset;
    INT16   yOffset;

    DEBUGMSG(ZONE_DATA, (TEXT("SerMouse : +SendData()\r\n")));
    DEBUGMSG(ZONE_DATA, (TEXT("SerMouse : RawData[0x%02X][0x%02X][0x%02X]\r\n"), 
                         rawData[0], rawData[1], rawData[2]));

    bButton0Down = ((rawData[0] & gcB0BitMask) != 0);
    bButton1Down = ((rawData[0] & gcB1BitMask) != 0);

    xOffset = (INT8)(((rawData[0] & 0x03) << 6) | rawData[1]);
    yOffset = (INT8)(((rawData[0] & 0x0C) << 4) | rawData[2]);

    DEBUGMSG(ZONE_DATA, (TEXT("SerMouse : xOffset = %d, yOffset = %d\r\n"), xOffset, yOffset));

    if ( xOffset || yOffset )
        evfMouse |= MOUSEEVENTF_MOVE;

    if ( bLastB0Down != bButton0Down || bButton0Down ) {
        if ( bButton0Down ) {
            DEBUGMSG(ZONE_DATA, (TEXT("SerMouse : Left Button Down\r\n")));
            evfMouse |= MOUSEEVENTF_LEFTDOWN;
        } else {
            DEBUGMSG(ZONE_DATA, (TEXT("SerMouse : Left Button Up\r\n")));
            evfMouse |= MOUSEEVENTF_LEFTUP;
        }

        bLastB0Down = bButton0Down;
    }

    if ( bLastB1Down != bButton1Down || bButton1Down ) {
        if ( bButton1Down ) {
            DEBUGMSG(ZONE_DATA, (TEXT("SerMouse : Right Button Down\r\n")));
            evfMouse |= MOUSEEVENTF_RIGHTDOWN;
        } else {
            DEBUGMSG(ZONE_DATA, (TEXT("SerMouse : Right Button Up\r\n")));
            evfMouse |= MOUSEEVENTF_RIGHTUP;
        }

        bLastB1Down = bButton1Down;
    }

    mouse_event(evfMouse, xOffset, yOffset, 0, 0);

    DEBUGMSG(ZONE_DATA, (TEXT("SerMouse : -SendData()\r\n")));
    return (TRUE);
}




// -----------------------------------------------------------------------------
//
//  These are the required entry points needed by DEVICE.EXE in order to 
//  load as a device driver. The Serial Mouse driver is pretty simply though
//  so all we need to do is load and run. We only implement Init and Deinit.
//
//  You could make a nice little Mouse Set Speed utility by allowing an app
//  to do a CreateFile on "SRM1:" and making IOCTL calls. Thus you'd also have
//  to implement SRM_Open, SRM_Close, SRM_IOControl.
//
// -----------------------------------------------------------------------------
DWORD SRM_Open (DWORD dwData, DWORD dwAccess, DWORD dwShareMode) {return (4);}
BOOL  SRM_Close(DWORD dwData) {return (TRUE);}
DWORD SRM_Read (DWORD dwData,  LPVOID pBuf, DWORD Len) {return (0);}
DWORD SRM_Write(DWORD dwData, LPCVOID pBuf, DWORD Len) {return (0);}
DWORD SRM_Seek (DWORD dwData, long pos, DWORD type) {return (DWORD)-1;}
VOID  SRM_PowerUp  (VOID) {}
VOID  SRM_PowerDown(VOID) {}
BOOL  SRM_IOControl(DWORD p1, DWORD p2, PBYTE p3, DWORD p4, PBYTE p5, 
                    DWORD p6, PDWORD p7) {return (TRUE);}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩精品一区二区三区视频| 亚洲国产中文字幕| 日韩欧美一二区| 欧美精品一区二区三区蜜桃视频| 制服丝袜亚洲网站| 日韩午夜av一区| 国产女人aaa级久久久级| 亚洲男女一区二区三区| 日韩激情一区二区| av亚洲精华国产精华精华| 欧美日韩dvd在线观看| 久久免费的精品国产v∧| 亚洲综合久久久| 天堂在线亚洲视频| 日韩欧美国产系列| 国产一区二区在线看| 欧美韩日一区二区三区| 91色乱码一区二区三区| 婷婷综合另类小说色区| 久久日韩精品一区二区五区| 成人avav在线| 丝袜美腿高跟呻吟高潮一区| 久久久久久久久久久电影| 成人小视频免费在线观看| 亚洲制服欧美中文字幕中文字幕| 在线综合视频播放| 成人av在线一区二区三区| 亚洲一区免费视频| 久久久久久久国产精品影院| 在线观看日韩国产| 国产毛片一区二区| 亚洲国产精品精华液网站| 久久蜜桃av一区二区天堂 | 不卡影院免费观看| 亚洲成人资源在线| 国产精品久久久一区麻豆最新章节| 欧美日韩精品欧美日韩精品一| 国产精品亚洲第一区在线暖暖韩国| 一区二区三区加勒比av| 国产日韩精品视频一区| 欧美人与禽zozo性伦| 成人国产精品免费观看动漫| 日本成人中文字幕| 一区二区三区四区在线播放| 久久综合中文字幕| 在线不卡中文字幕播放| 色婷婷综合久久久| 粉嫩aⅴ一区二区三区四区| 全国精品久久少妇| 亚洲一区二区三区四区在线观看| 国产精品色在线| 精品国产1区二区| 91精品国产综合久久蜜臀| 日本高清不卡在线观看| 成人视屏免费看| 国产精品888| 国内外成人在线视频| 日本麻豆一区二区三区视频| 婷婷综合久久一区二区三区| 亚洲国产毛片aaaaa无费看 | 国产自产2019最新不卡| 亚洲一二三四久久| 亚洲欧美精品午睡沙发| 国产女主播一区| 国产香蕉久久精品综合网| 日韩精品一区在线| 日韩午夜激情av| 精品国产精品网麻豆系列| 欧美一级视频精品观看| 日韩欧美一级精品久久| 91精品国产91久久久久久一区二区| 欧美视频日韩视频| 欧美另类高清zo欧美| 欧美日韩夫妻久久| 欧美电影影音先锋| 在线综合+亚洲+欧美中文字幕| 911国产精品| 欧美一级专区免费大片| 欧美精品一区男女天堂| 久久夜色精品国产噜噜av | 成人一区二区三区| 成人国产精品视频| 色琪琪一区二区三区亚洲区| 91看片淫黄大片一级| 欧美性色综合网| 欧美美女一区二区在线观看| 91麻豆精品国产自产在线| 欧美一区二区三区小说| 亚洲精品一区二区三区影院| 国产亚洲短视频| 亚洲欧美另类图片小说| 亚洲123区在线观看| 久久成人18免费观看| 国内久久婷婷综合| 972aa.com艺术欧美| 欧美日韩一区二区欧美激情| 日韩午夜中文字幕| 中文乱码免费一区二区| 一级日本不卡的影视| 热久久久久久久| 福利电影一区二区| 在线观看日产精品| 欧美大片在线观看一区二区| 久久久精品免费观看| 一区二区三区电影在线播| 日韩中文字幕亚洲一区二区va在线| 久久99久久99小草精品免视看| 国产大陆精品国产| 欧美日韩亚洲丝袜制服| 久久久国产一区二区三区四区小说| 国产精品视频看| 五月激情综合色| 粉嫩av一区二区三区粉嫩| 色猫猫国产区一区二在线视频| 5566中文字幕一区二区电影| 中文子幕无线码一区tr| 午夜不卡av免费| 成人国产亚洲欧美成人综合网| 欧美午夜视频网站| 久久精品人人做人人爽97| 一区二区在线观看av| 极品美女销魂一区二区三区免费| 91一区二区三区在线观看| 精品久久久网站| 一区二区久久久久| 福利电影一区二区三区| 日韩一区二区三区三四区视频在线观看 | 亚洲图片欧美激情| 日本不卡123| 色综合久久久网| 久久久99精品免费观看| 日韩av中文字幕一区二区三区| 成人毛片在线观看| 精品乱人伦一区二区三区| 亚洲国产另类av| 97精品国产97久久久久久久久久久久 | 蜜臀久久99精品久久久久久9 | 欧美日韩一卡二卡| 中文字幕av资源一区| 狠狠色丁香久久婷婷综合_中| 欧美老人xxxx18| 一区二区三区在线视频观看58| 国产裸体歌舞团一区二区| 91精品国产欧美日韩| 一级精品视频在线观看宜春院 | av午夜一区麻豆| 久久久高清一区二区三区| 日本一不卡视频| 欧美人与禽zozo性伦| 夜夜精品浪潮av一区二区三区| 成人av影视在线观看| 国产视频一区在线观看 | 成人涩涩免费视频| 精品少妇一区二区三区日产乱码 | 久久er99热精品一区二区| 欧美日韩另类一区| 亚洲黄色av一区| 色婷婷综合久久久中文字幕| 国产精品白丝在线| jvid福利写真一区二区三区| 亚洲国产精品成人综合| 顶级嫩模精品视频在线看| 久久精品欧美一区二区三区不卡| 国产一区日韩二区欧美三区| 欧美zozo另类异族| 国产一区二区电影| 久久久久久久电影| 成人久久视频在线观看| 国产精品免费免费| 91小视频在线| 亚洲一区在线免费观看| 欧美三级日韩在线| 日韩av高清在线观看| 日韩丝袜美女视频| 国产精品996| 亚洲欧洲精品一区二区三区| 91蜜桃视频在线| 亚洲国产成人av好男人在线观看| 欧美日韩国产片| 久久er99精品| 国产精品国产自产拍在线| 91蜜桃在线观看| 午夜精品久久久久久不卡8050| 欧美一区二区三区在线电影| 久久av老司机精品网站导航| 亚洲国产精品激情在线观看| 色欧美片视频在线观看在线视频| 亚洲国产精品久久不卡毛片| 日韩欧美高清dvd碟片| 国产suv精品一区二区6| 亚洲综合在线电影| 日韩一区二区三| 成人免费视频caoporn| 亚洲免费av网站| 日韩一区二区三区四区| 成人免费电影视频| 亚洲成人久久影院| 久久精品人人做人人爽人人| 色欧美日韩亚洲| 国产米奇在线777精品观看|