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)73void 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)150void 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)229void 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