//
// Created by dell on 24-12-3.
//

#ifndef LDC1612_H
#define LDC1612_H

#include "gd32e23x_it.h"
#include "gd32e23x.h"
#include "systick.h"
#include <stdbool.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include "board_config.h"
#include "i2c.h"

/***************************************************************************/

/* IIC Interface Selection */
#ifdef SOFTWARE_IIC
    #define LDC1612_IIC_WRITE_16BITS(addr, reg, data)    soft_i2c_write_16bits(addr, reg, data)
    #define LDC1612_IIC_READ_16BITS(addr, reg, data)     soft_i2c_read_16bits(addr, reg, data)
    #define LDC1612_IIC_TYPE_STR                         "Software IIC"
#else
    #define LDC1612_IIC_WRITE_16BITS(addr, reg, data)    i2c_write_16bits(addr, reg, data)
    #define LDC1612_IIC_READ_16BITS(addr, reg, data)     i2c_read_16bits(addr, reg, data)
    #define LDC1612_IIC_TYPE_STR                         "Hardware IIC"
#endif

/* >>>>>>>>>>>>>>>>>>>>>>>>>>>>[EXT CLK(MHz)]<<<<<<<<<<<<<<<<<<<< */

#define LDC1612_EXT_CLK_MHZ  40

/***************************************************************************/

#define LDC1612_ADDR         (0x2B)

/******************************************************************************/

#define COIL_L_UH                40.9
#define COIL_C_PF                180

/************************Register Addr***************************************/

#define CONVERSION_RESULT_REG_START             0X00
#define SET_CONVERSION_TIME_REG_START           0X08
#define SET_CONVERSION_OFFSET_REG_START         0X0C
#define SET_SETTLECOUNT_REG_START               0X10
#define SET_FREQ_REG_START                      0X14
#define SENSOR_STATUS_REG                       0X18
#define ERROR_CONFIG_REG                        0X19
#define SENSOR_CONFIG_REG                       0X1A
#define MUX_CONFIG_REG                          0X1B
#define SENSOR_RESET_REG                        0X1C
#define SET_DRIVER_CURRENT_REG                  0X1E
#define READ_MANUFACTURER_ID                    0X7E
#define READ_DEVICE_ID                          0X7F

/**********************Sensor Channel****************************************/

#define CHANNEL_0  0
#define CHANNEL_1  1

/**************************DATA (0x00-0x03)*******************************************/
/*
 * 作用: 存储28位的传感器转换结果。结果分为高字节(MSB)和低字节(LSB)两个寄存器。
 *
 * 结构说明:
 * - DATA_CHx_MSB: 包含错误标志和数据的高12位 [27:16]。
 * - DATA_CHx_LSB: 包含数据的低16位 [15:0]。
 *
 * MSB寄存器位域:
 * [15] ERR_UR: 转换下溢错误标志 (1 = 发生错误)
 * [14] ERR_OR: 转换上溢错误标志 (1 = 发生错误)
 * [13] ERR_WD: 看门狗超时错误标志 (1 = 发生错误)
 * [12] ERR_AE: 振幅错误标志 (高或低) (1 = 发生错误)
 * [11:0] DATA[27:16]: 数据的高12位
 *
 * 注意:
 * - 仅当ERROR_CONFIG寄存器中对应的ERR2OUT位置1时，这些错误标志才会在MSB寄存器中被设置。
 * - 读取数据时，应先读取LSB，再读取MSB，以确保数据的一致性。
*/

/* --- 数据寄存器错误标志位掩码 --- */
#define LDC1612_DATA_ERR_UR                 (1 << 15)
#define LDC1612_DATA_ERR_OR                 (1 << 14)
#define LDC1612_DATA_ERR_WD                 (1 << 13)
#define LDC1612_DATA_ERR_AE                 (1 << 12)
#define LDC1612_DATA_ERR_MASK               (0xF000)
#define LDC1612_DATA_MSB_MASK               (0x0FFF)

