/** * @brief Returns status and positions of the touch screen. * @param TS_State: Pointer to touch screen current state structure * @retval TS_OK if all initializations are OK. Other value if error. */ uint8_t BSP_TS_GetState(TS_StateTypeDef *TS_State) { static uint32_t _x[TS_MAX_NB_TOUCH] = {0, 0}; static uint32_t _y[TS_MAX_NB_TOUCH] = {0, 0}; uint8_t ts_status = TS_OK; uint16_t x[TS_MAX_NB_TOUCH]; uint16_t y[TS_MAX_NB_TOUCH]; uint16_t brute_x[TS_MAX_NB_TOUCH]; uint16_t brute_y[TS_MAX_NB_TOUCH]; uint16_t x_diff; uint16_t y_diff; uint32_t index; #if (TS_MULTI_TOUCH_SUPPORTED == 1) uint32_t weight = 0; uint32_t area = 0; uint32_t event = 0; #endif /* TS_MULTI_TOUCH_SUPPORTED == 1 */ /* Check and update the number of touches active detected */ TS_State->touchDetected = tsDriver->DetectTouch(I2cAddress); if(TS_State->touchDetected) { for(index=0; index < TS_State->touchDetected; index++) { /* Get each touch coordinates */ tsDriver->GetXY(I2cAddress, &(brute_x[index]), &(brute_y[index])); if(tsOrientation == TS_SWAP_NONE) { x[index] = brute_x[index]; y[index] = brute_y[index]; } if(tsOrientation & TS_SWAP_X) { x[index] = 4096 - brute_x[index]; } if(tsOrientation & TS_SWAP_Y) { y[index] = 4096 - brute_y[index]; } if(tsOrientation & TS_SWAP_XY) { y[index] = brute_x[index]; x[index] = brute_y[index]; } x_diff = x[index] > _x[index]? (x[index] - _x[index]): (_x[index] - x[index]); y_diff = y[index] > _y[index]? (y[index] - _y[index]): (_y[index] - y[index]); if ((x_diff + y_diff) > 5) { _x[index] = x[index]; _y[index] = y[index]; } if(I2cAddress == FT5336_I2C_SLAVE_ADDRESS) { TS_State->touchX[index] = x[index]; TS_State->touchY[index] = y[index]; } else { /* 2^12 = 4096 : indexes are expressed on a dynamic of 4096 */ TS_State->touchX[index] = (tsXBoundary * _x[index]) >> 12; TS_State->touchY[index] = (tsYBoundary * _y[index]) >> 12; } #if (TS_MULTI_TOUCH_SUPPORTED == 1) /* Get touch info related to the current touch */ ft5336_TS_GetTouchInfo(I2cAddress, index, &weight, &area, &event); /* Update TS_State structure */ TS_State->touchWeight[index] = weight; TS_State->touchArea[index] = area; /* Remap touch event */ switch(event) { case FT5336_TOUCH_EVT_FLAG_PRESS_DOWN : TS_State->touchEventId[index] = TOUCH_EVENT_PRESS_DOWN; break; case FT5336_TOUCH_EVT_FLAG_LIFT_UP : TS_State->touchEventId[index] = TOUCH_EVENT_LIFT_UP; break; case FT5336_TOUCH_EVT_FLAG_CONTACT : TS_State->touchEventId[index] = TOUCH_EVENT_CONTACT; break; case FT5336_TOUCH_EVT_FLAG_NO_EVENT : TS_State->touchEventId[index] = TOUCH_EVENT_NO_EVT; break; default : ts_status = TS_ERROR; break; } /* of switch(event) */ #endif /* TS_MULTI_TOUCH_SUPPORTED == 1 */ } /* of for(index=0; index < TS_State->touchDetected; index++) */ #if (TS_MULTI_TOUCH_SUPPORTED == 1) /* Get gesture Id */ ts_status = BSP_TS_Get_GestureId(TS_State); #endif /* TS_MULTI_TOUCH_SUPPORTED == 1 */ } /* end of if(TS_State->touchDetected != 0) */ return (ts_status); }
/** * @brief Returns status and positions of the touch screen. * @param TS_State: Pointer to touch screen current state structure * @retval TS_OK if all initializations are OK. Other value if error. */ uint8_t BSP_TS_GetState(TS_StateTypeDef *TS_State) { static uint32_t _x[TS_MAX_NB_TOUCH] = {0, 0}; static uint32_t _y[TS_MAX_NB_TOUCH] = {0, 0}; uint8_t ts_status = TS_OK; uint16_t tmp; uint16_t Raw_x[TS_MAX_NB_TOUCH]; uint16_t Raw_y[TS_MAX_NB_TOUCH]; uint16_t xDiff; uint16_t yDiff; uint32_t index; #if (TS_MULTI_TOUCH_SUPPORTED == 1) uint32_t weight = 0; uint32_t area = 0; uint32_t event = 0; #endif /* TS_MULTI_TOUCH_SUPPORTED == 1 */ /* Check and update the number of touches active detected */ TS_State->touchDetected = ts_driver->DetectTouch(I2C_Address); if(TS_State->touchDetected) { for(index=0; index < TS_State->touchDetected; index++) { /* Get each touch coordinates */ ts_driver->GetXY(I2C_Address, &(Raw_x[index]), &(Raw_y[index])); if(ts_orientation & TS_SWAP_XY) { tmp = Raw_x[index]; Raw_x[index] = Raw_y[index]; Raw_y[index] = tmp; } if(ts_orientation & TS_SWAP_X) { Raw_x[index] = FT_6206_MAX_WIDTH - 1 - Raw_x[index]; } if(ts_orientation & TS_SWAP_Y) { Raw_y[index] = FT_6206_MAX_HEIGHT - 1 - Raw_y[index]; } xDiff = Raw_x[index] > _x[index]? (Raw_x[index] - _x[index]): (_x[index] - Raw_x[index]); yDiff = Raw_y[index] > _y[index]? (Raw_y[index] - _y[index]): (_y[index] - Raw_y[index]); if ((xDiff + yDiff) > 5) { _x[index] = Raw_x[index]; _y[index] = Raw_y[index]; } TS_State->touchX[index] = _x[index]; TS_State->touchY[index] = _y[index]; #if (TS_MULTI_TOUCH_SUPPORTED == 1) /* Get touch info related to the current touch */ ft6x06_TS_GetTouchInfo(I2C_Address, index, &weight, &area, &event); /* Update TS_State structure */ TS_State->touchWeight[index] = weight; TS_State->touchArea[index] = area; /* Remap touch event */ switch(event) { case FT6206_TOUCH_EVT_FLAG_PRESS_DOWN : TS_State->touchEventId[index] = TOUCH_EVENT_PRESS_DOWN; break; case FT6206_TOUCH_EVT_FLAG_LIFT_UP : TS_State->touchEventId[index] = TOUCH_EVENT_LIFT_UP; break; case FT6206_TOUCH_EVT_FLAG_CONTACT : TS_State->touchEventId[index] = TOUCH_EVENT_CONTACT; break; case FT6206_TOUCH_EVT_FLAG_NO_EVENT : TS_State->touchEventId[index] = TOUCH_EVENT_NO_EVT; break; default : ts_status = TS_ERROR; break; } /* of switch(event) */ #endif /* TS_MULTI_TOUCH_SUPPORTED == 1 */ } /* of for(index=0; index < TS_State->touchDetected; index++) */ #if (TS_MULTI_TOUCH_SUPPORTED == 1) /* Get gesture Id */ ts_status = BSP_TS_Get_GestureId(TS_State); #endif /* TS_MULTI_TOUCH_SUPPORTED == 1 */ } /* end of if(TS_State->touchDetected != 0) */ return (ts_status); }
/** * @brief Touchscreen_Handle_NewTouch: factorization of touch management * @param None * @retval TS_OK or TS_ERROR */ static uint32_t Touchscreen_Handle_NewTouch(void) { #define TS_MULTITOUCH_FOOTPRINT_CIRCLE_RADIUS 15 #define TOUCH_INFO_STRING_SIZE 70 uint16_t x1 = 0; uint16_t y1 = 0; uint16_t x2 = 0; uint16_t y2 = 0; uint32_t drawTouch1 = 0; /* activate/deactivate draw of footprint of touch 1 */ uint32_t drawTouch2 = 0; /* activate/deactivate draw of footprint of touch 2 */ uint32_t colors[24] = {LCD_COLOR_BLUE, LCD_COLOR_GREEN, LCD_COLOR_RED, LCD_COLOR_CYAN, LCD_COLOR_MAGENTA, LCD_COLOR_YELLOW, LCD_COLOR_LIGHTBLUE, LCD_COLOR_LIGHTGREEN, LCD_COLOR_LIGHTRED, LCD_COLOR_LIGHTCYAN, LCD_COLOR_LIGHTMAGENTA, LCD_COLOR_LIGHTYELLOW, LCD_COLOR_DARKBLUE, LCD_COLOR_DARKGREEN, LCD_COLOR_DARKRED, LCD_COLOR_DARKCYAN, LCD_COLOR_DARKMAGENTA, LCD_COLOR_DARKYELLOW, LCD_COLOR_LIGHTGRAY, LCD_COLOR_GRAY, LCD_COLOR_DARKGRAY, LCD_COLOR_BLACK, LCD_COLOR_BROWN, LCD_COLOR_ORANGE }; uint32_t ts_status = TS_OK; uint8_t lcd_string[TOUCH_INFO_STRING_SIZE] = ""; /* Check in polling mode in touch screen the touch status and coordinates */ /* of touches if touch occurred */ ts_status = BSP_TS_GetState(&TS_State); if(TS_State.touchDetected) { /* One or dual touch have been detected */ /* Erase previous information on touchscreen play pad area */ BSP_LCD_SetTextColor(LCD_COLOR_WHITE); BSP_LCD_FillRect(0, 80, BSP_LCD_GetXSize(), BSP_LCD_GetYSize() - 160); /* Re-Draw touch screen play area on LCD */ BSP_LCD_SetTextColor(LCD_COLOR_BLUE); BSP_LCD_DrawRect(10, 90, BSP_LCD_GetXSize() - 20, BSP_LCD_GetYSize() - 180); BSP_LCD_DrawRect(11, 91, BSP_LCD_GetXSize() - 22, BSP_LCD_GetYSize() - 182); /* Erase previous information on bottom text bar */ BSP_LCD_FillRect(0, BSP_LCD_GetYSize() - 80, BSP_LCD_GetXSize(), 80); /* Desactivate drawing footprint of touch 1 and touch 2 until validated against boundaries of touch pad values */ drawTouch1 = drawTouch2 = 0; /* Get X and Y position of the first touch post calibrated */ x1 = TouchScreen_Get_Calibrated_X(TS_State.touchX[0]); y1 = TouchScreen_Get_Calibrated_Y(TS_State.touchY[0]); if((y1 > (90 + TS_MULTITOUCH_FOOTPRINT_CIRCLE_RADIUS)) && (y1 < (BSP_LCD_GetYSize() - 90 - TS_MULTITOUCH_FOOTPRINT_CIRCLE_RADIUS))) { drawTouch1 = 1; } /* If valid touch 1 position : inside the reserved area for the use case : draw the touch */ if(drawTouch1 == 1) { /* Draw circle of first touch : turn on colors[] table */ BSP_LCD_SetTextColor(colors[(touchscreen_color_idx++ % 24)]); BSP_LCD_FillCircle(x1, y1, TS_MULTITOUCH_FOOTPRINT_CIRCLE_RADIUS); BSP_LCD_SetTextColor(LCD_COLOR_WHITE); BSP_LCD_SetFont(&Font16); BSP_LCD_DisplayStringAt(0, BSP_LCD_GetYSize() - 70, (uint8_t *)"TOUCH INFO : ", CENTER_MODE); BSP_LCD_SetFont(&Font12); sprintf((char*)lcd_string, "x1 = %d, y1 = %d, Event = %s, Weight = %d", x1, y1, ts_event_string_tab[TS_State.touchEventId[0]], TS_State.touchWeight[0]); BSP_LCD_DisplayStringAt(0, BSP_LCD_GetYSize() - 45, lcd_string, CENTER_MODE); } /* of if(drawTouch1 == 1) */ if(TS_State.touchDetected > 1) { /* Get X and Y position of the second touch post calibrated */ x2 = TouchScreen_Get_Calibrated_X(TS_State.touchX[1]); y2 = TouchScreen_Get_Calibrated_Y(TS_State.touchY[1]); if((y2 > (90 + TS_MULTITOUCH_FOOTPRINT_CIRCLE_RADIUS)) && (y2 < (BSP_LCD_GetYSize() - 90 - TS_MULTITOUCH_FOOTPRINT_CIRCLE_RADIUS))) { drawTouch2 = 1; } /* If valid touch 2 position : inside the reserved area for the use case : draw the touch */ if(drawTouch2 == 1) { sprintf((char*)lcd_string, "x2 = %d, y2 = %d, Event = %s, Weight = %d", x2, y2, ts_event_string_tab[TS_State.touchEventId[1]], TS_State.touchWeight[1]); BSP_LCD_DisplayStringAt(0, BSP_LCD_GetYSize() - 35, lcd_string, CENTER_MODE); /* Draw circle of second touch : turn on color[] table */ BSP_LCD_SetTextColor(colors[(touchscreen_color_idx++ % 24)]); BSP_LCD_FillCircle(x2, y2, TS_MULTITOUCH_FOOTPRINT_CIRCLE_RADIUS); } /* of if(drawTouch2 == 1) */ } /* of if(TS_State.touchDetected > 1) */ if((drawTouch1 == 1) || (drawTouch2 == 1)) { /* Get updated gesture Id in global variable 'TS_State' */ ts_status = BSP_TS_Get_GestureId(&TS_State); sprintf((char*)lcd_string, "Gesture Id = %s", ts_gesture_id_string_tab[TS_State.gestureId]); BSP_LCD_SetTextColor(LCD_COLOR_WHITE); BSP_LCD_DisplayStringAt(0, BSP_LCD_GetYSize() - 15, lcd_string, CENTER_MODE); } else { /* Invalid touch position */ BSP_LCD_SetTextColor(LCD_COLOR_WHITE); BSP_LCD_DisplayStringAt(0, BSP_LCD_GetYSize() - 70, (uint8_t *)"Invalid touch position : use drawn touch area : ", CENTER_MODE); } } /* of if(TS_State.TouchDetected) */ return(ts_status); }