/******************************************************************************
 �� �� ����UDS_ISO14229_Services.h
 ����������ISO 14229 �淶�涨����Ϸ���������˷���ʵ�ֺ���ͷ�ļ�
 ��    �ߣ�����
 ��    ����V1.0
 ��    �ڣ�2016.11.1
 ******************************************************************************/

/******************************************************************************
 ��Ϸ����OSIģ��ӳ��
 ===============================================================================
 *     NO.     OSI Layer        Diagnostics services
 -------------------------------------------------------------------------------
 *      7      Application      ISO 14229-1 ISO 14229-3
 6      Presentation     -
 *      5      Session          ISO 14229-2
 4      Transport        ISO 15765-2
 3      Network          ISO 15765-2
 2      Data Link        ISO 11898
 1      Physical         ISO 11898
 ===============================================================================
 ******************************************************************************/

#ifndef _UDS_ISO14229_SERVICES_H_
#define _UDS_ISO14229_SERVICES_H_

#include "UDS_ISO14229_Server_Config.h"

/**
 *DFlash
 */
#define NoNeedWait 0x00u
#define NeedWait   0x01u
#define APP_STATUS_ADDR   (0x501000)
#define APP_DATA_INFO     (0x501400)
#define APP_DATA_WRITE    (0x501800)


#define Data_Flash_Addr_BootValid_OFFSET   0x00000000
#define Data_Flash_Addr_DiagReceive_OFFSET 0x00002000
#define Data_Flash_Addr_Diag2E_OFFSET      0x00004000
#define Data_Flash_Addr_DiagDTC_OFFSET     0x00006000
#define Data_Flash_Addr_GHdata_OFFSET      0x0000A000    // ��������
#define Jump_To_Boot_Need_Answer           0xA77A3AA3
#define Jump_To_Boot_No_Answer             0xA77A8AA8
#define Flag_App_OTAStatus                 0x3663B88B    // ����Boot��ԭ������ΪOTA

#define EnableInterrupts \
    {                    \
        __asm CLI;       \
    }
#define DisableInterrupts \
    {                     \
        __asm SEI;        \
    }

/*-----------------------------------------------------------------------------
 Response
 -----------------------------------------------------------------------------*/
#define POSITIVE_RSP 0x00
#define NEGATIVE_RSP (! POSITIVE_RSP)
/*-----------------------------------------------------------------------------
 SPRMB
 -----------------------------------------------------------------------------*/
#define AbleResponseType    0x00
#define DisableResponseType (! AbleResponseType)
/*-----------------------------------------------------------------------------
 NRC13 check type
 -----------------------------------------------------------------------------*/
#define MinLengthType 0x00
#define SubLengthType (! MinLengthType)
/*-----------------------------------------------------------------------------
 Session mode
 -----------------------------------------------------------------------------*/
#define DefaultMode            0x01
#define ProgrammingMode        0x02
#define ExtendedDiagnosticMode 0x04
/*----------------------------------------------- ------------------------------
 Security level
 -----------------------------------------------------------------------------*/
#define NoNeed     0x00
#define NeedLevel1 0x01
#define NeedLevel2 0x02
/******************************************************************************
 Function and subFunction
 Diagnostic Session
 *******************************************************************************/
#define DiagnosticSessionControl  0x10
#define DefaultSession            0x01
#define ProgrammingSession        0x02
#define ExtendedDiagnosticSession 0x03

/******************************************************************************
 Function and subFunction
 ECUReset
 ********************************************************************************/
#define ECUReset  0x11
#define HardReset 0x01
#define SoftReset 0x03

/******************************************************************************
 Function and subFunction
 ClearDiagnosticInformation
 ********************************************************************************/
#define ClearDiagnosticInformation 0x14

/******************************************************************************
 Function and subFunction
 ReadDTCInformation
 ********************************************************************************/
#define ReadDTCInformation 0x19
#define Error              0x09
#define NoError            0x08

#define OTA_None  0x00
#define OTA_Reqed 0x01
#define OTA_Quit  0x02

// typedef void (*pfuMsgLost)(void);
// typedef void (*pfuMsgOk)(void);

// typedef struct
// {
//     const uint16_t     Msg_ID;
//     volatile uint16_t *DTC_NodeLostCnt;
//     volatile uint8_t  *DTC_NodeLostFlag;
//     const uint16_t     DTC_LostPeriod;
//     pfuMsgLost         pfuLostHandleCBK;
//     pfuMsgOk           pfuOkHandleCBK;
// } DTC_NodeLostType;
#define _CLRBIT(p, b)     p &= ~(1 << b)
#define _SETBIT(p, b)     p |= (1 << b)
#define _bit_is_set(p, b) p & (1 << b)

#define CLRBIT(p, b)     p &= ~(1 << b)
#define SETBIT(p, b)     p |= (1 << b)
#define bit_is_set(p, b) p & (1 << b)

#define bit_is_clear(p, b) ! (p & (1 << b))

#define bit_2_set(p, b) ((p >> b) & 0x03)
#define bit_3_set(p, b) ((p >> b) & 0x07)
#define bit_4_set(p, b) ((p >> b) & 0x0F)
#define bit_5_set(p, b) ((p >> b) & 0x1F)
#define bit_6_set(p, b) ((p >> b) & 0x3F)
#define bit_7_set(p, b) ((p >> b) & 0x7F)

/******************************************************************************
 Function and subFunction
 ReadDataByIdentifier
 ********************************************************************************/
#define ReadDataByIdentifier 0x22
/******************************************************************************
 Function and subFunction
 SecurityAccess
 ********************************************************************************/
#define SecurityAccess    0x27
#define requestSeed_LV1   0x01
#define sendKey_LV1       0x02
// #define requestSeed_LV3   0x03
// #define sendKey_LV3       0x04
// #define requestSeed_LV5   0x05
// #define sendKey_LV5       0x06
// #define requestSeed_LV11  0x11
// #define sendKey_LV11      0x12
#define NormalKeyUnlock   0x01
#define NormalKeyLock     0x00
#define BootKeyUnlock     0x02
#define BootKeyLock       0x00
#define RequestSeedMaxCnt 0x04
#define AttemptMaxCnt     0x03

#define FLASH_SECTOR_SIZE 0x400
/******************************************************************************
 Function and subFunction and type
 CommunicationControl
 ********************************************************************************/
#define CommunicationControl                                              0x28
#define enableRxAndTx                                                     0x00
#define enableRxAndDisableTx                                              0x01
#define disableRxAndEnableTx                                              0x02
#define disableRxAndTx                                                    0x03
#define normalCommunicationMessages                                       0x01
#define networkManagementCommunicationMessages                            0x02
#define networkManagementCommunicationMessagesnormalCommunicationMessages 0x03

/************************28SerStart*********************/
#define DIAG_COM_NOR_TX 0x01
#define DIAG_COM_NOR_RX 0x02
#define DIAG_COM_NW_TX  0x04
#define DIAG_COM_NW_RX  0x08

#define DIAG_SET_COM_DISABLE(Var, BitField, Type) ((Var) |= ( Type )(BitField))
#define DIAG_SET_COM_ENABLE(Var, BitField, Type)  ((Var) &= (Type) ~( Type )(BitField))
#define DIAG_TST_BIT_SET(Var, BitField, Type)     (0U != ((Var) & ( Type )(BitField)))
#define DIAG_TST_BIT_RESET(Var, BitField, Type)   (0U == ((Var) & ( Type )(BitField)))
/************************28SerEnd***********************/

/******************************************************************************
 Function and subFunction
 WriteDataByIdentifier
 ********************************************************************************/
#define WriteDataByIdentifier 0x2E

/******************************************************************************
 Function and subFunction
 InputOutputControlByIdentifier
 ********************************************************************************/
#define InputOutputControlByIdentifier 0x2F
#define WhiteColor                     0x01
#define BlackColor                     0x02
#define RedColor                       0x03
#define GreenColor                     0x04
#define BlueColor                      0x05
#define GaugeSpeed                     0x01
#define GaugeTacho                     0x02
#define GaugeFuel                      0x03
#define GaugeEngCoolantTemp            0x04
#define ZeroPosition                   0x00
#define HalfPosition                   0x01
#define FullPosition                   0x02

#define Clear  0x08
#define Contrl 0x03
#define Resume 0x00

/******************************************************************************
 Function and subFunction
 RoutineControl
 ********************************************************************************/
#define RoutineControl                 0x31
#define startRoutine                   0x01
#define stopRoutine                    0x02
#define requestRoutineResults          0x03
#define MaintenanceReset               0X62F1
#define CheckMemory                    0x0202
#define UpdateConditionCheck           0x0203
#define ECU_selftest                   0xDFF0
#define EraseMemory                    0xFF00
#define CheckProgrammingDependencies   0xFF01
#define RoutineCompletedSuccessfully   0x00
#define RoutineCompletedUnsuccessfully 0x05

/******************************************************************************
 Function and subFunction
 RequestDownload
 ********************************************************************************/
#define RequestDownload        0X34
#define LengthFormatIdentifier 0x20
#define Download               0x01

/******************************************************************************
 Function and subFunction
 TransferDataf
 ********************************************************************************/
#define TransferData 0x36

/******************************************************************************
 Function and subFunction
 RequestTransferExit
 ********************************************************************************/
#define RequestTransferExit 0x37

/******************************************************************************
 Function and subFunction
 TesterPresent
 ********************************************************************************/
#define TesterPresent 0x3E

/******************************************************************************
 Function and subFunction
 ControlDTCSetting
 ********************************************************************************/
#define ControlDTCSetting 0x85
#define DTCSettingOn      0x01
#define DTCSettingOff     0x02

/******************************************************************************
 Supported negative response codes
 *******************************************************************************/
