#include "UDS_22Service_Main.h"

/**
  *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_NRC13_MinLengthCheck();                             /*22服务最小长度验证*/
    }
    if(NRC == positiveResponse)
    {
        NRC = UDS_22Service_NRC31();                                            /*22服务超出请求范围验证*/
    }
    if(NRC == positiveResponse)
    {
        NRC = UDS_22Service_NRC13_TotalLengthCheck();      
    }
    if(NRC == positiveResponse)         
    {
        UDS_22Service_DID();                                                    /*22服务DID判断*/
    }
    clearDiagMSG();                                                             /*清除诊断信息*/
}
const uint8_t Ser22_DID_F113[4] = {0x01, 0x03, 0x04, 0x04};                     /*诊断协议版本*/
const uint8_t Ser22_DID_F182[] = "";                                            /*标定版本号*/
const uint8_t Ser22_DID_F18A[6] = {'4', '5', '1', '0', '0', '3'};               /*供应商识别号*/
const uint8_t Ser22_DID_F18B[4] = {0x20, 0x21, 0x08, 0x26};                     /*ECU制造日期*/
const uint8_t Ser22_DID_F18C[] = "0000";                                        /*ECU序列号*/
const uint8_t Ser22_DID_F191[10] = {'H', 'W', '.', '0', '0', '0', '.', '0', '0', '1'};                                      /*主机厂定义的硬件版本编号*/
const uint8_t Ser22_DID_F195[] = "100";                       	                /*供应商ECU软件版本号*/
const uint8_t Ser22_DID_F1AA[8];                                                /*ECU核心总成零部件号*/
const uint8_t Ser22_DID_F1AE[] = "";                                            /*ECU软件零件号*/
const uint8_t Ser22_DID_6209[16] = "";                                          /*第二软件版本号*/
const uint8_t Ser22_DID_6983[3] = "";                                           /*抬头显示屏控制器软件版本*/
const uint8_t Ser22_DID_6984[2] = "";                                           /*抬头显示屏控制器硬件版本*/
const uint8_t Ser22_DID_6985[3] = "";                                           /*抬头显示屏控制器 EEPROM数据版本*/
/**
  *22服务子功能
  */
