#include "UDS_22Service_Main.h"
#include "UDS_Common.h"
/*EcuPartNumber(电控单元零件号)*/
const uint8_t DID_22_F187[12]   = {'5','8','0','3','3','1','2','6','7','1',0x20,0x20};
/*SystemSupplierID(系统供应商标识号)*/
const uint8_t DID_22_F18A[10]    = {'1','7','3','8',0x20,0x20,0x20,0x20,0x20,0x20};
/*Supplier ECU Serial Number(供应商电控单元序列号) */
const uint8_t DID_22_F190[17]   = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
/*ECUHardwareNumberDataIdentifier(硬件号)*/
const uint8_t DID_22_F192[16]   = {'5','8','0','3','3','1','0','8','1','8',0x20,0x20,0x20,0x20,0x20,0x20};
/*ECUHardwareVersionNumberDataIdentifier(硬件版本号)*/
const uint8_t DID_22_F193[8]   = {'V','1','.','0',0x20,0x20,0x20,0x20};
/*ECUHardwareVersionNumberDataIdentifier(软件号)*/
const uint8_t DID_22_F194[16]   = {'5','8','0','3','3','1','0','8','1','7',0x20,0x20,0x20,0x20,0x20,0x20};
/*ECUSoftwareVersionNumberDataIdentifier(软件版本号)*/
const uint8_t DID_22_F195[8]   = {'V','1','.','2',0x20,0x20,0x20,0x20};
/*SystemNameDataIdentifier(ECU名称)*/
const uint8_t DID_22_F197[10]   = {'I','C','-','N','S','2','0','8','-','2'};
/*EOLProgrammingDate*/
const uint8_t DID_22_F1B7[3]   = {0x23,0x07,0x18};
/*EOLProgrammingToolVersion*/
const uint8_t DID_22_F1B8[2]   = {0x01,0x00};
/*PlantTraceabilityInformations*/
const uint8_t DID_22_F1C5[42]   = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                                    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                                    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
                                  };
/*TeleservicesTraceabilityInformations*/
const uint8_t DID_22_F1C6[51]   = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                                    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                                    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                                    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,};
/*BootloaderSoftwareVersionNumberDataIdentifier(Bootloader软件版本号*/
const uint8_t DID_22_F180[8]   = {'V','1','.','0',0x20,0x20,0x20,0x20};
/*EOL DataIdentifier(下线配置)--见4.3.DIDs_Config页*/
const uint8_t DID_22_F010[8]   = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
/*ReadFingerprint DataIdentifier(读指纹)*/
const uint8_t DID_22_F15B[30]   = {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
                                   0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};
/*CarCfg3(ABS9.0诊断配置)*/
const uint8_t DID_22_1E01[16]   = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};






/**
  *22服务函数入口
  *@param A_TA_type 收到数据的地址
  *@param A_Length 收到数据的长度
  *@param A_Data 收到数据的数据
  */
void UDS_Service_22_Indication(uint32_t A_TA_type, uint16_t A_Length, uint8_t A_Data[])
{
    uint8_t NRC = positiveResponse;
    setDiagMSG(A_TA_type, A_Length, A_Data);
    if(NRC == positiveResponse)
    {
        NRC = UDS_22Service_NRC11();                                            /*22服务是否支持功能寻址*/
    }
    if(NRC == positiveResponse)
    {
        NRC = UDS_22Service_NRC7F();                                            /*22服务会话是否支持验证*/
    }
    if(NRC == positiveResponse)
    {
        NRC = UDS_22Service_NRC33();                                            /*22服务解锁等级验证*/
    }
    if(NRC == positiveResponse)
    {
        NRC = UDS_22Service_NRC13_MinLengthCheck();                             /*22服务最小长度验证*/
    }
    if(NRC == positiveResponse)
    {
        NRC = UDS_22Service_NRC31();                                            /*22服务超出请求范围验证*/
    }
    if(NRC == positiveResponse)
    {
        NRC = UDS_22Service_NRC13_TotalLengthCheck();                           /*22服务总长度长度验证*/
    }
    if(NRC == positiveResponse)
    {
        NRC = UDS_22Service_NRC22();                                            /*22服务条件验证*/
    }
    if(NRC == positiveResponse)
    {
        UDS_22Service_DID();                                                    /*22服务DID判断*/
    }
    clearDiagMSG();                                                             /*清除诊断信息*/
}


/**
  *22服务子功能
  */
