#include "UDS_DTC.h"
//#include "Services_ODO.h"

uint8_t isNeedSaveDTC = 0u;
uint8_t HVoltageStatus = 0u;
uint8_t LVoltageStatus = 0u;

/**
  *DTC列表
  */
const uint32_t DTCList[18u][2u] = 
{
    {U100700, 1u},
    {U100701, 1u},
    {U100702, 1u},
    {U100703, 1u},
    {U100706, 1u},
    {U10070F, 1u},
    {U100710, 1u},
    {B110000, 1u},
    {B110001, 1u},
    {B110002, 1u},
    {B110005, 1u},
    {B110006, 1u},
    {B110007, 1u},
    {B110008, 1u},
    {B110009, 1u},
    {B11000A, 1u},
    {B11000B, 1u},
    {B11000C, 1u},
};

/**
  *DTC发生时间
  */
uint32_t DTCTimerList[18u] = {0u};

/**
  *msg列表
  */
uint32_t msgList[6][4] = 
{
    {0x18FFC325ul, 8u,  200u ,0u},
    {0x18FFDA21ul, 8u,  200u ,0u},
    {0x18FE4EECul, 8u,  100u ,0u},
    {0x18FF14E8ul, 8u,  100u ,0u},//周期不知道
    {0x18F0010Bul, 8u,  100u ,0u},
    {0x0CF00400ul, 8u,  10u ,0u},
};

/**
  *测试DTC
  *@param timer 计时器增加的时间，单位：ms
  */
void TestDTC(uint16_t timer)
{
    if(getKL15Status())
    {
        if(!getEngStatus())
        {
            TestDTC_B110001(timer);                                         /*检测控制模块输入电压低*/
            TestDTC_B110000(timer);                                         /*检测控制模块输入电压高*/
            if(!getPowerStatus())
            {
                TestDTC_U100700();                                          /*检测can总线关闭*/
                TestDTC_B110002();                                          /*EEPROM 故障*/
                TestDTC_B110005();                                          /*气压传感器1开路/对地短路故障*/
                TestDTC_B110006();                                          /* 气压传感器1对电源短路故障*/
                TestDTC_B110007();                                          /*气压传感器2开路/对地短路故障*/   
                TestDTC_B110008();                                          /*气压传感器2开路对电源短路故障*/
                TestDTC_B110009();                                          /*驱动桥1机油温度传感器对地短路故障*/
                TestDTC_B11000A();                                          /* 驱动桥2机油温度传感器对地短路故障*/
                TestDTC_B11000B();                                          /* 转向机油温度传感器对地短路故障*/ 
                TestDTC_B11000C();                                          /*IC 功能limphome故障*/
                if(!getBusoffStatus())
                {
                    if(isDTCEnable())
                    {
                        TestDTC_U100701();                                  /*Switch2通讯丢失*/
                        TestDTC_U100702();                                  /*BCM1通讯丢失*/
                        TestDTC_U100703();                                  /*DCM1通讯丢失*/
                        TestDTC_U100706();                                  /*与车道偏离系统通讯丢失*/
                        TestDTC_U10070F();                                  /*EBC1_ABS通讯丢失*/
                        TestDTC_U100710();                                  /*EEC1通讯丢失*/
                    }
                }
            }
            if(isNeedSaveDTC)
            {
                SaveDTCData();
                isNeedSaveDTC = 0u;
            }
        }
    }
}

/**
  *检测can总线关闭
  */
void TestDTC_U100700(void)
{
    if(DTCList[cnU100700][1u])
    {
        if(getBUS_OFF_FLAG())
        {
            ChangeDTCData(cnU100700, DTCError);
        }
        else
        {
            ChangeDTCData(cnU100700, DTCNoError);
        }
    }
}

/**
  *检测控制模块输入电压低
  *@param timer 计时器增加的时间，单位：ms
  */
