#ifndef _KWP2000_SERVICE_H
#define _KWP2000_SERVICE_H

/*
*********************************************************************
* defines
*********************************************************************
*/
/* KWP2000 keybytes for initialization */
#define KWP2000_KEYBYTE1                                        0xE9u      /* Both Len type - Both header type - Normal timing */
#define KWP2000_KEYBYTE2                                        0x8Fu

/* Request Service Id */
#define KWP2000_STARTDIAGNOSTICSESSION_REQUEST                  0x10u
#define KWP2000_ECURESET_REQUEST                                0x11u
#define KWP2000_READFREEZEFRAMEDATA_REQUEST                     0x12u
#define KWP2000_READDIAGNOSTICTROUBLECODES_REQUEST              0x13u
#define KWP2000_CLEARDIAGNOSTICINFORMATION_REQUEST              0x14u
#define KWP2000_READNUMBEROFDIAGNOSTICTROUBLECODES_REQUEST      0x15u
#define KWP2000_READSTATUSOFDIAGNOSTICTROUBLECODES_REQUEST      0x17u
#define KWP2000_READDIAGNOSTICTROUBLECODESBYSTATUS_REQUEST      0x18u
#define KWP2000_READECUIDENTIFICATION_REQUEST                   0x1Au
#define KWP2000_STOPDIAGNOSTICSESSION_REQUEST                   0x20u
#define KWP2000_READDATABYLOCALIDENTIFIER_REQUEST               0x21u
#define KWP2000_READDATABYCOMMONIDENTIFIER_REQUEST              0x22u
#define KWP2000_READMEMORYBYADDRESS_REQUEST                     0x23u
#define KWP2000_SETDATARATES_REQUEST                            0x26u
#define KWP2000_SECURITYACCESS_REQUEST                          0x27u
#define KWP2000_DYNAMICALLYDEFINELOCALIDENTIFIER_REQUEST        0x2Cu
#define KWP2000_WRITEDATABYCOMMONIDENTIFIER_REQUEST             0x2Eu
#define KWP2000_INPUTOUTPUTCONTROLBYCOMMONIDENTIFIER_REQUEST    0x2Fu
#define KWP2000_INPUTOUTPUTCONTROLBYLOCALIDENTIFIER_REQUEST     0x30u
#define KWP2000_STARTROUTINEBYLOCALIDENTIFIER_REQUEST           0x31u
#define KWP2000_STOPROUTINEBYLOCALIDENTIFIER_REQUEST            0x32u
#define KWP2000_REQUESTROUTINERESULTSBYLOCALIDENTIFIER_REQUEST  0x33u
#define KWP2000_REQUESTDOWNLOAD_REQUEST                         0x34u
#define KWP2000_REQUESTUPLOAD_REQUEST                           0x35u
#define KWP2000_TRANSFERDATA_REQUEST                            0x36u
#define KWP2000_REQUESTTRANSFEREXIT_REQUEST                     0x37u
#define KWP2000_STARTROUTINEBYADDRESS_REQUEST                   0x38u
#define KWP2000_STOPROUTINEBYADDRESS_REQUEST                    0x39u
#define KWP2000_REQUESTROUTINERESULTSBYADDRESS_REQUEST          0x3Au
#define KWP2000_WRITEDATABYLOCALIDENTIFIER_REQUEST              0x3Bu
#define KWP2000_WRITEMEMORYBYADDRESS_REQUEST                    0x3Du
#define KWP2000_TESTERPRESENT_REQUEST                           0x3Eu
#define KWP2000_ESCCODE_REQUEST                                 0x80u
#define KWP2000_STARTCOMMUNICATION_REQUEST                      0x81u
#define KWP2000_STOPCOMMUNICATION_REQUEST                       0x82u
#define KWP2000_ACCESSTIMINGPARAMETER_REQUEST                   0x83u
#define KWP2000_STARTAPPLICATION_REQUEST                        0xA2u

/**/
#define KWP2000_POSITIVE_RESPONSE_OFFSET                        0x40

/* negative response */
#define KWP_NEGATIVE_RESPONSE                                   0x7F

/* Response codes for KWP2000 services */
#define KWP2000_generalReject                                   0x10u
#define KWP2000_serviceNotSupported                             0x11u
#define KWP2000_subFunctionNotSupported                         0x12u
#define KWP2000_busy_RepeatRequest                              0x21u
#define KWP2000_conditionsNotCorrect                            0X22u
#define KWP2000_routineNotComplete                              0x23u
#define KWP2000_requestOutOfRange                               0x31u
#define KWP2000_securityAccessDenied                            0x33u
#define KWP2000_invalidKey                                      0x35u
#define KWP2000_exceedNumberOfAttempts                          0x36u
#define KWP2000_requiredTimeDelayNotExpired                     0x37u
#define KWP2000_downloadNotAccepted                             0x40u
#define KWP2000_improperDownloadType                            0x41u
#define KWP2000_cannotDownloadToSpecifiedAddress                0x42u
#define KWP2000_cannotDownloadNumberOfBytesRequested            0x43u
#define KWP2000_uploadNotAccepted                               0x50u
#define KWP2000_improperUploadType                              0x51u
#define KWP2000_cannotUploadFromSpecifiedAddress                0x52u
#define KWP2000_cannotUploadNumberOfBytesRequested              0x53u
#define KWP2000_transferSuspended                               0x71u
#define KWP2000_transferAborted                                 0x72u
#define KWP2000_illegalAddressInBlockTransfer                   0x74u
#define KWP2000_illegalByteCountInBlockTransfer                 0x75u
#define KWP2000_illegalBlockTransferType                        0x76u
#define KWP2000_blockTransferDataChecksumError                  0x77u
#define KWP2000_reqCorrectlyRcvd_RspPending                     0x78u
#define KWP2000_incorrectByteCountDuringBlockTransfer           0x79u
#define KWP2000_serviceNotSupportedInActiveDiagnosticSession    0x80u
/*
*********************************************************************
* structure
*********************************************************************
*/
typedef struct
{
    unsigned char  ResponseCode;
} Kwp2000_Negative_t;

/*
*********************************************************************
* variable
*********************************************************************
*/
extern Kwp2000_Negative_t  Kwp2000_Negative;

/*
*********************************************************************
* function
*********************************************************************
*/
extern unsigned char kwp_NegativeResponse(unsigned char sId_u8, unsigned char NegRC_u8, unsigned char *blockByte);
extern unsigned char kwp_EcuReset(unsigned char *TxData, unsigned char *RequestData);
extern unsigned char kwp_TesterPresent(unsigned char *TxData, unsigned char *RequestData);
extern unsigned char kwp_StartCommunication(unsigned char *TxData, unsigned char *RequestData);
extern unsigned char kwp_StopCommunication(unsigned char *TxData, unsigned char *RequestData);
extern unsigned char kwp_readEcuIdentification(unsigned char *TxData, unsigned char *RequestData);
extern unsigned char kwp_writeDataByLocalIdentifier(unsigned char *TxData, unsigned char *RequestData);
extern unsigned char kwp_readDataByLocalIdentifier(unsigned char *TxData, unsigned char *RequestData);
extern unsigned char kwp_readDataByCommonIdentifier(unsigned char *TxData, unsigned char *RequestData);

extern unsigned char kwp_readDataStatusofDTC(unsigned char *TxData, unsigned char *RequestData);
extern unsigned char kwp_readDataAccessMode(unsigned char *TxData, unsigned char *RequestData);
extern unsigned char kwp_StartroutInebykocalIdentifier(unsigned char *TxData, unsigned char *RequestData);
extern unsigned char kwp_ClearDiagnosticInformation(unsigned char *TxData, unsigned char *RequestData);

/******************************************************************************
K-LINE下线配置
******************************************************************************/
typedef struct
{
    unsigned long Flag       ; /*初始化标记位*/
    // HEX
    unsigned char K_Line_LID20; /* 00 应对ECE R13     //0:非应对、1:应对 */
    unsigned char K_Line_LID21; /* 00 EBS/ABS         //0:无、1:EBS、2:ABS(CAN应对) 3:ABS (CAN非应对) */
    unsigned char K_Line_LID22; /* 00 EVSC            //0:无、1:有 */
    unsigned char K_Line_LID23; /* 00 驻车锁定        //0:无、1:有 */

    unsigned char K_Line_LID24; /* 00 HSA             //0:无、1:有 */
    unsigned char K_Line_LID25; /* 00 AEBS            //0:无、1:有 */
    unsigned char K_Line_LID26; /* 00 ACC             //0:无、1:有 */
    unsigned char K_Line_LID27; /* 00 LDWS            //0:无、1:有 */

    unsigned char K_Line_LID28; /* 00 车辆间报警      //0:无、1:有 */
    unsigned char K_Line_LID29; /* 01 有无巡航        //0:无、1:有          /*初值1*/
    unsigned char K_Line_LID2A; /* 00 气悬            //0:Reef、1:Rear air、2:Full air */
    unsigned char K_Line_LID2B; /* 00 ISS             //0:无、1: eco stop、 2:Idle Stop */

    unsigned char K_Line_LID2C; /* 00 装货台工作警报蜂鸣//0:无、1:有             */
    unsigned char K_Line_LID2D; /* 00 ROWS            //0:无、1:ROWS有、2LOCAL警报有 */
    unsigned char K_Line_LID2E; /* 00 行车记录仪      //0:模拟记录仪、1:数字记录仪或行车记录仪 */
    unsigned char K_Line_LID2F; /* 00 车型            //0:单车、1:拖车、2:全拖车 */

    unsigned char K_Line_LID30; /* 00 缓速器          //0:无、1:有(C&E)、2:有(F) */
    unsigned char K_Line_LID31; /* -- 定速巡航        //0:无、1:有 */
    unsigned char K_Line_LID32; /* 00 装货台种类      //0:一般、1:侧翼、2:倾倒 */
    unsigned char K_Line_LID33; /* 01 SCR?DPD         //0:SCR无/DPD有、1:SCR有/DPD有、2:SCR无/DPD无、3:SCR有/DPD无    /*初值1*/

    unsigned char K_Line_LID34; /* 00 驻车种类        //0:FULL AIR、1:AOH                     /*初值1*/
    unsigned char K_Line_LID35; /* -- 气压计          //0:2针式、1:1针式 */
    unsigned char K_Line_LID36; /* -- 低压警报压      //0:一般输出(539kPa)、1:ADR(588kPa) */
    unsigned char K_Line_LID37; /* -- 超限警报        //0:无、1:有 */

    unsigned char K_Line_LID38; /* -- 速度警报        //0:无、1:有 */
    unsigned char K_Line_LID39; /* 00 可变SLD         //0:无、1:1车速、2:2车速            /*初值1*/
    unsigned char K_Line_LID3A; /* -- OEM             //0:ISZ、1:UDT */
    unsigned char K_Line_LID3B; /* -- 预留 */

    unsigned char K_Line_LID3C; /* -- 预留 */
    unsigned char K_Line_LID3D; /* -- 预留 */
    unsigned char K_Line_LID3E; /* 01 预留            //0:胎压功能未匹配    1:匹配 */
    unsigned char K_Line_LID3F; /* -- 预留 */

    unsigned char K_Line_LID40; /* 00 发动机种类 */
    unsigned char K_Line_LID41; /* 10 变速器种类&控制                                /*初值50*/
    unsigned char K_Line_LID42; /* 00 驻车管道                                       /*初值 0*/
    unsigned char K_Line_LID43; /* 82 车型                                           /*初值44*/

    unsigned char K_Line_LID44; /* FF 速度警报                                       /*初值FF*/
    unsigned char K_Line_LID45; /* FF 发动机转速                                     /*初值FF*/
    unsigned char K_Line_LID46; /* FF 急加速                                         /*初值FF*/
    unsigned char K_Line_LID47; /* FF 急减速                                         /*初值FF*/

    unsigned char K_Line_LID48; /* FF 长时间怠速                                     /*初值FF*/
    unsigned char K_Line_LID49; /* FF 辅助驻车                                       /*初值FF*/
    unsigned char K_Line_LID4A; /* 32 变速箱油              5000 */
    unsigned char K_Line_LID4B; /* 32 差速器油              5000 */

    unsigned char K_Line_LID4C; /* 32 离合器油 */
    unsigned char K_Line_LID4D; /* 64 动力转向油            10000 */
    unsigned char K_Line_LID4E; /* 78 轮胎                  12000 */
    unsigned char K_Line_LID4F; /* 32 机油&滤清器          5000 */

    unsigned char K_Line_LID50; /* -- 预留 */
    unsigned char K_Line_LID51; /* 01 工作模式              0-工厂模式  1-通常模式  2-销售模式*/
    unsigned char K_Line_LID52; /* 00 电子部件设定           0-500K    1-250k*/
    unsigned char KLINE;

    unsigned char No_Digit1;          //01
    unsigned char No_Digit2;          //02
    unsigned char No_Digit3;          //03
    unsigned char No_Digit4;          //04

    unsigned char No_Digit5;          //05
    unsigned char No_Digit6;          //06
    unsigned char No_Digit7;          //07
    unsigned char No_Digit8;          //08

    unsigned char No_Digit9;          //09
    unsigned char No_Digit10;         //10
    unsigned char ECUStatus1;         //11
    unsigned char ECUStatus2;         //12

    unsigned char ECUStatus3;         //13
    unsigned char ECUStatus4;         //14
    unsigned char ECUStatus5;         //15
    unsigned char METERCOUNT;         //16

    unsigned char NoOfDTCFF00;        //17
    unsigned char NoOfDTC8000;        //18
    unsigned char TesterECU;          //19
    unsigned char TesterECUCAN;       //20

    unsigned char User_Light1;
    unsigned char User_Light2;
    unsigned char reserve3;
    unsigned char reserve4;
} _EOL_K_LINE_SET;

