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

📄 posdrv.c

📁 深圳市微逻辑电子有限公司 巨果&#8226 Kingmos&reg 系统核心
💻 C
字号:
/******************************************************
Copyright(c) 版权所有,1998-2005微逻辑。保留所有权利。
******************************************************/


/*****************************************************
文件说明:管理点设备消息
版本号:3.0.0
开发时期:1999
作者:李林
修改记录:
    2003-04-14-增加冲突段检查
******************************************************/

#include <eframe.h>
#include "epos.h"
#include <eevent.h>
#include <epwin.h>
#include <gwmeobj.h>
#include <esysset.h>
#ifdef EML_DOS
#include <dos.h>
#endif

void TouchPanelCalibrateAPoint(
    int   xUnCalibrate,     //原始的x坐标
    int   yUnCalibrate,     //原始的y坐标
    int   *pCalX,     //转换后的x坐标
    int   *pCalY      //转换后的y坐标
    );

static int _GetPosEvent( POSRECORD FAR * lpRecord, UINT fRemove );
static int _PosPeek( LPMSG, UINT fRemove );
static int _PosPut( LPMSG );
static int _PosRemove(void);
static int _PosInstall(void);
static int _PosRelease(void);
static int _PosWho(void);
static UINT _PosCount(void);
static BOOL CALLBACK DoPosEvent( DWORD dwFlags, DWORD dx, DWORD dy, DWORD dwData, DWORD dwExtraInfo );

_EVENTDRV _posEvent = {
    _PosInstall,
    _PosRelease,
    _PosWho,
    _PosPeek,
    _PosPut,
    _PosRemove,
    _PosCount
};

#undef  MAX_QUEUE
#define MAX_QUEUE 16
static int _queueHead = 0;
static int _queueTail = 0;
static int _queueCount = 0;
static POSRECORD _curPos;
static POSRECORD _lastPos;
static POSRECORD _posQueue[MAX_QUEUE];
static CRITICAL_SECTION csPosQueue;
static LPPOS_CALLBACK lpPosCallBackFun = NULL;//定位设备回调函数

BOOL bTestQueue = 0;

// **************************************************
// 声明:
// 参数:
// 	无
// 返回值:
//	假入成功,返回TRUE;否则,返回FALSE
// 功能描述:
//	
// 引用: 
//	
// ************************************************

static BOOL __PutPointerEvent( LPPOSRECORD lpRecord )
{
	BOOL bRetv = FALSE;
	if( lpRecord->x == _curPos.x &&
		lpRecord->y == _curPos.y &&
		lpRecord->wState == _curPos.wState )
		return FALSE;

    EnterCriticalSection( &csPosQueue );

    _curPos = *lpRecord;
 
    if( _queueCount < MAX_QUEUE )
    {
        _posQueue[_queueTail] = _curPos;
        if( ++_queueTail>= MAX_QUEUE )
            _queueTail = 0;
        _queueCount++;
		bRetv = TRUE;
    }
	else
	{
		RETAILMSG( 1, ( "mouse queue is full, _queueCount=%d.\r\n", _queueCount ) );

		// TEST code
		{
			extern void LockCSWindow( void );
			extern void UnlockCSWindow( void );
			
			DWORD dwForeThreadID;
			bTestQueue = TRUE;
			dwForeThreadID = LockForegroundThreadId(); //LN, 2003-06-03, ADD
			UnlockForegroundThreadId();
			RETAILMSG( 1, ( "UnlockForegroundThreadId.\r\n" ) );
			LockCSWindow();
			UnlockCSWindow();			
			RETAILMSG( 1, ( "UnlockCSWindow.\r\n" ) );
			{
				HRGN hClip;
			__LockRepaintRgn( &hClip );
			__UnlockRepaintRgn();
			RETAILMSG( 1, ( "UnlockRepaintRgn.\r\n" ) );
			}
			
		}
		//

	}

	LeaveCriticalSection( &csPosQueue );

	SetSYSQueueState( ES_MOUSE, TRUE );

    return bRetv;
}

