#include "bsp_wf5803.h"
#include "CONFIG.h"

static uint8_t Peripheral_TaskID = 0xff;

#define WF5803_CSB1_HIGH() GPIOB_SetBits(GPIO_Pin_17)
#define WF5803_CSB1_LOW()  GPIOB_ResetBits(GPIO_Pin_17)

void SPICs_Start(void)
{
    // GPIOA_ResetBits(GPIO_Pin_6);
    WF5803_CSB1_LOW();
}

void SPICs_Stop(void)
{
    // GPIOA_SetBits(GPIO_Pin_6);
    WF5803_CSB1_HIGH();
}

uint8_t WF5803_SendByte(uint8_t data)
{
    R8_SPI0_BUFFER = data;
    while (!(R8_SPI0_INT_FLAG & RB_SPI_FREE));
    return (R8_SPI0_BUFFER);
}

void WF5803_WriteReg(uint8_t Address, uint8_t value)
{
    SPICs_Start();
    WF5803_SendByte(0x00);
    WF5803_SendByte(Address);
    WF5803_SendByte(value);
    SPICs_Stop();
}

uint8_t WF5803_ReadReg(uint8_t addr)
{
    uint8_t value;
    SPICs_Start();
    WF5803_SendByte(0x80);
    WF5803_SendByte(addr);
    value = WF5803_SendByte(0xFF);
    SPICs_Stop();
    return value;
}

void WF5803_Init(void)
{
    /**
     * CSB: PA6
     * SCL: PA0
     * SDA: PA1
     * SDO: PA2
     */

    /**
     * CSB: PB17
     * SCL: PA13
     * SDA: PA14
     * SDO: PA15
     */
    // SDA: MOSI
    // SDO: MISO
#if 1
    // CSB1: PA3

    GPIOA_SetBits(GPIO_Pin_3);
    GPIOA_ModeCfg(GPIO_Pin_3, GPIO_ModeOut_PP_5mA);
    GPIOA_SetBits(GPIO_Pin_3);

    // CSB2: PB9
    GPIOB_ResetBits(GPIO_Pin_9);
    GPIOB_ModeCfg(GPIO_Pin_9, GPIO_ModeOut_PP_5mA);
    GPIOB_ResetBits(GPIO_Pin_9);

    // WF5803_CSB1_HIGH();

    // CSB3: PB4
    GPIOB_ResetBits(GPIO_Pin_4);
    GPIOB_ModeCfg(GPIO_Pin_4, GPIO_ModeOut_PP_5mA);
    GPIOB_ResetBits(GPIO_Pin_9);

    // CSB4: PB17
    GPIOB_SetBits(GPIO_Pin_17);
    GPIOB_ModeCfg(GPIO_Pin_17, GPIO_ModeOut_PP_5mA);
    // WF5803_CSB1_HIGH();

    // PRINT("WF5803_CSB1_HIGH()\r\n");

    // spi初始化，模式0
    GPIOA_ModeCfg(GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14, GPIO_ModeOut_PP_5mA);
    GPIOA_ModeCfg(GPIO_Pin_15, GPIO_ModeIN_PU);
#endif
    // PRINT("GPIOA_ModeCfg ok\r\n");

    SPI0_MasterDefInit();
    // PRINT("SPI1_MasterDefInit ok\r\n");

    SPICs_Stop();
    // PRINT("SPICs_Stop ok\r\n");
    WF5803_WriteReg(0x00, 0x81); // 配置spi为四线模式
    // PRINT("WF5803_WriteReg ok\r\n");

    // PRINT("SPI_Init ok\r\n");
}

void WF5803_DeInit(void)
{
    // GPIOA_ModeCfg(GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_6, GPIO_ModeIN_PD);
    // GPIOA_ModeCfg(GPIO_Pin_2, GPIO_ModeIN_PD);

    // GPIOA_ResetBits(GPIO_Pin_4);
    // GPIOA_ResetBits(GPIO_Pin_5);
    // GPIOA_ResetBits(GPIO_Pin_12);

    // GPIOA_ModeCfg(GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_12, GPIO_ModeIN_PD);
}

