mirror of
https://github.com/STMicroelectronics/STM32CubeF0.git
synced 2025-05-03 22:17:10 +08:00
301 lines
9.5 KiB
C
301 lines
9.5 KiB
C
/**
|
|
******************************************************************************
|
|
* @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 */
|
|
}
|