void UDS_22Service_DID(void)
{
    ReadDFlashData(EEPROM_BLOCK_UDS_ReadBoot, (uint32_t *)&BootToDFlashInfo.Flag, sizeof(BootToDFlashInfo), BootToDFlashInfoInit);
    ReadDFlashData(EEPROM_BLOCK_UDS_S2E, (uint32_t *)&Ser2EToDFlashInfo.Flag, sizeof(Ser2EToDFlashInfo), Ser2EToDFlashInfoInit);
    switch(getDID(DiagMSG.msgData.DidDetail.DID_H, DiagMSG.msgData.DidDetail.DID_L))/*22服务DID判断*/
    {
    case 0x0200:
        UDS_22Service_DID_0200();                                               /*成功刷写次数*/
        break;
    case 0x0201:
        UDS_22Service_DID_0201();                                               /*刷写尝试次数*/
        break;
    case 0x7101:
        UDS_22Service_DID_7101();                                               /*首保里程*/
        break;        
    case 0x7102:
        UDS_22Service_DID_7102();                                               /*非首保里程*/
        break;        
    case 0x7103:
        UDS_22Service_DID_7103();                                               /*清保养里程标志位*/
        break;        
    case 0x7104:
        UDS_22Service_DID_7104();                                               /*累计里程清零标志位*/
        break;              
    case 0xDFEC:
        UDS_22Service_DID_DFEC();                                               /*功能配置字备份数据4*/
        break;
    case 0xDFED:
        UDS_22Service_DID_DFED();                                               /*功能配置字备份数据3*/
        break;
    case 0xDFEE:
        UDS_22Service_DID_DFEE();                                               /*功能配置字备份数据2*/
        break;
    case 0xDFEF:
        UDS_22Service_DID_DFEF();                                               /*功能配置字备份数据*/
        break;
    case 0xF100:
        UDS_22Service_DID_F100();                                               /*网络拓扑配置*/
        break;
    case 0xF101:
        UDS_22Service_DID_F101();                                               /*ECU功能配置1*/
        break; 
    case 0xF102:
        UDS_22Service_DID_F102();                                               /*ECU功能配置2*/
        break;        
    case 0xF110:
        UDS_22Service_DID_F110();                                               /*网络配置*/
        break;                            
    case 0xF112:
        UDS_22Service_DID_F112();                                               /*车辆名称*/
        break;
    case 0xF113:
        UDS_22Service_DID_F113();                                               /*诊断协议版本*/
        break;
    case 0xF180:
        UDS_22Service_DID_F180();                                               /*引导程序软件识别号*/
        break;
    case 0xF182:
        UDS_22Service_DID_F182();                                               /*标定版本号*/
        break;
    case 0xF186:
        UDS_22Service_DID_F186();                                               /*诊断活动会话*/
        break;
    case 0xF187:
        UDS_22Service_DID_F187();                                               /*零件BOM号*/
        break;
    case 0xF189:
        UDS_22Service_DID_F189();                                               /*ECU软件版本号*/
        break;
    case 0xF18A:
        UDS_22Service_DID_F18A();                                               /*供应商识别号*/
        break;
    case 0xF18B:
        UDS_22Service_DID_F18B();                                               /*ECU制造日期*/
        break;
    case 0xF18C:
        UDS_22Service_DID_F18C();                                               /*ECU序列号*/
        break;
    case 0xF190:
        UDS_22Service_DID_F190();                                               /*车辆VIN码*/
        break;
    case 0xF191:
        UDS_22Service_DID_F191();                                               /*主机厂定义的硬件版本编号*/
        break;    
    case 0xF193:
        UDS_22Service_DID_F193();                                               /*供应商ECU硬件版本号*/
        break;
    case 0xF195:
        UDS_22Service_DID_F195();                                               /*供应商ECU软件版本号*/
        break;
    case 0xF197:
        UDS_22Service_DID_F197();                                               /*ECU控制器名称*/
        break;
    case 0xF198:
        UDS_22Service_DID_F198();                                               /*诊断仪序列号*/
        break;
    case 0xF199:
        UDS_22Service_DID_F199();                                               /*ECU软件刷新日期*/
        break;
    case 0xF1A2:
        UDS_22Service_DID_F1A2();                                               /*ECU装配日期*/
        break;
    default:
        break;
    }
}

/**
  *22服务DID0200
  *成功刷写次数
  */
void UDS_22Service_DID_0200(void)
{
    DiagMSG.msgData.DidDetail.Data[0] = BootToDFlashInfo.DID_0200;
    UDS_Service_Response(0x22u, POSITIVE_RSP, DIAG_ID_Tx, 2u + 1u, DiagMSG.msgData.Data);
}

/**
  *22服务DID0201
  *刷写尝试次数
  */
void UDS_22Service_DID_0201(void)
{
    DiagMSG.msgData.DidDetail.Data[0] = BootToDFlashInfo.DID_0201;
    UDS_Service_Response(0x22u, POSITIVE_RSP, DIAG_ID_Tx, 2u + 1u, DiagMSG.msgData.Data);
}
    
/**
  *22服务DID7101
  *首保里程
  */
void UDS_22Service_DID_7101(void)
{   
    memcpy(DiagMSG.msgData.DidDetail.Data, Ser2EToDFlashInfo.DID_7101, sizeof(Ser2EToDFlashInfo.DID_7101));
    UDS_Service_Response(0x22u, POSITIVE_RSP, DIAG_ID_Tx, 2u + 3u, DiagMSG.msgData.Data);
}

/**
  *22服务DID7102
  *非首保里程
  */