// **************************************************
// 声明:
// 参数:
// 	无
// 返回值:
//	假入成功,返回TRUE;否则,返回FALSE
// 功能描述:
//	
// 引用: 
//	
// ************************************************

int _GetPosEvent( POSRECORD FAR * lpRecord, UINT fRemove )
{
	EnterCriticalSection( &csPosQueue );


    if( _queueCount == 0 )
    {
        *lpRecord = _curPos;
    }
    else
    {
        *lpRecord = _posQueue[_queueHead];
        if( fRemove == PM_REMOVE )
        {
            if( ++_queueHead >= MAX_QUEUE )
                _queueHead = 0;
            _queueCount--;
        }
    }
	LeaveCriticalSection( &csPosQueue );
    return 0;
}

// **************************************************
// 声明:
// 参数:
// 	无
// 返回值:
//	假入成功,返回TRUE;否则,返回FALSE
// 功能描述:
//	
// 引用: 
//	
// ************************************************

static UINT _PosCount(void)
{
    return _queueCount;
}

// **************************************************
// 声明:
// 参数:
// 	无
// 返回值:
//	假入成功,返回TRUE;否则,返回FALSE
// 功能描述:
//	
// 引用: 
//	
// ************************************************

static int _PosPeek( LPMSG lpEventData, UINT fRemove )
{
    POSRECORD _PosRecord;

	// TEST
	if( bTestQueue )
	{
		RETAILMSG( 1, ( "_PosQueueCount = %d, fRemove=%d.\r\n", _queueCount, fRemove ) );
		bTestQueue = FALSE;
	}
	//

    _GetPosEvent( &_PosRecord, fRemove );

    if( _PosRecord.wState == 0 && _lastPos.wState != 0 )
    {
        lpEventData->message = WM_LBUTTONUP;
        lpEventData->wParam = _PosRecord.wState;
		lpEventData->pt.x = _PosRecord.x;
		lpEventData->pt.y = _PosRecord.y;

    }
    else if( _PosRecord.wState != 0 && _lastPos.wState == 0 )
    {
        lpEventData->message = WM_LBUTTONDOWN;
        lpEventData->wParam = _PosRecord.wState;
		lpEventData->pt.x = _PosRecord.x;
		lpEventData->pt.y = _PosRecord.y;
    }
    else if( _PosRecord.x != _lastPos.x ||
            _PosRecord.y != _lastPos.y )
    {
        lpEventData->message = WM_MOUSEMOVE;
        lpEventData->wParam = _PosRecord.wState;
		lpEventData->pt.x = _PosRecord.x;
		lpEventData->pt.y = _PosRecord.y;

    }
    else
    {
        if( _queueCount > 1 )
             _GetPosEvent( &_PosRecord, PM_REMOVE );
        return 0;
    }
    if( fRemove == PM_REMOVE )
        _lastPos = _PosRecord;
    return 1;
}

// **************************************************
// 声明:
// 参数:
// 	无
// 返回值:
//	假入成功,返回TRUE;否则,返回FALSE
// 功能描述:
//	
// 引用: 
//	
// ************************************************

static int _PosInstall()
{
	InitializeCriticalSection( &csPosQueue );

    return 1;
}

// **************************************************
// 声明:
// 参数:
// 	无
// 返回值:
//	假入成功,返回TRUE;否则,返回FALSE
// 功能描述:
//	
// 引用: 
//	
// ************************************************

static int _PosRelease()
{
	DeleteCriticalSection( &csPosQueue );
    return 1;
}

// **************************************************
// 声明:
// 参数:
// 	无
// 返回值:
//	假入成功,返回TRUE;否则,返回FALSE
// 功能描述:
//	
// 引用: 
//	
// ************************************************

static int _PosWho()
{
    return ID_POINTER;
}

