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

/**
 * @brief 初始化HALL结构体
 * @param HALL_InitStruct: 指向HALL_InitTypeDef结构体的指针
 */
void HALL_StructInit(HALL_InitTypeDef *HALL_InitStruct)
{
    if (HALL_InitStruct != 0)
    {
        HALL_InitStruct->CountTH          = 0;
        HALL_InitStruct->FilterLen        = 0;
        HALL_InitStruct->ClockDivision    = 0;
        HALL_InitStruct->Filter75_Ena     = DISABLE;
        HALL_InitStruct->HALL_Ena         = DISABLE;
        HALL_InitStruct->Capture_IRQ_Ena  = DISABLE;
        HALL_InitStruct->OverFlow_IRQ_Ena = DISABLE;
        HALL_InitStruct->softIE           = DISABLE;
    }
    else
    {
        __NOP();
    }
}

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

        // 配置HALL寄存器
        HALL0->CFG &= ~(0x00FFFFFF); // 清除相关位
        HALL0->CFG |= (HALL_InitStruct->Filter75_Ena << 20) |
                      (HALL_InitStruct->ClockDivision << 16) |
                      (HALL_InitStruct->FilterLen & 0xFFFF);

        HALL0->TH = HALL_InitStruct->CountTH;

        // 配置中断使能
        HALL0->CFG &= ~(HALL_CAPTURE_EVENT | HALL_OVERFLOW_EVENT);
        HALL0->CFG |= (HALL_InitStruct->Capture_IRQ_Ena << 28) |
                      (HALL_InitStruct->OverFlow_IRQ_Ena << 29) |
                      (HALL_InitStruct->softIE << 30);

        // 使能HALL模块
        HALL0->CFG |= (HALL_InitStruct->HALL_Ena << 24);
    }
    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信号变化中断
}
