/** * @brief Provide the GUI with current state of the touch screen * @param None * @retval None */ void BSP_Pointer_Update(void) { GUI_PID_STATE TS_State; static TS_StateTypeDef prev_state; TS_StateTypeDef ts; uint16_t xDiff, yDiff; BSP_TS_GetState(&ts); TS_State.Pressed = ts.TouchDetected; xDiff = (prev_state.x > ts.x) ? (prev_state.x - ts.x) : (ts.x - prev_state.x); yDiff = (prev_state.y > ts.y) ? (prev_state.y - ts.y) : (ts.y - prev_state.y); if(ts.TouchDetected) { if((prev_state.TouchDetected != ts.TouchDetected )|| (xDiff > 3 )|| (yDiff > 3)) { prev_state = ts; TS_State.Layer = 0; TS_State.x = ts.x; TS_State.y = ts.y; GUI_TOUCH_StoreStateEx(&TS_State); } } }
void LCD_TOUCH_Upcall(TOUCH_Pos_TypeDef *pos) { static GUI_PID_STATE gui_pos; if(pos->x < LCD_GetXSize()) gui_pos.x = pos->x; else gui_pos.x = LCD_GetXSize()-1; if(pos->y < LCD_GetYSize()) gui_pos.y = pos->y; else gui_pos.y = LCD_GetYSize()-1; gui_pos.Pressed = pos->pen; GUI_TOUCH_StoreStateEx(&gui_pos); }
/** * @brief Read the coordinate of the point touched and assign their * value to the variables u32_TSXCoordinate and u32_TSYCoordinate * @param None * @retval None */ void k_TouchUpdate(void) { static GUI_PID_STATE TS_State = {0, 0, 0, 0}; __IO TS_StateTypeDef ts; uint16_t xDiff, yDiff; BSP_TS_GetState((TS_StateTypeDef *)&ts); if((ts.x >= LCD_GetXSize()) ||(ts.y >= LCD_GetYSize()) ) { ts.x = 0; ts.y = 0; ts.TouchDetected =0; } xDiff = (TS_State.x > ts.x) ? (TS_State.x - ts.x) : (ts.x - TS_State.x); yDiff = (TS_State.y > ts.y) ? (TS_State.y - ts.y) : (ts.y - TS_State.y); if((TS_State.Pressed != ts.TouchDetected ) || (xDiff > 30 )|| (yDiff > 30)) { TS_State.Pressed = ts.TouchDetected; TS_State.Layer = SelLayer; if(ts.TouchDetected) { TS_State.x = ts.x; TS_State.y = ts.y; GUI_TOUCH_StoreStateEx(&TS_State); } else { GUI_TOUCH_StoreStateEx(&TS_State); TS_State.x = 0; TS_State.y = 0; } } }
void BSP_Pointer_Update(void) { GUI_PID_STATE TS_State; static TS_StateTypeDef prev_state; TS_StateTypeDef ts; uint16_t xDiff, yDiff; BSP_TS_GetState(&ts); TS_State.Pressed = ts.TouchDetected; if (ts.TouchDetected) { xDiff = (prev_state.X > ts.X) ? (prev_state.X - ts.X) : (ts.X - prev_state.X); yDiff = (prev_state.Y > ts.Y) ? (prev_state.Y - ts.Y) : (ts.Y - prev_state.Y); if ((prev_state.TouchDetected != ts.TouchDetected) || (xDiff > 3) || (yDiff > 3)) { prev_state = ts; TS_State.Layer = 0; TS_State.x = ts.X; TS_State.y = ts.Y; GUI_TOUCH_StoreStateEx(&TS_State); } } else { // Use -1 if touch is not pressed. TS_State.Layer = 0; TS_State.x = -1; TS_State.y = -1; GUI_TOUCH_StoreStateEx(&TS_State); } }
/** * @brief Read the coordinate of the point touched and assign their * value to the variables u32_TSXCoordinate and u32_TSYCoordinate * @param None * @retval None */ void k_TouchUpdate(void) { GUI_PID_STATE TS_State; static TS_StateTypeDef prev_state; __IO TS_StateTypeDef ts; uint16_t xDiff, yDiff; BSP_TS_GetState((TS_StateTypeDef *)&ts); TS_State.Pressed = ts.TouchDetected; xDiff = (prev_state.x > ts.x) ? (prev_state.x - ts.x) : (ts.x - prev_state.x); yDiff = (prev_state.y > ts.y) ? (prev_state.y - ts.y) : (ts.y - prev_state.y); if((prev_state.TouchDetected != ts.TouchDetected )|| (xDiff > 3 )|| (yDiff > 3)) { prev_state.TouchDetected = ts.TouchDetected; if((ts.x != 0) && (ts.y != 0)) { prev_state.x = ts.x; prev_state.y = ts.y; } if(k_CalibrationIsDone()) { TS_State.Layer = 0; TS_State.x = k_CalibrationGetX (prev_state.x); TS_State.y = k_CalibrationGetY (prev_state.y); } else { TS_State.Layer = 0; TS_State.x = prev_state.x; TS_State.y = prev_state.y; } GUI_TOUCH_StoreStateEx(&TS_State); } }
/** * @brief Provide the GUI with current state of the touch screen * @param None * @retval None */ void BSP_Pointer_Update(void) { GUI_PID_STATE TS_State; static TS_StateTypeDef prev_state; TS_StateTypeDef ts; uint16_t xDiff, yDiff; BSP_TS_GetState(&ts); TS_State.Pressed = ts.TouchDetected; xDiff = (prev_state.x > ts.x) ? (prev_state.x - ts.x) : (ts.x - prev_state.x); yDiff = (prev_state.y > ts.y) ? (prev_state.y - ts.y) : (ts.y - prev_state.y); if((prev_state.TouchDetected != ts.TouchDetected )|| (xDiff > 3 )|| (yDiff > 3)) { prev_state.TouchDetected = ts.TouchDetected; if((ts.x != 0) && (ts.y != 0)) { prev_state.x = ts.x; prev_state.y = ts.y; } if(CALIBRATION_IsDone()) { TS_State.Layer = 0; TS_State.x = CALIBRATION_GetX (prev_state.x); TS_State.y = CALIBRATION_GetY (prev_state.y); } else { TS_State.Layer = 0; TS_State.x = prev_state.x; TS_State.y = prev_state.y; } GUI_TOUCH_StoreStateEx(&TS_State); } }
/** * @brief Provide the GUI with current state of the touch screen * @param None * @retval None */ void BSP_Pointer_Update(void) { GUI_PID_STATE TS_State; static TS_StateTypeDef prev_state; TS_StateTypeDef ts; uint16_t xDiff, yDiff; BSP_TS_GetState(&ts); TS_State.Pressed = ts.TouchDetected; xDiff = (prev_state.X > ts.X) ? (prev_state.X - ts.X) : (ts.X - prev_state.X); yDiff = (prev_state.Y > ts.Y) ? (prev_state.Y - ts.Y) : (ts.Y - prev_state.Y); if((prev_state.TouchDetected != ts.TouchDetected )|| (xDiff > 3 )|| (yDiff > 3)) { prev_state.TouchDetected = ts.TouchDetected; if((ts.X != 0) && (ts.Y != 0)) { prev_state.X = ts.X; prev_state.Y = ts.Y; } if(CALIBRATION_IsDone()) { TS_State.Layer = 0; TS_State.x = CALIBRATION_GetX (prev_state.X); TS_State.y = CALIBRATION_GetY (prev_state.Y); } else { TS_State.Layer = 0; TS_State.x = prev_state.X; TS_State.y = prev_state.Y; } GUI_TOUCH_StoreStateEx(&TS_State); } }
void *touchscreen_thread(void *t) { Touchpanel *ts = (Touchpanel *) t; fd_set rds; int ret; struct touchstate tsState; static int lastX,lastY; lastX = lastY = 0; std::queue<touchpanel_event> events; std::cout << "Touch panel started." << std::endl << std::flush; while(ts->threadRun) { FD_ZERO(&rds); FD_SET(ts->touchpanel_fd, &rds); ret = select(ts->touchpanel_fd + 1, &rds, NULL, NULL, NULL); if(ret < 0) std::cerr << "Touch panel error." << std::endl; if(ret == 0) std::cerr << "Touch panel time out." << std::endl; else if(FD_ISSET(ts->touchpanel_fd, &rds)) { struct input_event new_event; if(read(ts->touchpanel_fd, &new_event, sizeof(struct input_event)) == -1) { if(errno != EAGAIN) std::cerr << "Touch panel read error." << std::endl; } else { struct touchpanel_event tpe; GUI_PID_STATE pid_state; read(ts->drv_fd, &tpe.data, 22); tpe.p_data = (unsigned short *) tpe.data; ts->addToEventQueue(tpe); #if 0 ts->getTouchState(&tsState); if(tsState.num_touches > tsState.old_num_touches) { pid_state.Pressed = 1; if(GetLcdFlip()) { lastX = pid_state.x = 800-tsState.x[0]; lastY = pid_state.y = 600-tsState.y[0]; } else { lastX = pid_state.x = tsState.x[0]; lastY = pid_state.y = tsState.y[0]; } GUI_TOUCH_StoreStateEx(&pid_state); } else if(0 == tsState.num_touches) { pid_state.Pressed = 0; pid_state.x = lastX; pid_state.y = lastY; GUI_TOUCH_StoreStateEx(&pid_state); } else { pid_state.Pressed = 1; if(GetLcdFlip()) { lastX = pid_state.x = 800-tsState.x[0]; lastY = pid_state.y = 600-tsState.y[0]; } else { lastX = pid_state.x = tsState.x[0]; lastY = pid_state.y = tsState.y[0]; } GUI_TOUCH_StoreStateEx(&pid_state); } #endif } } } pthread_exit(NULL); }