#include "../include/hal_lksmcu_opa.h"
#include "lks32mc09x_user_manual.h"
#include "../include/hal_lksmcu_reg.h"
#include "../include/hal_lks32mc09x_reg.h"
#include "lks32mc09x.h"

// 模块复位
void HAL_OPA_Reset(HAL_OPA_x opa_x)
{
    (void)opa_x;
}
// 模块打开
void HAL_OPA_Enable(HAL_OPA_x opa_x)
{
    // 系统寄存器解锁
    HAL_REG_SYS_UNLOCK();
    switch (opa_x)
    {
        case HAL_OPA_0:
            HAL_REG_SET(SYS_AFE_REG1, SYS_AFE_REG1_OPA0PDN_BIT);
            break;
        case HAL_OPA_1:
            HAL_REG_SET(SYS_AFE_REG1, SYS_AFE_REG1_OPA1PDN_BIT);
            break;
        case HAL_OPA_2:
            HAL_REG_SET(SYS_AFE_REG1, SYS_AFE_REG1_OPA2PDN_BIT);
            break;
        case HAL_OPA_3:
            HAL_REG_SET(SYS_AFE_REG1, SYS_AFE_REG1_OPA3PDN_BIT);
            break;
        default:
            break;
    }
    // 系统寄存器上锁
    HAL_REG_SYS_LOCK();
}
// 模块关闭
void HAL_OPA_Disable(HAL_OPA_x opa_x)
{
    // 系统寄存器解锁
    HAL_REG_SYS_UNLOCK();
    switch (opa_x)
    {
        case HAL_OPA_0:
            HAL_REG_RESET(SYS_AFE_REG1, SYS_AFE_REG1_OPA0PDN_BIT);
            break;
        case HAL_OPA_1:
            HAL_REG_RESET(SYS_AFE_REG1, SYS_AFE_REG1_OPA1PDN_BIT);
            break;
        case HAL_OPA_2:
            HAL_REG_RESET(SYS_AFE_REG1, SYS_AFE_REG1_OPA2PDN_BIT);
            break;
        case HAL_OPA_3:
            HAL_REG_RESET(SYS_AFE_REG1, SYS_AFE_REG1_OPA3PDN_BIT);
            break;
        default:
            break;
    }
    // 系统寄存器上锁
    HAL_REG_SYS_LOCK();
}
// 设置增益
void HAL_OPA_SetGain(HAL_OPA_x opa_x, HAL_OPA_GAIN_x gain_x)
{
    // 系统寄存器解锁
    HAL_REG_SYS_UNLOCK();
    switch (opa_x)
    {
        case HAL_OPA_0:
            HAL_REG_WRITE_BIT_MASK_POS(SYS_AFE_REG0, SYS_AFE_REG0_RES_OPA0, gain_x);
            break;
        case HAL_OPA_1:
            HAL_REG_WRITE_BIT_MASK_POS(SYS_AFE_REG0, SYS_AFE_REG0_RES_OPA1, gain_x);
            break;
        case HAL_OPA_2:
            HAL_REG_WRITE_BIT_MASK_POS(SYS_AFE_REG0, SYS_AFE_REG0_RES_OPA2, gain_x);
            break;
        case HAL_OPA_3:
            HAL_REG_WRITE_BIT_MASK_POS(SYS_AFE_REG0, SYS_AFE_REG0_RES_OPA3, gain_x);
            break;
        default:
            break;
    }
    // 系统寄存器上锁
    HAL_REG_SYS_LOCK();
}

/**
 * @brief OPA输出到IO
 * @param opa_x 运放序号
 */
