1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
29
30
31
32
38
44
45
46
51
52
53
54
55
56
57
58
59
60
67
68
69
70
71
72
73
74
75
76
77
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
149
174
175
180
184
185
190
194
195
200
204
205
208
209
/* ... */
#include "main.h"
/* ... */
/* ... */
Includes
static TS_StateTypeDef TS_State;
static int16_t A1, A2, B1, B2;
static int16_t aPhysX[2], aPhysY[2], aLogX[2], aLogY[2];
static uint8_t Calibration_Done = 0;
Private variables
static void TouchscreenCalibration_SetHint(void);
static void GetPhysValues(int16_t LogX, int16_t LogY, int16_t * pPhysX, int16_t * pPhysY);
static void WaitForPressedState(uint8_t Pressed);
uint8_t IsCalibrationDone(void);
Private function prototypes
/* ... */
void Touchscreen_Calibration(void)
{
uint8_t status = 0;
uint8_t i = 0;
TouchscreenCalibration_SetHint();
status = BSP_TS_Init(BSP_LCD_GetXSize(), BSP_LCD_GetYSize());
if (status != TS_OK)
{
BSP_LCD_SetBackColor(LCD_COLOR_WHITE);
BSP_LCD_SetTextColor(LCD_COLOR_RED);
BSP_LCD_DisplayStringAt(0, BSP_LCD_GetYSize()- 95, (uint8_t *)"ERROR", CENTER_MODE);
BSP_LCD_DisplayStringAt(0, BSP_LCD_GetYSize()- 80, (uint8_t *)"Touchscreen cannot be initialized", CENTER_MODE);
}if (status != TS_OK) { ... }
while (1)
{
if (status == TS_OK)
{
aLogX[0] = 15;
aLogY[0] = 15;
aLogX[1] = BSP_LCD_GetXSize() - 15;
aLogY[1] = BSP_LCD_GetYSize() - 15;
for (i = 0; i < 2; i++)
{
GetPhysValues(aLogX[i], aLogY[i], &aPhysX[i], &aPhysY[i]);
}for (i = 0; i < 2; i++) { ... }
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];
Calibration_Done = 1;
return;
}if (status == TS_OK) { ... }
HAL_Delay(5);
}while (1) { ... }
}{ ... }
/* ... */
static void TouchscreenCalibration_SetHint(void)
{
BSP_LCD_Clear(LCD_COLOR_WHITE);
BSP_LCD_SetTextColor(LCD_COLOR_BLACK);
BSP_LCD_SetBackColor(LCD_COLOR_WHITE);
BSP_LCD_SetFont(&Font12);
BSP_LCD_DisplayStringAt(0, BSP_LCD_GetYSize()/2 - 27, (uint8_t *)"Before using the Touchscreen", CENTER_MODE);
BSP_LCD_DisplayStringAt(0, BSP_LCD_GetYSize()/2 - 12, (uint8_t *)"you need to calibrate it.", CENTER_MODE);
BSP_LCD_DisplayStringAt(0, BSP_LCD_GetYSize()/2 + 3, (uint8_t *)"Press on the black circles", CENTER_MODE);
}{ ... }
/* ... */
static void GetPhysValues(int16_t LogX, int16_t LogY, int16_t *pPhysX, int16_t *pPhysY)
{
BSP_LCD_SetTextColor(LCD_COLOR_BLACK);
BSP_LCD_FillCircle(LogX, LogY, 5);
BSP_LCD_SetTextColor(LCD_COLOR_WHITE);
BSP_LCD_FillCircle(LogX, LogY, 2);
WaitForPressedState(1);
BSP_TS_GetState(&TS_State);
*pPhysX = TS_State.x;
*pPhysY = TS_State.y;
WaitForPressedState(0);
BSP_LCD_SetTextColor(LCD_COLOR_WHITE);
BSP_LCD_FillCircle(LogX, LogY, 5);
}{ ... }
/* ... */
static void WaitForPressedState(uint8_t Pressed)
{
TS_StateTypeDef State;
do
{
BSP_TS_GetState(&State);
HAL_Delay(10);
if (State.TouchDetected == Pressed)
{
uint16_t TimeStart = HAL_GetTick();
do {
BSP_TS_GetState(&State);
HAL_Delay(40);
if (State.TouchDetected != Pressed)
{
break;
}if (State.TouchDetected != Pressed) { ... } else if ((HAL_GetTick() - 100) > TimeStart)
{
return;
}else if ((HAL_GetTick() - 100) > TimeStart) { ... }
...} while (1);
}if (State.TouchDetected == Pressed) { ... }
...} while (1);
}{ ... }
/* ... */
uint16_t Calibration_GetX(uint16_t x)
{
return (((A1 * x) + B1)/1000);
}{ ... }
/* ... */
uint16_t Calibration_GetY(uint16_t y)
{
return (((A2 * y) + B2)/1000);
}{ ... }
/* ... */
uint8_t IsCalibrationDone(void)
{
return (Calibration_Done);
}{ ... }
/* ... */
/* ... */