- /*
- *********************************************************************************************************
- * uC/GUI
- * Universal graphic software for embedded applications
- *
- * (c) Copyright 2002, Micrium Inc., Weston, FL
- * (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
- *
- * 礐/GUI is protected by international copyright laws. Knowledge of the
- * source code may not be used to write a similar product. This file may
- * only be used in accordance with a license and should not be redistributed
- * in any way. We appreciate your understanding and fairness.
- *
- ----------------------------------------------------------------------
- File : GUITOUCH.C
- Purpose : Touch screen manager
- ----------------------------------------------------------------------
- This module handles the touch screen. It is configured in the file
- GUITouch.conf.h (Should be located in the Config directory).
- ----------------------------------------------------------------------
- */
- #include "LCD_Private.H" /* private modul definitions & config */
- #include "GUI_Protected.h"
- /*********************************************************************
- *
- * Local Variables & Defines
- *
- **********************************************************************
- */
- static int _ScreenX = 0; /* x-pos */
- static int _ScreenY = 0; /* y-pos */
- static int _NumBytesInBuffer = 0; /* bytes in rx buffer */
- static U8 _Buttons = 0; /* button status */
- static U8 _abInBuffer[3]; /* mouse rx buffer */
- /*********************************************************************
- *
- * _EvaPacket
- *
- **********************************************************************
- Process data packet from mouse:
- D7 D6 D5 D4 D3 D2 D1 D0
- -----------------------------------------------
- 1st byte | -- -- Y- X- 1 -- LB RB
- 2nd byte | X7 X6 X5 X4 X3 X2 X1 X0
- 3rd byte | Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0
- */
- static void _EvaPacket(void) {
- char a;
- GUI_HID_STATE State;
- _Buttons = _abInBuffer[0] & 0x03;
- a = _abInBuffer[1];
- // test x move sign.
- if(_abInBuffer[0] & 0x10) {
- a=-a;
- _ScreenX -= a;
- } /* direction is negative, move left */
- else {
- _ScreenX += a;
- }
- a = _abInBuffer[2];
- // test y move sign.
- if(_abInBuffer[0] & 0x20) {
- a=-a;
- _ScreenY += a;
- } /* direction is negative, move down */ else {
- _ScreenY -= a;
- }
- /* check min/max positions */
- if (_ScreenX < 0) {
- _ScreenX = 0;
- } else if (_ScreenX > LCD_XSIZE-1) {
- _ScreenX = LCD_XSIZE-1;
- } if (_ScreenY < 0) {
- _ScreenY = 0;
- } else if (_ScreenY > LCD_YSIZE-1) {
- _ScreenY = LCD_YSIZE-1;
- }
- /* signal new mouse data */
- State.x = _ScreenX;
- State.y = _ScreenY;
- State.Pressed = _Buttons;
- GUI_MOUSE_StoreState(&State);
- }
- /*********************************************************************
- *
- * GUI_MOUSE_DRIVER_PS2_OnRx : Mouse receive interrupt handler
- *
- **********************************************************************
- The PS2 mouse interrupt gets in three bytes from the mouse, then wakes
- up the mouse LSR.
- */
- void GUI_MOUSE_DRIVER_PS2_OnRx(unsigned char Data) {
- if (!_NumBytesInBuffer) {
- /* check for start frame */
- if ((Data & 0x0c) == 0x08) {
- _abInBuffer[0] = Data;
- _NumBytesInBuffer++;
- }
- } else {
- _abInBuffer[_NumBytesInBuffer] = Data;
- _NumBytesInBuffer++;
- if (_NumBytesInBuffer >= 3) {
- _EvaPacket();
- _NumBytesInBuffer = 0;
- }
- }
- }
- /*********************************************************************
- *
- * GUI_MOUSE_DRIVER_PS2_Init
- *
- **********************************************************************
- */
- void GUI_MOUSE_DRIVER_PS2_Init(void) {
- _NumBytesInBuffer = 0;
- }