/*!
 * @file        tsc_config.h
 *
 * @brief       Acquisition parameters for APM32A0xx products.
 *
 * @version     V1.0.0
 *
 * @date        2023-03-30
 *
 * @attention
 *
 *  Copyright (C) 2023 Geehy Semiconductor
 *
 *  You may not use this file except in compliance with the
 *  GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE).
 *
 *  The program is only for reference, which is distributed in the hope
 *  that it will be useful and instructional for customers to develop
 *  their software. Unless required by applicable law or agreed to in
 *  writing, the program is distributed on an "AS IS" BASIS, WITHOUT
 *  ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions
 *  and limitations under the License.
 */

/* Define to prevent recursive inclusion */
#ifndef __TSC_CONFIG_H
#define __TSC_CONFIG_H

#ifdef __cplusplus
extern "C" {
#endif

/** @addtogroup TSC_Driver_Library TSC Driver Library
  @{
*/

/** @addtogroup TSC_Config_Driver TSC Config Driver
  @{
*/

/** @defgroup TSC_Config_Macros Macros
  @{
*/

/** @defgroup Common_Parameters_Number_Of_Elements
  @{
*/

/* The number of channels (1..24) */
#define TOUCH_TOTAL_CHANNELS (11)

/* The number of blocks (1..8) */
#define TOUCH_TOTAL_BLOCKS (3)

/* The number of "Extended" TouchKeys (0..24) */
#define TOUCH_TOTAL_TOUCHKEYS (5)

/* The number of "Basic" TouchKeys (0..24) */
#define TOUCH_TOTAL_TOUCHKEYS_B (0)

/* The number of "Extended" Linear and Rotary sensors (0..24) */
#define TOUCH_TOTAL_LINROTS (2)

/* The number of "Basic" Linear and Rotary sensors (0..24) */
#define TOUCH_TOTAL_LINROTS_B (0)

/** The number of sensors/objects (1..24)
 *  - Count all TouchKeys, Linear and Rotary sensors
 */
#define TOUCH_TOTAL_OBJECTS (7)

/**@} Common_Parameters_Number_Of_Elements */

/** @defgroup Common_Parameters_Optional_Features
  @{
*/

/** Record the last measure (0=No, 1=Yes)
 *  - If No the measure is recalculated using the Reference and Delta
 */
#define TOUCH_USE_MEAS (1)

/* Zone management usage (0=No, 1=Yes) */
#define TOUCH_USE_ZONE (0)

/* Proximity detection usage (0=No, 1=Yes) */
#define TOUCH_USE_PROX (1)

/** Use the Timer tick callback (0=No, 1=Yes)
 *  - When equal to 1, the function TSC_CallBack_TimerTick
 */
#define TOUCH_USE_TIMER_CALLBACK (0)

/** Acquisition interrupt mode (0=No, 1=Yes)
 *  - If No the TSC interrupt is not used.
 *  - If Yes the TSC interrupt is used.
 */
#define TOUCH_USE_ACQ_INTERRUPT (0)

/**@} Common_Parameters_Optional_Features */

/** @defgroup Common_Parameters_Acquisition_limits
  @{
*/

/** Minimum acquisition measurement (0..65535)
 *  - This is the minimum acceptable value for the acquisition measure.
 *  - The acquisition will be in error if the measure is below this value.
 */
#define TOUCH_ACQ_MIN (10)

/** Maximum acquisition measurement (255, 511, 1023, 2047, 8191, 16383)
 *  - This is the maximum acceptable value for the acquisition measure.
 *  - The acquisition will be in error if the measure is above this value.
 */
#define TOUCH_ACQ_MAX (8191)

/**@} Common_Parameters_Acquisition_limits */

/** @defgroup Common_Parameters_Calibration
  @{
*/
/** Number of calibration samples (4, 8, 16)
 *  - Low value = faster calibration but less precision.
 *  - High value = slower calibration but more precision.
 */
#define TOUCH_CALIB_SAMPLES (16)

/** Delay in measurement samples before starting the calibration (0..40)
 *  - This is useful if a noise filter is used.
 *  - Write 0 to disable the delay.
 */
#define TOUCH_CALIB_DELAY (0)

/**@} Common_Parameters_Calibration */

/** @defgroup Common_Parameters_Thresholds_for_TouchKey
  @{
*/

/** TouchKeys Proximity state input threshold (0..255)
 *  - Enter Proximity state if delta is above
 */
#define TOUCH_KEY_PROX_IN_TH (10)

/** TouchKeys Proximity state output threshold (0..255)
 *  - Exit Proximity state if delta is below
 */
#define TOUCH_KEY_PROX_OUT_TH (5)

/** TouchKeys Detect state input threshold (0..255)
 *  - Enter Detect state if delta is above
 */
#define TOUCH_KEY_DETECT_IN_TH (200)

/** TouchKeys Detect state output threshold (0..255)
 *  - Exit Detect state if delta is below
 */
#define TOUCH_KEY_DETECT_OUT_TH (150)

/** TouchKeys re-Calibration threshold (0..255)
 *  - @warning The value is inverted in the sensor state machine
 *  - Enter Calibration state if delta is below
 */
#define TOUCH_KEY_CALIB_TH (150)

/** TouchKey, Linear and Rotary sensors thresholds coefficient (0..4)
 *  This multiplier coefficient is applied on Detect and Re-Calibration thresholds only.
 *  - 0: disabled
 *  - 1: thresholds x 2
 *  - 2: thresholds x 4
 *  - 3: thresholds x 8
 *  - 4: thresholds x 16
 */
#define TOUCH_COEFF_TH (0)

/**@} Common_Parameters_Thresholds_for_TouchKey */

/** @defgroup Common_Parameters_Thresholds_For_Linear_Rotary
  @{
*/

/** Linear/Rotary Proximity state input threshold (0..255)
 *  - Enter Proximity state if delta is above
 */
#define TOUCH_LINROT_PROX_IN_TH (10)

/** Linear/Rotary Proximity state output threshold (0..255)
 * - Exit Proximity state if delta is below
 */
#define TOUCH_LINROT_PROX_OUT_TH (5)

/** Linear/Rotary Detect state input threshold (0..255)
 *  - Enter Detect state if delta is above
 */
#define TOUCH_LINROT_DETECT_IN_TH (20)

/** Linear/Rotary Detect state output threshold (0..255)
 *  - Exit Detect state if delta is below
 */
#define TOUCH_LINROT_DETECT_OUT_TH (15)

/** Linear/Rotary Re-Calibration threshold (0..255)
 *  - @warning The value is inverted in the sensor state machine
 *  - Enter Calibration state if delta is below
 */
#define TOUCH_LINROT_CALIB_TH (30)

/** Linear/Rotary Delta normalization (0=No, 1=Yes)
 * - When this parameter is set, a coefficient is applied on all Delta of all sensors
 *   in order to normalize them and to improve the position calculation.
 * - These coefficients must be defined in a constant table
 * - The MSB is the coefficient integer part, the LSB is the coefficient 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)
 */
#define TOUCH_LINROT_USE_NORMDELTA (0)

/**@} Common_Parameters_Thresholds_For_Linear_Rotary */

/** @defgroup Common_Parameters_Used_Linear_Rotary
  @{
*/

/** Select which Linear and Rotary sensors you use in your application.
 *  - 0 = Not Used
 *  - 1 = Used
 *
 *  LIN = Linear sensor
 *  ROT = Rotary sensor
 *  M1 = Mono electrodes design with 0/255 position at extremities of the sensor
 *  M2 = Mono electrodes design
 *  H = Half-ended electrodes design
 *  D = Dual electrodes design
 */
#define TOUCH_USE_3CH_LIN_M1 (1)
#define TOUCH_USE_3CH_LIN_M2 (1)
#define TOUCH_USE_3CH_LIN_H  (1)
#define TOUCH_USE_3CH_ROT_M  (1)

#define TOUCH_USE_4CH_LIN_M1 (1)
#define TOUCH_USE_4CH_LIN_M2 (1)
#define TOUCH_USE_4CH_LIN_H  (1)
#define TOUCH_USE_4CH_ROT_M  (1)

#define TOUCH_USE_5CH_LIN_M1 (1)
#define TOUCH_USE_5CH_LIN_M2 (1)
#define TOUCH_USE_5CH_LIN_H  (1)
#define TOUCH_USE_5CH_ROT_M  (1)
#define TOUCH_USE_5CH_ROT_D  (1)

#define TOUCH_USE_6CH_LIN_M1 (1)
#define TOUCH_USE_6CH_LIN_M2 (1)
#define TOUCH_USE_6CH_LIN_H  (1)
#define TOUCH_USE_6CH_ROT_M  (1)

/**@} Common_Parameters_Used_Linear_Rotary */

/** @defgroup Common_Parameters_Position_Linear_Rotary
  @{
*/

/** Position resolution in number of bits (1..8)
 *  - A Low value will result in a low resolution and will be less subject to noise.
 *  - A High value will result in a high resolution and will be more subject to noise.
 */
#define TOUCH_LINROT_RESOLUTION (7)

/** Direction change threshold in position unit (0..255)
 *  - Defines the default threshold used during the change direction process.
 *  - A Low value will result in a faster direction change.
 *  - A High value will result in a slower direction change.
 */
#define TOUCH_LINROT_DIR_CHG_POS (10)

/** Direction change debounce (0..63)
 *  - Defines the default integrator counter used during the change direction process.
 *  - This counter is decremented when the same change in the position is detected and the direction will
 *    change after this counter reaches zero.
 *  - A Low value will result in a faster direction change.
 *  - A High value will result in a slower direction change.
 */
#define TOUCH_LINROT_DIR_CHG_DEB (1)

/**@} Common_Parameters_Position_Linear_Rotary */

/** @defgroup Common_Parameters_Debounce_Counters
  @{
*/

/** Proximity state debounce in samples unit (0..63)
 *  - A Low value will result in a higher sensitivity during the Proximity detection but with less noise filtering.
 *  - A High value will result in improving the system noise immunity but will increase the system response time.
 */
#define TOUCH_DEBOUNCE_PROX (3)

/** Detect state debounce in samples unit (0..63)
 *  - A Low value will result in a higher sensitivity during the detection but with less noise filtering.
 *  - A High value will result in improving the system noise immunity but will increase the system response time.
 */
#define TOUCH_DEBOUNCE_DETECT (3)

/** Release state debounce in samples unit (0..63)
 *  - A Low value will result in a higher sensitivity during the end-detection but with less noise filtering.
 *  - A High value will result in a lower sensitivity during the end-detection but with more noise filtering.
 */
#define TOUCH_DEBOUNCE_RELEASE (3)

/** Re-calibration state debounce in samples unit (0..63)
 *  - A Low value will result in a higher sensitivity during the recalibration but with less noise filtering.
 *  - A High value will result in a lower sensitivity during the recalibration but with more noise filtering.
 */
#define TOUCH_DEBOUNCE_CALIB (3)

/** Error state debounce in samples unit (0..63)
 *  - A Low value will result in a higher sensitivity to enter in error state.
 *  - A High value will result in a lower sensitivity to enter in error state.
 */
#define TOUCH_DEBOUNCE_ERROR (3)

/**@} Common_Parameters_Debounce_Counters */

/** @defgroup Common_Parameters_Environment_Change_System (ECS)
  @{
*/

/** Environment Change System Different K factor (0..255)
 *  - The higher value is K, the faster is the response time.
 */
#define TOUCH_ECS_K_DIFFER (10)

/** Environment Change System Same K factor (0..255)
 *  - The higher value is K, the faster is the response time.
 */
#define TOUCH_ECS_K_SAME (20)

/** Environment Change System delay in msec (0..5000)
 *  - The ECS will be started after this delay and when all sensors are in Release state.
 */
#define TOUCH_ECS_DELAY (500)

/**@} Common_Parameters_Environment_Change_System */

/** @defgroup Common_Parameters_Detection_Time_Out (DTO)
  @{
*/

/** Detection Time Out delay in seconds (0..63)
 *  - Value 0: DTO processing not compiled in the code (to gain size if not used).
 *  - Value 1: Default time out infinite.
 *  - Value between 2 and 63: Default time out between value n-1 and n.
 *  - Examples:
 *      - With a DTO equal to 2, the time out is between 1s and 2s.
 *      - With a DTO equal to 63, the time out is between 62s and 63s.
 *
 *@note The DTO can be changed in run-time by the application only if the
 *      default value is between 1 and 63.
 */
#define TOUCH_DTO (0)

/**@} Common_Parameters_Detection_Time_Out */

/** @defgroup Common_Parameters_Detection_Exclusion_System (DXS)
  @{
*/

/** Detection Exclusion System (0=No, 1=Yes) */
#define TOUCH_USE_DXS (0)

/**@} Common_Parameters_Detection_Exclusion_System */

/** @defgroup Common_Parameters_Miscellaneous_Parameters
  @{
*/

/** Timing tick frequency in Hz (125, 250, 500, 1000, 2000)
 *  - Result to a timing interrupt respectively every 8ms, 4ms, 2ms, 1ms, 0.5ms
 */
#define TOUCH_TICK_FREQ (1000)

/** Delay for discharging Cx and Cs capacitors (0..65535)
 *  - The value corresponds to the Softdelay function parameter.
 *  -  500 gives around  53 delay whatever HCLK
 *  - 1000 gives around 106 delay whatever HCLK
 *  - 2000 gives around 210 delay whatever HCLK
 */
#define TOUCH_DELAY_DISCHARGE_ALL (1000)

/**@} Common_Parameters_Miscellaneous_Parameters */

/** @defgroup APM32A0xx_Parameters_GPIOs_Configuration
  @{
*/

/** TSC GPIOs Configuration selection (0..1)
 *  - 0: Manual. The TSC GPIOs configuration must be done by the application code.
 *  - 1: Automatic. The TOUCH_TSC_GROUPx_IOy parameters below must be filled up.
 *  The TSC GPIOs configuration is automatically done by the Touch driver.
 */
#define TOUCH_TSC_GPIO_CONFIG (1)

/* DO NOT CHANGE THESE VALUES */
/* These defines must be applied to the TOUCH_TSC_GROUPx_IOy parameters below */
#define NU      (0) /*!< Not Used IO */
#define CHANNEL (1) /*!< Channel IO */
#define SHIELD  (2) /*!< Shield IO (= Channel IO but not acquired) */
#define SAMPCAP (3) /*!< Sampling Capacitor IO */

/* If TOUCH_TSC_GPIO_CONFIG=0 these parameters are ignored */
/* If TOUCH_TSC_GPIO_CONFIG=1 assign each TOUCH_TSC_GROUPx_IOy parameters below */

#define TOUCH_TSC_GROUP1_IO1  SAMPCAP       /*!< PA0 */
#define TOUCH_TSC_GROUP1_IO2  CHANNEL       /*!< PA1 */
#define TOUCH_TSC_GROUP1_IO3  CHANNEL       /*!< PA2 */
#define TOUCH_TSC_GROUP1_IO4  NU            /*!< PA3 */

#define TOUCH_TSC_GROUP2_IO1  SAMPCAP       /*!< PA4 */
#define TOUCH_TSC_GROUP2_IO2  CHANNEL       /*!< PA5 */
#define TOUCH_TSC_GROUP2_IO3  CHANNEL       /*!< PA6 */
#define TOUCH_TSC_GROUP2_IO4  CHANNEL       /*!< PA7 */

#define TOUCH_TSC_GROUP3_IO1  SAMPCAP       /*!< PC5 */
#define TOUCH_TSC_GROUP3_IO2  NU            /*!< PB0 */
#define TOUCH_TSC_GROUP3_IO3  CHANNEL       /*!< PB1 */
#define TOUCH_TSC_GROUP3_IO4  CHANNEL       /*!< PB2 */

#define TOUCH_TSC_GROUP4_IO1  SAMPCAP       /*!< PA9 */
#define TOUCH_TSC_GROUP4_IO2  NU            /*!< PA10 */
#define TOUCH_TSC_GROUP4_IO3  CHANNEL       /*!< PA11 */
#define TOUCH_TSC_GROUP4_IO4  CHANNEL       /*!< PA12 */

#define TOUCH_TSC_GROUP5_IO1  NU            /*!< PB3 */
#define TOUCH_TSC_GROUP5_IO2  NU            /*!< PB4 */
#define TOUCH_TSC_GROUP5_IO3  NU            /*!< PB6 */
#define TOUCH_TSC_GROUP5_IO4  NU            /*!< PB7 */

#define TOUCH_TSC_GROUP6_IO1  SAMPCAP       /*!< PB11 */
#define TOUCH_TSC_GROUP6_IO2  NU            /*!< PB12 */
#define TOUCH_TSC_GROUP6_IO3  CHANNEL       /*!< PB13 */
#define TOUCH_TSC_GROUP6_IO4  CHANNEL       /*!< PB14 */

/* Warning: this group is available on some devices only */
#define TOUCH_TSC_GROUP7_IO1  NU       /*!< PE2 */
#define TOUCH_TSC_GROUP7_IO2  NU       /*!< PE3 */
#define TOUCH_TSC_GROUP7_IO3  NU       /*!< PE4 */
#define TOUCH_TSC_GROUP7_IO4  NU       /*!< PE5 */

/* Warning: this group is available on some devices only */
#define TOUCH_TSC_GROUP8_IO1  NU       /*!< PD12 */
#define TOUCH_TSC_GROUP8_IO2  NU       /*!< PD13 */
#define TOUCH_TSC_GROUP8_IO3  NU       /*!< PD14 */
#define TOUCH_TSC_GROUP8_IO4  NU       /*!< PD15 */

/**@} APM32A0xx_Parameters_GPIOs_Configuration */

/** @defgroup APM32A0xx_Parameters_Charge_Transfer_Pulses
  @{
*/

/** Charge Transfer Pulse High (0..15)
 *  - 0: 1 x tPGCLK
 *  - 1: 2 x tPGCLK
 *  - ...
 *  - 15: 16 x tPGCLK
 */
#define TOUCH_TSC_CTPHSEL (1)

/** Charge Transfer Pulse Low (0..15)
 *  - 0: 1 x tPGCLK
 *  - 1: 2 x tPGCLK
 *  - ...
 *  - 15: 16 x tPGCLK
 */
#define TOUCH_TSC_CTPLSEL (1)

/** Pulse Generator Clock Divide Factor Select (0..7)
 *  - 0: fPGCLK = fHCLK
 *  - 1: fPGCLK = fHCLK/2
 *  - ...
 *  - 7: fPGCLK = fHCLK/128
 */
#define TOUCH_TSC_PGCDFSEL (3)

/**@} APM32A0xx_Parameters_Charge_Transfer_Pulses */

/** @defgroup APM32A0xx_Parameters_GPIOs
  @{
*/

/** TSC IOs default mode when no on-going acquisition (0..1)
 *    - 0: Output push-pull low
 *    - 1: Input floating
 * @note To ensure a correct operation in noisy environment, this parameter should
 * be configured to output push-pull low.
 */
#define TOUCH_TSC_IODEF (0)

/** Acquisition Mode (0..1)
 *  - 0: Normal acquisition mode
 *  - 1: Synchronized acquisition mode
 */
#define TOUCH_TSC_AMCFG (0)

/** Synchronization Pin (0..1)
 *  - 0: PB8
 *  - 1: PB10
 */
#define TOUCH_TSC_SYNC_PIN (0)

/** Synchronization Polarity (0..1)
 *  - 0: Falling edge only
 *  - 1: Rising edge and high level
 */
#define TOUCH_TSC_SYNC_POL (0)

/**@} APM32A0xx_Parameters_GPIOs */

/** @addtogroup APM32A0xx_Parameters_Spread_Spectrum
  @{
*/

/* Use Spread Spectrum (0=No, 1=Yes) */
#define TOUCH_TSC_USE_SSEN (0)

/** Spread Spectrum Error Value Select (0..127)
 *  - 0: 1 x tSSCLK
 *  - 1: 2 x tSSCLK
 *  - ...
 *  - 127: 128 x tSSCLK
 */
#define TOUCH_TSC_SSERRVSEL (0)

/** Spread Spectrum Clock Divide Factor Select (0..1)
 *  - 0: fSSCLK = fHCLK
 *  - 1: fSSCLK = fHCLK/2
 */
#define TOUCH_TSC_SSCDFSEL (0)

/**@} APM32A0xx_Parameters_Spread_Spectrum */

/* Includes */
/* Must be placed last */
#include "tsc_check.h"

#ifdef __cplusplus
}
#endif

#endif /* __TSC_CONFIG_H */

/**@} end of group TSC_Config_Macros */

/** @defgroup TSC_Config_Enumerations Enumerations
  @{
*/

/**@} end of group TSC_Config_Enumerations */

/** @defgroup TSC_Config_Structures Structures
  @{
*/

/**@} end of group TSC_Config_Structures */

/** @defgroup TSC_Config_Variables Variables
  @{
*/

/**@} end of group TSC_Config_Variables */

/** @defgroup TSC_Config_Functions Functions
  @{
*/

/**@} end of group TSC_Config_Functions */
/**@} end of group TSC_Config_Driver */
/**@} end of group TSC_Driver_Library */
