#include "Fuel.h"
#include "gpio.h"
#include "Analog_Signals.h"
#include "Common_Interface.h"
#include "Flash_synchronizer.h"

_Fuel_Dis FuelDis;
_FuelData Fuel_Data;
void Fuel_KL30_Init(void)
{
    PORT_ClrBit(Fuel_Vcc_en);

    Fuel_Data.u8FuelInitFlag = 0u;
    Fuel_Data.FuelDir = Up_Dir;
    Fuel_Data.FuelSensorState = FuelSensorNormal;
    Fuel_Data.u8FuelDataCount = 0u;
    for (uint8_t i = 0; i < FUEL_DATA_NUM; i++)
    {
        Fuel_Data.FuelDataBuffer[i] = 0;
    }

    Fuel_Data.FuelDataArray[0] = 0u;    /* Short */
    Fuel_Data.FuelDataArray[1] = 970u;  /* Seg1 */
    Fuel_Data.FuelDataArray[2] = 790u;  /* Seg2 */
    Fuel_Data.FuelDataArray[3] = 610u;  /* Sge3 */
    Fuel_Data.FuelDataArray[4] = 430u;  /* Seg4 */
    Fuel_Data.FuelDataArray[5] = 250u;  /* Seg5 */
    Fuel_Data.FuelDataArray[6] = 1100u; /* Open */

    Fuel_Data.u8FuelInitFlag = 1;
    Fuel_Data.u8FuelInitState = 1;
    Fuel_Data.u8FuelADCompleteFlg = 0;
    Fuel_Data.u16SensorNormalTimer = 0;
    Fuel_Data.u16SensorOpenTimer = 0;
    Fuel_Data.u16SensorShortTimer = 0;

    FuelDis.u8Curseg = 0;
    FuelDis.u8DestSeg = 0;
    FuelDis.u16Down_Timer = Creep_Down_Up_Timer;
}

void Fuel_KL15_Init(void)
{
    PORT_SetBit(Fuel_Vcc_en);
    Fuel_Data.FuelDir = Up_Dir;
    Fuel_Data.FuelSensorState = FuelSensorNormal;
    Fuel_Data.u8FuelDataCount = 0u;
    for (uint8_t i = 0; i < FUEL_DATA_NUM; i++)
    {
        Fuel_Data.FuelDataBuffer[i] = 0;
    }

    Fuel_Data.FuelDataArray[0] = 0u;    /* Short */
    Fuel_Data.FuelDataArray[1] = 970u;  /* Seg1 */
    Fuel_Data.FuelDataArray[2] = 790u;  /* Seg2 */
    Fuel_Data.FuelDataArray[3] = 610u;  /* Sge3 */
    Fuel_Data.FuelDataArray[4] = 430u;  /* Seg4 */
    Fuel_Data.FuelDataArray[5] = 250u;  /* Seg5 */
    Fuel_Data.FuelDataArray[6] = 1100u; /* Open */

    Fuel_Data.u8FuelInitFlag = 1;
    Fuel_Data.u8FuelInitState = 1;
    Fuel_Data.u8FuelADCompleteFlg = 0;
    Fuel_Data.u16SensorNormalTimer = 0;
    Fuel_Data.u16SensorOpenTimer = 0;
    Fuel_Data.u16SensorShortTimer = 0;

    FuelDis.u8Curseg = 0;
    FuelDis.u8DestSeg = 0;
    FuelDis.u16Down_Timer = Creep_Down_Up_Timer;
}
/**
 * @brief 燃油采集计算服务
 *
 */
void Fuel_R_Cal(uint8_t deltaTime)
{
    uint16_t FuelRes = 0;
    uint8_t i, j;
    uint32_t temp32;
    static uint16_t timeCount = 0;

    if (Fuel_Data.u8FuelCollectCount >= FUEL_DATA_TIME) /* 多久采集一次燃油数据 */
    {
        Fuel_Data.u8FuelCollectCount = 0;
        if (Fuel_Data.u8FuelDataCount < FUEL_DATA_NUM)
        {
            /*获取燃油电阻*/
            FuelRes = 0;

            /*四舍五入*/
            if (FuelRes < Fuel_Data.FuelDataArray[6]) /* 小于开路阻值 */
            {
                if (FuelRes % 10 >= 5)
                {
                    FuelRes += 5;
                }
            }
            else
            {
                FuelRes = Fuel_Data.FuelDataArray[6];
            }
            /*由小到大插入数据*/
            for (i = 0; i < Fuel_Data.u8FuelDataCount; i++)
            {
                if (FuelRes < Fuel_Data.FuelDataBuffer[i])
                {
                    break;
                }
            }
            for (j = Fuel_Data.u8FuelDataCount; j > i; j--)
            {
                Fuel_Data.FuelDataBuffer[j] = Fuel_Data.FuelDataBuffer[j - 1];
            }
            Fuel_Data.FuelDataBuffer[i] = FuelRes;
            Fuel_Data.u8FuelDataCount++;
        }
        else
        {
            /*一组数据采集完毕,取中间部分计算平均值*/
            temp32 = 0;
            for (i = FUEL_CAL_START; i < FUEL_CAL_END; i++)
            {
                temp32 += Fuel_Data.FuelDataBuffer[i];
            }
            Fuel_Data.Fuel_Res = temp32 / (FUEL_CAL_END - FUEL_CAL_START);
            Fuel_Data.u8FuelDataCount = 0;
            Fuel_Data.u8FuelADCompleteFlg = 1;
        }
    }
    Fuel_Data.u8FuelCollectCount += deltaTime;
}