void UDS_22Service_DID_7102(void)
{   
    memcpy(DiagMSG.msgData.DidDetail.Data, Ser2EToDFlashInfo.DID_7102, sizeof(Ser2EToDFlashInfo.DID_7102));
    UDS_Service_Response(0x22u, POSITIVE_RSP, DIAG_ID_Tx, 2u + 3u, DiagMSG.msgData.Data);
}

/**
  *22服务DID7103
  *清保养里程标志位
  */
void UDS_22Service_DID_7103(void)
{
    DiagMSG.msgData.DidDetail.Data[0] = Ser2EToDFlashInfo.DID_7103;
    UDS_Service_Response(0x22u, POSITIVE_RSP, DIAG_ID_Tx, 2u + 1u, DiagMSG.msgData.Data);
}

/**
  *22服务DID7104
  *累计里程清零标志位
  */
void UDS_22Service_DID_7104(void)
{
    DiagMSG.msgData.DidDetail.Data[0] = Ser2EToDFlashInfo.DID_7104;
    UDS_Service_Response(0x22u, POSITIVE_RSP, DIAG_ID_Tx, 2u + 1u, DiagMSG.msgData.Data);
}

/**
  *22服务DIDDFEC
  *功能配置字备份数据4
  */
void UDS_22Service_DID_DFEC(void)
{
    memcpy(DiagMSG.msgData.DidDetail.Data, BootToDFlashInfo.DID_DFEC, sizeof(BootToDFlashInfo.DID_DFEC));
    UDS_Service_Response(0x22u, POSITIVE_RSP, DIAG_ID_Tx, 2u + 64u, DiagMSG.msgData.Data);
}

/**
  *22服务DIDDFED
  *功能配置字备份数据3
  */
void UDS_22Service_DID_DFED(void)
{
    memcpy(DiagMSG.msgData.DidDetail.Data, BootToDFlashInfo.DID_DFED, sizeof(BootToDFlashInfo.DID_DFED));
    UDS_Service_Response(0x22u, POSITIVE_RSP, DIAG_ID_Tx, 2u + 64u, DiagMSG.msgData.Data);
}

/**
  *22服务DIDDFEE
  *功能配置字备份数据2
  */
void UDS_22Service_DID_DFEE(void)
{
    memcpy(DiagMSG.msgData.DidDetail.Data, Ser2EToDFlashInfo.DID_DFEE, sizeof(Ser2EToDFlashInfo.DID_DFEE));
    UDS_Service_Response(0x22u, POSITIVE_RSP, DIAG_ID_Tx, 2u + 64u, DiagMSG.msgData.Data);
}

/**
  *22服务DIDDFEF
  *功能配置字备份数据
  */
void UDS_22Service_DID_DFEF(void)
{
    memcpy(DiagMSG.msgData.DidDetail.Data, Ser2EToDFlashInfo.DID_DFEF, sizeof(Ser2EToDFlashInfo.DID_DFEF));
    UDS_Service_Response(0x22u, POSITIVE_RSP, DIAG_ID_Tx, 2u + 64u, DiagMSG.msgData.Data);
}

/**
  *22服务DIDF100
  *网络拓扑配置
  */
void UDS_22Service_DID_F100(void)
{
    memcpy(DiagMSG.msgData.DidDetail.Data, Ser2EToDFlashInfo.DID_F100, sizeof(Ser2EToDFlashInfo.DID_F100));
    UDS_Service_Response(0x22u, POSITIVE_RSP, DIAG_ID_Tx, 2u + 16u, DiagMSG.msgData.Data);
}

/**
  *22服务DIDF101
  *ECU功能配置1
  */
void UDS_22Service_DID_F101(void)
{
    _EOL_F101 EOL_F101 = EOL_GetF101();
    memcpy(DiagMSG.msgData.DidDetail.Data, EOL_F101.F101_Byte, sizeof(EOL_F101.F101_Byte));
    UDS_Service_Response(0x22u, POSITIVE_RSP, DIAG_ID_Tx, 2u + 8u, DiagMSG.msgData.Data);
}

