#include "Bsp.h"

extern const COM_CONFIG COM_PERIPH[];

/**
 * @brief  初始化UART口外设的时钟
 * @note  void
 * @param  ComX:串口号
 * @retval void
 */
void UartClockEnable(const COM_MAP_T *ComX)
{
    ComX->ClockCmd(ComX->ClockTree,ENABLE);
}

/**
 * @brief 初始化USART口
 * @note void
 * @param Comx 串口号 baud 波特率 DataBits 数据位 StopBits 停止位 Parity校验位
 * @retval void
 */
void ComInit(const COM_MAP_T *ComX, uint32_t baud, uint8_t DataBits, uint8_t StopBits, uint8_t Parity)
{
    USART_InitTypeDef UsartInitSt;

    //初始化串口
    USART_StructInit(&UsartInitSt);
    UsartInitSt.USART_BaudRate = baud;
    UsartInitSt.USART_WordLength = DataBits;
    UsartInitSt.USART_StopBits = StopBits;
    UsartInitSt.USART_Parity = Parity;
    UsartInitSt.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    UsartInitSt.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
    UartClockEnable(ComX);
    USART_Init(ComX->Periph.UartId, &UsartInitSt);
    //配置中断
    USART_ITConfig(ComX->Periph.UartId, USART_IT_RXNE, ENABLE);
    //启用串口
    USART_Cmd(ComX->Periph.UartId, ENABLE);
}

/**
 * @brief USART口发送数据
 * @note void
 * @param ComX 串口号 Data数据
 * @retval void
 */
void ComSendChar(const COM_MAP_T *ComX,uint8_t Data)
{
    USART_SendData(ComX->Periph.UartId, Data);
    while (USART_GetFlagStatus(ComX->Periph.UartId, USART_FLAG_TC)  != SET);
}
 /**
 * @brief USART口发送字符串
 * @note void
 * @param ComX 串口号 Data数据 Len 长度
 * @retval void
 */
void ComSendStr(const COM_MAP_T *ComX,uint8_t *Data, uint64_t Len)
{
    for (uint64_t i = 0;i < Len;i++)
    {
        USART_SendData(ComX->Periph.UartId, Data[i]);
        while (USART_GetFlagStatus(ComX->Periph.UartId, USART_FLAG_TC) != SET);
    }
}
/**
 * @brief USART口发送数据
 * @note  void
 * @param ComX 串口号
 * @retval 读取的数据
 */
uint8_t ComReceiveChar(const COM_MAP_T *ComX)
 {
    return USART_ReceiveData(ComX->Periph.UartId);
 }
/**
 * @brief 通用USART配置
 * @note void
 * @param ComX 串口号 baud 波特率
 * @retval void
 */
void ComStdConfig(const COM_MAP_T *ComX, uint32_t Baud)
{
    ComInit(ComX, Baud, USART_WordLength_8b, USART_StopBits_1, USART_Parity_No);
}
/**
 * @brief 高级串口配置
 * @note  void
 * @param ComX 串口号 baud 波特率 Data Bits 数据位 StopBits 停止位 Parity校验位
 * @retval void
 */
void ComAdvConfig(const COM_MAP_T *ComX, uint32_t Baud, uint8_t DataBits, uint8_t StopBits, uint8_t Parity)
{
    ComInit(ComX, Baud, DataBits, StopBits, Parity);
}

unsigned int CalcBaudTransIoSpeed(unsigned int Baud) {

}