/** ****************************************************************************** * @file Demonstrations\Src\tsl_user.c * @author MCD Application Team * @brief Touch-Sensing user configuration and api file. ****************************************************************************** * @attention * * Copyright (c) 2014 STMicroelectronics. * All rights reserved. * * This software is licensed under terms that can be found in the LICENSE file * in the root directory of this software component. * If no LICENSE file comes with this software, it is provided AS-IS. * ****************************************************************************** */ #include "tsl_user.h" /*============================================================================*/ /* Channels */ /*============================================================================*/ /* Source and Configuration (ROM) */ CONST TSL_ChannelSrc_T MyChannels_Src[TSLPRM_TOTAL_CHANNELS] = { { CHANNEL_0_SRC, CHANNEL_0_IO_MSK, CHANNEL_0_GRP_MSK }, { CHANNEL_1_SRC, CHANNEL_1_IO_MSK, CHANNEL_1_GRP_MSK }, { CHANNEL_2_SRC, CHANNEL_2_IO_MSK, CHANNEL_2_GRP_MSK } }; /* Destination (ROM) */ CONST TSL_ChannelDest_T MyChannels_Dest[TSLPRM_TOTAL_CHANNELS] = { { CHANNEL_0_DEST }, { CHANNEL_1_DEST }, { CHANNEL_2_DEST } }; /* Data (RAM) */ TSL_ChannelData_T MyChannels_Data[TSLPRM_TOTAL_CHANNELS]; /*============================================================================*/ /* Banks */ /*============================================================================*/ /* List (ROM) */ CONST TSL_Bank_T MyBanks[TSLPRM_TOTAL_BANKS] = { {&MyChannels_Src[0], &MyChannels_Dest[0], MyChannels_Data, BANK_0_NBCHANNELS, BANK_0_MSK_CHANNELS, BANK_0_MSK_GROUPS} }; /*============================================================================*/ /* Linear and Rotary sensors */ /*============================================================================*/ /* Data (RAM) */ TSL_LinRotData_T MyLinRots_Data[TSLPRM_TOTAL_LINROTS]; /* Parameters (RAM) */ TSL_LinRotParam_T MyLinRots_Param[TSLPRM_TOTAL_LINROTS]; /* State Machine (ROM) */ CONST TSL_State_T MyLinRots_StateMachine[] = { /* Calibration states */ /* 0 */ { TSL_STATEMASK_CALIB, TSL_linrot_CalibrationStateProcess }, /* 1 */ { TSL_STATEMASK_DEB_CALIB, TSL_linrot_DebCalibrationStateProcess }, /* Release states */ /* 2 */ { TSL_STATEMASK_RELEASE, TSL_linrot_ReleaseStateProcess }, #if TSLPRM_USE_PROX > 0 /* 3 */ { TSL_STATEMASK_DEB_RELEASE_PROX, TSL_linrot_DebReleaseProxStateProcess }, #else /* 3 */ { TSL_STATEMASK_DEB_RELEASE_PROX, 0 }, #endif /* 4 */ { TSL_STATEMASK_DEB_RELEASE_DETECT, TSL_linrot_DebReleaseDetectStateProcess }, /* 5 */ { TSL_STATEMASK_DEB_RELEASE_TOUCH, TSL_linrot_DebReleaseTouchStateProcess }, #if TSLPRM_USE_PROX > 0 /* Proximity states */ /* 6 */ { TSL_STATEMASK_PROX, TSL_linrot_ProxStateProcess }, /* 7 */ { TSL_STATEMASK_DEB_PROX, TSL_linrot_DebProxStateProcess }, /* 8 */ { TSL_STATEMASK_DEB_PROX_DETECT, TSL_linrot_DebProxDetectStateProcess }, /* 9 */ { TSL_STATEMASK_DEB_PROX_TOUCH, TSL_linrot_DebProxTouchStateProcess }, #else /* 6 */ { TSL_STATEMASK_PROX, 0 }, /* 7 */ { TSL_STATEMASK_DEB_PROX, 0 }, /* 8 */ { TSL_STATEMASK_DEB_PROX_DETECT, 0 }, /* 9 */ { TSL_STATEMASK_DEB_PROX_TOUCH, 0 }, #endif /* Detect states */ /* 10 */ { TSL_STATEMASK_DETECT, TSL_linrot_DetectStateProcess }, /* 11 */ { TSL_STATEMASK_DEB_DETECT, TSL_linrot_DebDetectStateProcess }, /* Touch state */ /* 12 */ { TSL_STATEMASK_TOUCH, TSL_linrot_TouchStateProcess }, /* Error states */ /* 13 */ { TSL_STATEMASK_ERROR, MyLinRots_ErrorStateProcess }, /* 14 */ { TSL_STATEMASK_DEB_ERROR_CALIB, TSL_linrot_DebErrorStateProcess }, /* 15 */ { TSL_STATEMASK_DEB_ERROR_RELEASE, TSL_linrot_DebErrorStateProcess }, /* 16 */ { TSL_STATEMASK_DEB_ERROR_PROX, TSL_linrot_DebErrorStateProcess }, /* 17 */ { TSL_STATEMASK_DEB_ERROR_DETECT, TSL_linrot_DebErrorStateProcess }, /* 18 */ { TSL_STATEMASK_DEB_ERROR_TOUCH, TSL_linrot_DebErrorStateProcess }, /* Other states */ /* 19 */ { TSL_STATEMASK_OFF, MyLinRots_OffStateProcess } }; /* Methods for "extended" type (ROM) */ CONST TSL_LinRotMethods_T MyLinRots_Methods = { TSL_linrot_Init, TSL_linrot_Process, TSL_linrot_CalcPos }; /* Delta Normalization Process The MSB is the integer part, the LSB is the real part Examples: - To apply a factor 1.10: 0x01 to the MSB 0x1A to the LSB (0.10 x 256 = 25.6 -> rounded to 26 = 0x1A) - To apply a factor 0.90: 0x00 to the MSB 0xE6 to the LSB (0.90 x 256 = 230.4 -> rounded to 230 = 0xE6) */ CONST uint16_t MyLinRot0_DeltaCoeff[3] = {0x0100, 0x0100, 0x0100}; /* LinRots list (ROM)*/ CONST TSL_LinRot_T MyLinRots[TSLPRM_TOTAL_LINROTS] = { { /* LinRot sensor 0 = S1 */ &MyLinRots_Data[0], &MyLinRots_Param[0], &MyChannels_Data[CHANNEL_0_DEST], 3, /* Number of channels */ MyLinRot0_DeltaCoeff, (TSL_tsignPosition_T *)TSL_POSOFF_3CH_LIN_H, TSL_SCTCOMP_3CH_LIN_H, TSL_POSCORR_3CH_LIN_H, MyLinRots_StateMachine, &MyLinRots_Methods } }; /*============================================================================*/ /* Generic Objects */ /*============================================================================*/ /* List (ROM) */ CONST TSL_Object_T MyObjects[TSLPRM_TOTAL_OBJECTS] = { { TSL_OBJ_LINEAR, (TSL_LinRot_T *)&MyLinRots[0] } }; /* Group (RAM) */ TSL_ObjectGroup_T MyObjGroup = { &MyObjects[0], /* First object */ TSLPRM_TOTAL_OBJECTS, /* Number of objects */ 0x00, /* State mask reset value */ TSL_STATE_NOT_CHANGED /* Current state */ }; /*============================================================================*/ /* TSL Common Parameters placed in RAM or ROM */ /* --> external declaration in tsl_conf.h */ /*============================================================================*/ TSL_Params_T TSL_Params = { TSLPRM_ACQ_MIN, TSLPRM_ACQ_MAX, TSLPRM_CALIB_SAMPLES, TSLPRM_DTO, #if TSLPRM_TOTAL_TKEYS > 0 MyTKeys_StateMachine, /* Default state machine for TKeys */ &MyTKeys_Methods, /* Default methods for TKeys */ #endif #if TSLPRM_TOTAL_LNRTS > 0 MyLinRots_StateMachine, /* Default state machine for LinRots */ &MyLinRots_Methods /* Default methods for LinRots */ #endif }; /* Private functions prototype -----------------------------------------------*/ /* Global variables ----------------------------------------------------------*/ __IO TSL_tTick_ms_T Gv_ECS_last_tick; /* Hold the last time value for ECS */ __IO uint32_t Gv_EOA; /* Set by TS interrupt routine to indicate the End Of Acquisition */ uint32_t idx_bank = 0; uint32_t config_done = 0; /** * @brief Initialize the STMTouch Driver * @param None * @retval None */ void TSL_user_Init(void) { #if TSLPRM_TSC_GPIO_CONFIG == 0 /* Automatic GPIO configuration not selected: */ /* This function must be created by the user to initialize the Touch Sensing GPIOs. */ /*TSL_user_InitGPIOs(); */ #endif TSL_obj_GroupInit(&MyObjGroup); /* Init Objects */ TSL_Init(MyBanks); /* Init timing and acquisition modules */ idx_bank = 0; config_done = 0; } /** * @brief Execute STMTouch Driver main State machine * @param None * @retval status Return TSL_STATUS_OK if the acquisition is done */ TSL_Status_enum_T TSL_user_Action(void) { TSL_Status_enum_T status; /* Configure bank */ if (!config_done) { TSL_acq_BankConfig(idx_bank); /* Configure Bank */ TSL_acq_BankStartAcq(); /* Start Bank acquisition */ config_done = 1; #if TSLPRM_USE_ACQ_INTERRUPT > 0 Gv_EOA = 0; /* Will be set by the TS interrupt routine */ #endif } /* Check end of acquisition */ #if TSLPRM_USE_ACQ_INTERRUPT > 0 if (Gv_EOA) /* Set by the TS interrupt routine */ #else if (TSL_acq_BankWaitEOC() == TSL_STATUS_OK) #endif { TSL_acq_BankGetResult(idx_bank, 0, 0); /* Get Bank Result */ idx_bank++; /* Next bank */ config_done = 0; } /* Process objects, DxS and ECS Check if all banks have been acquired */ if (idx_bank > TSLPRM_TOTAL_BANKS-1) { /* Reset flags for next banks acquisition */ idx_bank = 0; config_done = 0; /* Process Objects */ TSL_obj_GroupProcess(&MyObjGroup); /* DxS processing (if TSLPRM_USE_DXS option is set) */ /*TSL_dxs_FirstObj(&MyObjGroup);*/ /* ECS every 100ms */ if (TSL_tim_CheckDelay_ms(100, &Gv_ECS_last_tick) == TSL_STATUS_OK) { TSL_ecs_Process(&MyObjGroup); } status = TSL_STATUS_OK; /* All banks have been acquired and sensors processed */ } else { status = TSL_STATUS_BUSY; } return status; } /** * @brief Executed when a sensor is in Error state * @param None * @retval None */ void MyLinRots_ErrorStateProcess(void) { /* Add here your own processing when a sensor is in Error state */ } /** * @brief Executed when a sensor is in Off state * @param None * @retval None */ void MyLinRots_OffStateProcess(void) { /* Add here your own processing when a sensor is in Off state */ }