/**************************RCOUNT (0x08, 0x09)****************************************/
/*
 * 作用: 设置参考计数器值，决定了传感器的转换时间，从而影响测量分辨率。
 *
 * 位域说明:
 * [15:0] RCOUNT: 参考计数值。
 *
 * 计算公式:
 * t_CONVERSION = (RCOUNT * 16) / f_REF
 *
 * 注意:
 * - RCOUNT值必须 ≥ 0x0004。
 * - 该寄存器在复位后值为 0x0080。
 *
 * 配置建议:
 * - 需要高采样率: 使用较小的RCOUNT值。
 * - 需要高分辨率: 使用较大的RCOUNT值。
*/

/* --- 预设配置示例 --- */
// 高速采样配置 (分辨率较低)
#define LDC1612_RCOUNT_HIGH_SPEED           (0x04D6) // 1238, 约 1kSPS @ 40MHz/2

// 平衡配置 (常用)
#define LDC1612_RCOUNT_BALANCED             (0x1000) // 4096, 约 380SPS @ 40MHz/2

// 高分辨率配置 (采样率较低)
#define LDC1612_RCOUNT_HIGH_RESOLUTION      (0xFFFF) // 65535, 约 24SPS @ 40MHz/2

// 默认配置
#define LDC1612_RCOUNT_TIME_CH0     LDC1612_RCOUNT_BALANCED // 0x1000=4096个时钟周期

/**************************OFFSET (0x0C, 0x0D)****************************************/
/*
 * 作用: 设置一个16位的数字偏移量，该值会从原始转换结果中减去。
 *
 * 位域说明:
 * [15:0] OFFSET: 数据偏移值。
 *
 * 计算公式:
 * 最终数据 = 原始转换数据 - OFFSET
 *
 * 注意:
 * - 如果减法结果为负，将触发下溢错误 (ERR_UR)。
 * - 该寄存器在复位后值为 0x0000。
 *
 * 应用场景:
 * - 消除传感器或环境的固有基线偏移。
 * - 实现“去皮”(Tare)功能，将当前读数设为新的零点。
*/

// 默认配置: 不设置偏移
#define SET_CONVERSION_OFFSET_CH0          0x0000 

/**************************SETTLECOUNT (0x10, 0x11)***********************************/
/*
 * 作用: 设置传感器振荡器在开始转换前所需的建立时间。
 *
 * 位域说明:
 * [15:0] SETTLECOUNT: 建立时间计数值。
 *
 * 计算公式:
 * t_SETTLE 的计算方式取决于SETTLECOUNT的值：
 * - 当 SETTLECOUNT = 0x0000 或 0x0001 时, t_SETTLE = 32 / f_REF
 * - 当 SETTLECOUNT ≥ 0x0002 时, t_SETTLE = (SETTLECOUNT * 16) / f_REF
 *
 * 配置建议:
 * - 传感器的Q值越高，所需的建立时间越短 (SETTLECOUNT值可以越小)。
 * - 值过小可能导致传感器未充分稳定，数据不准确。
 * - 值过大则会不必要地增加总转换时间，降低采样率。
 * - 对于大多数应用，0x0100 (256) 是一个很好的起始值。
*/

/* --- 预设配置示例 --- */
// 适用于高Q值传感器 (建立时间短)
#define LDC1612_SETTLECOUNT_HIGH_Q          (0x000A) // 约 4µs @ 40MHz/2

// 适用于中等Q值传感器 (通用)
#define LDC1612_SETTLECOUNT_MEDIUM_Q        (0x0100) // 约 102µs @ 40MHz/2

// 适用于低Q值传感器 (建立时间长)
#define LDC1612_SETTLECOUNT_LOW_Q           (0x0400) // 约 410µs @ 40MHz/2

// 默认配置
#define LDC1612_SETTLECOUNT_CH0    LDC1612_SETTLECOUNT_MEDIUM_Q

