+ }\r
+ else\r
+ {\r
+ diagResponseCode = DCM_E_INCORRECTMESSAGELENGTHORINVALIDFORMAT;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ diagResponseCode = DCM_E_INCORRECTMESSAGELENGTHORINVALIDFORMAT;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ diagResponseCode = DCM_E_REQUESTOUTOFRANGE; /*UDS_REQ_0x23_10*/\r
+ }\r
+ }\r
+ else\r
+ {\r
+ diagResponseCode = DCM_E_INCORRECTMESSAGELENGTHORINVALIDFORMAT;\r
+ }\r
+\r
+ if(DCM_E_POSITIVERESPONSE == diagResponseCode)\r
+ {\r
+ pduTxData->SduLength = SID_LEN + ALFID_LEN + addressFormat + sizeFormat;\r
+ pduTxData->SduDataPtr[ALFID_INDEX] = pduRxData->SduDataPtr[ALFID_INDEX];\r
+ for(i = 0; i < addressFormat + sizeFormat; i++)\r
+ {\r
+ pduTxData->SduDataPtr[ADDR_START_INDEX + i] = pduRxData->SduDataPtr[ADDR_START_INDEX + i];\r
+ if(OpStatus != DCM_WRITE_PENDING)\r
+ {\r
+ DsdDspProcessingDone(diagResponseCode);\r
+ }\r
+ else\r
+ {\r
+ dspMemoryState=DCM_MEMORY_WRITE;\r
+ }\r
+ }\r
+ }\r
+ else\r
+ {\r
+ DsdDspProcessingDone(diagResponseCode);\r
+ }\r
+}\r
+\r
+/*@req Dcm442,DCM492*/\r
+void DspUdsReadMemoryByAddress(const PduInfoType *pduRxData, PduInfoType *pduTxData)\r
+{\r
+ Dcm_NegativeResponseCodeType diagResponseCode;\r
+ uint8 sizeFormat;\r
+ uint8 addressFormat;\r
+ uint32 memoryAddress = 0;\r
+ uint32 length = 0;\r
+ uint8 i;\r
+ uint8 memoryIdentifier = 0; /* Should be 0 if DcmDspUseMemoryId == FALSE */\r
+ Dcm_OpStatusType OpStatus;\r
+ uint8 addressOffset;\r
+\r
+ if( pduRxData->SduLength > ALFID_INDEX )\r
+ {\r
+ sizeFormat = ((uint8)(pduRxData->SduDataPtr[ALFID_INDEX] & DCM_FORMAT_HIGH_MASK)) >> 4; /*@req UDS_REQ_0x23_1 & UDS_REQ_0x23_5*/;\r
+ addressFormat = ((uint8)(pduRxData->SduDataPtr[ALFID_INDEX])) & DCM_FORMAT_LOW_MASK; /*@req UDS_REQ_0x23_1 & UDS_REQ_0x23_5*/;\r
+ if((addressFormat != 0) && (sizeFormat != 0))\r
+ {\r
+ if(addressFormat + sizeFormat + SID_LEN + ALFID_LEN == pduRxData->SduLength)\r
+ {\r
+ if( TRUE == DCM_Config.Dsp->DspMemory->DcmDspUseMemoryId ) {\r
+ memoryIdentifier = pduRxData->SduDataPtr[ADDR_START_INDEX];\r
+ addressOffset = 1;\r
+ }\r
+ else {\r
+ addressOffset = 0;\r
+ }\r
+\r
+ /* Parse address */\r
+ for(i = addressOffset; i < addressFormat; i++)\r
+ {\r
+ memoryAddress <<= 8;\r
+ memoryAddress += (uint32)(pduRxData->SduDataPtr[ADDR_START_INDEX + i]);\r
+ }\r
+\r
+ /* Parse size */\r
+ for(i = 0; i < sizeFormat; i++)\r
+ {\r
+ length <<= 8;\r
+ length += (uint32)(pduRxData->SduDataPtr[ADDR_START_INDEX + addressFormat + i]);\r
+ }\r
+\r
+ if(length <= (DCM_PROTOCAL_TP_MAX_LENGTH - SID_LEN) )\r
+ {\r
+ diagResponseCode = checkAddressRange(DCM_READ_MEMORY, memoryIdentifier, memoryAddress, length);\r
+ if( DCM_E_POSITIVERESPONSE == diagResponseCode )\r
+ {\r
+ diagResponseCode = readMemoryData(&OpStatus, memoryIdentifier, memoryAddress, length, pduTxData);\r
+ }\r
+ }\r
+ else {\r
+ diagResponseCode = DCM_E_REQUESTOUTOFRANGE;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ diagResponseCode = DCM_E_INCORRECTMESSAGELENGTHORINVALIDFORMAT;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ diagResponseCode = DCM_E_REQUESTOUTOFRANGE; /*UDS_REQ_0x23_10*/\r
+ }\r
+ }\r
+ else\r
+ {\r
+ diagResponseCode = DCM_E_INCORRECTMESSAGELENGTHORINVALIDFORMAT;\r
+ }\r
+\r
+ if(DCM_E_POSITIVERESPONSE == diagResponseCode)\r
+ {\r
+ pduTxData->SduLength = SID_LEN + length;\r
+ if(OpStatus == DCM_READ_PENDING)\r
+ {\r
+ dspMemoryState = DCM_MEMORY_READ;\r
+ }\r
+ else\r
+ {\r
+ DsdDspProcessingDone(DCM_E_POSITIVERESPONSE);\r
+ }\r
+ }\r
+ else\r
+ {\r
+ DsdDspProcessingDone(diagResponseCode);\r
+ }\r
+}\r
+\r
+static Dcm_NegativeResponseCodeType writeMemoryData(Dcm_OpStatusType* OpStatus,\r
+ uint8 memoryIdentifier,\r
+ uint32 MemoryAddress,\r
+ uint32 MemorySize,\r
+ uint8 *SourceData)\r
+{\r
+ Dcm_NegativeResponseCodeType responseCode = DCM_E_POSITIVERESPONSE;\r
+ Dcm_ReturnWriteMemoryType writeRet;\r
+ writeRet = Dcm_WriteMemory(*OpStatus,\r
+ memoryIdentifier,\r
+ MemoryAddress,\r
+ MemorySize,\r
+ SourceData);\r
+ if(DCM_READ_FAILED == writeRet)\r
+ {\r
+ responseCode = DCM_E_GENERALPROGRAMMINGFAILURE; /*@req UDS_REQ_0X3D_16,DCM643*/\r
+ }\r
+ else if(DCM_WRITE_PENDING == writeRet)\r
+ {\r
+ *OpStatus = DCM_PENDING;\r
+ }\r
+ else\r
+ {\r
+ responseCode = DCM_E_POSITIVERESPONSE;\r
+ }\r
+ \r
+ return responseCode;\r
+}\r
+\r
+static boolean checkPeriodicIdentifierBuffer(uint8 PeriodicDid,uint8 Length,uint8 *postion)\r
+{\r
+ uint8 i;\r
+ boolean ret = FALSE;\r
+ for(i = 0;(i < Length) && (ret == FALSE);i++)\r
+ {\r
+ if(PeriodicDid == dspPDidRef.dspPDid[i].PeriodicDid)\r
+ {\r
+ ret = TRUE;\r
+ *postion = i;\r
+ }\r
+ }\r
+ \r
+ return ret;\r
+}\r
+\r
+static void ClearPeriodicIdentifierBuffer(uint8 BufferEnd,uint8 postion)\r
+{\r
+ dspPDidRef.dspPDid[postion].PeriodicDid = dspPDidRef.dspPDid[BufferEnd ].PeriodicDid;\r
+ dspPDidRef.dspPDid[postion].PDidTxCounter = dspPDidRef.dspPDid[BufferEnd].PDidTxCounter;\r
+ dspPDidRef.dspPDid[postion].PDidTxCounterNumber = dspPDidRef.dspPDid[BufferEnd].PDidTxCounterNumber;\r
+ dspPDidRef.dspPDid[BufferEnd].PeriodicDid = 0;\r
+ dspPDidRef.dspPDid[BufferEnd].PDidTxCounter = 0;\r
+ dspPDidRef.dspPDid[BufferEnd ].PDidTxCounterNumber = 0;\r
+}\r
+\r
+static Dcm_NegativeResponseCodeType readPeriodDidData(const Dcm_DspDidType *PDidPtr, uint8 *Data,uint16 *Length)\r
+{\r
+ Dcm_NegativeResponseCodeType responseCode = DCM_E_POSITIVERESPONSE;\r
+ if ((PDidPtr->DspDidInfoRef->DspDidAccess.DspDidRead != NULL) \r
+ && (PDidPtr->DspDidConditionCheckReadFnc != NULL) \r
+ && (PDidPtr->DspDidReadDataFnc != NULL) ) \r
+ { \r
+ if (DspCheckSessionLevel(PDidPtr->DspDidInfoRef->DspDidAccess.DspDidRead->DspDidReadSessionRef)) \r
+ { \r
+ if (DspCheckSecurityLevel(PDidPtr->DspDidInfoRef->DspDidAccess.DspDidRead->DspDidReadSecurityLevelRef)) \r
+ {\r
+ Std_ReturnType result = E_NOT_OK;\r
+ Dcm_NegativeResponseCodeType errorCode = DCM_E_POSITIVERESPONSE;\r
+ result = PDidPtr->DspDidConditionCheckReadFnc(&errorCode);\r
+ if ((result == E_OK) && (errorCode == DCM_E_POSITIVERESPONSE))\r
+ {\r
+ result = E_NOT_OK;\r
+ if (PDidPtr->DspDidInfoRef->DspDidFixedLength)\r
+ { \r
+ *Length= PDidPtr->DspDidSize;\r
+ result = E_OK;\r
+ }\r
+ else\r
+ {\r
+ if(PDidPtr->DspDidReadDataLengthFnc!=NULL)\r
+ {\r
+ result = PDidPtr->DspDidReadDataLengthFnc(Length);\r
+ }\r
+ else\r
+ {\r
+ responseCode = DCM_E_GENERALREJECT;\r
+ }\r
+ }\r
+ if (result == E_OK) \r
+ {\r
+ result = PDidPtr->DspDidReadDataFnc(Data);\r
+ if (result != E_OK)\r
+ {\r
+ responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ responseCode = DCM_E_SECUTITYACCESSDENIED;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+ }\r
+ return responseCode;\r
+}\r
+\r
+static Dcm_NegativeResponseCodeType DspSavePeriodicData(uint16 didNr, uint32 periodicTransmitCounter,uint8 PdidBufferNr)\r
+{\r
+ Dcm_NegativeResponseCodeType responseCode = DCM_E_POSITIVERESPONSE;\r
+ const Dcm_DspDidType *SourceDid = NULL;\r
+ Dcm_DspDDDType *DDidPtr = NULL;\r
+\r
+ if (TRUE == lookupDid(didNr, &SourceDid))\r
+ {\r
+ if(DspCheckSessionLevel(SourceDid->DspDidInfoRef->DspDidAccess.DspDidRead->DspDidReadSessionRef) == TRUE)\r
+ {\r
+ if(DspCheckSecurityLevel(SourceDid->DspDidInfoRef->DspDidAccess.DspDidRead->DspDidReadSecurityLevelRef) == TRUE)\r
+ {\r
+ Std_ReturnType result = E_NOT_OK;\r
+ Dcm_NegativeResponseCodeType errorCode = DCM_E_POSITIVERESPONSE;\r
+ \r
+ if(SourceDid->DspDidConditionCheckReadFnc != NULL)\r
+ {\r
+ result = SourceDid->DspDidConditionCheckReadFnc(&errorCode);\r
+ }\r
+ if ((result != E_OK) || (errorCode != DCM_E_POSITIVERESPONSE))\r
+ {\r
+ responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+ }\r
+ if((SourceDid->DspDidInfoRef->DspDidFixedLength!=TRUE) && (SourceDid->DspDidReadDataLengthFnc == NULL))\r
+ {\r
+ responseCode = DCM_E_GENERALREJECT;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ responseCode = DCM_E_SECUTITYACCESSDENIED;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+ }\r
+ }\r
+ else if(LookupDDD(didNr, (const Dcm_DspDDDType **)&DDidPtr) == TRUE)\r
+ {\r
+ responseCode = DCM_E_POSITIVERESPONSE;\r
+ }\r
+ else\r
+ {\r
+ responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+ }\r
+ if(responseCode == DCM_E_POSITIVERESPONSE)\r
+ {\r
+ dspPDidRef.dspPDid[PdidBufferNr].PeriodicDid = (uint8)didNr & DCM_DID_LOW_MASK;\r
+ dspPDidRef.dspPDid[PdidBufferNr].PDidTxCounter = 0;\r
+ dspPDidRef.dspPDid[PdidBufferNr].PDidTxCounterNumber = periodicTransmitCounter;\r
+ }\r
+ return responseCode;\r
+}\r
+static void ClearPeriodicIdentifier(const PduInfoType *pduRxData,PduInfoType *pduTxData )\r
+{\r
+ uint16 PdidNumber;\r
+ uint8 PDidLowByte;\r
+ uint8 PdidPostion;\r
+ uint8 i;\r
+ if( pduRxData->SduDataPtr[1] == DCM_PERIODICTRANSMIT_STOPSENDING_MODE )\r
+ {\r
+ PdidNumber = pduRxData->SduLength - 2;\r
+ for(i = 0;i < PdidNumber;i++)\r
+ {\r
+ PDidLowByte = pduRxData->SduDataPtr[2];\r
+ if(checkPeriodicIdentifierBuffer(PDidLowByte,dspPDidRef.PDidNr,&PdidPostion) == TRUE)\r
+ {\r
+ dspPDidRef.PDidNr--;\r
+ ClearPeriodicIdentifierBuffer(dspPDidRef.PDidNr, PdidPostion);\r
+ \r
+ } \r
+ }\r
+ pduTxData->SduLength = 1;\r
+ }\r
+}\r
+/*\r
+ DESCRIPTION:\r
+ UDS Service 0x2a - Read Data By Periodic Identifier\r
+*/\r
+void DspReadDataByPeriodicIdentifier(const PduInfoType *pduRxData,PduInfoType *pduTxData)\r
+{\r
+ /** @req DCM254 */\r
+ uint8 PDidLowByte;\r
+ uint16 PdidNumber;\r
+ uint8 PdidPostion;\r
+ uint16 i;\r
+ uint8 PdidBufferNr;\r
+ uint32 periodicTransmitCounter;\r
+ uint16 DataLength;\r
+ Dcm_NegativeResponseCodeType responseCode = DCM_E_POSITIVERESPONSE;\r
+ const Dcm_DspDidType *PDidPtr = NULL;\r
+ Dcm_DspDDDType *DDidPtr = NULL;\r
+ PdidBufferNr = dspPDidRef.PDidNr;\r
+ if(pduRxData->SduLength > 2)\r
+ {\r
+ \r
+ switch(pduRxData->SduDataPtr[1])\r
+ {\r
+ case DCM_PERIODICTRANSMIT_DEFAULT_MODE:\r
+ periodicTransmitCounter = 0;\r
+ break;\r
+ case DCM_PERIODICTRANSMIT_SLOWRATE_MODE:\r
+ periodicTransmitCounter = DCM_PERIODICTRANSMIT_SLOW;\r
+ break;\r
+ case DCM_PERIODICTRANSMIT_MEDIUM_MODE:\r
+ periodicTransmitCounter = DCM_PERIODICTRANSMIT_MEDIUM;\r
+ break;\r
+ case DCM_PERIODICTRANSMIT_FAST_MODE:\r
+ periodicTransmitCounter = DCM_PERIODICTRANSMIT_FAST;\r
+ break;\r
+ case DCM_PERIODICTRANSMIT_STOPSENDING_MODE:\r
+ ClearPeriodicIdentifier(pduRxData,pduTxData);\r
+ break;\r
+ default:\r
+ responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+ break;\r
+ }\r
+ if((pduRxData->SduDataPtr[1] != DCM_PERIODICTRANSMIT_STOPSENDING_MODE) && responseCode == DCM_E_POSITIVERESPONSE)\r
+ {\r
+ PdidNumber = pduRxData->SduLength - 2;\r
+ if(1 == PdidNumber)\r
+ {\r
+ PDidLowByte = pduRxData->SduDataPtr[2]; \r
+ if(checkPeriodicIdentifierBuffer(PDidLowByte,dspPDidRef.PDidNr,&PdidPostion) == TRUE)\r
+ {\r
+ if(0 == periodicTransmitCounter)\r
+ {\r
+ if (TRUE == lookupDid(((uint16)PDidLowByte + 0xF200), &PDidPtr)) /*UDS_REQ_0x2A_1*/\r
+ {\r
+ pduTxData->SduDataPtr[1] = PDidLowByte; \r
+ responseCode = readPeriodDidData(PDidPtr,&pduTxData->SduDataPtr[2],&DataLength);\r
+ pduTxData->SduLength = DataLength + 2;\r
+ }\r
+ else if(TRUE == LookupDDD((0xF200 + (uint16)PDidLowByte), (const Dcm_DspDDDType **)&DDidPtr))\r
+ {\r
+ pduTxData->SduDataPtr[1] = PDidLowByte;\r
+ responseCode = readDDDData(DDidPtr,&pduTxData->SduDataPtr[2],&DataLength);\r
+ pduTxData->SduLength = DataLength + 2;\r
+ }\r
+ else\r
+ {\r
+ responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+ }\r
+ if(responseCode != DCM_E_POSITIVERESPONSE)\r
+ {\r
+ dspPDidRef.PDidNr--;\r
+ ClearPeriodicIdentifierBuffer(dspPDidRef.PDidNr,PdidPostion);\r
+ }\r
+ }\r
+ else\r
+ {\r
+ dspPDidRef.dspPDid[PdidPostion].PDidTxCounterNumber = periodicTransmitCounter;\r
+ pduTxData->SduLength = 1;\r
+ }\r
+ }\r
+ else\r
+ { \r
+ responseCode = DspSavePeriodicData((DCM_PERODICDID_HIHG_MASK + (uint16)PDidLowByte),periodicTransmitCounter,PdidBufferNr);\r
+ PdidBufferNr++;\r
+ pduTxData->SduLength = 1;\r
+ }\r
+ }\r
+ else if(((PdidNumber + PdidBufferNr) <= DCM_LIMITNUMBER_PERIODDATA) && (responseCode == DCM_E_POSITIVERESPONSE)) /*UDS_REQ_0x2A_6*/\r
+ { \r
+ for(i = 0;(i < PdidNumber)&&(responseCode == DCM_E_POSITIVERESPONSE);i++)\r
+ {\r
+ PDidLowByte = pduRxData->SduDataPtr[2 + i];\r
+ if(checkPeriodicIdentifierBuffer(PDidLowByte,PdidBufferNr,&PdidPostion) == TRUE)\r
+ {\r
+ if(dspPDidRef.dspPDid[PdidPostion].PDidTxCounterNumber != periodicTransmitCounter)\r
+ {\r
+ dspPDidRef.dspPDid[PdidPostion].PDidTxCounterNumber = periodicTransmitCounter;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ responseCode = DspSavePeriodicData((0xF200 + (uint16)PDidLowByte),periodicTransmitCounter,PdidBufferNr);\r
+ PdidBufferNr++;\r
+ }\r
+ pduTxData->SduLength = 1;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+ }\r
+ if(responseCode == DCM_E_POSITIVERESPONSE)\r
+ { \r
+ dspPDidRef.PDidNr = PdidBufferNr; \r
+ }\r
+ } \r
+ }\r
+ else if((pduRxData->SduLength == 2)&&(pduRxData->SduDataPtr[1] == DCM_PERIODICTRANSMIT_STOPSENDING_MODE))\r
+ {\r
+ memset(&dspPDidRef,0,sizeof(dspPDidRef));\r
+ pduTxData->SduLength = 1;\r
+ }\r
+ else\r
+ {\r
+ responseCode = DCM_E_INCORRECTMESSAGELENGTHORINVALIDFORMAT;\r
+ }\r
+ DsdDspProcessingDone(responseCode);\r
+}\r
+\r
+static Dcm_NegativeResponseCodeType dynamicallyDefineDataIdentifierbyDid(uint16 DDIdentifier,const PduInfoType *pduRxData,PduInfoType *pduTxData)\r
+{\r
+ uint8 i;\r
+ uint16 SourceDidNr;\r
+ const Dcm_DspDidType *SourceDid = NULL;\r
+ Dcm_DspDDDType *DDid = NULL;\r
+ uint16 SourceLength = 0;\r
+ uint16 DidLength = 0;\r
+ uint16 Length = 0;\r
+ uint8 Num = 0;\r
+ Dcm_NegativeResponseCodeType responseCode = DCM_E_POSITIVERESPONSE;\r
+\r
+ if(FALSE == LookupDDD(DDIdentifier, (const Dcm_DspDDDType **)&DDid))\r
+ {\r
+ while((Num < DCM_MAX_DDD_NUMBER) && (dspDDD[Num].DynamicallyDid != 0 ))\r
+ {\r
+ Num++;\r
+ }\r
+ if(Num >= DCM_MAX_DDD_NUMBER)\r
+ {\r
+ responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+ }\r
+ else\r
+ {\r
+ DDid = &dspDDD[Num];\r
+ }\r
+ }\r
+ else\r
+ {\r
+ while((SourceLength < DCM_MAX_DDDSOURCE_NUMBER) && (DDid->DDDSource[SourceLength].formatOrPosition != 0 ))\r
+ {\r
+ SourceLength++;\r
+ }\r
+ if(SourceLength > DCM_MAX_DDDSOURCE_NUMBER)\r
+ {\r
+ responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+ }\r
+ }\r
+ if(responseCode == DCM_E_POSITIVERESPONSE)\r
+ {\r
+ Length = (pduRxData->SduLength - SID_AND_ALFID_LEN4) /SID_AND_ALFID_LEN4;\r
+ if(((Length*SID_AND_ALFID_LEN4) == (pduRxData->SduLength - SID_AND_ALFID_LEN4)) && (Length != 0))\r
+ {\r
+ if((Length + SourceLength) <= DCM_MAX_DDDSOURCE_NUMBER)\r
+ {\r
+ for(i = 0;(i < Length) && (responseCode == DCM_E_POSITIVERESPONSE);i++)\r
+ {\r
+ SourceDidNr = (((uint16)pduRxData->SduDataPtr[SID_AND_ALFID_LEN4 + i*SID_AND_ALFID_LEN4] << 8) & DCM_DID_HIGH_MASK) + (((uint16)pduRxData->SduDataPtr[(5 + i*SID_AND_ALFID_LEN4)]) & DCM_DID_LOW_MASK);\r
+ if(TRUE == lookupDid(SourceDidNr, &SourceDid))/*UDS_REQ_0x2C_4*/\r
+ { \r
+ if(DspCheckSessionLevel(SourceDid->DspDidInfoRef->DspDidAccess.DspDidRead->DspDidReadSessionRef))\r
+ {\r
+ if(DspCheckSecurityLevel(SourceDid->DspDidInfoRef->DspDidAccess.DspDidRead->DspDidReadSecurityLevelRef))\r
+ {\r
+ if(SourceDid->DspDidInfoRef->DspDidFixedLength == TRUE)\r
+ {\r
+ DidLength = SourceDid->DspDidSize;\r
+ }\r
+ else\r
+ {\r
+ if( SourceDid->DspDidReadDataLengthFnc != NULL)\r
+ {\r
+ SourceDid->DspDidReadDataLengthFnc(&DidLength);\r
+ }\r
+ }\r
+ if(DidLength != 0)\r
+ {\r
+ if((pduRxData->SduDataPtr[SID_AND_ALFID_LEN6 + i*SID_AND_ALFID_LEN4] != 0) &&\r
+ (pduRxData->SduDataPtr[SID_AND_ALFID_LEN7 + i*SID_AND_ALFID_LEN4] != 0) &&\r
+ (((uint16)pduRxData->SduDataPtr[SID_AND_ALFID_LEN6 + i*SID_AND_ALFID_LEN4] + (uint16)pduRxData->SduDataPtr[SID_AND_ALFID_LEN7 + i*SID_AND_ALFID_LEN4] - 1) <= DidLength))\r
+ {\r
+ DDid->DDDSource[i + SourceLength].formatOrPosition = pduRxData->SduDataPtr[SID_AND_ALFID_LEN6 + i*SID_AND_ALFID_LEN4];\r
+ DDid->DDDSource[i + SourceLength].Size = pduRxData->SduDataPtr[SID_AND_ALFID_LEN7 + i*SID_AND_ALFID_LEN4];\r
+ DDid->DDDSource[i + SourceLength].SourceAddressOrDid = SourceDid->DspDidIdentifier;\r
+ DDid->DDDSource[i + SourceLength].DDDTpyeID = DCM_DDD_SOURCE_DID;\r
+ }\r
+ else\r
+ {\r
+ /*UDS_REQ_0x2C_6*/\r
+ responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+ }\r
+ \r
+ }\r
+ else\r
+ {\r
+ /*UDS_REQ_0x2C_14*/\r
+ responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ responseCode = DCM_E_SECUTITYACCESSDENIED;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ /*UDS_REQ_0x2C_19,DCM726*/\r
+ responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ /*DCM725*/\r
+ responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+ }\r
+ }\r
+ }\r
+ else\r
+ {\r
+ /*UDS_REQ_0x2C_13*/\r
+ responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ /*UDS_REQ_0x2C_11*/\r
+ responseCode = DCM_E_INCORRECTMESSAGELENGTHORINVALIDFORMAT;\r
+ }\r
+ if(responseCode == DCM_E_POSITIVERESPONSE)\r
+ {\r
+ DDid->DynamicallyDid = DDIdentifier;\r
+ pduTxData->SduDataPtr[1] = DCM_DDD_SUBFUNCTION_DEFINEBYDID;\r
+ }\r
+ }\r
+ if(responseCode == DCM_E_POSITIVERESPONSE)\r
+ {\r
+ pduTxData->SduDataPtr[1] = DCM_DDD_SUBFUNCTION_DEFINEBYDID;\r
+ }\r
+ \r
+ return responseCode;\r
+}\r
+\r
+static Dcm_NegativeResponseCodeType dynamicallyDefineDataIdentifierbyAddress(uint16 DDIdentifier,const PduInfoType *pduRxData,PduInfoType *pduTxData)\r
+{\r
+ uint16 numNewDefinitions;\r
+ uint16 numEarlierDefinitions = 0;\r
+ Dcm_DspDDDType *DDid = NULL;\r
+ uint8 Num = 0;\r
+ uint8 definitionIndex;\r
+ Dcm_NegativeResponseCodeType diagResponseCode = DCM_E_POSITIVERESPONSE;\r
+ uint8 sizeFormat;\r
+ uint8 addressFormat;\r
+ uint32 memoryAddress = 0;\r
+ uint32 length = 0;\r
+ uint8 i;\r
+ uint8 memoryIdentifier = 0; /* Should be 0 if DcmDspUseMemoryId == FALSE */\r
+ uint8 addressOffset;\r
+ \r
+ if(FALSE == LookupDDD(DDIdentifier, (const Dcm_DspDDDType **)&DDid))\r
+ {\r
+ while((Num < DCM_MAX_DDD_NUMBER) && (dspDDD[Num].DynamicallyDid != 0 ))\r
+ {\r
+ Num++;\r
+ }\r
+ if(Num >= DCM_MAX_DDD_NUMBER)\r
+ {\r
+ diagResponseCode = DCM_E_REQUESTOUTOFRANGE;\r
+ }\r
+ else\r
+ {\r
+ DDid = &dspDDD[Num];\r
+ }\r
+ }\r
+ else\r
+ {\r
+ while((numEarlierDefinitions < DCM_MAX_DDDSOURCE_NUMBER) && (DDid->DDDSource[numEarlierDefinitions].formatOrPosition != 0 ))\r
+ {\r
+ numEarlierDefinitions++;\r
+ }\r
+ if(numEarlierDefinitions >= DCM_MAX_DDDSOURCE_NUMBER)\r
+ {\r
+ diagResponseCode = DCM_E_REQUESTOUTOFRANGE;\r
+ }\r
+ }\r
+\r
+ if( diagResponseCode == DCM_E_POSITIVERESPONSE )\r
+ {\r
+ if( pduRxData->SduLength > DYNDEF_ALFID_INDEX )\r
+ {\r
+ sizeFormat = ((uint8)(pduRxData->SduDataPtr[DYNDEF_ALFID_INDEX] & DCM_FORMAT_HIGH_MASK)) >> 4; /*@req UDS_REQ_0x23_1 & UDS_REQ_0x23_5*/;\r
+ addressFormat = ((uint8)(pduRxData->SduDataPtr[DYNDEF_ALFID_INDEX])) & DCM_FORMAT_LOW_MASK; /*@req UDS_REQ_0x23_1 & UDS_REQ_0x23_5*/;\r
+ if((addressFormat != 0) && (sizeFormat != 0))\r
+ {\r
+ numNewDefinitions = (pduRxData->SduLength - (SID_LEN + SF_LEN + DDDDI_LEN + ALFID_LEN) ) / (sizeFormat + addressFormat);\r
+ if( (numNewDefinitions != 0) &&\r
+ ((SID_LEN + SF_LEN + DDDDI_LEN + ALFID_LEN + numNewDefinitions * (sizeFormat + addressFormat)) == pduRxData->SduLength) )\r
+ {\r
+ if( (numEarlierDefinitions+numNewDefinitions) <= DCM_MAX_DDDSOURCE_NUMBER )\r
+ {\r
+ for( definitionIndex = 0; (definitionIndex < numNewDefinitions) && (diagResponseCode == DCM_E_POSITIVERESPONSE); definitionIndex++ )\r
+ {\r
+\r
+ if( TRUE == DCM_Config.Dsp->DspMemory->DcmDspUseMemoryId ) {\r
+ memoryIdentifier = pduRxData->SduDataPtr[DYNDEF_ADDRESS_START_INDEX + definitionIndex * (sizeFormat + addressFormat)];\r
+ addressOffset = 1;\r
+ }\r
+ else {\r
+ addressOffset = 0;\r
+ }\r
+\r
+ /* Parse address */\r
+ memoryAddress = 0;\r
+ for(i = addressOffset; i < addressFormat; i++)\r
+ {\r
+ memoryAddress <<= 8;\r
+ memoryAddress += (uint32)(pduRxData->SduDataPtr[DYNDEF_ADDRESS_START_INDEX + definitionIndex * (sizeFormat + addressFormat) + i]);\r
+ }\r
+\r
+ /* Parse size */\r
+ length = 0;\r
+ for(i = 0; i < sizeFormat; i++)\r
+ {\r
+ length <<= 8;\r
+ length += (uint32)(pduRxData->SduDataPtr[DYNDEF_ADDRESS_START_INDEX + definitionIndex * (sizeFormat + addressFormat) + addressFormat + i]);\r
+ }\r
+\r
+ diagResponseCode = checkAddressRange(DCM_READ_MEMORY, memoryIdentifier, memoryAddress, length);\r
+ if( DCM_E_POSITIVERESPONSE == diagResponseCode )\r
+ {\r
+ DDid->DDDSource[definitionIndex + numEarlierDefinitions].formatOrPosition = pduRxData->SduDataPtr[DYNDEF_ALFID_INDEX];\r
+ DDid->DDDSource[definitionIndex + numEarlierDefinitions].memoryIdentifier = memoryIdentifier;\r
+ DDid->DDDSource[definitionIndex + numEarlierDefinitions].SourceAddressOrDid = memoryAddress;\r
+ DDid->DDDSource[definitionIndex + numEarlierDefinitions].Size = length;\r
+ DDid->DDDSource[definitionIndex + numEarlierDefinitions].DDDTpyeID = DCM_DDD_SOURCE_ADDRESS;\r
+ }\r
+ }\r
+ if(diagResponseCode == DCM_E_POSITIVERESPONSE)\r
+ {\r
+ DDid->DynamicallyDid = DDIdentifier;\r
+ }\r
+ else\r
+ {\r
+ for( definitionIndex = 0; (definitionIndex < numNewDefinitions); definitionIndex++ )\r
+ {\r
+ DDid->DDDSource[definitionIndex + numEarlierDefinitions].formatOrPosition = 0x00;\r
+ DDid->DDDSource[definitionIndex + numEarlierDefinitions].memoryIdentifier = 0x00;\r
+ DDid->DDDSource[definitionIndex + numEarlierDefinitions].SourceAddressOrDid = 0x00000000;\r
+ DDid->DDDSource[definitionIndex + numEarlierDefinitions].Size = 0x0000;\r
+ DDid->DDDSource[definitionIndex + numEarlierDefinitions].DDDTpyeID = DCM_DDD_SOURCE_DEFAULT;\r
+ }\r
+ }\r
+ }\r
+ else\r
+ {\r
+ diagResponseCode = DCM_E_REQUESTOUTOFRANGE;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ diagResponseCode = DCM_E_INCORRECTMESSAGELENGTHORINVALIDFORMAT;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ diagResponseCode = DCM_E_REQUESTOUTOFRANGE; /*UDS_REQ_0x23_10*/\r
+ }\r
+ }\r
+ else\r
+ {\r
+ diagResponseCode = DCM_E_INCORRECTMESSAGELENGTHORINVALIDFORMAT;\r
+ }\r
+ }\r
+\r
+\r
+ if(diagResponseCode == DCM_E_POSITIVERESPONSE)\r
+ {\r
+ pduTxData->SduDataPtr[SF_INDEX] = DCM_DDD_SUBFUNCTION_DEFINEBYADDRESS;\r
+ }\r
+ \r
+ return diagResponseCode;\r
+}\r
+\r
+\r
+/*\r
+ DESCRIPTION:\r
+ UDS Service 0x2c - Clear dynamically Did\r
+*/\r
+static Dcm_NegativeResponseCodeType CleardynamicallyDid(uint16 DDIdentifier,const PduInfoType *pduRxData, PduInfoType * pduTxData)\r
+{\r
+ /*UDS_REQ_0x2C_5*/\r
+ sint8 i, j;\r
+ uint8 position;\r
+ Dcm_DspDDDType *DDid = NULL;\r
+ Dcm_NegativeResponseCodeType responseCode = DCM_E_POSITIVERESPONSE;\r
+ \r
+ if(pduRxData->SduLength == 4)\r
+ {\r
+ if(TRUE == LookupDDD(DDIdentifier, (const Dcm_DspDDDType **)&DDid))\r
+ {\r
+ \r
+ if((checkPeriodicIdentifierBuffer(pduRxData->SduDataPtr[3], dspPDidRef.PDidNr, &position) == TRUE)&&(pduRxData->SduDataPtr[2] == 0xF2))\r
+ {\r
+ /*UDS_REQ_0x2C_9*/\r
+ responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+ }\r
+ else\r
+ {\r
+ memset(DDid, 0, sizeof(Dcm_DspDDDType));\r
+ for(i = DCM_MAX_DDD_NUMBER - 1;i >= 0 ;i--) { /* find the first DDDid from bottom */\r
+ if (0 != dspDDD[i].DynamicallyDid) {\r
+ for (j = 0; j <DCM_MAX_DDD_NUMBER; j++) { /* find the first empty slot from top */\r
+ if (j >= i) {\r
+ /* Rearrange finished */\r
+ pduTxData->SduDataPtr[1] = DCM_DDD_SUBFUNCTION_CLEAR;\r
+ pduTxData->SduLength = 2;\r
+ return responseCode;\r
+ }\r
+ else if (0 == dspDDD[j].DynamicallyDid) { /* find, exchange */\r
+ memcpy(&dspDDD[j], &dspDDD[i], sizeof(Dcm_DspDDDType));\r
+ memset(&dspDDD[i], 0, sizeof(Dcm_DspDDDType));\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+ else{\r
+ responseCode = DCM_E_REQUESTOUTOFRANGE; /* DDDid not found */\r
+ }\r
+ }\r
+ else if (pduRxData->SduDataPtr[1] == 0x03 && pduRxData->SduLength == 2){\r
+ /* clear all */\r
+ memset(dspDDD, 0, (sizeof(Dcm_DspDDDType) * DCM_MAX_DDD_NUMBER));\r
+ }\r
+ else\r
+ {\r
+ responseCode = DCM_E_INCORRECTMESSAGELENGTHORINVALIDFORMAT;\r
+ }\r
+ if(responseCode == DCM_E_POSITIVERESPONSE)\r
+ {\r
+ pduTxData->SduDataPtr[1] = DCM_DDD_SUBFUNCTION_CLEAR;\r
+ pduTxData->SduLength = 2;\r
+ }\r
+ \r
+ return responseCode;\r
+}\r
+\r
+void DspDynamicallyDefineDataIdentifier(const PduInfoType *pduRxData,PduInfoType *pduTxData)\r
+{\r
+ /*UDS_REQ_0x2C_1,DCM 259*/\r
+ uint16 i;\r
+ uint8 Position;\r
+ boolean PeriodicdUse = FALSE;\r
+ Dcm_NegativeResponseCodeType responseCode = DCM_E_POSITIVERESPONSE;\r
+ uint16 DDIdentifier = ((((uint16)pduRxData->SduDataPtr[2]) << 8) & DCM_DID_HIGH_MASK) + (pduRxData->SduDataPtr[3] & DCM_DID_LOW_MASK);\r
+ if(pduRxData->SduLength > 2)\r
+ {\r
+ /* Check if DDID equals 0xF2 or 0xF3 */\r
+ if((pduRxData->SduDataPtr[2] & 0xF2) == 0xF2)\r
+ {\r
+ switch(pduRxData->SduDataPtr[1]) /*UDS_REQ_0x2C_2,DCM 646*/\r
+ {\r
+ case DCM_DDD_SUBFUNCTION_DEFINEBYDID:\r
+ responseCode = dynamicallyDefineDataIdentifierbyDid(DDIdentifier,pduRxData,pduTxData);\r
+ break;\r
+ case DCM_DDD_SUBFUNCTION_DEFINEBYADDRESS:\r
+ responseCode = dynamicallyDefineDataIdentifierbyAddress(DDIdentifier,pduRxData,pduTxData);\r
+ break;\r
+ case DCM_DDD_SUBFUNCTION_CLEAR:\r
+ responseCode = CleardynamicallyDid(DDIdentifier,pduRxData,pduTxData);\r
+ break;\r
+ default:\r
+ responseCode = DCM_E_SUBFUNCTIONNOTSUPPORTED;\r
+ /*UDS_REQ_0x2C_10*/\r
+ break; \r
+ }\r
+ }\r
+ else\r
+ {\r
+ responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+ }\r
+ if(responseCode == DCM_E_POSITIVERESPONSE)\r
+ {\r
+ pduTxData->SduDataPtr[2] = pduRxData->SduDataPtr[2];\r
+ pduTxData->SduDataPtr[3] = pduRxData->SduDataPtr[3];\r
+ pduTxData->SduLength = 4;\r
+ }\r
+ }\r
+ else if((pduRxData->SduLength == 2)&&(pduRxData->SduDataPtr[1] == DCM_DDD_SUBFUNCTION_CLEAR))\r
+ {\r
+ /*UDS_REQ_0x2C_7*/\r
+ for(i = 0;i < DCM_MAX_DDD_NUMBER;i++)\r
+ {\r
+ if(checkPeriodicIdentifierBuffer((uint8)(dspDDD[i].DynamicallyDid & DCM_DID_LOW_MASK),dspPDidRef.PDidNr,&Position) == TRUE)\r
+ {\r
+ PeriodicdUse = TRUE;\r
+ }\r
+ }\r
+ if(PeriodicdUse == FALSE)\r
+ {\r
+ memset(dspDDD,0,sizeof(dspDDD));\r
+ pduTxData->SduDataPtr[1] = DCM_DDD_SUBFUNCTION_CLEAR;\r
+ pduTxData->SduLength = 2;\r
+ }\r
+ else\r
+ {\r
+ responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ /*UDS_REQ_0x2C_11*/\r
+ responseCode = DCM_E_INCORRECTMESSAGELENGTHORINVALIDFORMAT;\r
+ }\r
+ DsdDspProcessingDone(responseCode);\r
+}\r
+\r
+static Dcm_NegativeResponseCodeType DspIOControlReturnControlToECU(const Dcm_DspDidType *DidPtr,const PduInfoType *pduRxData,PduInfoType *pduTxData)\r
+{\r
+ Dcm_NegativeResponseCodeType responseCode = DCM_E_POSITIVERESPONSE;\r
+ if(pduRxData->SduLength > 4)\r
+ {\r
+ if(DidPtr->DspDidInfoRef->DspDidAccess.DspDidControl != NULL)\r
+ {\r
+ if(((DidPtr->DspDidInfoRef->DspDidAccess.DspDidControl->DspDidReturnControlToEcu->DspDidControlOptionRecordSize + 7) >> 3) == (pduRxData->SduLength - 4))\r
+ {\r
+ if(DidPtr->DspDidReturnControlToEcuFnc != NULL)\r
+ {\r
+ DidPtr->DspDidReturnControlToEcuFnc(NULL,&pduRxData->SduDataPtr[4],&pduTxData->SduDataPtr[4],&responseCode);\r
+\r
+ }\r
+ else\r
+ {\r
+ responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ if(DidPtr->DspDidReturnControlToEcuFnc != NULL)\r
+ {\r
+\r
+ if(DidPtr->DspDidControlRecordSize != NULL)\r
+ {\r
+ DidPtr->DspDidReturnControlToEcuFnc(NULL,NULL,&pduTxData->SduDataPtr[4],&responseCode);\r
+ pduTxData->SduLength = DidPtr->DspDidInfoRef->DspDidAccess.DspDidControl->DspDidReturnControlToEcu->DspDidControlStatusRecordSize + 4;\r
+ }\r
+ else\r
+ {\r
+ responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+ }\r
+ }\r
+ if(responseCode == DCM_E_POSITIVERESPONSE)\r
+ {\r
+ pduTxData->SduLength = DidPtr->DspDidInfoRef->DspDidAccess.DspDidControl->DspDidReturnControlToEcu->DspDidControlStatusRecordSize + 4;\r
+ pduTxData->SduDataPtr[3] = DCM_RETURN_CONTROL_TO_ECU;\r
+ }\r
+ \r
+ return responseCode;\r
+}\r
+\r
+static Dcm_NegativeResponseCodeType DspIOControlResetToDefault(const Dcm_DspDidType *DidPtr,const PduInfoType *pduRxData,PduInfoType *pduTxData)\r
+{\r
+ Dcm_NegativeResponseCodeType responseCode = DCM_E_POSITIVERESPONSE;\r
+ if(pduRxData->SduLength > 4)\r
+ {\r
+ if(DidPtr->DspDidInfoRef->DspDidAccess.DspDidControl != NULL)\r
+ {\r
+ if(((DidPtr->DspDidInfoRef->DspDidAccess.DspDidControl->DspDidResetToDefault->DspDidControlOptionRecordSize + 7) >> 3) == (pduRxData->SduLength - 4))\r
+ {\r
+ if(DidPtr->DspDidReturnControlToEcuFnc != NULL)\r
+ {\r
+ DidPtr->DspDidResetToDefaultFnc(NULL,&pduRxData->SduDataPtr[4],&pduTxData->SduDataPtr[4],&responseCode);\r
+ }\r
+ else\r
+ {\r
+ responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ if(DidPtr->DspDidResetToDefaultFnc != NULL)\r
+ {\r
+\r
+ if(DidPtr->DspDidControlRecordSize != NULL)\r
+ {\r
+ DidPtr->DspDidResetToDefaultFnc(NULL,NULL,&pduTxData->SduDataPtr[4],&responseCode);\r
+ pduTxData->SduLength = DidPtr->DspDidInfoRef->DspDidAccess.DspDidControl->DspDidResetToDefault->DspDidControlStatusRecordSize + 4;\r
+ }\r
+ else\r
+ {\r
+ responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+ }\r
+ }\r
+ if(responseCode == DCM_E_POSITIVERESPONSE)\r
+ {\r
+ pduTxData->SduLength = DidPtr->DspDidInfoRef->DspDidAccess.DspDidControl->DspDidResetToDefault->DspDidControlStatusRecordSize+4;\r
+ pduTxData->SduDataPtr[3] = DCM_RESET_TO_DEFAULT;\r
+ }\r
+ return responseCode;\r
+}\r
+/*\r
+ DESCRIPTION:\r
+ UDS Service 0x2F - IOControl Freeze Current State\r
+*/\r
+static Dcm_NegativeResponseCodeType DspIOControlFreezeCurrentState(const Dcm_DspDidType *DidPtr,const PduInfoType *pduRxData,PduInfoType *pduTxData)\r
+{\r
+ Dcm_NegativeResponseCodeType responseCode = DCM_E_POSITIVERESPONSE;\r
+ if(pduRxData->SduLength > 4)\r
+ {\r
+ if(DidPtr->DspDidInfoRef->DspDidAccess.DspDidControl != NULL)\r
+ {\r
+ if(((DidPtr->DspDidInfoRef->DspDidAccess.DspDidControl->DspDidFreezeCurrentState->DspDidControlOptionRecordSize + 7) >> 3) == (pduRxData->SduLength - 4))\r
+ {\r
+ if(DidPtr->DspDidFreezeCurrentStateFnc != NULL)\r
+ {\r
+ DidPtr->DspDidFreezeCurrentStateFnc(NULL,&pduRxData->SduDataPtr[4],&pduTxData->SduDataPtr[4],&responseCode);\r
+ }\r
+ else\r
+ {\r
+ responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ if(DidPtr->DspDidFreezeCurrentStateFnc != NULL)\r
+ {\r
+\r
+ if(DidPtr->DspDidControlRecordSize != 0)\r
+ {\r
+ DidPtr->DspDidFreezeCurrentStateFnc(NULL,NULL,&pduTxData->SduDataPtr[4],&responseCode);\r
+ pduTxData->SduLength = DidPtr->DspDidInfoRef->DspDidAccess.DspDidControl->DspDidFreezeCurrentState->DspDidControlStatusRecordSize + 4;\r
+ }\r
+ else\r
+ {\r
+ responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+ }\r
+ }\r
+ if(responseCode == DCM_E_POSITIVERESPONSE)\r
+ {\r
+ pduTxData->SduLength = DidPtr->DspDidInfoRef->DspDidAccess.DspDidControl->DspDidFreezeCurrentState->DspDidControlStatusRecordSize + 4;\r
+ pduTxData->SduDataPtr[3] = DCM_FREEZE_CURRENT_STATE;\r
+ }\r
+ \r
+ return responseCode;\r
+}\r
+\r
+static Dcm_NegativeResponseCodeType DspIOControlShortTeamAdjustment(const Dcm_DspDidType *DidPtr,const PduInfoType *pduRxData,PduInfoType *pduTxData)\r
+{\r
+ Dcm_NegativeResponseCodeType responseCode = DCM_E_POSITIVERESPONSE;\r
+ uint8 didControlOptionRecordSize = DidPtr->DspDidInfoRef->DspDidAccess.DspDidControl->DspDidShortTermAdjustment->DspDidControlOptionRecordSize;\r
+ if(pduRxData->SduLength > 4)\r
+ {\r
+ if(DidPtr->DspDidInfoRef->DspDidAccess.DspDidControl != NULL)\r
+ {\r
+ if(((((DidPtr->DspDidInfoRef->DspDidAccess.DspDidControl->DspDidShortTermAdjustment->DspDidControlEnableMaskRecordSize + 7)) >> 3) + (didControlOptionRecordSize)) == (pduRxData->SduLength - 4))\r
+ {\r
+ if(DidPtr->DspDidShortTermAdjustmentFnc != NULL)\r
+ {\r
+ DidPtr->DspDidShortTermAdjustmentFnc(&pduRxData->SduDataPtr[4],&pduRxData->SduDataPtr[4 + didControlOptionRecordSize],&pduTxData->SduDataPtr[4],&responseCode);\r
+ }\r
+ else\r
+ {\r
+ responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+ }\r
+ }\r
+ else if((didControlOptionRecordSize) == (pduRxData->SduLength - 4))\r
+ {\r
+ if(DidPtr->DspDidShortTermAdjustmentFnc != NULL)\r
+ {\r
+ DidPtr->DspDidShortTermAdjustmentFnc(&pduRxData->SduDataPtr[4],NULL,&pduTxData->SduDataPtr[4],&responseCode);\r
+ }\r
+ else\r
+ {\r
+ responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+ }\r
+ if(responseCode == DCM_E_POSITIVERESPONSE)\r
+ {\r
+ pduTxData->SduLength = DidPtr->DspDidInfoRef->DspDidAccess.DspDidControl->DspDidShortTermAdjustment->DspDidControlStatusRecordSize + 4;\r
+ pduTxData->SduDataPtr[3] = DCM_SHORT_TERM_ADJUSTMENT;\r
+ }\r
+ \r
+ return responseCode;\r
+}\r
+\r
+void DspIOControlByDataIdentifier(const PduInfoType *pduRxData,PduInfoType *pduTxData)\r
+{\r
+ uint16 didNr;\r
+ const Dcm_DspDidType *DidPtr = NULL;\r
+ Dcm_NegativeResponseCodeType responseCode = DCM_E_POSITIVERESPONSE;\r
+ didNr = (pduRxData->SduDataPtr[1] << 8 & DCM_DID_HIGH_MASK) + (pduRxData->SduDataPtr[2] & DCM_DID_LOW_MASK);\r
+ if(pduRxData->SduLength > 3)\r
+ {\r
+ if(TRUE == lookupDid(didNr, &DidPtr))\r
+ {\r
+ if(FALSE == DidPtr->DspDidUsePort)\r
+ {\r
+ if(NULL != DidPtr->DspDidInfoRef->DspDidAccess.DspDidControl)\r
+ {\r
+ if(TRUE == DspCheckSessionLevel(DidPtr->DspDidInfoRef->DspDidAccess.DspDidControl->DspDidControlSessionRef))\r
+ {\r
+ if(TRUE == DspCheckSecurityLevel(DidPtr->DspDidInfoRef->DspDidAccess.DspDidControl->DspDidControlSecurityLevelRef))\r
+ {\r
+ switch(pduRxData->SduDataPtr[3])\r
+ {\r
+ case DCM_RETURN_CONTROL_TO_ECU:\r
+ responseCode = DspIOControlReturnControlToECU(DidPtr,pduRxData,pduTxData);\r
+ break;\r
+ case DCM_RESET_TO_DEFAULT:\r
+ responseCode = DspIOControlResetToDefault(DidPtr,pduRxData,pduTxData); \r
+ break;\r
+ case DCM_FREEZE_CURRENT_STATE:\r
+ responseCode = DspIOControlFreezeCurrentState(DidPtr,pduRxData,pduTxData);\r
+ break;\r
+ case DCM_SHORT_TERM_ADJUSTMENT:\r
+ responseCode = DspIOControlShortTeamAdjustment(DidPtr,pduRxData,pduTxData);\r
+ break;\r
+ default:\r
+ responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+ break;\r
+ \r
+ }\r
+ }\r
+ else\r
+ {\r
+ responseCode = DCM_E_SECUTITYACCESSDENIED;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ /* if UsePort == True, NRC 0x10 */\r
+ responseCode = DCM_E_GENERALREJECT;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ responseCode = DCM_E_INCORRECTMESSAGELENGTHORINVALIDFORMAT;\r
+ }\r
+ if(responseCode == DCM_E_POSITIVERESPONSE)\r
+ {\r
+ pduTxData->SduDataPtr[1] = pduRxData->SduDataPtr[1];\r
+ pduTxData->SduDataPtr[2] = pduRxData->SduDataPtr[2];\r
+ }\r
+ DsdDspProcessingDone(responseCode);\r
+}\r