|

楼主 |
发表于 2016-6-7 16:50:58
|
显示全部楼层
本帖最后由 xf331785508 于 2016-6-7 17:04 编辑
根据傻孩子的砖,我斗胆晒一下我的糟玉。以飨坛友。
- #include <string.h>
- #include "TSP.h"
- #ifndef COUNTOF
- #define COUNTOF(__a) ((sizeof((__a)))/(sizeof(*(__a))))
- #endif
- /*
- gTouchXYUpdateFlag was changed in interrupt function
- */
- volatile bool gTouchXYUpdateFlag = FALSE;
- // Temporary save datas from touch screen to buffer
- u8 gReceiveBuffer[MAX_RECEIVE_BUFFER] = {0};
- u32 gRxCounter = 0;
- /* Retangle assign */
- static Rectangle_Typedef *Rectangle_TypedefAssign(Rectangle_Typedef *pRect, u16 left, u16 top, u16 width, u16 height)
- {
- if( NULL == pRect )
- {
- return NULL;
- }
- pRect->nLeft = left;
- pRect->nTop = top;
- pRect->nWidth = width;
- pRect->nHeight = height;
- return pRect;
- }
- /* Control block assign for each element */
- static Control_Typedef *Control_TypedefAssign
- (Control_Typedef *pCtrl,
- Rectangle_Typedef *pWindow,
- Control_Typedef *pNext,
- ClickEvent *pfn,
- u32 indexOf,
- u8 captionNums,
- char *str,
- u32 reserve)
- {
- if( NULL == pCtrl )
- {
- return NULL;
- }
- pCtrl->tWindow = pWindow;
- pCtrl->ptNext = pNext;
- pCtrl->fnClickEvent = pfn;
- pCtrl->index = indexOf;
- pCtrl->charNums = captionNums;
- pCtrl->btnCaption = str;
- pCtrl->timeOfCycle = reserve;
- return pCtrl;
- }
- /* Translate the location of the button which was pressed
- * from USART interface buffer. */
- TOUCH_XY AnalysisTouchXY(void)
- {
- u8 i = 0;
- TOUCH_XY touchXY = {0, 0};
- if( gTouchXYUpdateFlag )
- {
- for(i = 0; i < COUNTOF(gReceiveBuffer); i++)
- {
- if((gReceiveBuffer[i] == CMD_HEAD) && (gReceiveBuffer[i + 1] == RETURN_TOUCHSCREEN_XY))
- {
- touchXY.x = (u16)((gReceiveBuffer[i + 2] << 8) | gReceiveBuffer[i + 3]);
- touchXY.y = (u16)((gReceiveBuffer[i + 4] << 8) | gReceiveBuffer[i + 5]);
- gTouchXYUpdateFlag = FALSE;
- memset(gReceiveBuffer, 0, sizeof(gReceiveBuffer));
- gRxCounter = 0;
- break;
- }
- }
- }
- return touchXY;
- }
- /* According the location to return the index of button retangle which was pressed. */
- u8 RtnTouchScreenRst(TOUCH_XY tp, const RETANGLE_AREA *pArea)
- {
- u8 equivalentKey = KEY_NONE;
-
- if( NULL == pArea )
- {
- return equivalentKey;
- }
- if((tp.x >= (pArea->sx)) && (tp.x <= (pArea->ex)) &&
- (tp.y >= (pArea->sy)) && (tp.y <= (pArea->ey)))
- {
- equivalentKey = pArea->areaNo;
- }
- return equivalentKey;
- }
- /* To check the range of location */
- bool CheckPointinRectangle(Rectangle_Typedef *ptRect, u16 x, u16 y)
- {
- if( NULL == ptRect )
- {
- return FALSE;
- }
- if((x >= ptRect->nLeft) && (x <= (ptRect->nLeft + ptRect->nWidth)))
- {// x is in the range
- if((y >= ptRect->nTop) && (y <= (ptRect->nTop + ptRect->nHeight)))
- {// y is in the range
- return TRUE;
- }
- else{
- return FALSE;
- }
- }
- else{
- return FALSE;
- }
- }
- /* To find the correct button and call back the right handler which was defined. */
- s32 ControlsCheckClickEvent(Control_Typedef *ptThis, KEY_EVENT_Typedef *ptKeyValue)
- {
- if ((NULL == ptThis) || (NULL == ptKeyValue))
- {
- return FAULT;
- }
- do {
- if (CheckPointinRectangle((ptThis->tWindow), ptKeyValue->x, ptKeyValue->y))
- {
- if ( NULL != ptThis->fnClickEvent )
- {
- return (ptThis->fnClickEvent(ptKeyValue, &(ptThis->index)));
- }
- else{
- return FAULT;
- }
- }
- ptThis = ptThis->ptNext;
- } while(NULL != ptThis);
- return FAULT;
- }
- /* Button's retangle drawing */
- static void AppLCM_Buttons(u8 btnNums, bool isBtnDraw, Rectangle_Typedef *ptRect, Control_Typedef *ptCtrl)
- {
- register u8 i = 0;
-
- if( NULL == ptRect || NULL == ptCtrl )
- {
- return NULL;
- }
- if( isBtnDraw )
- {
- for(i = 0; i < btnNums; i++)
- {
- LCM_ButtonDraw((ptRect + i)->nLeft, (ptRect + i)->nTop,
- (ptRect + i)->nWidth, (ptRect + i)->nHeight,
- BUTTON_COLOR,
- (ReturnCharacterNumber((ptCtrl + i)->btnCaption) >> 1),
- (ptCtrl + i)->btnCaption);
- }
- }
- }
- /* According the index of key in keyboard to return the correct retangle's location. */
- static TOUCH_XY Convert2XY(u16 keyValue, Control_Typedef *ptThis)
- {
- TOUCH_XY rtnXY = {0, 0};
-
- if( NULL == ptThis )
- {
- return rtnXY;
- }
- do {
- if ( KEY == ptThis->index )
- {
- rtnXY.x = ptThis->tWindow->nLeft + 1;
- rtnXY.y = ptThis->tWindow->nTop + 1;
- KEY = KEY_NONE;
- return rtnXY;
- }
- ptThis = ptThis->ptNext;
- } while(NULL != ptThis);
- return rtnXY;
- }
- void AppLCM_UserInterfaceProcess(u8 btnNums, bool isBtnDraw, Rectangle_Typedef *ptRect, Control_Typedef *ptCtrl)
- {
-
- bool isReturn = TRUE;
- u32 counter = 0;
- KEY_EVENT_Typedef keyEvent = {0,0};
-
- if( NULL == ptCtrl || NULL == ptRect )
- {
- return;
- }
- KEY = KEY_NONE;
- AppLCM_Buttons(btnNums, isBtnDraw, ptRect, ptCtrl);
- if( ((ptCtrl->timeOfCycle) == 0) || ((ptCtrl->timeOfCycle & 0xFFFF0000) != 0) ){
- ptCtrl->timeOfCycle = 0xFFFF;
- }
- do
- {
- if(KEY != KEY_NONE){
- gTchLoc = Convert2XY(KEY, ptCtrl);
- KEY = KEY_NONE;
- }
- else{
- gTchLoc = AnalysisTouchXY();
- }
- keyEvent.x = gTchLoc.x;
- keyEvent.y = gTchLoc.y;
- delay_ms(50);
- switch(ControlsCheckClickEvent(ptCtrl, &keyEvent))
- {
- case QUIT:
- isReturn = FALSE;
- ptCtrl->timeOfCycle &= 0x0000FFFF;
- ptCtrl->timeOfCycle |= (keyEvent.x << 16);
- break;
- case CYCLE:
- break;
- case REDRAW:
- counter = 0;
- AppLCM_Buttons(btnNums, isBtnDraw, ptRect, ptCtrl);
- break;
- case FAULT:
- break;
- default:
- break;
- }
- counter++;
- }while( (isReturn) && (counter < (ptCtrl->timeOfCycle)) );
- }
- static s32 AppLCM_ComSetHandler(KEY_EVENT_Typedef *ptEvent, u32 *btnNo)
- {
- ptEvent = ptEvent;
- switch(*btnNo)
- {
- case NO:
- return QUIT;
- case 1:
- Process1();
- return CYCLE;
- case 2:
- Process2();
- return REDRAW;
- case 3:
- Process3();
- return CYCLE;
- default:
- return CYCLE;
- }
- }
- void AppLCM_ComSetSubMenu(void)
- {
- Rectangle_Typedef rect[4] = {0};
- Control_Typedef ctrl[COUNTOF(rect)] = {0};
- Rectangle_TypedefAssign(&rect[0], SUBMENU_TITLE_X, SUBMENU_TITLE_Y, CHAR_WIDTH(FONT_WIDTH_32, 4), BUTTON_HEIGHT);
- Rectangle_TypedefAssign(&rect[1], SM_COLUM2_BUTTON_X, SM_ROW1_BUTTON_Y, CHAR_WIDTH(FONT_WIDTH_32, 5), BUTTON_HEIGHT);
- Rectangle_TypedefAssign(&rect[2], SM_COLUM2_BUTTON_X, SM_ROW2_BUTTON_Y, CHAR_WIDTH(FONT_WIDTH_32, 5), BUTTON_HEIGHT);
- Rectangle_TypedefAssign(&rect[3], SM_COLUM2_BUTTON_X, SM_ROW3_BUTTON_Y, CHAR_WIDTH(FONT_WIDTH_32, 6), BUTTON_HEIGHT);
- Control_TypedefAssign(&ctrl[0], &rect[0], &ctrl[1], AppLCM_ComSetHandler, NO, 4, "Com Setting", 0);
- Control_TypedefAssign(&ctrl[1], &rect[1], &ctrl[2], AppLCM_ComSetHandler, 1, 5, "1.Process1", 0);
- Control_TypedefAssign(&ctrl[2], &rect[2], &ctrl[3], AppLCM_ComSetHandler, 2, 5, "2.Process2", 0);
- Control_TypedefAssign(&ctrl[3], &rect[3], NULL, AppLCM_ComSetHandler, 3, 6, "3.Process3", 0);
- AppLCM_UserInterfaceProcess(COUNTOF(rect), TRUE, rect, ctrl);
- }
复制代码
头文件如下:
- #ifndef __TSP_H__
- #define __TSP_H__
- #include "stm32f10x.h"
- /* MAX RECEIVE BUFFER */
- #define MAX_RECEIVE_BUFFER 50u
- typedef enum {Vertical = 0, Horizontal}DisplayDirection;
- /* Define some states of button pressed */
- typedef enum
- {
- FAULT = -1,
- QUIT = 0x0011,
- FUNCTION = 0X0022,
- CYCLE = 0X0033,
- REDRAW = 0X0044
- }ClickEventState_Typedef;
-
- typedef struct tagTOUCHXY
- {
- u16 x;
- u16 y;
- }TOUCH_XY;
- typedef struct tagRETANGLE_AREA
- {
- u8 areaNo;
- u16 sx;
- u16 sy;
- u16 ex;
- u16 ey;
- }RETANGLE_AREA;
- /* the button's retangle */
- typedef struct {
- u16 nLeft;
- u16 nTop;
- u16 nWidth;
- u16 nHeight;
- }Rectangle_Typedef;
- /* The location of button which happened event. */
- typedef struct {
- u16 x;
- u16 y;
- }KEY_EVENT_Typedef;
- /* Function point of event */
- typedef s32 ClickEvent(KEY_EVENT_Typedef *ptEvent, u32 *btnNo);
- /* Control block */
- typedef struct tagControl Control_Typedef;
- struct tagControl
- {
- Rectangle_Typedef *tWindow; //Button Retangle
- Control_Typedef *ptNext; //point to next struct class
- ClickEvent *fnClickEvent; //process this button which was being pressed
- u32 index; //the only index for the button on a UI picture
- u8 charNums; //numbers of characters of the button's caption
- char *btnCaption; //string of button caption
- u32 timeOfCycle; //reserved datas
- };
- #endif //end of __TSP_H__
复制代码 |
|