/**************************CLOCK_DIVIDER (0x14, 0x15)***********************************/
/*
 * 作用: 配置传感器输入频率(f_sensor)和参考时钟(f_ref)的分频器。
 *
 * 位域说明:
 * [15:12] FIN_DIVIDER:  传感器输入分频器。
 * [11:10] RESERVED:     必须为00。
 * [9:0]   FREF_DIVIDER: 参考时钟分频器。
 *
 * 配置逻辑:
 * 1. FIN_DIVIDER: 根据传感器的谐振频率 f_sensor 选择。
 *    - 目标是使 f_sensor / FIN_DIVIDER <= 8.75MHz。
 *    - 例如: 如果 f_sensor = 15MHz, 则 FIN_DIVIDER 必须 >= 2。
 *
 * 2. FREF_DIVIDER: 根据外部时钟 f_clk 和工作模式选择。
 *    - 目标是使 f_ref = f_clk / FREF_DIVIDER。
 *    - 单通道模式且 f_clk <= 35MHz: FREF_DIVIDER = 1。
 *    - 双通道模式或 f_clk > 35MHz: FREF_DIVIDER = 2。
 *
 * 最终寄存器值 = (FIN_DIVIDER << 12) | FREF_DIVIDER;
*/

/* --- 位域选项宏 --- */
// [15:12] Sensor Input Divider (FIN_DIVIDER)
#define LDC1612_FIN_DIV_1                   (0x1 << 12) // for f_sensor <= 8.75MHz
#define LDC1612_FIN_DIV_2                   (0x2 << 12) // for 8.75MHz < f_sensor <= 17.5MHz
#define LDC1612_FIN_DIV_4                   (0x3 << 12) // for 17.5MHz < f_sensor <= 35MHz

// [9:0] Reference Clock Divider (FREF_DIVIDER)
#define LDC1612_FREF_DIV_1                  (0x001)
#define LDC1612_FREF_DIV_2                  (0x002)

/* --- 组合宏 --- */
#define LDC1612_CLOCK_DIVIDER_GEN(fin_div, fref_div) ((fin_div) | (fref_div))

/* --- 预设配置示例 (基于40MHz外部时钟) --- */
// 适用于 f_sensor <= 8.75MHz
#define LDC1612_CLOCK_DIVIDER_DEFAULT       LDC1612_CLOCK_DIVIDER_GEN(LDC1612_FIN_DIV_1, LDC1612_FREF_DIV_2) // 0x1002


/**************************STATUS (0x18) MACROS****************************************
 *
 * 作用: 定义STATUS寄存器的位掩码，用于解析设备状态。
 *
*/
#define LDC1612_STATUS_DRDY              (1 << 6)  // 数据就绪
#define LDC1612_STATUS_UNREAD_CH0        (1 << 3)  // 通道0有未读数据
#define LDC1612_STATUS_UNREAD_CH1        (1 << 2)  // 通道1有未读数据

#define LDC1612_STATUS_ERR_ZC            (1 << 8)  // 零计数错误
#define LDC1612_STATUS_ERR_ALE           (1 << 9)  // 振幅过低
#define LDC1612_STATUS_ERR_AHE           (1 << 10) // 振幅过高
#define LDC1612_STATUS_ERR_WD            (1 << 11) // 看门狗超时
#define LDC1612_STATUS_ERR_OR            (1 << 12) // 转换上溢
#define LDC1612_STATUS_ERR_UR            (1 << 13) // 转换下溢
#define LDC1612_STATUS_ERR_CHAN_MASK     (3 << 14) // 错误通道掩码

