/*****************头文件*************************/
#include "fsl_common.h"
#include "uart_Interrupt.h"
#include "fsl_uart.h"
#include "pin_Init.h"
#include "fsl_gpio.h"
#include "fsl_pit.h"
#include "pit.h"
#include "adc_Interrupt.h"

/*****************变量声明*************************/
uint8_t demoRingBuffer[DEMO_RING_BUFFER_SIZE];
uint16_t txIndex; //发送数据计数
uint16_t rxIndex; //接收数据计数
uint16_t UART1rxIndex = 0; //接收数据计数
uint8_t RS485_Buf_Arr[DEMO_RS485_ARR_SIZE]; //RS485缓存数据数组
uint16_t UART2_SendData_len;    //记录UART2发送数据长度
uint16_t UART2_SendData_OK;  //UART2发送结束标志
uint8_t g_tipString1[] =  "\r\n\r\n编码器位置\t";
uint8_t g_tipString2[] =  "\t电压\t";
uint32_t BMQ_Location_Num;   //编码器位置
uint8_t UART2_Buf_Arr[DEMO_UART2_ARR_SIZE]; //RS485缓存数据数组
uint32_t adc_GetValue = 0;  //接收母线直流电压值
/*****************UART1初始化*************************/
void UART1_InterrputInit()
{
    UART1_InitPins();   //UART1引脚初始化
    uart_config_t config;   //参数设置
    UART_GetDefaultConfig(&config);
    config.stopBitCount = kUART_OneStopBit;
    config.baudRate_Bps = 2500000u;    //设置波特率
    config.enableTx     = true; 
    config.enableRx     = true;
    UART_Init(UART1, &config, SystemCoreClock); //初始化配置
    UART_EnableInterrupts(UART1, kUART_RxDataRegFullInterruptEnable | kUART_RxOverrunInterruptEnable);  //使能Rx中断
    EnableIRQ(UART1_RX_TX_IRQn);    //开启中断
}

/*****************UART2初始化*************************/
void UART2_InterrputInit()
{
    UART2_InitPins();   //UART2引脚初始化
    uart_config_t config;   //参数设置
    UART_GetDefaultConfig(&config);
    config.baudRate_Bps = BOARD_DEBUG_UART_BAUDRATE;    //设置波特率
    config.enableTx     = true; 
    config.enableRx     = true;
    UART_Init(DEMO_UART, &config, SystemCoreClock); //初始化配置
    UART_EnableInterrupts(DEMO_UART, kUART_RxDataRegFullInterruptEnable | kUART_RxOverrunInterruptEnable);  //使能Rx中断
    EnableIRQ(UART2_RX_TX_IRQn);    //开启中断
}

uint32_t UART1_IRQ_Count;
/*****************UART1中断服务函数**********************/
void UART1_RX_TX_IRQHandler(void)
{
    uint16_t data;
    UART1_IRQ_Count ++;
    UART1_IRQ_Count %= 1000;
    if ((kUART_RxDataRegFullFlag | kUART_RxOverrunFlag) & UART_GetStatusFlags(UART1))   //接收到数据标志
    {
        data = UART_ReadByte(UART1);
        if (UART1rxIndex < DEMO_RING_BUFFER_SIZE) //
        {
            demoRingBuffer[UART1rxIndex] = data;
            UART1rxIndex++;
            UART1rxIndex %= DEMO_RING_BUFFER_SIZE;
        }
    } 
    UART2_SendData_len = UART1rxIndex;
    SDK_ISR_EXIT_BARRIER;
}

uint32_t UART2_IRQ_Count;
/*****************UART2中断服务函数**********************/
void UART2_RX_TX_IRQHandler(void)
{
    uint16_t data;
    UART2_IRQ_Count ++;
    UART2_IRQ_Count %= 1000;
    if ((kUART_RxDataRegFullFlag | kUART_RxOverrunFlag) & UART_GetStatusFlags(DEMO_UART))   //接收到数据标志
    {
        data = UART_ReadByte(DEMO_UART);
        if (((rxIndex + 1) % DEMO_RING_BUFFER_SIZE) != txIndex) //
        {
            demoRingBuffer[rxIndex] = data;
            rxIndex++;
            rxIndex %= DEMO_RING_BUFFER_SIZE;
        }
    }
    /*将接收到的数据返回*/
    if ((kUART_TxDataRegEmptyFlag & UART_GetStatusFlags(DEMO_UART)) && (rxIndex != txIndex))    //发送中断标志
    {
        UART_WriteByte(DEMO_UART, demoRingBuffer[txIndex]); //发送一帧数据(一个字节,8个数据位)
        txIndex++;
        txIndex %= DEMO_RING_BUFFER_SIZE;
    } 
    SDK_ISR_EXIT_BARRIER;
}

