⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stm8_tsl_rc_multichannelkey.c

📁 STM8-触摸例程
💻 C
📖 第 1 页 / 共 3 页
字号:
/**
  ******************************************************************************
  * @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>&copy; 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 + -