void HAL_OPA_Out2GpioEnable(HAL_OPA_x opa_x)
{
    /**
    使能_OPAx输出信号送至IO口,或使能OPAx_OUT输出信号送至CMP。
        0000:不输出到IO,输出OPA0_OUT正端到OPA_OUT_CMP;
        0001:不输出到IO,输出OPA1_OUT正端到OPA_OUT_CMP;
        0010:不输出到IO,输出OPA2_OUT正端到OPA_OUT_CMP;
        0011:不输出到IO,输出OPA3_OUT正端到OPA_OUT_CMP;
        0100:不输出到IO,输出OPA0_OUT负端到OPA_OUT_CMP;
        0101:不输出到IO,输出OPA1_OUT负端到OPA_OUT_CMP;
        0110:不输出到IO,输出OPA2_OUT负端到OPA_OUT_CMP;
        0111:不输出到IO,输出OPA3_OUT负端到OPA_OUT_CMP;
        1000:输出OPA0_OUT正端到IO P2.7口,同时输出OPA0_OUT正端到OPA_OUT_CMP;
        1001:输出OPA1_OUT正端到IO P2.7口,同时输出OPA1_OUT正端到OPA_OUT_CMP;
        1010:输出OPA2_OUT正端到IO P2.7口,同时输出OPA2_OUT正端到OPA_OUT_CMP;
        1011:输出OPA3_OUT正端到IO P2.7口,同时输出OPA3_OUT正端到OPA_OUT_CMP;
        1100:输出OPA0_OUT负端到IO P2.7口,同时输出OPA0_OUT负端到OPA_OUT_CMP;
        1101:输出OPA1_OUT负端到IO P2.7口,同时输出OPA1_OUT负端到OPA_OUT_CMP;
        1110:输出OPA2_OUT负端到IO P2.7口,同时输出OPA2_OUT负端到OPA_OUT_CMP;
        1111:输出OPA3_OUT负端到IO P2.7口,同时输出OPA3_OUT负端到OPA_OUT_CMP; 即OPAOUT_EN[3]控制是否将OPAx输出到IO,OPAOUT_EN[2:0]选择OPAx 输出到OPA_OUT_CMP
    */
    HAL_REG_SYS_UNLOCK();
    switch (opa_x)
    {
        case HAL_OPA_0:
            HAL_REG_WRITE_BIT_MASK_POS(SYS_AFE_REG2, SYS_AFE_REG2_OPAOUT_EN, 8);
            break;
        case HAL_OPA_1:
            HAL_REG_WRITE_BIT_MASK_POS(SYS_AFE_REG2, SYS_AFE_REG2_OPAOUT_EN, 9);
            break;
        case HAL_OPA_2:
            HAL_REG_WRITE_BIT_MASK_POS(SYS_AFE_REG2, SYS_AFE_REG2_OPAOUT_EN, 10);
            break;
        case HAL_OPA_3:
            HAL_REG_WRITE_BIT_MASK_POS(SYS_AFE_REG2, SYS_AFE_REG2_OPAOUT_EN, 11);
            break;
        default:
            break;
    }
    HAL_REG_SYS_LOCK();
}
/**
 * @brief OPA停止输出到IO
 * @param opa_x 运放序号
 */
void HAL_OPA_Out2GpioDisable(HAL_OPA_x opa_x)
{
    (void)opa_x;
    /**
    使能_OPAx输出信号送至IO口,或使能OPAx_OUT输出信号送至CMP。
        0000:不输出到IO,输出OPA0_OUT正端到OPA_OUT_CMP;
        0001:不输出到IO,输出OPA1_OUT正端到OPA_OUT_CMP;
        0010:不输出到IO,输出OPA2_OUT正端到OPA_OUT_CMP;
        0011:不输出到IO,输出OPA3_OUT正端到OPA_OUT_CMP;
        0100:不输出到IO,输出OPA0_OUT负端到OPA_OUT_CMP;
        0101:不输出到IO,输出OPA1_OUT负端到OPA_OUT_CMP;
        0110:不输出到IO,输出OPA2_OUT负端到OPA_OUT_CMP;
        0111:不输出到IO,输出OPA3_OUT负端到OPA_OUT_CMP;
        1000:输出OPA0_OUT正端到IO P2.7口,同时输出OPA0_OUT正端到OPA_OUT_CMP;
        1001:输出OPA1_OUT正端到IO P2.7口,同时输出OPA1_OUT正端到OPA_OUT_CMP;
        1010:输出OPA2_OUT正端到IO P2.7口,同时输出OPA2_OUT正端到OPA_OUT_CMP;
        1011:输出OPA3_OUT正端到IO P2.7口,同时输出OPA3_OUT正端到OPA_OUT_CMP;
        1100:输出OPA0_OUT负端到IO P2.7口,同时输出OPA0_OUT负端到OPA_OUT_CMP;
        1101:输出OPA1_OUT负端到IO P2.7口,同时输出OPA1_OUT负端到OPA_OUT_CMP;
        1110:输出OPA2_OUT负端到IO P2.7口,同时输出OPA2_OUT负端到OPA_OUT_CMP;
        1111:输出OPA3_OUT负端到IO P2.7口,同时输出OPA3_OUT负端到OPA_OUT_CMP; 即OPAOUT_EN[3]控制是否将OPAx输出到IO,OPAOUT_EN[2:0]选择OPAx 输出到OPA_OUT_CMP
    */
    HAL_REG_SYS_UNLOCK();
    HAL_REG_WRITE_BIT_MASK_POS(SYS_AFE_REG2, SYS_AFE_REG2_OPAOUT_EN, 0);
    HAL_REG_SYS_LOCK();
}

/**
 * @brief OPA设置IO输入
 * @param opa_x 运放序号
 * @param px IO序号
 */
void HAL_OPA_SetGpioIn(HAL_OPA_x opa_x, HAL_GPIO_Px px)
{
    (void)opa_x;
    HAL_GPIO_SetAf(px, HAL_GPIO_AF_OPA);
    HAL_GPIO_SetMode(px, HAL_GPIO_MODE_AFE);
}
/**
 * @brief OPA设置IO输出
 * @param opa_x 运放序号
 * @param px IO序号
 */
void HAL_OPA_SetGpioOut(HAL_OPA_x opa_x, HAL_GPIO_Px px)
{
    (void)opa_x;
    HAL_GPIO_SetAf(px, HAL_GPIO_AF_OPA);
    HAL_GPIO_SetMode(px, HAL_GPIO_MODE_AFE);
}