void UDS_22Service_DID(void)
{

    switch(getDID(DiagMSG.msgData.DidDetail.DID_H, DiagMSG.msgData.DidDetail.DID_L))/*22服务DID判断*/
    {
        case 0xF187:
            UDS_22Service_DID_F187(  );
        break;
        case 0xF18A:
            UDS_22Service_DID_F18A(  );
        break;
        case 0xF18B:
            UDS_22Service_DID_F18B(  );
        break;
        case 0xF18C:
            UDS_22Service_DID_F18C(  );
        break;
        case 0xF190:
            UDS_22Service_DID_F190(  );
        break;
        case 0xF192:
            UDS_22Service_DID_F192(  );
        break;
        case 0xF193:
            UDS_22Service_DID_F193(  );
        break;
        case 0xF194:
            UDS_22Service_DID_F194(  );
        break;
        case 0xF195:
            UDS_22Service_DID_F195(  );
        break;
        case 0xF197:
            UDS_22Service_DID_F197(  );
        break;
        case 0xF1B0:
            UDS_22Service_DID_F1B0(  );
        break;
        case 0xF1B1:
            UDS_22Service_DID_F1B1(  );
        break;
        case 0xF1B7:
            UDS_22Service_DID_F1B7(  );
        break;
        case 0xF1B8:
            UDS_22Service_DID_F1B8(  );
        break;
        case 0xF1BF:
            UDS_22Service_DID_F1BF(  );
        break;
        case 0xF1C5:
            UDS_22Service_DID_F1C5(  );
        break;
        case 0xF1C6:
            UDS_22Service_DID_F1C6(  );
        break;
        case 0xF186:
            UDS_22Service_DID_F186(  );
        break;
        case 0xF180:
            UDS_22Service_DID_F180(  );
        break;
        case 0xF010:
            UDS_22Service_DID_F010(  );
        break;
        case 0xF15B:
            UDS_22Service_DID_F15B(  );
        break;
        case 0xCF00:
            UDS_22Service_DID_CF00(  );
        break;
        case 0xCF01:
            UDS_22Service_DID_CF01(  );
        break;
        case 0xCF02:
            UDS_22Service_DID_CF02(  );
        break;
        case 0xCF03:
            UDS_22Service_DID_CF03(  );
        break;
        case 0xCF04:
            UDS_22Service_DID_CF04(  );
        break;
        case 0x1E00:
            UDS_22Service_DID_1E00(  );
        break;
        case 0x1E01:
            UDS_22Service_DID_1E01(  );
        break;
    default:
        break;
    }
}

/**
  *22服务DIDF187
  *EcuPartNumber(电控单元零件号)
  */
void UDS_22Service_DID_F187(void)
{
    memcpy(DiagMSG.msgData.DidDetail.Data, DID_22_F187, sizeof(DID_22_F187));
    UDS_Service_Response(0x22u, POSITIVE_RSP, DIAG_ID_Tx, 2u + sizeof(DID_22_F187), DiagMSG.msgData.Data);
}

/**
  *22服务DIDF18A
  *SystemSupplierID(系统供应商标识号)
  */
void UDS_22Service_DID_F18A(void)
{
    memcpy(DiagMSG.msgData.DidDetail.Data, DID_22_F18A, sizeof(DID_22_F18A));
    UDS_Service_Response(0x22u, POSITIVE_RSP, DIAG_ID_Tx, 2u + sizeof(DID_22_F18A), DiagMSG.msgData.Data);
}

/**
  *22服务DIDF18B
  *ECU Manufacture Date(电控单元制造日期)
  */
void UDS_22Service_DID_F18B(void)
{
    memcpy(DiagMSG.msgData.DidDetail.Data, Ser2EToDFlashInfo.DID_F18B, sizeof(Ser2EToDFlashInfo.DID_F18B));
    UDS_Service_Response(0x22u, POSITIVE_RSP, DIAG_ID_Tx, 2u + sizeof(Ser2EToDFlashInfo.DID_F18B), DiagMSG.msgData.Data);
}

/**
  *22服务DIDF18C
  *ECU Manufacture Date(电控单元制造日期)
  */
void UDS_22Service_DID_F18C(void)
{
    memcpy(DiagMSG.msgData.DidDetail.Data, Ser2EToDFlashInfo.DID_F18C, sizeof(Ser2EToDFlashInfo.DID_F18C));
    UDS_Service_Response(0x22u, POSITIVE_RSP, DIAG_ID_Tx, 2u + sizeof(Ser2EToDFlashInfo.DID_F18C), DiagMSG.msgData.Data);
}

/**
  *22服务DIDF190
  *VIN(车辆识别代码)
  */