/**************************ERROR_CONFIG (0x19)****************************************/
/*
 * 作用: 配置状态或错误输出或者触发INTB引脚中断。
 *
 * 位域说明:
 * [15] UR_ERR2OUT:         1 = 转换下溢错误输出到DATA_CHx寄存器
 * [14] OR_ERR2OUT:         1 = 转换上溢错误输出到DATA_CHx寄存器
 * [13] WD_ERR2OUT:         1 = 看门狗超时错误输出到DATA_CHx寄存器
 * [12] AH_ERR2OUT:         1 = 振幅过高错误输出到DATA_CHx寄存器
 * [11] AL_ERR2OUT:         1 = 振幅过低错误输出到DATA_CHx寄存器
 * [10:8] RESERVED
 * [7]  UR_ERR2INT:         1 = 转换下溢错误触发INTB
 * [6]  OR_ERR2INT:         1 = 转换上溢错误触发INTB
 * [5]  WD_ERR2INT:         1 = 看门狗超时错误触发INTB
 * [4]  AH_ERR2INT:         1 = 振幅过高错误触发INTB
 * [3]  AL_ERR2INT:         1 = 振幅过低错误触发INTB
 * [2]  ZC_ERR2INT:         1 = 零计数错误触发INTB
 * [1]  RESERVED
 * [0]  DRDY_2INT:          1 = 数据就绪标志触发INTB
*/

/* --- 位域选项宏 --- */

// --- 中断触发 (ERR2INT) ---
#define LDC1612_ERR_CFG_DRDY_INT_EN         (1 << 0)  // 数据就绪中断使能
#define LDC1612_ERR_CFG_ZC_INT_EN           (1 << 2)  // 零计数错误中断使能
#define LDC1612_ERR_CFG_AL_INT_EN           (1 << 3)  // 振幅过低错误中断使能
#define LDC1612_ERR_CFG_AH_INT_EN           (1 << 4)  // 振幅过高错误中断使能
#define LDC1612_ERR_CFG_WD_INT_EN           (1 << 5)  // 看门狗超时中断使能
#define LDC1612_ERR_CFG_OR_INT_EN           (1 << 6)  // 转换上溢中断使能
#define LDC1612_ERR_CFG_UR_INT_EN           (1 << 7)  // 转换下溢中断使能

// --- 错误报告至数据寄存器 (ERR2OUT) ---
#define LDC1612_ERR_CFG_AL_OUT_EN           (1 << 11) // 振幅过低错误报告使能
#define LDC1612_ERR_CFG_AH_OUT_EN           (1 << 12) // 振幅过高错误报告使能
#define LDC1612_ERR_CFG_WD_OUT_EN           (1 << 13) // 看门狗超时错误报告使能
#define LDC1612_ERR_CFG_OR_OUT_EN           (1 << 14) // 转换上溢错误报告使能
#define LDC1612_ERR_CFG_UR_OUT_EN           (1 << 15) // 转换下溢错误报告使能

// 常用配置: 仅使能 "数据就绪" 中断
#define LDC1612_ERROR_CONFIG_DRDY_ONLY      (LDC1612_ERR_CFG_DRDY_INT_EN) // 结果: 0x0001

// 常用配置: 使能所有错误报告
#define LDC1612_ERROR_CONFIG_OUT_ONLY       (LDC1612_ERR_CFG_AL_OUT_EN   | \
                                             LDC1612_ERR_CFG_AH_OUT_EN   | \
                                             LDC1612_ERR_CFG_WD_OUT_EN   | \
                                             LDC1612_ERR_CFG_OR_OUT_EN   | \
                                             LDC1612_ERR_CFG_UR_OUT_EN) // 结果: 0xF800

// 调试配置: 使能所有错误中断和错误报告
#define LDC1612_ERROR_CONFIG_DEBUG_ALL      (LDC1612_ERR_CFG_DRDY_INT_EN | \
                                             LDC1612_ERR_CFG_ZC_INT_EN   | \
                                             LDC1612_ERR_CFG_AL_INT_EN   | \
                                             LDC1612_ERR_CFG_AH_INT_EN   | \
                                             LDC1612_ERR_CFG_WD_INT_EN   | \
                                             LDC1612_ERR_CFG_OR_INT_EN   | \
                                             LDC1612_ERR_CFG_UR_INT_EN   | \
                                             LDC1612_ERR_CFG_AL_OUT_EN   | \
                                             LDC1612_ERR_CFG_AH_OUT_EN   | \
                                             LDC1612_ERR_CFG_WD_OUT_EN   | \
                                             LDC1612_ERR_CFG_OR_OUT_EN   | \
                                             LDC1612_ERR_CFG_UR_OUT_EN) // 结果: 0xF8FD

