#include "UDS_2EService_Main.h"
//#include "Maintenance.h"

/**
  *2E服务函数入口
  *@param A_TA_type 收到数据的地址
  *@param A_Length 收到数据的长度
  *@param A_Data 收到数据的数据
  */
void UDS_Service_2E_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_2EService_NRC11();                                            /*2E服务是否支持功能寻址*/
    }
    if(NRC == positiveResponse)
    {
        NRC = UDS_2EService_NRC7F();                                            /*2E服务会话是否支持验证*/
    }
    if(NRC == positiveResponse)
    {
        NRC = UDS_2EService_NRC33();                                            /*2E服务解锁等级验证*/
    }
    if(NRC == positiveResponse)
    {
        NRC = UDS_2EService_NRC13_MinLengthCheck();                             /*2E服务最小长度验证*/
    }
    if(NRC == positiveResponse)
    {
        NRC = UDS_2EService_NRC13_TotalLengthCheck();                           /*2E服务总长度长度验证*/
    }
    if(NRC == positiveResponse)
    {
        NRC = UDS_2EService_NRC31();                                            /*2E服务超出请求范围验证*/
    }
    if(NRC == positiveResponse)
    {
        NRC = UDS_2EService_NRC22();                                            /*2E服务条件验证*/
    }
    if(NRC == positiveResponse)
    {
        UDS_2EService_DID();                                                    /*2E服务DID判断*/
    }
    clearDiagMSG();                                                             /*清除诊断信息*/
}

/**
  *2E服务子功能
  */
void UDS_2EService_DID(void)
{
    switch(getDID(DiagMSG.msgData.DidDetail.DID_H, DiagMSG.msgData.DidDetail.DID_L))/*2E服务DID判断*/
    {
        case 0xF190:
            UDS_2EService_DID_F190( );
        break;
        case 0xF1B0:
            UDS_2EService_DID_F1B0( );
        break;
        case 0xF1B1:
            UDS_2EService_DID_F1B1( );
        break;
        case 0xF1B7:
            UDS_2EService_DID_F1B7( );
        break;
        case 0xF1B8:
            UDS_2EService_DID_F1B8( );
        break;
        case 0xF1BF:
            UDS_2EService_DID_F1BF( );
        break;
        case 0xF1C5:
            UDS_2EService_DID_F1C5( );
        break;
        case 0xF1C6:
            UDS_2EService_DID_F1C6( );
        break;
        case 0xF010:
            UDS_2EService_DID_F010( );
        break;
        case 0xCF03:
            UDS_2EService_DID_CF03( );
        break;
        case 0x1E00:
            UDS_2EService_DID_1E00( );
        break;
        case 0x1E01:
            UDS_2EService_DID_1E01( );
        break;
        case 0xF18B:
            UDS_2EService_DID_F18B( );
        break;
        case 0xF18C:
            UDS_2EService_DID_F18C( );
        break;
        default:
        break;
    }
}

/**
  *2E服务DIDF190
  *VIN(车辆识别代码)
  */
void UDS_2EService_DID_F190(void)
{
    uint8_t enResult = 1;
    memcpy(Ser2EToDFlashInfo.DID_F190, DiagMSG.msgData.DidDetail.Data, sizeof(Ser2EToDFlashInfo.DID_F190));
    enResult = write2EData(Write2EData);
    if(enResult == 0)
    {
       UDS_Service_Response(0x2Eu, POSITIVE_RSP, DIAG_ID_Tx, 2u, DiagMSG.msgData.Data);
    }
    else
    {
        enResult = generalProgrammingFailure;
        UDS_Service_Response(0x2Eu, NEGATIVE_RSP, DIAG_ID_Tx, 1u, (uint8_t*)&enResult);
    }
}

/**
  *2E服务DIDF1B0
  *VanOrGan
  */