void UDS_22Service_DID_F190(void)
{
    memcpy(DiagMSG.msgData.DidDetail.Data, Ser2EToDFlashInfo.DID_F190, sizeof(Ser2EToDFlashInfo.DID_F190));
    UDS_Service_Response(0x22u, POSITIVE_RSP, DIAG_ID_Tx, 2u + sizeof(Ser2EToDFlashInfo.DID_F190), DiagMSG.msgData.Data);
}

/**
  *22服务DIDF192
  *ECUHardwareNumberDataIdentifier(硬件号)
  */
void UDS_22Service_DID_F192(void)
{
    memcpy(DiagMSG.msgData.DidDetail.Data, DID_22_F192, sizeof(DID_22_F192));
    UDS_Service_Response(0x22u, POSITIVE_RSP, DIAG_ID_Tx, 2u + sizeof(DID_22_F192), DiagMSG.msgData.Data);
}

/**
  *22服务DIDF193
  *ECUHardwareVersionNumberDataIdentifier(硬件版本号
  */
void UDS_22Service_DID_F193(void)
{
    memcpy(DiagMSG.msgData.DidDetail.Data, DID_22_F193, sizeof(DID_22_F193));
    UDS_Service_Response(0x22u, POSITIVE_RSP, DIAG_ID_Tx, 2u + sizeof(DID_22_F193), DiagMSG.msgData.Data);
}

/**
  *22服务DIDF194
  *ECUHardwareVersionNumberDataIdentifier(软件号)
  */
void UDS_22Service_DID_F194(void)
{
    memcpy(DiagMSG.msgData.DidDetail.Data, DID_22_F194, sizeof(DID_22_F194));
    UDS_Service_Response(0x22u, POSITIVE_RSP, DIAG_ID_Tx, 2u + sizeof(DID_22_F194), DiagMSG.msgData.Data);
}

/**
  *22服务DIDF195
  *ECUSoftwareVersionNumberDataIdentifier(软件版本号)
  */
void UDS_22Service_DID_F195(void)
{
    memcpy(DiagMSG.msgData.DidDetail.Data, DID_22_F195, sizeof(DID_22_F195));
    UDS_Service_Response(0x22u, POSITIVE_RSP, DIAG_ID_Tx, 2u + sizeof(DID_22_F195), DiagMSG.msgData.Data);
}

/**
  *22服务DIDF197
  *SystemNameDataIdentifier(ECU名称)
  */
void UDS_22Service_DID_F197(void)
{
    memcpy(DiagMSG.msgData.DidDetail.Data, DID_22_F197, sizeof(DID_22_F197));
    UDS_Service_Response(0x22u, POSITIVE_RSP, DIAG_ID_Tx, 2u + sizeof(DID_22_F197), DiagMSG.msgData.Data);
}

/**
  *22服务DIDF1B0
  *VanOrGan
  */
void UDS_22Service_DID_F1B0(void)
{
    memcpy(DiagMSG.msgData.DidDetail.Data, Ser2EToDFlashInfo.DID_F1B0, sizeof(Ser2EToDFlashInfo.DID_F1B0));
    UDS_Service_Response(0x22u, POSITIVE_RSP, DIAG_ID_Tx, 2u + sizeof(Ser2EToDFlashInfo.DID_F1B0), DiagMSG.msgData.Data);
}

/**
  *22服务DIDF1B1
  *CustomerCode
  */
void UDS_22Service_DID_F1B1(void)
{
    memcpy(DiagMSG.msgData.DidDetail.Data, Ser2EToDFlashInfo.DID_F1B1, sizeof(Ser2EToDFlashInfo.DID_F1B1));
    UDS_Service_Response(0x22u, POSITIVE_RSP, DIAG_ID_Tx, 2u + sizeof(Ser2EToDFlashInfo.DID_F1B1), DiagMSG.msgData.Data);
}

/**
  *22服务DIDF1B7
  *EOLProgrammingDate
  */
void UDS_22Service_DID_F1B7(void)
{
    memcpy(DiagMSG.msgData.DidDetail.Data, Ser2EToDFlashInfo.DID_F1B7, sizeof(Ser2EToDFlashInfo.DID_F1B7));
    UDS_Service_Response(0x22u, POSITIVE_RSP, DIAG_ID_Tx, 2u + sizeof(Ser2EToDFlashInfo.DID_F1B7), DiagMSG.msgData.Data);
}

/**
  *22服务DIDF1B8
  *EOLTesterCode
  */