// 默认配置: 所有功能都禁用
#define LDC1612_ERROR_CONFIG_DEFAULT        (0x0000)

/**************************SENSOR_CONFIG (0x1A) MACROS***************************************/
/*
 * CONFIG寄存器位域宏定义，用于灵活组合生成配置值。
 * 使用方法: LDC1612_CONFIG_GEN(ACTIVE_CHAN, SLEEP_MODE, RP_OVERRIDE, AUTO_AMP, CLK_SRC, INTB, CURRENT_DRV)
 *
 * 位域说明 (根据 LDC1612_REG_LIST.md):
 * [15:14] ACTIVE_CHAN:      激活通道选择 (仅在 AUTOSCAN_EN=0 时有效)
 * [13]    SLEEP_MODE_EN:    1 = 睡眠模式使能
 * [12]    RP_OVERRIDE_EN:   1 = 禁用自动校准 (使用手动的IDRIVE设置)
 * [11]    SENSOR_ACTIVATE_SEL: 传感器激活电流选择 (0:低电流, 1:高电流)
 * [10]    AUTO_AMP_DIS:     1 = 禁用自动幅度校正
 * [9]     REF_CLK_SRC:      1 = 使用外部CLKIN时钟
 * [8]     RESERVED:         必须为0
 * [7]     INTB_DIS:         1 = 禁用INTB中断引脚
 * [6]     HIGH_CURRENT_DRV: 1 = 通道0高电流驱动模式
 * [5:0]   RESERVED:         必须写入 0x01
*/

/* --- 位域选项宏 --- */
// [15:14] Active Channel Selection
#define LDC1612_CONFIG_ACTIVE_CHAN_CH0      (0x00 << 14)
#define LDC1612_CONFIG_ACTIVE_CHAN_CH1      (0x01 << 14)

// [13] Sleep Mode Enable
#define LDC1612_CONFIG_SLEEP_MODE_DISABLE   (0x00 << 13)
#define LDC1612_CONFIG_SLEEP_MODE_ENABLE    (0x01 << 13)

// [12] RP Override Enable (Auto-Calibration Disable)
#define LDC1612_CONFIG_RP_OVERRIDE_DISABLE  (0x00 << 12) // 启用自动校准
#define LDC1612_CONFIG_RP_OVERRIDE_ENABLE   (0x01 << 12) // 禁用自动校准

// [11] Sensor Activation Current Selection
#define LDC1612_CONFIG_SENSOR_ACT_LOW_I     (0x00 << 11) // 低电流激活
#define LDC1612_CONFIG_SENSOR_ACT_HIGH_I    (0x01 << 11) // 高电流激活

// [10] Auto Amplitude Correction Disable
#define LDC1612_CONFIG_AUTO_AMP_ENABLE      (0x00 << 10) // 启用自动幅度校正
#define LDC1612_CONFIG_AUTO_AMP_DISABLE     (0x01 << 10) // 禁用自动幅度校正

// [9] Reference Clock Source
#define LDC1612_CONFIG_CLK_SRC_INTERNAL     (0x00 << 9)
#define LDC1612_CONFIG_CLK_SRC_EXTERNAL     (0x01 << 9)

// [7] INTB Pin Disable
#define LDC1612_CONFIG_INTB_ENABLE          (0x00 << 7)
#define LDC1612_CONFIG_INTB_DISABLE         (0x01 << 7)

// [6] High Current Drive (Channel 0)
#define LDC1612_CONFIG_HIGH_CURRENT_DISABLE (0x00 << 6)
#define LDC1612_CONFIG_HIGH_CURRENT_ENABLE  (0x01 << 6)

