#ifndef _UDS_FBL_SERVICE_85_SOURCE #define _UDS_FBL_SERVICE_85_SOURCE /******************************************************************************* ** Include Section ** *******************************************************************************/ #include "uds_fbl_mgr.h" #include "uds_fbl_service85.h" /******************************************************************************* ** Version Information ** *******************************************************************************/ /******************************************************************************* ** Version Check ** *******************************************************************************/ /******************************************************************************* ** Macro definition ** *******************************************************************************/ /******************************************************************************* ** Global Data ** *******************************************************************************/ const uds_nrc nrc_8501[2] = { UDSincorrectMessageLengthOrInvalidFormat,\ UDSconditionNotCorrect }; const uds_nrc nrc_8502[2] = { UDSincorrectMessageLengthOrInvalidFormat,\ UDSconditionNotCorrect }; /*--------- <0x11> sub function config start-------------*/ static const DIAG_sunfunction_t SessionSubfunction[] = { {0x01 ,4,false,5,2,NULL,{nrc_8501, 2}}, {0x02 ,4,false,5,2,NULL,{nrc_8502, 2}} }; /*===============================================================================================*/ /* uds_nrc service85_nrc_check(UDSpacket_t* qUDSpacket) */ /* ----------------------------------------------------------------------------------------------*/ /* Function: 85 service negative response judgment */ /* Arguments: qUDSpacket : CAN message structure pointer */ /* Return: Response type */ /*===============================================================================================*/ uds_nrc service85_nrc_check(UDSpacket_t* qUDSpacket) { uds_nrc returnType = 0; uint8_t const kwpdiag_num = (sizeof(SessionSubfunction)/sizeof(DIAG_sunfunction_t)); uint8_t index = 0; uint8_t requestsid; uint8_t currentSession = 0; requestsid = UDS_GET_SUB_FUNCTION(qUDSpacket->Data.Byte[1]); for (index = 0; index < kwpdiag_num; index++) { if(requestsid == SessionSubfunction[index].sub_requestsid) { break; } } if(index != kwpdiag_num) { nrc_table_t nrc_table = SessionSubfunction[index].nrc_table; uint16_t length = SessionSubfunction[index].rx_dataLen; uint8_t index_nrc = 0; uint8_t sid = SessionSubfunction[index].sub_requestsid; /* Judge abnormal situations according to NRC priority */ for (index_nrc = 0; (index_nrc < nrc_table.nrc_cnt) && (returnType == 0); index_nrc++) { switch (nrc_table.nrc_list[index_nrc]) { case UDSincorrectMessageLengthOrInvalidFormat: if (Uds_Nrc13_Occur(qUDSpacket->size, length)) { returnType = UDSincorrectMessageLengthOrInvalidFormat; } break; case UDSconditionNotCorrect: if (sid == requestsid) { currentSession = udsFbl_GetCurrentSessionMode(); if ((currentSession & SessionSubfunction[index].session_mask) == 0) { returnType = UDSconditionNotCorrect; } } break; default: break; } } } else { returnType = UDSsubfunctionNotSupported; } return returnType; /* return highest priority nrc*/ } /*===============================================================================================*/ /* uint8_t ApplDiag_ControlDTCSetting_85(UDSpacket_t* qUDSpacket) */ /* ----------------------------------------------------------------------------------------------*/ /* Function: 85 service entry processing function */ /* Arguments: qUDSpacket : CAN message structure pointer */ /* Return: Response type */ /*===============================================================================================*/ uint8_t ApplDiag_ControlDTCSetting_85(UDSpacket_t* qUDSpacket) { uds_nrc returnType = 0; uint8_t subFunction; returnType = service85_nrc_check(qUDSpacket); subFunction = UDS_GET_SUB_FUNCTION(qUDSpacket->Data.Byte[1]); if (UDSpositiveResp == returnType) { switch (subFunction) { case 0x01: break; case 0x02: break; default: break; } } if(UDSpositiveResp == returnType) { qUDSpacket->Data.Byte[0] = UDS_GET_POSITIVE_RSP(qUDSpacket->Data.Byte[0]); qUDSpacket->size = 2; } else { /* do nothing */ } return returnType; } /******************************************************************************* ** End of File ** *******************************************************************************/ #endif /*_UDS_FBL_SERVICE_85_SOURCE*/