void TestDTC_B110001(uint16_t timer)
{
    uint32_t KL30Voltage = 0u;
    if(DTCList[cnB110001][1u])
    {
        KL30Voltage = getKL30Voltage();
        if(KL30Voltage <= MinimumVoltage)
        {
            if(DTCTimerList[cnB110001] == LowVoltageTimer)
            {
                ChangeDTCData(cnB110001, DTCError);
            }
            else
            {
                DTCTimerList[cnB110001] += timer;
            }
        }
        if(KL30Voltage >= RestoreMinimumVoltage)
        {
            if(DTCTimerList[cnB110001] == 0u)
            {
                ChangeDTCData(cnB110001, DTCNoError);
            }
            else
            {
                if(DTCTimerList[cnB110001] > timer)
                {
                    DTCTimerList[cnB110001] -= timer;
                }
                else
                {
                    DTCTimerList[cnB110001] = 0u;
                }
            }
        }
    }
}

/**
  *检测控制模块输入电压高
  *@param timer 计时器增加的时间，单位：ms
  */
void TestDTC_B110000(uint16_t timer)
{
    uint16_t KL30Voltage = 0u;
    if(DTCList[cnB110000][1u])
    {
        KL30Voltage = getKL30Voltage();
        if(KL30Voltage >= MaximumVoltage)
        {
            if(DTCTimerList[cnB110000] == HightVoltageTimer)
            {
                ChangeDTCData(cnB110000, DTCError);
            }
            else
            {
                DTCTimerList[cnB110000] += timer;
            }
        }
        if(KL30Voltage <= RestoreMaximumVoltage)
        {
            if(DTCTimerList[cnB110000] == 0u)
            {
                ChangeDTCData(cnB110000, DTCNoError);
            }
            else
            {
                if(DTCTimerList[cnB110000] > timer)
                {
                    DTCTimerList[cnB110000] -= timer;
                }
                else
                {
                    DTCTimerList[cnB110000] = 0u;
                }
            }
        }
    }
}

/**
  *Switch2通讯丢失
  */
void TestDTC_U100701(void)
{
    if(DTCList[cnU100701][1u])
    {
        //if(Val_EOL_F110_EMS())
        {
            if(getMSGStatus(cnMSG325))
            {
                ChangeDTCData(cnU100701, DTCError);
            }
            else
            {
                ChangeDTCData(cnU100701, DTCNoError);
            }
        }
    }
}

/**
  *BCM1通讯丢失
  */
void TestDTC_U100702(void)
{
    if(DTCList[cnU100702][1u])
    {
        //if(Val_EOL_F110_TCU())
        {
            if(getMSGStatus(cnMSGA21))
            {
                ChangeDTCData(cnU100702, DTCError);
            }
            else
            {
                ChangeDTCData(cnU100702, DTCNoError);
            }
        }
    }
}

/**
  *DCM1通讯丢失
  */
void TestDTC_U100703(void)
{
    if(DTCList[cnU100703][1u])
    {
        //if(Val_EOL_F110_ESC())
        {
            if(getMSGStatus(cnMSGEEC))
            {
                ChangeDTCData(cnU100703, DTCError);
            }
            else
            {
                ChangeDTCData(cnU100703, DTCNoError);
            }
        }
    }
}

/**
  *与车道偏离系统通讯丢失
  */
void TestDTC_U100706(void)
{
    if(DTCList[cnU100706][1u])
    {
        if(Val_EOL_605C_LDWS())
        {
            if(getMSGStatus(cnMSG4E8))
            {
                ChangeDTCData(cnU100706, DTCError);
            }
            else
            {
                ChangeDTCData(cnU100706, DTCNoError);
            }
        }
        
    }
}

/**
  *EBC1_ABS通讯丢失
  */
void TestDTC_U10070F(void)
{
    if(DTCList[cnU10070F][1u])
    {
        //if(Val_EOL_F110_BCM())
        {
            if(getMSGStatus(cnMSG10B))
            {
                ChangeDTCData(cnU10070F, DTCError);
            }
            else
            {
                ChangeDTCData(cnU10070F, DTCNoError);
            }
        }
    }
}

/**
  *EEC1通讯丢失
  */
void TestDTC_U100710(void)
{
    if(DTCList[cnU100710][1u])
    {
        //if(Val_EOL_F110_GW())
        {
            if(getMSGStatus(cnMSG400))
            {
                ChangeDTCData(cnU100710, DTCError);
            }
            else
            {
                ChangeDTCData(cnU100710, DTCNoError);
            }
        }
    }
}

