1 /*!
2  * @file        tsc_object.c
3  *
4  * @brief       This file contains all functions to manage the sensors in general.
5  *
6  * @version     V1.0.1
7  *
8  * @date        2022-09-20
9  *
10  * @attention
11  *
12  *  Copyright (C) 2020-2022 Geehy Semiconductor
13  *
14  *  You may not use this file except in compliance with the
15  *  GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE).
16  *
17  *  The program is only for reference, which is distributed in the hope
18  *  that it will be useful and instructional for customers to develop
19  *  their software. Unless required by applicable law or agreed to in
20  *  writing, the program is distributed on an "AS IS" BASIS, WITHOUT
21  *  ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied.
22  *  See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions
23  *  and limitations under the License.
24  */
25 
26 /* Includes */
27 #include "tsc.h"
28 #include "tsc_object.h"
29 
30 /** @addtogroup TSC_Driver_Library TSC Driver Library
31   @{
32 */
33 
34 /** @addtogroup TSC_Object_Driver TSC Driver
35   @{
36 */
37 
38 /** @defgroup TSC_Object_Macros Macros
39   @{
40 */
41 
42 /**@} end of group TSC_Object_Macros */
43 
44 /** @defgroup TSC_Object_Enumerations Enumerations
45   @{
46 */
47 
48 /**@} end of group TSC_Object_Enumerations */
49 
50 /** @defgroup TSC_Object_Structures Structures
51   @{
52 */
53 
54 /**@} end of group TSC_Object_Structures */
55 
56 /** @defgroup TSC_Object_Variables Variables
57   @{
58 */
59 
60 /**@} end of group TSC_Object_Variables */
61 
62 /** @defgroup TSC_Object_Functions Functions
63   @{
64 */
65 
66 /*!
67  * @brief       Config a group of Objects
68  *
69  * @param       objgrp: Pointer to the group of objects
70  *
71  * @retval      None
72  */
TSC_Obj_ConfigGroup(TSC_ObjectGroup_T * objgrp)73 void TSC_Obj_ConfigGroup(TSC_ObjectGroup_T* objgrp)
74 {
75     TSC_tIndex_T idxObj;
76     CONST TSC_Object_T* pObj;
77     TSC_tNum_T stateMask = 0;
78 
79     pObj = objgrp->p_Obj;
80     objgrp->Change = TSC_STATE_NOT_CHANGED;
81 
82     /* Process all objects */
83     for (idxObj = 0; idxObj < objgrp->NbObjects; idxObj++)
84     {
85         TSC_Obj_ConfigGlobalObj(pObj);
86 
87         if (pObj->Type == TSC_OBJ_TOUCHKEY)
88         {
89 #if TOUCH_TOTAL_TOUCHKEYS > 0
90             TSC_Globals.For_Key->p_Methods->Config();
91 
92             if (TSC_Globals.For_Key->p_Data->Change)
93             {
94                 objgrp->Change = TSC_STATE_CHANGED;
95             }
96             stateMask |= TSC_Globals.For_Key->p_SM[TSC_Globals.For_Key->p_Data->StateId].StateMask;
97 #endif
98         }
99         else if (pObj->Type == TSC_OBJ_TOUCHKEYB)
100         {
101 #if TOUCH_TOTAL_TOUCHKEYS_B > 0
102             TSC_Params.p_KeyMet->Config();
103 
104             if (TSC_Globals.For_Key->p_Data->Change)
105             {
106                 objgrp->Change = TSC_STATE_CHANGED;
107             }
108 
109             stateMask |= TSC_Params.p_KeySta[TSC_Globals.For_Key->p_Data->StateId].StateMask;
110 #endif
111         }
112         else if ((pObj->Type == TSC_OBJ_LINEAR) || (pObj->Type == TSC_OBJ_ROTARY))
113         {
114 #if TOUCH_TOTAL_LINROTS > 0
115             TSC_Globals.For_LinRot->p_Methods->Config();
116 
117             if (TSC_Globals.For_LinRot->p_Data->Change)
118             {
119                 objgrp->Change = TSC_STATE_CHANGED;
120             }
121 
122             stateMask |= TSC_Globals.For_LinRot->p_SM[TSC_Globals.For_LinRot->p_Data->StateId].StateMask;
123 #endif
124         }
125         else if ((pObj->Type == TSC_OBJ_LINEARB) || (pObj->Type == TSC_OBJ_ROTARYB))
126         {
127 #if TOUCH_TOTAL_LINROTS_B > 0
128             TSC_Params.p_LinRotMet->Config();
129 
130             if (TSC_Globals.For_LinRot->p_Data->Change)
131             {
132                 objgrp->Change = TSC_STATE_CHANGED;
133             }
134             stateMask |= TSC_Params.p_LinRotSta[TSC_Globals.For_LinRot->p_Data->StateId].StateMask;
135 #endif
136         }
137         pObj++;
138     }
139     /* Update the object group state mask */
140     objgrp->StateMask = stateMask;
141 }
142 
143 /*!
144  * @brief       Process the state machine on a group of Objects
145  *
146  * @param       objgrp: Pointer to the group of objects to process
147  *
148  * @retval      None
149  */
TSC_Obj_ProcessGroup(TSC_ObjectGroup_T * objgrp)150 void TSC_Obj_ProcessGroup(TSC_ObjectGroup_T* objgrp)
151 {
152     TSC_tIndex_T idxObj;
153     CONST TSC_Object_T* pObj;
154     TSC_tNum_T stateMask = 0;
155 
156     pObj = objgrp->p_Obj;
157     objgrp->Change = TSC_STATE_NOT_CHANGED;
158 
159     /* Process all objects */
160     for (idxObj = 0; idxObj < objgrp->NbObjects; idxObj++)
161     {
162         TSC_Obj_ConfigGlobalObj(pObj);
163 
164         if (pObj->Type == TSC_OBJ_TOUCHKEY)
165         {
166 #if TOUCH_TOTAL_TOUCHKEYS > 0
167             TSC_Globals.For_Key->p_Methods->Process();
168 
169             if (TSC_Globals.For_Key->p_Data->Change)
170             {
171                 objgrp->Change = TSC_STATE_CHANGED;
172             }
173 
174             stateMask |= TSC_Globals.For_Key->p_SM[TSC_Globals.For_Key->p_Data->StateId].StateMask;
175 #endif
176         }
177         else if (pObj->Type == TSC_OBJ_TOUCHKEYB)
178         {
179 #if TOUCH_TOTAL_TOUCHKEYS_B > 0
180             TSC_Params.p_KeyMet->Process();
181 
182             if (TSC_Globals.For_Key->p_Data->Change)
183             {
184                 objgrp->Change = TSC_STATE_CHANGED;
185             }
186 
187             stateMask |= TSC_Params.p_KeySta[TSC_Globals.For_Key->p_Data->StateId].StateMask;
188 #endif
189         }
190         else if ((pObj->Type == TSC_OBJ_LINEAR) || (pObj->Type == TSC_OBJ_ROTARY))
191         {
192 #if TOUCH_TOTAL_LINROTS > 0
193             TSC_Globals.For_LinRot->p_Methods->Process();
194 
195             if (TSC_Globals.For_LinRot->p_Data->Change)
196             {
197                 objgrp->Change = TSC_STATE_CHANGED;
198             }
199 
200             stateMask |= TSC_Globals.For_LinRot->p_SM[TSC_Globals.For_LinRot->p_Data->StateId].StateMask;
201 #endif
202         }
203         else if ((pObj->Type == TSC_OBJ_LINEARB) || (pObj->Type == TSC_OBJ_ROTARYB))
204         {
205 #if TOUCH_TOTAL_LINROTS_B > 0
206             TSC_Params.p_LinRotMet->Process();
207 
208             if (TSC_Globals.For_LinRot->p_Data->Change)
209             {
210                 objgrp->Change = TSC_STATE_CHANGED;
211             }
212 
213             stateMask |= TSC_Params.p_LinRotSta[TSC_Globals.For_LinRot->p_Data->StateId].StateMask;
214 #endif
215         }
216         pObj++;
217     }
218     /* Update the object group state mask */
219     objgrp->StateMask = stateMask;
220 }
221 
222 /*!
223  * @brief       Set the global object variable
224  *
225  * @param       pObj: Pointer to the object to process
226  *
227  * @retval      None
228  */
TSC_Obj_ConfigGlobalObj(CONST TSC_Object_T * pObj)229 void TSC_Obj_ConfigGlobalObj(CONST TSC_Object_T* pObj)
230 {
231     TSC_Globals.For_Obj = pObj;
232 
233     if ((pObj->Type == TSC_OBJ_TOUCHKEY) || (pObj->Type == TSC_OBJ_TOUCHKEYB))
234     {
235 #if TOUCH_TOTAL_KEYS > 0
236         TSC_Globals.For_Key = (TSC_TouchKey_T*)pObj->MyObj;
237 #endif
238     }
239     else if ((pObj->Type == TSC_OBJ_LINEAR) || (pObj->Type == TSC_OBJ_LINEARB) ||
240              (pObj->Type == TSC_OBJ_ROTARY) || (pObj->Type == TSC_OBJ_ROTARYB))
241     {
242 #if TOUCH_TOTAL_LNRTS > 0
243         TSC_Globals.For_LinRot = (TSC_LinRot_T*)pObj->MyObj;
244 #endif
245     }
246 }
247 
248 /**@} end of group TSC_Object_Functions */
249 /**@} end of group TSC_Object_Driver */
250 /**@} end of group TSC_Driver_Library */
251