/**
 * @brief 检查燃油传感器状态
 *
 */
void Fuel_State_Check(uint8_t deltaTime)
{

    // if (Fuel_Data.Fuel_Res < Fuel_Data.FuelDataArray[0])
    //{ /*短路 1*/
    //     Fuel_Data.u16SensorOpenTimer = 0;
    //     Fuel_Data.u16SensorNormalTimer = 0;
    //     if ((Fuel_Data.u16SensorShortTimer > Fuet_Short_Dealy_Timer) || ((Fuel_Data.u8FuelInitState) && (Fuel_Data.u16SensorShortTimer > Fuet_Short_Dealy_Timer)))
    //     {
    //         Fuel_Data.FuelSensorState = FuelSensorShortCircuit;
    //         FuelDis.u8DestSeg = 0;
    //         FuelDis.u8Curseg = 0;
    //         Fuel_Data.u8FuelInitState = 0;
    //         Fuel_Data.u8FuelInitFlag = 1;
    //         Fuel_Data.FuelDir = FUEL_SEG_UP;
    //     }
    //     else
    //     {
    //         Fuel_Data.u16SensorShortTimer += deltaTime;
    //     }
    // }
    // else
    if (Fuel_Data.Fuel_Res >= Fuel_Data.FuelDataArray[6]) /* 开路 */
    {
        Fuel_Data.u16SensorShortTimer = 0;
        Fuel_Data.u16SensorNormalTimer = 0;
        if ((Fuel_Data.u16SensorOpenTimer > Fuel_Open_Dealy_Timer) || ((Fuel_Data.u8FuelInitState) && (Fuel_Data.u16SensorOpenTimer > Fuel_Open_Dealy_Timer)))
        {
            Fuel_Data.FuelSensorState = FuelSensorOpenCircuit;
            FuelDis.u8DestSeg = 0;
            FuelDis.u8Curseg = 0;
            Fuel_Data.u8FuelInitState = 0;
            Fuel_Data.u8FuelInitFlag = 1;
            Fuel_Data.FuelDir = Up_Dir;
        }
        else
        {

            Fuel_Data.u16SensorOpenTimer += deltaTime;
        }
    }
    else
    {
        Fuel_Data.u16SensorShortTimer = 0;
        Fuel_Data.u16SensorOpenTimer = 0;
        if (Fuel_Data.u16SensorNormalTimer > Fuel_Normal_Dealy_Timer)
        {
            Fuel_Data.FuelSensorState = FuelSensorNormal;
            Fuel_Data.u8FuelInitState = 0;
        }
        else
        {
            Fuel_Data.u16SensorNormalTimer += deltaTime;
        }
    }
}

/**
 * @brief 燃油显示服务
 *
 */