/**
  *EEPROM 故障
  */
void TestDTC_B110002(void)
{

}

/**
  *气压传感器1开路/对地短路故障
  */
void TestDTC_B110005(void)
{
    if(DTCList[cnB110005][1u])
    {
        if(0u)
        {
            ChangeDTCData(cnB110005, DTCError);
        }
        else
        {
            ChangeDTCData(cnB110005, DTCNoError);
        }
    }
}

/**
  *气压传感器1对电源短路故障
  */
void TestDTC_B110006(void)
{
    if(DTCList[cnB110006][1u])
    {
        if(0u)
        {
            ChangeDTCData(cnB110006, DTCError);
        }
        else
        {
            ChangeDTCData(cnB110006, DTCNoError);
        }
    }
}

/**
  *气压传感器2开路/对地短路故障
  */
void TestDTC_B110007(void)      
{

}    

/**
  *气压传感器2开路对电源短路故障
  */                                   
void TestDTC_B110008(void)
{

}                                          

/**
  *驱动桥1机油温度传感器对地短路故障
  */ 
void TestDTC_B110009(void)
{

}                                          

/**
  *驱动桥2机油温度传感器对地短路故障
  */
void TestDTC_B11000A(void)
{

}                                          

/**
  *转向机油温度传感器对地短路故障
  */
void TestDTC_B11000B(void)
{

}                                         

/**
  *IC 功能limphome故障
  */
void TestDTC_B11000C(void)
{

}                                          

/**
  *获取30电电压状态
  *@return 30电电压状态 0为电压正常,1为低压,2为高压
  */
uint8_t getPowerStatus(void)
{
    uint8_t  enResult = NormalVottage;
    uint32_t KL30Voltage = getKL30Voltage();
    
    if((KL30Voltage >= 16000u) && (KL30Voltage <= 32000u))
    {
        //if(LVoltageStatus == 1u)
        {
            if(KL30Voltage < 17000u)
            {
                enResult = LowVottage;
                setDTCEnableTimer(H_LVoltageDTCEnableTimer);
            }
            else
            {
                LVoltageStatus = 0u;
                enResult = NormalVottage;
            }
        }
        //else if(HVoltageStatus == 1u)
        {
            if(KL30Voltage > 31000u)
            {
                enResult = HightVottage;
                setDTCEnableTimer(H_LVoltageDTCEnableTimer);
            }
            else
            {
                HVoltageStatus = 0u;
                enResult = NormalVottage;
            }
        }
        //else
        {
            enResult = NormalVottage;
        }
    }
    else if(KL30Voltage > 16000u)
    {
        HVoltageStatus = 1u;
        enResult = HightVottage;
        setDTCEnableTimer(H_LVoltageDTCEnableTimer);
    }
    else
    {
        LVoltageStatus = 1u;
        enResult = LowVottage;
        setDTCEnableTimer(H_LVoltageDTCEnableTimer);
    }
    return enResult;
}

/**
  *获取busoff状态
  *@return busoff状态 0为正常,1为异常
  */
uint8_t getBusoffStatus(void)
{
    if(getBUS_OFF_Status())
    {
        setDTCEnableTimer(BusOffDTCEnableTimer);
    }
    return getBUS_OFF_Status();
    //return 0;
}

/**
  *获取发动机启动状态
  *@return EngStatus 0为未启动,1为启动
  */
uint8_t getEngStatus(void)
{
    return 0u;
}

/**
  *获取报文状态
  *@param cnMsgID 报文数组下标
  *@return 报文状态 0为在线,1为掉线
  */
uint8_t getMSGStatus(uint8_t cnMsgID)
{
    uint8_t enResult;
    if(msgList[cnMsgID][3u] < msgList[cnMsgID][2u] * OfflineLoopMultiple)
    {
        enResult = 0u;
    }
    else
    {
        enResult = 1u;
    }
    return enResult;
}

/**
  *更改DTC状态
  *@param DTCNum DTC编号
  *@param DTCStatus DTC状态
  */