/* --- 组合宏 --- */
// 将所有位域组合成一个16位值。注意，保留位0x01被固定添加。
#define LDC1612_CONFIG_GEN(active_chan, sleep, rp_override, sensor_act, auto_amp, clk_src, intb, high_current) \
    ( (active_chan) | (sleep) | (rp_override) | (sensor_act) | (auto_amp) | (clk_src) | (intb) | (high_current) | 0x0001 )

/* --- 预设配置示例 --- */
// CH0连续转换, 外部时钟, 高驱动电流, 禁用自动幅度修正(适用于电流检测)
#define LDC1612_SENSOR_CONFIG_CH0       LDC1612_CONFIG_GEN( \
                                            LDC1612_CONFIG_ACTIVE_CHAN_CH0, \
                                            LDC1612_CONFIG_SLEEP_MODE_DISABLE, \
                                            LDC1612_CONFIG_RP_OVERRIDE_ENABLE, /* Rp覆盖开启 */ \
                                            LDC1612_CONFIG_SENSOR_ACT_LOW_I, /* 低功耗启动 */ \
                                            LDC1612_CONFIG_AUTO_AMP_DISABLE, /* 禁用自动幅度校正 */ \
                                            LDC1612_CONFIG_CLK_SRC_EXTERNAL, /* 外部时钟 */ \
                                            LDC1612_CONFIG_INTB_ENABLE, /* 启用INTB引脚 */ \
                                            LDC1612_CONFIG_HIGH_CURRENT_ENABLE /* 大电流模式 */ ) // 结果: 0x1641
                                            // TODO 对比1601的不同(大电流与标准电流)

// 睡眠模式, 外部时钟
#define LDC1612_SLEEP_MODE              LDC1612_CONFIG_GEN( \
                                            LDC1612_CONFIG_ACTIVE_CHAN_CH0, \
                                            LDC1612_CONFIG_SLEEP_MODE_ENABLE, \
                                            LDC1612_CONFIG_RP_OVERRIDE_DISABLE, \
                                            LDC1612_CONFIG_SENSOR_ACT_HIGH_I, \
                                            LDC1612_CONFIG_AUTO_AMP_ENABLE, \
                                            LDC1612_CONFIG_CLK_SRC_INTERNAL, \
                                            LDC1612_CONFIG_INTB_ENABLE, \
                                            LDC1612_CONFIG_HIGH_CURRENT_DISABLE ) // 结果: 0x2801

/*************************MUX_CONFIG (0x1B) MACROS***************************************/
/*
 * MUX_CONFIG寄存器位域宏定义，用于灵活组合生成配置值。
 *
 * 位域说明:
 * [15]    AUTOSCAN_EN: 1 = 自动顺序扫描模式使能
 * [14:13] RR_SEQUENCE: 扫描序列 (00: CH0, CH1)
 * [12:3]  RESERVED:    必须写入 0x041
 * [2:0]   DEGLITCH:    输入消抖滤波器带宽
*/
/* --- 位域选项宏 --- */
// [15] Auto Scan Mode
#define LDC1612_MUX_AUTOSCAN_DISABLE        (0x00 << 15) // 单通道连续模式
#define LDC1612_MUX_AUTOSCAN_ENABLE         (0x01 << 15) // 自动扫描模式

// [14:13] Round Robin Sequence
#define LDC1612_MUX_RR_SEQ_CH0_CH1          (0x00 << 13) // 扫描 CH0, CH1

// [2:0] Deglitch Filter Bandwidth
#define LDC1612_MUX_DEGLITCH_1MHZ           (0x01)
#define LDC1612_MUX_DEGLITCH_3_3MHZ         (0x04)
#define LDC1612_MUX_DEGLITCH_10MHZ          (0x05)
#define LDC1612_MUX_DEGLITCH_33MHZ          (0x07)

