#include "lks32mc09x_hall.h"
#include "lks32mc09x_sys.h"

/**
 * @brief 初始化HALL结构体
 * @param HALL_InitStruct: 指向HALL_InitTypeDef结构体的指针
 */
void HALL_StructInit(HALL_InitTypeDef *HALL_InitStruct)
{
    uint32_t i;
    for (i = 0; i < sizeof(HALL_InitTypeDef); i++)
    {
        ((uint8_t *)HALL_InitStruct)[i] = 0;
    }
}

/**
 * @brief 初始化HALL模块
 * @param HALL_InitStruct: 指向HALL_InitTypeDef结构体的指针
 */
void HALL_Init(HALL_InitTypeDef *HALL_InitStruct)
{
    if (HALL_InitStruct != 0)
    {
        // 使能HALL模块时钟
        SYS_ModuleClockCmd(SYS_MODULE_HALL0, HALL_InitStruct->HALL_Ena);

        // 霍尔配置寄存器
        REG_IF_WRITE(HALL0->CFG, HALL0_CFG_FIL_75_BIT, HALL_InitStruct->Filter75_Ena);
        REG_WRITE_BIT_POS_MASK(HALL0->CFG, HALL0_CFG_CLK_DIV, HALL_InitStruct->ClockDivision);
        REG_WRITE_BIT_POS_MASK(HALL0->CFG, HALL0_CFG_FIL_LEN, HALL_InitStruct->FilterLen);
        REG_IF_WRITE(HALL0->CFG, HALL0_CFG_CHG_IE_BIT, HALL_InitStruct->Capture_IRQ_Ena);
        REG_IF_WRITE(HALL0->CFG, HALL0_CFG_OV_IE_BIT, HALL_InitStruct->OverFlow_IRQ_Ena);
        REG_IF_WRITE(HALL0->CFG, HALL0_CFG_SW_IE_BIT, HALL_InitStruct->softIE);
        REG_IF_WRITE(HALL0->CFG, HALL0_CFG_HALL_EN_BIT, HALL_InitStruct->HALL_Ena);

        REG_WRITE(HALL0->TH, HALL_InitStruct->CountTH);
    }
    else
    {
        __NOP();
    }
}

/**
 * @brief 使能或失能HALL模块
 * @param state: 功能状态，ENABLE或DISABLE
 */
void HALL_Cmd(uint8_t state)
{
    if (state == ENABLE)
    {
        HALL0->CFG |= (1 << 24); // 使能HALL模块
    }
    else
    {
        HALL0->CFG &= ~(1 << 24); // 失能HALL模块
    }
}

/**
 * @brief 读取滤波后的HALL值
 * @return 滤波后的HALL值
 */
uint32_t HALL_GetFilterValue(void)
{
    return (HALL0->INFO & 0x07);
}

/**
 * @brief 读取未滤波的HALL值
 * @return 未滤波的HALL值
 */
uint32_t HALL_GetCaptureValue(void)
{
    return (HALL0->INFO >> 8) & 0x07;
}

/**
 * @brief 读取HALL计数值
 * @return HALL计数值
 */
uint32_t HALL_GetCount(void)
{
    return HALL0->CNT;
}

/**
 * @brief 判断是否发生捕获事件
 * @return 发生捕获事件返回非零值（True），否则返回0（False）
 */
uint32_t HALL_IsCaptureEvent(void)
{
    return (HALL0->INFO & HALL_CAPTURE_EVENT) ? 1 : 0;
}

/**
 * @brief 判断是否发生溢出事件
 * @return 发生溢出事件返回非零值（True），否则返回0（False）
 */
uint32_t HALL_IsOverFlowEvent(void)
{
    return (HALL0->INFO & HALL_OVERFLOW_EVENT) ? 1 : 0;
}

/**
 * @brief 获取HALL事件标志
 * @param tempFlag: 要获取的标志位
 * @return 对应标志位的状态
 */
uint32_t HALL_GetFlag(uint32_t tempFlag)
{
    return (HALL0->INFO & tempFlag) ? 1 : 0;
}

/**
 * @brief 清除HALL中断标志位
 * @param tempFlag: 要清除的标志位
 */
void HALL_Clear_IRQ(uint32_t tempFlag)
{
    HALL0->INFO &= ~tempFlag;
}

/**
 * @brief 读取HALL中断标志位
 * @param tempFlag: 要读取的标志位
 * @return 对应标志位的状态
 */
uint32_t HALL_GetIRQFlag(uint32_t tempFlag)
{
    return (HALL0->INFO & tempFlag) ? 1 : 0;
}

/**
 * @brief 软件触发HALL信号变化中断
 */
void HALL_SoftTrigger(void)
{
    HALL0->INFO |= (1 << 18); // 触发HALL信号变化中断
}
