* for more details.\r
* -------------------------------- Arctic Core ------------------------------*/\r
\r
+//lint -esym(754, SID) //Structure member SID not used in udsReadDtcInfoSub_0x01_0x07_0x11_0x12() and udsReadDtcInfoSub_0x02_0x0A_0x0F_0x13_0x15()\r
\r
\r
+/*\r
+ * General requirements\r
+ */\r
+/** @req DCM273 */ /** @req DCM272 */\r
+/** @req DCM039 */ /** @req DCM038 */ /** @req DCM269 */\r
+/** @req DCM271 */ /** @req DCM274 */ /** @req DCM275 */ /** @req DCM424 */\r
+/** @req DCM007 */\r
#include <string.h>\r
#include "Dcm.h"\r
#include "Dcm_Internal.h"\r
#include "Dem.h"\r
-#include "Det.h"\r
#include "MemMap.h"\r
+#if defined(USE_MCU)\r
#include "Mcu.h"\r
-\r
-#define ZERO_SUB_FUNCTION 0x00\r
+#endif\r
\r
/*\r
* Macros\r
*/\r
-#define BYTES_TO_DTC(hb, mb, lb) (((hb) << 16) | ((mb) << 8) | (lb))\r
-#define DTC_HIGH_BYTE(dtc) (((dtc)>> 16) & 0xFF)\r
-#define DTC_MID_BYTE(dtc) (((dtc)>> 8) & 0xFF)\r
-#define DTC_LOW_BYTE(dtc) ((dtc) & 0xFF)\r
+#define ZERO_SUB_FUNCTION 0x00\r
+#define DCM_FORMAT_LOW_MASK 0x0F\r
+#define DCM_FORMAT_HIGH_MASK 0xF0\r
+#define DCM_MEMORY_ADDRESS_MASK 0xFFFFFF\r
+#define DCM_DID_HIGH_MASK 0xFF00 \r
+#define DCM_DID_LOW_MASK 0xFF\r
+#define DCM_PERODICDID_HIHG_MASK 0xF200\r
+#define SID_AND_ALFID_LEN2 0x2\r
+#define SID_AND_ALFID_LEN4 0x4\r
+#define SID_AND_ALFID_LEN5 0x5\r
+#define SID_AND_ALFID_LEN6 0x6\r
+#define SID_AND_ALFID_LEN7 0x7\r
+\r
+#define BYTES_TO_DTC(hb, mb, lb) (((uint32)(hb) << 16) | ((uint32)(mb) << 8) | (uint32)(lb))\r
+#define DTC_HIGH_BYTE(dtc) (((uint32)(dtc) >> 16) & 0xFFu)\r
+#define DTC_MID_BYTE(dtc) (((uint32)(dtc) >> 8) & 0xFFu)\r
+#define DTC_LOW_BYTE(dtc) ((uint32)(dtc) & 0xFFu)\r
\r
\r
typedef struct {\r
} DspUdsEcuResetDataType;\r
\r
static DspUdsEcuResetDataType dspUdsEcuResetData;\r
-\r
+static boolean dspWritePending;\r
\r
typedef struct {\r
boolean reqInProgress;\r
\r
static DspUdsSecurityAccessDataType dspUdsSecurityAccesData;\r
\r
+typedef enum{\r
+ DCM_MEMORY_UNUSED,\r
+ DCM_MEMORY_READ,\r
+ DCM_MEMORY_WRITE,\r
+ DCM_MEMORY_FAILED \r
+}Dcm_DspMemoryStateType;\r
+Dcm_DspMemoryStateType dspMemoryState;\r
+\r
+typedef enum{\r
+ DCM_DDD_SOURCE_DEFAULT,\r
+ DCM_DDD_SOURCE_DID,\r
+ DCM_DDD_SOURCE_ADDRESS\r
+}Dcm_DspDDDTpyeID;\r
+\r
+typedef struct{\r
+ uint32 PDidTxCounter;\r
+ uint32 PDidTxCounterNumber;\r
+ uint8 PeriodicDid;\r
+}Dcm_pDidType;/* a type to save the periodic DID and cycle */\r
+\r
+typedef struct{\r
+ Dcm_pDidType dspPDid[DCM_LIMITNUMBER_PERIODDATA]; /*a buffer to save the periodic DID and cycle */\r
+ uint8 PDidNr; /* note the number of periodic DID is used */\r
+}Dsp_pDidRefType;\r
+\r
+Dsp_pDidRefType dspPDidRef; \r
+\r
+typedef struct{\r
+ uint8 formatOrPosition; /*note the formate of address and size*/\r
+ uint32 SourceAddressOrDid; /*note the memory address */\r
+ uint16 Size; /*note the memory size */\r
+ Dcm_DspDDDTpyeID DDDTpyeID;\r
+}Dcm_DspDDDSourceType;\r
+\r
+typedef struct{\r
+ uint16 DynamicallyDid;\r
+ Dcm_DspDDDSourceType DDDSource[DCM_MAX_DDDSOURCE_NUMBER];\r
+}\r
+Dcm_DspDDDType;\r
+\r
+Dcm_DspDDDType dspDDD[DCM_MAX_DDD_NUMBER];\r
+\r
+\r
+/*\r
+ * * static Function\r
+ */\r
+\r
+static boolean lookupReadMemory(uint32 memoryAddress,\r
+ uint8 memoryAddressFormat,\r
+ uint32 memorySize,\r
+ const Dcm_DspMemoryIdInfo **MemoryPtr);\r
+\r
+static boolean LookupDDD(uint16 didNr, const Dcm_DspDDDType **DDid);\r
+\r
+static boolean checkWriteMemoryByAddress(boolean useId,\r
+ uint32 memoryAddress,\r
+ uint8 memoryAddressFormat,\r
+ uint32 memorySize,\r
+ const Dcm_DspMemoryIdInfo *dspMemory);\r
+\r
+\r
+/*\r
+* end \r
+*/\r
\r
void DspInit(void)\r
{\r
dspUdsSecurityAccesData.reqInProgress = FALSE;\r
dspUdsEcuResetData.resetPending = FALSE;\r
+\r
+ dspWritePending = FALSE;\r
+ dspMemoryState=DCM_MEMORY_UNUSED;\r
+ /* clear periodic send buffer */\r
+ memset(&dspPDidRef,0,sizeof(dspPDidRef));\r
+ /* clear dynamically Did buffer */\r
+ memset(&dspDDD[0],0,sizeof(dspDDD)); \r
}\r
\r
+void DspMemoryMainFunction(void)\r
+{\r
+ Dcm_ReturnWriteMemoryType WriteRet;\r
+ Dcm_ReturnReadMemoryType ReadRet;\r
+ switch(dspMemoryState)\r
+ {\r
+ case DCM_MEMORY_UNUSED:\r
+ break;\r
+ case DCM_MEMORY_READ:\r
+ ReadRet = Dcm_ReadMemory(DCM_PENDING,0,0,0,0);\r
+ if(ReadRet == DCM_READ_OK)/*asynchronous writing is ok*/\r
+ {\r
+ DsdDspProcessingDone(DCM_E_POSITIVERESPONSE);\r
+ dspMemoryState = DCM_MEMORY_UNUSED;\r
+ }\r
+ if(ReadRet == DCM_READ_FAILED)\r
+ {\r
+ dspMemoryState = DCM_MEMORY_FAILED;\r
+ }\r
+ break;\r
+ case DCM_MEMORY_WRITE:\r
+ WriteRet = Dcm_WriteMemory(DCM_PENDING,0,0,0,0);\r
+ if(WriteRet == DCM_WRITE_OK)/*asynchronous writing is ok*/\r
+ {\r
+ DsdDspProcessingDone(DCM_E_POSITIVERESPONSE);\r
+ dspMemoryState = DCM_MEMORY_UNUSED;\r
+ }\r
+ if(WriteRet == DCM_WRITE_FAILED)\r
+ {\r
+ dspMemoryState = DCM_MEMORY_FAILED;\r
+ }\r
+ break;\r
+ case DCM_MEMORY_FAILED:\r
+ DsdDspProcessingDone(DCM_E_GENERALPROGRAMMINGFAILURE);\r
+ dspMemoryState = DCM_MEMORY_UNUSED;\r
+ break;\r
+ \r
+ }\r
+}\r
+void DspPeriodicDIDMainFunction()\r
+{\r
+ uint8 i;\r
+ boolean sentResponseThisLoop = FALSE;\r
\r
+ for(i = 0;i < dspPDidRef.PDidNr; i++)\r
+ {\r
+ if(dspPDidRef.dspPDid[i].PDidTxCounterNumber > dspPDidRef.dspPDid[i].PDidTxCounter)\r
+ {\r
+ dspPDidRef.dspPDid[i].PDidTxCounter++;\r
+ }\r
+ else\r
+ {\r
+ if( sentResponseThisLoop == FALSE ) {\r
+ if (E_OK == DslInternal_ResponseOnOneDataByPeriodicId(dspPDidRef.dspPDid[i].PeriodicDid)){\r
+ dspPDidRef.dspPDid[i].PDidTxCounter = 0;\r
+ /*AutoSar DCM 8.10.5 */\r
+ sentResponseThisLoop = TRUE;\r
+ }\r
+ }\r
+ else {\r
+ /* Don't do anything - PDid will be sent next loop */\r
+ }\r
+ } \r
+ }\r
+}\r
void DspMain(void)\r
{\r
-\r
+ DspMemoryMainFunction();\r
+ DspPeriodicDIDMainFunction();\r
}\r
\r
\r
-boolean DspCheckSessionLevel(const Dcm_DspSessionRowType **sessionLevelRefTable)\r
+boolean DspCheckSessionLevel(Dcm_DspSessionRowType const* const* sessionLevelRefTable)\r
{\r
- boolean returnStatus = TRUE;\r
+ Std_ReturnType returnStatus;\r
+ boolean levelFound = FALSE;\r
Dcm_SesCtrlType currentSession;\r
\r
- DslGetSesCtrlType(¤tSession);\r
- while (((*sessionLevelRefTable)->DspSessionLevel != currentSession) && !(*sessionLevelRefTable)->Arc_EOL) {\r
- sessionLevelRefTable++;\r
- }\r
+ returnStatus = DslGetSesCtrlType(¤tSession);\r
+ if (returnStatus == E_OK) {\r
+ while ( ((*sessionLevelRefTable)->DspSessionLevel != currentSession) && (!(*sessionLevelRefTable)->Arc_EOL) ) {\r
+ sessionLevelRefTable++;\r
+ }\r
\r
- if ((*sessionLevelRefTable)->Arc_EOL) {\r
- returnStatus = FALSE;\r
+ if (!(*sessionLevelRefTable)->Arc_EOL) {\r
+ levelFound = TRUE;\r
+ }\r
}\r
\r
- return returnStatus;\r
+ return levelFound;\r
}\r
\r
\r
-boolean DspCheckSecurityLevel(const Dcm_DspSecurityRowType **securityLevelRefTable)\r
+boolean DspCheckSecurityLevel(Dcm_DspSecurityRowType const* const* securityLevelRefTable)\r
{\r
- boolean returnStatus = TRUE;\r
+ Std_ReturnType returnStatus;\r
+ boolean levelFound = FALSE;\r
Dcm_SecLevelType currentSecurityLevel;\r
\r
- DslGetSecurityLevel(¤tSecurityLevel);\r
- while (((*securityLevelRefTable)->DspSecurityLevel != currentSecurityLevel) && !(*securityLevelRefTable)->Arc_EOL) {\r
- securityLevelRefTable++;\r
- }\r
- if ((*securityLevelRefTable)->Arc_EOL) {\r
- returnStatus = FALSE;\r
+ returnStatus = DslGetSecurityLevel(¤tSecurityLevel);\r
+ if (returnStatus == E_OK) {\r
+ while ( ((*securityLevelRefTable)->DspSecurityLevel != currentSecurityLevel) && (!(*securityLevelRefTable)->Arc_EOL) ) {\r
+ securityLevelRefTable++;\r
+ }\r
+ if (!(*securityLevelRefTable)->Arc_EOL) {\r
+ levelFound = TRUE;\r
+ }\r
}\r
\r
- return returnStatus;\r
+ return levelFound;\r
}\r
\r
\r
-Std_ReturnType AskApplicationForSessionPermission(Dcm_SesCtrlType newSessionLevel)\r
+static Std_ReturnType askApplicationForSessionPermission(Dcm_SesCtrlType newSessionLevel)\r
{\r
Std_ReturnType returnCode = E_OK;\r
const Dcm_DslSessionControlType *sesControl = DCM_Config.Dsl->DslSessionControl;\r
Dcm_SesCtrlType currentSessionLevel;\r
Std_ReturnType result;\r
\r
- while (!sesControl->Arc_EOL && (returnCode != E_SESSION_NOT_ALLOWED)) {\r
+ while ( (!sesControl->Arc_EOL) && (returnCode != E_SESSION_NOT_ALLOWED)) {\r
if (sesControl->GetSesChgPermission != NULL) {\r
- Dcm_GetSesCtrlType(¤tSessionLevel);\r
- result = sesControl->GetSesChgPermission(currentSessionLevel ,newSessionLevel);\r
- if (result != E_OK) {\r
- returnCode = result;\r
+ result = Dcm_GetSesCtrlType(¤tSessionLevel);\r
+ if (result == E_OK) {\r
+ result = sesControl->GetSesChgPermission(currentSessionLevel ,newSessionLevel);\r
+ if (result != E_OK) {\r
+ returnCode = result;\r
+ }\r
+ } else {\r
+ returnCode = E_NOT_OK;\r
}\r
}\r
sesControl++;\r
\r
void DspUdsDiagnosticSessionControl(const PduInfoType *pduRxData, PduInfoType *pduTxData)\r
{\r
- // @req DCM250 **/\r
+ /** @req DCM250 */\r
const Dcm_DspSessionRowType *sessionRow = DCM_Config.Dsp->DspSession->DspSessionRow;\r
Dcm_SesCtrlType reqSessionType;\r
Std_ReturnType result;\r
if (pduRxData->SduLength == 2) {\r
reqSessionType = pduRxData->SduDataPtr[1];\r
// Check if type exist in session table\r
- while ((sessionRow->DspSessionLevel != reqSessionType) && !sessionRow->Arc_EOL) {\r
+ while ((sessionRow->DspSessionLevel != reqSessionType) && (!sessionRow->Arc_EOL) ) {\r
sessionRow++;\r
}\r
\r
if (!sessionRow->Arc_EOL) {\r
- result = AskApplicationForSessionPermission(reqSessionType);\r
+ result = askApplicationForSessionPermission(reqSessionType);\r
if (result == E_OK) {\r
- DslSetSesCtrlType(reqSessionType); /** @req DCM311 **/\r
+ DslSetSesCtrlType(reqSessionType); /** @req DCM311 */\r
// Create positive response\r
- /** @req DCM039.2 **/\r
pduTxData->SduDataPtr[1] = reqSessionType;\r
pduTxData->SduLength = 2;\r
- DsdDspProcessingDone(DCM_E_POSITIVERESPONSE); /** @req DCM269.2 **/\r
+ DsdDspProcessingDone(DCM_E_POSITIVERESPONSE);\r
}\r
else {\r
// TODO: Add handling of special case of E_FORCE_RCRRP (Dcm138)\r
- DsdDspProcessingDone(DCM_E_CONDITIONSNOTCORRECT); /** @req DCM308 **/\r
+ DsdDspProcessingDone(DCM_E_CONDITIONSNOTCORRECT); /** @req DCM308 */\r
}\r
}\r
else {\r
- DsdDspProcessingDone(DCM_E_SUBFUNCTIONNOTSUPPORTED); /** @req DCM307 **/\r
+ DsdDspProcessingDone(DCM_E_SUBFUNCTIONNOTSUPPORTED); /** @req DCM307 */\r
}\r
}\r
else {\r
// Wrong length\r
- DsdDspProcessingDone(DCM_E_INCORRECTMESSAGELENGTHORINVALIDFORMAT); /** @req DCM272.1 **/\r
+ DsdDspProcessingDone(DCM_E_INCORRECTMESSAGELENGTHORINVALIDFORMAT);\r
}\r
}\r
\r
\r
void DspUdsEcuReset(const PduInfoType *pduRxData, PduIdType txPduId, PduInfoType *pduTxData)\r
{\r
- // @req DCM260 **/\r
+ /** @req DCM260 */\r
uint8 reqResetType;\r
\r
if (pduRxData->SduLength == 2) {\r
dspUdsEcuResetData.resetPduId = txPduId;\r
\r
// Create positive response\r
- /** @req DCM039.1 **/\r
pduTxData->SduDataPtr[1] = reqResetType;\r
pduTxData->SduLength = 2;\r
- DsdDspProcessingDone(DCM_E_POSITIVERESPONSE); /** @req DCM269.3 **/\r
+ DsdDspProcessingDone(DCM_E_POSITIVERESPONSE);\r
break;\r
\r
default:\r
- DsdDspProcessingDone(DCM_E_SUBFUNCTIONNOTSUPPORTED); /** @req DCM273.3 **/\r
+ DsdDspProcessingDone(DCM_E_SUBFUNCTIONNOTSUPPORTED);\r
break;\r
}\r
}\r
else {\r
// Wrong length\r
- DsdDspProcessingDone(DCM_E_INCORRECTMESSAGELENGTHORINVALIDFORMAT); /** @req DCM272.3 **/\r
+ DsdDspProcessingDone(DCM_E_INCORRECTMESSAGELENGTHORINVALIDFORMAT);\r
}\r
}\r
\r
\r
void DspUdsClearDiagnosticInformation(const PduInfoType *pduRxData, PduInfoType *pduTxData)\r
{\r
+ /** @req DCM247 */\r
uint32 dtc;\r
Dem_ReturnClearDTCType result;\r
\r
if (pduRxData->SduLength == 4) {\r
dtc = BYTES_TO_DTC(pduRxData->SduDataPtr[1], pduRxData->SduDataPtr[2], pduRxData->SduDataPtr[3]);\r
\r
- result = Dem_ClearDTC(dtc, DEM_DTC_KIND_ALL_DTCS, DEM_DTC_ORIGIN_PRIMARY_MEMORY);\r
+ result = Dem_ClearDTC(dtc, DEM_DTC_KIND_ALL_DTCS, DEM_DTC_ORIGIN_PRIMARY_MEMORY); /** @req DCM005 */\r
\r
switch (result)\r
{\r
case DEM_CLEAR_OK:\r
// Create positive response\r
- /** @req DCM039.1 **/\r
pduTxData->SduLength = 1;\r
- DsdDspProcessingDone(DCM_E_POSITIVERESPONSE); /** @req DCM269.4 **/\r
+ DsdDspProcessingDone(DCM_E_POSITIVERESPONSE);\r
break;\r
\r
default:\r
}\r
else {\r
// Wrong length\r
- DsdDspProcessingDone(DCM_E_INCORRECTMESSAGELENGTHORINVALIDFORMAT); /** @req DCM272.1 **/\r
+ DsdDspProcessingDone(DCM_E_INCORRECTMESSAGELENGTHORINVALIDFORMAT);\r
}\r
}\r
\r
\r
-Dcm_NegativeResponseCodeType DspUdsReadDtcInfoSub_0x01_0x07_0x11_0x12(const PduInfoType *pduRxData, PduInfoType *pduTxData)\r
+static Dcm_NegativeResponseCodeType udsReadDtcInfoSub_0x01_0x07_0x11_0x12(const PduInfoType *pduRxData, PduInfoType *pduTxData)\r
{\r
typedef struct {\r
uint8 SID;\r
Dem_ReturnSetDTCFilterType setDtcFilterResult;\r
\r
// Setup the DTC filter\r
- switch (pduRxData->SduDataPtr[1]) /** @reg DCM293 **/\r
+ switch (pduRxData->SduDataPtr[1]) /** @req DCM293 */\r
{\r
case 0x01: // reportNumberOfDTCByStatusMask\r
setDtcFilterResult = Dem_SetDTCFilter(pduRxData->SduDataPtr[2], DEM_DTC_KIND_ALL_DTCS, DEM_DTC_ORIGIN_PRIMARY_MEMORY, DEM_FILTER_WITH_SEVERITY_NO, VALUE_IS_NOT_USED, DEM_FILTER_FOR_FDC_NO);\r
\r
default:\r
setDtcFilterResult = DEM_WRONG_FILTER;\r
-#if (DCM_DEV_ERROR_DETECT == STD_ON)\r
- Det_ReportError(MODULE_ID_DCM, 0, DCM_UDS_READ_DTC_INFO, DCM_E_UNEXPECTED_PARAM);\r
-#endif\r
break;\r
}\r
\r
if (setDtcFilterResult == DEM_FILTER_ACCEPTED) {\r
+ Std_ReturnType result;\r
+ Dem_ReturnGetNumberOfFilteredDTCType getNumerResult;\r
uint16 numberOfFilteredDtc;\r
uint8 dtcStatusMask;\r
+ //lint --e(826) PC-Lint exception - Suspicious pointer conversion\r
+ //lint --e(927) PC-Lint exception - Pointer to pointer cast\r
TxDataType *txData = (TxDataType*)pduTxData->SduDataPtr;\r
\r
- /** @reg DCM376 **/\r
- Dem_GetNumberOfFilteredDtc(&numberOfFilteredDtc);\r
- Dem_GetDTCStatusAvailabilityMask(&dtcStatusMask);\r
+ /** @req DCM376 */\r
+ getNumerResult = Dem_GetNumberOfFilteredDtc(&numberOfFilteredDtc);\r
+ if (getNumerResult == DEM_NUMBER_OK) {\r
+ result = Dem_GetDTCStatusAvailabilityMask(&dtcStatusMask);\r
+ if (result != E_OK) {\r
+ dtcStatusMask = 0;\r
+ }\r
\r
- // Create positive response (ISO 14229-1 table 251)\r
- /** @req DCM039.0x19 **/\r
- txData->reportType = pduRxData->SduDataPtr[1]; // reportType\r
- txData->dtcStatusAvailabilityMask = dtcStatusMask; // DTCStatusAvailabilityMask\r
- txData->dtcFormatIdentifier = Dem_GetTranslationType(); // DTCFormatIdentifier\r
- txData->dtcCountHighByte = (numberOfFilteredDtc >> 8); // DTCCount high byte\r
- txData->dtcCountLowByte = (numberOfFilteredDtc & 0xFF); // DTCCount low byte\r
- pduTxData->SduLength = 6;\r
+ // Create positive response (ISO 14229-1 table 251)\r
+ txData->reportType = pduRxData->SduDataPtr[1]; // reportType\r
+ txData->dtcStatusAvailabilityMask = dtcStatusMask; // DTCStatusAvailabilityMask\r
+ txData->dtcFormatIdentifier = Dem_GetTranslationType(); // DTCFormatIdentifier\r
+ txData->dtcCountHighByte = (numberOfFilteredDtc >> 8); // DTCCount high byte\r
+ txData->dtcCountLowByte = (numberOfFilteredDtc & 0xFFu); // DTCCount low byte\r
+ pduTxData->SduLength = 6;\r
+ } else {\r
+ // TODO: What to do?\r
+ responseCode = DCM_E_GENERALREJECT;\r
+ }\r
}\r
else {\r
responseCode = DCM_E_REQUESTOUTOFRANGE;\r
}\r
\r
\r
-Dcm_NegativeResponseCodeType DspUdsReadDtcInfoSub_0x02_0x0A_0x0F_0x13_0x15(const PduInfoType *pduRxData, PduInfoType *pduTxData)\r
+static Dcm_NegativeResponseCodeType udsReadDtcInfoSub_0x02_0x0A_0x0F_0x13_0x15(const PduInfoType *pduRxData, PduInfoType *pduTxData)\r
{\r
Dcm_NegativeResponseCodeType responseCode = DCM_E_POSITIVERESPONSE;\r
Dem_ReturnSetDTCFilterType setDtcFilterResult;\r
} TxDataType;\r
\r
// Setup the DTC filter\r
- switch (pduRxData->SduDataPtr[1]) /** @reg DCM378 **/\r
+ switch (pduRxData->SduDataPtr[1]) /** @req DCM378 */\r
{\r
case 0x02: // reportDTCByStatusMask\r
setDtcFilterResult = Dem_SetDTCFilter(pduRxData->SduDataPtr[2], DEM_DTC_KIND_ALL_DTCS, DEM_DTC_ORIGIN_PRIMARY_MEMORY, DEM_FILTER_WITH_SEVERITY_NO, VALUE_IS_NOT_USED, DEM_FILTER_FOR_FDC_NO);\r
\r
default:\r
setDtcFilterResult = DEM_WRONG_FILTER;\r
-#if (DCM_DEV_ERROR_DETECT == STD_ON)\r
- Det_ReportError(MODULE_ID_DCM, 0, DCM_UDS_READ_DTC_INFO, DCM_E_UNEXPECTED_PARAM);\r
-#endif\r
break;\r
}\r
\r
if (setDtcFilterResult == DEM_FILTER_ACCEPTED) {\r
uint8 dtcStatusMask;\r
+ //lint --e(826) PC-Lint exception - Suspicious pointer conversion\r
+ //lint --e(927) PC-Lint exception - Pointer to pointer cast\r
TxDataType *txData = (TxDataType*)pduTxData->SduDataPtr;\r
Dem_ReturnGetNextFilteredDTCType getNextFilteredDtcResult;\r
uint32 dtc;\r
Dem_EventStatusExtendedType dtcStatus;\r
uint16 nrOfDtcs = 0;\r
+ Std_ReturnType result;\r
\r
- /** @reg DCM377 **/\r
- Dem_GetDTCStatusAvailabilityMask(&dtcStatusMask);\r
+ /** @req DCM377 */\r
+ result = Dem_GetDTCStatusAvailabilityMask(&dtcStatusMask);\r
+ if (result != E_OK) {\r
+ dtcStatusMask = 0;\r
+ }\r
\r
// Create positive response (ISO 14229-1 table 252)\r
- /** @req DCM039.0x19 **/\r
txData->reportType = pduRxData->SduDataPtr[1];\r
txData->dtcStatusAvailabilityMask = dtcStatusMask;\r
\r
- if (dtcStatusMask != 0x00) { /** @req DCM008 **/\r
+ if (dtcStatusMask != 0x00) { /** @req DCM008 */\r
getNextFilteredDtcResult = Dem_GetNextFilteredDTC(&dtc, &dtcStatus);\r
while (getNextFilteredDtcResult == DEM_FILTERED_OK) {\r
txData->dtcAndStatusRecord[nrOfDtcs].dtcHighByte = DTC_HIGH_BYTE(dtc);\r
responseCode = DCM_E_REQUESTOUTOFRANGE;\r
}\r
}\r
- pduTxData->SduLength = 3 + nrOfDtcs * sizeof(dtcAndStatusRecordType);\r
+ pduTxData->SduLength = (PduLengthType)(3 + (nrOfDtcs * sizeof(dtcAndStatusRecordType)));\r
}\r
else {\r
responseCode = DCM_E_REQUESTOUTOFRANGE;\r
return responseCode;\r
}\r
\r
-\r
-Dcm_NegativeResponseCodeType DspUdsReadDtcInfoSub_0x08(const PduInfoType *pduRxData, PduInfoType *pduTxData)\r
+// PC-Lint (715 etc): Remove errors until function is filled.\r
+//lint -e{715, 838, 818} Symbol not referenced, responseCode not used, txData should be const\r
+static Dcm_NegativeResponseCodeType udsReadDtcInfoSub_0x08(const PduInfoType *pduRxData, PduInfoType *pduTxData)\r
{\r
Dcm_NegativeResponseCodeType responseCode = DCM_E_POSITIVERESPONSE;\r
\r
}\r
\r
\r
-Dcm_NegativeResponseCodeType DspUdsReadDtcInfoSub_0x09(const PduInfoType *pduRxData, PduInfoType *pduTxData)\r
+// PC-Lint (715 etc): Remove errors until function is filled.\r
+//lint -e{715, 838, 818} Symbol not referenced, responseCode not used, txData should be const\r
+static Dcm_NegativeResponseCodeType udsReadDtcInfoSub_0x09(const PduInfoType *pduRxData, PduInfoType *pduTxData)\r
{\r
Dcm_NegativeResponseCodeType responseCode = DCM_E_POSITIVERESPONSE;\r
\r
}\r
\r
\r
-Dcm_NegativeResponseCodeType DspUdsReadDtcInfoSub_0x06_0x10(const PduInfoType *pduRxData, PduInfoType *pduTxData)\r
+static Dcm_NegativeResponseCodeType udsReadDtcInfoSub_0x06_0x10(const PduInfoType *pduRxData, PduInfoType *pduTxData)\r
{\r
Dcm_NegativeResponseCodeType responseCode = DCM_E_POSITIVERESPONSE;\r
- Dem_DTCOriginType dtcOrigin = NULL;\r
+ Dem_DTCOriginType dtcOrigin;\r
uint8 startRecNum;\r
uint8 endRecNum;\r
\r
// Switch on sub function\r
- switch (pduRxData->SduDataPtr[1]) /** @reg DCM378 **/\r
+ switch (pduRxData->SduDataPtr[1]) /** @req DCM378 */\r
{\r
case 0x06: // reportDTCExtendedDataRecordByDTCNumber\r
dtcOrigin = DEM_DTC_ORIGIN_PRIMARY_MEMORY;\r
\r
default:\r
responseCode = DCM_E_SUBFUNCTIONNOTSUPPORTED;\r
-#if (DCM_DEV_ERROR_DETECT == STD_ON)\r
- Det_ReportError(MODULE_ID_DCM, 0, DCM_UDS_READ_DTC_INFO, DCM_E_UNEXPECTED_PARAM);\r
-#endif\r
+ dtcOrigin = 0;\r
break;\r
}\r
\r
Dem_EventStatusExtendedType statusOfDtc;\r
\r
dtc = BYTES_TO_DTC(pduRxData->SduDataPtr[2], pduRxData->SduDataPtr[3], pduRxData->SduDataPtr[4]);\r
- getStatusOfDtcResult = Dem_GetStatusOfDTC(dtc, DEM_DTC_KIND_ALL_DTCS, dtcOrigin, &statusOfDtc); /** @req DCM295 **/ /** @req DCM475 **/\r
+ getStatusOfDtcResult = Dem_GetStatusOfDTC(dtc, DEM_DTC_KIND_ALL_DTCS, dtcOrigin, &statusOfDtc); /** @req DCM295 */ /** @req DCM475 */\r
if (getStatusOfDtcResult == DEM_STATUS_OK) {\r
Dem_ReturnGetExtendedDataRecordByDTCType getExtendedDataRecordByDtcResult;\r
- uint16 recNum;\r
- uint8 recLength;\r
+ uint8 recNum;\r
+ uint16 recLength;\r
uint16 txIndex = 6;\r
\r
- /** @req DCM297 **/ /** @req DCM474 **/ /** @req DCM386 **/\r
+ /** @req DCM297 */ /** @req DCM474 */ /** @req DCM386 */\r
pduTxData->SduDataPtr[1] = pduRxData->SduDataPtr[1]; // Sub function\r
pduTxData->SduDataPtr[2] = DTC_HIGH_BYTE(dtc); // DTC high byte\r
pduTxData->SduDataPtr[3] = DTC_MID_BYTE(dtc); // DTC mid byte\r
pduTxData->SduDataPtr[4] = DTC_LOW_BYTE(dtc); // DTC low byte\r
pduTxData->SduDataPtr[5] = statusOfDtc; // DTC status\r
for (recNum = startRecNum; recNum <= endRecNum; recNum++) {\r
- recLength = pduTxData->SduLength - txIndex -1; // Calculate what's left in buffer\r
- /** @req DCM296 **/ /** @req DCM476 **/ /** @req DCM382 **/\r
+ recLength = pduTxData->SduLength - (txIndex + 1); // Calculate what's left in buffer\r
+ /** @req DCM296 */ /** @req DCM476 */ /** @req DCM382 */\r
getExtendedDataRecordByDtcResult = Dem_GetExtendedDataRecordByDTC(dtc, DEM_DTC_KIND_ALL_DTCS, dtcOrigin, recNum, &pduTxData->SduDataPtr[txIndex+1], &recLength);\r
if (getExtendedDataRecordByDtcResult == DEM_RECORD_OK) {\r
pduTxData->SduDataPtr[txIndex++] = recNum;\r
/* Instead of calling Dem_GetSizeOfExtendedDataRecordByDTC() the result from Dem_GetExtendedDataRecordByDTC() is used */\r
- /** @req DCM478 **/ /** @req DCM479 **/ /** @req DCM480 **/\r
+ /** @req DCM478 */ /** @req DCM479 */ /** @req DCM480 */\r
txIndex += recLength;\r
}\r
else {\r
}\r
\r
\r
-Dcm_NegativeResponseCodeType DspUdsReadDtcInfoSub_0x03(const PduInfoType *pduRxData, PduInfoType *pduTxData)\r
+// PC-Lint (715 etc): Remove errors until function is filled.\r
+//lint -e{715, 838, 818} Symbol not referenced, responseCode not used, txData should be const\r
+static Dcm_NegativeResponseCodeType udsReadDtcInfoSub_0x03(const PduInfoType *pduRxData, PduInfoType *pduTxData)\r
{\r
Dcm_NegativeResponseCodeType responseCode = DCM_E_POSITIVERESPONSE;\r
\r
}\r
\r
\r
-Dcm_NegativeResponseCodeType DspUdsReadDtcInfoSub_0x04(const PduInfoType *pduRxData, PduInfoType *pduTxData)\r
+// PC-Lint (715 etc): Remove errors until function is filled.\r
+//lint -e{715, 838, 818} Symbol not referenced, responseCode not used, txData should be const\r
+static Dcm_NegativeResponseCodeType udsReadDtcInfoSub_0x04(const PduInfoType *pduRxData, PduInfoType *pduTxData)\r
{\r
+ // 1. Only consider Negative Response 0x10\r
+\r
Dcm_NegativeResponseCodeType responseCode = DCM_E_POSITIVERESPONSE;\r
+ Dem_DTCKindType DtcType = 0;\r
+ Dem_DTCOriginType DtcOrigin = 0;\r
+ uint32 DtcNumber = 0;\r
+ uint8 RecordNumber = 0;\r
+ uint8 SizeOfTxBuf = pduTxData->SduLength;\r
+ uint8 AvailableBufSize = 0;\r
+ uint8 RecNumOffset = 0;\r
+ uint16 index = 0;\r
+ uint16 EventIndex =0;\r
+ uint16 FFIdNumber = 0;\r
+ Dem_ReturnGetFreezeFrameDataByDTCType GetFFbyDtcReturnCode = DEM_GET_FFDATABYDTC_OK;\r
+ Dem_ReturnGetStatusOfDTCType GetStatusOfDtc = DEM_STATUS_OK;\r
+ Dem_EventStatusExtendedType DtcStatus = 0;\r
+ Dem_EventParameterType *pEventParaTemp = NULL;\r
+\r
+ // Now let's assume DTC has 3 bytes.\r
+ DtcNumber = (((uint32)pduRxData->SduDataPtr[2])<<16) +\r
+ (((uint32)pduRxData->SduDataPtr[3])<<8) +\r
+ ((uint32)pduRxData->SduDataPtr[4]);\r
+\r
+ RecordNumber = pduRxData->SduDataPtr[5];\r
+\r
+ for (EventIndex = 0; DEM_Config.ConfigSet->EventParameter[EventIndex].Arc_EOL != TRUE; EventIndex++){\r
+ // search each event linked to this DTC\r
+ if (DEM_Config.ConfigSet->EventParameter[EventIndex].DTCClassRef->DTC == DtcNumber){\r
+ pEventParaTemp = (Dem_EventParameterType *)(&DEM_Config.ConfigSet->EventParameter[EventIndex]);\r
+ }\r
+ else {\r
+ pEventParaTemp = NULL;\r
+ }\r
\r
- // TODO: Not supported yet\r
- responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+ if (pEventParaTemp != NULL) {\r
+ DtcType = pEventParaTemp->DTCClassRef->DTCKind;\r
+ //DtcOrigin = pEventParaTemp->EventClass->EventDestination[?];\r
+ // now use DEM_DTC_ORIGIN_PRIMARY_MEMORY as default.\r
+ DtcOrigin = DEM_DTC_ORIGIN_PRIMARY_MEMORY;\r
+ pduTxData->SduDataPtr[6 + RecNumOffset] = RecordNumber;\r
+\r
+ // get Dids' number\r
+ for (index = 0; pEventParaTemp->FreezeFrameClassRef[index] != NULL; index++){\r
+ if (pEventParaTemp->FreezeFrameClassRef[index]->FFRecordNumber == RecordNumber) {\r
+ // Calculate the Number of Dids in FF\r
+ for (FFIdNumber = 0; pEventParaTemp->FreezeFrameClassRef[index]->FFIdClassRef[FFIdNumber]->Arc_EOL != FALSE; FFIdNumber++) {\r
+ ;\r
+ }\r
+ }\r
+ }\r
+ pduTxData->SduDataPtr[7 + RecNumOffset] = FFIdNumber;\r
+\r
+ // get FF data\r
+ AvailableBufSize = SizeOfTxBuf - 7 - RecNumOffset;\r
+ GetFFbyDtcReturnCode = Dem_GetFreezeFrameDataByDTC(DtcNumber, DtcType, DtcOrigin,\r
+ RecordNumber, &pduTxData->SduDataPtr[8 + RecNumOffset], &AvailableBufSize);\r
+ if (GetFFbyDtcReturnCode != DEM_GET_FFDATABYDTC_OK){\r
+ break;\r
+ }\r
+ RecNumOffset = RecNumOffset + AvailableBufSize;\r
+ pduTxData->SduLength = 8 + RecNumOffset;\r
+ }\r
+ }\r
+\r
+ // Negative response\r
+ switch (GetFFbyDtcReturnCode) {\r
+ case DEM_GET_FFDATABYDTC_OK:\r
+ break;\r
+ default:\r
+ responseCode = DCM_E_GENERALREJECT;\r
+ return responseCode;\r
+ }\r
\r
+ GetStatusOfDtc = Dem_GetStatusOfDTC(DtcNumber, DtcType, DtcOrigin, &DtcStatus); /** @req DEM212 */\r
+ switch (GetStatusOfDtc) {\r
+ case DEM_STATUS_OK:\r
+ break;\r
+ default:\r
+ responseCode = DCM_E_GENERALREJECT;\r
+ return responseCode;\r
+ }\r
+\r
+\r
+ // Positive response\r
+ // See ISO 14229(2006) Table 254\r
+ pduTxData->SduDataPtr[0] = 0x59; // positive response\r
+ pduTxData->SduDataPtr[1] = 0x04; // subid\r
+ pduTxData->SduDataPtr[2] = pduRxData->SduDataPtr[2]; // DTC\r
+ pduTxData->SduDataPtr[3] = pduRxData->SduDataPtr[3];\r
+ pduTxData->SduDataPtr[4] = pduRxData->SduDataPtr[4];\r
+ pduTxData->SduDataPtr[5] = (uint8)DtcStatus; //status\r
return responseCode;\r
}\r
\r
\r
-Dcm_NegativeResponseCodeType DspUdsReadDtcInfoSub_0x05(const PduInfoType *pduRxData, PduInfoType *pduTxData)\r
+// PC-Lint (715 etc): Remove errors until function is filled.\r
+//lint -e{715, 838, 818} Symbol not referenced, responseCode not used, txData should be const\r
+static Dcm_NegativeResponseCodeType udsReadDtcInfoSub_0x05(const PduInfoType *pduRxData, PduInfoType *pduTxData)\r
{\r
Dcm_NegativeResponseCodeType responseCode = DCM_E_POSITIVERESPONSE;\r
\r
}\r
\r
\r
-Dcm_NegativeResponseCodeType DspUdsReadDtcInfoSub_0x0B_0x0C_0x0D_0x0E(const PduInfoType *pduRxData, PduInfoType *pduTxData)\r
+// PC-Lint (715 etc): Remove errors until function is filled.\r
+//lint -e{715, 838, 818} Symbol not referenced, responseCode not used, txData should be const\r
+static Dcm_NegativeResponseCodeType udsReadDtcInfoSub_0x0B_0x0C_0x0D_0x0E(const PduInfoType *pduRxData, PduInfoType *pduTxData)\r
{\r
Dcm_NegativeResponseCodeType responseCode = DCM_E_POSITIVERESPONSE;\r
\r
}\r
\r
\r
-Dcm_NegativeResponseCodeType DspUdsReadDtcInfoSub_0x14(const PduInfoType *pduRxData, PduInfoType *pduTxData)\r
+// PC-Lint (715 etc): Remove errors until function is filled.\r
+//lint -e{715, 838, 818} Symbol not referenced, responseCode not used, txData should be const\r
+static Dcm_NegativeResponseCodeType udsReadDtcInfoSub_0x14(const PduInfoType *pduRxData, PduInfoType *pduTxData)\r
{\r
Dcm_NegativeResponseCodeType responseCode = DCM_E_POSITIVERESPONSE;\r
\r
\r
void DspUdsReadDtcInformation(const PduInfoType *pduRxData, PduInfoType *pduTxData)\r
{\r
- /** @reg DCM248 **/\r
+ /** @req DCM248 */\r
// Sub function number 0 1 2 3 4 5 6 7 8 9 A B C D E F 10 11 12 13 14 15\r
const uint8 sduLength[0x16] = {0, 3, 3, 6, 6, 3, 6, 4, 4, 5, 2, 2, 2, 2, 2, 3, 6, 3, 3, 3, 2, 2};\r
\r
case 0x07: // reportNumberOfDTCBySeverityMaskRecord\r
case 0x11: // reportNumberOfMirrorMemoryDTCByStatusMask\r
case 0x12: // reportNumberOfEmissionRelatedOBDDTCByStatusMask\r
- responseCode = DspUdsReadDtcInfoSub_0x01_0x07_0x11_0x12(pduRxData, pduTxData);\r
+ responseCode = udsReadDtcInfoSub_0x01_0x07_0x11_0x12(pduRxData, pduTxData);\r
break;\r
\r
case 0x02: // reportDTCByStatusMask\r
case 0x0F: // reportMirrorMemoryDTCByStatusMask\r
case 0x13: // reportEmissionRelatedOBDDTCByStatusMask\r
case 0x15: // reportDTCWithPermanentStatus\r
- responseCode = DspUdsReadDtcInfoSub_0x02_0x0A_0x0F_0x13_0x15(pduRxData, pduTxData);\r
+ responseCode = udsReadDtcInfoSub_0x02_0x0A_0x0F_0x13_0x15(pduRxData, pduTxData);\r
break;\r
\r
case 0x08: // reportDTCBySeverityMaskRecord\r
- responseCode = DspUdsReadDtcInfoSub_0x08(pduRxData, pduTxData);\r
+ responseCode = udsReadDtcInfoSub_0x08(pduRxData, pduTxData);\r
break;\r
\r
case 0x09: // reportSeverityInformationOfDTC\r
- responseCode = DspUdsReadDtcInfoSub_0x09(pduRxData, pduTxData);\r
+ responseCode = udsReadDtcInfoSub_0x09(pduRxData, pduTxData);\r
break;\r
\r
case 0x06: // reportDTCExtendedDataRecordByDTCNumber\r
case 0x10: // reportMirrorMemoryDTCExtendedDataRecordByDTCNumber\r
- responseCode = DspUdsReadDtcInfoSub_0x06_0x10(pduRxData, pduTxData);\r
+ responseCode = udsReadDtcInfoSub_0x06_0x10(pduRxData, pduTxData);\r
break;\r
\r
case 0x03: // reportDTCSnapshotIdentidication\r
- responseCode = DspUdsReadDtcInfoSub_0x03(pduRxData, pduTxData);\r
+ responseCode = udsReadDtcInfoSub_0x03(pduRxData, pduTxData);\r
break;\r
\r
case 0x04: // reportDTCSnapshotByDtcNumber\r
- responseCode = DspUdsReadDtcInfoSub_0x04(pduRxData, pduTxData);\r
+ responseCode = udsReadDtcInfoSub_0x04(pduRxData, pduTxData);\r
break;\r
\r
case 0x05: // reportDTCSnapshotRecordNumber\r
- responseCode = DspUdsReadDtcInfoSub_0x05(pduRxData, pduTxData);\r
+ responseCode = udsReadDtcInfoSub_0x05(pduRxData, pduTxData);\r
break;\r
\r
case 0x0B: // reportFirstTestFailedDTC\r
case 0x0C: // reportFirstConfirmedDTC\r
case 0x0D: // reportMostRecentTestFailedDTC\r
case 0x0E: // reportMostRecentConfirmedDTC\r
- responseCode = DspUdsReadDtcInfoSub_0x0B_0x0C_0x0D_0x0E(pduRxData, pduTxData);\r
+ responseCode = udsReadDtcInfoSub_0x0B_0x0C_0x0D_0x0E(pduRxData, pduTxData);\r
break;\r
\r
case 0x14: // reportDTCFaultDetectionCounter\r
- responseCode = DspUdsReadDtcInfoSub_0x14(pduRxData, pduTxData);\r
+ responseCode = udsReadDtcInfoSub_0x14(pduRxData, pduTxData);\r
break;\r
\r
default:\r
}\r
else {\r
// Wrong length\r
- responseCode = DCM_E_INCORRECTMESSAGELENGTHORINVALIDFORMAT; /** @req DCM272.0x19 **/\r
+ responseCode = DCM_E_INCORRECTMESSAGELENGTHORINVALIDFORMAT;\r
}\r
}\r
else {\r
\r
DsdDspProcessingDone(responseCode);\r
}\r
+/**\r
+** This Function for check the pointer of Dynamically Did Sourced by Did buffer using a didNr\r
+**/\r
+static boolean LookupDDD(uint16 didNr, const Dcm_DspDDDType **DDid ) \r
+{\r
+ uint8 i;\r
+ boolean ret = FALSE;\r
+ const Dcm_DspDDDType* DDidptr = &dspDDD[0];\r
+ \r
+ for(i = 0;((i < DCM_MAX_DDD_NUMBER) && (ret == FALSE)); i++)\r
+ {\r
+ if(DDidptr->DynamicallyDid == didNr)\r
+ {\r
+ ret = TRUE;\r
+ \r
+ }\r
+ else\r
+ {\r
+ DDidptr++;\r
+ }\r
+ }\r
+ if(ret == TRUE)\r
+ {\r
+ *DDid = DDidptr;\r
+ }\r
\r
+ return ret;\r
+}\r
\r
-boolean DspLookupDid(uint16 didNr, const Dcm_DspDidType **didPtr)\r
+static boolean lookupDid(uint16 didNr, const Dcm_DspDidType **didPtr)\r
{\r
const Dcm_DspDidType *dspDid = DCM_Config.Dsp->DspDid;\r
boolean didFound = FALSE;\r
\r
- while ((dspDid->DspDidIdentifier != didNr) && !dspDid->Arc_EOL) {\r
+ while ((dspDid->DspDidIdentifier != didNr) && (!dspDid->Arc_EOL)) {\r
dspDid++;\r
}\r
\r
- if (!dspDid->Arc_EOL) {\r
+ if (!dspDid->Arc_EOL && (!dspDid->DspDidInfoRef->DspDidDynamicllyDefined)) {\r
didFound = TRUE;\r
*didPtr = dspDid;\r
}\r
}\r
\r
\r
-Dcm_NegativeResponseCodeType DspReadDidData(const Dcm_DspDidType *didPtr, PduInfoType *pduTxData, uint16 *txPos)\r
+static Dcm_NegativeResponseCodeType readDidData(const Dcm_DspDidType *didPtr, PduInfoType *pduTxData, uint16 *txPos)\r
{\r
Dcm_NegativeResponseCodeType responseCode = DCM_E_POSITIVERESPONSE;\r
\r
- if ((didPtr->DspDidInfoRef->DspDidAccess.DspDidRead != NULL) && (didPtr->DspDidConditionCheckReadFnc != NULL) && (didPtr->DspDidReadDataFnc != NULL)) { /** @req DCM433 **/\r
- if (DspCheckSessionLevel(didPtr->DspDidInfoRef->DspDidAccess.DspDidRead->DspDidReadSessionRef)) { /** @req DCM434 **/\r
- if (DspCheckSecurityLevel(didPtr->DspDidInfoRef->DspDidAccess.DspDidRead->DspDidReadSecurityLevelRef)) { /** @req DCM435 **/\r
+ if ((didPtr->DspDidInfoRef->DspDidAccess.DspDidRead != NULL) && (didPtr->DspDidConditionCheckReadFnc != NULL) && (didPtr->DspDidReadDataFnc != NULL)) { /** @req DCM433 */\r
+ if (DspCheckSessionLevel(didPtr->DspDidInfoRef->DspDidAccess.DspDidRead->DspDidReadSessionRef)) { /** @req DCM434 */\r
+ if (DspCheckSecurityLevel(didPtr->DspDidInfoRef->DspDidAccess.DspDidRead->DspDidReadSecurityLevelRef)) { /** @req DCM435 */\r
Std_ReturnType result;\r
Dcm_NegativeResponseCodeType errorCode;\r
result = didPtr->DspDidConditionCheckReadFnc(&errorCode);\r
- if ((result == E_OK) && (errorCode == DCM_E_POSITIVERESPONSE)) { /** @req DCM439 **/\r
- uint16 didLen;\r
+ if ((result == E_OK) && (errorCode == DCM_E_POSITIVERESPONSE)) { /** @req DCM439 */\r
+ uint16 didLen = 0;\r
result = E_NOT_OK;\r
- if (didPtr->DspDidInfoRef->DspDidFixedLength) { /** @req DCM436 **/\r
+ if (didPtr->DspDidInfoRef->DspDidFixedLength) { /** @req DCM436 */\r
didLen = didPtr->DspDidSize;\r
result = E_OK;\r
}\r
if (result == E_OK) {\r
// Now ready for reading the data!\r
if ((*txPos + didLen + 2) <= pduTxData->SduLength) {\r
- pduTxData->SduDataPtr[*txPos] = (didPtr->DspDidIdentifier >> 8) & 0xFF;\r
+ pduTxData->SduDataPtr[*txPos] = (didPtr->DspDidIdentifier >> 8) & 0xFFu;\r
(*txPos)++;\r
- pduTxData->SduDataPtr[*txPos] = (didPtr->DspDidIdentifier >> 0) & 0xFF;\r
+ pduTxData->SduDataPtr[*txPos] = didPtr->DspDidIdentifier & 0xFFu;\r
(*txPos)++;\r
- result = didPtr->DspDidReadDataFnc(&pduTxData->SduDataPtr[*txPos]); /** @req DCM437 **/\r
+ result = didPtr->DspDidReadDataFnc(&pduTxData->SduDataPtr[*txPos]); /** @req DCM437 */\r
*txPos += didLen;\r
\r
if (result != E_OK) {\r
}\r
\r
if (responseCode == DCM_E_POSITIVERESPONSE) {\r
- // Recurse trough the rest of the dids. /** @req DCM440 **/\r
+ // Recurse trough the rest of the dids. /** @req DCM440 */\r
uint16 i;\r
for (i=0; (!didPtr->DspDidRef[i]->Arc_EOL) && (responseCode == DCM_E_POSITIVERESPONSE); i++) {\r
- responseCode = DspReadDidData(didPtr->DspDidRef[i], pduTxData, txPos);\r
+ responseCode = readDidData(didPtr->DspDidRef[i], pduTxData, txPos);\r
}\r
}\r
\r
return responseCode;\r
}\r
\r
+/**\r
+** This Function for read Dynamically Did data buffer Sourced by Memory address using a didNr\r
+**/\r
+static Dcm_NegativeResponseCodeType readDDDData( Dcm_DspDDDType *PDidPtr, uint8 *Data,uint16 *Length)\r
+{\r
+ uint8 i;\r
+ uint8 dataCount;\r
+ uint8 AddressFormat;\r
+ uint16 SourceDataLength = 0;\r
+ const Dcm_DspMemoryIdInfo *SourceMemoryInfoptr = NULL;\r
+ const Dcm_DspDidType *SourceDidPtr = NULL;\r
+ Dcm_NegativeResponseCodeType responseCode = DCM_E_POSITIVERESPONSE;\r
+ *Length = 0;\r
+\r
+ for(i = 0;(i < DCM_MAX_DDDSOURCE_NUMBER) && (PDidPtr->DDDSource[i].formatOrPosition != 0)\r
+ &&(responseCode == DCM_E_POSITIVERESPONSE);i++)\r
+ {\r
+ if(PDidPtr->DDDSource[i].DDDTpyeID == DCM_DDD_SOURCE_ADDRESS)\r
+ {\r
+\r
+ AddressFormat = PDidPtr->DDDSource[i].formatOrPosition&DCM_FORMAT_HIGH_MASK >> 4;\r
+ if(TRUE == lookupReadMemory(PDidPtr->DDDSource[i].SourceAddressOrDid,AddressFormat,\r
+ PDidPtr->DDDSource[i].Size, &SourceMemoryInfoptr))\r
+ {\r
+ if(DspCheckSecurityLevel(SourceMemoryInfoptr->pReadMemoryInfo->pSecurityLevel) != TRUE)\r
+ {\r
+ responseCode = DCM_E_SECUTITYACCESSDENIED;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+ }\r
+ if(responseCode == DCM_E_POSITIVERESPONSE)\r
+ {\r
+ Dcm_ReadMemory(DCM_INITIAL,SourceMemoryInfoptr->MemoryIdValue,\r
+ PDidPtr->DDDSource[i].SourceAddressOrDid,\r
+ PDidPtr->DDDSource[i].Size,\r
+ (Data + *Length));\r
+ *Length = *Length + PDidPtr->DDDSource[i].Size;\r
+ }\r
+ }\r
+ else if(PDidPtr->DDDSource[i].DDDTpyeID == DCM_DDD_SOURCE_DID)\r
+ {\r
+ \r
+ if(lookupDid(PDidPtr->DDDSource[i].SourceAddressOrDid,&SourceDidPtr) == TRUE)\r
+ {\r
+ if(DspCheckSecurityLevel(SourceDidPtr->DspDidInfoRef->DspDidAccess.DspDidRead->DspDidReadSecurityLevelRef) != TRUE)\r
+ {\r
+ responseCode = DCM_E_SECUTITYACCESSDENIED;\r
+ }\r
+ if(SourceDidPtr->DspDidInfoRef->DspDidFixedLength == TRUE)\r
+ {\r
+ SourceDataLength = SourceDidPtr->DspDidSize;\r
+ }\r
+ else\r
+ {\r
+ if(SourceDidPtr->DspDidReadDataLengthFnc != NULL)\r
+ {\r
+ SourceDidPtr->DspDidReadDataLengthFnc(&SourceDataLength);\r
+ }\r
+ }\r
+ if((SourceDidPtr->DspDidReadDataFnc != NULL) && (SourceDataLength != 0) && (DCM_E_POSITIVERESPONSE == responseCode))\r
+ {\r
+ \r
+ SourceDidPtr->DspDidReadDataFnc((Data + *Length));\r
+ for(dataCount = 0;dataCount < SourceDataLength;dataCount++)\r
+ {\r
+ if(dataCount < PDidPtr->DDDSource[i].Size)\r
+ {\r
+ *(Data + *Length + dataCount) = *(Data + *Length + dataCount + PDidPtr->DDDSource[i].formatOrPosition - 1);\r
+ }\r
+ else\r
+ {\r
+ *(Data + *Length + dataCount) = 0; \r
+ }\r
+ }\r
+ *Length = *Length + PDidPtr->DDDSource[i].Size;\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
+ \r
+ responseCode = DCM_E_REQUESTOUTOFRANGE; \r
+ }\r
+ }\r
+ return responseCode;\r
+}\r
+\r
void DspUdsReadDataByIdentifier(const PduInfoType *pduRxData, PduInfoType *pduTxData)\r
{\r
- /** @req DCM253 **/\r
+ /** @req DCM253 */\r
Dcm_NegativeResponseCodeType responseCode = DCM_E_POSITIVERESPONSE;\r
- uint8 nrOfDids;\r
+ uint16 nrOfDids;\r
uint16 didNr;\r
const Dcm_DspDidType *didPtr = NULL;\r
-\r
+ Dcm_DspDDDType *DDidPtr=NULL;\r
uint16 txPos = 1;\r
uint16 i;\r
+ uint16 Length;\r
\r
- if ((pduRxData->SduLength - 1) % 2 == 0 ) {\r
+ if ( ((pduRxData->SduLength - 1) % 2) == 0 ) {\r
nrOfDids = (pduRxData->SduLength - 1) / 2;\r
\r
- for (i = 0; (i < nrOfDids) && (responseCode == DCM_E_POSITIVERESPONSE); i++) {\r
- didNr = (pduRxData->SduDataPtr[1+i*2] << 8) + pduRxData->SduDataPtr[2+i*2];\r
- if (DspLookupDid(didNr, &didPtr)) { /** @req DCM438 **/\r
- responseCode = DspReadDidData(didPtr, pduTxData, &txPos);\r
+ for (i = 0; (i < nrOfDids) && (responseCode == DCM_E_POSITIVERESPONSE); i++) \r
+ {\r
+ didNr = (uint16)((uint16)pduRxData->SduDataPtr[1 + (i * 2)] << 8) + pduRxData->SduDataPtr[2 + (i * 2)];\r
+ if (lookupDid(didNr, &didPtr)) { /** @req DCM438 */\r
+ responseCode = readDidData(didPtr, pduTxData, &txPos);\r
+ }\r
+\r
+ else if(LookupDDD(didNr,(const Dcm_DspDDDType **)&DDidPtr) == TRUE)\r
+ {\r
+ /*DCM 651,DCM 652*/\r
+ pduTxData->SduDataPtr[txPos] = (DDidPtr->DynamicallyDid>>8) & 0xFF;\r
+ txPos++;\r
+ pduTxData->SduDataPtr[txPos] = (uint8)(DDidPtr->DynamicallyDid & 0xFF);\r
+ txPos++;\r
+ responseCode = readDDDData(DDidPtr,&(pduTxData->SduDataPtr[txPos]), &Length);\r
+ txPos = txPos + Length;\r
}\r
- else { // DID not found\r
+\r
+ else\r
+ { // DID not found\r
responseCode = DCM_E_REQUESTOUTOFRANGE;\r
}\r
}\r
}\r
\r
\r
-Dcm_NegativeResponseCodeType DspReadDidScalingData(const Dcm_DspDidType *didPtr, PduInfoType *pduTxData, uint16 *txPos)\r
+static Dcm_NegativeResponseCodeType readDidScalingData(const Dcm_DspDidType *didPtr, const PduInfoType *pduTxData, uint16 *txPos)\r
{\r
Dcm_NegativeResponseCodeType responseCode = DCM_E_POSITIVERESPONSE;\r
\r
Std_ReturnType result;\r
Dcm_NegativeResponseCodeType errorCode;\r
\r
- pduTxData->SduDataPtr[*txPos] = (didPtr->DspDidIdentifier >> 8) & 0xFF;\r
+ pduTxData->SduDataPtr[*txPos] = (didPtr->DspDidIdentifier >> 8) & 0xFFu;\r
(*txPos)++;\r
- pduTxData->SduDataPtr[*txPos] = (didPtr->DspDidIdentifier >> 0) & 0xFF;\r
+ pduTxData->SduDataPtr[*txPos] = didPtr->DspDidIdentifier & 0xFFu;\r
(*txPos)++;\r
- result = didPtr->DspDidGetScalingInfoFnc(&pduTxData->SduDataPtr[*txPos], &errorCode); /** @req DCM394 **/\r
+ result = didPtr->DspDidGetScalingInfoFnc(&pduTxData->SduDataPtr[*txPos], &errorCode); /** @req DCM394 */\r
*txPos += scalingInfoLen;\r
\r
if ((result != E_OK) || (errorCode != DCM_E_POSITIVERESPONSE)) {\r
\r
void DspUdsReadScalingDataByIdentifier(const PduInfoType *pduRxData, PduInfoType *pduTxData)\r
{\r
- /** @req DCM258 **/\r
+ /** @req DCM258 */\r
Dcm_NegativeResponseCodeType responseCode = DCM_E_POSITIVERESPONSE;\r
uint16 didNr;\r
const Dcm_DspDidType *didPtr = NULL;\r
uint16 txPos = 1;\r
\r
if (pduRxData->SduLength == 3) {\r
- didNr = (pduRxData->SduDataPtr[1] << 8) + pduRxData->SduDataPtr[2];\r
- if (DspLookupDid(didNr, &didPtr)) {\r
- responseCode = DspReadDidScalingData(didPtr, pduTxData, &txPos);\r
+ didNr = (uint16)((uint16)pduRxData->SduDataPtr[1] << 8) + pduRxData->SduDataPtr[2];\r
+ if (lookupDid(didNr, &didPtr)) {\r
+ responseCode = readDidScalingData(didPtr, pduTxData, &txPos);\r
}\r
else { // DID not found\r
responseCode = DCM_E_REQUESTOUTOFRANGE;\r
}\r
\r
\r
-Dcm_NegativeResponseCodeType DspWriteDidData(const Dcm_DspDidType *didPtr, const PduInfoType *pduRxData, uint16 writeDidLen)\r
+static Dcm_NegativeResponseCodeType writeDidData(const Dcm_DspDidType *didPtr, const PduInfoType *pduRxData, uint16 writeDidLen)\r
{\r
Dcm_NegativeResponseCodeType responseCode = DCM_E_POSITIVERESPONSE;\r
\r
- if ((didPtr->DspDidInfoRef->DspDidAccess.DspDidWrite != NULL) && (didPtr->DspDidConditionCheckWriteFnc != NULL) && (didPtr->DspDidWriteDataFnc != NULL)) { /** @req DCM468 **/\r
- if (DspCheckSessionLevel(didPtr->DspDidInfoRef->DspDidAccess.DspDidWrite->DspDidWriteSessionRef)) { /** @req DCM469 **/\r
- if (DspCheckSecurityLevel(didPtr->DspDidInfoRef->DspDidAccess.DspDidWrite->DspDidWriteSecurityLevelRef)) { /** @req DCM470 **/\r
+ if ((didPtr->DspDidInfoRef->DspDidAccess.DspDidWrite != NULL) && (didPtr->DspDidConditionCheckWriteFnc != NULL) && (didPtr->DspDidWriteDataFnc != NULL)) { /** @req DCM468 */\r
+ if (DspCheckSessionLevel(didPtr->DspDidInfoRef->DspDidAccess.DspDidWrite->DspDidWriteSessionRef)) { /** @req DCM469 */\r
+ if (DspCheckSecurityLevel(didPtr->DspDidInfoRef->DspDidAccess.DspDidWrite->DspDidWriteSecurityLevelRef)) { /** @req DCM470 */\r
Std_ReturnType result;\r
Dcm_NegativeResponseCodeType errorCode;\r
- result = didPtr->DspDidConditionCheckWriteFnc(&errorCode); /** @req DCM471 **/\r
+ result = didPtr->DspDidConditionCheckWriteFnc(&errorCode); /** @req DCM471 */\r
if ((result == E_OK) && (errorCode == DCM_E_POSITIVERESPONSE)) {\r
- uint16 didLen;\r
+ uint16 didLen = 0;\r
result = E_NOT_OK;\r
- if (didPtr->DspDidInfoRef->DspDidFixedLength) { /** @req DCM472 **/\r
+ if (didPtr->DspDidInfoRef->DspDidFixedLength) { /** @req DCM472 */\r
didLen = didPtr->DspDidSize;\r
result = E_OK;\r
}\r
else {\r
if (didPtr->DspDidReadDataLengthFnc != NULL) {\r
result = didPtr->DspDidReadDataLengthFnc(&didLen);\r
- }\r
- }\r
+ } }\r
\r
if (result == E_OK) {\r
- if (didLen == writeDidLen) { /** @req DCM473 **/\r
- result = didPtr->DspDidWriteDataFnc(&pduRxData->SduDataPtr[3], didLen, &errorCode); /** @req DCM395 **/\r
- if ((result != E_OK) || (errorCode != DCM_E_POSITIVERESPONSE)) {\r
+ if (didLen == writeDidLen) { /** @req DCM473 */\r
+ result = didPtr->DspDidWriteDataFnc(&pduRxData->SduDataPtr[3], (uint8)didLen, &responseCode); /** @req DCM395 */\r
+ if( result != E_OK && responseCode == DCM_E_POSITIVERESPONSE ) {\r
responseCode = DCM_E_CONDITIONSNOTCORRECT;\r
}\r
}\r
\r
void DspUdsWriteDataByIdentifier(const PduInfoType *pduRxData, PduInfoType *pduTxData)\r
{\r
- /** @req DCM255 **/\r
+ /** @req DCM255 */\r
Dcm_NegativeResponseCodeType responseCode = DCM_E_POSITIVERESPONSE;\r
uint16 didNr;\r
const Dcm_DspDidType *didPtr = NULL;\r
uint16 didDataLength;\r
\r
didDataLength = pduRxData->SduLength - 3;\r
- didNr = (pduRxData->SduDataPtr[1] << 8) + pduRxData->SduDataPtr[2];\r
- if (DspLookupDid(didNr, &didPtr)) { /** @req DCM467 **/\r
- responseCode = DspWriteDidData(didPtr, pduRxData, didDataLength);\r
+ didNr = (uint16)((uint16)pduRxData->SduDataPtr[1] << 8) + pduRxData->SduDataPtr[2];\r
+ if (lookupDid(didNr, &didPtr)) { /** @req DCM467 */\r
+ responseCode = writeDidData(didPtr, pduRxData, didDataLength);\r
}\r
else { // DID not found\r
responseCode = DCM_E_REQUESTOUTOFRANGE;\r
\r
if (responseCode == DCM_E_POSITIVERESPONSE) {\r
pduTxData->SduLength = 3;\r
- pduTxData->SduDataPtr[1] = (didNr >> 8) & 0xFF;\r
- pduTxData->SduDataPtr[2] = (didNr >> 0) & 0xFF;\r
+ pduTxData->SduDataPtr[1] = (didNr >> 8) & 0xFFu;\r
+ pduTxData->SduDataPtr[2] = didNr & 0xFFu;\r
}\r
\r
DsdDspProcessingDone(responseCode);\r
\r
void DspUdsSecurityAccess(const PduInfoType *pduRxData, PduInfoType *pduTxData)\r
{\r
- /** @req DCM252 **/\r
+ /** @req DCM252 */\r
Dcm_NegativeResponseCodeType responseCode = DCM_E_POSITIVERESPONSE;\r
\r
// Check sub function range (0x01 to 0x42)\r
if ((pduRxData->SduDataPtr[1] >= 0x01) && (pduRxData->SduDataPtr[1] <= 0x42)) {\r
- boolean isRequestSeed = pduRxData->SduDataPtr[1] & 0x01;\r
+ boolean isRequestSeed = pduRxData->SduDataPtr[1] & 0x01u;\r
Dcm_SecLevelType requestedSecurityLevel = (pduRxData->SduDataPtr[1]-1)/2;\r
- Std_ReturnType getSeedResult;\r
Dcm_NegativeResponseCodeType getSeedErrorCode;\r
- uint16 i;\r
\r
if (isRequestSeed) {\r
// requestSeed message\r
// Check if type exist in security table\r
- for (i = 0; (DCM_Config.Dsp->DspSecurity->DspSecurityRow[i].DspSecurityLevel != requestedSecurityLevel) && !DCM_Config.Dsp->DspSecurity->DspSecurityRow[i].Arc_EOL; i++);\r
-\r
- if (!DCM_Config.Dsp->DspSecurity->DspSecurityRow[i].Arc_EOL) {\r
- const Dcm_DspSecurityRowType *requestedSecurity = &DCM_Config.Dsp->DspSecurity->DspSecurityRow[i];\r
+ const Dcm_DspSecurityRowType *securityRow = &DCM_Config.Dsp->DspSecurity->DspSecurityRow[0];\r
+ while ((securityRow->DspSecurityLevel != requestedSecurityLevel) && (!securityRow->Arc_EOL)) {\r
+ securityRow++;\r
+ }\r
+ if (!securityRow->Arc_EOL) {\r
// Check length\r
- if (pduRxData->SduLength == (2 + requestedSecurity->DspSecurityADRSize)) { /** @req DCM321.1 **/\r
+ if (pduRxData->SduLength == (2 + securityRow->DspSecurityADRSize)) { /** @req DCM321.RequestSeed */\r
Dcm_SecLevelType activeSecLevel;\r
- Dcm_GetSecurityLevel(&activeSecLevel);\r
- if (requestedSecurityLevel == activeSecLevel) { /** @req DCM323 **/\r
- pduTxData->SduDataPtr[1] = pduRxData->SduDataPtr[1];\r
- // If same level set the seed to zeroes\r
- for (i = 0; i < requestedSecurity->DspSecuritySeedSize; i++) {\r
- pduTxData->SduDataPtr[2+i] = 0;\r
- pduTxData->SduLength = 2 + requestedSecurity->DspSecuritySeedSize;\r
- }\r
- }\r
- else {\r
- // New security level ask for seed\r
- getSeedResult = requestedSecurity->GetSeed(&pduRxData->SduDataPtr[2], &pduTxData->SduDataPtr[2], &getSeedErrorCode);\r
- if ((getSeedResult == E_OK) && (getSeedErrorCode == E_OK)) {\r
- // Everything ok add sub function to tx message and send it.\r
+ Std_ReturnType result;\r
+ result = Dcm_GetSecurityLevel(&activeSecLevel);\r
+ if (result == E_OK) {\r
+ if (requestedSecurityLevel == activeSecLevel) { /** @req DCM323 */\r
pduTxData->SduDataPtr[1] = pduRxData->SduDataPtr[1];\r
- pduTxData->SduLength = 2 + requestedSecurity->DspSecuritySeedSize;\r
-\r
- dspUdsSecurityAccesData.reqSecLevel = requestedSecurityLevel;\r
- dspUdsSecurityAccesData.reqSecLevelRef = &DCM_Config.Dsp->DspSecurity->DspSecurityRow[i];\r
- dspUdsSecurityAccesData.reqInProgress = TRUE;\r
- // TODO: Start security timeout\r
- }\r
- else {\r
- // GetSeed returned not ok\r
- responseCode = DCM_E_INCORRECTMESSAGELENGTHORINVALIDFORMAT;\r
+ // If same level set the seed to zeroes\r
+ memset(&pduTxData->SduDataPtr[2], 0, securityRow->DspSecuritySeedSize);\r
+ pduTxData->SduLength = 2 + securityRow->DspSecuritySeedSize;\r
+ } else {\r
+ // New security level ask for seed\r
+ if (securityRow->GetSeed != NULL) {\r
+ Std_ReturnType getSeedResult;\r
+ getSeedResult = securityRow->GetSeed(&pduRxData->SduDataPtr[2], &pduTxData->SduDataPtr[2], &getSeedErrorCode); /** @req DCM324.RequestSeed */\r
+ if ((getSeedResult == E_OK) && (getSeedErrorCode == E_OK)) {\r
+ // Everything ok add sub function to tx message and send it.\r
+ pduTxData->SduDataPtr[1] = pduRxData->SduDataPtr[1];\r
+ pduTxData->SduLength = 2 + securityRow->DspSecuritySeedSize;\r
+\r
+ dspUdsSecurityAccesData.reqSecLevel = requestedSecurityLevel;\r
+ dspUdsSecurityAccesData.reqSecLevelRef = securityRow;\r
+ dspUdsSecurityAccesData.reqInProgress = TRUE;\r
+ }\r
+ else {\r
+ // GetSeed returned not ok\r
+ responseCode = DCM_E_INCORRECTMESSAGELENGTHORINVALIDFORMAT;\r
+ }\r
+ } else {\r
+ responseCode = DCM_E_INCORRECTMESSAGELENGTHORINVALIDFORMAT;\r
+ }\r
}\r
+ } else {\r
+ // TODO: What to do?\r
+ responseCode = DCM_E_GENERALREJECT;\r
}\r
+\r
}\r
else {\r
// Length not ok\r
else {\r
// sendKey message\r
if (dspUdsSecurityAccesData.reqInProgress) {\r
- if (pduRxData->SduLength == (2 + dspUdsSecurityAccesData.reqSecLevelRef->DspSecurityKeySize)) { /** @req DCM321 **/\r
+ if (pduRxData->SduLength == (2 + dspUdsSecurityAccesData.reqSecLevelRef->DspSecurityKeySize)) { /** @req DCM321.SendKey */\r
if (requestedSecurityLevel == dspUdsSecurityAccesData.reqSecLevel) {\r
- Std_ReturnType compareKeyResult;\r
- compareKeyResult = dspUdsSecurityAccesData.reqSecLevelRef->CompareKey(&pduRxData->SduDataPtr[2]);\r
- if (compareKeyResult == E_OK) {\r
- // Request accepted\r
- // Kill timer\r
- DslSetSecurityLevel(dspUdsSecurityAccesData.reqSecLevelRef->DspSecurityLevel);\r
- dspUdsSecurityAccesData.reqInProgress = FALSE;\r
- pduTxData->SduDataPtr[1] = pduRxData->SduDataPtr[1];\r
- pduTxData->SduLength = 2;\r
- }\r
- else {\r
+ if (dspUdsSecurityAccesData.reqSecLevelRef->CompareKey != NULL) {\r
+ Std_ReturnType compareKeyResult;\r
+ compareKeyResult = dspUdsSecurityAccesData.reqSecLevelRef->CompareKey(&pduRxData->SduDataPtr[2]); /** @req DCM324.SendKey */\r
+ if (compareKeyResult == E_OK) {\r
+ // Request accepted\r
+ // Kill timer\r
+ DslSetSecurityLevel(dspUdsSecurityAccesData.reqSecLevelRef->DspSecurityLevel); /** @req DCM325 */\r
+ dspUdsSecurityAccesData.reqInProgress = FALSE;\r
+ pduTxData->SduDataPtr[1] = pduRxData->SduDataPtr[1];\r
+ pduTxData->SduLength = 2;\r
+ }\r
+ else {\r
+ responseCode = DCM_E_CONDITIONSNOTCORRECT;\r
+ }\r
+ } else {\r
responseCode = DCM_E_CONDITIONSNOTCORRECT;\r
}\r
}\r
}\r
\r
\r
+static boolean lookupRoutine(uint16 routineId, const Dcm_DspRoutineType **routinePtr)\r
+{\r
+ const Dcm_DspRoutineType *dspRoutine = DCM_Config.Dsp->DspRoutine;\r
+ boolean routineFound = FALSE;\r
+\r
+ while ((dspRoutine->DspRoutineIdentifier != routineId) && (!dspRoutine->Arc_EOL)) {\r
+ dspRoutine++;\r
+ }\r
+\r
+ if (!dspRoutine->Arc_EOL) {\r
+ routineFound = TRUE;\r
+ *routinePtr = dspRoutine;\r
+ }\r
+\r
+ return routineFound;\r
+}\r
+\r
+\r
+static Dcm_NegativeResponseCodeType startRoutine(const Dcm_DspRoutineType *routinePtr, const PduInfoType *pduRxData, PduInfoType *pduTxData)\r
+{\r
+ Dcm_NegativeResponseCodeType responseCode = DCM_E_POSITIVERESPONSE;\r
+ Std_ReturnType routineResult;\r
+\r
+ // startRoutine\r
+ if ((routinePtr->DspStartRoutineFnc != NULL) && (routinePtr->DspRoutineInfoRef->DspStartRoutine != NULL)) {\r
+ if (((routinePtr->DspRoutineInfoRef->DspStartRoutine->DspStartRoutineCtrlOptRecSize + 4) == pduRxData->SduLength)\r
+ && ((routinePtr->DspRoutineInfoRef->DspStartRoutine->DspStartRoutineStsOptRecSize + 4) <= pduTxData->SduLength)) {\r
+ pduTxData->SduLength = routinePtr->DspRoutineInfoRef->DspStartRoutine->DspStartRoutineStsOptRecSize + 4;\r
+ routineResult = routinePtr->DspStartRoutineFnc(&pduRxData->SduDataPtr[4], &pduTxData->SduDataPtr[4], &responseCode); /** @req DCM400 */ /** @req DCM401 */\r
+ if (routineResult != E_OK) {\r
+ responseCode = DCM_E_CONDITIONSNOTCORRECT;\r
+ }\r
+ }\r
+ else {\r
+ responseCode = DCM_E_INCORRECTMESSAGELENGTHORINVALIDFORMAT;\r
+ }\r
+ }\r
+ else {\r
+ responseCode = DCM_E_CONDITIONSNOTCORRECT;\r
+ }\r
+\r
+ return responseCode;\r
+}\r
+\r
+\r
+static Dcm_NegativeResponseCodeType stopRoutine(const Dcm_DspRoutineType *routinePtr, const PduInfoType *pduRxData, PduInfoType *pduTxData)\r
+{\r
+ Dcm_NegativeResponseCodeType responseCode = DCM_E_POSITIVERESPONSE;\r
+ Std_ReturnType routineResult;\r
+\r
+ // stopRoutine\r
+ if ((routinePtr->DspStopRoutineFnc != NULL) && (routinePtr->DspRoutineInfoRef->DspRoutineStop != NULL)) {\r
+ if (((routinePtr->DspRoutineInfoRef->DspRoutineStop->DspStopRoutineCtrlOptRecSize + 4) == pduRxData->SduLength)\r
+ && ((routinePtr->DspRoutineInfoRef->DspRoutineStop->DspStopRoutineStsOptRecSize + 4) <= pduTxData->SduLength)) {\r
+ pduTxData->SduLength = routinePtr->DspRoutineInfoRef->DspRoutineStop->DspStopRoutineStsOptRecSize + 4;\r
+ routineResult = routinePtr->DspStopRoutineFnc(&pduRxData->SduDataPtr[4], &pduTxData->SduDataPtr[4], &responseCode); /** @req DCM402 */ /** @req DCM403 */\r
+ if (routineResult != E_OK) {\r
+ responseCode = DCM_E_CONDITIONSNOTCORRECT;\r
+ }\r
+ }\r
+ else {\r
+ responseCode = DCM_E_INCORRECTMESSAGELENGTHORINVALIDFORMAT;\r
+ }\r
+ }\r
+ else {\r
+ responseCode = DCM_E_CONDITIONSNOTCORRECT;\r
+ }\r
+\r
+ return responseCode;\r
+}\r
+\r
+\r
+static Dcm_NegativeResponseCodeType requestRoutineResults(const Dcm_DspRoutineType *routinePtr, PduInfoType *pduTxData)\r
+{\r
+ Dcm_NegativeResponseCodeType responseCode = DCM_E_POSITIVERESPONSE;\r
+ Std_ReturnType routineResult;\r
+\r
+ // requestRoutineResults\r
+ if ((routinePtr->DspRequestResultRoutineFnc != NULL) && (routinePtr->DspRoutineInfoRef->DspRoutineRequestRes != NULL)) {\r
+ if ((routinePtr->DspRoutineInfoRef->DspRoutineRequestRes->DspReqResRtnCtrlOptRecSize + 4) <= pduTxData->SduLength) {\r
+ pduTxData->SduLength = routinePtr->DspRoutineInfoRef->DspRoutineRequestRes->DspReqResRtnCtrlOptRecSize + 4;\r
+ routineResult = routinePtr->DspRequestResultRoutineFnc(&pduTxData->SduDataPtr[4], &responseCode); /** @req DCM404 */ /** @req DCM405 */\r
+ if (routineResult != E_OK) {\r
+ responseCode = DCM_E_CONDITIONSNOTCORRECT;\r
+ }\r
+ }\r
+ else {\r
+ responseCode = DCM_E_INCORRECTMESSAGELENGTHORINVALIDFORMAT;\r
+ }\r
+ }\r
+ else {\r
+ responseCode = DCM_E_CONDITIONSNOTCORRECT;\r
+ }\r
+\r
+ return responseCode;\r
+}\r
+\r
+\r
+void DspUdsRoutineControl(const PduInfoType *pduRxData, PduInfoType *pduTxData)\r
+{\r
+ /** @req DCM257 */\r
+ Dcm_NegativeResponseCodeType responseCode = DCM_E_POSITIVERESPONSE;\r
+ uint8 subFunctionNumber = 0;\r
+ uint16 routineId = 0;\r
+ const Dcm_DspRoutineType *routinePtr = NULL;\r
+\r
+ if (pduRxData->SduLength >= 4) {\r
+ subFunctionNumber = pduRxData->SduDataPtr[1];\r
+ if ((subFunctionNumber > 0) && (subFunctionNumber < 4)) {\r
+ routineId = (uint16)((uint16)pduRxData->SduDataPtr[2] << 8) + pduRxData->SduDataPtr[3];\r
+ if (lookupRoutine(routineId, &routinePtr)) {\r
+ if (DspCheckSessionLevel(routinePtr->DspRoutineInfoRef->DspRoutineAuthorization.DspRoutineSessionRef)) {\r
+ if (DspCheckSecurityLevel(routinePtr->DspRoutineInfoRef->DspRoutineAuthorization.DspRoutineSecurityLevelRef)) {\r
+ switch (subFunctionNumber) {\r
+ case 0x01: // startRoutine\r
+ responseCode = startRoutine(routinePtr, pduRxData, pduTxData);\r
+ break;\r
+\r
+ case 0x02: // stopRoutine\r
+ responseCode = stopRoutine(routinePtr, pduRxData, pduTxData);\r
+ break;\r
+\r
+ case 0x03: // requestRoutineResults\r
+ responseCode = requestRoutineResults(routinePtr, pduTxData);\r
+ break;\r
+\r
+ default: // This shall never happen\r
+ responseCode = DCM_E_SUBFUNCTIONNOTSUPPORTED;\r
+ break;\r
+ }\r
+ }\r
+ else { // Not allowed in current security level\r
+ responseCode = DCM_E_SECUTITYACCESSDENIED;\r
+ }\r
+ }\r
+ else { // Not allowed in current session\r
+ responseCode = DCM_E_SERVICENOTSUPPORTEDINACTIVESESSION;\r
+ }\r
+ }\r
+ else { // Unknown routine identifier\r
+ responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+ }\r
+ }\r
+ else { // Sub function not supported\r
+ responseCode = DCM_E_SUBFUNCTIONNOTSUPPORTED;\r
+ }\r
+ }\r
+ else {\r
+ // Wrong length\r
+ responseCode = DCM_E_INCORRECTMESSAGELENGTHORINVALIDFORMAT;\r
+ }\r
+\r
+ if (responseCode == DCM_E_POSITIVERESPONSE) {\r
+ // Add header to the positive response message\r
+ pduTxData->SduDataPtr[1] = subFunctionNumber;\r
+ pduTxData->SduDataPtr[2] = (routineId >> 8) & 0xFFu;\r
+ pduTxData->SduDataPtr[3] = routineId & 0xFFu;\r
+ }\r
+\r
+ DsdDspProcessingDone(responseCode);\r
+}\r
+\r
+\r
void DspUdsTesterPresent(const PduInfoType *pduRxData, PduInfoType *pduTxData)\r
{\r
+ /** @req DCM251 */\r
if (pduRxData->SduLength == 2) {\r
switch (pduRxData->SduDataPtr[1])\r
{\r
case ZERO_SUB_FUNCTION:\r
DslResetSessionTimeoutTimer();\r
// Create positive response\r
- /** @req DCM039.1 **/\r
pduTxData->SduDataPtr[1] = ZERO_SUB_FUNCTION;\r
pduTxData->SduLength = 2;\r
- DsdDspProcessingDone(DCM_E_POSITIVERESPONSE); /** @req DCM269.1 **/\r
+ DsdDspProcessingDone(DCM_E_POSITIVERESPONSE);\r
break;\r
\r
default:\r
- DsdDspProcessingDone(DCM_E_SUBFUNCTIONNOTSUPPORTED); /** @req DCM273.1 **/\r
+ DsdDspProcessingDone(DCM_E_SUBFUNCTIONNOTSUPPORTED);\r
break;\r
}\r
}\r
else {\r
// Wrong length\r
- DsdDspProcessingDone(DCM_E_INCORRECTMESSAGELENGTHORINVALIDFORMAT); /** @req DCM272.1 **/\r
+ DsdDspProcessingDone(DCM_E_INCORRECTMESSAGELENGTHORINVALIDFORMAT);\r
}\r
}\r
\r
\r
void DspUdsControlDtcSetting(const PduInfoType *pduRxData, PduInfoType *pduTxData)\r
{\r
+ /** @req DCM249 */\r
Dem_ReturnControlDTCStorageType resultCode;\r
\r
if (pduRxData->SduLength == 2) {\r
switch (pduRxData->SduDataPtr[1])\r
{\r
- case 0x01: // ON /** @req DCM249.1 **/\r
- resultCode = Dem_EnableDTCStorage(DEM_DTC_GROUP_ALL_DTCS, DEM_DTC_KIND_ALL_DTCS); /** @req DCM304 **/\r
+ case 0x01: // ON\r
+ resultCode = Dem_EnableDTCStorage(DEM_DTC_GROUP_ALL_DTCS, DEM_DTC_KIND_ALL_DTCS); /** @req DCM304 */\r
if (resultCode == DEM_CONTROL_DTC_STORAGE_OK) {\r
pduTxData->SduDataPtr[1] = 0x01;\r
pduTxData->SduLength = 2;\r
}\r
break;\r
\r
- case 0x02: // OFF /** @req DCM249.2 **/\r
- resultCode = Dem_DisableDTCStorage(DEM_DTC_GROUP_ALL_DTCS, DEM_DTC_KIND_ALL_DTCS); /** @req DCM406 **/\r
+ case 0x02: // OFF\r
+ resultCode = Dem_DisableDTCStorage(DEM_DTC_GROUP_ALL_DTCS, DEM_DTC_KIND_ALL_DTCS); /** @req DCM406 */\r
if (resultCode == DEM_CONTROL_DTC_STORAGE_OK) {\r
pduTxData->SduDataPtr[1] = 0x02;\r
pduTxData->SduLength = 2;\r
if (dspUdsEcuResetData.resetPending) {\r
if (confirmPduId == dspUdsEcuResetData.resetPduId) {\r
dspUdsEcuResetData.resetPending = FALSE;\r
+#if defined(USE_MCU) && ( MCU_PERFORM_RESET_API == STD_ON )\r
Mcu_PerformReset();\r
+#else\r
+ DET_REPORTERROR(MODULE_ID_DCM, 0, DCM_UDS_RESET_ID, DCM_E_NOT_SUPPORTED);\r
+#endif\r
}\r
}\r
}\r
\r
\r
+static boolean CheckReadMemoryByAddress( boolean useId,uint32 memoryAddress,\r
+ uint8 memoryAddressFormat,\r
+ uint32 memorySize,\r
+ const Dcm_DspMemoryIdInfo *dspMemory)\r
+{\r
+ boolean ret = FALSE;\r
+ uint8 MemoryId;\r
\r
+ if(useId == FALSE)\r
+ {\r
+ /*@req DCM493*/\r
+ if((memoryAddress >= dspMemory->pReadMemoryInfo->MemoryAddressLow)\r
+ && (memoryAddress <= dspMemory->pReadMemoryInfo->MemoryAddressHigh)\r
+ && (memoryAddress + memorySize - 1 <= dspMemory->pReadMemoryInfo->MemoryAddressHigh))\r
+ {\r
+ ret = TRUE;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ MemoryId = (uint8)(memoryAddress >> ((memoryAddressFormat - 1)*8));\r
+ memoryAddress = (uint32)(memoryAddress & DCM_MEMORY_ADDRESS_MASK);\r
+\r
+ if((MemoryId == dspMemory->MemoryIdValue)&&\r
+ (memoryAddress >= dspMemory->pReadMemoryInfo->MemoryAddressLow)\r
+ && (memoryAddress <= dspMemory->pReadMemoryInfo->MemoryAddressHigh)\r
+ && (memoryAddress + memorySize - 1 <= dspMemory->pReadMemoryInfo->MemoryAddressHigh))\r
+ {\r
+ ret = TRUE;\r
+ }\r
+ }\r
+ \r
+ return ret;\r
+}\r
+\r
+static boolean lookupReadMemory(uint32 memoryAddress,\r
+ uint8 memoryAddressFormat,\r
+ uint32 memorySize,\r
+ const Dcm_DspMemoryIdInfo **MemoryInfoPtr)\r
+{\r
+ uint8 i;\r
+ boolean memoryFound = FALSE;\r
+ const Dcm_DspMemoryIdInfo *dspMemoryInfo = DCM_Config.Dsp->DspMemory->DspMemoryIdInfo;\r
+\r
+ for(i = 0; (dspMemoryInfo->Arc_EOL == FALSE) && (memoryFound == FALSE); i++)\r
+ {\r
+ if(TRUE == CheckReadMemoryByAddress(DCM_Config.Dsp->DspMemory->DcmDspUseMemoryId,memoryAddress,memoryAddressFormat,memorySize,dspMemoryInfo))\r
+ {\r
+ memoryFound = TRUE;\r
+ }\r
+ else\r
+ {\r
+ dspMemoryInfo++;\r
+ }\r
+ }\r
+ if (memoryFound == TRUE)\r
+ {\r
+ *MemoryInfoPtr = dspMemoryInfo;\r
+ }\r
+ \r
+ return memoryFound;\r
+}\r
+\r
+static Dcm_NegativeResponseCodeType readMemoryData( Dcm_OpStatusType *OpStatus,\r
+ const Dcm_DspMemoryIdInfo *MemoryPtr,\r
+ uint32 MemoryAddress,\r
+ uint32 MemorySize,\r
+ PduInfoType *pduTxData)\r
+{\r
+ Dcm_ReturnReadMemoryType ReadRet;\r
+ Dcm_NegativeResponseCodeType responseCode = DCM_E_POSITIVERESPONSE;\r
+ ReadRet = Dcm_ReadMemory(*OpStatus,MemoryPtr->MemoryIdValue,\r
+ MemoryAddress,\r
+ MemorySize,\r
+ &pduTxData->SduDataPtr[1]);\r
+ if(DCM_READ_FAILED == ReadRet)\r
+ {\r
+ responseCode = DCM_E_GENERALPROGRAMMINGFAILURE; /*@req Dcm644*/\r
+ }\r
+ if (DCM_READ_PENDING == ReadRet)\r
+ {\r
+ *OpStatus = DCM_READ_PENDING;\r
+ } \r
+ return responseCode;\r
+}\r
+\r
+/*@req Dcm442,DCM492*/\r
+void DspUdsReadMemoryByAddress(const PduInfoType *pduRxData, PduInfoType *pduTxData)\r
+{\r
+ typedef struct{\r
+ uint32 MemoryAddressStart; /* low address of a memory block to read or write*/\r
+ uint32 MemoryIdValue; /* memory ID to read or write uint used by parameter */\r
+ const Dcm_DspMemoryIdInfo *MemoryIdConfigPtr; \r
+ Dcm_NegativeResponseCodeType ResponseCode; \r
+ uint8 MemorySizeFormat;\r
+ uint8 MemoryAddressFormat;\r
+ uint32 MemorySize;\r
+ uint16 MessageLength;\r
+ }DspUdsReadMemoryByAddressType; /*the typed used for SID read memory by address*/\r
+ uint8 i;\r
+ DspUdsReadMemoryByAddressType dspReadMemoryByAddress;\r
+ Dcm_OpStatusType OpStatus = 0;\r
+ dspReadMemoryByAddress.MemoryAddressStart = 0;\r
+ dspReadMemoryByAddress.MemorySize = 0;\r
+ dspReadMemoryByAddress.MemoryIdConfigPtr = NULL;\r
+ dspReadMemoryByAddress.ResponseCode = DCM_E_POSITIVERESPONSE;\r
+ dspReadMemoryByAddress.MemorySizeFormat = ((uint8)(pduRxData->SduDataPtr[1] & DCM_FORMAT_HIGH_MASK)) >> 4; /*@req UDS_REQ_0x23_1 & UDS_REQ_0x23_5*/\r
+ dspReadMemoryByAddress.MemoryAddressFormat = ((uint8)(pduRxData->SduDataPtr[1])) & 0x0Fu; /*@req UDS_REQ_0x23_1 & UDS_REQ_0x23_5*/\r
+\r
+ if((dspReadMemoryByAddress.MemoryAddressFormat == 0)||(dspReadMemoryByAddress.MemorySizeFormat == 0))\r
+ {\r
+ dspReadMemoryByAddress.ResponseCode = DCM_E_REQUESTOUTOFRANGE; /*UDS_REQ_0x23_10*/\r
+ }\r
+ else\r
+ {\r
+ dspReadMemoryByAddress.MessageLength = (uint16)(dspReadMemoryByAddress.MemoryAddressFormat + dspReadMemoryByAddress.MemorySizeFormat + SID_AND_ALFID_LEN2);\r
+ if(dspReadMemoryByAddress.MessageLength == (uint16)(pduRxData->SduLength))\r
+ {\r
+ /*take start address out */\r
+ for(i = 0; i < dspReadMemoryByAddress.MemoryAddressFormat; i++)\r
+ {\r
+ dspReadMemoryByAddress.MemoryAddressStart <<= 8;\r
+ dspReadMemoryByAddress.MemoryAddressStart += (uint32)(pduRxData->SduDataPtr[SID_AND_ALFID_LEN2 + i]);\r
+ }\r
+\r
+ /*take value of MemorySize out */\r
+ for(i = 0; i < dspReadMemoryByAddress.MemorySizeFormat; i++)\r
+ {\r
+ dspReadMemoryByAddress.MemorySize <<= 8;\r
+ dspReadMemoryByAddress.MemorySize += (uint32)(pduRxData->SduDataPtr[2 + i + dspReadMemoryByAddress.MemoryAddressFormat]);\r
+ }\r
+ if(dspReadMemoryByAddress.MemorySize < DCM_PROTOCAL_TP_MAX_LENGTH)\r
+ {\r
+ if(TRUE == lookupReadMemory(dspReadMemoryByAddress.MemoryAddressStart,\r
+ dspReadMemoryByAddress.MemoryAddressFormat,\r
+ dspReadMemoryByAddress.MemorySize,\r
+ &dspReadMemoryByAddress.MemoryIdConfigPtr))\r
+ {\r
+ if (DspCheckSecurityLevel(dspReadMemoryByAddress.MemoryIdConfigPtr->pReadMemoryInfo->pSecurityLevel) == TRUE)\r
+ {\r
+ dspReadMemoryByAddress.ResponseCode = readMemoryData(&OpStatus,dspReadMemoryByAddress.MemoryIdConfigPtr,\r
+ dspReadMemoryByAddress.MemoryAddressStart,\r
+ dspReadMemoryByAddress.MemorySize,pduTxData);/*@req UDS_REQ_0x23_9*/\r
+ \r
+ }\r
+ else\r
+ {\r
+ dspReadMemoryByAddress.ResponseCode = DCM_E_SECUTITYACCESSDENIED;/*@req UDS_REQ_0x23_11,@req DCM494*/\r
+ }\r
+ }\r
+ else\r
+ {\r
+ dspReadMemoryByAddress.ResponseCode = DCM_E_REQUESTOUTOFRANGE; /*@req UDS_REQ_0x23_7,UDS_REQ_0x23_8*/\r
+ }\r
+ }\r
+ else\r
+ {\r
+ dspReadMemoryByAddress.ResponseCode = DCM_E_REQUESTOUTOFRANGE;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ dspReadMemoryByAddress.ResponseCode = DCM_E_INCORRECTMESSAGELENGTHORINVALIDFORMAT; /*@req UDS_REQ_0x23_6*/\r
+ }\r
+ }\r
+ if(DCM_E_POSITIVERESPONSE == dspReadMemoryByAddress.ResponseCode)\r
+ {\r
+ pduTxData->SduLength = 1 + dspReadMemoryByAddress.MemorySize;\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(dspReadMemoryByAddress.ResponseCode);\r
+ }\r
+}\r
+\r
+static boolean checkWriteMemoryByAddress(boolean useId,uint32 memoryAddress,\r
+ uint8 memoryAddressFormat,\r
+ uint32 memorySize,\r
+ const Dcm_DspMemoryIdInfo *dspMemory)\r
+{\r
+ boolean ret = FALSE;\r
+ uint8 MemoryId;\r
+ \r
+ if(useId == FALSE)\r
+ {\r
+ if((memoryAddress >= dspMemory->pWriteMemoryInfo->MemoryAddressLow)\r
+ && (memoryAddress <= dspMemory->pWriteMemoryInfo->MemoryAddressHigh)\r
+ && (memoryAddress + memorySize - 1 <= dspMemory->pWriteMemoryInfo->MemoryAddressHigh))\r
+ {\r
+ ret = TRUE;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ MemoryId = (uint8)(memoryAddress >> ((memoryAddressFormat - 1)*8));\r
+ memoryAddress = memoryAddress & DCM_MEMORY_ADDRESS_MASK;\r
+\r
+ if((MemoryId == dspMemory->MemoryIdValue) &&\r
+ (memoryAddress >= dspMemory->pWriteMemoryInfo->MemoryAddressLow)\r
+ && (memoryAddress <= dspMemory->pWriteMemoryInfo->MemoryAddressHigh)\r
+ && (memoryAddress + memorySize -1 <= dspMemory->pWriteMemoryInfo->MemoryAddressHigh))\r
+ {\r
+ ret = TRUE;\r
+ }\r
+\r
+ }\r
+ \r
+ return ret;\r
+}\r
+\r
+static boolean lookupWriteMemory(uint32 memoryAddress,\r
+ uint8 memoryAddressFormat,\r
+ uint32 memorySize,\r
+ const Dcm_DspMemoryIdInfo **MemoryIdConfigPtr)\r
+{\r
+ uint8 i;\r
+ const Dcm_DspMemoryIdInfo *dspMemoryInfo = DCM_Config.Dsp->DspMemory->DspMemoryIdInfo;\r
+ boolean memoryFound = FALSE;\r
+\r
+ for(i = 0;(dspMemoryInfo->Arc_EOL == FALSE) && (memoryFound == FALSE);i++)\r
+ {\r
+ if(TRUE == checkWriteMemoryByAddress(DCM_Config.Dsp->DspMemory->DcmDspUseMemoryId, memoryAddress,memoryAddressFormat,memorySize,dspMemoryInfo))\r
+ {\r
+ memoryFound = TRUE;\r
+ }\r
+ else\r
+ {\r
+ dspMemoryInfo++;\r
+ }\r
+ }\r
+ if (memoryFound == TRUE)\r
+ {\r
+ *MemoryIdConfigPtr = dspMemoryInfo;\r
+ }\r
+ \r
+ return memoryFound;\r
+}\r
+\r
+static Dcm_NegativeResponseCodeType writeMemoryData(Dcm_OpStatusType* OpStatus,\r
+ const Dcm_DspMemoryIdInfo *MemoryIdConfigPtr,\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
+ MemoryIdConfigPtr->MemoryIdValue,\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
+void DspUdsWriteMemoryByAddress(const PduInfoType* pduRxData, PduInfoType* pduTxData)\r
+{\r
+ typedef struct{\r
+ uint32 MemoryAddressStart;\r
+ uint32 MemoryIdValue;\r
+ const Dcm_DspMemoryIdInfo *MemoryIdConfigPtr;\r
+ Dcm_NegativeResponseCodeType ResponseCode;\r
+ uint8 MemorySizeFormat;\r
+ uint8 MemoryAddressFormat;\r
+ uint32 MemorySize ;\r
+ uint16 MessageLength;\r
+ }DspUdsWriteMemoryType;\r
+ uint8 i;\r
+ DspUdsWriteMemoryType dspUdsWriteMemory;\r
+ Dcm_OpStatusType OpStatus = DCM_INITIAL;\r
+ dspUdsWriteMemory.MemoryAddressStart = 0;\r
+ dspUdsWriteMemory.MemoryIdConfigPtr = NULL;\r
+ dspUdsWriteMemory.ResponseCode = DCM_E_POSITIVERESPONSE;\r
+ dspUdsWriteMemory.MemorySizeFormat = ((uint8)(pduRxData->SduDataPtr[1] & DCM_FORMAT_HIGH_MASK)) >> 4; /*@req UDS_REQ_0x3D_3 & UDS_REQ_0x3D_5*/\r
+ dspUdsWriteMemory.MemoryAddressFormat = ((uint8)pduRxData->SduDataPtr[1]) & DCM_FORMAT_LOW_MASK; /*@req UDS_REQ_0x3D_3& UDS_REQ_0x3D_4*/\r
+ dspUdsWriteMemory.MemorySize = 0;\r
+\r
+ if((dspUdsWriteMemory.MemoryAddressFormat == 0) || (dspUdsWriteMemory.MemorySizeFormat == 0)) /*@req UDS_REQ_0x3D_14*/\r
+ {\r
+ dspUdsWriteMemory.ResponseCode = DCM_E_REQUESTOUTOFRANGE;\r
+ }\r
+ else\r
+ {\r
+ /*take value of MemorySize out */\r
+ for(i = 0; i < dspUdsWriteMemory.MemorySizeFormat; i++)\r
+ {\r
+ dspUdsWriteMemory.MemorySize <<= 8;\r
+ dspUdsWriteMemory.MemorySize += (uint32)(pduRxData->SduDataPtr[2 + i +dspUdsWriteMemory.MemoryAddressFormat]);\r
+ }\r
+ dspUdsWriteMemory.MessageLength = (uint16)(2 + dspUdsWriteMemory.MemoryAddressFormat + dspUdsWriteMemory.MemorySizeFormat + dspUdsWriteMemory.MemorySize);\r
+ if(dspUdsWriteMemory.MessageLength == pduRxData->SduLength)\r
+ {\r
+ /*take Start Address out */\r
+ for(i = 0; i < dspUdsWriteMemory.MemoryAddressFormat; i++)\r
+ {\r
+ dspUdsWriteMemory.MemoryAddressStart <<= 8;\r
+ dspUdsWriteMemory.MemoryAddressStart += (uint32)(pduRxData->SduDataPtr[2 + i]);\r
+ }\r
+ if(TRUE == lookupWriteMemory(dspUdsWriteMemory.MemoryAddressStart,\r
+ dspUdsWriteMemory.MemoryAddressFormat,\r
+ dspUdsWriteMemory.MemorySize,\r
+ &dspUdsWriteMemory.MemoryIdConfigPtr))\r
+ {\r
+ if (DspCheckSecurityLevel(dspUdsWriteMemory.MemoryIdConfigPtr->pReadMemoryInfo->pSecurityLevel) == TRUE)\r
+ {\r
+ dspUdsWriteMemory.ResponseCode = writeMemoryData(&OpStatus,\r
+ dspUdsWriteMemory.MemoryIdConfigPtr, \r
+ dspUdsWriteMemory.MemoryAddressStart,\r
+ dspUdsWriteMemory.MemorySize,\r
+ &pduRxData->SduDataPtr[2 + dspUdsWriteMemory.MemoryAddressFormat + dspUdsWriteMemory.MemorySizeFormat]);\r
+ }\r
+ else\r
+ {\r
+ dspUdsWriteMemory.ResponseCode = DCM_E_SECUTITYACCESSDENIED; /*@req UDS_REQ_0X3D_15,Dcm490*/\r
+ }\r
+ }\r
+ else\r
+ {\r
+ dspUdsWriteMemory.ResponseCode = DCM_E_REQUESTOUTOFRANGE; /*@req UDS_REQ_0x3D_11,UDS_REQ_0x3D_12,Dcm489*/\r
+ }\r
+ }\r
+ else\r
+ {\r
+ dspUdsWriteMemory.ResponseCode = DCM_E_INCORRECTMESSAGELENGTHORINVALIDFORMAT;/*@req UDS_REQ_0x3D_9*/\r
+ } \r
+ }\r
+ if(DCM_E_POSITIVERESPONSE == dspUdsWriteMemory.ResponseCode)\r
+ {\r
+ pduTxData->SduLength = 2 + dspUdsWriteMemory.MemorySizeFormat + dspUdsWriteMemory.MemoryAddressFormat;\r
+ pduTxData->SduDataPtr[1] = pduRxData->SduDataPtr[1];\r
+ for(i = 0; i < dspUdsWriteMemory.MemorySizeFormat + dspUdsWriteMemory.MemoryAddressFormat; i++)\r
+ {\r
+ pduTxData->SduDataPtr[2 + i] = pduRxData->SduDataPtr[2 + i];\r
+ if(OpStatus != DCM_PENDING)\r
+ {\r
+ DsdDspProcessingDone(dspUdsWriteMemory.ResponseCode);\r
+ }\r
+ else\r
+ {\r
+ dspMemoryState=DCM_MEMORY_WRITE;\r
+ }\r
+ }\r
+ }\r
+ else\r
+ {\r
+ DsdDspProcessingDone(dspUdsWriteMemory.ResponseCode);\r
+ }\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
+ uint8 LengthCount;\r
+ uint8 SourceCount;\r
+ uint16 Length;\r
+ uint8 AddressFormat;\r
+ uint8 MemorySizeFormat;\r
+ uint32 MemoryAddress = 0;\r
+ uint16 MemorySize = 0;\r
+ uint16 SourceLength = 0;\r
+ Dcm_DspDDDType *DDid = NULL;\r
+ const Dcm_DspMemoryIdInfo *SourceMemoryInfo = NULL;\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
+ AddressFormat = (uint8)pduRxData->SduDataPtr[4] & DCM_FORMAT_LOW_MASK;\r
+ MemorySizeFormat = (uint8)(pduRxData->SduDataPtr[4] >> 4) & DCM_FORMAT_LOW_MASK;\r
+ if((AddressFormat+MemorySizeFormat) != 0)\r
+ {\r
+ Length = (pduRxData->SduLength - SID_AND_ALFID_LEN5) / (AddressFormat + MemorySizeFormat);\r
+ }\r
+ if((AddressFormat != 0) && (MemorySizeFormat != 0) && ((SourceLength+Length) <= DCM_MAX_DDDSOURCE_NUMBER))\r
+ {\r
+ if((Length != 0)&&( Length * (AddressFormat + MemorySizeFormat) == (pduRxData->SduLength - 5) ))\r
+ {\r
+ for(LengthCount = 0; (LengthCount < Length) && (responseCode == DCM_E_POSITIVERESPONSE); LengthCount++)\r
+ {\r
+ MemoryAddress = 0;\r
+ for(SourceCount = 0; SourceCount < AddressFormat; SourceCount++)\r
+ {\r
+ MemoryAddress = MemoryAddress << 8;\r
+ MemoryAddress += (uint32)(pduRxData->SduDataPtr[5 + SourceCount + LengthCount * (AddressFormat + MemorySizeFormat)]);\r
+ }\r
+\r
+ /*take value of MemorySize out */\r
+ MemorySize = 0;\r
+ for(SourceCount = 0; SourceCount < MemorySizeFormat; SourceCount++)\r
+ {\r
+ MemorySize = MemorySize << 8;\r
+ MemorySize += (uint32)(pduRxData->SduDataPtr[5 + SourceCount + AddressFormat + LengthCount * (AddressFormat + MemorySizeFormat)]);\r
+ }\r
+ if(TRUE == lookupReadMemory(MemoryAddress, AddressFormat,MemorySize,&SourceMemoryInfo))\r
+ {\r
+ if(DspCheckSecurityLevel(SourceMemoryInfo->pReadMemoryInfo->pSecurityLevel) == TRUE)\r
+ {\r
+ DDid->DDDSource[LengthCount + SourceLength].formatOrPosition = pduRxData->SduDataPtr[4];\r
+ DDid->DDDSource[LengthCount + SourceLength].SourceAddressOrDid = MemoryAddress;\r
+ DDid->DDDSource[LengthCount + SourceLength].Size = MemorySize;\r
+ DDid->DDDSource[LengthCount + SourceLength].DDDTpyeID = DCM_DDD_SOURCE_ADDRESS;\r
+ /*UDS_REQ_0x2C_6*/\r
+ }\r
+ else\r
+ {\r
+ /*UDS_REQ_0x2C_19,DCM726*/\r
+ responseCode = DCM_E_SECUTITYACCESSDENIED;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ /*UDS_REQ_0x2C_15,UDS_REQ_0x2C_16*/\r
+ responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+ }\r
+ }\r
+ if(responseCode == DCM_E_POSITIVERESPONSE)\r
+ {\r
+ DDid->DynamicallyDid = DDIdentifier;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ /*UDS_REQ_0x2C_11*/\r
+ responseCode = DCM_E_INCORRECTMESSAGELENGTHORINVALIDFORMAT;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ /*UDS_REQ_0x2C_17, UDS_REQ_0x2C_18*/\r
+ responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+ }\r
+\r
+ }\r
+ if(responseCode == DCM_E_POSITIVERESPONSE)\r
+ {\r
+ pduTxData->SduDataPtr[1] = DCM_DDD_SUBFUNCTION_DEFINEBYADDRESS;\r
+ }\r
+ \r
+ return responseCode;\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 ClearCount;\r
+ uint8 position;\r
+ uint8 ClearNum = 0;\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