/**
  *22服务DIDF102
  *ECU功能配置2
  */
void UDS_22Service_DID_F102(void)
{
    _EOL_F102 EOL_F102 = EOL_GetF102();
    memcpy(DiagMSG.msgData.DidDetail.Data, EOL_F102.F102_Byte, sizeof(EOL_F102.F102_Byte));
    UDS_Service_Response(0x22u, POSITIVE_RSP, DIAG_ID_Tx, 2u + 24u, DiagMSG.msgData.Data);
}

/**
  *22服务DIDF110
  *网络配置
  */
void UDS_22Service_DID_F110(void)
{
    _EOL_F110 EOL_F110 = EOL_GetF110();
    memcpy(DiagMSG.msgData.DidDetail.Data, EOL_F110.F110_Byte, sizeof(EOL_F110.F110_Byte));
    UDS_Service_Response(0x22u, POSITIVE_RSP, DIAG_ID_Tx, 2u + 8u, DiagMSG.msgData.Data);
}
/**
  *22服务DIDF112
  *车辆名称
  */
void UDS_22Service_DID_F112(void)
{
    memcpy(DiagMSG.msgData.DidDetail.Data, Ser2EToDFlashInfo.DID_F112, sizeof(Ser2EToDFlashInfo.DID_F112));
    UDS_Service_Response(0x22u, POSITIVE_RSP, DIAG_ID_Tx, 2u + 8u, DiagMSG.msgData.Data);
}

/**
  *22服务DIDF113
  *诊断版本
  */
void UDS_22Service_DID_F113(void)
{
    memcpy(DiagMSG.msgData.DidDetail.Data, Ser22_DID_F113, sizeof(Ser22_DID_F113));
    UDS_Service_Response(0x22u, POSITIVE_RSP, DIAG_ID_Tx, 2u + 4u, DiagMSG.msgData.Data);
}

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

/**
  *22服务DIDF182
  *标定版本号
  */
void UDS_22Service_DID_F182(void)
{
    memset(DiagMSG.msgData.DidDetail.Data, 0x20, 16u);
    memcpy(DiagMSG.msgData.DidDetail.Data, Ser22_DID_F182, sizeof(Ser22_DID_F182) - 1u);
    UDS_Service_Response(0x22u, POSITIVE_RSP, DIAG_ID_Tx, 2u + 16u, DiagMSG.msgData.Data);
}

/**
  *22服务DIDF186
  *诊断活动会话
  */
void UDS_22Service_DID_F186(void)
{
    DiagMSG.msgData.DidDetail.Data[0] = getSessionType();
    UDS_Service_Response(0x22u, POSITIVE_RSP, DIAG_ID_Tx, 2u + 1u, DiagMSG.msgData.Data);
}

/**
  *22服务DIDF187
  *ECU零件号
  */
void UDS_22Service_DID_F187(void)
{
    memcpy(DiagMSG.msgData.DidDetail.Data, BootToDFlashInfo.DID_F187, sizeof(BootToDFlashInfo.DID_F187));
    UDS_Service_Response(0x22u, POSITIVE_RSP, DIAG_ID_Tx, 2u + 21u, DiagMSG.msgData.Data);
}

/**
  *22服务DIDF189
  *主机厂定义的软件版本编号
  */
void UDS_22Service_DID_F189(void)
{
    memcpy(DiagMSG.msgData.DidDetail.Data, BootToDFlashInfo.DID_F189, sizeof(BootToDFlashInfo.DID_F189));
    UDS_Service_Response(0x22u, POSITIVE_RSP, DIAG_ID_Tx, 2u + 10u, DiagMSG.msgData.Data);
}

/**
  *22服务DIDF18A
  *ECU供应商ID
  */
void UDS_22Service_DID_F18A(void)
{
    memcpy(DiagMSG.msgData.DidDetail.Data, Ser22_DID_F18A, sizeof(Ser22_DID_F18A));
    UDS_Service_Response(0x22u, POSITIVE_RSP, DIAG_ID_Tx, 2u + 6u, DiagMSG.msgData.Data);
}

