#include "lks32mc09x_sif.h"
#include "lks32mc09x_sys.h"

/**
 * @brief 初始化SIF结构体
 * @param SIFInitStruct 指向SIF_InitTypeDef结构体的指针
 */
void SIF_StructInit(SIF_InitTypeDef *SIFInitStruct)
{
    for (int i = 0; i < sizeof(SIF_InitTypeDef); i++)
    {
        ((uint8_t *)SIFInitStruct)[i] = 0;
    }
}

/**
 * @brief 初始化SIF模块
 * @param SIFx 指向SIF_TypeDef结构体的指针，表示具体的SIF实例
 * @param SIFInitStruct 指向SIF_InitTypeDef结构体的指针，包含初始化参数
 */
void SIF_Init(SIF_TypeDef *SIFx, SIF_InitTypeDef *SIFInitStruct)
{
    // 使能SIF模块时钟
    SYS_ModuleClockCmd(SYS_MODULE_SIF0, ENABLE);

    // 配置SIF寄存器
    SIFx->CFG = (SIFInitStruct->SIF_DONE << 7) |
                (SIFInitStruct->SIF_SYNC << 6) |
                (SIFInitStruct->SIF_SYNC_PULSE << 5) |
                (SIFInitStruct->SIF_DONE_VLD << 4) |
                (SIFInitStruct->SIF_SYNC_VLD << 3) |
                (SIFInitStruct->SIF_RATIO << 2) |
                (SIFInitStruct->SIF_MSB << 1) |
                SIFInitStruct->SIF_EN;

    SIFx->TOSC  = SIFInitStruct->SIF_TOSC;
    SIFx->TSTH1 = SIFInitStruct->SIF_TSTH1;
    SIFx->TDTH1 = SIFInitStruct->SIF_TDTH1;
    SIFx->IRQ   = (SIFInitStruct->SIF_IRQ_IF << 4) |
                (SIFInitStruct->SIF_DMA_EN << 1) |
                SIFInitStruct->SIF_IRQ_EN;
}

/**
 * @brief 设置SIF时基
 * @param tosc 时基值
 */
void SIF_Timebase_set(SIF_TypeDef *SIFx, uint32_t tosc)
{
    SIFx->TOSC = tosc;
}

/**
 * @brief 设置SIF同步和结束信号时长
 * @param tsh 同步信号时长
 * @param tdh 结束信号时长
 */
void SIF_TH_set(SIF_TypeDef *SIFx, uint32_t tsh, uint32_t tdh)
{
    SIFx->TSTH1 = tsh;
    SIFx->TDTH1 = tdh;
}

/**
 * @brief 发送数据
 * @param Data 要发送的数据
 */
void SIF_Senddata(SIF_TypeDef *SIFx, uint8_t Data)
{
    SIFx->WDATA = Data;
}

/**
 * @brief 设置SIF DMA使能状态
 * @param state 使能状态，1表示使能，0表示禁用
 */
void SIF_DMA_IsEnable(SIF_TypeDef *SIFx, uint8_t state)
{
    if (state)
    {
        SIFx->IRQ |= SIF_DMA_Enable;
    }
    else
    {
        SIFx->IRQ &= ~SIF_DMA_Enable;
    }
}

/**
 * @brief 设置SIF中断使能状态
 * @param state 使能状态，1表示使能，0表示禁用
 */
void SIF_Irq_IsEnable(SIF_TypeDef *SIFx, uint8_t state)
{
    if (state)
    {
        SIFx->IRQ |= SIF_IE_Enable;
    }
    else
    {
        SIFx->IRQ &= ~SIF_IE_Enable;
    }
}

/**
 * @brief 清除SIF中断标志
 */
void SIF_Clear_Irq(SIF_TypeDef *SIFx)
{
    SIFx->IRQ |= SIF_IF_CLEAR;
}
