]> git.sur5r.net Git - freertos/blob - FreeRTOS/Demo/CORTEX_STM32L152_Discovery_IAR/ST_Code/Libraries/STMTouch_Driver/src/tsl_touchkey.c
Remove unused files from STM32L discovery board demo directory structure and build.
[freertos] / FreeRTOS / Demo / CORTEX_STM32L152_Discovery_IAR / ST_Code / Libraries / STMTouch_Driver / src / tsl_touchkey.c
1 /**\r
2   ******************************************************************************\r
3   * @file    tsl_touchkey.c\r
4   * @author  MCD Application Team\r
5   * @version V1.3.2\r
6   * @date    22-January-2013\r
7   * @brief   This file contains all functions to manage TouchKey sensors.\r
8   ******************************************************************************\r
9   * @attention\r
10   *\r
11   * <h2><center>&copy; COPYRIGHT 2013 STMicroelectronics</center></h2>\r
12   *\r
13   * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");\r
14   * You may not use this file except in compliance with the License.\r
15   * You may obtain a copy of the License at:\r
16   *\r
17   *        http://www.st.com/software_license_agreement_liberty_v2\r
18   *\r
19   * Unless required by applicable law or agreed to in writing, software\r
20   * distributed under the License is distributed on an "AS IS" BASIS,\r
21   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
22   * See the License for the specific language governing permissions and\r
23   * limitations under the License.\r
24   *\r
25   ******************************************************************************\r
26   */\r
27 \r
28 /* Includes ------------------------------------------------------------------*/\r
29 #include "tsl_touchkey.h"\r
30 #include "tsl_globals.h"\r
31 \r
32 #if TSLPRM_TOTAL_TKEYS > 0\r
33 \r
34 /* Private typedefs ----------------------------------------------------------*/\r
35 /* Private defines -----------------------------------------------------------*/\r
36 \r
37 /* Private macros ------------------------------------------------------------*/\r
38 \r
39 #define THIS_MEAS                 TSL_Globals.This_TKey->p_ChD->Meas\r
40 #define THIS_DELTA                TSL_Globals.This_TKey->p_ChD->Delta\r
41 #define THIS_REF                  TSL_Globals.This_TKey->p_ChD->Ref\r
42 #define THIS_REFREST              TSL_Globals.This_TKey->p_ChD->RefRest\r
43 #define THIS_CHANNEL_DATA         TSL_Globals.This_TKey->p_ChD\r
44 #define THIS_ACQ_STATUS           TSL_Globals.This_TKey->p_ChD->Flags.AcqStatus\r
45 #define THIS_OBJ_STATUS           TSL_Globals.This_TKey->p_ChD->Flags.ObjStatus\r
46 #define THIS_DATA_READY           TSL_Globals.This_TKey->p_ChD->Flags.DataReady\r
47 \r
48 #define THIS_STATEID              TSL_Globals.This_TKey->p_Data->StateId\r
49 #define THIS_CHANGE               TSL_Globals.This_TKey->p_Data->Change\r
50 #define THIS_COUNTER              TSL_Globals.This_TKey->p_Data->Counter\r
51 #define THIS_DXSLOCK              TSL_Globals.This_TKey->p_Data->DxSLock\r
52 \r
53 #define THIS_PROXIN_TH            TSL_Globals.This_TKey->p_Param->ProxInTh\r
54 #define THIS_PROXOUT_TH           TSL_Globals.This_TKey->p_Param->ProxOutTh\r
55 #define THIS_DETECTIN_TH          TSL_Globals.This_TKey->p_Param->DetectInTh\r
56 #define THIS_DETECTOUT_TH         TSL_Globals.This_TKey->p_Param->DetectOutTh\r
57 #define THIS_CALIB_TH             TSL_Globals.This_TKey->p_Param->CalibTh\r
58 \r
59 #define THIS_COUNTER_DEB_CALIB    TSL_Globals.This_TKey->p_Param->CounterDebCalib\r
60 #define THIS_COUNTER_DEB_PROX     TSL_Globals.This_TKey->p_Param->CounterDebProx\r
61 #define THIS_COUNTER_DEB_DETECT   TSL_Globals.This_TKey->p_Param->CounterDebDetect\r
62 #define THIS_COUNTER_DEB_RELEASE  TSL_Globals.This_TKey->p_Param->CounterDebRelease\r
63 #define THIS_COUNTER_DEB_ERROR    TSL_Globals.This_TKey->p_Param->CounterDebError\r
64 \r
65 #if TSLPRM_DTO > 0\r
66 #define DTO_GET_TIME  {TSL_tkey_DTOGetTime();}\r
67 #else\r
68 #define DTO_GET_TIME\r
69 #endif\r
70 \r
71 #if TSLPRM_COEFF_TH > 0\r
72 #define TEST_DELTA(OPER,TH) (THIS_DELTA OPER (uint16_t)((uint16_t)TH << TSLPRM_COEFF_TH))\r
73 #define TEST_DELTA_NEGATIVE {if (THIS_DELTA < 0) {return;}}\r
74 #else\r
75 #define TEST_DELTA(OPER,TH) (THIS_DELTA OPER TH)\r
76 #define TEST_DELTA_NEGATIVE\r
77 #endif\r
78 \r
79 /* Private variables ---------------------------------------------------------*/\r
80 \r
81 static TSL_tNb_T CalibDiv;\r
82 \r
83 /* Private functions prototype -----------------------------------------------*/\r
84 \r
85 void TSL_tkey_DTOGetTime(void);\r
86 \r
87 \r
88 //==============================================================================\r
89 // "Object methods" functions\r
90 //==============================================================================\r
91 \r
92 /**\r
93   * @brief  Init parameters with default values from configuration file\r
94   * @param  None\r
95   * @retval None\r
96   */\r
97 void TSL_tkey_Init(void)\r
98 {\r
99   // Thresholds\r
100 #if TSLPRM_USE_PROX > 0\r
101   THIS_PROXIN_TH    = TSLPRM_TKEY_PROX_IN_TH;\r
102   THIS_PROXOUT_TH   = TSLPRM_TKEY_PROX_OUT_TH;\r
103 #endif\r
104   THIS_DETECTIN_TH  = TSLPRM_TKEY_DETECT_IN_TH;\r
105   THIS_DETECTOUT_TH = TSLPRM_TKEY_DETECT_OUT_TH;\r
106   THIS_CALIB_TH     = TSLPRM_TKEY_CALIB_TH;\r
107 \r
108   // Debounce counters\r
109   THIS_COUNTER_DEB_CALIB   = TSLPRM_DEBOUNCE_CALIB;\r
110 #if TSLPRM_USE_PROX > 0\r
111   THIS_COUNTER_DEB_PROX    = TSLPRM_DEBOUNCE_PROX;\r
112 #endif\r
113   THIS_COUNTER_DEB_DETECT  = TSLPRM_DEBOUNCE_DETECT;\r
114   THIS_COUNTER_DEB_RELEASE = TSLPRM_DEBOUNCE_RELEASE;\r
115   THIS_COUNTER_DEB_ERROR   = TSLPRM_DEBOUNCE_ERROR;\r
116 \r
117   // Initial state\r
118   TSL_tkey_SetStateCalibration(TSLPRM_CALIB_DELAY);\r
119 }\r
120 \r
121 \r
122 /**\r
123   * @brief  Process the State Machine\r
124   * @param  None\r
125   * @retval None\r
126   */\r
127 void TSL_tkey_Process(void)\r
128 {\r
129   TSL_StateId_enum_T prev_state_id;\r
130 \r
131   if ((THIS_DATA_READY != 0) || (THIS_STATEID == TSL_STATEID_OFF))\r
132   {\r
133 \r
134     THIS_DATA_READY = TSL_DATA_NOT_READY; // The new data is processed\r
135 \r
136     prev_state_id = THIS_STATEID;\r
137 \r
138 #if TSLPRM_TOTAL_TOUCHKEYS > 0\r
139     if (TSL_Globals.This_Obj->Type == TSL_OBJ_TOUCHKEY)\r
140     {\r
141       // Launch the TKey state function\r
142       TSL_Globals.This_TKey->p_SM[THIS_STATEID].StateFunc();\r
143     }\r
144 #endif\r
145 \r
146 #if TSLPRM_TOTAL_TOUCHKEYS_B > 0\r
147     if (TSL_Globals.This_Obj->Type == TSL_OBJ_TOUCHKEYB)\r
148     {\r
149       // Launch the TSL_Params state function\r
150       TSL_Params.p_TKeySM[THIS_STATEID].StateFunc();\r
151     }\r
152 #endif\r
153 \r
154     // Check if the new state has changed\r
155     if (THIS_STATEID == prev_state_id)\r
156     {\r
157       THIS_CHANGE = TSL_STATE_NOT_CHANGED;\r
158     }\r
159     else\r
160     {\r
161       THIS_CHANGE = TSL_STATE_CHANGED;\r
162     }\r
163 \r
164 #if TSLPRM_USE_DXS > 0\r
165     if (THIS_STATEID != TSL_STATEID_DETECT)\r
166     {\r
167       THIS_DXSLOCK = TSL_FALSE;\r
168     }\r
169     if (THIS_STATEID == TSL_STATEID_TOUCH)\r
170     {\r
171       THIS_STATEID = TSL_STATEID_DETECT;\r
172     }\r
173 #endif\r
174 \r
175   }\r
176 }\r
177 \r
178 \r
179 //==============================================================================\r
180 // Utility functions\r
181 //==============================================================================\r
182 \r
183 /**\r
184   * @brief  Go in Calibration state\r
185   * @param[in] delay Delay before calibration starts (stabilization of noise filter)\r
186   * @retval None\r
187   */\r
188 void TSL_tkey_SetStateCalibration(TSL_tCounter_T delay)\r
189 {\r
190   THIS_STATEID = TSL_STATEID_CALIB;\r
191   THIS_CHANGE = TSL_STATE_CHANGED;\r
192   THIS_OBJ_STATUS = TSL_OBJ_STATUS_ON;\r
193 \r
194   switch (TSL_Params.NbCalibSamples)\r
195   {\r
196     case 4:\r
197       CalibDiv = 2;\r
198       break;\r
199     case 16:\r
200       CalibDiv = 4;\r
201       break;\r
202     default:\r
203       TSL_Params.NbCalibSamples =  8;\r
204       CalibDiv = 3;\r
205       break;\r
206   }\r
207 \r
208   // If a noise filter is used, the counter must be initialized to a value\r
209   // different from 0 in order to stabilize the filter.\r
210   THIS_COUNTER = (TSL_tCounter_T)(delay + (TSL_tCounter_T)TSL_Params.NbCalibSamples);\r
211   THIS_REF = 0;\r
212 }\r
213 \r
214 \r
215 /**\r
216   * @brief  Go in Off state with sensor "off"\r
217   * @param  None\r
218   * @retval None\r
219   */\r
220 void TSL_tkey_SetStateOff(void)\r
221 {\r
222   THIS_STATEID = TSL_STATEID_OFF;\r
223   THIS_CHANGE = TSL_STATE_CHANGED;\r
224   THIS_OBJ_STATUS = TSL_OBJ_STATUS_OFF;\r
225 }\r
226 \r
227 \r
228 #if !defined(TSLPRM_STM8TL5X) && !defined(STM8TL5X)\r
229 /**\r
230   * @brief  Go in Off state with sensor in "Burst mode only"\r
231   * @param  None\r
232   * @retval None\r
233   */\r
234 void TSL_tkey_SetStateBurstOnly(void)\r
235 {\r
236   THIS_STATEID = TSL_STATEID_OFF;\r
237   THIS_CHANGE = TSL_STATE_CHANGED;\r
238   THIS_OBJ_STATUS = TSL_OBJ_STATUS_BURST_ONLY;\r
239 }\r
240 #endif\r
241 \r
242 \r
243 /**\r
244   * @brief  Return the current state identifier\r
245   * @param  None\r
246   * @retval State id\r
247   */\r
248 TSL_StateId_enum_T TSL_tkey_GetStateId(void)\r
249 {\r
250   return(THIS_STATEID);\r
251 }\r
252 \r
253 \r
254 /**\r
255   * @brief  Return the current state mask\r
256   * @param  None\r
257   * @retval State mask\r
258   */\r
259 TSL_StateMask_enum_T TSL_tkey_GetStateMask(void)\r
260 {\r
261   TSL_StateMask_enum_T state_mask = TSL_STATEMASK_UNKNOWN;\r
262 \r
263 #if TSLPRM_TOTAL_TOUCHKEYS > 0\r
264   if (TSL_Globals.This_Obj->Type == TSL_OBJ_TOUCHKEY)\r
265   {\r
266     state_mask = TSL_Globals.This_TKey->p_SM[THIS_STATEID].StateMask;\r
267   }\r
268 #endif\r
269 \r
270 #if TSLPRM_TOTAL_TOUCHKEYS_B > 0\r
271   if (TSL_Globals.This_Obj->Type == TSL_OBJ_TOUCHKEYB)\r
272   {\r
273     state_mask = TSL_Params.p_TKeySM[THIS_STATEID].StateMask;\r
274   }\r
275 #endif\r
276 \r
277   return state_mask;\r
278 }\r
279 \r
280 \r
281 /**\r
282   * @brief  Return the Change flag\r
283   * @param  None\r
284   * @retval Change flag status\r
285   */\r
286 TSL_tNb_T TSL_tkey_IsChanged(void)\r
287 {\r
288   return(THIS_CHANGE);\r
289 }\r
290 \r
291 \r
292 //==============================================================================\r
293 // State machine functions\r
294 //==============================================================================\r
295 \r
296 #if TSLPRM_USE_PROX > 0\r
297 /**\r
298   * @brief  Debounce Release processing (previous state = Proximity)\r
299   * @param  None\r
300   * @retval None\r
301   */\r
302 void TSL_tkey_DebReleaseProxStateProcess(void)\r
303 {\r
304   if (THIS_ACQ_STATUS & TSL_ACQ_STATUS_ERROR_MASK) // Acquisition error (min or max)\r
305   {\r
306     THIS_STATEID = TSL_STATEID_PROX; // Go back to the previous state\r
307   }\r
308   else // Acquisition is OK or has NOISE\r
309   {\r
310     if (THIS_DELTA > THIS_PROXOUT_TH)\r
311     {\r
312       THIS_STATEID = TSL_STATEID_PROX; // Go back to the previous state\r
313     }\r
314     else\r
315     {\r
316       if (THIS_COUNTER > 0) {THIS_COUNTER--;}\r
317       if (THIS_COUNTER == 0)\r
318       {\r
319         THIS_STATEID = TSL_STATEID_RELEASE;\r
320       }\r
321       // else stay in Debounce Release\r
322     }\r
323   }\r
324 }\r
325 #endif // if TSLPRM_USE_PROX > 0\r
326 \r
327 \r
328 /**\r
329   * @brief  Debounce Release processing (previous state = Detect)\r
330   * @param  None\r
331   * @retval None\r
332   */\r
333 void TSL_tkey_DebReleaseDetectStateProcess(void)\r
334 {\r
335   if (THIS_ACQ_STATUS & TSL_ACQ_STATUS_ERROR_MASK) // Acquisition error (min or max)\r
336   {\r
337     THIS_STATEID = TSL_STATEID_DETECT; // Go back to the previous state\r
338   }\r
339   else // Acquisition is OK or has NOISE\r
340   {\r
341     if TEST_DELTA(>, THIS_DETECTOUT_TH)\r
342     {\r
343       TEST_DELTA_NEGATIVE;\r
344       THIS_STATEID = TSL_STATEID_DETECT;\r
345     }\r
346     else\r
347     {\r
348 #if TSLPRM_USE_PROX > 0\r
349       if (THIS_DELTA > THIS_PROXOUT_TH)\r
350       {\r
351         THIS_STATEID = TSL_STATEID_PROX;\r
352         return;\r
353       }\r
354 #endif\r
355       if (THIS_COUNTER > 0) {THIS_COUNTER--;}\r
356       if (THIS_COUNTER == 0)\r
357       {\r
358         THIS_STATEID = TSL_STATEID_RELEASE;\r
359       }\r
360       // else stay in Debounce Release\r
361     }\r
362   }\r
363 }\r
364 \r
365 \r
366 /**\r
367   * @brief  Debounce Release processing (previous state = Touch)\r
368   * Same as Debounce Release Detect processing\r
369   * @param  None\r
370   * @retval None\r
371   */\r
372 void TSL_tkey_DebReleaseTouchStateProcess(void)\r
373 {\r
374   if (THIS_ACQ_STATUS & TSL_ACQ_STATUS_ERROR_MASK) // Acquisition error (min or max)\r
375   {\r
376     THIS_STATEID = TSL_STATEID_TOUCH; // Go back to the previous state\r
377   }\r
378   else // Acquisition is OK or has NOISE\r
379   {\r
380     if TEST_DELTA(>, THIS_DETECTOUT_TH)\r
381     {\r
382       TEST_DELTA_NEGATIVE;\r
383       THIS_STATEID = TSL_STATEID_TOUCH;\r
384     }\r
385     else\r
386     {\r
387 #if TSLPRM_USE_PROX > 0\r
388       if (THIS_DELTA > THIS_PROXOUT_TH)\r
389       {\r
390         THIS_STATEID = TSL_STATEID_PROX;\r
391         return;\r
392       }\r
393 #endif\r
394       if (THIS_COUNTER > 0) {THIS_COUNTER--;}\r
395       if (THIS_COUNTER == 0)\r
396       {\r
397         THIS_STATEID = TSL_STATEID_RELEASE;\r
398       }\r
399       // else stay in Debounce Release\r
400     }\r
401   }\r
402 }\r
403 \r
404 \r
405 /**\r
406   * @brief  Release state processing\r
407   * @param  None\r
408   * @retval None\r
409   */\r
410 void TSL_tkey_ReleaseStateProcess(void)\r
411 {\r
412   if (THIS_ACQ_STATUS & TSL_ACQ_STATUS_ERROR_MASK) // Acquisition error (min or max)\r
413   {\r
414     THIS_COUNTER = THIS_COUNTER_DEB_ERROR;\r
415     if (THIS_COUNTER == 0)\r
416     {\r
417       THIS_STATEID = TSL_STATEID_ERROR;\r
418     }\r
419     else\r
420     {\r
421       THIS_STATEID = TSL_STATEID_DEB_ERROR_RELEASE;\r
422     }\r
423   }\r
424   else // Acquisition is OK or has NOISE\r
425   {\r
426     if TEST_DELTA(>=, THIS_DETECTIN_TH)\r
427     {\r
428       TEST_DELTA_NEGATIVE;\r
429       THIS_COUNTER = THIS_COUNTER_DEB_DETECT;\r
430       if (THIS_COUNTER == 0)\r
431       {\r
432         THIS_STATEID = TSL_STATEID_DETECT;\r
433         DTO_GET_TIME; // Take current time for DTO processing\r
434       }\r
435       else\r
436       {\r
437         THIS_STATEID = TSL_STATEID_DEB_DETECT;\r
438       }\r
439       return;\r
440     }\r
441 \r
442 #if TSLPRM_USE_PROX > 0\r
443     if (THIS_DELTA >= THIS_PROXIN_TH)\r
444     {\r
445       THIS_COUNTER = THIS_COUNTER_DEB_PROX;\r
446       if (THIS_COUNTER == 0)\r
447       {\r
448         THIS_STATEID = TSL_STATEID_PROX;\r
449         DTO_GET_TIME; // Take current time for DTO processing\r
450       }\r
451       else\r
452       {\r
453         THIS_STATEID = TSL_STATEID_DEB_PROX;\r
454       }\r
455       return;\r
456     }\r
457 #endif\r
458 \r
459     // Check delta for re-calibration\r
460     // Warning: the threshold value is inverted\r
461     if (THIS_DELTA <= -THIS_CALIB_TH)\r
462     {\r
463       THIS_COUNTER = THIS_COUNTER_DEB_CALIB;\r
464       if (THIS_COUNTER == 0)\r
465       {\r
466         TSL_tkey_SetStateCalibration(0);\r
467       }\r
468       else\r
469       {\r
470         THIS_STATEID = TSL_STATEID_DEB_CALIB;\r
471       }\r
472     }\r
473   }\r
474 }\r
475 \r
476 \r
477 /**\r
478   * @brief  Debounce Calibration processing (previous state = Release)\r
479   * @param  None\r
480   * @retval None\r
481   */\r
482 void TSL_tkey_DebCalibrationStateProcess(void)\r
483 {\r
484   if (THIS_ACQ_STATUS & TSL_ACQ_STATUS_ERROR_MASK) // Acquisition error (min or max)\r
485   {\r
486     THIS_STATEID = TSL_STATEID_RELEASE; // Go back to the previous state\r
487   }\r
488   else // Acquisition is OK or has NOISE\r
489   {\r
490     // Still below recalibration threshold\r
491     // Warning: the threshold value is inverted\r
492     if (THIS_DELTA <= -THIS_CALIB_TH)\r
493     {\r
494       if (THIS_COUNTER > 0) {THIS_COUNTER--;}\r
495       if (THIS_COUNTER == 0)\r
496       {\r
497         TSL_tkey_SetStateCalibration(0);\r
498       }\r
499       // else stay in Debounce Calibration\r
500     }\r
501     else // Go back to previous state\r
502     {\r
503       THIS_STATEID = TSL_STATEID_RELEASE;\r
504     }\r
505   }\r
506 }\r
507 \r
508 \r
509 /**\r
510   * @brief  Calibration state processing\r
511   * @param  None\r
512   * @retval None\r
513   */\r
514 void TSL_tkey_CalibrationStateProcess(void)\r
515 {\r
516   TSL_tMeas_T new_meas;\r
517 \r
518 #if TSLPRM_CALIB_DELAY > 0\r
519   // Noise filter stabilization time\r
520   if (THIS_COUNTER > (TSL_tCounter_T)TSL_Params.NbCalibSamples)\r
521   {\r
522     THIS_COUNTER--;\r
523     return; // Skip the sample\r
524   }\r
525 #endif\r
526 \r
527   if (THIS_ACQ_STATUS & TSL_ACQ_STATUS_ERROR_MASK) // Acquisition error (min or max)\r
528   {\r
529     THIS_COUNTER = THIS_COUNTER_DEB_ERROR;\r
530     if (THIS_COUNTER == 0)\r
531     {\r
532       THIS_STATEID = TSL_STATEID_ERROR;\r
533     }\r
534     else\r
535     {\r
536       THIS_STATEID = TSL_STATEID_DEB_ERROR_CALIB;\r
537     }\r
538   }\r
539   else // Acquisition is OK or has NOISE\r
540   {\r
541 \r
542     // Get the new measure or Calculate it\r
543 #if TSLPRM_USE_MEAS > 0\r
544     new_meas = THIS_MEAS;\r
545 #else // Calculate it\r
546     new_meas = TSL_acq_ComputeMeas(THIS_REF, THIS_DELTA);\r
547 #endif\r
548 \r
549     // Verify the first Reference value\r
550     if (THIS_COUNTER == (TSL_tCounter_T)TSL_Params.NbCalibSamples)\r
551     {\r
552       if (TSL_acq_TestFirstReferenceIsValid(THIS_CHANNEL_DATA, new_meas))\r
553       {\r
554         THIS_REF = new_meas;\r
555       }\r
556       else\r
557       {\r
558         THIS_REF = 0;\r
559         return;\r
560       }\r
561     }\r
562     else\r
563     {\r
564       // Add the measure in temporary Reference\r
565       THIS_REF += new_meas;\r
566 \r
567       // Check reference overflow\r
568       if (THIS_REF < new_meas)\r
569       {\r
570         THIS_REF = 0; // Suppress the bad reference\r
571         THIS_STATEID = TSL_STATEID_ERROR;\r
572         return;\r
573       }\r
574     }\r
575 \r
576     // Check that we have all the needed measurements\r
577     if (THIS_COUNTER > 0) {THIS_COUNTER--;}\r
578     if (THIS_COUNTER == 0)\r
579     {\r
580       // Divide temporary Reference by the number of samples\r
581       THIS_REF >>= CalibDiv;\r
582       THIS_REFREST = 0;\r
583       THIS_DELTA = 0;\r
584       THIS_STATEID = TSL_STATEID_RELEASE;\r
585     }\r
586   }\r
587 }\r
588 \r
589 \r
590 #if TSLPRM_USE_PROX > 0\r
591 /**\r
592   * @brief  Debounce Proximity processing (previous state = Release)\r
593   * @param  None\r
594   * @retval None\r
595   */\r
596 void TSL_tkey_DebProxStateProcess(void)\r
597 {\r
598   if (THIS_ACQ_STATUS & TSL_ACQ_STATUS_ERROR_MASK) // Acquisition error (min or max)\r
599   {\r
600     THIS_STATEID = TSL_STATEID_RELEASE;\r
601   }\r
602   else // Acquisition is OK or has NOISE\r
603   {\r
604     if TEST_DELTA(>=, THIS_DETECTIN_TH)\r
605     {\r
606       TEST_DELTA_NEGATIVE;\r
607       THIS_COUNTER = THIS_COUNTER_DEB_DETECT;\r
608       if (THIS_COUNTER == 0)\r
609       {\r
610         THIS_STATEID = TSL_STATEID_DETECT;\r
611         DTO_GET_TIME; // Take current time for DTO processing\r
612       }\r
613       else\r
614       {\r
615         THIS_STATEID = TSL_STATEID_DEB_DETECT;\r
616       }\r
617       return;\r
618     }\r
619 \r
620     if (THIS_DELTA >= THIS_PROXIN_TH)\r
621     {\r
622       if (THIS_COUNTER > 0) {THIS_COUNTER--;}\r
623       if (THIS_COUNTER == 0)\r
624       {\r
625         THIS_STATEID = TSL_STATEID_PROX;\r
626         DTO_GET_TIME; // Take current time for DTO processing\r
627       }\r
628       // else stay in Debounce Proximity\r
629     }\r
630     else\r
631     {\r
632       THIS_STATEID = TSL_STATEID_RELEASE;\r
633     }\r
634   }\r
635 }\r
636 #endif\r
637 \r
638 \r
639 #if TSLPRM_USE_PROX > 0\r
640 /**\r
641   * @brief  Debounce Proximity processing (previous state = Detect)\r
642   * @param  None\r
643   * @retval None\r
644   */\r
645 void TSL_tkey_DebProxDetectStateProcess(void)\r
646 {\r
647   if (THIS_ACQ_STATUS & TSL_ACQ_STATUS_ERROR_MASK) // Acquisition error (min or max)\r
648   {\r
649     THIS_STATEID = TSL_STATEID_DETECT;\r
650   }\r
651   else // Acquisition is OK or has NOISE\r
652   {\r
653     if TEST_DELTA(>, THIS_DETECTOUT_TH)\r
654     {\r
655       TEST_DELTA_NEGATIVE;\r
656       THIS_STATEID = TSL_STATEID_DETECT;\r
657       return;\r
658     }\r
659 \r
660     if (THIS_DELTA > THIS_PROXOUT_TH)\r
661     {\r
662       if (THIS_COUNTER > 0) {THIS_COUNTER--;}\r
663       if (THIS_COUNTER == 0)\r
664       {\r
665         THIS_STATEID = TSL_STATEID_PROX;\r
666         DTO_GET_TIME; // Take current time for DTO processing\r
667       }\r
668       // else stay in Debounce Proximity\r
669     }\r
670     else\r
671     {\r
672       THIS_COUNTER = THIS_COUNTER_DEB_RELEASE;\r
673       if (THIS_COUNTER == 0)\r
674       {\r
675         THIS_STATEID = TSL_STATEID_RELEASE;\r
676       }\r
677       else\r
678       {\r
679         THIS_STATEID = TSL_STATEID_DEB_RELEASE_DETECT;\r
680       }\r
681     }\r
682   }\r
683 }\r
684 #endif\r
685 \r
686 \r
687 #if TSLPRM_USE_PROX > 0\r
688 /**\r
689   * @brief  Debounce Proximity processing (previous state = Touch)\r
690   * @param  None\r
691   * @retval None\r
692   */\r
693 void TSL_tkey_DebProxTouchStateProcess(void)\r
694 {\r
695   if (THIS_ACQ_STATUS & TSL_ACQ_STATUS_ERROR_MASK) // Acquisition error (min or max)\r
696   {\r
697     THIS_STATEID = TSL_STATEID_TOUCH;\r
698   }\r
699   else // Acquisition is OK or has NOISE\r
700   {\r
701     if TEST_DELTA(>, THIS_DETECTOUT_TH)\r
702     {\r
703       TEST_DELTA_NEGATIVE;\r
704       THIS_STATEID = TSL_STATEID_TOUCH;\r
705       return;\r
706     }\r
707 \r
708     if (THIS_DELTA > THIS_PROXOUT_TH)\r
709     {\r
710       if (THIS_COUNTER > 0) {THIS_COUNTER--;}\r
711       if (THIS_COUNTER == 0)\r
712       {\r
713         THIS_STATEID = TSL_STATEID_PROX;\r
714         DTO_GET_TIME; // Take current time for DTO processing\r
715       }\r
716       // else stay in Debounce Proximity\r
717     }\r
718     else\r
719     {\r
720       THIS_COUNTER = THIS_COUNTER_DEB_RELEASE;\r
721       if (THIS_COUNTER == 0)\r
722       {\r
723         THIS_STATEID = TSL_STATEID_RELEASE;\r
724       }\r
725       else\r
726       {\r
727         THIS_STATEID = TSL_STATEID_DEB_RELEASE_TOUCH;\r
728       }\r
729     }\r
730   }\r
731 }\r
732 #endif\r
733 \r
734 \r
735 #if TSLPRM_USE_PROX > 0\r
736 /**\r
737   * @brief  Proximity state processing\r
738   * @param  None\r
739   * @retval None\r
740   */\r
741 void TSL_tkey_ProxStateProcess(void)\r
742 {\r
743 #if TSLPRM_DTO > 0\r
744   TSL_tTick_sec_T tick_detected;\r
745 #endif\r
746 \r
747   if (THIS_ACQ_STATUS & TSL_ACQ_STATUS_ERROR_MASK) // Acquisition error (min or max)\r
748   {\r
749     THIS_COUNTER = THIS_COUNTER_DEB_ERROR;\r
750     if (THIS_COUNTER == 0)\r
751     {\r
752       THIS_STATEID = TSL_STATEID_ERROR;\r
753     }\r
754     else\r
755     {\r
756       THIS_STATEID = TSL_STATEID_DEB_ERROR_PROX;\r
757     }\r
758   }\r
759   else // Acquisition is OK or has NOISE\r
760   {\r
761     if TEST_DELTA(>=, THIS_DETECTIN_TH)\r
762     {\r
763       TEST_DELTA_NEGATIVE;\r
764       THIS_COUNTER = THIS_COUNTER_DEB_DETECT;\r
765       if (THIS_COUNTER == 0)\r
766       {\r
767         THIS_STATEID = TSL_STATEID_DETECT;\r
768         DTO_GET_TIME; // Take current time for DTO processing\r
769       }\r
770       else\r
771       {\r
772         THIS_STATEID = TSL_STATEID_DEB_DETECT;\r
773       }\r
774       return;\r
775     }\r
776 \r
777     if (THIS_DELTA <= THIS_PROXOUT_TH)\r
778     {\r
779       THIS_COUNTER = THIS_COUNTER_DEB_RELEASE;\r
780       if (THIS_COUNTER == 0)\r
781       {\r
782         THIS_STATEID = TSL_STATEID_RELEASE;\r
783       }\r
784       else\r
785       {\r
786         THIS_STATEID = TSL_STATEID_DEB_RELEASE_PROX;\r
787       }\r
788       return;\r
789     }\r
790 \r
791     // Stay in Proximity state\r
792 #if TSLPRM_DTO > 0\r
793     //------------------------------------\r
794     // Detection Time Out (DTO) processing\r
795     //------------------------------------\r
796     if ((TSL_Params.DTO > 1) && (TSL_Params.DTO < 64))\r
797     {\r
798       tick_detected = THIS_COUNTER; // Get the detected time previously saved\r
799       // Enter in calibration state if the DTO duration has elapsed\r
800       if (TSL_tim_CheckDelay_sec(TSL_Params.DTO, &tick_detected) == TSL_STATUS_OK)\r
801       {\r
802         TSL_tkey_SetStateCalibration(0);\r
803       }\r
804     }\r
805 #endif\r
806 \r
807   }\r
808 }\r
809 #endif\r
810 \r
811 \r
812 /**\r
813   * @brief  Debounce Detect processing (previous state = Release or Proximity)\r
814   * @param  None\r
815   * @retval None\r
816   */\r
817 void TSL_tkey_DebDetectStateProcess(void)\r
818 {\r
819   if (THIS_ACQ_STATUS & TSL_ACQ_STATUS_ERROR_MASK) // Acquisition error (min or max)\r
820   {\r
821     THIS_STATEID = TSL_STATEID_RELEASE;\r
822   }\r
823   else // Acquisition is OK or has NOISE\r
824   {\r
825     if TEST_DELTA(>=, THIS_DETECTIN_TH)\r
826     {\r
827       TEST_DELTA_NEGATIVE;\r
828       if (THIS_COUNTER > 0) {THIS_COUNTER--;}\r
829       if (THIS_COUNTER == 0)\r
830       {\r
831         THIS_STATEID = TSL_STATEID_DETECT;\r
832         DTO_GET_TIME; // Take current time for DTO processing\r
833       }\r
834       // else stay in Debounce Detect\r
835     }\r
836     else\r
837     {\r
838 #if TSLPRM_USE_PROX > 0\r
839       if (THIS_DELTA >= THIS_PROXIN_TH)\r
840       {\r
841         THIS_COUNTER = THIS_COUNTER_DEB_PROX;\r
842         if (THIS_COUNTER == 0)\r
843         {\r
844           THIS_STATEID = TSL_STATEID_PROX;\r
845           DTO_GET_TIME; // Take current time for DTO processing\r
846         }\r
847         else\r
848         {\r
849           THIS_STATEID = TSL_STATEID_DEB_PROX;\r
850         }\r
851       }\r
852       else\r
853       {\r
854         THIS_STATEID = TSL_STATEID_RELEASE;\r
855       }\r
856 #else\r
857       THIS_STATEID = TSL_STATEID_RELEASE;\r
858 #endif\r
859     }\r
860   }\r
861 }\r
862 \r
863 \r
864 /**\r
865   * @brief  Detect state processing\r
866   * @param  None\r
867   * @retval None\r
868   */\r
869 void TSL_tkey_DetectStateProcess(void)\r
870 {\r
871 #if TSLPRM_DTO > 0\r
872   TSL_tTick_sec_T tick_detected;\r
873 #endif\r
874 \r
875   if (THIS_ACQ_STATUS & TSL_ACQ_STATUS_ERROR_MASK) // Acquisition error (min or max)\r
876   {\r
877     THIS_COUNTER = THIS_COUNTER_DEB_ERROR;\r
878     if (THIS_COUNTER == 0)\r
879     {\r
880       THIS_STATEID = TSL_STATEID_ERROR;\r
881     }\r
882     else\r
883     {\r
884       THIS_STATEID = TSL_STATEID_DEB_ERROR_DETECT;\r
885     }\r
886   }\r
887   else // Acquisition is OK or has NOISE\r
888   {\r
889     if TEST_DELTA(>, THIS_DETECTOUT_TH)\r
890     {\r
891       TEST_DELTA_NEGATIVE;\r
892 #if TSLPRM_DTO > 0\r
893       //------------------------------------\r
894       // Detection Time Out (DTO) processing\r
895       //------------------------------------\r
896       if ((TSL_Params.DTO > 1) && (TSL_Params.DTO < 64))\r
897       {\r
898         tick_detected = THIS_COUNTER; // Get the detected time previously saved\r
899         // Enter in calibration state if the DTO duration has elapsed\r
900         if (TSL_tim_CheckDelay_sec(TSL_Params.DTO, &tick_detected) == TSL_STATUS_OK)\r
901         {\r
902           TSL_tkey_SetStateCalibration(0);\r
903         }\r
904       }\r
905 #endif\r
906       return; // Normal operation, stay in Detect state\r
907     }\r
908 \r
909 #if TSLPRM_USE_PROX > 0\r
910     if (THIS_DELTA > THIS_PROXOUT_TH)\r
911     {\r
912       THIS_COUNTER = THIS_COUNTER_DEB_PROX;\r
913       if (THIS_COUNTER == 0)\r
914       {\r
915         THIS_STATEID = TSL_STATEID_PROX;\r
916         DTO_GET_TIME; // Take current time for DTO processing\r
917       }\r
918       else\r
919       {\r
920         THIS_STATEID = TSL_STATEID_DEB_PROX_DETECT;\r
921       }\r
922       return;\r
923     }\r
924 #endif\r
925 \r
926     THIS_COUNTER = THIS_COUNTER_DEB_RELEASE;\r
927     if (THIS_COUNTER == 0)\r
928     {\r
929       THIS_STATEID = TSL_STATEID_RELEASE;\r
930     }\r
931     else\r
932     {\r
933       THIS_STATEID = TSL_STATEID_DEB_RELEASE_DETECT;\r
934     }\r
935 \r
936   }\r
937 }\r
938 \r
939 \r
940 /**\r
941   * @brief  Touch state processing\r
942   * Same as Detect state\r
943   * @param  None\r
944   * @retval None\r
945   */\r
946 void TSL_tkey_TouchStateProcess(void)\r
947 {\r
948 #if TSLPRM_DTO > 0\r
949   TSL_tTick_sec_T tick_detected;\r
950 #endif\r
951 \r
952   if (THIS_ACQ_STATUS & TSL_ACQ_STATUS_ERROR_MASK) // Acquisition error (min or max)\r
953   {\r
954     THIS_COUNTER = THIS_COUNTER_DEB_ERROR;\r
955     if (THIS_COUNTER == 0)\r
956     {\r
957       THIS_STATEID = TSL_STATEID_ERROR;\r
958     }\r
959     else\r
960     {\r
961       THIS_STATEID = TSL_STATEID_DEB_ERROR_TOUCH;\r
962     }\r
963   }\r
964   else // Acquisition is OK or has NOISE\r
965   {\r
966     if TEST_DELTA(>, THIS_DETECTOUT_TH)\r
967     {\r
968       TEST_DELTA_NEGATIVE;\r
969 #if TSLPRM_DTO > 0\r
970       //------------------------------------\r
971       // Detection Time Out (DTO) processing\r
972       //------------------------------------\r
973       if ((TSL_Params.DTO > 1) && (TSL_Params.DTO < 64))\r
974       {\r
975         tick_detected = THIS_COUNTER; // Get the detected time previously saved\r
976         // Enter in calibration state if the DTO duration has elapsed\r
977         if (TSL_tim_CheckDelay_sec(TSL_Params.DTO, &tick_detected) == TSL_STATUS_OK)\r
978         {\r
979           TSL_tkey_SetStateCalibration(0);\r
980         }\r
981       }\r
982 #endif\r
983       return; // Normal operation, stay in Touch state\r
984     }\r
985 \r
986 #if TSLPRM_USE_PROX > 0\r
987     if (THIS_DELTA > THIS_PROXOUT_TH)\r
988     {\r
989       THIS_COUNTER = THIS_COUNTER_DEB_PROX;\r
990       if (THIS_COUNTER == 0)\r
991       {\r
992         THIS_STATEID = TSL_STATEID_PROX;\r
993         DTO_GET_TIME; // Take current time for DTO processing\r
994       }\r
995       else\r
996       {\r
997         THIS_STATEID = TSL_STATEID_DEB_PROX_TOUCH;\r
998       }\r
999       return;\r
1000     }\r
1001 #endif\r
1002 \r
1003     THIS_COUNTER = THIS_COUNTER_DEB_RELEASE;\r
1004     if (THIS_COUNTER == 0)\r
1005     {\r
1006       THIS_STATEID = TSL_STATEID_RELEASE;\r
1007     }\r
1008     else\r
1009     {\r
1010       THIS_STATEID = TSL_STATEID_DEB_RELEASE_TOUCH;\r
1011     }\r
1012 \r
1013   }\r
1014 }\r
1015 \r
1016 \r
1017 /**\r
1018   * @brief  Debounce error state processing\r
1019   * @param  None\r
1020   * @retval None\r
1021   */\r
1022 void TSL_tkey_DebErrorStateProcess(void)\r
1023 {\r
1024   volatile TSL_StateMask_enum_T mask;\r
1025 \r
1026   if (THIS_ACQ_STATUS & TSL_ACQ_STATUS_ERROR_MASK) // Acquisition error (min or max)\r
1027   {\r
1028     if (THIS_COUNTER > 0) {THIS_COUNTER--;}\r
1029     if (THIS_COUNTER == 0)\r
1030     {\r
1031       THIS_STATEID = TSL_STATEID_ERROR;\r
1032     }\r
1033   }\r
1034   else // Acquisition is OK or has NOISE\r
1035   {\r
1036     // Get state mask\r
1037     mask = TSL_tkey_GetStateMask();\r
1038     // Mask Error and Debounce bits\r
1039 #ifdef _RAISONANCE_\r
1040     mask &= ~(TSL_STATE_DEBOUNCE_BIT_MASK | TSL_STATE_ERROR_BIT_MASK);\r
1041 #else\r
1042     mask &= (TSL_StateMask_enum_T)(~(TSL_STATE_DEBOUNCE_BIT_MASK | TSL_STATE_ERROR_BIT_MASK));\r
1043 #endif\r
1044     // Go back to the previous state\r
1045     switch (mask)\r
1046     {\r
1047       case TSL_STATEMASK_RELEASE :\r
1048         THIS_STATEID = TSL_STATEID_RELEASE;\r
1049         break;\r
1050       case TSL_STATEMASK_PROX :\r
1051         THIS_STATEID = TSL_STATEID_PROX;\r
1052         break;\r
1053       case TSL_STATEMASK_DETECT :\r
1054         THIS_STATEID = TSL_STATEID_DETECT;\r
1055         break;\r
1056       case TSL_STATEMASK_TOUCH :\r
1057         THIS_STATEID = TSL_STATEID_TOUCH;\r
1058         break;\r
1059       default:\r
1060         TSL_tkey_SetStateCalibration(0);\r
1061         break;\r
1062     }\r
1063   }\r
1064 }\r
1065 \r
1066 \r
1067 //==============================================================================\r
1068 // Private functions\r
1069 //==============================================================================\r
1070 \r
1071 /**\r
1072   * @brief  Get the current time in second and affect it to the DTO counter (Private)\r
1073   * @param  None\r
1074   * @retval None\r
1075   */\r
1076 void TSL_tkey_DTOGetTime(void)\r
1077 {\r
1078   disableInterrupts();\r
1079   THIS_COUNTER = (TSL_tCounter_T)TSL_Globals.Tick_sec;\r
1080   enableInterrupts();\r
1081 }\r
1082 \r
1083 #endif\r
1084 // #if TSLPRM_TOTAL_TKEYS > 0\r
1085 \r
1086 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/\r