/**
  *22服务DIDF18B
  *ECU制造日期
  */
void UDS_22Service_DID_F18B(void)
{
    memcpy(DiagMSG.msgData.DidDetail.Data, Ser22_DID_F18B, sizeof(Ser22_DID_F18B));
    UDS_Service_Response(0x22u, POSITIVE_RSP, DIAG_ID_Tx, 2u + 4u, DiagMSG.msgData.Data);
}

/**
  *22服务DIDF18C
  *ECU序列号 
  */
void UDS_22Service_DID_F18C(void)
{
    memset(DiagMSG.msgData.DidDetail.Data, 0x20, 24u);
    memcpy(DiagMSG.msgData.DidDetail.Data, Ser22_DID_F18C, sizeof(Ser22_DID_F18C) - 1u);
    UDS_Service_Response(0x22u, POSITIVE_RSP, DIAG_ID_Tx, 2u + 24u, 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 + 17u, DiagMSG.msgData.Data);
}

/**
  *22服务DIDF191
  *主机厂定义的硬件版本编号
  */
void UDS_22Service_DID_F191(void)
{
    memcpy(DiagMSG.msgData.DidDetail.Data, Ser22_DID_F191, sizeof(Ser22_DID_F191));
    UDS_Service_Response(0x22u, POSITIVE_RSP, DIAG_ID_Tx, 2u + 10u, DiagMSG.msgData.Data);
}

/**
  *22服务DIDF193
  *供应商定义的硬件版本编号
  */
void UDS_22Service_DID_F193(void)
{
    memcpy(DiagMSG.msgData.DidDetail.Data, BootToDFlashInfo.DID_F193, sizeof(BootToDFlashInfo.DID_F193));
    UDS_Service_Response(0x22u, POSITIVE_RSP, DIAG_ID_Tx, 2u + 16u, DiagMSG.msgData.Data);
}

/**
  *22服务DIDF195
  *供应商定义的软件版本编号
  */
void UDS_22Service_DID_F195(void)
{
    memset(DiagMSG.msgData.DidDetail.Data, 0x20, 16u);
    memcpy(DiagMSG.msgData.DidDetail.Data, Ser22_DID_F195, sizeof(Ser22_DID_F195) - 1u);
    UDS_Service_Response(0x22u, POSITIVE_RSP, DIAG_ID_Tx, 2u + 16u, DiagMSG.msgData.Data);
}

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

/**
  *22服务DIDF198
  *测试设备序列号
  */
void UDS_22Service_DID_F198(void)
{
    memcpy(DiagMSG.msgData.DidDetail.Data, BootToDFlashInfo.DID_F198, sizeof(BootToDFlashInfo.DID_F198));
    UDS_Service_Response(0x22u, POSITIVE_RSP, DIAG_ID_Tx, 2u + 16u, DiagMSG.msgData.Data);
}

/**
  *22服务DIDF199
  *ECU软件刷新日期
  */
void UDS_22Service_DID_F199(void)
{
    memcpy(DiagMSG.msgData.DidDetail.Data, BootToDFlashInfo.DID_F199, sizeof(BootToDFlashInfo.DID_F199));
    UDS_Service_Response(0x22u, POSITIVE_RSP, DIAG_ID_Tx, 2u + 4u, DiagMSG.msgData.Data);
}

/**
  *22服务DIDF1A2
  *整车在生产线生产日期/ECU装配日期
  */
void UDS_22Service_DID_F1A2(void)
{
    memcpy(DiagMSG.msgData.DidDetail.Data, Ser2EToDFlashInfo.DID_F1A2, sizeof(Ser2EToDFlashInfo.DID_F1A2));
    UDS_Service_Response(0x22u, POSITIVE_RSP, DIAG_ID_Tx, 2u + 4u, DiagMSG.msgData.Data);
}