#include "../include/hal_lksmcu_cmp.h"
#include "lks32mc09x.h"

/**
 *@brief ADC寄存器结构体句柄
 */
typedef struct
{
    volatile uint32_t IE;     ///< 0x00 比较器中断使能寄存器
    volatile uint32_t IF;     ///< 0x04 比较器中断标志寄存器
    volatile uint32_t TCLK;   ///< 0x08 比较器分频时钟控制寄存器
    volatile uint32_t CFG;    ///< 0x0C 比较器控制寄存器
    volatile uint32_t BLCWIN; ///< 0x10 比较器开窗控制寄存器
    volatile uint32_t DATA;   ///< 0x14 比较器输出数值寄存器
} CMP_TypeDef;
/**
 * @brief 模块复位
 * @param cmp_x 使用的CMP模块编号
 */
void HAL_CMP_Reset(HAL_CMP_x cmp_x)
{
    HAL_CMP_Disable(cmp_x);
}
/**
 * @brief 模块打开
 * @param cmp_x 使用的CMP模块编号
 */
void HAL_CMP_Enable(HAL_CMP_x cmp_x)
{
    // 系统寄存器解锁
    HAL_REG_SYS_UNLOCK();
    switch (cmp_x)
    {
        case HAL_CMP_0:
            HAL_REG_SET(SYS_AFE_REG5, BIT6);
            break;
        case HAL_CMP_1:
            HAL_REG_SET(SYS_AFE_REG5, BIT7);
            break;
        case HAL_CMP_2:
            HAL_REG_SET(SYS_AFE_REG5, BIT11);
            break;
        default:
            break;
    }
    HAL_REG_SET(SYS_CLK_FEN, BIT2);
    // 系统寄存器上锁
    HAL_REG_SYS_LOCK();
}
/**
 * @brief 模块关闭
 * @param cmp_x 使用的CMP模块编号
 */
void HAL_CMP_Disable(HAL_CMP_x cmp_x)
{
    // 系统寄存器解锁
    HAL_REG_SYS_UNLOCK();
    switch (cmp_x)
    {
        case HAL_CMP_0:
            HAL_REG_RESET(SYS_AFE_REG5, BIT6);
            break;
        case HAL_CMP_1:
            HAL_REG_RESET(SYS_AFE_REG5, BIT7);
            break;
        case HAL_CMP_2:
            HAL_REG_RESET(SYS_AFE_REG5, BIT11);
            break;
        default:
            break;
    }
    HAL_REG_IF_WRITE(SYS_CLK_FEN, BIT2, !(SYS_AFE_REG5 & (BIT6 | BIT7 | BIT11)));
    // 系统寄存器上锁
    HAL_REG_SYS_LOCK();
}
/**
 * @brief 模块关闭
 * @param cmp_x 使用的CMP模块编号
 * @param channel_p_x 正端通道
 * @param channel_n_x 负端通道
 */
void HAL_CMP_SetChannel(HAL_CMP_x cmp_x, HAL_CMP_CHANNEL_P_x channel_p_x, HAL_CMP_CHANNEL_N_x channel_n_x)
{
    switch (cmp_x)
    {
        case HAL_CMP_0:
            // 系统寄存器解锁
            HAL_REG_SYS_UNLOCK();
            switch (channel_p_x)
            {
                case HAL_CMP_CHANNEL_P_0: ///< CMP模块外部正端输入0
                    HAL_REG_WRITE_BIT(SYS_AFE_REG3, BIT8 | BIT9 | BIT10, 0 << 8);
                    break;
                case HAL_CMP_CHANNEL_P_1: ///< CMP模块外部正端输入1
                    HAL_REG_WRITE_BIT(SYS_AFE_REG3, BIT8 | BIT9 | BIT10, 4 << 8);
                    break;
                case HAL_CMP_CHANNEL_P_2: ///< CMP模块外部正端输入2
                    HAL_REG_WRITE_BIT(SYS_AFE_REG3, BIT8 | BIT9 | BIT10, 5 << 8);
                    break;
                case HAL_CMP_CHANNEL_P_3: ///< CMP模块外部正端输入3
                    HAL_REG_WRITE_BIT(SYS_AFE_REG3, BIT8 | BIT9 | BIT10, 6 << 8);
                    break;
                case HAL_CMP_CHANNEL_P_4: ///< CMP模块外部正端输入3
                    HAL_REG_WRITE_BIT(SYS_AFE_REG3, BIT8 | BIT9 | BIT10, 7 << 8);
                    break;
                default:
                    break;
            }
            HAL_REG_WRITE_BIT(SYS_AFE_REG3, BIT2 | BIT3, channel_n_x << 2);
            // 系统寄存器上锁
            HAL_REG_SYS_LOCK();
            break;
        case HAL_CMP_1:
            // 系统寄存器解锁
            HAL_REG_SYS_UNLOCK();
            switch (channel_p_x)
            {
                case HAL_CMP_CHANNEL_P_0: ///< CMP模块外部正端输入0
                    HAL_REG_WRITE_BIT(SYS_AFE_REG3, BIT12 | BIT13 | BIT14, 0 << 12);
                    break;
                case HAL_CMP_CHANNEL_P_1: ///< CMP模块外部正端输入1
                    HAL_REG_WRITE_BIT(SYS_AFE_REG3, BIT12 | BIT13 | BIT14, 4 << 12);
                    break;
                case HAL_CMP_CHANNEL_P_2: ///< CMP模块外部正端输入2
                    HAL_REG_WRITE_BIT(SYS_AFE_REG3, BIT12 | BIT13 | BIT14, 5 << 12);
                    break;
                case HAL_CMP_CHANNEL_P_3: ///< CMP模块外部正端输入3
                    HAL_REG_WRITE_BIT(SYS_AFE_REG3, BIT12 | BIT13 | BIT14, 6 << 12);
                    break;
                default:
                    break;
            }
            HAL_REG_WRITE_BIT(SYS_AFE_REG3, BIT4 | BIT5, channel_n_x << 4);
            // 系统寄存器上锁
            HAL_REG_SYS_LOCK();
            break;
        default:
            break;
    }
}