void Fuel_Gauges_Cal(uint8_t deltaTime)
{

    if ((Fuel_Data.FuelSensorState == FuelSensorNormal) && (Fuel_Data.Fuel_Res >= Fuel_Data.FuelDataArray[0]) && (Fuel_Data.Fuel_Res < Fuel_Data.FuelDataArray[6]))
    {
        /*采集完第一组数据后,开始计算燃油格数*/
        if (Fuel_Data.u8FuelADCompleteFlg)
        {
            if (Fuel_Data.u8FuelInitFlag)
            {
                Fuel_Data.Fuel_Res_Back = Fuel_Data.Fuel_Res;
            }
            /*根据回差计算走动方向*/
            if (Fuel_Data.FuelDir == Up_Dir)
            {

                if (Fuel_Data.Fuel_Res >= Fuel_Data.Fuel_Res_Back + RETURN_DIFFERENCE)
                {
                    Fuel_Data.FuelDir = Down_Dir;
                    Fuel_Data.Fuel_Res_Back = Fuel_Data.Fuel_Res;
                }
                if (Fuel_Data.Fuel_Res < Fuel_Data.Fuel_Res_Back)
                {
                    Fuel_Data.Fuel_Res_Back = Fuel_Data.Fuel_Res;
                }
            }
            else
            {
                if (Fuel_Data.Fuel_Res_Back >= Fuel_Data.Fuel_Res + RETURN_DIFFERENCE)
                {
                    Fuel_Data.FuelDir = Up_Dir;
                    Fuel_Data.Fuel_Res_Back = Fuel_Data.Fuel_Res;
                }
                if (Fuel_Data.Fuel_Res > Fuel_Data.Fuel_Res_Back)
                {
                    Fuel_Data.Fuel_Res_Back = Fuel_Data.Fuel_Res;
                }
            }

            /*计算目标格数*/

            if (Fuel_Data.FuelDir == Up_Dir)
            {
                if (((FuelDis.u8DestSeg == 4) || (Fuel_Data.u8FuelInitFlag)) && (Fuel_Data.Fuel_Res < Fuel_Data.FuelDataArray[5]))
                {
                    FuelDis.u8DestSeg = 5;
                }
                else if (((FuelDis.u8DestSeg == 3) || (Fuel_Data.u8FuelInitFlag)) && (Fuel_Data.Fuel_Res < Fuel_Data.FuelDataArray[4]))
                {
                    FuelDis.u8DestSeg = 4;
                }
                else if (((FuelDis.u8DestSeg == 2) || (Fuel_Data.u8FuelInitFlag)) && (Fuel_Data.Fuel_Res < Fuel_Data.FuelDataArray[3]))
                {
                    FuelDis.u8DestSeg = 3;
                }
                else if (((FuelDis.u8DestSeg == 1) || (Fuel_Data.u8FuelInitFlag)) && (Fuel_Data.Fuel_Res < Fuel_Data.FuelDataArray[2]))
                {
                    FuelDis.u8DestSeg = 2;
                }
                else if (((FuelDis.u8DestSeg == 0) || (Fuel_Data.u8FuelInitFlag)) && (Fuel_Data.Fuel_Res < Fuel_Data.FuelDataArray[1]))
                {
                    FuelDis.u8DestSeg = 1;
                }
            }
            else if (Fuel_Data.FuelDir == Down_Dir)
            {
                if (((FuelDis.u8DestSeg == 1) || (Fuel_Data.u8FuelInitFlag)) && (Fuel_Data.Fuel_Res >= Fuel_Data.FuelDataArray[1]))
                {
                    FuelDis.u8DestSeg = 0;
                }
                else if (((FuelDis.u8DestSeg == 2) || (Fuel_Data.u8FuelInitFlag)) && (Fuel_Data.Fuel_Res >= Fuel_Data.FuelDataArray[2]))
                {
                    FuelDis.u8DestSeg = 1;
                }
                else if (((FuelDis.u8DestSeg == 3) || (Fuel_Data.u8FuelInitFlag)) && (Fuel_Data.Fuel_Res >= Fuel_Data.FuelDataArray[3]))
                {
                    FuelDis.u8DestSeg = 2;
                }
                else if (((FuelDis.u8DestSeg == 4) || (Fuel_Data.u8FuelInitFlag)) && (Fuel_Data.Fuel_Res >= Fuel_Data.FuelDataArray[4]))
                {
                    FuelDis.u8DestSeg = 3;
                }
                else if (((FuelDis.u8DestSeg == 5) || (Fuel_Data.u8FuelInitFlag)) && (Fuel_Data.Fuel_Res >= Fuel_Data.FuelDataArray[5]))
                {
                    FuelDis.u8DestSeg = 4;
                }
            }
            if (Fuel_Data.u8FuelInitFlag == 1) /* 首次上电 当前格等于目标格 */
            {
                FuelDis.u8Curseg = FuelDis.u8DestSeg;
                Fuel_Data.u8FuelInitFlag = 0;
            }
        }

        /* 阻尼处理 上升下降每10S一格 */
        if (FuelDis.u8Curseg > FuelDis.u8DestSeg) /* 下降方向 */
        {
            FuelDis.u16Up_Timer = 0;
            FuelDis.u16Down_Timer += deltaTime;
            if (FuelDis.u16Down_Timer >= Creep_Down_Up_Timer)
            {
                FuelDis.u8Curseg--;
                FuelDis.u16Down_Timer = 0;
            }
        }
        else if (FuelDis.u8Curseg < FuelDis.u8DestSeg) /* 上升方向 */
        {
            FuelDis.u16Down_Timer = 0;
            FuelDis.u16Up_Timer += deltaTime;
            if (FuelDis.u16Up_Timer >= Creep_Down_Up_Timer)
            {
                FuelDis.u8Curseg++;
                FuelDis.u16Up_Timer = 0;
            }
        }
        else
        {
            FuelDis.u16Down_Timer = 0;
            FuelDis.u16Up_Timer = 0;
            FuelDis.u8Curseg = FuelDis.u8DestSeg;
        }
    }
}

/**
 * @brief 用于计算燃油电阻值
 * 10ms 调用
 */
void Fuel_Res_Call(uint8_t deltaTime)
{
    Fuel_R_Cal(deltaTime);
}

/**
 * @brief 燃油服务函数
 * 100ms
 */
void Fuel_Cal_Sevice(uint8_t deltaTime)
{
    /*检测燃油电阻状态*/
    Fuel_State_Check(deltaTime);
    /*显示燃油格*/
    Fuel_Gauges_Cal(deltaTime);
}

/**
 * @brief 获取燃油当前格数
 * @return 格数 Seg0~Sge5
 */
uint8_t Get_CurFuelSetp(void)
{
    return FuelDis.u8Curseg;
}
/**
 * @brief 获取燃油传感器状态
 * @return 0 FuelSensorNormal
 *         1 FuelSensorShortCircuit
 *         2 FuelSensorOpenCircuit
 */
FuelSensorSts_t Get_Fuel_Sensor_State(void)
{
    return Fuel_Data.FuelSensorState;
}