2 ******************************************************************************
\r
3 * @file tsl_touchkey.c
\r
4 * @author MCD Application Team
\r
6 * @date 22-January-2013
\r
7 * @brief This file contains all functions to manage TouchKey sensors.
\r
8 ******************************************************************************
\r
11 * <h2><center>© COPYRIGHT 2013 STMicroelectronics</center></h2>
\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
17 * http://www.st.com/software_license_agreement_liberty_v2
\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
25 ******************************************************************************
\r
28 /* Includes ------------------------------------------------------------------*/
\r
29 #include "tsl_touchkey.h"
\r
30 #include "tsl_globals.h"
\r
32 #if TSLPRM_TOTAL_TKEYS > 0
\r
34 /* Private typedefs ----------------------------------------------------------*/
\r
35 /* Private defines -----------------------------------------------------------*/
\r
37 /* Private macros ------------------------------------------------------------*/
\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
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
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
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
66 #define DTO_GET_TIME {TSL_tkey_DTOGetTime();}
\r
68 #define DTO_GET_TIME
\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
75 #define TEST_DELTA(OPER,TH) (THIS_DELTA OPER TH)
\r
76 #define TEST_DELTA_NEGATIVE
\r
79 /* Private variables ---------------------------------------------------------*/
\r
81 static TSL_tNb_T CalibDiv;
\r
83 /* Private functions prototype -----------------------------------------------*/
\r
85 void TSL_tkey_DTOGetTime(void);
\r
88 //==============================================================================
\r
89 // "Object methods" functions
\r
90 //==============================================================================
\r
93 * @brief Init parameters with default values from configuration file
\r
97 void TSL_tkey_Init(void)
\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
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
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
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
118 TSL_tkey_SetStateCalibration(TSLPRM_CALIB_DELAY);
\r
123 * @brief Process the State Machine
\r
127 void TSL_tkey_Process(void)
\r
129 TSL_StateId_enum_T prev_state_id;
\r
131 if ((THIS_DATA_READY != 0) || (THIS_STATEID == TSL_STATEID_OFF))
\r
134 THIS_DATA_READY = TSL_DATA_NOT_READY; // The new data is processed
\r
136 prev_state_id = THIS_STATEID;
\r
138 #if TSLPRM_TOTAL_TOUCHKEYS > 0
\r
139 if (TSL_Globals.This_Obj->Type == TSL_OBJ_TOUCHKEY)
\r
141 // Launch the TKey state function
\r
142 TSL_Globals.This_TKey->p_SM[THIS_STATEID].StateFunc();
\r
146 #if TSLPRM_TOTAL_TOUCHKEYS_B > 0
\r
147 if (TSL_Globals.This_Obj->Type == TSL_OBJ_TOUCHKEYB)
\r
149 // Launch the TSL_Params state function
\r
150 TSL_Params.p_TKeySM[THIS_STATEID].StateFunc();
\r
154 // Check if the new state has changed
\r
155 if (THIS_STATEID == prev_state_id)
\r
157 THIS_CHANGE = TSL_STATE_NOT_CHANGED;
\r
161 THIS_CHANGE = TSL_STATE_CHANGED;
\r
164 #if TSLPRM_USE_DXS > 0
\r
165 if (THIS_STATEID != TSL_STATEID_DETECT)
\r
167 THIS_DXSLOCK = TSL_FALSE;
\r
169 if (THIS_STATEID == TSL_STATEID_TOUCH)
\r
171 THIS_STATEID = TSL_STATEID_DETECT;
\r
179 //==============================================================================
\r
180 // Utility functions
\r
181 //==============================================================================
\r
184 * @brief Go in Calibration state
\r
185 * @param[in] delay Delay before calibration starts (stabilization of noise filter)
\r
188 void TSL_tkey_SetStateCalibration(TSL_tCounter_T delay)
\r
190 THIS_STATEID = TSL_STATEID_CALIB;
\r
191 THIS_CHANGE = TSL_STATE_CHANGED;
\r
192 THIS_OBJ_STATUS = TSL_OBJ_STATUS_ON;
\r
194 switch (TSL_Params.NbCalibSamples)
\r
203 TSL_Params.NbCalibSamples = 8;
\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
216 * @brief Go in Off state with sensor "off"
\r
220 void TSL_tkey_SetStateOff(void)
\r
222 THIS_STATEID = TSL_STATEID_OFF;
\r
223 THIS_CHANGE = TSL_STATE_CHANGED;
\r
224 THIS_OBJ_STATUS = TSL_OBJ_STATUS_OFF;
\r
228 #if !defined(TSLPRM_STM8TL5X) && !defined(STM8TL5X)
\r
230 * @brief Go in Off state with sensor in "Burst mode only"
\r
234 void TSL_tkey_SetStateBurstOnly(void)
\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
244 * @brief Return the current state identifier
\r
248 TSL_StateId_enum_T TSL_tkey_GetStateId(void)
\r
250 return(THIS_STATEID);
\r
255 * @brief Return the current state mask
\r
257 * @retval State mask
\r
259 TSL_StateMask_enum_T TSL_tkey_GetStateMask(void)
\r
261 TSL_StateMask_enum_T state_mask = TSL_STATEMASK_UNKNOWN;
\r
263 #if TSLPRM_TOTAL_TOUCHKEYS > 0
\r
264 if (TSL_Globals.This_Obj->Type == TSL_OBJ_TOUCHKEY)
\r
266 state_mask = TSL_Globals.This_TKey->p_SM[THIS_STATEID].StateMask;
\r
270 #if TSLPRM_TOTAL_TOUCHKEYS_B > 0
\r
271 if (TSL_Globals.This_Obj->Type == TSL_OBJ_TOUCHKEYB)
\r
273 state_mask = TSL_Params.p_TKeySM[THIS_STATEID].StateMask;
\r
282 * @brief Return the Change flag
\r
284 * @retval Change flag status
\r
286 TSL_tNb_T TSL_tkey_IsChanged(void)
\r
288 return(THIS_CHANGE);
\r
292 //==============================================================================
\r
293 // State machine functions
\r
294 //==============================================================================
\r
296 #if TSLPRM_USE_PROX > 0
\r
298 * @brief Debounce Release processing (previous state = Proximity)
\r
302 void TSL_tkey_DebReleaseProxStateProcess(void)
\r
304 if (THIS_ACQ_STATUS & TSL_ACQ_STATUS_ERROR_MASK) // Acquisition error (min or max)
\r
306 THIS_STATEID = TSL_STATEID_PROX; // Go back to the previous state
\r
308 else // Acquisition is OK or has NOISE
\r
310 if (THIS_DELTA > THIS_PROXOUT_TH)
\r
312 THIS_STATEID = TSL_STATEID_PROX; // Go back to the previous state
\r
316 if (THIS_COUNTER > 0) {THIS_COUNTER--;}
\r
317 if (THIS_COUNTER == 0)
\r
319 THIS_STATEID = TSL_STATEID_RELEASE;
\r
321 // else stay in Debounce Release
\r
325 #endif // if TSLPRM_USE_PROX > 0
\r
329 * @brief Debounce Release processing (previous state = Detect)
\r
333 void TSL_tkey_DebReleaseDetectStateProcess(void)
\r
335 if (THIS_ACQ_STATUS & TSL_ACQ_STATUS_ERROR_MASK) // Acquisition error (min or max)
\r
337 THIS_STATEID = TSL_STATEID_DETECT; // Go back to the previous state
\r
339 else // Acquisition is OK or has NOISE
\r
341 if TEST_DELTA(>, THIS_DETECTOUT_TH)
\r
343 TEST_DELTA_NEGATIVE;
\r
344 THIS_STATEID = TSL_STATEID_DETECT;
\r
348 #if TSLPRM_USE_PROX > 0
\r
349 if (THIS_DELTA > THIS_PROXOUT_TH)
\r
351 THIS_STATEID = TSL_STATEID_PROX;
\r
355 if (THIS_COUNTER > 0) {THIS_COUNTER--;}
\r
356 if (THIS_COUNTER == 0)
\r
358 THIS_STATEID = TSL_STATEID_RELEASE;
\r
360 // else stay in Debounce Release
\r
367 * @brief Debounce Release processing (previous state = Touch)
\r
368 * Same as Debounce Release Detect processing
\r
372 void TSL_tkey_DebReleaseTouchStateProcess(void)
\r
374 if (THIS_ACQ_STATUS & TSL_ACQ_STATUS_ERROR_MASK) // Acquisition error (min or max)
\r
376 THIS_STATEID = TSL_STATEID_TOUCH; // Go back to the previous state
\r
378 else // Acquisition is OK or has NOISE
\r
380 if TEST_DELTA(>, THIS_DETECTOUT_TH)
\r
382 TEST_DELTA_NEGATIVE;
\r
383 THIS_STATEID = TSL_STATEID_TOUCH;
\r
387 #if TSLPRM_USE_PROX > 0
\r
388 if (THIS_DELTA > THIS_PROXOUT_TH)
\r
390 THIS_STATEID = TSL_STATEID_PROX;
\r
394 if (THIS_COUNTER > 0) {THIS_COUNTER--;}
\r
395 if (THIS_COUNTER == 0)
\r
397 THIS_STATEID = TSL_STATEID_RELEASE;
\r
399 // else stay in Debounce Release
\r
406 * @brief Release state processing
\r
410 void TSL_tkey_ReleaseStateProcess(void)
\r
412 if (THIS_ACQ_STATUS & TSL_ACQ_STATUS_ERROR_MASK) // Acquisition error (min or max)
\r
414 THIS_COUNTER = THIS_COUNTER_DEB_ERROR;
\r
415 if (THIS_COUNTER == 0)
\r
417 THIS_STATEID = TSL_STATEID_ERROR;
\r
421 THIS_STATEID = TSL_STATEID_DEB_ERROR_RELEASE;
\r
424 else // Acquisition is OK or has NOISE
\r
426 if TEST_DELTA(>=, THIS_DETECTIN_TH)
\r
428 TEST_DELTA_NEGATIVE;
\r
429 THIS_COUNTER = THIS_COUNTER_DEB_DETECT;
\r
430 if (THIS_COUNTER == 0)
\r
432 THIS_STATEID = TSL_STATEID_DETECT;
\r
433 DTO_GET_TIME; // Take current time for DTO processing
\r
437 THIS_STATEID = TSL_STATEID_DEB_DETECT;
\r
442 #if TSLPRM_USE_PROX > 0
\r
443 if (THIS_DELTA >= THIS_PROXIN_TH)
\r
445 THIS_COUNTER = THIS_COUNTER_DEB_PROX;
\r
446 if (THIS_COUNTER == 0)
\r
448 THIS_STATEID = TSL_STATEID_PROX;
\r
449 DTO_GET_TIME; // Take current time for DTO processing
\r
453 THIS_STATEID = TSL_STATEID_DEB_PROX;
\r
459 // Check delta for re-calibration
\r
460 // Warning: the threshold value is inverted
\r
461 if (THIS_DELTA <= -THIS_CALIB_TH)
\r
463 THIS_COUNTER = THIS_COUNTER_DEB_CALIB;
\r
464 if (THIS_COUNTER == 0)
\r
466 TSL_tkey_SetStateCalibration(0);
\r
470 THIS_STATEID = TSL_STATEID_DEB_CALIB;
\r
478 * @brief Debounce Calibration processing (previous state = Release)
\r
482 void TSL_tkey_DebCalibrationStateProcess(void)
\r
484 if (THIS_ACQ_STATUS & TSL_ACQ_STATUS_ERROR_MASK) // Acquisition error (min or max)
\r
486 THIS_STATEID = TSL_STATEID_RELEASE; // Go back to the previous state
\r
488 else // Acquisition is OK or has NOISE
\r
490 // Still below recalibration threshold
\r
491 // Warning: the threshold value is inverted
\r
492 if (THIS_DELTA <= -THIS_CALIB_TH)
\r
494 if (THIS_COUNTER > 0) {THIS_COUNTER--;}
\r
495 if (THIS_COUNTER == 0)
\r
497 TSL_tkey_SetStateCalibration(0);
\r
499 // else stay in Debounce Calibration
\r
501 else // Go back to previous state
\r
503 THIS_STATEID = TSL_STATEID_RELEASE;
\r
510 * @brief Calibration state processing
\r
514 void TSL_tkey_CalibrationStateProcess(void)
\r
516 TSL_tMeas_T new_meas;
\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
523 return; // Skip the sample
\r
527 if (THIS_ACQ_STATUS & TSL_ACQ_STATUS_ERROR_MASK) // Acquisition error (min or max)
\r
529 THIS_COUNTER = THIS_COUNTER_DEB_ERROR;
\r
530 if (THIS_COUNTER == 0)
\r
532 THIS_STATEID = TSL_STATEID_ERROR;
\r
536 THIS_STATEID = TSL_STATEID_DEB_ERROR_CALIB;
\r
539 else // Acquisition is OK or has NOISE
\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
549 // Verify the first Reference value
\r
550 if (THIS_COUNTER == (TSL_tCounter_T)TSL_Params.NbCalibSamples)
\r
552 if (TSL_acq_TestFirstReferenceIsValid(THIS_CHANNEL_DATA, new_meas))
\r
554 THIS_REF = new_meas;
\r
564 // Add the measure in temporary Reference
\r
565 THIS_REF += new_meas;
\r
567 // Check reference overflow
\r
568 if (THIS_REF < new_meas)
\r
570 THIS_REF = 0; // Suppress the bad reference
\r
571 THIS_STATEID = TSL_STATEID_ERROR;
\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
580 // Divide temporary Reference by the number of samples
\r
581 THIS_REF >>= CalibDiv;
\r
584 THIS_STATEID = TSL_STATEID_RELEASE;
\r
590 #if TSLPRM_USE_PROX > 0
\r
592 * @brief Debounce Proximity processing (previous state = Release)
\r
596 void TSL_tkey_DebProxStateProcess(void)
\r
598 if (THIS_ACQ_STATUS & TSL_ACQ_STATUS_ERROR_MASK) // Acquisition error (min or max)
\r
600 THIS_STATEID = TSL_STATEID_RELEASE;
\r
602 else // Acquisition is OK or has NOISE
\r
604 if TEST_DELTA(>=, THIS_DETECTIN_TH)
\r
606 TEST_DELTA_NEGATIVE;
\r
607 THIS_COUNTER = THIS_COUNTER_DEB_DETECT;
\r
608 if (THIS_COUNTER == 0)
\r
610 THIS_STATEID = TSL_STATEID_DETECT;
\r
611 DTO_GET_TIME; // Take current time for DTO processing
\r
615 THIS_STATEID = TSL_STATEID_DEB_DETECT;
\r
620 if (THIS_DELTA >= THIS_PROXIN_TH)
\r
622 if (THIS_COUNTER > 0) {THIS_COUNTER--;}
\r
623 if (THIS_COUNTER == 0)
\r
625 THIS_STATEID = TSL_STATEID_PROX;
\r
626 DTO_GET_TIME; // Take current time for DTO processing
\r
628 // else stay in Debounce Proximity
\r
632 THIS_STATEID = TSL_STATEID_RELEASE;
\r
639 #if TSLPRM_USE_PROX > 0
\r
641 * @brief Debounce Proximity processing (previous state = Detect)
\r
645 void TSL_tkey_DebProxDetectStateProcess(void)
\r
647 if (THIS_ACQ_STATUS & TSL_ACQ_STATUS_ERROR_MASK) // Acquisition error (min or max)
\r
649 THIS_STATEID = TSL_STATEID_DETECT;
\r
651 else // Acquisition is OK or has NOISE
\r
653 if TEST_DELTA(>, THIS_DETECTOUT_TH)
\r
655 TEST_DELTA_NEGATIVE;
\r
656 THIS_STATEID = TSL_STATEID_DETECT;
\r
660 if (THIS_DELTA > THIS_PROXOUT_TH)
\r
662 if (THIS_COUNTER > 0) {THIS_COUNTER--;}
\r
663 if (THIS_COUNTER == 0)
\r
665 THIS_STATEID = TSL_STATEID_PROX;
\r
666 DTO_GET_TIME; // Take current time for DTO processing
\r
668 // else stay in Debounce Proximity
\r
672 THIS_COUNTER = THIS_COUNTER_DEB_RELEASE;
\r
673 if (THIS_COUNTER == 0)
\r
675 THIS_STATEID = TSL_STATEID_RELEASE;
\r
679 THIS_STATEID = TSL_STATEID_DEB_RELEASE_DETECT;
\r
687 #if TSLPRM_USE_PROX > 0
\r
689 * @brief Debounce Proximity processing (previous state = Touch)
\r
693 void TSL_tkey_DebProxTouchStateProcess(void)
\r
695 if (THIS_ACQ_STATUS & TSL_ACQ_STATUS_ERROR_MASK) // Acquisition error (min or max)
\r
697 THIS_STATEID = TSL_STATEID_TOUCH;
\r
699 else // Acquisition is OK or has NOISE
\r
701 if TEST_DELTA(>, THIS_DETECTOUT_TH)
\r
703 TEST_DELTA_NEGATIVE;
\r
704 THIS_STATEID = TSL_STATEID_TOUCH;
\r
708 if (THIS_DELTA > THIS_PROXOUT_TH)
\r
710 if (THIS_COUNTER > 0) {THIS_COUNTER--;}
\r
711 if (THIS_COUNTER == 0)
\r
713 THIS_STATEID = TSL_STATEID_PROX;
\r
714 DTO_GET_TIME; // Take current time for DTO processing
\r
716 // else stay in Debounce Proximity
\r
720 THIS_COUNTER = THIS_COUNTER_DEB_RELEASE;
\r
721 if (THIS_COUNTER == 0)
\r
723 THIS_STATEID = TSL_STATEID_RELEASE;
\r
727 THIS_STATEID = TSL_STATEID_DEB_RELEASE_TOUCH;
\r
735 #if TSLPRM_USE_PROX > 0
\r
737 * @brief Proximity state processing
\r
741 void TSL_tkey_ProxStateProcess(void)
\r
744 TSL_tTick_sec_T tick_detected;
\r
747 if (THIS_ACQ_STATUS & TSL_ACQ_STATUS_ERROR_MASK) // Acquisition error (min or max)
\r
749 THIS_COUNTER = THIS_COUNTER_DEB_ERROR;
\r
750 if (THIS_COUNTER == 0)
\r
752 THIS_STATEID = TSL_STATEID_ERROR;
\r
756 THIS_STATEID = TSL_STATEID_DEB_ERROR_PROX;
\r
759 else // Acquisition is OK or has NOISE
\r
761 if TEST_DELTA(>=, THIS_DETECTIN_TH)
\r
763 TEST_DELTA_NEGATIVE;
\r
764 THIS_COUNTER = THIS_COUNTER_DEB_DETECT;
\r
765 if (THIS_COUNTER == 0)
\r
767 THIS_STATEID = TSL_STATEID_DETECT;
\r
768 DTO_GET_TIME; // Take current time for DTO processing
\r
772 THIS_STATEID = TSL_STATEID_DEB_DETECT;
\r
777 if (THIS_DELTA <= THIS_PROXOUT_TH)
\r
779 THIS_COUNTER = THIS_COUNTER_DEB_RELEASE;
\r
780 if (THIS_COUNTER == 0)
\r
782 THIS_STATEID = TSL_STATEID_RELEASE;
\r
786 THIS_STATEID = TSL_STATEID_DEB_RELEASE_PROX;
\r
791 // Stay in Proximity state
\r
793 //------------------------------------
\r
794 // Detection Time Out (DTO) processing
\r
795 //------------------------------------
\r
796 if ((TSL_Params.DTO > 1) && (TSL_Params.DTO < 64))
\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
802 TSL_tkey_SetStateCalibration(0);
\r
813 * @brief Debounce Detect processing (previous state = Release or Proximity)
\r
817 void TSL_tkey_DebDetectStateProcess(void)
\r
819 if (THIS_ACQ_STATUS & TSL_ACQ_STATUS_ERROR_MASK) // Acquisition error (min or max)
\r
821 THIS_STATEID = TSL_STATEID_RELEASE;
\r
823 else // Acquisition is OK or has NOISE
\r
825 if TEST_DELTA(>=, THIS_DETECTIN_TH)
\r
827 TEST_DELTA_NEGATIVE;
\r
828 if (THIS_COUNTER > 0) {THIS_COUNTER--;}
\r
829 if (THIS_COUNTER == 0)
\r
831 THIS_STATEID = TSL_STATEID_DETECT;
\r
832 DTO_GET_TIME; // Take current time for DTO processing
\r
834 // else stay in Debounce Detect
\r
838 #if TSLPRM_USE_PROX > 0
\r
839 if (THIS_DELTA >= THIS_PROXIN_TH)
\r
841 THIS_COUNTER = THIS_COUNTER_DEB_PROX;
\r
842 if (THIS_COUNTER == 0)
\r
844 THIS_STATEID = TSL_STATEID_PROX;
\r
845 DTO_GET_TIME; // Take current time for DTO processing
\r
849 THIS_STATEID = TSL_STATEID_DEB_PROX;
\r
854 THIS_STATEID = TSL_STATEID_RELEASE;
\r
857 THIS_STATEID = TSL_STATEID_RELEASE;
\r
865 * @brief Detect state processing
\r
869 void TSL_tkey_DetectStateProcess(void)
\r
872 TSL_tTick_sec_T tick_detected;
\r
875 if (THIS_ACQ_STATUS & TSL_ACQ_STATUS_ERROR_MASK) // Acquisition error (min or max)
\r
877 THIS_COUNTER = THIS_COUNTER_DEB_ERROR;
\r
878 if (THIS_COUNTER == 0)
\r
880 THIS_STATEID = TSL_STATEID_ERROR;
\r
884 THIS_STATEID = TSL_STATEID_DEB_ERROR_DETECT;
\r
887 else // Acquisition is OK or has NOISE
\r
889 if TEST_DELTA(>, THIS_DETECTOUT_TH)
\r
891 TEST_DELTA_NEGATIVE;
\r
893 //------------------------------------
\r
894 // Detection Time Out (DTO) processing
\r
895 //------------------------------------
\r
896 if ((TSL_Params.DTO > 1) && (TSL_Params.DTO < 64))
\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
902 TSL_tkey_SetStateCalibration(0);
\r
906 return; // Normal operation, stay in Detect state
\r
909 #if TSLPRM_USE_PROX > 0
\r
910 if (THIS_DELTA > THIS_PROXOUT_TH)
\r
912 THIS_COUNTER = THIS_COUNTER_DEB_PROX;
\r
913 if (THIS_COUNTER == 0)
\r
915 THIS_STATEID = TSL_STATEID_PROX;
\r
916 DTO_GET_TIME; // Take current time for DTO processing
\r
920 THIS_STATEID = TSL_STATEID_DEB_PROX_DETECT;
\r
926 THIS_COUNTER = THIS_COUNTER_DEB_RELEASE;
\r
927 if (THIS_COUNTER == 0)
\r
929 THIS_STATEID = TSL_STATEID_RELEASE;
\r
933 THIS_STATEID = TSL_STATEID_DEB_RELEASE_DETECT;
\r
941 * @brief Touch state processing
\r
942 * Same as Detect state
\r
946 void TSL_tkey_TouchStateProcess(void)
\r
949 TSL_tTick_sec_T tick_detected;
\r
952 if (THIS_ACQ_STATUS & TSL_ACQ_STATUS_ERROR_MASK) // Acquisition error (min or max)
\r
954 THIS_COUNTER = THIS_COUNTER_DEB_ERROR;
\r
955 if (THIS_COUNTER == 0)
\r
957 THIS_STATEID = TSL_STATEID_ERROR;
\r
961 THIS_STATEID = TSL_STATEID_DEB_ERROR_TOUCH;
\r
964 else // Acquisition is OK or has NOISE
\r
966 if TEST_DELTA(>, THIS_DETECTOUT_TH)
\r
968 TEST_DELTA_NEGATIVE;
\r
970 //------------------------------------
\r
971 // Detection Time Out (DTO) processing
\r
972 //------------------------------------
\r
973 if ((TSL_Params.DTO > 1) && (TSL_Params.DTO < 64))
\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
979 TSL_tkey_SetStateCalibration(0);
\r
983 return; // Normal operation, stay in Touch state
\r
986 #if TSLPRM_USE_PROX > 0
\r
987 if (THIS_DELTA > THIS_PROXOUT_TH)
\r
989 THIS_COUNTER = THIS_COUNTER_DEB_PROX;
\r
990 if (THIS_COUNTER == 0)
\r
992 THIS_STATEID = TSL_STATEID_PROX;
\r
993 DTO_GET_TIME; // Take current time for DTO processing
\r
997 THIS_STATEID = TSL_STATEID_DEB_PROX_TOUCH;
\r
1003 THIS_COUNTER = THIS_COUNTER_DEB_RELEASE;
\r
1004 if (THIS_COUNTER == 0)
\r
1006 THIS_STATEID = TSL_STATEID_RELEASE;
\r
1010 THIS_STATEID = TSL_STATEID_DEB_RELEASE_TOUCH;
\r
1018 * @brief Debounce error state processing
\r
1022 void TSL_tkey_DebErrorStateProcess(void)
\r
1024 volatile TSL_StateMask_enum_T mask;
\r
1026 if (THIS_ACQ_STATUS & TSL_ACQ_STATUS_ERROR_MASK) // Acquisition error (min or max)
\r
1028 if (THIS_COUNTER > 0) {THIS_COUNTER--;}
\r
1029 if (THIS_COUNTER == 0)
\r
1031 THIS_STATEID = TSL_STATEID_ERROR;
\r
1034 else // Acquisition is OK or has NOISE
\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
1042 mask &= (TSL_StateMask_enum_T)(~(TSL_STATE_DEBOUNCE_BIT_MASK | TSL_STATE_ERROR_BIT_MASK));
\r
1044 // Go back to the previous state
\r
1047 case TSL_STATEMASK_RELEASE :
\r
1048 THIS_STATEID = TSL_STATEID_RELEASE;
\r
1050 case TSL_STATEMASK_PROX :
\r
1051 THIS_STATEID = TSL_STATEID_PROX;
\r
1053 case TSL_STATEMASK_DETECT :
\r
1054 THIS_STATEID = TSL_STATEID_DETECT;
\r
1056 case TSL_STATEMASK_TOUCH :
\r
1057 THIS_STATEID = TSL_STATEID_TOUCH;
\r
1060 TSL_tkey_SetStateCalibration(0);
\r
1067 //==============================================================================
\r
1068 // Private functions
\r
1069 //==============================================================================
\r
1072 * @brief Get the current time in second and affect it to the DTO counter (Private)
\r
1076 void TSL_tkey_DTOGetTime(void)
\r
1078 disableInterrupts();
\r
1079 THIS_COUNTER = (TSL_tCounter_T)TSL_Globals.Tick_sec;
\r
1080 enableInterrupts();
\r
1084 // #if TSLPRM_TOTAL_TKEYS > 0
\r
1086 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
\r