extern _EOL_K_LINE_SET K_Line_Set;
typedef union
{
    unsigned char SendSeedEQUSRecvSeed;        /*密钥配对成功标识 0-失败 1-成功*/
    unsigned char RecvStart           ;        /*通讯开始标识    0-结束 1-开始*/
    unsigned char S_Regist            ;        /*是否注册标识*/
    unsigned char AccessMode2701      ;        /*27服务进入计时标志*/
} _K_LINE_SIGNAL_FLAG;

extern _K_LINE_SIGNAL_FLAG   K_LINE_SIGNAL_FLAG;

typedef union
{
    unsigned char ActiveSecurityAccess ;   /*修正值状态   0-未实施 1-实施后*/
    unsigned char SensorStatus         ;   /*传感器输入状态 0-LOW    1-HIGH*/
    unsigned char Security_Active      ;   /*锁定状态      0-未锁定 1-锁定*/
    unsigned char reserve              ;
} _ECUStatus;

extern    _ECUStatus        ECUStatusONE;

#define   ECUSTATUST_F      00             /*修正系数 EOL系数*2048*/

extern unsigned char        Sendseed1;      /*仪表计算*/
extern unsigned char        Sendseed2;
extern unsigned char        Sendseed3;
extern unsigned char        Sendseed4;

extern unsigned char        Recvseed1;      /*仪表接收*/
extern unsigned char        Recvseed2;
extern unsigned char        Recvseed3;
extern unsigned char        Recvseed4;

extern unsigned char Seed1, Seed2, Seed3, Seed4;

//extern unsigned long        SeedKey;
extern unsigned char        AccessMode2701KeyTimeFlag;
extern unsigned char        AccessMode2701KeyTime;

extern unsigned char Common_Get_DTCstatusCHGFFK_Flag(void);
extern void Common_Set_DTCstatusCHGFFK_Flag(unsigned char Val);
extern void K_LINE_EOL_InitVal(void);

extern void App_Uds_Calc_Key(void);
extern unsigned char Cup_Key(unsigned char KLineseed, unsigned char Num, unsigned char Seed);
extern unsigned char BitReplace (unsigned char Data);
extern void sendkey(void);
#endif