void UDS_22Service_DID_F1B8(void)
{
    memcpy(DiagMSG.msgData.DidDetail.Data, Ser2EToDFlashInfo.DID_F1B8, sizeof(Ser2EToDFlashInfo.DID_F1B8));
    UDS_Service_Response(0x22u, POSITIVE_RSP, DIAG_ID_Tx, 2u + sizeof(Ser2EToDFlashInfo.DID_F1B8), DiagMSG.msgData.Data);
}

/**
  *22服务DIDF1C5
  *PlantTraceabilityInformations
  */
void UDS_22Service_DID_F1BF(void)
{
    memcpy(DiagMSG.msgData.DidDetail.Data, Ser2EToDFlashInfo.DID_F1BF, sizeof(Ser2EToDFlashInfo.DID_F1BF));
    UDS_Service_Response(0x22u, POSITIVE_RSP, DIAG_ID_Tx, 2u + sizeof(Ser2EToDFlashInfo.DID_F1BF), DiagMSG.msgData.Data);
}
/**
  *22服务DIDF1C5
  *PlantTraceabilityInformations
  */
void UDS_22Service_DID_F1C5(void)
{
    memcpy(DiagMSG.msgData.DidDetail.Data, Ser2EToDFlashInfo.DID_F1C5, sizeof(Ser2EToDFlashInfo.DID_F1C5));
    UDS_Service_Response(0x22u, POSITIVE_RSP, DIAG_ID_Tx, 2u + sizeof(Ser2EToDFlashInfo.DID_F1C5), DiagMSG.msgData.Data);
}
/**
  *22服务DIDF1C6
  *TeleservicesTraceabilityInformations
  */
void UDS_22Service_DID_F1C6(void)
{
    memcpy(DiagMSG.msgData.DidDetail.Data, Ser2EToDFlashInfo.DID_F1C6, sizeof(Ser2EToDFlashInfo.DID_F1C6));
    UDS_Service_Response(0x22u, POSITIVE_RSP, DIAG_ID_Tx, 2u + sizeof(Ser2EToDFlashInfo.DID_F1C6), DiagMSG.msgData.Data);
}

/**
  *22服务DIDF186
  *activeDiagnosticSessionDataIdentifier
(当前诊断会话模式标识符)
  */
void UDS_22Service_DID_F186(void)
{
    DiagMSG.msgData.DidDetail.Data[0] = getSessionType();
    UDS_Service_Response(0x22u, POSITIVE_RSP, DIAG_ID_Tx, 2u + 1, DiagMSG.msgData.Data);
}

/**
  *22服务DIDF180
  *BootloaderSoftwareVersionNumberDataIdentifier
(Bootloader软件版本号))
  */
void UDS_22Service_DID_F180(void)
{
    memcpy(DiagMSG.msgData.DidDetail.Data, DID_22_F180, sizeof(DID_22_F180));
    UDS_Service_Response(0x22u, POSITIVE_RSP, DIAG_ID_Tx, 2u + sizeof(DID_22_F180), DiagMSG.msgData.Data);
}

/**
  *22服务DIDF010
  *EOL DataIdentifier
(下线配置)
--见4.3.DIDs_Config页
  */
void UDS_22Service_DID_F010(void)
{
    memcpy(DiagMSG.msgData.DidDetail.Data, EOLToDFlashInfo.DID_F010, sizeof(EOLToDFlashInfo.DID_F010));
    UDS_Service_Response(0x22u, POSITIVE_RSP, DIAG_ID_Tx, 2u + sizeof(EOLToDFlashInfo.DID_F010), DiagMSG.msgData.Data);
}

/**
  *22服务DIDF15B
  *ReadFingerprint DataIdentifier
(读指纹)
  */
void UDS_22Service_DID_F15B(void)
{
    //uint8_t MsgLen;
    //if((BootToDFlashInfo.DID_F15B[0] == 0xFF) && (BootToDFlashInfo.DID_F15B[10] == 0xFF) && (BootToDFlashInfo.DID_F15B[20] == 0xFF))
    //{
    //  MsgLen = 0;
    //}
    //else if((BootToDFlashInfo.DID_F15B[10] == 0xFF) && (BootToDFlashInfo.DID_F15B[20] == 0xFF))
    //{
    //  memcpy(DiagMSG.msgData.DidDetail.Data,(uint8_t *)&BootToDFlashInfo.DID_F15B[0],10);
    //  MsgLen = 10;
    //}
    //else if((BootToDFlashInfo.DID_F15B[20] == 0xFF) && (BootToDFlashInfo.DID_F15B[21] == 0xFF))
    //{
    //  memcpy(DiagMSG.msgData.DidDetail.Data,(uint8_t *)&BootToDFlashInfo.DID_F15B[0],20);
    //  MsgLen = 20;
    //}
    //else
    //{
    //  memcpy(DiagMSG.msgData.DidDetail.Data,(uint8_t *)&BootToDFlashInfo.DID_F15B[0],30);
    //  MsgLen = 30;
    //}
    memcpy(DiagMSG.msgData.DidDetail.Data, BootToDFlashInfo.DID_F15B, 10);
    DiagMSG.msgData.DidDetail.Data[0] = 0;
    UDS_Service_Response(0x22u, POSITIVE_RSP, DIAG_ID_Tx, 2u + 10, DiagMSG.msgData.Data);
}

