
#include "../include/hal_lksmcu_reg.h"
#include "../include/hal_lksmcu_hall.h"

#include "hal_lks32mc09x.h"

/**
 * @brief 模块复位
 * @param hall 模块号
 */
void HAL_HALL_Reset(HAL_HALL_x hall)
{
    // 系统寄存器解锁
    HAL_REG_SYS_UNLOCK();
    HAL_REG_SET(SYS_SFT_RST, BIT1);
    HAL_REG_RESET(SYS_SFT_RST, BIT1);
    // 系统寄存器上锁
    HAL_REG_SYS_LOCK();
}

/**
 * @brief 模块打开
 * @param hall 模块号
 */
void HAL_HALL_Enable(HAL_HALL_x hall)
{
    HAL_REG_SYS_UNLOCK();
    HAL_REG_SET(SYS_CLK_FEN, BIT1);
    HAL_REG_SYS_LOCK();
}

/**
 * @brief 模块关闭
 * @param hall 模块号
 */
void HAL_HALL_Disable(HAL_HALL_x hall)
{
    HAL_REG_SYS_UNLOCK();
    HAL_REG_RESET(SYS_CLK_FEN, BIT1);
    HAL_REG_SYS_LOCK();
}

/**
 * @brief 设置hall频率
 * @param hall 模块号
 * @param freq 频率值
 */
void HAL_HALL_SetFreq(HAL_HALL_x hall, uint32_t freq)
{
    uint32_t mclk = HAL_CLK_GetMcuFreq();
    uint32_t th   = (mclk / freq);
    HAL_REG_WRITE(HAL_HALL[hall]->TH, th);
}

/**
 * @brief 设置hall阈值
 * @param hall 模块号
 * @param th 阈值
 */
void HAL_HALL_SetTh(HAL_HALL_x hall, uint32_t th)
{
    HAL_REG_WRITE(HAL_HALL[hall]->TH, th);
}

/**
 * @brief 获取当前hall的周期计数值
 * @param hall 模块号
 * @return 周期计数值
 */
uint32_t HAL_HALL_ReadTh(HAL_HALL_x hall)
{
    return HAL_REG_READ(HAL_HALL[hall]->TH);
}

/**
 * @brief 获取当前hall的数据
 * @param hall 模块号
 * @return 数据值
 */
uint8_t HAL_HALL_ReadHallData(HAL_HALL_x hall)
{
    return HAL_REG_READ(HAL_HALL[hall]->INFO);
}

/**
 * @brief 获取当前hall的宽度
 * @param hall 模块号
 * @return 宽度值
 */
uint8_t HAL_HALL_ReadHallWidth(HAL_HALL_x hall)
{
    return HAL_REG_READ(HAL_HALL[hall]->WIDTH);
}
