]> rtime.felk.cvut.cz Git - arc.git/blobdiff - diagnostic/Dcm/Dcm_Dsp.c
Dcm, Fixed problem in read / write memory functions (refactored) that made it inpossi...
[arc.git] / diagnostic / Dcm / Dcm_Dsp.c
index 980168e96f125270114bb7e6458c9ff666d8d25e..057416a25e35a04d35dd4bbed28abdc83d171fa4 100644 (file)
  * 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
-\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
+/* == Parser macros == */\r
+/* General */\r
+#define SID_INDEX 0\r
+#define SID_LEN 1\r
+#define SF_INDEX 1\r
+#define SF_LEN 1\r
+/* Read/WriteMemeoryByAddress */\r
+#define ALFID_INDEX 1\r
+#define ALFID_LEN 1\r
+#define ADDR_START_INDEX 2\r
+/* DynamicallyDefineDataByIdentifier */\r
+#define DDDDI_INDEX 2\r
+#define DDDDI_LEN 2\r
+#define DYNDEF_ALFID_INDEX 4\r
+#define DYNDEF_ADDRESS_START_INDEX 5\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
+typedef enum {\r
+       DCM_READ_MEMORY = 0,\r
+       DCM_WRITE_MEMORY,\r
+} DspMemoryServiceType;\r
 \r
 typedef struct {\r
        boolean resetPending;\r
@@ -40,7 +80,7 @@ typedef struct {
 } DspUdsEcuResetDataType;\r
 \r
 static DspUdsEcuResetDataType dspUdsEcuResetData;\r
-\r
+static boolean dspWritePending;\r
 \r
 typedef struct {\r
        boolean                                                 reqInProgress;\r
@@ -50,68 +90,206 @@ typedef struct {
 \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
+       uint8   memoryIdentifier;\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 LookupDDD(uint16 didNr, const Dcm_DspDDDType **DDid);\r
+static Dcm_NegativeResponseCodeType checkAddressRange(DspMemoryServiceType serviceType, uint8 memoryIdentifier, uint32 memoryAddress, uint32 length);\r
+static const Dcm_DspMemoryRangeInfo* findRange(const Dcm_DspMemoryRangeInfo *memoryRangePtr, uint32 memoryAddress, uint32 length);\r
+static Dcm_NegativeResponseCodeType writeMemoryData(Dcm_OpStatusType* OpStatus, uint8 memoryIdentifier, uint32 MemoryAddress, uint32 MemorySize, uint8 *SourceData);\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(&currentSession);\r
-       while (((*sessionLevelRefTable)->DspSessionLevel != currentSession) && !(*sessionLevelRefTable)->Arc_EOL) {\r
-               sessionLevelRefTable++;\r
-       }\r
+       returnStatus = DslGetSesCtrlType(&currentSession);\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(&currentSecurityLevel);\r
-       while (((*securityLevelRefTable)->DspSecurityLevel != currentSecurityLevel) && !(*securityLevelRefTable)->Arc_EOL) {\r
-               securityLevelRefTable++;\r
-       }\r
-       if ((*securityLevelRefTable)->Arc_EOL) {\r
-               returnStatus = FALSE;\r
+       returnStatus = DslGetSecurityLevel(&currentSecurityLevel);\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(&currentSessionLevel);\r
-                       result = sesControl->GetSesChgPermission(currentSessionLevel ,newSessionLevel);\r
-                       if (result != E_OK) {\r
-                               returnCode = result;\r
+                       result = Dcm_GetSesCtrlType(&currentSessionLevel);\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
@@ -123,7 +301,7 @@ Std_ReturnType AskApplicationForSessionPermission(Dcm_SesCtrlType newSessionLeve
 \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
@@ -131,39 +309,38 @@ void DspUdsDiagnosticSessionControl(const PduInfoType *pduRxData, PduInfoType *p
        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
@@ -179,41 +356,40 @@ void DspUdsEcuReset(const PduInfoType *pduRxData, PduIdType txPduId, PduInfoType
                        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
@@ -223,12 +399,12 @@ void DspUdsClearDiagnosticInformation(const PduInfoType *pduRxData, PduInfoType
        }\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
@@ -243,7 +419,7 @@ Dcm_NegativeResponseCodeType DspUdsReadDtcInfoSub_0x01_0x07_0x11_0x12(const PduI
        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
@@ -263,29 +439,37 @@ Dcm_NegativeResponseCodeType DspUdsReadDtcInfoSub_0x01_0x07_0x11_0x12(const PduI
 \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
@@ -295,7 +479,7 @@ Dcm_NegativeResponseCodeType DspUdsReadDtcInfoSub_0x01_0x07_0x11_0x12(const PduI
 }\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
@@ -315,7 +499,7 @@ Dcm_NegativeResponseCodeType DspUdsReadDtcInfoSub_0x02_0x0A_0x0F_0x13_0x15(const
        } 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
@@ -339,29 +523,31 @@ Dcm_NegativeResponseCodeType DspUdsReadDtcInfoSub_0x02_0x0A_0x0F_0x13_0x15(const
 \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
@@ -376,7 +562,7 @@ Dcm_NegativeResponseCodeType DspUdsReadDtcInfoSub_0x02_0x0A_0x0F_0x13_0x15(const
                                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
@@ -385,8 +571,9 @@ Dcm_NegativeResponseCodeType DspUdsReadDtcInfoSub_0x02_0x0A_0x0F_0x13_0x15(const
        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
@@ -397,7 +584,9 @@ Dcm_NegativeResponseCodeType DspUdsReadDtcInfoSub_0x08(const PduInfoType *pduRxD
 }\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
@@ -408,15 +597,15 @@ Dcm_NegativeResponseCodeType DspUdsReadDtcInfoSub_0x09(const PduInfoType *pduRxD
 }\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
@@ -428,9 +617,7 @@ Dcm_NegativeResponseCodeType DspUdsReadDtcInfoSub_0x06_0x10(const PduInfoType *p
 \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
@@ -459,27 +646,27 @@ Dcm_NegativeResponseCodeType DspUdsReadDtcInfoSub_0x06_0x10(const PduInfoType *p
                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
@@ -497,7 +684,9 @@ Dcm_NegativeResponseCodeType DspUdsReadDtcInfoSub_0x06_0x10(const PduInfoType *p
 }\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
@@ -508,18 +697,108 @@ Dcm_NegativeResponseCodeType DspUdsReadDtcInfoSub_0x03(const PduInfoType *pduRxD
 }\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
@@ -530,7 +809,9 @@ Dcm_NegativeResponseCodeType DspUdsReadDtcInfoSub_0x05(const PduInfoType *pduRxD
 }\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
@@ -541,7 +822,9 @@ Dcm_NegativeResponseCodeType DspUdsReadDtcInfoSub_0x0B_0x0C_0x0D_0x0E(const PduI
 }\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
@@ -554,7 +837,7 @@ Dcm_NegativeResponseCodeType DspUdsReadDtcInfoSub_0x14(const PduInfoType *pduRxD
 \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
@@ -571,7 +854,7 @@ void DspUdsReadDtcInformation(const PduInfoType *pduRxData, PduInfoType *pduTxDa
                        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
@@ -579,43 +862,43 @@ void DspUdsReadDtcInformation(const PduInfoType *pduRxData, PduInfoType *pduTxDa
                        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
@@ -626,7 +909,7 @@ void DspUdsReadDtcInformation(const PduInfoType *pduRxData, PduInfoType *pduTxDa
                }\r
                else {\r
                        // Wrong length\r
-                       responseCode = DCM_E_INCORRECTMESSAGELENGTHORINVALIDFORMAT;     /** @req DCM272.0x19 **/\r
+                       responseCode = DCM_E_INCORRECTMESSAGELENGTHORINVALIDFORMAT;\r
                }\r
        }\r
        else {\r
@@ -636,18 +919,45 @@ void DspUdsReadDtcInformation(const PduInfoType *pduRxData, PduInfoType *pduTxDa
 \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
@@ -656,20 +966,20 @@ boolean DspLookupDid(uint16 didNr, const Dcm_DspDidType **didPtr)
 }\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
@@ -682,11 +992,11 @@ Dcm_NegativeResponseCodeType DspReadDidData(const Dcm_DspDidType *didPtr, PduInf
                                        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
@@ -718,36 +1028,133 @@ Dcm_NegativeResponseCodeType DspReadDidData(const Dcm_DspDidType *didPtr, PduInf
        }\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
+       uint16 SourceDataLength = 0;\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
+                       responseCode = checkAddressRange(DCM_READ_MEMORY, PDidPtr->DDDSource[i].memoryIdentifier, PDidPtr->DDDSource[i].SourceAddressOrDid, PDidPtr->DDDSource[i].Size);\r
+                       if( responseCode == DCM_E_POSITIVERESPONSE ) {\r
+                               Dcm_ReadMemory(DCM_INITIAL,PDidPtr->DDDSource[i].memoryIdentifier,\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
@@ -764,7 +1171,7 @@ void DspUdsReadDataByIdentifier(const PduInfoType *pduRxData, PduInfoType *pduTx
 }\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
@@ -776,11 +1183,11 @@ Dcm_NegativeResponseCodeType DspReadDidScalingData(const Dcm_DspDidType *didPtr,
                        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
@@ -800,7 +1207,7 @@ Dcm_NegativeResponseCodeType DspReadDidScalingData(const Dcm_DspDidType *didPtr,
 \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
@@ -808,9 +1215,9 @@ void DspUdsReadScalingDataByIdentifier(const PduInfoType *pduRxData, PduInfoType
        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
@@ -829,33 +1236,32 @@ void DspUdsReadScalingDataByIdentifier(const PduInfoType *pduRxData, PduInfoType
 }\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
@@ -888,7 +1294,7 @@ Dcm_NegativeResponseCodeType DspWriteDidData(const Dcm_DspDidType *didPtr, const
 \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
@@ -896,9 +1302,9 @@ void DspUdsWriteDataByIdentifier(const PduInfoType *pduRxData, PduInfoType *pduT
        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
@@ -906,8 +1312,8 @@ void DspUdsWriteDataByIdentifier(const PduInfoType *pduRxData, PduInfoType *pduT
 \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
@@ -916,51 +1322,61 @@ void DspUdsWriteDataByIdentifier(const PduInfoType *pduRxData, PduInfoType *pduT
 \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
 \r
                if (isRequestSeed) {\r
                        // requestSeed message\r
                        // Check if type exist in security table\r
                        const Dcm_DspSecurityRowType *securityRow = &DCM_Config.Dsp->DspSecurity->DspSecurityRow[0];\r
-                       while ((securityRow->DspSecurityLevel != requestedSecurityLevel) && !securityRow->Arc_EOL) {\r
+                       while ((securityRow->DspSecurityLevel != requestedSecurityLevel) && (!securityRow->Arc_EOL)) {\r
                                securityRow++;\r
                        }\r
                        if (!securityRow->Arc_EOL) {\r
                                // Check length\r
-                               if (pduRxData->SduLength == (2 + securityRow->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
-                                               memset(&pduTxData->SduDataPtr[2], 0, securityRow->DspSecuritySeedSize);\r
-                                               pduTxData->SduLength = 2 + securityRow->DspSecuritySeedSize;\r
-                                       }\r
-                                       else {\r
-                                               // New security level ask for seed\r
-                                               getSeedResult = securityRow->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
+                                                       // If same level set the seed to zeroes\r
+                                                       memset(&pduTxData->SduDataPtr[2], 0, securityRow->DspSecuritySeedSize);\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
+                                               } 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
@@ -975,19 +1391,23 @@ void DspUdsSecurityAccess(const PduInfoType *pduRxData, PduInfoType *pduTxData)
                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
@@ -1014,41 +1434,205 @@ void DspUdsSecurityAccess(const PduInfoType *pduRxData, PduInfoType *pduTxData)
 }\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
@@ -1059,8 +1643,8 @@ void DspUdsControlDtcSetting(const PduInfoType *pduRxData, PduInfoType *pduTxDat
                        }\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
@@ -1088,10 +1672,1318 @@ void DspDcmConfirmation(PduIdType confirmPduId)
        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
+static Dcm_NegativeResponseCodeType readMemoryData( Dcm_OpStatusType *OpStatus,\r
+                                                                                                       uint8 memoryIdentifier,\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,memoryIdentifier,\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
+static Dcm_NegativeResponseCodeType checkAddressRange(DspMemoryServiceType serviceType, uint8 memoryIdentifier, uint32 memoryAddress, uint32 length) {\r
+       const Dcm_DspMemoryIdInfo *dspMemoryInfo = DCM_Config.Dsp->DspMemory->DspMemoryIdInfo;\r
+       const Dcm_DspMemoryRangeInfo *memoryRangeInfo = NULL;\r
+       Dcm_NegativeResponseCodeType diagResponseCode = DCM_E_REQUESTOUTOFRANGE;\r
 \r
+       for( ; (dspMemoryInfo->Arc_EOL == FALSE) && (memoryRangeInfo == NULL); dspMemoryInfo++ )\r
+       {\r
+               if( ((TRUE == DCM_Config.Dsp->DspMemory->DcmDspUseMemoryId) && (dspMemoryInfo->MemoryIdValue == memoryIdentifier))\r
+                       || (FALSE == DCM_Config.Dsp->DspMemory->DcmDspUseMemoryId) )\r
+               {\r
+                       if( DCM_READ_MEMORY == serviceType )\r
+                       {\r
+                               memoryRangeInfo = findRange( dspMemoryInfo->pReadMemoryInfo, memoryAddress, length );\r
+                       }\r
+                       else\r
+                       {\r
+                               memoryRangeInfo = findRange( dspMemoryInfo->pWriteMemoryInfo, memoryAddress, length );\r
+                       }\r
 \r
+                       if( NULL != memoryRangeInfo )\r
+                       {\r
+                               if( DspCheckSecurityLevel(memoryRangeInfo->pSecurityLevel) )\r
+                               {\r
+                                       /* Range is ok */\r
+                                       diagResponseCode = DCM_E_POSITIVERESPONSE;\r
+                               }\r
+                               else\r
+                               {\r
+                                       diagResponseCode = DCM_E_SECUTITYACCESSDENIED;\r
+                               }\r
+                       }\r
+                       else {\r
+                               /* Range was not configured for read/write */\r
+                               diagResponseCode = DCM_E_REQUESTOUTOFRANGE;\r
+                       }\r
+               }\r
+               else {\r
+                       /* No memory with this id found */\r
+                       diagResponseCode = DCM_E_REQUESTOUTOFRANGE;\r
+               }\r
+       }\r
+       return diagResponseCode;\r
+}\r
+\r
+static const Dcm_DspMemoryRangeInfo* findRange(const Dcm_DspMemoryRangeInfo *memoryRangePtr, uint32 memoryAddress, uint32 length)\r
+{\r
+       const Dcm_DspMemoryRangeInfo *memoryRange = NULL;\r
+\r
+       for( ; (memoryRangePtr->Arc_EOL == FALSE) && (memoryRange == NULL); memoryRangePtr++ )\r
+       {\r
+               /*@req DCM493*/\r
+               if((memoryAddress >= memoryRangePtr->MemoryAddressLow)\r
+                       && (memoryAddress <= memoryRangePtr->MemoryAddressHigh)\r
+                       && (memoryAddress + length - 1 <= memoryRangePtr->MemoryAddressHigh))\r
+               {\r
+                       memoryRange = memoryRangePtr;\r
+               }\r
+       }\r
+\r
+       return memoryRange;\r
+}\r
+\r
+void DspUdsWriteMemoryByAddress(const PduInfoType *pduRxData, PduInfoType *pduTxData)\r
+{\r
+       Dcm_NegativeResponseCodeType diagResponseCode;\r
+       uint8 sizeFormat;\r
+       uint8 addressFormat;\r
+       uint32 memoryAddress = 0;\r
+       uint32 length = 0;\r
+       uint8 i;\r
+       uint8 memoryIdentifier = 0; /* Should be 0 if DcmDspUseMemoryId == FALSE */\r
+       Dcm_OpStatusType OpStatus;\r
+       uint8 addressOffset;\r
+\r
+       if( pduRxData->SduLength > ALFID_INDEX )\r
+       {\r
+               sizeFormat = ((uint8)(pduRxData->SduDataPtr[ALFID_INDEX] & DCM_FORMAT_HIGH_MASK)) >> 4; /*@req UDS_REQ_0x23_1 & UDS_REQ_0x23_5*/;\r
+               addressFormat = ((uint8)(pduRxData->SduDataPtr[ALFID_INDEX])) & DCM_FORMAT_LOW_MASK;   /*@req UDS_REQ_0x23_1 & UDS_REQ_0x23_5*/;\r
+               if((addressFormat != 0) && (sizeFormat != 0))\r
+               {\r
+                       if(addressFormat + sizeFormat + SID_LEN + ALFID_LEN <= pduRxData->SduLength)\r
+                       {\r
+                               if( TRUE == DCM_Config.Dsp->DspMemory->DcmDspUseMemoryId ) {\r
+                                       memoryIdentifier = pduRxData->SduDataPtr[ADDR_START_INDEX];\r
+                                       addressOffset = 1;\r
+                               }\r
+                               else {\r
+                                       addressOffset = 0;\r
+                               }\r
+\r
+                               /* Parse address */\r
+                               for(i = addressOffset; i < addressFormat; i++)\r
+                               {\r
+                                       memoryAddress <<= 8;\r
+                                       memoryAddress += (uint32)(pduRxData->SduDataPtr[ADDR_START_INDEX + i]);\r
+                               }\r
+\r
+                               /* Parse size */\r
+                               for(i = 0; i < sizeFormat; i++)\r
+                               {\r
+                                       length <<= 8;\r
+                                       length += (uint32)(pduRxData->SduDataPtr[ADDR_START_INDEX + addressFormat + i]);\r
+                               }\r
+\r
+                               if( addressFormat + sizeFormat + SID_LEN + ALFID_LEN + length == pduRxData->SduLength )\r
+                               {\r
+\r
+                                       diagResponseCode = checkAddressRange(DCM_WRITE_MEMORY, memoryIdentifier, memoryAddress, length);\r
+                                       if( DCM_E_POSITIVERESPONSE == diagResponseCode )\r
+                                       {\r
+                                               diagResponseCode = writeMemoryData(&OpStatus, memoryIdentifier, memoryAddress, length,\r
+                                                                                                       &pduRxData->SduDataPtr[SID_LEN + ALFID_LEN + addressFormat + sizeFormat]);\r
+                                       }\r
+\r
+                               }\r
+                               else\r
+                               {\r
+                                       diagResponseCode = DCM_E_INCORRECTMESSAGELENGTHORINVALIDFORMAT;\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               diagResponseCode = DCM_E_INCORRECTMESSAGELENGTHORINVALIDFORMAT;\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       diagResponseCode = DCM_E_REQUESTOUTOFRANGE;  /*UDS_REQ_0x23_10*/\r
+               }\r
+       }\r
+       else\r
+       {\r
+               diagResponseCode = DCM_E_INCORRECTMESSAGELENGTHORINVALIDFORMAT;\r
+       }\r
+\r
+       if(DCM_E_POSITIVERESPONSE == diagResponseCode)\r
+       {\r
+               pduTxData->SduLength = SID_LEN + ALFID_LEN + addressFormat + sizeFormat;\r
+               pduTxData->SduDataPtr[ALFID_INDEX] = pduRxData->SduDataPtr[ALFID_INDEX];\r
+               for(i = 0; i < addressFormat + sizeFormat; i++)\r
+               {\r
+                       pduTxData->SduDataPtr[ADDR_START_INDEX + i] = pduRxData->SduDataPtr[ADDR_START_INDEX + i];\r
+                       if(OpStatus != DCM_WRITE_PENDING)\r
+                       {\r
+                               DsdDspProcessingDone(diagResponseCode);\r
+                       }\r
+                       else\r
+                       {\r
+                       dspMemoryState=DCM_MEMORY_WRITE;\r
+                       }\r
+               }\r
+       }\r
+       else\r
+       {\r
+               DsdDspProcessingDone(diagResponseCode);\r
+       }\r
+}\r
+\r
+/*@req Dcm442,DCM492*/\r
+void DspUdsReadMemoryByAddress(const PduInfoType *pduRxData, PduInfoType *pduTxData)\r
+{\r
+       Dcm_NegativeResponseCodeType diagResponseCode;\r
+       uint8 sizeFormat;\r
+       uint8 addressFormat;\r
+       uint32 memoryAddress = 0;\r
+       uint32 length = 0;\r
+       uint8 i;\r
+       uint8 memoryIdentifier = 0; /* Should be 0 if DcmDspUseMemoryId == FALSE */\r
+       Dcm_OpStatusType OpStatus;\r
+       uint8 addressOffset;\r
+\r
+       if( pduRxData->SduLength > ALFID_INDEX )\r
+       {\r
+               sizeFormat = ((uint8)(pduRxData->SduDataPtr[ALFID_INDEX] & DCM_FORMAT_HIGH_MASK)) >> 4; /*@req UDS_REQ_0x23_1 & UDS_REQ_0x23_5*/;\r
+               addressFormat = ((uint8)(pduRxData->SduDataPtr[ALFID_INDEX])) & DCM_FORMAT_LOW_MASK;   /*@req UDS_REQ_0x23_1 & UDS_REQ_0x23_5*/;\r
+               if((addressFormat != 0) && (sizeFormat != 0))\r
+               {\r
+                       if(addressFormat + sizeFormat + SID_LEN + ALFID_LEN == pduRxData->SduLength)\r
+                       {\r
+                               if( TRUE == DCM_Config.Dsp->DspMemory->DcmDspUseMemoryId ) {\r
+                                       memoryIdentifier = pduRxData->SduDataPtr[ADDR_START_INDEX];\r
+                                       addressOffset = 1;\r
+                               }\r
+                               else {\r
+                                       addressOffset = 0;\r
+                               }\r
+\r
+                               /* Parse address */\r
+                               for(i = addressOffset; i < addressFormat; i++)\r
+                               {\r
+                                       memoryAddress <<= 8;\r
+                                       memoryAddress += (uint32)(pduRxData->SduDataPtr[ADDR_START_INDEX + i]);\r
+                               }\r
+\r
+                               /* Parse size */\r
+                               for(i = 0; i < sizeFormat; i++)\r
+                               {\r
+                                       length <<= 8;\r
+                                       length += (uint32)(pduRxData->SduDataPtr[ADDR_START_INDEX + addressFormat + i]);\r
+                               }\r
+\r
+                               if(length <= (DCM_PROTOCAL_TP_MAX_LENGTH - SID_LEN) )\r
+                               {\r
+                                       diagResponseCode = checkAddressRange(DCM_READ_MEMORY, memoryIdentifier, memoryAddress, length);\r
+                                       if( DCM_E_POSITIVERESPONSE == diagResponseCode )\r
+                                       {\r
+                                               diagResponseCode = readMemoryData(&OpStatus, memoryIdentifier, memoryAddress, length, pduTxData);\r
+                                       }\r
+                               }\r
+                               else {\r
+                                       diagResponseCode = DCM_E_REQUESTOUTOFRANGE;\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               diagResponseCode = DCM_E_INCORRECTMESSAGELENGTHORINVALIDFORMAT;\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       diagResponseCode = DCM_E_REQUESTOUTOFRANGE;  /*UDS_REQ_0x23_10*/\r
+               }\r
+       }\r
+       else\r
+       {\r
+               diagResponseCode = DCM_E_INCORRECTMESSAGELENGTHORINVALIDFORMAT;\r
+       }\r
+\r
+       if(DCM_E_POSITIVERESPONSE == diagResponseCode)\r
+       {\r
+               pduTxData->SduLength = SID_LEN + length;\r
+               if(OpStatus == DCM_READ_PENDING)\r
+               {\r
+                       dspMemoryState = DCM_MEMORY_READ;\r
+               }\r
+               else\r
+               {\r
+                       DsdDspProcessingDone(DCM_E_POSITIVERESPONSE);\r
+               }\r
+       }\r
+       else\r
+       {\r
+               DsdDspProcessingDone(diagResponseCode);\r
+       }\r
+}\r
+\r
+static Dcm_NegativeResponseCodeType writeMemoryData(Dcm_OpStatusType* OpStatus,\r
+                                                                                               uint8 memoryIdentifier,\r
+                                                                                               uint32 MemoryAddress,\r
+                                                                                               uint32 MemorySize,\r
+                                                                                               uint8 *SourceData)\r
+{\r
+       Dcm_NegativeResponseCodeType responseCode = DCM_E_POSITIVERESPONSE;\r
+       Dcm_ReturnWriteMemoryType writeRet;\r
+       writeRet = Dcm_WriteMemory(*OpStatus,\r
+                                                               memoryIdentifier,\r
+                                                               MemoryAddress,\r
+                                                               MemorySize,\r
+                                                               SourceData);\r
+       if(DCM_READ_FAILED == writeRet)\r
+       {\r
+               responseCode = DCM_E_GENERALPROGRAMMINGFAILURE;   /*@req UDS_REQ_0X3D_16,DCM643*/\r
+       }\r
+       else if(DCM_WRITE_PENDING == writeRet)\r
+       {\r
+               *OpStatus = DCM_PENDING;\r
+       }\r
+       else\r
+       {\r
+               responseCode = DCM_E_POSITIVERESPONSE;\r
+       }\r
+       \r
+       return responseCode;\r
+}\r
+\r
+static boolean checkPeriodicIdentifierBuffer(uint8 PeriodicDid,uint8 Length,uint8 *postion)\r
+{\r
+       uint8 i;\r
+       boolean ret = FALSE;\r
+       for(i = 0;(i < Length) && (ret == FALSE);i++)\r
+       {\r
+               if(PeriodicDid == dspPDidRef.dspPDid[i].PeriodicDid)\r
+               {\r
+                       ret = TRUE;\r
+                       *postion = i;\r
+               }\r
+       }\r
+       \r
+       return ret;\r
+}\r
+\r
+static void ClearPeriodicIdentifierBuffer(uint8 BufferEnd,uint8 postion)\r
+{\r
+       dspPDidRef.dspPDid[postion].PeriodicDid = dspPDidRef.dspPDid[BufferEnd ].PeriodicDid;\r
+       dspPDidRef.dspPDid[postion].PDidTxCounter = dspPDidRef.dspPDid[BufferEnd].PDidTxCounter;\r
+       dspPDidRef.dspPDid[postion].PDidTxCounterNumber = dspPDidRef.dspPDid[BufferEnd].PDidTxCounterNumber;\r
+       dspPDidRef.dspPDid[BufferEnd].PeriodicDid = 0;\r
+       dspPDidRef.dspPDid[BufferEnd].PDidTxCounter = 0;\r
+       dspPDidRef.dspPDid[BufferEnd ].PDidTxCounterNumber = 0;\r
+}\r
+\r
+static Dcm_NegativeResponseCodeType readPeriodDidData(const Dcm_DspDidType *PDidPtr, uint8 *Data,uint16 *Length)\r
+{\r
+       Dcm_NegativeResponseCodeType responseCode = DCM_E_POSITIVERESPONSE;\r
+       if ((PDidPtr->DspDidInfoRef->DspDidAccess.DspDidRead != NULL) \r
+               && (PDidPtr->DspDidConditionCheckReadFnc != NULL) \r
+               && (PDidPtr->DspDidReadDataFnc != NULL) ) \r
+       {       \r
+               if (DspCheckSessionLevel(PDidPtr->DspDidInfoRef->DspDidAccess.DspDidRead->DspDidReadSessionRef)) \r
+               { \r
+                       if (DspCheckSecurityLevel(PDidPtr->DspDidInfoRef->DspDidAccess.DspDidRead->DspDidReadSecurityLevelRef)) \r
+                       {\r
+                               Std_ReturnType result = E_NOT_OK;\r
+                               Dcm_NegativeResponseCodeType errorCode = DCM_E_POSITIVERESPONSE;\r
+                               result = PDidPtr->DspDidConditionCheckReadFnc(&errorCode);\r
+                               if ((result == E_OK) && (errorCode == DCM_E_POSITIVERESPONSE))\r
+                               {\r
+                                       result = E_NOT_OK;\r
+                                       if (PDidPtr->DspDidInfoRef->DspDidFixedLength)\r
+                                       {       \r
+                                               *Length= PDidPtr->DspDidSize;\r
+                                               result = E_OK;\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               if(PDidPtr->DspDidReadDataLengthFnc!=NULL)\r
+                                               {\r
+                                                       result = PDidPtr->DspDidReadDataLengthFnc(Length);\r
+                                               }\r
+                                               else\r
+                                               {\r
+                                                       responseCode = DCM_E_GENERALREJECT;\r
+                                               }\r
+                                       }\r
+                                       if (result == E_OK) \r
+                                       {\r
+                                               result = PDidPtr->DspDidReadDataFnc(Data);\r
+                                               if (result != E_OK)\r
+                                               {\r
+                                                       responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+                                               }\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+                                       }\r
+                               }\r
+                               else\r
+                               {\r
+                                       responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               responseCode = DCM_E_SECUTITYACCESSDENIED;\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+               }\r
+       }\r
+       else\r
+       {\r
+               responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+       }\r
+       return responseCode;\r
+}\r
+\r
+static Dcm_NegativeResponseCodeType DspSavePeriodicData(uint16 didNr, uint32 periodicTransmitCounter,uint8 PdidBufferNr)\r
+{\r
+       Dcm_NegativeResponseCodeType responseCode = DCM_E_POSITIVERESPONSE;\r
+       const Dcm_DspDidType *SourceDid = NULL;\r
+       Dcm_DspDDDType *DDidPtr = NULL;\r
+\r
+       if (TRUE == lookupDid(didNr, &SourceDid))\r
+       {\r
+               if(DspCheckSessionLevel(SourceDid->DspDidInfoRef->DspDidAccess.DspDidRead->DspDidReadSessionRef) == TRUE)\r
+               {\r
+                       if(DspCheckSecurityLevel(SourceDid->DspDidInfoRef->DspDidAccess.DspDidRead->DspDidReadSecurityLevelRef) == TRUE)\r
+                       {\r
+                               Std_ReturnType result = E_NOT_OK;\r
+                               Dcm_NegativeResponseCodeType errorCode = DCM_E_POSITIVERESPONSE;\r
+                               \r
+                               if(SourceDid->DspDidConditionCheckReadFnc != NULL)\r
+                               {\r
+                                       result = SourceDid->DspDidConditionCheckReadFnc(&errorCode);\r
+                               }\r
+                               if ((result != E_OK) || (errorCode != DCM_E_POSITIVERESPONSE))\r
+                               {\r
+                                       responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+                               }\r
+                               if((SourceDid->DspDidInfoRef->DspDidFixedLength!=TRUE) && (SourceDid->DspDidReadDataLengthFnc == NULL))\r
+                               {\r
+                                       responseCode = DCM_E_GENERALREJECT;\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               responseCode = DCM_E_SECUTITYACCESSDENIED;\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+               }\r
+       }\r
+       else if(LookupDDD(didNr, (const Dcm_DspDDDType **)&DDidPtr) == TRUE)\r
+       {\r
+               responseCode = DCM_E_POSITIVERESPONSE;\r
+       }\r
+       else\r
+       {\r
+               responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+       }\r
+       if(responseCode == DCM_E_POSITIVERESPONSE)\r
+       {\r
+               dspPDidRef.dspPDid[PdidBufferNr].PeriodicDid = (uint8)didNr & DCM_DID_LOW_MASK;\r
+               dspPDidRef.dspPDid[PdidBufferNr].PDidTxCounter = 0;\r
+               dspPDidRef.dspPDid[PdidBufferNr].PDidTxCounterNumber = periodicTransmitCounter;\r
+       }\r
+       return responseCode;\r
+}\r
+static void ClearPeriodicIdentifier(const PduInfoType *pduRxData,PduInfoType *pduTxData )\r
+{\r
+       uint16 PdidNumber;\r
+       uint8 PDidLowByte;\r
+       uint8 PdidPostion;\r
+       uint8 i;\r
+       if( pduRxData->SduDataPtr[1] == DCM_PERIODICTRANSMIT_STOPSENDING_MODE )\r
+       {\r
+               PdidNumber = pduRxData->SduLength - 2;\r
+               for(i = 0;i < PdidNumber;i++)\r
+               {\r
+                       PDidLowByte = pduRxData->SduDataPtr[2];\r
+                       if(checkPeriodicIdentifierBuffer(PDidLowByte,dspPDidRef.PDidNr,&PdidPostion) == TRUE)\r
+                       {\r
+                               dspPDidRef.PDidNr--;\r
+                               ClearPeriodicIdentifierBuffer(dspPDidRef.PDidNr, PdidPostion);\r
+                               \r
+                       }               \r
+               }\r
+               pduTxData->SduLength = 1;\r
+       }\r
+}\r
+/*\r
+       DESCRIPTION:\r
+                UDS Service 0x2a - Read Data By Periodic Identifier\r
+*/\r
+void DspReadDataByPeriodicIdentifier(const PduInfoType *pduRxData,PduInfoType *pduTxData)\r
+{\r
+       /** @req DCM254 */\r
+       uint8 PDidLowByte;\r
+       uint16 PdidNumber;\r
+       uint8 PdidPostion;\r
+       uint16 i;\r
+       uint8 PdidBufferNr;\r
+       uint32 periodicTransmitCounter;\r
+       uint16 DataLength;\r
+       Dcm_NegativeResponseCodeType responseCode = DCM_E_POSITIVERESPONSE;\r
+       const Dcm_DspDidType *PDidPtr = NULL;\r
+       Dcm_DspDDDType *DDidPtr = NULL;\r
+       PdidBufferNr = dspPDidRef.PDidNr;\r
+       if(pduRxData->SduLength > 2)\r
+       {\r
+               \r
+               switch(pduRxData->SduDataPtr[1])\r
+               {\r
+                       case DCM_PERIODICTRANSMIT_DEFAULT_MODE:\r
+                               periodicTransmitCounter = 0;\r
+                               break;\r
+                       case DCM_PERIODICTRANSMIT_SLOWRATE_MODE:\r
+                               periodicTransmitCounter = DCM_PERIODICTRANSMIT_SLOW;\r
+                               break;\r
+                               case DCM_PERIODICTRANSMIT_MEDIUM_MODE:\r
+                                       periodicTransmitCounter = DCM_PERIODICTRANSMIT_MEDIUM;\r
+                               break;\r
+                       case DCM_PERIODICTRANSMIT_FAST_MODE:\r
+                               periodicTransmitCounter = DCM_PERIODICTRANSMIT_FAST;\r
+                               break;\r
+                       case DCM_PERIODICTRANSMIT_STOPSENDING_MODE:\r
+                               ClearPeriodicIdentifier(pduRxData,pduTxData);\r
+                               break;\r
+                       default:\r
+                               responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+                               break;\r
+               }\r
+               if((pduRxData->SduDataPtr[1] != DCM_PERIODICTRANSMIT_STOPSENDING_MODE) && responseCode == DCM_E_POSITIVERESPONSE)\r
+               {\r
+                       PdidNumber = pduRxData->SduLength - 2;\r
+                       if(1 == PdidNumber)\r
+                       {\r
+                               PDidLowByte = pduRxData->SduDataPtr[2];                 \r
+                               if(checkPeriodicIdentifierBuffer(PDidLowByte,dspPDidRef.PDidNr,&PdidPostion) == TRUE)\r
+                               {\r
+                                       if(0 == periodicTransmitCounter)\r
+                                       {\r
+                                               if (TRUE == lookupDid(((uint16)PDidLowByte + 0xF200), &PDidPtr))   /*UDS_REQ_0x2A_1*/\r
+                                               {\r
+                                                       pduTxData->SduDataPtr[1] = PDidLowByte; \r
+                                                       responseCode = readPeriodDidData(PDidPtr,&pduTxData->SduDataPtr[2],&DataLength);\r
+                                                       pduTxData->SduLength = DataLength + 2;\r
+                                               }\r
+                                               else if(TRUE == LookupDDD((0xF200 + (uint16)PDidLowByte), (const Dcm_DspDDDType **)&DDidPtr))\r
+                                               {\r
+                                                       pduTxData->SduDataPtr[1] = PDidLowByte;\r
+                                                       responseCode = readDDDData(DDidPtr,&pduTxData->SduDataPtr[2],&DataLength);\r
+                                                       pduTxData->SduLength = DataLength + 2;\r
+                                               }\r
+                                               else\r
+                                               {\r
+                                                       responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+                                               }\r
+                                               if(responseCode != DCM_E_POSITIVERESPONSE)\r
+                                               {\r
+                                                       dspPDidRef.PDidNr--;\r
+                                                       ClearPeriodicIdentifierBuffer(dspPDidRef.PDidNr,PdidPostion);\r
+                                               }\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               dspPDidRef.dspPDid[PdidPostion].PDidTxCounterNumber = periodicTransmitCounter;\r
+                                               pduTxData->SduLength = 1;\r
+                                       }\r
+                               }\r
+                               else\r
+                               {       \r
+                                       responseCode = DspSavePeriodicData((DCM_PERODICDID_HIHG_MASK + (uint16)PDidLowByte),periodicTransmitCounter,PdidBufferNr);\r
+                                       PdidBufferNr++;\r
+                                       pduTxData->SduLength = 1;\r
+                               }\r
+                       }\r
+                       else if(((PdidNumber + PdidBufferNr) <= DCM_LIMITNUMBER_PERIODDATA) && (responseCode == DCM_E_POSITIVERESPONSE))        /*UDS_REQ_0x2A_6*/\r
+                       {       \r
+                               for(i = 0;(i < PdidNumber)&&(responseCode == DCM_E_POSITIVERESPONSE);i++)\r
+                               {\r
+                                       PDidLowByte = pduRxData->SduDataPtr[2 + i];\r
+                                       if(checkPeriodicIdentifierBuffer(PDidLowByte,PdidBufferNr,&PdidPostion) == TRUE)\r
+                                       {\r
+                                               if(dspPDidRef.dspPDid[PdidPostion].PDidTxCounterNumber != periodicTransmitCounter)\r
+                                               {\r
+                                                       dspPDidRef.dspPDid[PdidPostion].PDidTxCounterNumber = periodicTransmitCounter;\r
+                                               }\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               responseCode = DspSavePeriodicData((0xF200 + (uint16)PDidLowByte),periodicTransmitCounter,PdidBufferNr);\r
+                                               PdidBufferNr++;\r
+                                       }\r
+                                               pduTxData->SduLength = 1;\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+                       }\r
+                       if(responseCode == DCM_E_POSITIVERESPONSE)\r
+                       {                                       \r
+                               dspPDidRef.PDidNr = PdidBufferNr;                               \r
+                       }\r
+               }                                                       \r
+       }\r
+       else if((pduRxData->SduLength == 2)&&(pduRxData->SduDataPtr[1] == DCM_PERIODICTRANSMIT_STOPSENDING_MODE))\r
+       {\r
+               memset(&dspPDidRef,0,sizeof(dspPDidRef));\r
+               pduTxData->SduLength = 1;\r
+       }\r
+       else\r
+       {\r
+               responseCode = DCM_E_INCORRECTMESSAGELENGTHORINVALIDFORMAT;\r
+       }\r
+       DsdDspProcessingDone(responseCode);\r
+}\r
+\r
+static Dcm_NegativeResponseCodeType dynamicallyDefineDataIdentifierbyDid(uint16 DDIdentifier,const PduInfoType *pduRxData,PduInfoType *pduTxData)\r
+{\r
+       uint8 i;\r
+       uint16 SourceDidNr;\r
+       const Dcm_DspDidType *SourceDid = NULL;\r
+       Dcm_DspDDDType *DDid = NULL;\r
+       uint16 SourceLength = 0;\r
+       uint16 DidLength = 0;\r
+       uint16 Length = 0;\r
+       uint8 Num = 0;\r
+       Dcm_NegativeResponseCodeType responseCode = DCM_E_POSITIVERESPONSE;\r
+\r
+       if(FALSE == LookupDDD(DDIdentifier, (const Dcm_DspDDDType **)&DDid))\r
+       {\r
+               while((Num < DCM_MAX_DDD_NUMBER) && (dspDDD[Num].DynamicallyDid != 0 ))\r
+               {\r
+                       Num++;\r
+               }\r
+               if(Num >= DCM_MAX_DDD_NUMBER)\r
+               {\r
+                       responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+               }\r
+               else\r
+               {\r
+                       DDid = &dspDDD[Num];\r
+               }\r
+       }\r
+       else\r
+       {\r
+               while((SourceLength < DCM_MAX_DDDSOURCE_NUMBER) && (DDid->DDDSource[SourceLength].formatOrPosition != 0 ))\r
+               {\r
+                       SourceLength++;\r
+               }\r
+               if(SourceLength > DCM_MAX_DDDSOURCE_NUMBER)\r
+               {\r
+                       responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+               }\r
+       }\r
+       if(responseCode == DCM_E_POSITIVERESPONSE)\r
+       {\r
+               Length = (pduRxData->SduLength - SID_AND_ALFID_LEN4) /SID_AND_ALFID_LEN4;\r
+               if(((Length*SID_AND_ALFID_LEN4) == (pduRxData->SduLength - SID_AND_ALFID_LEN4)) && (Length != 0))\r
+               {\r
+                       if((Length + SourceLength) <= DCM_MAX_DDDSOURCE_NUMBER)\r
+                       {\r
+                               for(i = 0;(i < Length) && (responseCode == DCM_E_POSITIVERESPONSE);i++)\r
+                               {\r
+                                       SourceDidNr = (((uint16)pduRxData->SduDataPtr[SID_AND_ALFID_LEN4 + i*SID_AND_ALFID_LEN4] << 8) & DCM_DID_HIGH_MASK) + (((uint16)pduRxData->SduDataPtr[(5 + i*SID_AND_ALFID_LEN4)]) & DCM_DID_LOW_MASK);\r
+                                       if(TRUE == lookupDid(SourceDidNr, &SourceDid))/*UDS_REQ_0x2C_4*/\r
+                                       {       \r
+                                               if(DspCheckSessionLevel(SourceDid->DspDidInfoRef->DspDidAccess.DspDidRead->DspDidReadSessionRef))\r
+                                               {\r
+                                                       if(DspCheckSecurityLevel(SourceDid->DspDidInfoRef->DspDidAccess.DspDidRead->DspDidReadSecurityLevelRef))\r
+                                                       {\r
+                                                               if(SourceDid->DspDidInfoRef->DspDidFixedLength == TRUE)\r
+                                                               {\r
+                                                                       DidLength = SourceDid->DspDidSize;\r
+                                                               }\r
+                                                               else\r
+                                                               {\r
+                                                                       if(     SourceDid->DspDidReadDataLengthFnc != NULL)\r
+                                                                       {\r
+                                                                               SourceDid->DspDidReadDataLengthFnc(&DidLength);\r
+                                                                       }\r
+                                                               }\r
+                                                               if(DidLength != 0)\r
+                                                               {\r
+                                                                       if((pduRxData->SduDataPtr[SID_AND_ALFID_LEN6 + i*SID_AND_ALFID_LEN4] != 0) &&\r
+                                                                               (pduRxData->SduDataPtr[SID_AND_ALFID_LEN7 + i*SID_AND_ALFID_LEN4] != 0) &&\r
+                                                                               (((uint16)pduRxData->SduDataPtr[SID_AND_ALFID_LEN6 + i*SID_AND_ALFID_LEN4] + (uint16)pduRxData->SduDataPtr[SID_AND_ALFID_LEN7 + i*SID_AND_ALFID_LEN4] - 1) <= DidLength))\r
+                                                                       {\r
+                                                                               DDid->DDDSource[i + SourceLength].formatOrPosition = pduRxData->SduDataPtr[SID_AND_ALFID_LEN6 + i*SID_AND_ALFID_LEN4];\r
+                                                                               DDid->DDDSource[i + SourceLength].Size = pduRxData->SduDataPtr[SID_AND_ALFID_LEN7 + i*SID_AND_ALFID_LEN4];\r
+                                                                               DDid->DDDSource[i + SourceLength].SourceAddressOrDid = SourceDid->DspDidIdentifier;\r
+                                                                               DDid->DDDSource[i + SourceLength].DDDTpyeID = DCM_DDD_SOURCE_DID;\r
+                                                                       }\r
+                                                                       else\r
+                                                                       {\r
+                                                                               /*UDS_REQ_0x2C_6*/\r
+                                                                               responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+                                                                       }\r
+                                                                       \r
+                                                               }\r
+                                                               else\r
+                                                               {\r
+                                                                       /*UDS_REQ_0x2C_14*/\r
+                                                                       responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+                                                               }\r
+                                                       }\r
+                                                       else\r
+                                                       {\r
+                                                               responseCode = DCM_E_SECUTITYACCESSDENIED;\r
+                                                       }\r
+                                               }\r
+                                               else\r
+                                               {\r
+                                                       /*UDS_REQ_0x2C_19,DCM726*/\r
+                                                       responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+                                               }\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               /*DCM725*/\r
+                                               responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+                                       }\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               /*UDS_REQ_0x2C_13*/\r
+                               responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       /*UDS_REQ_0x2C_11*/\r
+                       responseCode = DCM_E_INCORRECTMESSAGELENGTHORINVALIDFORMAT;\r
+               }\r
+               if(responseCode == DCM_E_POSITIVERESPONSE)\r
+               {\r
+                       DDid->DynamicallyDid = DDIdentifier;\r
+                       pduTxData->SduDataPtr[1] = DCM_DDD_SUBFUNCTION_DEFINEBYDID;\r
+               }\r
+       }\r
+       if(responseCode == DCM_E_POSITIVERESPONSE)\r
+       {\r
+               pduTxData->SduDataPtr[1] = DCM_DDD_SUBFUNCTION_DEFINEBYDID;\r
+       }\r
+       \r
+       return responseCode;\r
+}\r
+\r
+static Dcm_NegativeResponseCodeType dynamicallyDefineDataIdentifierbyAddress(uint16 DDIdentifier,const PduInfoType *pduRxData,PduInfoType *pduTxData)\r
+{\r
+       uint16 numNewDefinitions;\r
+       uint16 numEarlierDefinitions = 0;\r
+       Dcm_DspDDDType *DDid = NULL;\r
+       uint8 Num = 0;\r
+       uint8 definitionIndex;\r
+       Dcm_NegativeResponseCodeType diagResponseCode = DCM_E_POSITIVERESPONSE;\r
+       uint8 sizeFormat;\r
+       uint8 addressFormat;\r
+       uint32 memoryAddress = 0;\r
+       uint32 length = 0;\r
+       uint8 i;\r
+       uint8 memoryIdentifier = 0; /* Should be 0 if DcmDspUseMemoryId == FALSE */\r
+       uint8 addressOffset;\r
+       \r
+       if(FALSE == LookupDDD(DDIdentifier, (const Dcm_DspDDDType **)&DDid))\r
+       {\r
+               while((Num < DCM_MAX_DDD_NUMBER) && (dspDDD[Num].DynamicallyDid != 0 ))\r
+               {\r
+                       Num++;\r
+               }\r
+               if(Num >= DCM_MAX_DDD_NUMBER)\r
+               {\r
+                       diagResponseCode = DCM_E_REQUESTOUTOFRANGE;\r
+               }\r
+               else\r
+               {\r
+                       DDid = &dspDDD[Num];\r
+               }\r
+       }\r
+       else\r
+       {\r
+               while((numEarlierDefinitions < DCM_MAX_DDDSOURCE_NUMBER) && (DDid->DDDSource[numEarlierDefinitions].formatOrPosition != 0 ))\r
+               {\r
+                       numEarlierDefinitions++;\r
+               }\r
+               if(numEarlierDefinitions >= DCM_MAX_DDDSOURCE_NUMBER)\r
+               {\r
+                       diagResponseCode = DCM_E_REQUESTOUTOFRANGE;\r
+               }\r
+       }\r
+\r
+       if( diagResponseCode == DCM_E_POSITIVERESPONSE )\r
+       {\r
+               if( pduRxData->SduLength > DYNDEF_ALFID_INDEX )\r
+               {\r
+                       sizeFormat = ((uint8)(pduRxData->SduDataPtr[DYNDEF_ALFID_INDEX] & DCM_FORMAT_HIGH_MASK)) >> 4;  /*@req UDS_REQ_0x23_1 & UDS_REQ_0x23_5*/;\r
+                       addressFormat = ((uint8)(pduRxData->SduDataPtr[DYNDEF_ALFID_INDEX])) & DCM_FORMAT_LOW_MASK;   /*@req UDS_REQ_0x23_1 & UDS_REQ_0x23_5*/;\r
+                       if((addressFormat != 0) && (sizeFormat != 0))\r
+                       {\r
+                               numNewDefinitions = (pduRxData->SduLength - (SID_LEN + SF_LEN + DDDDI_LEN + ALFID_LEN) ) / (sizeFormat + addressFormat);\r
+                               if( (numNewDefinitions != 0) &&\r
+                                       ((SID_LEN + SF_LEN + DDDDI_LEN + ALFID_LEN + numNewDefinitions * (sizeFormat + addressFormat)) == pduRxData->SduLength) )\r
+                               {\r
+                                       if( (numEarlierDefinitions+numNewDefinitions) <= DCM_MAX_DDDSOURCE_NUMBER )\r
+                                       {\r
+                                               for( definitionIndex = 0; (definitionIndex < numNewDefinitions) && (diagResponseCode == DCM_E_POSITIVERESPONSE); definitionIndex++ )\r
+                                               {\r
+\r
+                                                       if( TRUE == DCM_Config.Dsp->DspMemory->DcmDspUseMemoryId ) {\r
+                                                               memoryIdentifier = pduRxData->SduDataPtr[DYNDEF_ADDRESS_START_INDEX + definitionIndex * (sizeFormat + addressFormat)];\r
+                                                               addressOffset = 1;\r
+                                                       }\r
+                                                       else {\r
+                                                               addressOffset = 0;\r
+                                                       }\r
+\r
+                                                       /* Parse address */\r
+                                                       memoryAddress = 0;\r
+                                                       for(i = addressOffset; i < addressFormat; i++)\r
+                                                       {\r
+                                                               memoryAddress <<= 8;\r
+                                                               memoryAddress += (uint32)(pduRxData->SduDataPtr[DYNDEF_ADDRESS_START_INDEX + definitionIndex * (sizeFormat + addressFormat) + i]);\r
+                                                       }\r
+\r
+                                                       /* Parse size */\r
+                                                       length = 0;\r
+                                                       for(i = 0; i < sizeFormat; i++)\r
+                                                       {\r
+                                                               length <<= 8;\r
+                                                               length += (uint32)(pduRxData->SduDataPtr[DYNDEF_ADDRESS_START_INDEX + definitionIndex * (sizeFormat + addressFormat) + addressFormat + i]);\r
+                                                       }\r
+\r
+                                                       diagResponseCode = checkAddressRange(DCM_READ_MEMORY, memoryIdentifier, memoryAddress, length);\r
+                                                       if( DCM_E_POSITIVERESPONSE == diagResponseCode )\r
+                                                       {\r
+                                                               DDid->DDDSource[definitionIndex + numEarlierDefinitions].formatOrPosition = pduRxData->SduDataPtr[DYNDEF_ALFID_INDEX];\r
+                                                               DDid->DDDSource[definitionIndex + numEarlierDefinitions].memoryIdentifier = memoryIdentifier;\r
+                                                               DDid->DDDSource[definitionIndex + numEarlierDefinitions].SourceAddressOrDid = memoryAddress;\r
+                                                               DDid->DDDSource[definitionIndex + numEarlierDefinitions].Size = length;\r
+                                                               DDid->DDDSource[definitionIndex + numEarlierDefinitions].DDDTpyeID = DCM_DDD_SOURCE_ADDRESS;\r
+                                                       }\r
+                                               }\r
+                                               if(diagResponseCode == DCM_E_POSITIVERESPONSE)\r
+                                               {\r
+                                                       DDid->DynamicallyDid = DDIdentifier;\r
+                                               }\r
+                                               else\r
+                                               {\r
+                                                       for( definitionIndex = 0; (definitionIndex < numNewDefinitions); definitionIndex++ )\r
+                                                       {\r
+                                                               DDid->DDDSource[definitionIndex + numEarlierDefinitions].formatOrPosition = 0x00;\r
+                                                               DDid->DDDSource[definitionIndex + numEarlierDefinitions].memoryIdentifier = 0x00;\r
+                                                               DDid->DDDSource[definitionIndex + numEarlierDefinitions].SourceAddressOrDid = 0x00000000;\r
+                                                               DDid->DDDSource[definitionIndex + numEarlierDefinitions].Size = 0x0000;\r
+                                                               DDid->DDDSource[definitionIndex + numEarlierDefinitions].DDDTpyeID = DCM_DDD_SOURCE_DEFAULT;\r
+                                                       }\r
+                                               }\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               diagResponseCode = DCM_E_REQUESTOUTOFRANGE;\r
+                                       }\r
+                               }\r
+                               else\r
+                               {\r
+                                       diagResponseCode = DCM_E_INCORRECTMESSAGELENGTHORINVALIDFORMAT;\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               diagResponseCode = DCM_E_REQUESTOUTOFRANGE;  /*UDS_REQ_0x23_10*/\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       diagResponseCode = DCM_E_INCORRECTMESSAGELENGTHORINVALIDFORMAT;\r
+               }\r
+       }\r
+\r
+\r
+       if(diagResponseCode == DCM_E_POSITIVERESPONSE)\r
+       {\r
+               pduTxData->SduDataPtr[SF_INDEX] = DCM_DDD_SUBFUNCTION_DEFINEBYADDRESS;\r
+       }\r
+       \r
+       return diagResponseCode;\r
+}\r
+\r
+\r
+/*\r
+       DESCRIPTION:\r
+                UDS Service 0x2c - Clear dynamically Did\r
+*/\r
+static Dcm_NegativeResponseCodeType CleardynamicallyDid(uint16 DDIdentifier,const PduInfoType *pduRxData, PduInfoType * pduTxData)\r
+{\r
+       /*UDS_REQ_0x2C_5*/\r
+       sint8 i, j;\r
+       uint8 position;\r
+       Dcm_DspDDDType *DDid = NULL;\r
+       Dcm_NegativeResponseCodeType responseCode = DCM_E_POSITIVERESPONSE;\r
+       \r
+       if(pduRxData->SduLength == 4)\r
+       {\r
+               if(TRUE == LookupDDD(DDIdentifier, (const Dcm_DspDDDType **)&DDid))\r
+               {\r
+                       \r
+                       if((checkPeriodicIdentifierBuffer(pduRxData->SduDataPtr[3], dspPDidRef.PDidNr, &position) == TRUE)&&(pduRxData->SduDataPtr[2] == 0xF2))\r
+                       {\r
+                               /*UDS_REQ_0x2C_9*/\r
+                               responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+                       }\r
+                       else\r
+                       {\r
+                               memset(DDid, 0, sizeof(Dcm_DspDDDType));\r
+                               for(i = DCM_MAX_DDD_NUMBER - 1;i >= 0 ;i--) {   /* find the first DDDid from bottom */\r
+                                       if (0 != dspDDD[i].DynamicallyDid) {\r
+                                               for (j = 0; j <DCM_MAX_DDD_NUMBER; j++) { /* find the first empty slot from top */\r
+                                                       if (j >= i) {\r
+                                                               /* Rearrange finished */\r
+                                                               pduTxData->SduDataPtr[1] = DCM_DDD_SUBFUNCTION_CLEAR;\r
+                                                               pduTxData->SduLength = 2;\r
+                                                               return responseCode;\r
+                                                       }\r
+                                                       else if (0 == dspDDD[j].DynamicallyDid) {       /* find, exchange */\r
+                                                               memcpy(&dspDDD[j], &dspDDD[i], sizeof(Dcm_DspDDDType));\r
+                                                               memset(&dspDDD[i], 0, sizeof(Dcm_DspDDDType));\r
+                                                       }\r
+                                               }\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+               else{\r
+                       responseCode = DCM_E_REQUESTOUTOFRANGE; /* DDDid not found */\r
+               }\r
+       }\r
+       else if (pduRxData->SduDataPtr[1] == 0x03 && pduRxData->SduLength == 2){\r
+               /* clear all */\r
+               memset(dspDDD, 0, (sizeof(Dcm_DspDDDType) * DCM_MAX_DDD_NUMBER));\r
+       }\r
+       else\r
+       {\r
+               responseCode = DCM_E_INCORRECTMESSAGELENGTHORINVALIDFORMAT;\r
+       }\r
+       if(responseCode == DCM_E_POSITIVERESPONSE)\r
+       {\r
+               pduTxData->SduDataPtr[1] = DCM_DDD_SUBFUNCTION_CLEAR;\r
+               pduTxData->SduLength = 2;\r
+       }\r
+       \r
+       return responseCode;\r
+}\r
+\r
+void DspDynamicallyDefineDataIdentifier(const PduInfoType *pduRxData,PduInfoType *pduTxData)\r
+{\r
+       /*UDS_REQ_0x2C_1,DCM 259*/\r
+       uint16 i;\r
+       uint8 Position;\r
+       boolean PeriodicdUse = FALSE;\r
+       Dcm_NegativeResponseCodeType responseCode = DCM_E_POSITIVERESPONSE;\r
+       uint16 DDIdentifier = ((((uint16)pduRxData->SduDataPtr[2]) << 8) & DCM_DID_HIGH_MASK) + (pduRxData->SduDataPtr[3] & DCM_DID_LOW_MASK);\r
+       if(pduRxData->SduLength > 2)\r
+       {\r
+               /* Check if DDID equals 0xF2 or 0xF3 */\r
+               if((pduRxData->SduDataPtr[2] & 0xF2) == 0xF2)\r
+               {\r
+                       switch(pduRxData->SduDataPtr[1])        /*UDS_REQ_0x2C_2,DCM 646*/\r
+                       {\r
+                               case DCM_DDD_SUBFUNCTION_DEFINEBYDID:\r
+                                       responseCode  = dynamicallyDefineDataIdentifierbyDid(DDIdentifier,pduRxData,pduTxData);\r
+                                       break;\r
+                               case DCM_DDD_SUBFUNCTION_DEFINEBYADDRESS:\r
+                                       responseCode = dynamicallyDefineDataIdentifierbyAddress(DDIdentifier,pduRxData,pduTxData);\r
+                                       break;\r
+                               case DCM_DDD_SUBFUNCTION_CLEAR:\r
+                                       responseCode = CleardynamicallyDid(DDIdentifier,pduRxData,pduTxData);\r
+                                       break;\r
+                               default:\r
+                                       responseCode = DCM_E_SUBFUNCTIONNOTSUPPORTED;\r
+                                       /*UDS_REQ_0x2C_10*/\r
+                                       break;          \r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+               }\r
+               if(responseCode == DCM_E_POSITIVERESPONSE)\r
+               {\r
+                       pduTxData->SduDataPtr[2] = pduRxData->SduDataPtr[2];\r
+                       pduTxData->SduDataPtr[3] = pduRxData->SduDataPtr[3];\r
+                       pduTxData->SduLength = 4;\r
+               }\r
+       }\r
+       else if((pduRxData->SduLength == 2)&&(pduRxData->SduDataPtr[1] == DCM_DDD_SUBFUNCTION_CLEAR))\r
+       {\r
+               /*UDS_REQ_0x2C_7*/\r
+               for(i = 0;i < DCM_MAX_DDD_NUMBER;i++)\r
+               {\r
+                       if(checkPeriodicIdentifierBuffer((uint8)(dspDDD[i].DynamicallyDid & DCM_DID_LOW_MASK),dspPDidRef.PDidNr,&Position) == TRUE)\r
+                       {\r
+                               PeriodicdUse = TRUE;\r
+                       }\r
+               }\r
+               if(PeriodicdUse == FALSE)\r
+               {\r
+                       memset(dspDDD,0,sizeof(dspDDD));\r
+                       pduTxData->SduDataPtr[1] = DCM_DDD_SUBFUNCTION_CLEAR;\r
+                       pduTxData->SduLength = 2;\r
+               }\r
+               else\r
+               {\r
+                       responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+               }\r
+       }\r
+       else\r
+       {\r
+               /*UDS_REQ_0x2C_11*/\r
+               responseCode =  DCM_E_INCORRECTMESSAGELENGTHORINVALIDFORMAT;\r
+       }\r
+       DsdDspProcessingDone(responseCode);\r
+}\r
+\r
+static Dcm_NegativeResponseCodeType DspIOControlReturnControlToECU(const Dcm_DspDidType *DidPtr,const PduInfoType *pduRxData,PduInfoType *pduTxData)\r
+{\r
+       Dcm_NegativeResponseCodeType responseCode = DCM_E_POSITIVERESPONSE;\r
+       if(pduRxData->SduLength > 4)\r
+       {\r
+               if(DidPtr->DspDidInfoRef->DspDidAccess.DspDidControl != NULL)\r
+               {\r
+                       if(((DidPtr->DspDidInfoRef->DspDidAccess.DspDidControl->DspDidReturnControlToEcu->DspDidControlOptionRecordSize + 7) >> 3) == (pduRxData->SduLength - 4))\r
+                       {\r
+                               if(DidPtr->DspDidReturnControlToEcuFnc != NULL)\r
+                               {\r
+                                       DidPtr->DspDidReturnControlToEcuFnc(NULL,&pduRxData->SduDataPtr[4],&pduTxData->SduDataPtr[4],&responseCode);\r
+\r
+                               }\r
+                               else\r
+                               {\r
+                                       responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+               }\r
+       }\r
+       else\r
+       {\r
+               if(DidPtr->DspDidReturnControlToEcuFnc != NULL)\r
+               {\r
+\r
+                       if(DidPtr->DspDidControlRecordSize != NULL)\r
+                       {\r
+                               DidPtr->DspDidReturnControlToEcuFnc(NULL,NULL,&pduTxData->SduDataPtr[4],&responseCode);\r
+                               pduTxData->SduLength = DidPtr->DspDidInfoRef->DspDidAccess.DspDidControl->DspDidReturnControlToEcu->DspDidControlStatusRecordSize + 4;\r
+                       }\r
+                       else\r
+                       {\r
+                               responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+               }\r
+       }\r
+       if(responseCode == DCM_E_POSITIVERESPONSE)\r
+       {\r
+               pduTxData->SduLength = DidPtr->DspDidInfoRef->DspDidAccess.DspDidControl->DspDidReturnControlToEcu->DspDidControlStatusRecordSize + 4;\r
+               pduTxData->SduDataPtr[3] = DCM_RETURN_CONTROL_TO_ECU;\r
+       }\r
+       \r
+       return responseCode;\r
+}\r
+\r
+static Dcm_NegativeResponseCodeType DspIOControlResetToDefault(const Dcm_DspDidType *DidPtr,const PduInfoType *pduRxData,PduInfoType *pduTxData)\r
+{\r
+       Dcm_NegativeResponseCodeType responseCode = DCM_E_POSITIVERESPONSE;\r
+       if(pduRxData->SduLength > 4)\r
+       {\r
+               if(DidPtr->DspDidInfoRef->DspDidAccess.DspDidControl != NULL)\r
+               {\r
+                       if(((DidPtr->DspDidInfoRef->DspDidAccess.DspDidControl->DspDidResetToDefault->DspDidControlOptionRecordSize + 7) >> 3) == (pduRxData->SduLength - 4))\r
+                       {\r
+                               if(DidPtr->DspDidReturnControlToEcuFnc != NULL)\r
+                               {\r
+                                       DidPtr->DspDidResetToDefaultFnc(NULL,&pduRxData->SduDataPtr[4],&pduTxData->SduDataPtr[4],&responseCode);\r
+                               }\r
+                               else\r
+                               {\r
+                                       responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+               }\r
+       }\r
+       else\r
+       {\r
+               if(DidPtr->DspDidResetToDefaultFnc != NULL)\r
+               {\r
+\r
+                       if(DidPtr->DspDidControlRecordSize != NULL)\r
+                       {\r
+                               DidPtr->DspDidResetToDefaultFnc(NULL,NULL,&pduTxData->SduDataPtr[4],&responseCode);\r
+                               pduTxData->SduLength = DidPtr->DspDidInfoRef->DspDidAccess.DspDidControl->DspDidResetToDefault->DspDidControlStatusRecordSize + 4;\r
+                       }\r
+                       else\r
+                       {\r
+                               responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+               }\r
+       }\r
+       if(responseCode == DCM_E_POSITIVERESPONSE)\r
+       {\r
+               pduTxData->SduLength = DidPtr->DspDidInfoRef->DspDidAccess.DspDidControl->DspDidResetToDefault->DspDidControlStatusRecordSize+4;\r
+               pduTxData->SduDataPtr[3] = DCM_RESET_TO_DEFAULT;\r
+       }\r
+       return responseCode;\r
+}\r
+/*\r
+       DESCRIPTION:\r
+                UDS Service 0x2F -  IOControl Freeze Current State\r
+*/\r
+static Dcm_NegativeResponseCodeType DspIOControlFreezeCurrentState(const Dcm_DspDidType *DidPtr,const PduInfoType *pduRxData,PduInfoType *pduTxData)\r
+{\r
+       Dcm_NegativeResponseCodeType responseCode = DCM_E_POSITIVERESPONSE;\r
+       if(pduRxData->SduLength > 4)\r
+       {\r
+               if(DidPtr->DspDidInfoRef->DspDidAccess.DspDidControl != NULL)\r
+               {\r
+                       if(((DidPtr->DspDidInfoRef->DspDidAccess.DspDidControl->DspDidFreezeCurrentState->DspDidControlOptionRecordSize + 7) >> 3) == (pduRxData->SduLength - 4))\r
+                       {\r
+                               if(DidPtr->DspDidFreezeCurrentStateFnc != NULL)\r
+                               {\r
+                                       DidPtr->DspDidFreezeCurrentStateFnc(NULL,&pduRxData->SduDataPtr[4],&pduTxData->SduDataPtr[4],&responseCode);\r
+                               }\r
+                               else\r
+                               {\r
+                                       responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+               }\r
+       }\r
+       else\r
+       {\r
+               if(DidPtr->DspDidFreezeCurrentStateFnc != NULL)\r
+               {\r
+\r
+                       if(DidPtr->DspDidControlRecordSize != 0)\r
+                       {\r
+                               DidPtr->DspDidFreezeCurrentStateFnc(NULL,NULL,&pduTxData->SduDataPtr[4],&responseCode);\r
+                               pduTxData->SduLength = DidPtr->DspDidInfoRef->DspDidAccess.DspDidControl->DspDidFreezeCurrentState->DspDidControlStatusRecordSize + 4;\r
+                       }\r
+                       else\r
+                       {\r
+                               responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+               }\r
+       }\r
+       if(responseCode == DCM_E_POSITIVERESPONSE)\r
+       {\r
+               pduTxData->SduLength = DidPtr->DspDidInfoRef->DspDidAccess.DspDidControl->DspDidFreezeCurrentState->DspDidControlStatusRecordSize + 4;\r
+               pduTxData->SduDataPtr[3] = DCM_FREEZE_CURRENT_STATE;\r
+       }\r
+       \r
+       return responseCode;\r
+}\r
+\r
+static Dcm_NegativeResponseCodeType DspIOControlShortTeamAdjustment(const Dcm_DspDidType *DidPtr,const PduInfoType *pduRxData,PduInfoType *pduTxData)\r
+{\r
+       Dcm_NegativeResponseCodeType responseCode = DCM_E_POSITIVERESPONSE;\r
+       uint8 didControlOptionRecordSize = DidPtr->DspDidInfoRef->DspDidAccess.DspDidControl->DspDidShortTermAdjustment->DspDidControlOptionRecordSize;\r
+       if(pduRxData->SduLength > 4)\r
+       {\r
+               if(DidPtr->DspDidInfoRef->DspDidAccess.DspDidControl != NULL)\r
+               {\r
+                       if(((((DidPtr->DspDidInfoRef->DspDidAccess.DspDidControl->DspDidShortTermAdjustment->DspDidControlEnableMaskRecordSize + 7)) >> 3) + (didControlOptionRecordSize)) == (pduRxData->SduLength - 4))\r
+                       {\r
+                               if(DidPtr->DspDidShortTermAdjustmentFnc != NULL)\r
+                               {\r
+                                       DidPtr->DspDidShortTermAdjustmentFnc(&pduRxData->SduDataPtr[4],&pduRxData->SduDataPtr[4 + didControlOptionRecordSize],&pduTxData->SduDataPtr[4],&responseCode);\r
+                               }\r
+                               else\r
+                               {\r
+                                       responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+                               }\r
+                       }\r
+                       else if((didControlOptionRecordSize) == (pduRxData->SduLength - 4))\r
+                       {\r
+                               if(DidPtr->DspDidShortTermAdjustmentFnc != NULL)\r
+                               {\r
+                                       DidPtr->DspDidShortTermAdjustmentFnc(&pduRxData->SduDataPtr[4],NULL,&pduTxData->SduDataPtr[4],&responseCode);\r
+                               }\r
+                               else\r
+                               {\r
+                                       responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+               }\r
+       }\r
+       else\r
+       {\r
+               responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+       }\r
+       if(responseCode == DCM_E_POSITIVERESPONSE)\r
+       {\r
+               pduTxData->SduLength = DidPtr->DspDidInfoRef->DspDidAccess.DspDidControl->DspDidShortTermAdjustment->DspDidControlStatusRecordSize + 4;\r
+               pduTxData->SduDataPtr[3] = DCM_SHORT_TERM_ADJUSTMENT;\r
+       }\r
+       \r
+       return responseCode;\r
+}\r
+\r
+void DspIOControlByDataIdentifier(const PduInfoType *pduRxData,PduInfoType *pduTxData)\r
+{\r
+       uint16 didNr;\r
+       const Dcm_DspDidType *DidPtr = NULL;\r
+       Dcm_NegativeResponseCodeType responseCode = DCM_E_POSITIVERESPONSE;\r
+       didNr = (pduRxData->SduDataPtr[1] << 8 & DCM_DID_HIGH_MASK) + (pduRxData->SduDataPtr[2] & DCM_DID_LOW_MASK);\r
+       if(pduRxData->SduLength > 3)\r
+       {\r
+               if(TRUE == lookupDid(didNr, &DidPtr))\r
+               {\r
+                       if(FALSE == DidPtr->DspDidUsePort)\r
+                       {\r
+                               if(NULL != DidPtr->DspDidInfoRef->DspDidAccess.DspDidControl)\r
+                               {\r
+                                       if(TRUE == DspCheckSessionLevel(DidPtr->DspDidInfoRef->DspDidAccess.DspDidControl->DspDidControlSessionRef))\r
+                                       {\r
+                                               if(TRUE == DspCheckSecurityLevel(DidPtr->DspDidInfoRef->DspDidAccess.DspDidControl->DspDidControlSecurityLevelRef))\r
+                                               {\r
+                                                       switch(pduRxData->SduDataPtr[3])\r
+                                                       {\r
+                                                               case DCM_RETURN_CONTROL_TO_ECU:\r
+                                                                       responseCode = DspIOControlReturnControlToECU(DidPtr,pduRxData,pduTxData);\r
+                                                                       break;\r
+                                                               case DCM_RESET_TO_DEFAULT:\r
+                                                                       responseCode = DspIOControlResetToDefault(DidPtr,pduRxData,pduTxData);                                                          \r
+                                                                       break;\r
+                                                               case DCM_FREEZE_CURRENT_STATE:\r
+                                                                       responseCode = DspIOControlFreezeCurrentState(DidPtr,pduRxData,pduTxData);\r
+                                                                       break;\r
+                                                               case DCM_SHORT_TERM_ADJUSTMENT:\r
+                                                                       responseCode = DspIOControlShortTeamAdjustment(DidPtr,pduRxData,pduTxData);\r
+                                                                       break;\r
+                                                               default:\r
+                                                                       responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+                                                                       break;\r
+                                                               \r
+                                                       }\r
+                                               }\r
+                                               else\r
+                                               {\r
+                                                       responseCode = DCM_E_SECUTITYACCESSDENIED;\r
+                                               }\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+                                       }\r
+                               }\r
+                               else\r
+                               {\r
+                                       responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               /* if UsePort == True, NRC 0x10 */\r
+                               responseCode = DCM_E_GENERALREJECT;\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       responseCode = DCM_E_REQUESTOUTOFRANGE;\r
+               }\r
+       }\r
+       else\r
+       {\r
+               responseCode = DCM_E_INCORRECTMESSAGELENGTHORINVALIDFORMAT;\r
+       }\r
+       if(responseCode == DCM_E_POSITIVERESPONSE)\r
+       {\r
+               pduTxData->SduDataPtr[1] = pduRxData->SduDataPtr[1];\r
+               pduTxData->SduDataPtr[2] = pduRxData->SduDataPtr[2];\r
+       }\r
+       DsdDspProcessingDone(responseCode);\r
+}\r