stm8_tsl_services.c
来自「STM8s」· C语言 代码 · 共 1,010 行 · 第 1/2 页
C
1,010 行
pKeyStruct->Channel.IntegratorCounter++; // Increment integrator to never allow DETECT state
return;
}
/**
******************************************************************************
* @brief Verify Detection Timeout for current Key.
* @par Parameters:
* None
* @retval void None
* @par Required preconditions:
* None
******************************************************************************
*/
void TSL_SCKey_DetectionTimeout(void)
{
if (Local_TickFlag.b.DTO_1sec)
{
if (DetectionTimeout)
{
pKeyStruct->Counter--;
if (!pKeyStruct->Counter)
{
TSL_SCKey_SetCalibrationState();
}
}
}
}
#endif
//============================================================================
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//----- MULTI CHANNEL KEY SERVICES -----
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//============================================================================
//============================================================================
//----- CONDITIONAL COMPILING FOR MCKEYS !!! -----------
#if NUMBER_OF_MULTI_CHANNEL_KEYS > 0
//============================================================================
//-------- SECTION DEFINITION FOR THIS FILE --------------
#if defined(_COSMIC_) && defined(USE_PRAGMA_SECTION)
#pragma section [TSLMCK_RAM]
#pragma section @tiny [TSLMCK_RAM0]
#pragma section (TSLMCK_CODE)
#pragma section const {TSLMCK_CONST}
#endif
/* Coefficient table used to adjust the Delta on MCKey1 */
__CONST u16 MCKEY1_DELTA_COEFF[CHANNEL_PER_MCKEY] =
{
#ifdef MCKEY1_DELTA_COEFF_A
MCKEY1_DELTA_COEFF_A,
#else
0x0100,
#endif
#ifdef MCKEY1_DELTA_COEFF_B
MCKEY1_DELTA_COEFF_B,
#else
0x0100,
#endif
#ifdef MCKEY1_DELTA_COEFF_C
MCKEY1_DELTA_COEFF_C,
#else
0x0100,
#endif
#if CHANNEL_PER_MCKEY > 3
#ifdef MCKEY1_DELTA_COEFF_D
MCKEY1_DELTA_COEFF_D,
#else
0x0100,
#endif
#ifdef MCKEY1_DELTA_COEFF_E
MCKEY1_DELTA_COEFF_E,
#else
0x0100,
#endif
#endif
#if CHANNEL_PER_MCKEY > 5
#ifdef MCKEY1_DELTA_COEFF_F
MCKEY1_DELTA_COEFF_F,
#else
0x0100,
#endif
#ifdef MCKEY1_DELTA_COEFF_G
MCKEY1_DELTA_COEFF_G,
#else
0x0100,
#endif
#ifdef MCKEY1_DELTA_COEFF_H
MCKEY1_DELTA_COEFF_H
#else
0x0100
#endif
#endif
};
#if NUMBER_OF_MULTI_CHANNEL_KEYS > 1
__CONST u16 MCKEY2_DELTA_COEFF[CHANNEL_PER_MCKEY] =
{
#ifdef MCKEY2_DELTA_COEFF_A
MCKEY2_DELTA_COEFF_A,
#else
0x0100,
#endif
#ifdef MCKEY2_DELTA_COEFF_B
MCKEY2_DELTA_COEFF_B,
#else
0x0100,
#endif
#ifdef MCKEY2_DELTA_COEFF_C
MCKEY2_DELTA_COEFF_C,
#else
0x0100,
#endif
#if CHANNEL_PER_MCKEY > 3
#ifdef MCKEY2_DELTA_COEFF_D
MCKEY2_DELTA_COEFF_D,
#else
0x0100,
#endif
#ifdef MCKEY2_DELTA_COEFF_E
MCKEY2_DELTA_COEFF_E,
#else
0x0100,
#endif
#endif
#if CHANNEL_PER_MCKEY > 5
#ifdef MCKEY2_DELTA_COEFF_F
MCKEY2_DELTA_COEFF_F,
#else
0x0100,
#endif
#ifdef MCKEY2_DELTA_COEFF_G
MCKEY2_DELTA_COEFF_G,
#else
0x0100,
#endif
#ifdef MCKEY2_DELTA_COEFF_H
MCKEY2_DELTA_COEFF_H
#else
0x0100
#endif
#endif
};
#endif
/**
******************************************************************************
* @brief Initialize the mask relative to MCKey for the channel in parameters
* @par Parameters:
* channel is the channel to be acquired (CH1, CH2, CH3 or CH4)
* @retval u8 Mask
* return the mask value relative to all MCKeys using the channel in parameter
* @par Required preconditions:
* None
******************************************************************************
*/
u8 TSL_MCKey_InitAcq(u8 channel)
{
u8 mask = 0;
#if NUMBER_OF_MULTI_CHANNEL_KEYS > 0
for (KeyIndex = 0; KeyIndex < NUMBER_OF_MULTI_CHANNEL_KEYS;KeyIndex++)
{
if ((sMCKeyInfo[KeyIndex].State.whole & (DISABLED_STATE | ERROR_STATE)) == 0)
{
for (ChannelIndex = 0; ChannelIndex < CHANNEL_PER_MCKEY * NUMBER_OF_MULTI_CHANNEL_KEYS; ChannelIndex++)
{
if (Table_MCKEY_PORTS[ChannelIndex] == channel)
{
mask |= Table_MCKEY_BITS[ChannelIndex];
}
}
}
}
#endif
return (mask);
}
/**
******************************************************************************
* @brief Update pointer to current MCKey Structure.
* @par Parameters:
* None
* @retval void None
* @par Required preconditions:
* None
******************************************************************************
*/
void TSL_MCKey_SetStructPointer(void)
{
pMCKeyStruct = &sMCKeyInfo[KeyIndex];
}
/**
******************************************************************************
* @brief Calculates Delta for a channel of the current MCKey.
* @param[in] ChIdx Channel index (0 = MCKEY1, 1 = MCKEY2)
* @retval void None
* @par Required preconditions:
* None
******************************************************************************
*/
void TSL_MCKey_DeltaCalculation(u8 ChIdx)
{
/*
Note that the delta calculation depends of the technology used:
- With the RC technology, the measured value for a "touch" is higher than
the reference value.
- With the Charge Transfer technology, the measured value for a "touch"
is lower than the reference value.
*/
#ifdef CHARGE_TRANSFER
/* Delta calculation for Charge transfer technology */
Delta = (s16)(pMCKeyStruct->Channel[ChIdx].Reference - pMCKeyStruct->Channel[ChIdx].LastMeas);
#else
/* Delta calculation for RC technology */
Delta = (s16)(pMCKeyStruct->Channel[ChIdx].LastMeas - pMCKeyStruct->Channel[ChIdx].Reference);
#endif
}
/**
******************************************************************************
* @brief Short local routine to setup MCKey internal state machine.
* @par Parameters:
* None
* @retval void None
* @par Required preconditions:
* None
******************************************************************************
*/
void TSL_MCKey_SetIdleState(void)
{
pMCKeyStruct->Setting.b.CHANGED = 1;
TSL_MCKey_BackToIdleState();
}
/**
******************************************************************************
* @brief Short local routine to setup MCKey internal state machine.
* @par Parameters:
* None
* @retval void None
* @par Required preconditions:
* None
******************************************************************************
*/
void TSL_MCKey_BackToIdleState(void)
{
pMCKeyStruct->State.whole = IDLE_STATE;
pMCKeyStruct->Setting.b.DETECTED = 0;
pMCKeyStruct->Setting.b.LOCKED = 0;
}
/**
******************************************************************************
* @brief Short local routine to setup MCKey internal state machine.
* @par Parameters:
* None
* @retval void None
* @par Required preconditions:
* None
******************************************************************************
*/
void TSL_MCKey_SetPreDetectState(void)
{
pMCKeyStruct->State.whole = PRE_DETECTED_STATE;
pMCKeyStruct->Channel[0].IntegratorCounter = DetectionIntegrator;
}
/**
******************************************************************************
* @brief Short local routine to setup MCKey internal state machine.
* @par Parameters:
* None
* @retval void None
* @par Required preconditions:
* None
******************************************************************************
*/
void TSL_MCKey_SetDetectedState(void)
{
pMCKeyStruct->State.whole = DETECTED_STATE;
pMCKeyStruct->Setting.b.DETECTED = 1;
pMCKeyStruct->Setting.b.CHANGED = 1;
pMCKeyStruct->Counter = DetectionTimeout;
pMCKeyStruct->Channel[1].IntegratorCounter = pMCKeyStruct->DirectionChangeIntegrator;
}
/**
******************************************************************************
* @brief Short local routine to setup MCKey internal state machine.
* @par Parameters:
* None
* @retval void None
* @par Required preconditions:
* None
******************************************************************************
*/
void TSL_MCKey_SetPostDetectState(void)
{
pMCKeyStruct->State.whole = POST_DETECTED_STATE;
pMCKeyStruct->Channel[0].IntegratorCounter = EndDetectionIntegrator;
}
/**
******************************************************************************
* @brief Short local routine to setup MCKey internal state machine.
* @par Parameters:
* None
* @retval void None
* @par Required preconditions:
* None
******************************************************************************
*/
void TSL_MCKey_BackToDetectedState(void)
{
pMCKeyStruct->State.whole = DETECTED_STATE;
}
/**
******************************************************************************
* @brief Short local routine to setup MCKey internal state machine.
* @par Parameters:
* None
* @retval void None
* @par Required preconditions:
* None
******************************************************************************
*/
void TSL_MCKey_SetPreRecalibrationState(void)
{
pMCKeyStruct->State.whole = PRE_CALIBRATION_STATE;
pMCKeyStruct->Channel[0].IntegratorCounter = RecalibrationIntegrator;
}
/**
******************************************************************************
* @brief Short local routine to setup MCKey internal state machine.
* @par Parameters:
* None
* @retval void None
* @par Required preconditions:
* None
******************************************************************************
*/
void TSL_MCKey_SetCalibrationState(void)
{
u8 Index;
pMCKeyStruct->State.whole = CALIBRATION_STATE;
pMCKeyStruct->Setting.b.DETECTED = 0;
pMCKeyStruct->Setting.b.CHANGED = 1;
pMCKeyStruct->Setting.b.LOCKED = 0;
pMCKeyStruct->Counter = MCKEY_CALIBRATION_COUNT_DEFAULT;
for (Index = 0; Index < CHANNEL_PER_MCKEY; Index++)
{
pMCKeyStruct->Channel[Index].Reference = 0;
}
}
/**
******************************************************************************
* @brief Short local routine to setup MCKey internal state machine.
* @par Parameters:
* None
* @retval void None
* @par Required preconditions:
* None
******************************************************************************
*/
void TSL_MCKey_SetErrorState(void)
{
pMCKeyStruct->State.whole = ERROR_STATE;
pMCKeyStruct->Setting.b.DETECTED = 0;
pMCKeyStruct->Setting.b.CHANGED = 1;
pMCKeyStruct->Setting.b.LOCKED = 0;
pMCKeyStruct->Setting.b.ERROR = 1;
}
/**
******************************************************************************
* @brief Short local routine to setup MCKey internal state machine.
* @par Parameters:
* None
* @retval void None
* @par Required preconditions:
* None
******************************************************************************
*/
void TSL_MCKey_SetDisabledState(void)
{
pMCKeyStruct->State.whole = DISABLED_STATE;
pMCKeyStruct->Setting.b.DETECTED = 0;
pMCKeyStruct->Setting.b.CHANGED = 1;
pMCKeyStruct->Setting.b.LOCKED = 0;
}
/**
******************************************************************************
* @brief Apply Detection exclusion System algorithm (DxS) on MCKeys.
* This function modify the LOCKED bit of current MCKey structure only.
* @par Parameters:
* None
* @retval void None
* @par Required preconditions:
* None
******************************************************************************
*/
void TSL_MCKey_DxS(void)
{
u8 DxSGroupMask, KeyToCheck;
if (pMCKeyStruct->Setting.b.LOCKED)
return;
DxSGroupMask = pMCKeyStruct->DxSGroup;
#if NUMBER_OF_SINGLE_CHANNEL_KEYS > 0
for (KeyToCheck = 0; KeyToCheck < NUMBER_OF_SINGLE_CHANNEL_KEYS; KeyToCheck++)
{
// KeyToCheck and current key are in same group ?
if (sSCKeyInfo[KeyToCheck].DxSGroup & DxSGroupMask)
{
if (sSCKeyInfo[KeyToCheck].Setting.b.LOCKED)
{
goto ExitToIdle;
}
}
}
#endif
#if NUMBER_OF_MULTI_CHANNEL_KEYS > 1
for (KeyToCheck = 0; KeyToCheck < NUMBER_OF_MULTI_CHANNEL_KEYS; KeyToCheck++)
{
if (KeyToCheck != KeyIndex)
{
// KeyToCheck and current key are in same group ?
if (sMCKeyInfo[KeyToCheck].DxSGroup & DxSGroupMask)
{
if (sMCKeyInfo[KeyToCheck].Setting.b.LOCKED)
{
goto ExitToIdle;
}
}
}
}
#endif
pMCKeyStruct->Setting.b.LOCKED = 1;
return;
ExitToIdle: // The DxS is verified at PRE DETECT state only !
pMCKeyStruct->Channel[0].IntegratorCounter++; // Increment integrator to never allow DETECT state
return;
}
/**
******************************************************************************
* @brief Verify Detection Timeout for current MCKey.
* @par Parameters:
* None
* @retval void None
* @par Required preconditions:
* None
******************************************************************************
*/
void TSL_MCKey_DetectionTimeout(void)
{
if (Local_TickFlag.b.DTO_1sec)
{
if (DetectionTimeout)
{
pMCKeyStruct->Counter--;
if (!pMCKeyStruct->Counter)
{
TSL_MCKey_SetCalibrationState();
}
}
}
}
//============================================================================
//----- CONDITIONAL COMPILING FOR MCKEYS !!! -----------
#endif
//============================================================================
/* Public functions ----------------------------------------------------------*/
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?