void ChangeDTCData(uint8_t DTCNum, uint8_t DTCStatus)
{
    if(DTCTestIsOpen())
    {
        if((uint8_t)(DTCToDFlashInfo.DTC[DTCNum].DTCStatus & DTCNoTestLastClear) == DTCNoTestLastClear)
        {
            DTCToDFlashInfo.DTC[DTCNum].DTCStatus &= (uint8_t)(~DTCNoTestLastClear);
        }
        if((uint8_t)(DTCToDFlashInfo.DTC[DTCNum].DTCStatus & DTCNoTestThisCycle) == DTCNoTestThisCycle)
        {
            DTCToDFlashInfo.DTC[DTCNum].DTCStatus &= (uint8_t)(~DTCNoTestThisCycle);
        }
        if(DTCStatus == DTCError)
        {
            if((uint8_t)(DTCToDFlashInfo.DTC[DTCNum].DTCStatus & DTCError) != DTCError)
            {
                DTCToDFlashInfo.DTC[DTCNum].DTCStatus |= DTCError;
                if((uint8_t)(DTCToDFlashInfo.DTC[DTCNum].DTCStatus & DTCErrorThisCycle) != DTCErrorThisCycle)
                {
                    DTCToDFlashInfo.DTC[DTCNum].DTCStatus |= DTCErrorThisCycle;
                    DTCToDFlashInfo.DTC[DTCNum].DTCAgeing = 0u;
                    DTCToDFlashInfo.DTC[DTCNum].DTCPendingCount++;
                    if(DTCToDFlashInfo.DTC[DTCNum].DTCPendingCount >= MaxDTCPendingCount)
                    {
                        if((uint8_t)(DTCToDFlashInfo.DTC[DTCNum].DTCStatus & DTCConfirmed) != DTCConfirmed)
                        {
                            DTCToDFlashInfo.DTC[DTCNum].DTCStatus |= DTCConfirmed;
                        }
                    }
                }
                if((uint8_t)(DTCToDFlashInfo.DTC[DTCNum].DTCStatus & DTCPending) != DTCPending)
                {
                    DTCToDFlashInfo.DTC[DTCNum].DTCStatus |= DTCPending;
                }
                if((uint8_t)(DTCToDFlashInfo.DTC[DTCNum].DTCStatus & DTCErrorLastClear) != DTCErrorLastClear)
                {
                    DTCToDFlashInfo.DTC[DTCNum].DTCStatus |= DTCErrorLastClear;
                }
                /*DTCToDFlashInfo.DTC[DTCNum].Snapshot.ECUPowerVoltage = (uint8_t)(getKL30Voltage() / 100u);
                DTCToDFlashInfo.DTC[DTCNum].Snapshot.VehicleSpeed = 0u;
                if(DTCToDFlashInfo.DTC[DTCNum].Snapshot.OccurrenceCounter == 0u)
                {
                    DTCToDFlashInfo.DTC[DTCNum].Snapshot.FirstMalfunction = (Data_ODO_Read() / 10u);
                }
                if(DTCToDFlashInfo.DTC[DTCNum].Snapshot.OccurrenceCounter < 255u)
                {
                    DTCToDFlashInfo.DTC[DTCNum].Snapshot.OccurrenceCounter++;
                }
                DTCToDFlashInfo.DTC[DTCNum].Snapshot.LastMalfunction = (Data_ODO_Read() / 10u);*/
                isNeedSaveDTC = 1u;
            }
        }
        else
        {
            if((uint8_t)(DTCToDFlashInfo.DTC[DTCNum].DTCStatus & DTCError) == DTCError)
            {
                DTCToDFlashInfo.DTC[DTCNum].DTCStatus &= DTCNoError;
                isNeedSaveDTC = 1u;
            }
        }
    }
}

/**
  *保存DTC状态
  */
void SaveDTCData(void)
{
    WriteDFlashData(EEPROM_BLOCK_UDS_DTC, (uint32_t *)&DTCToDFlashInfo.Flag, sizeof(DTCToDFlashInfo) / 4u, NoNeedWait);
}
