/** * @brief Touchscreen Demo1 : test touchscreen calibration and single touch in polling mode * @param None * @retval None */ void Touchscreen_demo1(void) { uint16_t x1, y1; uint8_t state = 0; uint8_t exitTsUseCase = 0; uint32_t ts_status = TS_OK; /* Reset touch data information */ BSP_TEST_APPLI_ASSERT(BSP_TS_ResetTouchData(&TS_State)); /* If calibration is not yet done, proceed with calibration */ if (TouchScreen_IsCalibrationDone() == 0) { ts_status = Touchscreen_Calibration(); if (ts_status == TS_OK) { BSP_LCD_DisplayStringAt(0, BSP_LCD_GetYSize() - 65, (uint8_t *) "Touchscreen calibration success.", CENTER_MODE); } } /* of if (TouchScreen_IsCalibrationDone() == 0) */ if(ts_status == TS_OK) { /* Display touch screen demo description */ Touchscreen_SetHint_Demo(TOUCHSCREEN_DEMO_1); Touchscreen_DrawBackground_Demo1(state); while (exitTsUseCase == 0) { if (ts_status == TS_OK) { /* 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 */ /* Only take into account the first touch so far */ /* 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 > (CIRCLE_YPOS(1) - CIRCLE_RADIUS)) && (y1 < (CIRCLE_YPOS(1) + CIRCLE_RADIUS))) { if ((x1 > (CIRCLE_XPOS(1) - CIRCLE_RADIUS)) && (x1 < (CIRCLE_XPOS(1) + CIRCLE_RADIUS))) { if ((state & 1) == 0) { Touchscreen_DrawBackground_Demo1(state); BSP_LCD_SetTextColor(LCD_COLOR_BLUE); BSP_LCD_FillCircle(CIRCLE_XPOS(1), CIRCLE_YPOS(1), CIRCLE_RADIUS); state = 1; } } if ((x1 > (CIRCLE_XPOS(2) - CIRCLE_RADIUS)) && (x1 < (CIRCLE_XPOS(2) + CIRCLE_RADIUS))) { if ((state & 2) == 0) { Touchscreen_DrawBackground_Demo1(state); BSP_LCD_SetTextColor(LCD_COLOR_RED); BSP_LCD_FillCircle(CIRCLE_XPOS(2), CIRCLE_YPOS(2), CIRCLE_RADIUS); state = 2; } } if ((x1 > (CIRCLE_XPOS(3) - CIRCLE_RADIUS)) && (x1 < (CIRCLE_XPOS(3) + CIRCLE_RADIUS))) { if ((state & 4) == 0) { Touchscreen_DrawBackground_Demo1(state); BSP_LCD_SetTextColor(LCD_COLOR_YELLOW); BSP_LCD_FillCircle(CIRCLE_XPOS(3), CIRCLE_YPOS(3), CIRCLE_RADIUS); state = 4; } } if ((x1 > (CIRCLE_XPOS(4) - CIRCLE_RADIUS)) && (x1 < (CIRCLE_XPOS(4) + CIRCLE_RADIUS))) { if ((state & 8) == 0) { Touchscreen_DrawBackground_Demo1(state); BSP_LCD_SetTextColor(LCD_COLOR_GREEN); BSP_LCD_FillCircle(CIRCLE_XPOS(4), CIRCLE_YPOS(3), CIRCLE_RADIUS); state = 8; } } } } /* of if(TS_State.TouchDetected) */ } /* of if (ts_status == TS_OK) */ /* Wait for a key button press to switch to next test case of BSP validation application */ /* Otherwise stay in the test */ exitTsUseCase = CheckForUserInput(); HAL_Delay(20); } /* of while (exitTsUseCase == 0) */ } /* of if(status == TS_OK) */ }
/** * @brief Configures and gets Touch screen position. * @param None * @retval None */ static void GetPosition(void) { static uint32_t color_width; static uint32_t color; uint16_t x, y; color_width = 35; /* Get Touch screen position */ BSP_TS_GetState(&TS_State); if(TS_State.touchDetected) { /* A touch occured, read the touch coordinates */ /* Get X and Y position of the first touch post calibrated */ x = TouchScreen_Get_Calibrated_X(TS_State.touchX[0]); y = TouchScreen_Get_Calibrated_Y(TS_State.touchY[0]); if((x > (90 + Radius)) & (y > (7 + Radius) ) & ( x < (BSP_LCD_GetXSize() - (7 + Radius ))) & (y < (BSP_LCD_GetYSize() - (95 + Radius )))) { BSP_LCD_FillCircle((x), (y), Radius); } else if((x > 0 ) & ( x < 90 )) { if((y > 0 ) & (y < color_width )) { BSP_LCD_SetTextColor(LCD_COLOR_WHITE); Update_Size(Radius); } else if((y > color_width ) & (y < (2 * color_width))) { BSP_LCD_SetTextColor(LCD_COLOR_YELLOW); Update_Size(Radius); } else if((y > (2 * color_width)) & (y < (3 * color_width))) { BSP_LCD_SetTextColor(LCD_COLOR_ORANGE); Update_Size(Radius); } else if((y > (3 * color_width)) & (y < (4 * color_width))) { BSP_LCD_SetTextColor(LCD_COLOR_LIGHTMAGENTA); Update_Size(Radius); } else if((y > (4 * color_width)) & (y < (5 * color_width))) { BSP_LCD_SetTextColor(LCD_COLOR_DARKGREEN); Update_Size(Radius); } else if((y > (5 * color_width)) &(y < (6 * color_width))) { BSP_LCD_SetTextColor(LCD_COLOR_GREEN); Update_Size(Radius); } else if((y > (6 * color_width)) &(y < (7 * color_width))) { BSP_LCD_SetTextColor(LCD_COLOR_BROWN); Update_Size(Radius); } else if((y > (7 * color_width)) & (y < (8 * color_width))) { BSP_LCD_SetTextColor(LCD_COLOR_RED); Update_Size(Radius); } else if((y > (8 * color_width)) & (y < (9 * color_width))) { BSP_LCD_SetTextColor(LCD_COLOR_DARKMAGENTA); Update_Size(Radius); } else if((y > (9 * color_width)) & (y < (10 * color_width))) { BSP_LCD_SetTextColor(LCD_COLOR_CYAN); Update_Size(Radius); } else if((y > (10 * color_width)) & (y < (11 * color_width))) { BSP_LCD_SetTextColor(LCD_COLOR_DARKBLUE); Update_Size(Radius); } else if((y > (11 * color_width)) & (y < (12 * color_width))) { BSP_LCD_SetTextColor(LCD_COLOR_BLACK); Update_Size(Radius); } else if((y > (12 * color_width)) & (y < (14 * color_width))) { /* Get the current text color */ color = BSP_LCD_GetTextColor(); BSP_LCD_SetTextColor(LCD_COLOR_WHITE); /* Clear the working window */ BSP_LCD_FillRect(97, 8, 694, 374); BSP_LCD_SetTextColor(color); } else { x = 0; y = 0; } Update_Color(); } else if((x > 100) & (y > (BSP_LCD_GetYSize() - 90)) & (y < (BSP_LCD_GetYSize()) ) & ( x < 170)) { Radius = 15; Update_Size(Radius); } else if((x > 170) & (y > (BSP_LCD_GetYSize() - 90)) & (y < (BSP_LCD_GetYSize()) ) & ( x < 240)) { Radius = 10; Update_Size(Radius); } else if((x > 240) & (y > (BSP_LCD_GetYSize() - 90)) & (y < (BSP_LCD_GetYSize()) ) & ( x < 310)) { Radius = 5; Update_Size(Radius); } else if(((x > (BSP_LCD_GetXSize()-5) ) & (y > (14 * color_width)) & (y < (15 * color_width))) | ((x < 90) & (y < 5))) { TS_State.touchX[0] = 0; TS_State.touchY[0] = 0; } else if((x > 320) & (y > (BSP_LCD_GetYSize() - 90)) & (x < 410) & (y < BSP_LCD_GetYSize() - 5)) { Save_Picture(); } } }
/** * @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); }