/* --- 组合宏 --- */
// 将所有位域组合成一个16位值。注意，保留位0x0208 (0x041 << 3)被固定添加。
#define LDC1612_MUX_CONFIG_GEN(autoscan, sequence, deglitch) \
    ( (autoscan) | (sequence) | (deglitch) | 0x0208 )

/* --- 预设配置示例 --- */
// 单通道模式, 3.3MHz 滤波
#define LDC1612_MUX_CONFIG                  LDC1612_MUX_CONFIG_GEN( \
                                                LDC1612_MUX_AUTOSCAN_DISABLE, \
                                                LDC1612_MUX_RR_SEQ_CH0_CH1, /* 此模式下无效，但保持定义 */ \
                                                LDC1612_MUX_DEGLITCH_3_3MHZ ) // 0x020C

/***********************RESET DEVICE (0x1C)***********************************/
/*
 * 向RESET_DEV寄存器写入 LDC1612_RESET_CMD 会触发软件复位。
 * 复位后，所有寄存器将恢复为默认值，设备进入睡眠模式。
 * 需要大约10ms的稳定时间后才能重新配置。
*/
#define LDC1612_RESET_DEV                  0x8000

/**************************DRIVE_CURRENT (0x1E, 0x1F)****************************************/
/*
 * 作用: 设置传感器的驱动电流，以确保振荡幅度(Vosc)在1.2V到1.8V之间。
 *
 * 位域说明:
 * [15:11] IDRIVE:      当前驱动电流设置值 (0-31)。
 * [10:6]  INIT_IDRIVE: 初始驱动电流设置值 (0-31)。
 * [5:0]   RESERVED:    必须为0。
 *
 * 配置建议:
 * 1. 初始阶段可启用自动校准 (CONFIG.RP_OVERRIDE_EN = 0)，让芯片自动寻找合适的IDRIVE值。
 * 2. 读取DRIVE_CURRENT寄存器，获得自动校准后的IDRIVE值。
 * 3. 在最终代码中，禁用自动校准 (CONFIG.RP_OVERRIDE_EN = 1)，并手动写入这个调试好的IDRIVE值。
 * 
 * CH_INIT_IDRIVE will update when every conversion systick ==>AutoAmpDis is 0
 * CH_INIT_IDRIVE will store init drive current calculated ==> AutoAmpDis is 1
*/

/* --- 驱动电流值生成宏 --- */
// 参数 idrive: 0-31之间的整数
#define LDC1612_DRIVE_CURRENT_GEN(idrive)   ( (uint16_t)(idrive) << 11 )

#define LDC1612_DRIVE_CURRENT              LDC1612_DRIVE_CURRENT_GEN(18) // 0x9000

/**************************IDs (Read Only 0x7E 0x7F)***********************************/

#define LDC1612_MANUFACTURER_ID            0x5449
#define LDC1612_DEVICE_ID                  0x3055

/******************************************************************************/

typedef enum {
    LDC1612_STATUS_SUCCESS = 0,
    LDC1612_STATUS_ERROR,
    LDC1612_STATUS_TIMEOUT,
    LDC1612_STATUS_INVALID_PARAM,
    LDC1612_STATUS_NO_COIL,
    LDC1612_STATUS_UNDER_RANGE,
    LDC1612_STATUS_OVER_RANGE
} ldc1612_status_t;

/******************************************************************************/
ldc1612_status_t ldc1612_init(void);

ldc1612_status_t ldc1612_reset_sensor(void);

ldc1612_status_t ldc1612_config_single_channel(uint8_t channel);

uint16_t ldc1612_get_manufacturer_id(void);

uint16_t ldc1612_get_deveice_id(void);

uint32_t ldc1612_get_raw_channel_result(uint8_t channel);

void ldc1612_drvie_current_detect(uint8_t channel);

uint16_t ldc1612_get_sensor_status(void);

bool ldc1612_is_data_ready(uint8_t channel);

uint16_t ldc1612_check_status_and_log_errors(void);

#endif //LDC1612_H