void UDS_2EService_DID_F1B0(void)
{
    uint8_t enResult = 1;
    memcpy(Ser2EToDFlashInfo.DID_F1B0, DiagMSG.msgData.DidDetail.Data, sizeof(Ser2EToDFlashInfo.DID_F1B0));
    enResult = write2EData(Write2EData);
    if(enResult == 0)
    {
       UDS_Service_Response(0x2Eu, POSITIVE_RSP, DIAG_ID_Tx, 2u, DiagMSG.msgData.Data);
    }
    else
    {
        enResult = generalProgrammingFailure;
        UDS_Service_Response(0x2Eu, NEGATIVE_RSP, DIAG_ID_Tx, 1u, (uint8_t*)&enResult);
    }
}

/**
  *2E服务DIDF1B1
  *CustomerCode
  */
void UDS_2EService_DID_F1B1(void)
{
    uint8_t enResult = 1;
    memcpy(Ser2EToDFlashInfo.DID_F1B1, DiagMSG.msgData.DidDetail.Data, sizeof(Ser2EToDFlashInfo.DID_F1B1));
    enResult = write2EData(Write2EData);
    if(enResult == 0)
    {
       UDS_Service_Response(0x2Eu, POSITIVE_RSP, DIAG_ID_Tx, 2u, DiagMSG.msgData.Data);
    }
    else
    {
        enResult = generalProgrammingFailure;
        UDS_Service_Response(0x2Eu, NEGATIVE_RSP, DIAG_ID_Tx, 1u, (uint8_t*)&enResult);
    }
}

/**
  *2E服务DIDF1B7
  *EOLProgrammingDate
  */
void UDS_2EService_DID_F1B7(void)
{
    uint8_t enResult = 1;
    memcpy(Ser2EToDFlashInfo.DID_F1B7, DiagMSG.msgData.DidDetail.Data, sizeof(Ser2EToDFlashInfo.DID_F1B7));
    enResult = write2EData(Write2EData);
    if(enResult == 0)
    {
       UDS_Service_Response(0x2Eu, POSITIVE_RSP, DIAG_ID_Tx, 2u, DiagMSG.msgData.Data);
    }
    else
    {
        enResult = generalProgrammingFailure;
        UDS_Service_Response(0x2Eu, NEGATIVE_RSP, DIAG_ID_Tx, 1u, (uint8_t*)&enResult);
    }
}

/**
  *2E服务DIDF1B8
  *EOLTesterCode
  */
void UDS_2EService_DID_F1B8(void)
{
    uint8_t enResult = 1;
    memcpy(Ser2EToDFlashInfo.DID_F1B8, DiagMSG.msgData.DidDetail.Data, sizeof(Ser2EToDFlashInfo.DID_F1B8));
    enResult = write2EData(Write2EData);
    if(enResult == 0)
    {
       UDS_Service_Response(0x2Eu, POSITIVE_RSP, DIAG_ID_Tx, 2u, DiagMSG.msgData.Data);
    }
    else
    {
        enResult = generalProgrammingFailure;
        UDS_Service_Response(0x2Eu, NEGATIVE_RSP, DIAG_ID_Tx, 1u, (uint8_t*)&enResult);
    }
}

/**
  *2E服务DIDF1BF
  *EOLProgrammingToolVersion
  */
void UDS_2EService_DID_F1BF(void)
{
    uint8_t enResult = 1;
    memcpy(Ser2EToDFlashInfo.DID_F1BF, DiagMSG.msgData.DidDetail.Data, sizeof(Ser2EToDFlashInfo.DID_F1BF));
    enResult = write2EData(Write2EData);
    if(enResult == 0)
    {
       UDS_Service_Response(0x2Eu, POSITIVE_RSP, DIAG_ID_Tx, 2u, DiagMSG.msgData.Data);
    }
    else
    {
        enResult = generalProgrammingFailure;
        UDS_Service_Response(0x2Eu, NEGATIVE_RSP, DIAG_ID_Tx, 1u, (uint8_t*)&enResult);
    }
}

/**
  *2E服务DIDF1C5
  *PlantTraceabilityInformations
  */
void UDS_2EService_DID_F1C5(void)
{
    uint8_t enResult = 1;
    memcpy(Ser2EToDFlashInfo.DID_F1C5, DiagMSG.msgData.DidDetail.Data, sizeof(Ser2EToDFlashInfo.DID_F1C5));
    enResult = write2EData(Write2EData);
    if(enResult == 0)
    {
       UDS_Service_Response(0x2Eu, POSITIVE_RSP, DIAG_ID_Tx, 2u, DiagMSG.msgData.Data);
    }
    else
    {
        enResult = generalProgrammingFailure;
        UDS_Service_Response(0x2Eu, NEGATIVE_RSP, DIAG_ID_Tx, 1u, (uint8_t*)&enResult);
    }
}

/**
  *2E服务DIDF1C5
  *TeleservicesTraceabilityInformations
  */
void UDS_2EService_DID_F1C6(void)
{
    uint8_t enResult = 1;
    memcpy(Ser2EToDFlashInfo.DID_F1C6, DiagMSG.msgData.DidDetail.Data, sizeof(Ser2EToDFlashInfo.DID_F1C6));
    enResult = write2EData(Write2EData);
    if(enResult == 0)
    {
       UDS_Service_Response(0x2Eu, POSITIVE_RSP, DIAG_ID_Tx, 2u, DiagMSG.msgData.Data);
    }
    else
    {
        enResult = generalProgrammingFailure;
        UDS_Service_Response(0x2Eu, NEGATIVE_RSP, DIAG_ID_Tx, 1u, (uint8_t*)&enResult);
    }
}

/**
  *2E服务DIDF010
  *EOL DataIdentifier
(下线配置)
--见4.3.DIDs_Config页
  */
void UDS_2EService_DID_F010(void)
{
    uint8_t enResult = 1;
    memcpy(EOLToDFlashInfo.DID_F010, DiagMSG.msgData.DidDetail.Data, sizeof(EOLToDFlashInfo.DID_F010));
    enResult = write2EData(WriteEOLData);
    if(enResult == 0)
    {
       UDS_Service_Response(0x2Eu, POSITIVE_RSP, DIAG_ID_Tx, 2u, DiagMSG.msgData.Data);
    }
    else
    {
        enResult = generalProgrammingFailure;
        UDS_Service_Response(0x2Eu, NEGATIVE_RSP, DIAG_ID_Tx, 1u, (uint8_t*)&enResult);
    }
}

/**
  *2E服务DIDCF03
  *Odometer
(里程)
*/
void UDS_2EService_DID_CF03(void)
{
    uint8_t enResult = 1;
    uint8_t i;
    uint32_t odo = 0;
    uint32_t m32 = 0;
    uint8_t NRC = positiveResponse;
    if(u8MileODORelated[8] == 0)
    {
        memcpy(Ser2EToDFlashInfo.DID_CF03, DiagMSG.msgData.DidDetail.Data, sizeof(Ser2EToDFlashInfo.DID_CF03));
        for(i = 0; i < 4;i++)
        {
            odo = odo << 8 | DiagMSG.msgData.DidDetail.Data[i];
        }
        odo = odo * 10;
        Mileage_Modify_Index_Value(MILE_INDEX_ODO, odo);
    }
    else
    {
        for(i = 0; i < 4;i++)
        {
            m32 = (m32 << 8) | DiagMSG.msgData.DidDetail.Data[i];
        }
        if((Mile_Get_Index_Value(MILE_INDEX_ODO) / 10) > m32)
        {
            NRC = requestOutOfRange;
        }
        else if(Ser2EToDFlashInfo.WriteODOCnt >= 2)
        {
            NRC = requestOutOfRange;
        }
        else
        {
            Ser2EToDFlashInfo.WriteODOCnt++;
            enResult = write2EData(Write2EData);
            for(i = 0; i < 4;i++)
            {
                odo = odo << 8 | DiagMSG.msgData.DidDetail.Data[i];
            }
            odo = odo * 10;
            Mileage_Modify_Index_Value(MILE_INDEX_ODO, odo);
        }
    }
    if(NRC == positiveResponse)
    {
       UDS_Service_Response(0x2Eu, POSITIVE_RSP, DIAG_ID_Tx, 2u, DiagMSG.msgData.Data);
    }
    else
    {
        UDS_Service_Response(0x2Eu, NEGATIVE_RSP, DIAG_ID_Tx, 1u, (uint8_t*)&NRC);
    }
}

/**
  *2E服务DID1E00
  *Maintenance 
(保养配置)
*/
void UDS_2EService_DID_1E00(void)
{
    uint8_t enResult = 1;
    memcpy(Ser2EToDFlashInfo.DID_1E00, DiagMSG.msgData.DidDetail.Data, sizeof(Ser2EToDFlashInfo.DID_1E00));
    enResult = write2EData(Write2EData);
    if(enResult == 0)
    {
       UDS_Service_Response(0x2Eu, POSITIVE_RSP, DIAG_ID_Tx, 2u, DiagMSG.msgData.Data);
    }
    else
    {
        enResult = generalProgrammingFailure;
        UDS_Service_Response(0x2Eu, NEGATIVE_RSP, DIAG_ID_Tx, 1u, (uint8_t*)&enResult);
    }
}

/**
  *2E服务DID1E01
  *CarCfg3
(ABS9.0诊断配置)
*/
void UDS_2EService_DID_1E01(void)
{
    uint8_t enResult = 1;
    memcpy(Ser2EToDFlashInfo.DID_1E01, DiagMSG.msgData.DidDetail.Data, sizeof(Ser2EToDFlashInfo.DID_1E01));
    enResult = write2EData(Write2EData);
    if(enResult == 0)
    {
       UDS_Service_Response(0x2Eu, POSITIVE_RSP, DIAG_ID_Tx, 2u, DiagMSG.msgData.Data);
    }
    else
    {
        enResult = generalProgrammingFailure;
        UDS_Service_Response(0x2Eu, NEGATIVE_RSP, DIAG_ID_Tx, 1u, (uint8_t*)&enResult);
    }
}

/**
  *2E服务DIDF18B
  *天有为添加电控单元制作日期
*/
void UDS_2EService_DID_F18B(void)
{
    uint8_t enResult = 1;
    memcpy(Ser2EToDFlashInfo.DID_F18B, DiagMSG.msgData.DidDetail.Data, sizeof(Ser2EToDFlashInfo.DID_F18B));
    enResult = write2EData(Write2EData);
    if(enResult == 0)
    {
       UDS_Service_Response(0x2Eu, POSITIVE_RSP, DIAG_ID_Tx, 2u, DiagMSG.msgData.Data);
    }
    else
    {
        enResult = generalProgrammingFailure;
        UDS_Service_Response(0x2Eu, NEGATIVE_RSP, DIAG_ID_Tx, 1u, (uint8_t*)&enResult);
    }
}

/**
  *2E服务DIDF18C
  *天有为添加(供应商电控单元序列号)
*/
void UDS_2EService_DID_F18C(void)
{
    uint8_t enResult = 1;
    memcpy(Ser2EToDFlashInfo.DID_F18C, DiagMSG.msgData.DidDetail.Data, sizeof(Ser2EToDFlashInfo.DID_F18C));
    enResult = write2EData(Write2EData);
    if(enResult == 0)
    {
       UDS_Service_Response(0x2Eu, POSITIVE_RSP, DIAG_ID_Tx, 2u, DiagMSG.msgData.Data);
    }
    else
    {
        enResult = generalProgrammingFailure;
        UDS_Service_Response(0x2Eu, NEGATIVE_RSP, DIAG_ID_Tx, 1u, (uint8_t*)&enResult);
    }
}