CircleOS  1
touchscreen.c
Go to the documentation of this file.
1 /****************** COPYRIGHT (C) 2007-2013 KEOLABS S.A.S. ********************/
12 /******************************************************************************/
13 
14 /* Includes ------------------------------------------------------------------*/
15 #include "circle.h"
16 
18 
19 /* Private defines -----------------------------------------------------------*/
20 #define TS_TOLERANCE 40
21 
22 /* Private variables ---------------------------------------------------------*/
23 u16 TS_Sensibility = 3100; // Sensibility of the touch
24 
25 // Position informations
26 tTOUCHSCR_Info TOUCHSCR_Info = {0};
27 tPOINT TS_ScreenSample[3] = {0};
28 
29 // Calibration informations
30 tTOUCHSCR_Cal TS_CalibrationSetup =
31 {
32  10960, 0, - 821752, // Default setup :
33  147, 7946, -1088093, // good for most Primers
34  100000 // out of the box
35 };
36 
37 /* External variables ---------------------------------------------------------*/
38 extern const tPOINT TS_RefSample[3];
39 
40 /* Private functions ----------------------------------------------------------*/
41 
42 /*******************************************************************************
43 *
44 * MedianFilter
45 *
46 *******************************************************************************/
58 /******************************************************************************/
59 NODEBUG2 u32 MedianFilter( const u16* values )
60 {
61  u16 Sorted[ADC_NB_SAMPLES]; //We only need so sort half of array
62  u16 v;
63  u32 i, j;
64 
65  Sorted[0] = values[0];
66 
67  for ( i = 1; i < ADC_NB_SAMPLES; i++ )
68  {
69  v = values[i * ADC_NB_CHANNELS];
70  j = i;
71  for ( ; j > 0; j-- )
72  {
73  if ( v > Sorted[j - 1] )
74  break;
75  Sorted[j] = Sorted[j - 1];
76  }
77  Sorted[j] = v;
78  }
79 
80  return Sorted[( ADC_NB_SAMPLES + 1 ) >> 1];
81 }
82 
83 /*******************************************************************************
84 *
85 * TOUCHSCR_SetMode
86 *
87 *******************************************************************************/
99 /******************************************************************************/
100 NODEBUG2 void TOUCHSCR_SetMode( TOUCHSCR_Mode_enum mode )
101 {
102  switch ( mode )
103  {
104  case TS_POINTER:
105  case TS_NORMAL:
106  case TS_DRAWING:
107  TOUCHSCR_Info.Mode = mode;
108  break;
109  case TS_CALIBRATION:
110  break; // set this mode only in special cases..
111  }
112 }
113 
114 /*******************************************************************************
115 *
116 * TOUCHSCR Drawing
117 *
118 *******************************************************************************/
124 /******************************************************************************/
125 NODEBUG void TOUCHSCREEN_Drawing( void )
126 {
127  static s32 old_x = 0;
128  static s32 old_y = 0;
129  static s32 old_Pressed = 0;
130  s32 xpos = 0, ypos = 0;
131 
132  // Get the coordinates of the touch point
133  if ( TOUCHSCR_Info.TouchPress )
134  {
135  xpos = TOUCHSCR_Info.xPos;
136  ypos = TOUCHSCR_Info.yPos;
137  if ( xpos < 0 ) xpos = 0;
138  if ( ypos < 0 ) ypos = 0;
139  if ( xpos > ( Screen_Width - 1 ) ) xpos = ( Screen_Width - 1 );
140  if ( ypos > ( Screen_Height - 1 ) ) ypos = ( Screen_Height - 1 );
141 
142  // To eliminate the interference
143  if ( old_Pressed )
144  {
145  if ( ( ( xpos - old_x ) * ( xpos - old_x ) + ( ypos - old_y ) * ( ypos - old_y ) ) > ( TS_TOLERANCE * TS_TOLERANCE ) )
146  {
147  old_Pressed = 0;
148  }
149  else
150  {
151  xpos = ( xpos + old_x ) / 2; // integrate the position to
152  ypos = ( ypos + old_y ) / 2;
153  }
154  }
155 
156  // Draw line between the n and n-1 points
157  if ( old_Pressed )
158  {
159  DRAW_Line_Circle( old_x, old_y, xpos, ypos, RGB_BLACK );
160  }
161  }
162  old_x = xpos;
163  old_y = ypos;
164  old_Pressed = TOUCHSCR_Info.TouchPress;
165 }
166 
167 /*******************************************************************************
168 *
169 * CalculateCalibration
170 *
171 *******************************************************************************/
186 /******************************************************************************/
187 NODEBUG void TOUCHSCR_CalculateCalibration( tPOINT* Raw )
188 {
189  s32 Dx = Raw[0].X - Raw[2].X;
190  s32 Dy = Raw[0].Y - Raw[2].Y;
191 
192  s32 Ex = Raw[1].X - Raw[2].X;
193  s32 Ey = Raw[1].Y - Raw[2].Y;
194 
195  s32 Delta = Dx * Ey - Ex * Dy;
196  TS_CalibrationSetup.R = Delta;
197 
198  // Three for X...
199  s32 A = ( TS_RefSample[0].X - TS_RefSample[2].X ) * Ey
200  - ( TS_RefSample[1].X - TS_RefSample[2].X ) * Dy;
201 
202  s32 B = ( TS_RefSample[1].X - TS_RefSample[2].X ) * Dx
203  - ( TS_RefSample[0].X - TS_RefSample[2].X ) * Ex;
204 
205  // Much faster then direct computation (without accuracy loss)
206  s32 C = ( TS_RefSample[2].X * Delta ) - ( A * Raw[2].X ) - ( B * Raw[2].Y );
207 
208  TS_CalibrationSetup.A = A;
209  TS_CalibrationSetup.B = B;
210  TS_CalibrationSetup.C = C;
211 
212  //...And three for Y
213  s32 D = ( TS_RefSample[0].Y - TS_RefSample[2].Y ) * Ey
214  - ( TS_RefSample[1].Y - TS_RefSample[2].Y ) * Dy;
215 
216  s32 E = ( TS_RefSample[1].Y - TS_RefSample[2].Y ) * Dx
217  - ( TS_RefSample[0].Y - TS_RefSample[2].Y ) * Ex;
218 
219  s32 F = ( TS_RefSample[2].Y * Delta ) - ( D * Raw[2].X ) - ( E * Raw[2].Y );
220 
221  TS_CalibrationSetup.D = D;
222  TS_CalibrationSetup.E = E;
223  TS_CalibrationSetup.F = F;
224 }
225 
227 
228 /*******************************************************************************
229 *
230 * TOUCHSCR_GetPos
231 *
232 *******************************************************************************/
241 /******************************************************************************/
242 u16 TOUCHSCR_GetPos( void )
243 {
244  return ( TOUCHSCR_Info.xPos | ( TOUCHSCR_Info.yPos << 8 ) );
245 }
246 
247 /*******************************************************************************
248 *
249 * TOUCHSCR_GetPosX
250 *
251 *******************************************************************************/
260 /******************************************************************************/
261 s32 TOUCHSCR_GetPosX( void )
262 {
263  return TOUCHSCR_Info.xPos;
264 }
265 
266 /*******************************************************************************
267 *
268 * TOUCHSCR_GetPosY
269 *
270 *******************************************************************************/
279 /******************************************************************************/
280 s32 TOUCHSCR_GetPosY( void )
281 {
282  return TOUCHSCR_Info.yPos;
283 }
284 
285 /*******************************************************************************
286 *
287 * TOUCHSCR_GetAbsPos
288 *
289 *******************************************************************************/
299 /******************************************************************************/
301 {
302  return ( TOUCHSCR_Info.xAbsPos | ( TOUCHSCR_Info.yAbsPos << 8 ) );
303 }
304 
305 /*******************************************************************************
306 *
307 * TOUCHSCR_IsPressed
308 *
309 *******************************************************************************/
318 /******************************************************************************/
319 bool TOUCHSCR_IsPressed( void )
320 {
321  return ( TOUCHSCR_Info.TouchPress ) ;
322 }
323 
324 /*******************************************************************************
325 *
326 * TOUCHSCR_GetMode
327 *
328 *******************************************************************************/
337 /******************************************************************************/
339 {
340  return ( TOUCHSCR_Info.Mode ) ;
341 }
342 
343 /*******************************************************************************
344 *
345 * TOUCHSCR_SetSensibility
346 *
347 *******************************************************************************/
356 /******************************************************************************/
357 void TOUCHSCR_SetSensibility( u16 sens )
358 {
359  if ( sens < 4095 )
360  TS_Sensibility = sens;
361  else
362  TS_Sensibility = 4095;
363 }
364 
365