1 /*!
2  * @file        tsc_dxs.c
3  *
4  * @brief       This file contains all functions to manage the
5  *              Detection Exclusion System (Dxs) algorithm
6 
7  * @version     V1.0.1
8  *
9  * @date        2022-09-20
10  *
11  * @attention
12  *
13  *  Copyright (C) 2020-2022 Geehy Semiconductor
14  *
15  *  You may not use this file except in compliance with the
16  *  GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE).
17  *
18  *  The program is only for reference, which is distributed in the hope
19  *  that it will be useful and instructional for customers to develop
20  *  their software. Unless required by applicable law or agreed to in
21  *  writing, the program is distributed on an "AS IS" BASIS, WITHOUT
22  *  ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied.
23  *  See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions
24  *  and limitations under the License.
25  */
26 
27 /* Includes */
28 #include "tsc.h"
29 #include "tsc_dxs.h"
30 
31 /** @addtogroup TSC_Driver_Library TSC Driver Library
32   @{
33 */
34 
35 /** @addtogroup TSC_DXS_Driver TSC DXS Driver
36   @{
37 */
38 
39 /** @defgroup TSC_DXS_Macros Macros
40   @{
41 */
42 
43 /**@} end of group TSC_DXS_Macros */
44 
45 /** @defgroup TSC_DXS_Enumerations Enumerations
46   @{
47 */
48 
49 /**@} end of group TSC_DXS_Enumerations */
50 
51 /** @defgroup TSC_DXS_Structures Structures
52   @{
53 */
54 
55 /**@} end of group TSC_DXS_Structures */
56 
57 /** @defgroup TSC_DXS_Variables Variables
58   @{
59 */
60 
61 /**@} end of group TSC_DXS_Variables */
62 
63 /** @defgroup TSC_DXS_Functions Functions
64   @{
65 */
66 
67 /*!
68  * @brief       Detection Exclusion System on the first object in detect state
69  *
70  * @param       objgrp: Pointer to the objects group to process
71  *
72  * @retval      None
73  */
TSC_Dxs_FirstObj(CONST TSC_ObjectGroup_T * objgrp)74 void TSC_Dxs_FirstObj(CONST TSC_ObjectGroup_T* objgrp)
75 {
76 #if TOUCH_USE_DXS > 0
77 
78     TSC_tIndex_T       idxObj;
79     TSC_tIndex_T       objLock = 0;
80     CONST TSC_Object_T* pObj;
81     CONST TSC_Object_T* pObjadd = 0;
82 
83     /* Exit if no object are in DETECT state */
84     if ((objgrp->StateMask & TSC_STATE_DETECT_BIT_MASK) == 0)
85     {
86         return;
87     }
88 
89     pObj = objgrp->p_Obj;
90 
91     /* Process all objects */
92     for (idxObj = 0; idxObj < objgrp->NbObjects; idxObj++)
93     {
94         TSC_Obj_ConfigGlobalObj(pObj);
95 
96         switch (FOR_OBJ_TYPE)
97         {
98 #if TOUCH_TOTAL_KEYS > 0
99             case TSC_OBJ_TOUCHKEY:
100             case TSC_OBJ_TOUCHKEYB:
101                 if (FOR_KEY_STATEID == TSC_STATEID_DETECT)
102                 {
103                     if (FOR_KEY_DXSLOCK == TSC_FALSE)
104                     {
105                         FOR_KEY_STATEID = TSC_STATEID_TOUCH;
106                         FOR_KEY_CHANGE = TSC_STATE_CHANGED;
107                         if ((!pObjadd) && (!objLock))
108                         {
109                             pObjadd = pObj;
110                         }
111                     }
112                     else
113                     {
114                         if (objLock)
115                         {
116                             FOR_KEY_STATEID = TSC_STATEID_TOUCH;
117                             FOR_KEY_CHANGE = TSC_STATE_CHANGED;
118                         }
119                         else
120                         {
121                             objLock = 1;
122                             pObjadd = 0;
123                         }
124                     }
125                 }
126                 break;
127 #endif
128 
129 #if TOUCH_TOTAL_LNRTS > 0
130             case TSC_OBJ_LINEAR:
131             case TSC_OBJ_LINEARB:
132             case TSC_OBJ_ROTARY:
133             case TSC_OBJ_ROTARYB:
134                 if (FOR_LINROT_STATEID == TSC_STATEID_DETECT)
135                 {
136                     if (FOR_LINROT_DXSLOCK == TSC_FALSE)
137                     {
138                         FOR_LINROT_STATEID = TSC_STATEID_TOUCH;
139                         FOR_LINROT_CHANGE = TSC_STATE_CHANGED;
140                         if ((!pObjadd) && (!objLock))
141                         {
142                             pObjadd = pObj;
143                         }
144                     }
145                     else
146                     {
147                         if (objLock)
148                         {
149                             FOR_LINROT_STATEID = TSC_STATEID_TOUCH;
150                             FOR_LINROT_CHANGE = TSC_STATE_CHANGED;
151                         }
152                         else
153                         {
154                             objLock = 1;
155                             pObjadd = 0;
156                         }
157                     }
158                 }
159                 break;
160 #endif
161             default:
162                 break;
163         }
164         pObj++;
165     }
166 
167     /* Change state from TOUCH to DETECT + DxsLock flag on the candidate object only */
168     if (pObjadd)
169     {
170         TSC_Obj_ConfigGlobalObj(pObjadd);
171 
172         switch (FOR_OBJ_TYPE)
173         {
174 #if TOUCH_TOTAL_KEYS > 0
175             case TSC_OBJ_TOUCHKEY:
176             case TSC_OBJ_TOUCHKEYB:
177                 FOR_KEY_STATEID = TSC_STATEID_DETECT;
178                 FOR_KEY_CHANGE = TSC_STATE_CHANGED;
179                 FOR_KEY_DXSLOCK = TSC_TRUE;
180                 break;
181 #endif
182 
183 #if TOUCH_TOTAL_LNRTS > 0
184             case TSC_OBJ_LINEAR:
185             case TSC_OBJ_LINEARB:
186             case TSC_OBJ_ROTARY:
187             case TSC_OBJ_ROTARYB:
188                 FOR_LINROT_STATEID = TSC_STATEID_DETECT;
189                 FOR_LINROT_CHANGE = TSC_STATE_CHANGED;
190                 FOR_LINROT_DXSLOCK = TSC_TRUE;
191                 break;
192 #endif
193             default:
194                 break;
195         }
196     }
197 #endif /*!< TOUCH_USE_DXS > 0 */
198 }
199 
200 /**@} end of group TSC_DXS_Functions */
201 /**@} end of group TSC_DXS_Driver */
202 /**@} end of group TSC_Driver_Library */
203