/**
  *22服务DIDCF00
  *Battery_Voltage 
(电压)
  */
void UDS_22Service_DID_CF00(void)
{
    DiagMSG.msgData.DidDetail.Data[1] = (getKL30Voltage() / 50) >> 8;
    DiagMSG.msgData.DidDetail.Data[0] = getKL30Voltage() / 50;
    UDS_Service_Response(0x22u, POSITIVE_RSP, DIAG_ID_Tx, 2u + 2, DiagMSG.msgData.Data);
}

/**
  *22服务DIDCF01
  *Vehicle_Speed
(车速)
  */
void UDS_22Service_DID_CF01(void)
{
    DiagMSG.msgData.DidDetail.Data[1] = (getActVehicleSpeed() * 8 / 5) >> 8;
    DiagMSG.msgData.DidDetail.Data[0] = getActVehicleSpeed() *  8 / 5;
    UDS_Service_Response(0x22u, POSITIVE_RSP, DIAG_ID_Tx, 2u + 2, DiagMSG.msgData.Data);
}

/**
  *22服务DIDCF02
  *Engine_Speed
(转速)
  */
void UDS_22Service_DID_CF02(void)
{
    DiagMSG.msgData.DidDetail.Data[1] = (Get_DispEngineSpeed() * 8) >> 8;
    DiagMSG.msgData.DidDetail.Data[0] = Get_DispEngineSpeed() * 8;
    UDS_Service_Response(0x22u, POSITIVE_RSP, DIAG_ID_Tx, 2u + 2, DiagMSG.msgData.Data);
}

/**
  *22服务DIDCF03
  *Odometer
(里程)
  */
void UDS_22Service_DID_CF03(void)
{
    DiagMSG.msgData.DidDetail.Data[0] = getTotalOdometer() >> 24;
    DiagMSG.msgData.DidDetail.Data[1] = getTotalOdometer() >> 16;
    DiagMSG.msgData.DidDetail.Data[2] = getTotalOdometer() >> 8;
    DiagMSG.msgData.DidDetail.Data[3] = getTotalOdometer();
    UDS_Service_Response(0x22u, POSITIVE_RSP, DIAG_ID_Tx, 2u + 4, DiagMSG.msgData.Data);
}

/**
  *22服务DIDCF04
  *Odometer
(第一次故障里程)
  */
void UDS_22Service_DID_CF04(void)
{
    DiagMSG.msgData.DidDetail.Data[0] = getTotalOdometer() >> 24;
    DiagMSG.msgData.DidDetail.Data[1] = getTotalOdometer() >> 16;
    DiagMSG.msgData.DidDetail.Data[2] = getTotalOdometer() >> 8;
    DiagMSG.msgData.DidDetail.Data[3] = getTotalOdometer();
    UDS_Service_Response(0x22u, POSITIVE_RSP, DIAG_ID_Tx, 2u + 4, DiagMSG.msgData.Data);
}

/**
  *22服务DID1E00
  *Maintenance 
(保养配置)
  */
void UDS_22Service_DID_1E00(void)
{
    memcpy(DiagMSG.msgData.DidDetail.Data, Ser2EToDFlashInfo.DID_1E00, sizeof(Ser2EToDFlashInfo.DID_1E00));
    UDS_Service_Response(0x22u, POSITIVE_RSP, DIAG_ID_Tx, 2u + 5, DiagMSG.msgData.Data);
}

/**
  *22服务DID1E01
  *CarCfg3
(ABS9.0诊断配置)
  */
void UDS_22Service_DID_1E01(void)
{
    memcpy(DiagMSG.msgData.DidDetail.Data, Ser2EToDFlashInfo.DID_1E01, sizeof(Ser2EToDFlashInfo.DID_1E01));
    UDS_Service_Response(0x22u, POSITIVE_RSP, DIAG_ID_Tx, 2u + sizeof(Ser2EToDFlashInfo.DID_1E01), DiagMSG.msgData.Data);
}