// **************************************************
// 声明:
// 参数:
// 	无
// 返回值:
//	假入成功,返回TRUE;否则,返回FALSE
// 功能描述:
//	
// 引用: 
//	
// ************************************************

static int _PosPut( LPMSG lp )
{
    return 0;
}

// **************************************************
// 声明:
// 参数:
// 	无
// 返回值:
//	假入成功,返回TRUE;否则,返回FALSE
// 功能描述:
//	
// 引用: 
//	
// ************************************************

static int _PosRemove()
{
    return 0;
}

// **************************************************
// 声明:
// 参数:
// 	无
// 返回值:
//	假入成功,返回TRUE;否则,返回FALSE
// 功能描述:
//	
// 引用: 
//	
// ************************************************

static BOOL CALLBACK DoPosEvent( DWORD dwFlags, DWORD dx, DWORD dy, DWORD dwData, DWORD dwExtraInfo )
{
	POSRECORD pos;

	if( dwFlags & MOUSEEVENTF_ABSOLUTE )
	{
	    pos.x = (short)dx;
	    pos.y = (short)dy;
		if( dwFlags & MOUSEEVENTF_LEFTDOWN )
		{
			pos.wState = PS_LBUTTON;
		}
		else if( dwFlags & MOUSEEVENTF_LEFTUP )
			pos.wState = 0;
		else
			pos.wState = 0;
		__PutPointerEvent( &pos );
		return TRUE;
	}
	return FALSE;
}

// **************************************************
// 声明:
// 参数:
// 	无
// 返回值:
//	假入成功,返回TRUE;否则,返回FALSE
// 功能描述:
//	
// 引用: 
//	
// ************************************************

BOOL CALLBACK HandlePosEvent( DWORD dwFlags, DWORD dx, DWORD dy, DWORD dwData, DWORD dwExtraInfo )
{
	int xCal, yCal;

	TouchPanelCalibrateAPoint( dx, dy, &xCal, &yCal );  
	//	RETAILMSG( 1, ( "origin x(%d),origin y(%d), xCal(%d)/4=(%d), yCal(%d)/4=(%d).\r\n", dx, dy, xCal, xCal/4, yCal, yCal/4 ) );
	xCal /= 4; yCal /= 4;
	if( lpPosCallBackFun )	// 调用回调函数
		return lpPosCallBackFun( dwFlags, xCal, yCal, dwData, dwExtraInfo );
	else  // 调用默认的
	    return DoPosEvent( dwFlags, xCal, yCal, dwData, dwExtraInfo );
}

// **************************************************
// 声明:LPPOS_CALLBACK _SetPosEventCallBack( LPPOS_CALLBACK lpNewCallBackFun )
// 参数:
// 	IN lpNewCallBackFun - 定位设备回调函数
// 返回值:
//	假入成功,返回之前用的回调函数;否则,返回 NULL
// 功能描述:
//	设置新的定位设备回调函数
// 引用: 
//	
// ************************************************

LPPOS_CALLBACK _SetPosEventCallBack( LPPOS_CALLBACK lpNewCallBackFun )
{
	LPPOS_CALLBACK lpOldFun = lpPosCallBackFun;
	if( lpNewCallBackFun )
	{
		lpPosCallBackFun = lpNewCallBackFun;
		if( lpOldFun )
		    return lpOldFun;
		else
			return (LPPOS_CALLBACK)DoPosEvent;  //返回系统默认的
	}
	else
		return NULL;	
}

// **************************************************
// 声明:
// 参数:
// 	无
// 返回值:
//	假入成功,返回TRUE;否则,返回FALSE
// 功能描述:
//	
// 引用: 
//	
// ************************************************

VOID WINAPI WinEvent_MouseEvent( DWORD dwFlags, DWORD dx, DWORD dy, DWORD dwData, DWORD dwExtraInfo )
{
	DoPosEvent(dwFlags,  dx,  dy,  dwData,  dwExtraInfo);
}

⌨️ 快捷键说明

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