#define positiveResponse                        0x00
#define serviceNotSupported                     0x11
#define subFunctionNotSupported                 0x12
#define incorrectMessageLength                  0x13
#define responseTooLong                         0x14
#define conditionsNotCorrect                    0x22
#define requestSequenceError                    0x24
#define requestOutOfRange                       0x31
#define securityAccessDenied                    0x33
#define invalidKey                              0x35
#define exceedNumberOfAttempts                  0x36
#define requiredTimeDelayNotExpired             0x37
#define uploadDownloadNotAccepted               0x70
#define transferDataSuspended                   0x71
#define generalProgrammingFailure               0x72
#define wrongBlockSequenceCounter               0x73
#define requestCorrectlyReceivedResponsePending 0x78
#define subfunctionNotSupportinActiveSession    0x7E
#define serviceNotSupportedInActiveSession      0x7F
#define engineIsRunning                         0x83
#define engineIsNotRunning                      0x84
#define engineRunTimeTooLow                     0x85
#define voltageTooHigh                          0x92
#define voltageTooLow                           0x93

#define noErr             0
#define SRecRangeError    1
#define SRecOddError      2    // S-Record Size Must Be Even
#define FlashProgramError 3    // Flash Programming Error
#define FlashEraseError   4    // Flash Erase Error
#define BadHexData        5    // Bad Hex Data
#define SRecTooLong       6    // S-Record Too Long
#define CheckSumErr       7    // Checksum Error
#define UnknownPartID     8    // Unknown Part ID

#define SWV 0x100 // 0x100 = 1.00 software version 软件版本号
#define HWV 0x100 // 0x100 = 1.00 hardware version 硬件版本号
#define BTV 0x100 // 0x100 = 1.00 bootloader version boot程序版本号
#define INTLV 0x100 // 0x100 = 1.00 internal version 内部版本号
#define PROG_Y 0x24 // 0x24 = 2024年, program year
#define PROG_M 0x07 // 0x03 = 3月, program month
#define PROG_D 0x16 // 0x19 = 19日, program day

typedef struct
{
    uint32_t Flag;
    uint8_t  Attemptcnt;
    uint8_t  RequestSeedCnt;
    uint8_t  AttemptIIcnt;
    uint8_t  RequestSeedIICnt;
} Ser27_FlowCtrlCntUnion;

typedef struct
{
    uint32_t Flag;
    uint8_t DID_F180[6];
    uint8_t DID_F187[16];
    uint8_t DID_F193[6];
    uint8_t DID_F195[6];
    uint8_t Filldata[2];
}DiagDFlashData;
extern DiagDFlashData DiagDataForDFlash;

typedef struct
{
    uint32_t Flag;
    uint8_t DID_F184[32];
} Ser2EDFlashData;
extern Ser2EDFlashData Ser2EDataForDFlash;

typedef struct
{
    uint32_t Flag;
    uint32_t APP_STATUS;
}DiagFlag;
extern DiagFlag DiagDataForFlag;

typedef struct
{
    uint8_t Para;
    uint8_t code;
    uint8_t OpCode;
} DiagSendDataNeg;

void UDS_Service_10_Indication(uint16_t A_TA_type, uint16_t A_Length, uint8_t *A_Data);
void UDS_Service_11_Indication(uint16_t A_TA_type, uint16_t A_Length, uint8_t *A_Data);
void UDS_Service_22_Indication(uint16_t A_TA_type, uint16_t A_Length, uint8_t *A_Data);
void UDS_Service_2E_Indication(uint16_t A_TA_type, uint16_t A_Length, uint8_t *A_Data);
void UDS_Service_27_Indication(uint16_t A_TA_type, uint16_t A_Length, uint8_t *A_Data);
void UDS_Service_28_Indication(uint16_t A_TA_type, uint16_t A_Length, uint8_t *A_Data);
void UDS_Service_3E_Indication(uint16_t A_TA_type, uint16_t A_Length, uint8_t *A_Data);
void UDS_Service_85_Indication(uint16_t A_TA_type, uint16_t A_Length, uint8_t *A_Data);
void S3_ServerCNTT(void);
void Randomcnt(void);
extern void DIAG_InitParameter(void);

void GetSeed(void);
void CalculateKey(void);
void CalculateKeyLv11(void);

typedef void (*InitFunction)(void);

/***********Local Functin*************/
uint8_t GetCurrentSession(void);
uint8_t SerXXNRC12Filter(uint8_t insub, const uint8_t *supportsub, uint8_t size, uint8_t *index);
uint8_t SerXXNRC13Filter(uint8_t type, uint8_t serlength, const uint8_t *length, uint8_t index);
uint8_t SerXXNRC22Filter(void);
uint8_t SerXXNRC31DIDFilter(uint16_t inDID, const uint16_t *DIDList, uint8_t size, uint8_t *index);
uint8_t SerXXNRC33Filter(const uint8_t *levelList, uint8_t index);
uint8_t SerXXNRC7EFilter(const uint8_t *SubSupportSession, uint8_t index);
uint8_t SerXXNRC7FFilter(uint8_t SupportSession);
extern void Data_Set_DiagPara(void);
void Write_App_InValid(uint32_t m32);
void Data_Read_DiagPara(void);
void DFlash_init(void);
void Data_Read_DiagPara(void);

#endif