📄 touchdrv.c
字号:
>
> /************************ Touch Screen Update Task **************************/
> /*--------------------------------------------------------------------------*/
> // TouchTask- A continuous, very low priority task to update the touch
> // position. This task sends mouse messages (PM_LBUTTONDOWN, PM_LBUTTONUP,
> // and/or PM_POINTERMOVE) into PegMessageQueue, where PEG routes them
> // to wherever they need to go.
> //
> // This task is started by the InitializeTouchScreen function if the
> // calibration completes OK.
> /*--------------------------------------------------------------------------*/
> void PegTouchTask(void)
> {
> PegMessage TouchMesg;
> PEGINT XPos, YPos, OldXPos, OldYPos;
> PEGUINT wLastState;
> PEGBOOL IsTouched;
>
> TouchMesg.pTarget = NULL;
>
> XPos = YPos = OldXPos = OldYPos = wLastState = 0;
>
> // First configure the hardware registers:
>
> TouchConfigureHardware();
>
> // Next run the calibration sequence:
>
> CalibrateTouchScreen();
>
> // Now continuously read and post touch screen messages:
>
> while(1)
> {
> TOUCH_DELAY(TOUCH_POLLING_PERIOD);
>
> IsTouched = GetScaledTouchPos(&XPos, &YPos);
>
> if (IsTouched)
> {
> if (wLastState & TS_TOUCH_SENT) // already sent a touch message?
> {
> // check for a move message:
>
> if (OldXPos != XPos || OldYPos != YPos)
> {
> // The screen is still touched, but the position
> // changed. Send a PointerMove message to PEG
>
>
> TouchMesg.wType = PM_POINTER_MOVE;
> TouchMesg.Point.x = XPos;
> TouchMesg.Point.y = YPos;
> PegThing::MessageQueue()->Fold(&TouchMesg);
> OldXPos = XPos;
> OldYPos = YPos;
> }
> }
> else
> {
> // This is a new touch down. Send a LBUTTONDOWN message
> // to PEG:
>
> TouchMesg.wType = PM_LBUTTONDOWN;
> TouchMesg.Point.x = XPos;
> TouchMesg.Point.y = YPos;
>
> #if defined(PEGSMX)
> SendPegInputMessage(&TouchMesg);
> #else
> PegThing::MessageQueue()->Push(TouchMesg);
> #endif
>
> OldXPos = XPos;
> OldYPos = YPos;
> wLastState = TS_TOUCH_SENT; // keep track of current state
> }
> }
> else
> {
> // here if the screen is NOT touched:
>
> if (wLastState & TS_TOUCH_SENT) // was touch message sent?
> {
> wLastState = 0;
> TouchMesg.wType = PM_LBUTTONUP;
> TouchMesg.Point.x = OldXPos;
> TouchMesg.Point.y = OldYPos;
> TouchMesg.iData = 0;
>
> #if defined(PEGSMX)
> SendPegInputMessage(&TouchMesg);
> #else
> PegThing::MessageQueue()->Push(TouchMesg);
> #endif
> }
> }
> }
> }
>
>
>
> } // End of Extern 'C'
>
>
> /*--------------------------------------------------------------------------*/
> /*--------------------------------------------------------------------------*/
> // For the SMX and QUADROS operating systems, the touch task stack space
> // is taken care of for us during task creation. For PrKernel and ThreadX,
> // we define the stack space for our touch task below.
> /*--------------------------------------------------------------------------*/
> /*--------------------------------------------------------------------------*/
>
> #if defined(PEG_PRKERNEL) || defined(PEGX)
>
> #define PEG_TOUCH_STACK_SIZE PEG_STACK_SIZE
> #define PEG_TOUCH_PRIORITY PEG_PRIORITY
> PEGLONG gbTouchTaskStack[PEG_TOUCH_STACK_SIZE / sizeof(PEGLONG)];
>
> #if defined(PEGX)
> TX_THREAD PegTouchThread;
> #endif
>
> #endif
>
> /*--------------------------------------------------------------------------*/
> /*--------------------------------------------------------------------------*/
> // InitializeTouchScreen-
> //
> // This is the external entry point. This should be called first thing
> // by the application software, or once during startup.
> /*--------------------------------------------------------------------------*/
> /*--------------------------------------------------------------------------*/
>
> void InitializeTouchScreen(void)
> {
> #if defined(PEGSMX)
>
> // start the touch task:
>
> TouchTask = create_task((CODE_PTR) PegTouchTask, LO, 8 * 1024);
> BUILD_HT(PegTouchTask, "PegTouch");
> startx(TouchTask);
>
> #elif defined(PEG_PRKERNEL)
>
> // start the touch task:
>
> T_CTSK TaskInfo;
>
> TaskInfo.tskatr = TA_ACT;
> TaskInfo.exinf = 0;
> TaskInfo.task = (FP) PegTouchTask;
> TaskInfo.itskpri = PEG_TOUCH_PRIORITY;
> TaskInfo.stksz = PEG_TOUCH_STACK_SIZE;
> TaskInfo.stk = gbPegTouchTaskStack;
>
> acre_tsk(&TaskInfo);
>
> #elif defined(PEG_QUADROS)
>
> // For RTXC Quadros, the TouchTask is already started for us
> // as part of system initialization, nothing to do here.
>
> #elif defined(PEGX)
>
> tx_thread_create(&PegTouchThread, "TouchTask", PegTouchTask,
> 0, gbTouchTaskStack, PEG_TOUCH_STACK_SIZE, PEG_PRIORITY,
> 0, 0, TX_AUTO_START);
>
> #endif
>
> // Don't return until touch screen is calibrated, to prevent
> // PEG from starting up too soon:
>
> while(!TouchCal.IsCalibrated)
> {
> TOUCH_DELAY(50);
> }
> }
>
> /*--------------------------------------------------------------------------*/
> // The group of functions below are are implemented once for each supported
> // operating system. The functions are:
> //
> // InstallTouchInterruptHandler()
> // TouchInterruptHandler()
> // WaitTouchDataReady()
> /*--------------------------------------------------------------------------*/
>
>
> extern "C" {
>
> #if defined(PEGSMX)
> /*--------------------------------------------------------------------------*/
> // Running with MicroDigital SMX RTOS
> /*--------------------------------------------------------------------------*/
>
> SCB_PTR PegTouchSem;
>
> /*--------------------------------------------------------------------------*/
> void PegTouchLsr(void)
> {
> signalx(PegTouchSem);
> }
>
> /*--------------------------------------------------------------------------*/
> void InstallTouchInterruptHandler(void)
> {
> PegTouchSem = create_sema(1, NULL);
>
> bspSetIRQVect(PEN_DATA_IRQ, TouchInterruptHandler);
> bspConfigureIRQ(PEN_DATA_IRQ);
> bspUnmaskIRQ(PEN_DATA_IRQ);
> }
>
>
> /*--------------------------------------------------------------------------*/
> void TouchInterruptHandler(void)
> {
> // We interrupt on the input FIFO full. This means we have
> // 12 16-bit readings. Read them all into local copy, and disable
> // the ASP module to save power:
>
> PEGINT Loop;
>
> for (Loop = 0; Loop < ASP_FIFO_DEPTH; Loop++)
> {
> TouchResponseVals[Loop] = (PEGUSHORT) (pTouchRegs->DataIn);
> }
>
> // go back to idle mode
>
> pTouchRegs->Control = ASP_INIT_VAL;
>
> // start the high-level service routine (interrupts enabled)
>
> INVOKE(PegTouchLsr, 0);
> }
>
>
> /*--------------------------------------------------------------------------*/
> void WaitTouchDataReady(void)
> {
> test(PegTouchSem, INF);
> }
>
>
> #elif defined(PEG_QUADROS)
>
> /*--------------------------------------------------------------------------*/
> // Running with RTXC QUADROS RTOS
> // This is the same block of functions implemented for RTXC Quadros RTOS
> /*--------------------------------------------------------------------------*/
>
> #include "stdlib.h"
> #include "mc9328mxl.h"
> #include "kcounter.h"
> #include "ktask.h"
>
> void SetInterruptPriority(int IntNum, int Priority);
>
> /*--------------------------------------------------------------------------*/
> void InstallTouchInterruptHandler(void)
> {
> *AitcEnnum = PEN_DATA_IRQ;
> SetInterruptPriority(PEN_DATA_IRQ, 10);
> }
>
> /*--------------------------------------------------------------------------*/
> void TouchInterruptHandler(void)
> {
> // We interrupt on the input FIFO full. This means we have
> // 12 16-bit readings. Read them all into local copy, and disable
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -