/********************************************************************* * * MainTask */ void TOUCH_MainTask(void) { int aPhysX[2], aPhysY[2], aLogX[2], aLogY[2], i; GUI_Init(); GUI_SetBkColor(GUI_WHITE); GUI_Clear(); GUI_SetColor(GUI_BLACK); GUI_SetFont(&GUI_Font13B_ASCII); _Explain(); /* Set the logical values */ aLogX[0] = 15; aLogY[0] = 15; aLogX[1] = LCD_GetXSize() - 15; aLogY[1] = LCD_GetYSize() - 15; /* Get the physical values of the AD converter for 2 positions */ for (i = 0; i < 2; i++) { _GetPhysValues(aLogX[i], aLogY[i], &aPhysX[i], &aPhysY[i], _acPos[i]); } /* Use the physical values to calibrate the touch screen */ GUI_TOUCH_Calibrate(0, aLogX[0], aLogX[1], aPhysX[0], aPhysX[1]); /* Calibrate X-axis */ GUI_TOUCH_Calibrate(1, aLogY[0], aLogY[1], aPhysY[0], aPhysY[1]); /* Calibrate Y-axis */ /* Display the result */ GUI_CURSOR_Show(); GUI_Clear(); _DispStringCentered("Congratulation, your\n" "touch screen has been\n" "calibrated. Please use\n" "the cursor to test\n" "the calibration..."); /* Let the user play */ GUI_Delay(50); }
/** * @brief Initialization of calibration * @param None. * @retval None */ void k_CalibrationInit(void) { int aPhysX[2], aPhysY[2], aLogX[2], aLogY[2], i; data1.d32 = k_BkupRestoreParameter(RTC_BKP_DR0); data2.d32 = k_BkupRestoreParameter(RTC_BKP_DR1); A2 = data2.b.A2; B2 = data2.b.B2; A1 = data1.b.A1; B1 = data1.b.B1; if(data2.b.IsCalibrated == 0) { GUI_SetBkColor(GUI_WHITE); GUI_Clear(); GUI_SetColor(GUI_BLACK); GUI_SetFont(&GUI_Font13B_ASCII); _Explain(); /* Set the logical values */ aLogX[0] = 15; aLogY[0] = 15; aLogX[1] = LCD_GetXSize() - 15; aLogY[1] = LCD_GetYSize() - 15; /* Get the physical values of the AD converter for 2 positions */ for (i = 0; i < 2; i++) { _GetPhysValues(aLogX[i], aLogY[i], &aPhysX[i], &aPhysY[i], _acPos[i]); } /* Use the physical values to calibrate the touch screen */ A1 = (1000 * ( aLogX[1] - aLogX[0]))/ ( aPhysX[1] - aPhysX[0]); B1 = (1000 * aLogX[0]) - A1 * aPhysX[0]; A2 = (1000 * ( aLogY[1] - aLogY[0]))/ ( aPhysY[1] - aPhysY[0]); B2 = (1000 * aLogY[0]) - A2 * aPhysY[0]; data1.b.A1 = A1; data1.b.B1 = B1; k_BkupSaveParameter(RTC_BKP_DR0, data1.d32); data2.b.A2 = A2; data2.b.B2 = B2; data2.b.IsCalibrated = 1; k_BkupSaveParameter(RTC_BKP_DR1, data2.d32); /* Display the result */ GUI_Clear(); _DispStringCentered("Touch screen has been\n" "calibrated. Please use\n" "the cursor to test\n" "the calibration..."); } CALIBRATION_Done = 1; GUI_Delay(1000); }
/******************************************************************** * * _Explain * * Purpose: * Shows a text to give a short explanation of the sample program */ static void _Explain(void) { _DispStringCentered("At first time, you need to\n" "calibrate the Touch screen\n" "Please press the touch\n" "screen to continue..."); GUI_DispStringHCenterAt("Touch screen Calibration", LCD_GetXSize() / 2, 5); _WaitForPressedState(1); _WaitForPressedState(0); }
/******************************************************************** * * _Explain * * Funtion description * Shows a text to give a short explanation of the sample program */ static void _Explain(void) { _DispStringCentered("This sample shows how\n" "a touch screen can be\n" "calibrated at run time.\n" "Please press the touch\n" "screen to continue..."); GUI_DispStringHCenterAt("TOUCH_Calibrate", LCD_GetXSize() / 2, 5); _WaitForPressedState(1); _WaitForPressedState(0); }
/********************************************************************* * * _GetPhysValues * * Function description * Asks the user to press the touch screen at the given position * and returns the physical A/D values */ static void _GetPhysValues(int LogX, int LogY, int * pPhysX, int * pPhysY, const char * pString) { char acText[] = "Press here"; GUI_RECT Rect; int FontSizeY; int Align; FontSizeY = GUI_GetFontSizeY(); GUI_Clear(); GUI_SetColor(GUI_BLACK); _DispStringCentered("Runtime calibration,\n" "please touch the screen\n" "at the center of the ring."); /* Ask user to press the touch */ // // Calculate the rectangle for the string // Rect.y0 = LogY - FontSizeY; Rect.y1 = LogY + FontSizeY; if (LogX < LCD_GetXSize() / 2) { Rect.x0 = LogX + 15; Rect.x1 = LCD_GetXSize(); Align = GUI_TA_LEFT; } else { Rect.x0 = 0; Rect.x1 = LogX - 15; Align = GUI_TA_RIGHT; } // // Show the text nearby the ring // GUI_DispStringInRect(acText, &Rect, Align | GUI_TA_TOP); GUI_DispStringInRect(pString, &Rect, Align | GUI_TA_BOTTOM); // // Draw the ring // GUI_FillCircle(LogX, LogY, 10); GUI_SetColor(GUI_WHITE); GUI_FillCircle(LogX, LogY, 5); GUI_SetColor(GUI_BLACK); // // Wait until touch is pressed // _WaitForPressedState(1); *pPhysX = GUI_TOUCH_GetxPhys(); *pPhysY = GUI_TOUCH_GetyPhys(); // // Wait until touch is released // _WaitForPressedState(0); }
/********************************************************************* * * _GetPhysValues * * Purpose: * Asks the user to press the touch screen at the given position * and returns the physical pixels(A/D) values */ static void _GetPhysValues(int LogX, int LogY, int * pPhysX, int * pPhysY, const char * pString) { char acText[] = "Press here"; GUI_RECT Rect; GUI_PID_STATE State; int FontSizeY, Align; FontSizeY = GUI_GetFontSizeY(); /*获取字体的高度*/ GUI_Clear(); GUI_SetColor(GUI_BLACK); _DispStringCentered("Runtime calibration,\n" "please touch the corners of the screen\n" "at the center of the rings."); /* Ask user to press the touch */ /* Calculate the rectangle for the string(根据触摸点的位置,设置文字显示的区域) */ if (LogX < LCD_GetXSize() / 2) {/*判断是左上角的点,还是有下角的点*/ Rect.x0 = LogX + 25; Rect.x1 = LCD_GetXSize(); Rect.y0 = LogY - FontSizeY + 5; /*设置大小能显示两行字符*/ Rect.y1 = LogY + FontSizeY + 5; Align = GUI_TA_LEFT; } else { Rect.x0 = 0; Rect.x1 = LogX - 25; Rect.y0 = LogY - FontSizeY - 5; Rect.y1 = LogY + FontSizeY - 5; Align = GUI_TA_RIGHT; } /* Show the text nearby the ring */ GUI_DispStringInRect(acText, &Rect, Align | GUI_TA_TOP); GUI_DispStringInRect(pString, &Rect, Align | GUI_TA_BOTTOM); /* Draw the ring */ GUI_FillCircle(LogX, LogY, 10); GUI_SetColor(GUI_WHITE); GUI_FillCircle(LogX, LogY, 7); GUI_SetColor(GUI_BLACK); /* Wait until touch is pressed */ _WaitForPressedState(1); /*得到触摸点的值*/ GUI_TOUCH_GetState(&State); *pPhysX = State.x; *pPhysY = State.y; /* Wait until touch is released */ _WaitForPressedState(0); }
/********************************************************************* * * MainTask */ void MainTask_TOUCHCAL(void) { int aPhysX[2], aPhysY[2], aLogX[2], aLogY[2], i; GUI_Init(); GUI_SetBkColor(GUI_WHITE); GUI_Clear(); GUI_SetColor(GUI_BLACK); GUI_SetFont(&GUI_Font13B_ASCII); _Explain(); /* Set the logical values */ aLogX[0] = 15; aLogY[0] = 15; aLogX[1] = LCD_GetXSize() - 15; aLogY[1] = LCD_GetYSize() - 15; /* Get the physical values of the AD converter for 2 positions */ for (i = 0; i < 2; i++) { _GetPhysValues(aLogX[i], aLogY[i], &aPhysX[i], &aPhysY[i], _acPos[i]); } /* Use the physical values to calibrate the touch screen */ GUI_TOUCH_Calibrate(0, aLogX[0], aLogX[1], aPhysX[0], aPhysX[1]); /* Calibrate X-axis */ //如果我们要存到外部存储器中 那么就存储这里的8个参数 GUI_TOUCH_Calibrate(1, aLogY[0], aLogY[1], aPhysY[0], aPhysY[1]); /* Calibrate Y-axis */ /* Display the result */ GUI_CURSOR_Show(); GUI_Clear(); _DispStringCentered("Congratulation, your\n" "touch screen has been\n" "calibrated. Please use\n" "the cursor to test\n" "the calibration..."); /* Let the user play */ while(1) { GUI_PID_STATE State; GUI_TOUCH_GetState(&State); if (State.Pressed == 1) { GUI_FillCircle(State.x, State.y, 3); } GUI_Delay(10); } }
/********************************************************************* * * MainTask */ void CALIBRATION_Check(void) { int aPhysX[2], aPhysY[2], aLogX[2], aLogY[2], i; // data1.d32 = BACKUP_RestoreParameter(RTC_BKP_DR0); // data2.d32 = BACKUP_RestoreParameter(RTC_BKP_DR1); data1.d32 = 0; data2.d32 = 0; A2 = data2.b.A2 ; B2 = data2.b.B2 ; A1 = data1.b.A1 ; B1 = data1.b.B1 ; if(data2.b.IsCalibrated == 0) /*触摸没有计算*/ { GUI_SetBkColor(GUI_WHITE); GUI_Clear(); GUI_SetColor(GUI_BLACK); GUI_SetFont(&GUI_Font20B_ASCII); _Explain(); /*显示explain文字*/ /* Set the logical values 在什么地方画圆,设置触摸点(15,15)(X-15,Y-15)两点 */ aLogX[0] = 15; aLogY[0] = 15; aLogX[1] = LCD_GetXSize() - 15; aLogY[1] = LCD_GetYSize() - 15; /* Get the physical values of the AD converter for 2 positions */ for (i = 0; i < 2; i++) { _GetPhysValues(aLogX[i], aLogY[i], &aPhysX[i], &aPhysY[i], _acPos[i]); } /* Use the physical values to calibrate the touch screen */ A1 = (1000 * ( aLogX[1] - aLogX[0]))/ ( aPhysX[1] - aPhysX[0]); B1 = (1000 * aLogX[0]) - A1 * aPhysX[0]; A2 = (1000 * ( aLogY[1] - aLogY[0]))/ ( aPhysY[1] - aPhysY[0]); B2 = (1000 * aLogY[0]) - A2 * aPhysY[0]; data1.b.A1 = A1; data1.b.B1 = B1; // BACKUP_SaveParameter(RTC_BKP_DR0, data1.d32); data2.b.A2 = A2; data2.b.B2 = B2; data2.b.IsCalibrated = 1; // BACKUP_SaveParameter(RTC_BKP_DR1, data2.d32); /* Display the result */ GUI_CURSOR_Show(); /*显示光标*/ GUI_Clear(); _DispStringCentered("Touch screen has been\n" "calibrated. Please use\n" "the cursor to test\n" "the calibration..."); } CALIBRATION_Done = 1; GUI_Delay(1000); }