/**************发送一帧数据*************/
void UART1_sendData()
{
//    if (UART2_SendData_OK == 1)
//    {
//        return;
//    }
    UART2_SendData_OK ++;
    UART2_SendData_OK %= 100;
    GPIO_PinWrite(GPIOE, 3, 1);    //PTE3写
    UART_WriteByte(UART1, 0x1A); //发送一帧数据(一个字节,8个数据位)
    UART_WriteByte(UART1, 0x2A); //发送一帧数据(一个字节,8个数据位)
    while (!(kUART_TxDataRegEmptyFlag & UART_GetStatusFlags(UART1)));    //发送中断标志
    UART_ClearStatusFlags(UART1, kUART_TransmissionCompleteFlag);
    GPIO_PinWrite(GPIOE, 3, 0);    //PTE3写
}

/**************UART2发送数据*******************/
void UART2_sendData()
{ 
    if (UART2_SendData_len != 0)
    {
        UART_WriteBlocking(DEMO_UART, g_tipString1, sizeof(g_tipString1) / sizeof(g_tipString1[0])-1);
        for (uint8_t i = 0; i < 6; i++ )
        {
            UART_WriteByte(DEMO_UART, UART2_Buf_Arr[i]);
            while (!(kUART_TxDataRegEmptyFlag & UART_GetStatusFlags(DEMO_UART)));  //等待发送结束
            UART_ClearStatusFlags(DEMO_UART, kUART_TransmissionCompleteFlag);
        }
        UART_WriteBlocking(DEMO_UART, g_tipString2, sizeof(g_tipString2) / sizeof(g_tipString2[0])-1);
        for (uint8_t i = 0; i < 4; i++ )
        {
            UART_WriteByte(DEMO_UART, UART2_Buf_Arr[i+6]);
            while (!(kUART_TxDataRegEmptyFlag & UART_GetStatusFlags(DEMO_UART)));  //等待发送结束
            UART_ClearStatusFlags(DEMO_UART, kUART_TransmissionCompleteFlag);
        }
    }
}

/***************RS485接收数据*********************/
void RS485_Recieve_Data()
{
//    for (uint8_t i = 0; i < UART1rxIndex; i++ )
//    {
//        RS485_Buf_Arr[i] = demoRingBuffer[i];
//    }
  //  BMQ_Location_Num = (RS485_Buf_Arr[4] << 16) + (RS485_Buf_Arr[3] << 8) + (RS485_Buf_Arr[2]);
    if (demoRingBuffer[0] != 0x1A)
    {
        return;
    }
    BMQ_Location_Num = (demoRingBuffer[4] << 16) + (demoRingBuffer[3] << 8) + (demoRingBuffer[2]);
    UART2_Buf_Arr[0] =  (BMQ_Location_Num / 100000) + '0';
    UART2_Buf_Arr[1] =  (BMQ_Location_Num % 100000 / 10000) + '0';
    UART2_Buf_Arr[2] =  (BMQ_Location_Num % 10000 / 1000) + '0';
    UART2_Buf_Arr[3] =  (BMQ_Location_Num % 1000 / 100) + '0';
    UART2_Buf_Arr[4] =  (BMQ_Location_Num % 100 / 10) + '0';
    UART2_Buf_Arr[5] =  (BMQ_Location_Num % 10) + '0';
}

/*************刷新电压数据******************/
void ADC16_Recieve_Data()
{
    adc_GetValue =  adc_ReturnValue(); 
   // UART2_Buf_Arr[6] =  (adc_GetValue / 100000) + '0';
   // UART2_Buf_Arr[7] =  (adc_GetValue % 100000 / 10000) + '0';
    UART2_Buf_Arr[6] =  (adc_GetValue % 10000 / 1000) + '0';
    UART2_Buf_Arr[7] = '.';
    UART2_Buf_Arr[8] =  (adc_GetValue % 1000 / 100) + '0';
    UART2_Buf_Arr[9] =  (adc_GetValue % 100 / 10) + '0';
    //UART2_Buf_Arr[10] =  (adc_GetValue % 10) + '0';
}

void PIT0_IRQHandler()
{
    PIT_ClearStatusFlags(PIT, DEMO_PIT_CHANNEL, kPIT_TimerFlag);    //清除中断标志
    UART1_sendData();   //UART1发送
    UART1rxIndex = 0;
    //GPIO_PortToggle(GPIOA, 1 << 15);
    
}