long reading    = 0;
float press     = 0;
float temp      = 0;
float fDat      = 0;
float press_air = 101.0f;
int a           = 1;
uint8_t RawData[5];

uint8_t *GetSensorData(void)
{
    memset(RawData, 0, sizeof(uint8_t) * 5);
    // WF5803_WriteReg(0x30, 0x0a);
    // DelayMs(50);

    PRINT("DRDTY = %02x\r\n", WF5803_ReadReg(0x02));

    // 气压数据

    RawData[0] = WF5803_ReadReg(0x06);
    RawData[1] = WF5803_ReadReg(0x07);
    RawData[2] = WF5803_ReadReg(0x08);
    // 温度数据
    RawData[3] = WF5803_ReadReg(0x09);
    RawData[4] = WF5803_ReadReg(0x0a);

    //    for(int i=0; i<5; i++)
    //    {
    //        PRINT("RawData[%d] = %x\r\n", i,RawData[i]);
    //    }
    return RawData;
}

void WF5803_Start(void)
{
    WF5803_WriteReg(0x21, 0x47); // 开启气压和温度传感器
    WF5803_WriteReg(0x27, 0x41); // 开启气压和温度传感器
}

void SensorData_Process(void)
{
    uint8_t *p1 = GetSensorData();
    reading     = p1[0];
    reading     = reading << 8;
    reading |= p1[1];
    reading = reading << 8;
    reading |= p1[2];
    if (reading >= 8388608)
    {
        fDat = (int32_t)(reading - 16777216) / 8388608.0f;
    }
    else
    {
        fDat = reading / 8388608.0f;
    }

    press = fDat * 125 + 17.5; // WF5803_1BAR    如果是使用10m级别的深传就使用这个

    //    if (a) {press_air = press ; a = 0;}
    //    press = press_air > press ? press_air : press;
    //
    //    int deep_100 = (int)(100*((press - press_air)/0.098f));
    //    //printf("P=%d.%d pa\r\n",(int)press,((int)(press*10000.0f)%10000));`
    //    printf("D=%d.%d cm\r\n",deep_100/100,deep_100%100);

    reading = p1[3];
    reading = reading << 8;
    reading |= p1[4];
    if (reading > 32768)
    {
        temp = (reading - 65844) / 256.0f;
    }
    else
    {
        temp = (reading - 308) / 256.0f;
    }
    // PRINT("--s-1--\r\n");
    PRINT("P=%d.%d pa\r\n", (int)(press * 1000), ((int)(press * 10000000.0f) % 10000));
    PRINT("T=%d.%d \r\n", (int)temp, ((int)(temp * 100.0f) % 100));
}

uint16_t wf5803_ProcessEvent(uint8_t task_id, uint16_t events)
{
    if (events & WF5803_EVT_START)
    {
        // SensorData_Process();
        // WF5803_WriteReg(0x30, 0x0a);

        WF5803_WriteReg(0x30, 0x0A);

        tmos_start_task(Peripheral_TaskID, WF5803_EVT_READ, MS1_TO_SYSTEM_TIME(50));
        return (events ^ WF5803_EVT_START);
    }
    else if (events & WF5803_EVT_READ)
    {
        SensorData_Process();
        // WF5803_WriteReg(0x30, 0x0a);

        tmos_start_task(Peripheral_TaskID, WF5803_EVT_START, MS1_TO_SYSTEM_TIME(800));
        return (events ^ WF5803_EVT_READ);
    }
    return 0;
}

void BSPWF5803_Init(void)
{
    WF5803_Init();
    Peripheral_TaskID = TMOS_ProcessEventRegister(wf5803_ProcessEvent);
    // WF5803_WriteReg(0x30, 0x2B);
    tmos_set_event(Peripheral_TaskID, WF5803_EVT_START);
    // tmos_start_task(Peripheral_TaskID, WF5803_EVT_READ, MS1_TO_SYSTEM_TIME(50));
    // PRINT("WF5803_Init\r\n");
}
