📄 stm8_tsl_rc_multichannelkey.c
字号:
/**
******************************************************************************
* @file STM8_TSL_RC_MultiChannelKey.c
* @brief RC Touch Sensing Library for STM8 CPU family.
* Multi channel Key management. Allows to manage wheels and sliders.
* @author STMicroelectronics - MCD Application Team
* @version V1.1.0
* @date 21-FEB-2009
******************************************************************************
*
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
*
* <h2><center>© COPYRIGHT 2009 STMicroelectronics</center></h2>
* @image html logo.bmp
******************************************************************************
*/
#include "STM8_TSL_RC_MultiChannelKey.h"
#include "STM8_TSL_RC_API.h"
#include "STM8_TSL_RC_Services.h"
//============================================================================
//----- CONDITIONAL COMPILING FOR MCKEYS !!! -----------
#if NUMBER_OF_MULTI_CHANNEL_KEYS > 0
//============================================================================
//-------- SECTION DEFINITION FOR THIS FILE --------------
#if defined(__CSMC__) && defined(USE_PRAGMA_SECTION)
#pragma section [TSLMCK_RAM]
#pragma section @tiny [TSLMCK_RAM0]
#pragma section (TSLMCK_CODE)
#pragma section const {TSLMCK_CONST}
#endif
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//----- MCKEY1 CONSTANT TABLES FOR POSITION CALCULATION -----
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#if CHANNEL_PER_MCKEY == 5
#if MCKEY1_TYPE == 0 // Wheel
#if MCKEY1_LAYOUT_TYPE == 0 // Interlaced electrodes
const s16 MCKEY1_TABLE_POSITION_OFFSET[CHANNEL_PER_MCKEY][CHANNEL_PER_MCKEY] =
{
// sec = 1 2 3 4 5
// j = 0 1 2 3 4
0, -19, -83, 122, 58, // maj = 1; i = 0
6, 0, -32, -122, 96, // maj = 2; i = 1
70, 19, 0, -45, -96, // maj = 3; i = 2
-6, 109, 32, 0, -58, // maj = 4; i = 3
-70, -109, 83, 45, 0 // maj = 5; i = 4
};
#define MCKEY1_SECTOR_COMPUTATION (26)
#define MCKEY1_POSITION_CORRECTION (0)
#else // Normal electrodes
const s16 MCKEY1_TABLE_POSITION_OFFSET[CHANNEL_PER_MCKEY][CHANNEL_PER_MCKEY] =
{
// sec = 1 2 3 4 5
// j = 0 1 2 3 4
0, -38, 0, 0, 115, // maj = 1; i = 0
13, 0, -64, 0, 0, // maj = 2; i = 1
0, 38, 0, -90, 0, // maj = 3; i = 2
0, 0, 64, 0, -115, // maj = 4; i = 3
-13, 0, 0, 90, 0 // maj = 5; i = 4
};
#define MCKEY1_SECTOR_COMPUTATION (51)
#define MCKEY1_POSITION_CORRECTION (0)
#endif
#endif
#if MCKEY1_TYPE == 1 // Slider
#if MCKEY1_LAYOUT_TYPE == 0 // Interlaced electrodes
const s16 MCKEY1_TABLE_POSITION_OFFSET[CHANNEL_PER_MCKEY][CHANNEL_PER_MCKEY] =
{
// sec = 1 2 3 4 5
// j = 0 1 2 3 4
0, -21, -92, 135, 64, // maj = 1; i = 0
7, 0, -36, -135, 107, // maj = 2; i = 1
78, 21, 0, -50, -107, // maj = 3; i = 2
-149, 121, 36, 0, -64, // maj = 4; i = 3
-78, -121, 92, 50, 0 // maj = 5; i = 4
};
#define MCKEY1_SECTOR_COMPUTATION (28)
#define MCKEY1_POSITION_CORRECTION (28)
#else // Normal electrodes
const s16 MCKEY1_TABLE_POSITION_OFFSET[CHANNEL_PER_MCKEY][CHANNEL_PER_MCKEY] =
{
// sec = 1 2 3 4 5
// j = 0 1 2 3 4
0, -64, 0, 0, 0, // maj = 1; i = 0
21, 0, -107, 0, 0, // maj = 2; i = 1
0, 64, 0, -149, 0, // maj = 3; i = 2
0, 0, 107, 0, -192, // maj = 4; i = 3
0, 0, 0, 149, 0 // maj = 5; i = 4
};
#define MCKEY1_SECTOR_COMPUTATION (85)
#define MCKEY1_POSITION_CORRECTION (85)
#endif
#endif
#endif // CHANNEL_PER_MCKEY == 5
#if CHANNEL_PER_MCKEY == 8
#if MCKEY1_TYPE == 0 // Wheel
#if MCKEY1_LAYOUT_TYPE == 0 // Interlaced electrodes
const s16 MCKEY1_TABLE_POSITION_OFFSET[CHANNEL_PER_MCKEY][CHANNEL_PER_MCKEY] =
{
// sec = 1 2 3 4 5 6 7 8
// j = 0 1 2 3 4 5 6 7
0, -12, 0, -76, 0, 124, 0, 60, // maj = 1; i = 0
4, 0, -20, 0, -100, 0, 84, 0, // maj = 2; i = 1
0, 12, 0, -28, 0, -124, 0, 108, // maj = 3; i = 2
68, 0, 20, 0, -36, 0, -84, 0, // maj = 4; i = 3
0, 92, 0, 28, 0, -44, 0, -108, // maj = 5; i = 4
-4, 0, 116, 0, 36, 0, -52, 0, // maj = 6; i = 5
0, -92, 0, 76, 0, 44, 0, -60, // maj = 7; i = 6
-68, 0, -116, 0, 100, 0, 52, 0 // maj = 8; i = 7
};
#define MCKEY1_SECTOR_COMPUTATION (16)
#define MCKEY1_POSITION_CORRECTION (0)
#else // Normal electrodes
const s16 MCKEY1_TABLE_POSITION_OFFSET[CHANNEL_PER_MCKEY][CHANNEL_PER_MCKEY] =
{
// sec = 1 2 3 4 5 6 7 8
// j = 0 1 2 3 4 5 6 7
0, -24, 0, 0, 0, 0, 0, 120, // maj = 1; i = 0
8, 0, -40, 0, 0, 0, 0, 0, // maj = 2; i = 1
0, 24, 0, -56, 0, 0, 0, 0, // maj = 3; i = 2
0, 0, 40, 0, -72, 0, 0, 0, // maj = 4; i = 3
0, 0, 0, 56, 0, -88, 0, 0, // maj = 5; i = 4
0, 0, 0, 0, 72, 0, -104, 0, // maj = 6; i = 5
0, 0, 0, 0, 0, 88, 0, -120, // maj = 7; i = 6
-8, 0, 0, 0, 0, 0, 104, 0 // maj = 8; i = 7
};
#define MCKEY1_SECTOR_COMPUTATION (32)
#define MCKEY1_POSITION_CORRECTION (0)
#endif
#endif
#if MCKEY1_TYPE == 1 // Slider
#if MCKEY1_LAYOUT_TYPE == 0 // Interlaced electrodes
const s16 MCKEY1_TABLE_POSITION_OFFSET[CHANNEL_PER_MCKEY][CHANNEL_PER_MCKEY] =
{
// sec = 1 2 3 4 5 6 7 8
// j = 0 1 2 3 4 5 6 7
0, -13, 0, -81, 0, 132, 0, 64, // maj = 1; i = 0
4, 0, -21, 0, -107, 0, 90, 0, // maj = 2; i = 1
0, 13, 0, -30, 0, -132, 0, 115, // maj = 3; i = 2
73, 0, 21, 0, -38, 0, -90, 0, // maj = 4; i = 3
0, 98, 0, 30, 0, -47, 0, -115, // maj = 5; i = 4
-141, 0, 124, 0, 38, 0, -55, 0, // maj = 6; i = 5
0, -98, 0, 81, 0, 47, 0, -64, // maj = 7; i = 6
-73, 0, -124, 0, 107, 0, 55, 0 // maj = 8; i = 7
};
#define MCKEY1_SECTOR_COMPUTATION (17)
#define MCKEY1_POSITION_CORRECTION (17)
#else // Normal electrodes
const s16 MCKEY1_TABLE_POSITION_OFFSET[CHANNEL_PER_MCKEY][CHANNEL_PER_MCKEY] =
{
// sec = 1 2 3 4 5 6 7 8
// j = 0 1 2 3 4 5 6 7
0, -32, 0, 0, 0, 0, 0, 0, // maj = 1; i = 0
11, 0, -53, 0, 0, 0, 0, 0, // maj = 2; i = 1
0, 32, 0, -75, 0, 0, 0, 0, // maj = 3; i = 2
0, 0, 53, 0, -96, 0, 0, 0, // maj = 4; i = 3
0, 0, 0, 75, 0, -117, 0, 0, // maj = 5; i = 4
0, 0, 0, 0, 96, 0, -139, 0, // maj = 6; i = 5
0, 0, 0, 0, 0, 117, 0, -160, // maj = 7; i = 6
0, 0, 0, 0, 0, 0, 139, 0 // maj = 8; i = 7
};
#define MCKEY1_SECTOR_COMPUTATION (43)
#define MCKEY1_POSITION_CORRECTION (43)
#endif
#endif
#endif // CHANNEL_PER_MCKEY == 8
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//----- MCKEY2 CONSTANT TABLES FOR POSITION CALCULATION -----
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#if NUMBER_OF_MULTI_CHANNEL_KEYS > 1
#if CHANNEL_PER_MCKEY == 5
#if MCKEY2_TYPE == 0 // Wheel
#if MCKEY2_LAYOUT_TYPE == 0 // Interlaced electrodes
const s16 MCKEY2_TABLE_POSITION_OFFSET[CHANNEL_PER_MCKEY][CHANNEL_PER_MCKEY] =
{
// sec = 1 2 3 4 5
// j = 0 1 2 3 4
0, -19, -83, 122, 58, // maj = 1; i = 0
6, 0, -32, -122, 96, // maj = 2; i = 1
70, 19, 0, -45, -96, // maj = 3; i = 2
-6, 109, 32, 0, -58, // maj = 4; i = 3
-70, -109, 83, 45, 0 // maj = 5; i = 4
};
#define MCKEY2_SECTOR_COMPUTATION (26)
#define MCKEY2_POSITION_CORRECTION (0)
#else // Normal electrodes
const s16 MCKEY2_TABLE_POSITION_OFFSET[CHANNEL_PER_MCKEY][CHANNEL_PER_MCKEY] =
{
// sec = 1 2 3 4 5
// j = 0 1 2 3 4
0, -38, 0, 0, 115, // maj = 1; i = 0
13, 0, -64, 0, 0, // maj = 2; i = 1
0, 38, 0, -90, 0, // maj = 3; i = 2
0, 0, 64, 0, -115, // maj = 4; i = 3
-13, 0, 0, 90, 0 // maj = 5; i = 4
};
#define MCKEY2_SECTOR_COMPUTATION (51)
#define MCKEY2_POSITION_CORRECTION (0)
#endif
#endif
#if MCKEY2_TYPE == 1 // Slider
#if MCKEY2_LAYOUT_TYPE == 0 // Interlaced electrodes
const s16 MCKEY2_TABLE_POSITION_OFFSET[CHANNEL_PER_MCKEY][CHANNEL_PER_MCKEY] =
{
// sec = 1 2 3 4 5
// j = 0 1 2 3 4
0, -21, -92, 135, 64, // maj = 1; i = 0
7, 0, -36, -135, 107, // maj = 2; i = 1
78, 21, 0, -50, -107, // maj = 3; i = 2
-149, 121, 36, 0, -64, // maj = 4; i = 3
-78, -121, 92, 50, 0 // maj = 5; i = 4
};
#define MCKEY2_SECTOR_COMPUTATION (28)
#define MCKEY2_POSITION_CORRECTION (28)
#else // Normal electrodes
const s16 MCKEY2_TABLE_POSITION_OFFSET[CHANNEL_PER_MCKEY][CHANNEL_PER_MCKEY] =
{
// sec = 1 2 3 4 5
// j = 0 1 2 3 4
0, -64, 0, 0, 0, // maj = 1; i = 0
21, 0, -107, 0, 0, // maj = 2; i = 1
0, 64, 0, -149, 0, // maj = 3; i = 2
0, 0, 107, 0, -192, // maj = 4; i = 3
0, 0, 0, 149, 0 // maj = 5; i = 4
};
#define MCKEY2_SECTOR_COMPUTATION (85)
#define MCKEY2_POSITION_CORRECTION (85)
#endif
#endif
#endif // CHANNEL_PER_MCKEY == 5
#if CHANNEL_PER_MCKEY == 8
#if MCKEY2_TYPE == 0 // Wheel
#if MCKEY2_LAYOUT_TYPE == 0 // Interlaced electrodes
const s16 MCKEY2_TABLE_POSITION_OFFSET[CHANNEL_PER_MCKEY][CHANNEL_PER_MCKEY] =
{
// sec = 1 2 3 4 5 6 7 8
// j = 0 1 2 3 4 5 6 7
0, -12, 0, -76, 0, 124, 0, 60, // maj = 1; i = 0
4, 0, -20, 0, -100, 0, 84, 0, // maj = 2; i = 1
0, 12, 0, -28, 0, -124, 0, 108, // maj = 3; i = 2
68, 0, 20, 0, -36, 0, -84, 0, // maj = 4; i = 3
0, 92, 0, 28, 0, -44, 0, -108, // maj = 5; i = 4
-4, 0, 116, 0, 36, 0, -52, 0, // maj = 6; i = 5
0, -92, 0, 76, 0, 44, 0, -60, // maj = 7; i = 6
-68, 0, -116, 0, 100, 0, 52, 0 // maj = 8; i = 7
};
#define MCKEY2_SECTOR_COMPUTATION (16)
#define MCKEY2_POSITION_CORRECTION (0)
#else // Normal electrodes
const s16 MCKEY2_TABLE_POSITION_OFFSET[CHANNEL_PER_MCKEY][CHANNEL_PER_MCKEY] =
{
// sec = 1 2 3 4 5 6 7 8
// j = 0 1 2 3 4 5 6 7
0, -24, 0, 0, 0, 0, 0, 120, // maj = 1; i = 0
8, 0, -40, 0, 0, 0, 0, 0, // maj = 2; i = 1
0, 24, 0, -56, 0, 0, 0, 0, // maj = 3; i = 2
0, 0, 40, 0, -72, 0, 0, 0, // maj = 4; i = 3
0, 0, 0, 56, 0, -88, 0, 0, // maj = 5; i = 4
0, 0, 0, 0, 72, 0, -104, 0, // maj = 6; i = 5
0, 0, 0, 0, 0, 88, 0, -120, // maj = 7; i = 6
-8, 0, 0, 0, 0, 0, 104, 0 // maj = 8; i = 7
};
#define MCKEY2_SECTOR_COMPUTATION (32)
#define MCKEY2_POSITION_CORRECTION (0)
#endif
#endif
#if MCKEY2_TYPE == 1 // Slider
#if MCKEY2_LAYOUT_TYPE == 0 // Interlaced electrodes
const s16 MCKEY2_TABLE_POSITION_OFFSET[CHANNEL_PER_MCKEY][CHANNEL_PER_MCKEY] =
{
// sec = 1 2 3 4 5 6 7 8
// j = 0 1 2 3 4 5 6 7
0, -13, 0, -81, 0, 132, 0, 64, // maj = 1; i = 0
4, 0, -21, 0, -107, 0, 90, 0, // maj = 2; i = 1
0, 13, 0, -30, 0, -132, 0, 115, // maj = 3; i = 2
73, 0, 21, 0, -38, 0, -90, 0, // maj = 4; i = 3
0, 98, 0, 30, 0, -47, 0, -115, // maj = 5; i = 4
-141, 0, 124, 0, 38, 0, -55, 0, // maj = 6; i = 5
0, -98, 0, 81, 0, 47, 0, -64, // maj = 7; i = 6
-73, 0, -124, 0, 107, 0, 55, 0 // maj = 8; i = 7
};
#define MCKEY2_SECTOR_COMPUTATION (17)
#define MCKEY2_POSITION_CORRECTION (17)
#else // Normal electrodes
const s16 MCKEY2_TABLE_POSITION_OFFSET[CHANNEL_PER_MCKEY][CHANNEL_PER_MCKEY] =
{
// sec = 1 2 3 4 5 6 7 8
// j = 0 1 2 3 4 5 6 7
0, -32, 0, 0, 0, 0, 0, 0, // maj = 1; i = 0
11, 0, -53, 0, 0, 0, 0, 0, // maj = 2; i = 1
0, 32, 0, -75, 0, 0, 0, 0, // maj = 3; i = 2
0, 0, 53, 0, -96, 0, 0, 0, // maj = 4; i = 3
0, 0, 0, 75, 0, -117, 0, 0, // maj = 5; i = 4
0, 0, 0, 0, 96, 0, -139, 0, // maj = 6; i = 5
0, 0, 0, 0, 0, 117, 0, -160, // maj = 7; i = 6
0, 0, 0, 0, 0, 0, 139, 0 // maj = 8; i = 7
};
#define MCKEY2_SECTOR_COMPUTATION (43)
#define MCKEY2_POSITION_CORRECTION (43)
#endif
#endif
#endif // CHANNEL_PER_MCKEY == 8
#endif // MCKEY2
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//----- LIBRARY PRIVATE GLOBALS -----
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/**
******************************************************************************
* @brief Initialize all MCKey relative parameters and variables.
* @par Parameters:
* None
* @retval void None
* @par Required preconditions:
* None
******************************************************************************
*/
void TSL_MCKey_Init(void)
{
for ( KeyIndex = 0; KeyIndex < NUMBER_OF_MULTI_CHANNEL_KEYS; KeyIndex++ )
{
TSL_MCKey_SetStructPointer();
pMCKeyStruct->State.whole = DISABLED_STATE;
pMCKeyStruct->DetectThreshold = MCKEY_DETECTTHRESHOLD_DEFAULT;
pMCKeyStruct->EndDetectThreshold = MCKEY_ENDDETECTTHRESHOLD_DEFAULT;
pMCKeyStruct->RecalibrationThreshold = MCKEY_RECALIBRATIONTHRESHOLD_DEFAULT;
pMCKeyStruct->Resolution = MCKEY_RESOLUTION_DEFAULT;
pMCKeyStruct->DirectionChangeIntegrator = MCKEY_DIRECTION_CHANGE_INTEGRATOR_DEFAULT;
pMCKeyStruct->DirectionChangeThreshold = MCKEY_DIRECTION_CHANGE_THRESHOLD_DEFAULT;
}
/* Set MC key type: Wheel or Slider */
sMCKeyInfo[0].Setting.b.MCKEY_TYPE = MCKEY1_TYPE;
#if NUMBER_OF_MULTI_CHANNEL_KEYS > 1
sMCKeyInfo[1].Setting.b.MCKEY_TYPE = MCKEY2_TYPE;
#endif
}
/**
******************************************************************************
* @brief Select I/Os to burst and call IO driver for burst sequence.
* @par Parameters:
* None
* @retval void None
* @par Required preconditions:
* None
******************************************************************************
*/
void TSL_MCKey1_Acquisition(void)
{
KeyIndex = 0;
TSL_MCKey_SetStructPointer();
if ( !( (pMCKeyStruct->State.whole == ERROR_STATE) || (pMCKeyStruct->State.whole == DISABLED_STATE) ) )
{
for ( ChannelIndex = 0; ChannelIndex < CHANNEL_PER_MCKEY; ChannelIndex++ )
{
sTouchIO.PORT_ADDR = (GPIO_TypeDef *)(Table_MCKEY_PORTS[ChannelIndex]);
sTouchIO.AcqMask = Table_MCKEY_BITS[ChannelIndex];
sTouchIO.DriveMask = (u8)(sTouchIO.AcqMask | MCKEY1_DRIVEN_SHIELD_MASK);
sTouchIO.Measurement = &sMCKeyInfo[0].Channel[ChannelIndex].LastMeas;
sTouchIO.RejectedNb = &sMCKeyInfo[0].Channel[ChannelIndex].LastMeasRejectNb;
sTouchIO.Type = MCKEY_TYPE;
TSL_IO_Acquisition(MCKEY_ACQ_NUM, MCKEY_ADJUST_LEVEL);
}
}
}
#if NUMBER_OF_MULTI_CHANNEL_KEYS > 1
/**
******************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -