#ifndef __UDS_COMMON_H
#define __UDS_COMMON_H
#include <string.h>
#include "RTE_CAN.h"
#include "TYW_stdint.h"
#include "RTE_CAN.h"
#include "CAN_APP.h"
#include "UDS_DTC.h"
#include "Internal_EEPROM.h"
#include "Watchdog.h"

#include "RTE_Memory.h"
#include "EOL_Para.h"
////#include "Radar_R3.h"
//#include "ODOReset.h"
//#include "MBD_Model.h"
//#include "Work_Flash.h"
//#include "Services_ODO.h"
//#include "Services_ODO_Backup.h"
//#include "RTE_WDT.h"
//#include "Sound_Player.h"
//#include "Services_TripA.h"
//#include "Common_Interface.h"
//#include "Services_Interval.h"
#include "UDS_ISO14229_Server.h"
#include "DoCAN_ISO15765_Config.h"
//#include "Services_ODO_Internal.h"
#include "CAN_CH0_CAN_Communication_Matrix.h"

#include "UDS_ISO14229_Server_Config.h"

/**
  *正负反馈
  */
#define POSITIVE_RSP                                            (uint8_t) 0x00                          /*正反馈*/
#define NEGATIVE_RSP                                            (uint8_t) (!POSITIVE_RSP)               /*负反馈*/

/**
  *DFlash
  */
#define NoNeedWait                                              0x00u
#define NeedWait                                                0x01u
#define JumpToBoot02                                            0x58856336u
#define JumpToBoot82                                            0x85583663u

/**
  *10服务和子服务
  *诊断会话
  */
#define DiagnosticSessionControl                                0x10u
#define DefaultSession                                          0x01u
#define ProgrammingSession                                      0x02u
#define ExtendedDiagnosticSession                               0x03u

/**
  *11服务和子服务
  *ECU复位
  */
#define ECUReset                                                0x11u
#define HardReset                                               0x01u
#define SoftReset                                               0x03u

/**
  *14服务和子服务
  *清除故障信息
  */
#define ClearDiagnosticInformation                              0x14u

/**
  *19服务和子服务
  *读取故障信息
  */
#define ReadDTCInformation                                      0x19u
#define ReportNumberOfDTCByStatusMask                           0x01u
#define ReportDTCByStatusMask                                   0x02u
#define ReportDTCSnapshotRecordByDTCNumber                      0x04u
#define reportDTCExtendedDataRecordByDTCNumber                  0x06u
#define ReportSupportedDTC                                      0x0Au

#define NoSupport                                               0x00u
#define NeedSupport                                             0x01u
#define NormalVottage                                           0x00u
#define LowVottage                                              0x01u
#define HightVottage                                            0x02u
#define AgeingCount                                             100u
#define OfflineLoopMultiple                                     5u
#define MaxDTCPendingCount                                      1u
#define MinimumVoltage                                          8900u
#define RestoreMinimumVoltage                                   9200u
#define MaximumVoltage                                          16100u
#define RestoreMaximumVoltage                                   15800
#define LowVoltageTimer                                         2000u
#define HightVoltageTimer                                       2000u

#define DTCError                                                0x01u
#define DTCErrorThisCycle                                       0x02u
#define DTCPending                                              0x04u
#define DTCConfirmed                                            0x08u
#define DTCNoTestLastClear                                      0x10u
#define DTCErrorLastClear                                       0x20u
#define DTCNoTestThisCycle                                      0x40u
#define DTCNoError                                              0xFEu

#define DTCMask                                                 0x09u

#define KL15DTCEnableTimer                                      1500u
#define H_LVoltageDTCEnableTimer                                500
#define BusOffDTCEnableTimer                                    600u

/**
  *22服务和子服务
  *通过DID来读数据
  */
#define ReadDataByIdentifier                                    0x22u

/**
  *27服务和子服务
  *安全访问
  */
#define SecurityAccess                                          0x27u
#define requestSeed_LV1                                         0x01u
#define sendKey_LV1                                             0x02u
#define requestSeed_LV11                                        0x11u
#define sendKey_LV11                                            0x12u
#define NormalKeyUnlock                                         0x01u
#define NormalKeyLock                                           0x00u
#define BootKeyUnlock                                           0x02u
#define BootKeyLock                                             0x00u
#define SER27_MAX_REQ_SEED_NUM                                  0x03u
#define SER27_MAX_INVAILD_KEY_NUM                               0x03u
#define SER27_CLEAR_REQ_SEEDED                                  0x00u
#define SER27_REQ_SEEDED                                        0x01u
#define SER27_ERR_DELAY_TIMER_EN                                0x01u
#define SER27_ERR_DELAY_SER_PERIOD                              100u
#define SER27_ERR_DELAY_TIMEOUT                                 10000u

/**
  *28服务和子服务
  *通讯控制
  */
#define CommunicationControl                                    0x28u
#define enableRxAndTx                                           0x00u
#define enableRxAndDisableTx                                    0x01u
#define disableRxAndEnableTx                                    0x02u
#define disableRxAndTx                                          0x03u
#define normalMsg                                               0x01u
#define networkManagementMsg                                    0x02u
#define networkManagementMsgAndnormalMsg                        0x03u

/**
  *2E服务和子服务
  *通过DID来写数据
  */
#define WriteDataByIdentifier                                   0x2Eu
#define WriteBootData                                           0x00u
#define Write2EData                                             0x01u
#define WriteEOLData                                            0x02u
/**
  *2F服务和子服务
  *通过DID来控制ECU
  */
#define InputOutputControlByIdentifier                          0x2Fu
#define WhiteColor                                              0x01u
#define BlackColor                                              0x02u
#define RedColor                                                0x03u
#define GreenColor                                              0x04u
#define BlueColor                                               0x05u
#define GaugeSpeed                                              0x01u
#define GaugeTacho                                              0x02u
#define GaugeFuel                                               0x03u
#define GaugeEngCoolantTemp                                     0x04u
#define ZeroPosition                                            0x00u
#define HalfPosition                                            0x01u
#define FullPosition                                            0x02u
#define Contrl                                                  0x03u
#define Resume                                                  0x00u

/**
  *31服务和子服务
  *历程控制
  */
#define RoutineControl                                          0x31u
#define startRoutine                                            0x01u
#define stopRoutine                                             0x02u
#define requestRoutineResults                                   0x03u
#define MaintenanceReset                                        0X62F1u
#define CheckMemory                                             0x0202u
#define UpdateConditionCheck                                    0x0203u
#define ECU_selftest                                            0xDFF0u
#define EraseMemory                                             0xFF00u
#define CheckProgrammingDependencies                            0xFF01u
#define RoutineCompletedSuccessfully                            0x04u
#define RoutineCompletedUnsuccessfully                          0x05u

/**
  *3E服务和子服务
  *维持当前会话
  */
#define TesterPresent                                           0x3Eu
#define ZeroSubFunction                                         0x00u

/**
  *85服务和子服务
  *故障检测控制
  */
#define  ControlDTCSetting                                      0x85u
#define  DTCSettingOn                                           0x01u
#define  DTCSettingOff                                          0x02u

/**
  *诊断支持的否定响应代码
  */
#define positiveResponse                                        0x00u
#define	serviceNotSupported                                     0x11u
#define	subFunctionNotSupported                                 0x12u
#define	incorrectMessageLength                                  0x13u
#define	responseTooLong                                         0x14u
#define	conditionsNotCorrect                                    0x22u
#define	requestSequenceError                                    0x24u
#define	requestOutOfRange                                       0x31u
#define	securityAccessDenied                                    0x33u
#define	invalidKey                                              0x35u
#define	exceedNumberOfAttempts                                  0x36u
#define	requiredTimeDelayNotExpired                             0x37u
#define	uploadDownloadNotAccepted                               0x70u
#define	transferDataSuspended                                   0x71u
#define	generalProgrammingFailure                               0x72u
#define	wrongBlockSequenceCounter                               0x73u
#define	requestCorrectlyReceivedResponsePending                 0x78u
#define	subfunctionNotSupportinActiveSession                    0x7Eu
#define	serviceNotSupportedInActiveSession                      0x7Fu
#define	engineIsRunning                                         0x83u
#define	engineIsNotRunning                                      0x84u
#define	engineRunTimeTooLow                                     0x85u
#define	voltageTooHigh                                          0x92u
#define	voltageTooLow                                           0x93u

#define getDID(DID_H, DID_L)                                    ((uint16_t)(((uint16_t)(DID_H)) << 8u) | (uint16_t)(DID_L))
#define toUint16_t(data0, data1)                                ((uint16_t)(((uint16_t)(data0)) << 8u) | (uint16_t)(data1))
#define toUint32_t(data0, data1, data2, data3)                  ((uint32_t)(((uint32_t)(data0)) << 24u) | (uint32_t)(((uint32_t)(data1)) << 16u) | (uint32_t)(((uint32_t)(data2)) << 8u) | (uint32_t)(data3))
#define isBCD(data)                                             ((((uint8_t)((data) & 0x0Fu)) < 0x0Au) && (((uint8_t)(((uint8_t)((data) & 0xF0u)) >> 4u )) < 0x0Au))
#define Check_BCD_Format(Char)  (((Char & 0x0Fu) < 0x0Au )&&((Char & 0xF0u) < 0xA0u))
#define Check_LeapYear_(YY)     (((YY%400)==0u)||(((YY%100)!=0x00)&&((YY%4)==0u)))
#define Check_MM_Format(MM)     (((((MM >> 4u) & 0x0F) * 10u + (MM & 0x0F)) <= 12u) )
#define Check_DD_Format(DD,max) (((((DD >> 4u) & 0x0F) * 10u + (DD & 0x0F)) <= max) )
#define UDSLib_TRUE    1
#define UDSLib_FALSE   0
#define CODING_BCD     1
#define CODING_ASC     0


/**
  * TYPEDEFS
  */
typedef union 
{
    uint8_t Data[500];
    struct
    {
        uint8_t SubID                                           :7;
        uint8_t PositiveSuppression                             :1;
        uint8_t Data[499];
    } SidDetail;
    struct
    {
        uint8_t DID_H;
        uint8_t DID_L;
        uint8_t Data[498];
    } DidDetail;
    struct
    {
        uint32_t Parameter                                      :24;
        uint8_t Data[497];
    } S14Detail;
    struct
    {
        uint8_t SubID;
        uint8_t DID_H;
        uint8_t DID_L;
        uint8_t Data[497];
    } S31Detail;
    struct
    {
      uint8_t SubID                                            :7;
      uint8_t PositiveSuppression                              :1; 
      uint8_t ContrlType;
      uint8_t Data[498];  
    }S28Detail;
    
} msgDataUnion;

typedef struct
{
    uint32_t msgID;
    uint16_t msgDLC;
    msgDataUnion msgData;
} DiagMSGUnion;

typedef struct
{
    uint8_t LV1Ctrl;
    uint8_t LV1DelayCtrl;
    uint16_t LV1DelayTimer;
    uint8_t LV1SafetyStatus;
    uint8_t LV1Seed[4];
    uint8_t LV1Key[4];
} Ser27_FlowCtrlUnion;

typedef struct
{
    uint32_t Flag;
    uint32_t JumpToBootFlag;
    uint32_t AppValidFlag;
    uint32_t S11Flag;
} DiagFlagUnion;

typedef struct
{
    uint32_t Flag;
    uint8_t  LV1ReqSeedCnt;
    uint8_t  LV1InvaidKyeCnt;
    uint8_t  LV11_ReqSeedCnt;
    uint8_t  LV11_InvaidKyeCnt;
    uint32_t RandNum;
} Ser27_FlowCtrlCntUnion;

typedef struct
{
    uint32_t Flag;
    uint8_t DID_F15B[30];
    uint8_t Filling[2];
} BootToDFlashInfoUnion;

typedef struct
{
    uint32_t Flag;
    uint16_t WriteODOCnt;
    uint8_t  DID_F190[17];
    uint8_t  DID_F1B0[9];
    uint8_t  DID_F1B1[25];
    uint8_t  DID_F1B7[3];
    uint8_t  DID_F1B8[6];
    uint8_t  DID_F1BF[2];
    uint8_t  DID_F1C5[42];
    uint8_t  DID_F1C6[51];
    uint8_t  DID_CF03[4];
    uint8_t  DID_1E00[5];
    uint8_t  DID_1E01[16];
    uint8_t  DID_F18B[8];
    uint8_t  DID_F18C[14];
} Ser2EToDFlashInfoUnion;//240

typedef struct
{   
    uint32_t Flag;
    uint8_t  DID_F010 [ 8u ];
} EOLToDFlashInfoUnion;/*12*/
typedef struct
{
    uint8_t  EngineSpeed_H;
    uint8_t  EngineSpeed_L;
    uint8_t  VehicleSpeed_H;
    uint8_t  VehicleSpeed_L;
    uint8_t  BatteryVoltage_H;
    uint8_t  BatteryVoltage_L;
    uint8_t  FirstOccurOdometer_H;
    uint8_t  FirstOccurOdometer_H_M;
    uint8_t  FirstOccurOdometer_L_M;
    uint8_t  FirstOccurOdometer_L;
    uint8_t  Odometer_H;
    uint8_t  Odometer_H_M;
    uint8_t  Odometer_L_M;
    uint8_t  Odometer_L;
} SnapshotUnion;

typedef struct
{
    uint8_t  F_OccurenceCounter;
    uint8_t  F_Second;
    uint8_t  F_Minute;
    uint8_t  F_Hour;
    uint8_t  F_Day;
    uint8_t  F_Month;
    uint8_t  F_Year;
    uint8_t  F_Distance_H;
    uint8_t  F_Distance_H_M;
    uint8_t  F_Distance_L_M;
    uint8_t  F_Distance_L;
    uint8_t  L_Second;
    uint8_t  L_Minute;
    uint8_t  L_Hour;
    uint8_t  L_Day;
    uint8_t  L_Month;
    uint8_t  L_Year;
    uint8_t  L_Distance_H;
    uint8_t  L_Distance_H_M;
    uint8_t  L_Distance_L_M;
    uint8_t  L_Distance_L;
    uint8_t  L_SPNType;
} ExtendedUnion;

typedef struct
{
    uint8_t  DTCStatus;
    uint8_t  DTCAgeing;
    uint8_t  DTCCount;
    uint8_t  DTCPendingCount;
    SnapshotUnion Snapshot;
    ExtendedUnion Extended;
} DTCUnion;

typedef struct
{
    uint32_t Flag;
    DTCUnion DTC[9u];
} DTCToDFlashInfoUnion;

typedef struct
{
    uint32_t Flag;
    uint32_t AddODO;  
    uint32_t AddCount;
} ServiceToDflashInfoUnion;


#define CalculateBlockSize(n)  ((n + 63) / 64)
/*每个结构占用的块数*/ 
#define WriteProgramValidFlagBlockSize      CalculateBlockSize(sizeof(DiagFlagUnion))
#define WriteSer27BlockSize                 CalculateBlockSize(sizeof(Ser27_FlowCtrlCntUnion))  
#define WriteBootDataBlockSize              CalculateBlockSize(sizeof(BootToDFlashInfoUnion))
#define WriteSer2EDataBlockSize             CalculateBlockSize(sizeof(Ser2EToDFlashInfoUnion))
#define WriteEOLDataBlockSize               CalculateBlockSize(sizeof(EOLToDFlashInfoUnion))
#define WriteIntervalDataBlockSize          CalculateBlockSize(32)

#define WriteODOClearDataBlockSize          CalculateBlockSize(12)

/*实际的存储位置*/
#define WriteProgramValidFlagAddr           (0)
#define WriteSer27Addr                      (WriteProgramValidFlagAddr + WriteProgramValidFlagBlockSize) 
#define WriteBootDataAddr                   (WriteSer27Addr + WriteSer27BlockSize)
#define WriteSer2EDataAddr                  (WriteBootDataAddr + WriteBootDataBlockSize)
#define WriteEOLDataAddr                    (WriteSer2EDataAddr + WriteSer2EDataBlockSize)
#define WriteIntervalAddr                   (WriteEOLDataAddr + WriteEOLDataBlockSize)
#define WriteODOClearAddr                   (WriteIntervalAddr + WriteIntervalDataBlockSize)

#define WriteDTCAddr              INTERNAL_EE_BLOCK_00
#define DIM(X)                    (sizeof(X) / sizeof((X) [ 0 ]))
typedef void (*InitFunction)(void);
extern uint8_t S31DID62F3RequestStatus;
extern uint8_t  S31DID0203RequestFlag;
extern DiagMSGUnion DiagMSG;
extern DiagFlagUnion DiagFlag;
extern Ser27_FlowCtrlUnion Ser27_FlowCtrl;
extern Ser27_FlowCtrlCntUnion Ser27_FlowCtrlCnt;
extern BootToDFlashInfoUnion BootToDFlashInfo;
extern Ser2EToDFlashInfoUnion Ser2EToDFlashInfo;
extern EOLToDFlashInfoUnion EOLToDFlashInfo;
extern DTCToDFlashInfoUnion DTCToDFlashInfo;
extern ServiceToDflashInfoUnion ServiceToDflashInfo;
void UDS_Para_KL30Init(void);
void setSessionType(uint8_t status);
uint8_t getSessionType(void);
void setDiagMSG(uint32_t Identifier, uint16_t dlc, uint8_t Data[]);
DiagMSGUnion getDiagMSG(void);
void clearDiagMSG(void);
uint16_t getSpeed(void);
uint16_t getESpeed(void);
uint16_t getKL30Voltage(void);
uint8_t getKL15Status(void);
uint8_t getSecurityLevel(void);
void Ser27_ChangeSessionHandle(void);
void UDS_RESET(void);
void UDS_Delay(uint16_t count);
void UDS_S11_Sand(uint8_t subid);
void UDS_S11_Confirm(void);
void UDS_NRC78_Sand(uint8_t sid);
void UDS_SendNRCRsp(uint8_t sid,uint8_t status);
void UDS_14_SendRsp(uint8_t sid);
void UDS_50us_Service(void);
void UDS_10ms_Service(void);
void UDS_KL15_init(void);
void UDS_Slepp(void);
void MsgLostTimer(uint16_t timer);
void ReceivedMsg(uint32_t MsgID, uint8_t DLC);
void S3_Service(uint16_t timer);
void S3_ServiceClear(void);
void S3_ServiceWait(void);
void S3_ServiceTimeOut(void);
void Ser27_ErrDelayTimerService(uint16_t timer);
void ControlMessageCommunication(uint8_t Type, uint8_t Status);
void enableDTCTimer(uint16_t Timer);
uint8_t isDTCEnable(void);
void setDTCEnableTimer(uint16_t Timer);
void OpenDTCTest(void);
void CloseDTCTest(void);
uint8_t DTCTestIsOpen(void);
void DTCAgeing(void);
void ReadAllDFlashData(void);
uint8_t ReadDFlashData_eel(uint16_t u16BlockNum, uint32_t u32Data[], uint16_t u16Len, InitFunction initFunction);
uint8_t WriteDFlashData_eel(uint16_t u16BlockNum, uint32_t u32Data[], uint16_t u16Len, uint8_t isWait);
uint8_t ReadDFlashData_fdl(uint16_t u16BlockNum, uint32_t u32Data[], uint16_t u16Len, InitFunction initFunction);
uint8_t WriteDFlashData_fdl(uint16_t u16BlockNum, uint32_t u32Data[], uint16_t u16Len, uint8_t isWait);
void AllFlagInit(void);
void Ser27ToDFlashInfoInit(void);
void BootToDFlashInfoInit(void);
void Ser2EToDFlashInfoInit(void);
void SerEOLToDFlashInfoInit(void);
void DTCToDFlashInfoInit(void);
void ODOClearInit(void);
void DTCConfigurationInit(void);
//shi 2022-11-08 
extern uint32_t Get_7101_Value(void);
extern uint32_t Get_7102_Value(void);

extern uint32_t Get_7101_Value(void);
extern uint32_t Get_7102_Value(void);
extern uint8_t Get_7103_Value(void);
extern void Clear7103_Cbk(void);
extern Ser2EToDFlashInfoUnion Ser2EToDFlashInfo;

#endif