⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ps2mouse.cpp

📁 WinCE 3.0 BSP, 包含Inter SA1110, Intel_815E, Advantech_PCM9574 等
💻 CPP
字号:
/*

THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
PARTICULAR PURPOSE.
Copyright (c) 1995-1998  Microsoft Corporation

*/

#include <windows.h>
#include <ceddk.h>
#include <nkintr.h>
//#include <oalintr.h>
//#include <eagle.h>

#include "ps2port.hpp"
#include "ps2mouse.hpp"
extern DWORD dwSysIntrPs2Ch2;
//  There is really only one physical mouse supported by the system.
Ps2Mouse    *v_pp2m;

BOOL
Ps2Mouse::
Initialize(
    Ps2Port *pp2p
    )
{

    m_pp2p = pp2p;
    m_hevInterrupt = NULL;
    m_ui8ButtonState = 0;
    return TRUE;
}



BOOL
Ps2Mouse::
IsrThreadProc(
    void
    )
{
    BOOL        bInPacket = FALSE;
    const int   cmsInPacketTimeout = 50;
    int         cmsWaitTimeout;
    int         cBytes = 0;
    UINT8       ui8Data;
    INT8        buf[3];
    long        x,y;

    UINT8   ui8Buttons;
    UINT8   ui8XorButtons;

    unsigned int    evfMouse;

    //RETAILMSG(1, (TEXT("Ps2Mouse::IsrThreadProc\r\n")));

    SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST);

    m_hevInterrupt = CreateEvent(NULL, FALSE, FALSE, NULL);
    if ( m_hevInterrupt == NULL)
        {
        goto leave;
        }


    if ( !InterruptInitialize(dwSysIntrPs2Ch2, m_hevInterrupt, NULL, 0) )
        {
        goto leave;
        }

    m_pp2p -> InterruptEnable( MousePort );

    for ( ; ; )
        {
wait_for_interrupt:
        if ( bInPacket )
            {
            cmsWaitTimeout = cmsInPacketTimeout;
            }
        else
            {
            cmsWaitTimeout = INFINITE;
            }

        if ( WaitForSingleObject(m_hevInterrupt, cmsWaitTimeout) == WAIT_TIMEOUT )
            {
            cBytes = 0;
            bInPacket = FALSE;
            goto wait_for_interrupt;
            }

        if ( m_pp2p -> DataRead(MousePort, &ui8Data) )
            {
            if ( cBytes < 3 )
                {
                buf[cBytes++] = ui8Data;
                }
            if ( cBytes == 3 )
                {
                evfMouse = 0;
                ui8XorButtons = buf[0] ^ m_ui8ButtonState;
                if ( ui8XorButtons )
                    {
                    ui8Buttons = buf[0];

                    if ( ui8XorButtons & 0x01 )
                        {
                        if ( ui8Buttons & 0x01 )
                            {
                            evfMouse |= MOUSEEVENTF_LEFTDOWN;
                            }
                        else
                            {
                            evfMouse |= MOUSEEVENTF_LEFTUP;
                            }
                        }

                    if ( ui8XorButtons & 0x02 )
                        {
                        if ( ui8Buttons & 0x02 )
                            {
                            evfMouse |= MOUSEEVENTF_RIGHTDOWN;
                            }
                        else
                            {
                            evfMouse |= MOUSEEVENTF_RIGHTUP;
                            }
                        }

                    if ( ui8XorButtons & 0x04 )
                        {
                        if ( ui8Buttons & 0x04 )
                            {
                            evfMouse |= MOUSEEVENTF_MIDDLEDOWN;
                            }
                        else
                            {
                            evfMouse |= MOUSEEVENTF_MIDDLEUP;
                            }
                        }
                    m_ui8ButtonState = buf[0];
                    }

                if ( buf[1] || buf[2] )
                    {
                    evfMouse |= MOUSEEVENTF_MOVE;
                    }

                x = buf[1];
                y = -buf[2];
                //RETAILMSG(1, (TEXT("Mouse data evfMouse:%d x=%d, y=%d\r\n"), evfMouse, x, y));
                mouse_event(evfMouse, x, y, 0, NULL);

                cBytes = 0;
                }
            }
        else
            {
            ERRORMSG(1,(TEXT("Error reading mouse data\r\n")));
            }

        InterruptDone(dwSysIntrPs2Ch2);

        }

leave:
    return TRUE;
}



DWORD
Ps2MouseIsrThread(
    Ps2Mouse    *pp2m
    )
{

    //RETAILMSG(1, (TEXT("Ps2MouseIsrThread\r\n")));

    pp2m -> IsrThreadProc();

    return 0;
}



BOOL
Ps2Mouse::
IsrThreadStart(
    void
    )
{
    HANDLE  hthrd;

    //RETAILMSG(1, (TEXT("Ps2Mouse::IsrThreadStart\r\n")));

    hthrd = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Ps2MouseIsrThread, this, 0, NULL);

    //  Since we don't need the handle, close it now.
    CloseHandle(hthrd);

    return TRUE;
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -