]> rtime.felk.cvut.cz Git - arc.git/blobdiff - diagnostic/Dem/Dem.c
Merge with 3ecb6845e742978827406b7da6f77dc350e6b55b
[arc.git] / diagnostic / Dem / Dem.c
index d4454a6c31fa9a14ea318ec7aaae1c8a0fe282c0..df05bae088284651d90a42b9e4eb415ca57bdf4a 100644 (file)
  * for more details.\r
  * -------------------------------- Arctic Core ------------------------------*/\r
 \r
+// 904 PC-Lint MISRA 14.7: OK. Allow VALIDATE, VALIDATE_RV and VALIDATE_NO_RV to return value.\r
+//lint -emacro(904,VALIDATE_RV,VALIDATE_NO_RV,VALIDATE)\r
 \r
+// 522 PC-Lint exception for empty functions\r
+//lint -esym(522,storeFreezeFrameDataEvtMem)\r
+//lint -esym(522,deleteFreezeFrameDataPriMem)\r
+//lint -esym(522,storeFreezeFrameDataPreInit)\r
+//lint -esym(522,storeFreezeFrameDataPriMem)\r
+//lint -esym(522,updateFreezeFrameOccurrencePreInit)\r
+\r
+// PC-Lint misunderstanding of MISRA 8.12, 18.1: Empty arrays are OK as long as size 0 is specified.\r
+//lint -esym(85,preInitFreezeFrameBuffer)\r
+//lint -esym(85,priMemFreezeFrameBuffer)\r
+\r
+\r
+/*\r
+ *  General requirements\r
+ */\r
+/** @req DEM126 */\r
+/** @req DEM151.partially */\r
+/** @req DEM152 */\r
+/** @req DEM013.14229-1 */\r
+/** @req DEM277 */\r
+/** @req DEM363 */\r
+/** @req DEM113 */ /** @req DEM174 */\r
+/** @req DEM286 */\r
+/** @req DEM267 */\r
+/** @req DEM364 */\r
+/** @req DEM114 */\r
+/** @req DEM124 */\r
+/** @req DEM370 */\r
 \r
 \r
 \r
 #include <string.h>\r
 #include "Dem.h"\r
-#include "Det.h"\r
 //#include "Fim.h"\r
-//#include "Nvm.h"\r
+#include "NvM.h"\r
 //#include "SchM_Dem.h"\r
 #include "MemMap.h"\r
-#include "Mcu.h"\r
+#include "Cpu.h"\r
+#include "Dem_Types.h"\r
+#include "Dem_Lcfg.h"\r
 \r
+#define USE_DEBUG_PRINTF\r
+#include "debug.h"\r
 /*\r
  * Local defines\r
  */\r
 #define DEBOUNCE_FDC_TEST_FAILED  127\r
 #define DEBOUNCE_FDC_TEST_PASSED -128\r
 \r
+#if  ( DEM_DEV_ERROR_DETECT == STD_ON )\r
+#include "Det.h"\r
+/** @req DEM117 */\r
+#define VALIDATE_RV(_exp,_api,_err,_rv ) \\r
+        if( !(_exp) ) { \\r
+          Det_ReportError(MODULE_ID_DEM, 0, _api, _err); \\r
+          return _rv; \\r
+        }\r
+\r
+#define VALIDATE_NO_RV(_exp,_api,_err ) \\r
+  if( !(_exp) ) { \\r
+          Det_ReportError(MODULE_ID_DEM, 0, _api, _err); \\r
+          return; \\r
+        }\r
+#define DET_REPORTERROR(_x,_y,_z,_q) Det_ReportError(_x, _y, _z, _q)\r
+\r
+#else\r
+#define VALIDATE_RV(_exp,_api,_err,_rv )\r
+#define VALIDATE_NO_RV(_exp,_api,_err )\r
+#define DET_REPORTERROR(_x,_y,_z,_q)\r
+#endif\r
+\r
+#if (DEM_OBD_SUPPORT == STD_ON)\r
+#error "DEM_OBD_SUPPORT is set to STD_ON, this is not supported by the code."\r
+#endif\r
+\r
+#if (DEM_PTO_SUPPORT == STD_ON)\r
+#error "DEM_PTO_SUPPORT is set to STD_ON, this is not supported by the code."\r
+#endif\r
+\r
+#if (DEM_TYPE_OF_DTC_SUPPORTED != 0x01)\r
+#error "DEM_TYPE_OF_DTC_SUPPORTED is not set to 1 (ISO14229-1), only ISO14229-1 is currently supported by the code."\r
+#endif\r
+\r
+\r
 /*\r
  * Local types\r
  */\r
-\r
-typedef uint16 ChecksumType;\r
+#if !defined(USE_DCM)\r
+typedef uint8 Dcm_NegativeResponseCodeType;\r
+#define DCM_E_POSITIVERESPONSE ((Dcm_NegativeResponseCodeType)0x00)\r
+#endif\r
 \r
 // DtcFilterType\r
 typedef struct {\r
@@ -61,27 +131,19 @@ typedef struct {
        Dem_EventIdType                         eventId;\r
        const Dem_EventParameterType *eventParamRef;\r
        sint8                                           faultDetectionCounter;\r
-       uint16                                          occurrence;\r
-       Dem_EventStatusExtendedType     eventStatusExtended;\r
+       uint16                                          occurrence;                             /** @req DEM011 */\r
+       Dem_EventStatusExtendedType     eventStatusExtended;    /** @req DEM006 */\r
        boolean                                         errorStatusChanged;\r
 } EventStatusRecType;\r
 \r
-\r
 // Types for storing different event data on event memory\r
 typedef struct {\r
-       Dem_EventIdType         eventId;\r
-       uint16                          occurrence;\r
-       ChecksumType            checksum;\r
+       Dem_EventIdType                         eventId;\r
+       uint16                                          occurrence;\r
+       Dem_EventStatusExtendedType eventStatusExtended;\r
+       ChecksumType                            checksum;\r
 } EventRecType;\r
 \r
-typedef struct {\r
-       Dem_EventIdType         eventId;\r
-       uint16                          occurrence;\r
-       uint16                          dataSize;\r
-       sint8                           data[DEM_MAX_SIZE_FF_DATA];\r
-       ChecksumType            checksum;\r
-} FreezeFrameRecType;\r
-\r
 typedef struct {\r
        Dem_EventIdType         eventId;\r
        uint16                          dataSize;\r
@@ -96,7 +158,7 @@ typedef enum
   DEM_UNINITIALIZED = 0,\r
   DEM_PREINITIALIZED,\r
   DEM_INITIALIZED\r
-} Dem_StateType;\r
+} Dem_StateType; /** @req DEM169 */\r
 \r
 \r
 static Dem_StateType demState = DEM_UNINITIALIZED;\r
@@ -127,28 +189,60 @@ static EventStatusRecType eventStatusBuffer[DEM_MAX_NUMBER_EVENT];
 /*\r
  * Allocation of pre-init event memory (used between pre-init and init)\r
  */\r
+/** @req DEM207 */\r
 static FreezeFrameRecType      preInitFreezeFrameBuffer[DEM_MAX_NUMBER_FF_DATA_PRE_INIT];\r
 static ExtDataRecType          preInitExtDataBuffer[DEM_MAX_NUMBER_EXT_DATA_PRE_INIT];\r
 \r
 /*\r
  * Allocation of primary event memory ramlog (after init) in uninitialized memory\r
  */\r
-static EventRecType            priMemEventBuffer[DEM_MAX_NUMBER_EVENT_PRI_MEM] __attribute__ ((section (".dem_eventmemory_pri")));\r
-static FreezeFrameRecType      priMemFreezeFrameBuffer[DEM_MAX_NUMBER_FF_DATA_PRI_MEM] __attribute__ ((section (".dem_eventmemory_pri")));\r
-static ExtDataRecType          priMemExtDataBuffer[DEM_MAX_NUMBER_EXT_DATA_PRI_MEM] __attribute__ ((section (".dem_eventmemory_pri")));\r
+/** @req DEM162 */\r
+EventRecType                   priMemEventBuffer[DEM_MAX_NUMBER_EVENT_PRI_MEM];\r
+static FreezeFrameRecType      priMemFreezeFrameBuffer[DEM_MAX_NUMBER_FF_DATA_PRI_MEM];\r
+//FreezeFrameRecType        FreezeFrameMirrorBuffer[DEM_MAX_NUMBER_FF_DATA_PRI_MEM];\r
+extern FreezeFrameRecType*  FreezeFrameMirrorBuffer[];\r
+static ExtDataRecType          priMemExtDataBuffer[DEM_MAX_NUMBER_EXT_DATA_PRI_MEM];\r
+HealingRecType                         priMemAgingBuffer[DEM_MAX_NUMBER_AGING_PRI_MEM];\r
+extern HealingRecType                  HealingMirrorBuffer[DEM_MAX_NUMBER_AGING_PRI_MEM];\r
+\r
+/* block in NVRam, use for freezeframe */\r
+extern const NvM_BlockIdType FreezeFrameBlockId[DEM_MAX_NUMBER_FF_DATA_PRI_MEM];\r
+/* block in NVRam, use for aging */\r
+extern const NvM_BlockIdType HealingBlockId;\r
+\r
+\r
+/*\r
+*Allocation of freezeFrame storage timestamp,record the time order\r
+*/\r
+/**private variable for freezeframe */\r
+static uint32 FF_TimeStamp = 0;\r
+\r
+/*\r
+ * TRUE:       priMemFreezeFrameBuffer changed,\r
+ * FALSE:      priMemFreezeFrameBuffer not changed\r
+ */\r
+static boolean FFIsModified = FALSE;\r
 \r
+/*\r
+ * TRUE:       priMemAgingBuffer changed,\r
+ * FALSE:      priMemAgingBuffer not changed\r
+ */\r
+static boolean AgingIsModified = FALSE;\r
 \r
 /*\r
  * Procedure:  zeroPriMemBuffers\r
  * Description:        Fill the primary buffers with zeroes\r
  */\r
+//lint -save\r
+//lint -e84 //PC-Lint exception, size 0 is OK.\r
+//lint -e957   PC-Lint exception - Used only by DemTest\r
 void demZeroPriMemBuffers(void)\r
 {\r
        memset(priMemEventBuffer, 0, sizeof(priMemEventBuffer));\r
        memset(priMemFreezeFrameBuffer, 0, sizeof(priMemFreezeFrameBuffer));\r
        memset(priMemExtDataBuffer, 0, sizeof(priMemExtDataBuffer));\r
 }\r
-\r
+//lint -restore\r
 \r
 /*\r
  * Procedure:  calcChecksum\r
@@ -157,12 +251,13 @@ void demZeroPriMemBuffers(void)
 static ChecksumType calcChecksum(void *data, uint16 nrOfBytes)\r
 {\r
        uint16 i;\r
-       uint8 *ptr = (uint8*)data;\r
+       uint8 *byte = (uint8*)data;\r
        ChecksumType sum = 0;\r
 \r
-       for (i = 0; i < nrOfBytes; i++)\r
-               sum += *ptr++;\r
-       sum ^= 0xaaaa;\r
+       for (i = 0; i < nrOfBytes; i++) {\r
+               sum += byte[i];\r
+       }\r
+       sum ^= 0xaaaau;\r
        return sum;\r
 }\r
 \r
@@ -220,22 +315,26 @@ static boolean checkDtcGroup(uint32 dtc, const Dem_EventParameterType *eventPara
 static boolean checkDtcOrigin(Dem_DTCOriginType dtcOrigin, const Dem_EventParameterType *eventParam)\r
 {\r
        boolean result = FALSE;\r
+       boolean dtcOriginFound = FALSE;\r
        uint16 i;\r
 \r
-       for (i = 0; (eventParam->EventClass->EventDestination[i] != dtcOrigin) && (i < DEM_MAX_NR_OF_EVENT_DESTINATION); i++);\r
+       for (i = 0;(i < DEM_MAX_NR_OF_EVENT_DESTINATION) && (!dtcOriginFound); i++){\r
+               dtcOriginFound = (eventParam->EventClass->EventDestination[i] == dtcOrigin);\r
+       }\r
 \r
-       if (i < DEM_MAX_NR_OF_EVENT_DESTINATION) {\r
+       if (dtcOriginFound) {\r
                result = TRUE;\r
        }\r
 \r
        return result;\r
 }\r
 \r
-\r
 /*\r
  * Procedure:  checkDtcSeverityMask\r
  * Description:        Return TRUE if "dtcSeverityMask" match any of the events DTC severity otherwise FALSE.\r
  */\r
+// PC-Lint (715 etc): Remove errors until function is filled.\r
+//lint -e{715}         Symbol not referenced\r
 static boolean checkDtcSeverityMask(Dem_DTCSeverityType dtcSeverityMask, const Dem_EventParameterType *eventParam)\r
 {\r
        boolean result = TRUE;\r
@@ -250,6 +349,8 @@ static boolean checkDtcSeverityMask(Dem_DTCSeverityType dtcSeverityMask, const D
  * Procedure:  checkDtcFaultDetectionCounterMask\r
  * Description:        TBD.\r
  */\r
+// PC-Lint (715 etc): Remove errors until function is filled.\r
+//lint -e{715}         Symbol not referenced\r
 static boolean checkDtcFaultDetectionCounter(const Dem_EventParameterType *eventParam)\r
 {\r
        boolean result = TRUE;\r
@@ -267,14 +368,15 @@ static boolean checkDtcFaultDetectionCounter(const Dem_EventParameterType *event
  */\r
 static void lookupEventStatusRec(Dem_EventIdType eventId, EventStatusRecType **const eventStatusRec)\r
 {\r
-       EventStatusRecType *eventStatusRecPtr = eventStatusBuffer;\r
+       uint8 i;\r
+       boolean eventIdFound = FALSE;\r
 \r
-       while ((eventStatusRecPtr->eventId != eventId) && (eventStatusRecPtr < &eventStatusBuffer[DEM_MAX_NUMBER_EVENT])) {\r
-               eventStatusRecPtr++;\r
+       for (i = 0; (i < DEM_MAX_NUMBER_EVENT) && (!eventIdFound); i++) {\r
+               eventIdFound = (eventStatusBuffer[i].eventId == eventId);\r
        }\r
 \r
-       if (eventStatusRecPtr < &eventStatusBuffer[DEM_MAX_NUMBER_EVENT]) {\r
-               *eventStatusRec = eventStatusRecPtr;\r
+       if (eventIdFound) {\r
+               *eventStatusRec = &eventStatusBuffer[i-1];\r
        } else {\r
                *eventStatusRec = NULL;\r
        }\r
@@ -288,39 +390,65 @@ static void lookupEventStatusRec(Dem_EventIdType eventId, EventStatusRecType **c
  */\r
 static void lookupEventIdParameter(Dem_EventIdType eventId, const Dem_EventParameterType **const eventIdParam)\r
 {\r
-       const Dem_EventParameterType *EventIdParamPtr = configSet->EventParameter;\r
+       const Dem_EventParameterType *EventIdParamList = configSet->EventParameter;\r
 \r
-       // Lookup the correct event id parameters\r
-       while ((EventIdParamPtr->EventID != eventId) && !EventIdParamPtr->Arc_EOL) {\r
-               EventIdParamPtr++;\r
+       /* Lookup the correct event id parameters */\r
+       uint16 i=0;\r
+       while ((EventIdParamList[i].EventID != eventId) && (!EventIdParamList[i].Arc_EOL)) {\r
+               i++;\r
        }\r
 \r
-       if (!EventIdParamPtr->Arc_EOL) {\r
-               *eventIdParam = EventIdParamPtr;\r
+       if (!EventIdParamList[i].Arc_EOL) {\r
+               *eventIdParam = &EventIdParamList[i];\r
        } else {\r
                *eventIdParam = NULL;\r
        }\r
 }\r
+/*\r
+ * Procedure:  checkEntryValid\r
+ * Description:        Returns whether event id "eventId" is a valid entry in primary memory\r
+ */\r
+static boolean checkEntryValid(Dem_EventIdType eventId){\r
+       const Dem_EventParameterType *EventIdParamList = configSet->EventParameter;\r
+       boolean isValid = FALSE;\r
+       uint16 i=0;\r
+       while ((EventIdParamList[i].EventID != eventId) && (!EventIdParamList[i].Arc_EOL)) {\r
+               i++;\r
+       }\r
 \r
+       if (!EventIdParamList[i].Arc_EOL) {\r
+               // Event was found\r
+               uint16 index = 0;\r
+               for (index = 0; (index < DEM_MAX_NR_OF_EVENT_DESTINATION)\r
+                                        && (EventIdParamList[i].EventClass->EventDestination[index] != DEM_EVENT_DESTINATION_END_OF_LIST); index++) {\r
+                       if( DEM_DTC_ORIGIN_PRIMARY_MEMORY == EventIdParamList[i].EventClass->EventDestination[index]){\r
+                               // Event should be stored in primary memory.\r
+                               isValid = TRUE;\r
+                       }\r
+               }\r
 \r
+       } else {\r
+               // The event did not exist\r
+       }\r
+       return isValid;\r
+}\r
 /*\r
  * Procedure:  preDebounceNone\r
  * Description:        Returns the result of the debouncing.\r
  */\r
-static Dem_EventStatusType preDebounceNone(Dem_EventStatusType reportedStatus, EventStatusRecType* statusRecord) {\r
+static Dem_EventStatusType preDebounceNone(const Dem_EventStatusType reportedStatus, const EventStatusRecType* statusRecord) {\r
        Dem_EventStatusType returnCode;\r
+       (void)statusRecord;             // Just to get rid of PC-Lint warnings\r
 \r
        switch (reportedStatus) {\r
-       case DEM_EVENT_STATUS_FAILED:\r
-       case DEM_EVENT_STATUS_PASSED:\r
+       case DEM_EVENT_STATUS_FAILED: /** @req DEM091.NoneFailed */\r
+       case DEM_EVENT_STATUS_PASSED: /** @req DEM091.NonePassed */\r
                // Already debounced, do nothing.\r
                break;\r
 \r
        default:\r
                // TODO: What to do with PREFAIL and PREPASSED on no debouncing?\r
-#if (DEM_DEV_ERROR_DETECT == STD_ON)\r
-                       Det_ReportError(MODULE_ID_DEM, 0, DEM_PREDEBOUNCE_NONE_ID, DEM_E_PARAM_DATA);\r
-#endif\r
+               DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_PREDEBOUNCE_NONE_ID, DEM_E_PARAM_DATA);\r
                break;\r
        }\r
 \r
@@ -340,11 +468,11 @@ static Dem_EventStatusType preDebounceCounterBased(Dem_EventStatusType reportedS
        switch (reportedStatus) {\r
        case DEM_EVENT_STATUS_PREFAILED:\r
                if (statusRecord->faultDetectionCounter < DEBOUNCE_FDC_TEST_FAILED) {\r
-                       if (pdVars->JumpUp && (statusRecord->faultDetectionCounter < 0)) {\r
+                       if ((pdVars->JumpUp) && (statusRecord->faultDetectionCounter < 0)) {\r
                                statusRecord->faultDetectionCounter = 0;\r
                        } else {\r
-                               if (((sint16)statusRecord->faultDetectionCounter + pdVars->CountInStepSize) < DEBOUNCE_FDC_TEST_FAILED) {\r
-                                       statusRecord->faultDetectionCounter += pdVars->CountInStepSize;\r
+                               if (((sint16)statusRecord->faultDetectionCounter + (sint8)pdVars->CountInStepSize) < DEBOUNCE_FDC_TEST_FAILED) {\r
+                                       statusRecord->faultDetectionCounter += (sint8)pdVars->CountInStepSize;\r
                                } else {\r
                                        statusRecord->faultDetectionCounter = DEBOUNCE_FDC_TEST_FAILED;\r
                                }\r
@@ -354,11 +482,11 @@ static Dem_EventStatusType preDebounceCounterBased(Dem_EventStatusType reportedS
 \r
        case DEM_EVENT_STATUS_PREPASSED:\r
                if (statusRecord->faultDetectionCounter > DEBOUNCE_FDC_TEST_PASSED) {\r
-                       if (pdVars->JumpDown && (statusRecord->faultDetectionCounter > 0)) {\r
+                       if ((pdVars->JumpDown) && (statusRecord->faultDetectionCounter > 0)) {\r
                                statusRecord->faultDetectionCounter = 0;\r
                        } else {\r
-                               if (((sint16)statusRecord->faultDetectionCounter - pdVars->CountOutStepSize) > DEBOUNCE_FDC_TEST_PASSED) {\r
-                                       statusRecord->faultDetectionCounter -= pdVars->CountOutStepSize;\r
+                               if (((sint16)statusRecord->faultDetectionCounter - (sint8)pdVars->CountOutStepSize) > DEBOUNCE_FDC_TEST_PASSED) {\r
+                                       statusRecord->faultDetectionCounter -= (sint8)pdVars->CountOutStepSize;\r
                                } else {\r
                                        statusRecord->faultDetectionCounter = DEBOUNCE_FDC_TEST_PASSED;\r
                                }\r
@@ -367,17 +495,15 @@ static Dem_EventStatusType preDebounceCounterBased(Dem_EventStatusType reportedS
                break;\r
 \r
        case DEM_EVENT_STATUS_FAILED:\r
-               statusRecord->faultDetectionCounter = DEBOUNCE_FDC_TEST_FAILED;\r
+               statusRecord->faultDetectionCounter = DEBOUNCE_FDC_TEST_FAILED; /** @req DEM091.CounterFailed */\r
                break;\r
 \r
        case DEM_EVENT_STATUS_PASSED:\r
-               statusRecord->faultDetectionCounter = DEBOUNCE_FDC_TEST_PASSED;\r
+               statusRecord->faultDetectionCounter = DEBOUNCE_FDC_TEST_PASSED; /** @req DEM091.CounterPassed */\r
                break;\r
 \r
        default:\r
-#if (DEM_DEV_ERROR_DETECT == STD_ON)\r
-               Det_ReportError(MODULE_ID_DEM, 0, DEM_PREDEBOUNCE_COUNTER_BASED_ID, DEM_E_PARAM_DATA);\r
-#endif\r
+               DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_PREDEBOUNCE_COUNTER_BASED_ID, DEM_E_PARAM_DATA);\r
                break;\r
 \r
        }\r
@@ -408,17 +534,16 @@ static Dem_EventStatusType preDebounceCounterBased(Dem_EventStatusType reportedS
 static void updateEventStatusRec(const Dem_EventParameterType *eventParam, Dem_EventStatusType eventStatus, boolean createIfNotExist, EventStatusRecType *eventStatusRec)\r
 {\r
        EventStatusRecType *eventStatusRecPtr;\r
-       imask_t state = McuE_EnterCriticalSection();\r
+       sint8 faultCounterBeforeDebounce = 0;\r
+       sint8 faultCounterAfterDebounce = 0;\r
+       imask_t state;\r
+    Irq_Save(state);\r
 \r
-       // Lookup event ID\r
        lookupEventStatusRec(eventParam->EventID, &eventStatusRecPtr);\r
 \r
        if ((eventStatusRecPtr == NULL) && (createIfNotExist)) {\r
-               // Search for free position\r
                lookupEventStatusRec(DEM_EVENT_ID_NULL, &eventStatusRecPtr);\r
-\r
                if (eventStatusRecPtr != NULL) {\r
-                       // Create new event record\r
                        eventStatusRecPtr->eventId = eventParam->EventID;\r
                        eventStatusRecPtr->eventParamRef = eventParam;\r
                        eventStatusRecPtr->faultDetectionCounter = 0;\r
@@ -427,68 +552,68 @@ static void updateEventStatusRec(const Dem_EventParameterType *eventParam, Dem_E
                        eventStatusRecPtr->errorStatusChanged = FALSE;\r
                }\r
                else {\r
-                       // Error: Event status buffer full\r
-#if (DEM_DEV_ERROR_DETECT == STD_ON)\r
-                       Det_ReportError(MODULE_ID_DEM, 0, DEM_UPDATE_EVENT_STATUS_ID, DEM_E_EVENT_STATUS_BUFF_FULL);\r
-#endif\r
+                       DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_UPDATE_EVENT_STATUS_ID, DEM_E_EVENT_STATUS_BUFF_FULL);\r
                }\r
        }\r
 \r
 \r
        if (eventStatusRecPtr != NULL) {\r
-               // Handle debouncing\r
-               switch (eventParam->EventClass->PreDebounceAlgorithmClass->PreDebounceName) {\r
-               case DEM_NO_PRE_DEBOUNCE:\r
-                       eventStatus = preDebounceNone(eventStatus, eventStatusRecPtr);\r
-                       break;\r
+               faultCounterBeforeDebounce = eventStatusRecPtr->faultDetectionCounter;\r
 \r
-               case DEM_PRE_DEBOUNCE_COUNTER_BASED:\r
-                       eventStatus = preDebounceCounterBased(eventStatus, eventStatusRecPtr);\r
-                       break;\r
+               if (eventParam->EventClass->PreDebounceAlgorithmClass != NULL) {\r
+                       switch (eventParam->EventClass->PreDebounceAlgorithmClass->PreDebounceName) { /** @req DEM004 */ /** @req DEM342 */\r
+                       case DEM_NO_PRE_DEBOUNCE:\r
+                               eventStatus = preDebounceNone(eventStatus, eventStatusRecPtr);\r
+                               break;\r
 \r
-               default:\r
-                       // Don't know how to handle this.\r
-#if (DEM_DEV_ERROR_DETECT == STD_ON)\r
-                       Det_ReportError(MODULE_ID_DEM, 0, DEM_UPDATE_EVENT_STATUS_ID, DEM_E_NOT_IMPLEMENTED_YET);\r
-#endif\r
-                       break;\r
-               }\r
+                       case DEM_PRE_DEBOUNCE_COUNTER_BASED:\r
+                               eventStatus = preDebounceCounterBased(eventStatus, eventStatusRecPtr);\r
+                               break;\r
 \r
+                       default:\r
+                               DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_UPDATE_EVENT_STATUS_ID, DEM_E_NOT_IMPLEMENTED_YET);\r
+                               break;\r
+                       }\r
+               }\r
+               faultCounterAfterDebounce = eventStatusRecPtr->faultDetectionCounter;\r
 \r
                eventStatusRecPtr->errorStatusChanged = FALSE;\r
 \r
-               // Check test failed\r
                if (eventStatus == DEM_EVENT_STATUS_FAILED) {\r
                        if (!(eventStatusRecPtr->eventStatusExtended & DEM_TEST_FAILED)) {\r
                                eventStatusRecPtr->occurrence++;\r
                                eventStatusRecPtr->errorStatusChanged = TRUE;\r
                        }\r
-                       eventStatusRecPtr->eventStatusExtended |= (DEM_TEST_FAILED | DEM_TEST_FAILED_THIS_OPERATION_CYCLE | DEM_TEST_FAILED_SINCE_LAST_CLEAR | DEM_PENDING_DTC);\r
-                       eventStatusRecPtr->eventStatusExtended &= ~(DEM_TEST_NOT_COMPLETED_SINCE_LAST_CLEAR | DEM_TEST_NOT_COMPLETED_THIS_OPERATION_CYCLE);\r
+                       /** @req DEM036 */ /** @req DEM379.PendingSet */\r
+                       eventStatusRecPtr->eventStatusExtended |= (DEM_TEST_FAILED | DEM_TEST_FAILED_THIS_OPERATION_CYCLE | DEM_TEST_FAILED_SINCE_LAST_CLEAR | DEM_PENDING_DTC | DEM_CONFIRMED_DTC);\r
+                       eventStatusRecPtr->eventStatusExtended &= (Dem_EventStatusExtendedType)~(DEM_TEST_NOT_COMPLETED_SINCE_LAST_CLEAR | DEM_TEST_NOT_COMPLETED_THIS_OPERATION_CYCLE);\r
                }\r
 \r
-               // Check test passed\r
                if (eventStatus == DEM_EVENT_STATUS_PASSED) {\r
-                       if (eventStatusRecPtr->eventStatusExtended & DEM_TEST_FAILED) {\r
+                       if (eventStatusRecPtr->eventStatusExtended & (DEM_TEST_FAILED | DEM_TEST_NOT_COMPLETED_THIS_OPERATION_CYCLE)) {\r
                                eventStatusRecPtr->errorStatusChanged = TRUE;\r
                        }\r
-                       eventStatusRecPtr->eventStatusExtended &= ~DEM_TEST_FAILED;\r
-                       eventStatusRecPtr->eventStatusExtended &= ~(DEM_TEST_NOT_COMPLETED_SINCE_LAST_CLEAR | DEM_TEST_NOT_COMPLETED_THIS_OPERATION_CYCLE);\r
+                       /** @req DEM036 */\r
+                       eventStatusRecPtr->eventStatusExtended &= (Dem_EventStatusExtendedType)~DEM_TEST_FAILED;\r
+                       eventStatusRecPtr->eventStatusExtended &= (Dem_EventStatusExtendedType)~(DEM_TEST_NOT_COMPLETED_SINCE_LAST_CLEAR | DEM_TEST_NOT_COMPLETED_THIS_OPERATION_CYCLE);\r
+               }\r
+\r
+               if ((eventStatus == DEM_EVENT_STATUS_PREFAILED)\\r
+                       && (faultCounterBeforeDebounce <= 0) && (faultCounterAfterDebounce > 0)){\r
+                       eventStatusRecPtr->errorStatusChanged = TRUE;\r
                }\r
 \r
-               // Copy the record\r
                memcpy(eventStatusRec, eventStatusRecPtr, sizeof(EventStatusRecType));\r
        }\r
        else {\r
-               // Copy an empty record to return data\r
                eventStatusRec->eventId = DEM_EVENT_ID_NULL;\r
-               eventStatusRecPtr->faultDetectionCounter = 0;\r
+               eventStatusRec->faultDetectionCounter = 0;\r
                eventStatusRec->occurrence = 0;\r
                eventStatusRec->eventStatusExtended = DEM_TEST_NOT_COMPLETED_THIS_OPERATION_CYCLE | DEM_TEST_NOT_COMPLETED_SINCE_LAST_CLEAR;\r
                eventStatusRec->errorStatusChanged = FALSE;\r
        }\r
 \r
-       McuE_ExitCriticalSection(state);\r
+    Irq_Restore(state);\r
 }\r
 \r
 \r
@@ -496,65 +621,55 @@ static void updateEventStatusRec(const Dem_EventParameterType *eventParam, Dem_E
  * Procedure:  mergeEventStatusRec\r
  * Description:        Update the occurrence counter of status, if not exist a new record is created\r
  */\r
-static void mergeEventStatusRec(EventRecType *eventRec)\r
+static void mergeEventStatusRec(const EventRecType *eventRec)\r
 {\r
        EventStatusRecType *eventStatusRecPtr;\r
-       imask_t state = McuE_EnterCriticalSection();\r
+       imask_t state;\r
+    Irq_Save(state);\r
 \r
        // Lookup event ID\r
        lookupEventStatusRec(eventRec->eventId, &eventStatusRecPtr);\r
 \r
        if (eventStatusRecPtr != NULL) {\r
-               // Update occurrence counter, rest of pre init state is kept.\r
+               // Update occurrence counter.\r
                eventStatusRecPtr->occurrence += eventRec->occurrence;\r
+               // Merge event status extended with stored\r
+               // TEST_FAILED_SINCE_LAST_CLEAR should be set if set if set in either\r
+               eventStatusRecPtr->eventStatusExtended |= (Dem_EventStatusExtendedType)(eventRec->eventStatusExtended & DEM_TEST_FAILED_SINCE_LAST_CLEAR);\r
+               // DEM_TEST_NOT_COMPLETED_SINCE_LAST_CLEAR should cleared if cleared in either\r
+               eventStatusRecPtr->eventStatusExtended |= (Dem_EventStatusExtendedType)(eventRec->eventStatusExtended & eventStatusRecPtr->eventStatusExtended & DEM_TEST_NOT_COMPLETED_SINCE_LAST_CLEAR);\r
+               // DEM_PENDING_DTC and DEM_CONFIRMED_DTC should be set if set in either\r
+               eventStatusRecPtr->eventStatusExtended |= (Dem_EventStatusExtendedType)(eventRec->eventStatusExtended & (DEM_PENDING_DTC | DEM_CONFIRMED_DTC));\r
 \r
        }\r
-       else {\r
-               // Search for free position\r
-               lookupEventStatusRec(DEM_EVENT_ID_NULL, &eventStatusRecPtr);\r
-\r
-               if (eventStatusRecPtr != NULL) {\r
-                       // Create new event, from stored event\r
-                       eventStatusRecPtr->eventId = eventRec->eventId;\r
-                       lookupEventIdParameter(eventRec->eventId, &eventStatusRecPtr->eventParamRef);\r
-                       eventStatusRecPtr->faultDetectionCounter = 0;\r
-                       eventStatusRecPtr->occurrence = eventRec->occurrence;\r
-                       eventStatusRecPtr->eventStatusExtended = DEM_TEST_NOT_COMPLETED_THIS_OPERATION_CYCLE | DEM_TEST_NOT_COMPLETED_SINCE_LAST_CLEAR;\r
-                       eventStatusRecPtr->errorStatusChanged = FALSE;\r
-               }\r
-               else {\r
-                       // Error: Event status buffer full\r
-#if (DEM_DEV_ERROR_DETECT == STD_ON)\r
-                       Det_ReportError(MODULE_ID_DEM, 0, DEM_MERGE_EVENT_STATUS_ID, DEM_E_EVENT_STATUS_BUFF_FULL);\r
-#endif\r
-               }\r
-       }\r
 \r
-       McuE_ExitCriticalSection(state);\r
+    Irq_Restore(state);\r
 }\r
 \r
-\r
 /*\r
- * Procedure:  deleteEventStatusRec\r
- * Description:        Delete the status record of "eventParam->eventId" from "eventStatusBuffer".\r
+ * Procedure:  resetEventStatusRec\r
+ * Description:        Reset the status record of "eventParam->eventId" from "eventStatusBuffer".\r
  */\r
-static void deleteEventStatusRec(const Dem_EventParameterType *eventParam)\r
+static void resetEventStatusRec(const Dem_EventParameterType *eventParam)\r
 {\r
        EventStatusRecType *eventStatusRecPtr;\r
-       imask_t state = McuE_EnterCriticalSection();\r
+       imask_t state;\r
+       Irq_Save(state);\r
 \r
        // Lookup event ID\r
        lookupEventStatusRec(eventParam->EventID, &eventStatusRecPtr);\r
 \r
        if (eventStatusRecPtr != NULL) {\r
-               // Delete event record\r
-               memset(eventStatusRecPtr, 0, sizeof(EventStatusRecType));\r
+               // Reset event record\r
+               eventStatusRecPtr->faultDetectionCounter = 0;\r
+               eventStatusRecPtr->eventStatusExtended = (DEM_TEST_NOT_COMPLETED_THIS_OPERATION_CYCLE | DEM_TEST_NOT_COMPLETED_SINCE_LAST_CLEAR);\r
+               eventStatusRecPtr->errorStatusChanged = FALSE;\r
+               eventStatusRecPtr->occurrence = 0;\r
        }\r
 \r
-       McuE_ExitCriticalSection(state);\r
+       Irq_Restore(state);\r
 }\r
 \r
-\r
 /*\r
  * Procedure:  getEventStatusRec\r
  * Description:        Returns the status record of "eventId" in "eventStatusRec"\r
@@ -588,7 +703,7 @@ static boolean lookupDtcEvent(uint32 dtc, EventStatusRecType **eventStatusRec)
 \r
        *eventStatusRec = NULL;\r
 \r
-       for (i = 0; (i < DEM_MAX_NUMBER_EVENT) && !dtcFound; i++) {\r
+       for (i = 0; (i < DEM_MAX_NUMBER_EVENT) && (!dtcFound); i++) {\r
                if (eventStatusBuffer[i].eventId != DEM_EVENT_ID_NULL) {\r
                        if (eventStatusBuffer[i].eventParamRef->DTCClassRef != NULL) {\r
 \r
@@ -626,11 +741,11 @@ static boolean matchEventWithDtcFilter(const EventStatusRecType *eventRec)
 \r
                                        // Check severity\r
                                        if ((dtcFilter.filterWithSeverity == DEM_FILTER_WITH_SEVERITY_NO)\r
-                                               || ((dtcFilter.filterWithSeverity == DEM_FILTER_WITH_SEVERITY_YES) && checkDtcSeverityMask(dtcFilter.dtcSeverityMask, eventRec->eventParamRef))) {\r
+                                               || ((dtcFilter.filterWithSeverity == DEM_FILTER_WITH_SEVERITY_YES) && (checkDtcSeverityMask(dtcFilter.dtcSeverityMask, eventRec->eventParamRef)))) {\r
 \r
                                                // Check fault detection counter\r
                                                if ((dtcFilter.filterForFaultDetectionCounter == DEM_FILTER_FOR_FDC_NO)\r
-                                                       || ((dtcFilter.filterWithSeverity == DEM_FILTER_FOR_FDC_YES) && checkDtcFaultDetectionCounter(eventRec->eventParamRef))) {\r
+                                                       || ((dtcFilter.filterWithSeverity == DEM_FILTER_FOR_FDC_YES) && (checkDtcFaultDetectionCounter(eventRec->eventParamRef)))) {\r
                                                        dtcMatch = TRUE;\r
                                                }\r
                                        }\r
@@ -641,26 +756,385 @@ static boolean matchEventWithDtcFilter(const EventStatusRecType *eventRec)
 \r
        return dtcMatch;\r
 }\r
+/*\r
+ * Procedure:  bubbleSort\r
+ * Description:        bubble sort\r
+ */\r
+static void bubbleSort(FreezeFrameRecType *freezeFrameBuf, uint16 length)\r
+{\r
+       FreezeFrameRecType temp;\r
+       uint16 i = 0;\r
+       uint16 j = 0;\r
+\r
+       //Bubble sort:rearrange priMemFreezeFrameBuffer from little to big\r
+       for(i=0;i<length;i++){\r
+               for(j=length-1; j > i; j--){\r
+                       if(freezeFrameBuf[i].timeStamp > freezeFrameBuf[j].timeStamp){\r
+                               //exchange buffer data\r
+                               memcpy(&temp,&freezeFrameBuf[i],sizeof(FreezeFrameRecType));\r
+                               memcpy(&freezeFrameBuf[i],&freezeFrameBuf[j],sizeof(FreezeFrameRecType));\r
+                               memcpy(&freezeFrameBuf[j],&temp,sizeof(FreezeFrameRecType));\r
+                       }\r
+               }\r
+       }\r
+\r
+}\r
+\r
+/*\r
+ * Procedure:  retrieveEventStatusBit\r
+ * Description:        retrieve Event Status Bit\r
+ */\r
+static boolean retrieveEventStatusBit(FreezeFrameRecType *freezeFrameBuf,\r
+                                                                                       uint16 length ,\r
+                                                                                       Dem_EventStatusExtendedType nBit,\r
+                                                                                       FreezeFrameRecType **freezeFrame)\r
+{\r
+       boolean freezeFrameFound = FALSE;\r
+       uint16 i = 0;\r
+       uint16 j = 0;\r
+\r
+       for(i=0;i<length;i++){\r
+               for(j=0; (j < DEM_MAX_NUMBER_EVENT) && (!freezeFrameFound); j++){\r
+                       freezeFrameFound = (eventStatusBuffer[j].eventId == freezeFrameBuf[i].eventId)\\r
+                                                && (!(eventStatusBuffer[j].eventStatusExtended & nBit));\r
+                       if(freezeFrameFound == TRUE){\r
+                               *freezeFrame = &freezeFrameBuf[i];\r
+                       }\r
+               }\r
+       }\r
+\r
+       return freezeFrameFound;\r
+\r
+}\r
+\r
+/*\r
+ * Procedure:  lookupFreezeFrameForDisplacementPreInit\r
+ * Description:        implement displacement strategy preinit:1.find out the oldest "not confirmed" DTC\r
+ *                                                                                                2.find out the oldest inactive DTC,inactive:testFailed is not set\r
+ *                                                                                               3.find ou the oldest active DTC,active:testFailed is set\r
+ */\r
+static boolean lookupFreezeFrameForDisplacementPreInit(FreezeFrameRecType **freezeFrame)\r
+{\r
+       boolean freezeFrameFound = FALSE;\r
+\r
+       /* Bubble sort:rearrange priMemFreezeFrameBuffer from little to big */\r
+       bubbleSort(preInitFreezeFrameBuffer, DEM_MAX_NUMBER_FF_DATA_PRE_INIT);\r
+\r
+       /* find out the oldest not confirmed dtc */\r
+       freezeFrameFound = retrieveEventStatusBit(preInitFreezeFrameBuffer, DEM_MAX_NUMBER_FF_DATA_PRE_INIT, DEM_CONFIRMED_DTC, freezeFrame);\r
+\r
+       /* if all confirmed,lookup the oldest inactive dtc */\r
+       if(freezeFrameFound == FALSE){\r
+               freezeFrameFound = retrieveEventStatusBit(preInitFreezeFrameBuffer, DEM_MAX_NUMBER_FF_DATA_PRE_INIT, DEM_TEST_FAILED, freezeFrame);\r
+       }\r
+\r
+       /* if all confirmed,lookup the oldest active dtc */\r
+       if(freezeFrameFound == FALSE){\r
+               *freezeFrame = &preInitFreezeFrameBuffer[0];\r
+               freezeFrameFound = TRUE;\r
+       }\r
+\r
+       return freezeFrameFound;\r
+}\r
+\r
+/*\r
+ * Procedure:  lookupFreezeFrameForDisplacement\r
+ * Description:        implement displacement strategy:1.find out the oldest "not confirmed" DTC\r
+ *                                                                                     2.find out the oldest inactive DTC,inactive:testFailed is not set\r
+ *                                                                                     3.find ou the oldest active DTC,active:testFailed is set\r
+ */\r
+static boolean lookupFreezeFrameForDisplacement(FreezeFrameRecType **freezeFrame)\r
+{\r
+       boolean freezeFrameFound = FALSE;\r
+\r
+       bubbleSort(priMemFreezeFrameBuffer, DEM_MAX_NUMBER_FF_DATA_PRI_MEM);\r
+\r
+       /* Find out the oldest not confirmed dtc */\r
+       freezeFrameFound = retrieveEventStatusBit(priMemFreezeFrameBuffer, DEM_MAX_NUMBER_FF_DATA_PRI_MEM, DEM_CONFIRMED_DTC, freezeFrame);\r
+\r
+       /* If all confirmed, lookup the oldest inactive dtc */\r
+       if(freezeFrameFound == FALSE){\r
+               freezeFrameFound = retrieveEventStatusBit(priMemFreezeFrameBuffer, DEM_MAX_NUMBER_FF_DATA_PRI_MEM, DEM_TEST_FAILED, freezeFrame);\r
+       }\r
+\r
+       /* If all confirmed,lookup the oldest active dtc */\r
+       if(freezeFrameFound == FALSE){\r
+               *freezeFrame = &priMemFreezeFrameBuffer[0];\r
+               freezeFrameFound = TRUE;\r
+       }\r
+\r
+       return freezeFrameFound;\r
+}\r
+/*\r
+ * Procedure:  rearrangeFreezeFrameTimeStamp\r
+ * Description:        rearrange FF timestamp when timestamp is beyond DEM_MAX_TIMESTAMP_FOR_REARRANGEMENT                     \r
+ */\r
+static void rearrangeFreezeFrameTimeStamp(uint32 *timeStamp)\r
+{\r
+       FreezeFrameRecType temp;\r
+       uint32 i = 0;\r
+       uint32 j = 0;\r
+       uint32 k = 0;\r
+\r
+       /* Bubble sort:rearrange priMemFreezeFrameBuffer from little to big */\r
+       for(i=0;i<DEM_MAX_NUMBER_FF_DATA_PRI_MEM;i++){\r
+               if(priMemFreezeFrameBuffer[i].eventId != DEM_EVENT_ID_NULL){\r
+                       for(j=DEM_MAX_NUMBER_FF_DATA_PRI_MEM-1; j > i; j--){\r
+                               if(priMemFreezeFrameBuffer[j].eventId != DEM_EVENT_ID_NULL){\r
+                                       if(priMemFreezeFrameBuffer[i].timeStamp > priMemFreezeFrameBuffer[j].timeStamp){\r
+                                               //exchange buffer data\r
+                                               memcpy(&temp,&priMemFreezeFrameBuffer[i],sizeof(FreezeFrameRecType));\r
+                                               memcpy(&priMemFreezeFrameBuffer[i],&priMemFreezeFrameBuffer[j],sizeof(FreezeFrameRecType));\r
+                                               memcpy(&priMemFreezeFrameBuffer[j],&temp,sizeof(FreezeFrameRecType));\r
+                                       }\r
+\r
+                               }\r
+\r
+                       }\r
+                       priMemFreezeFrameBuffer[i].timeStamp = k++;\r
+               }\r
 \r
+       }\r
+       /* update the current timeStamp */\r
+       *timeStamp = k;\r
 \r
-static void getFreezeFrameData(const Dem_EventParameterType *eventParam, FreezeFrameRecType *freezeFrame)\r
+}\r
+/*\r
+ * Procedure:  getFreezeFrameData\r
+ * Description:        get FF data according configuration                     \r
+ */\r
+static void getFreezeFrameData(const Dem_EventParameterType *eventParam,\r
+                               FreezeFrameRecType *freezeFrame,\r
+                               Dem_EventStatusType eventStatus,\r
+                               EventStatusRecType *eventStatusRec)\r
 {\r
-       // TODO: Fill out\r
-       freezeFrame->eventId = DEM_EVENT_ID_NULL;       // Not supported yet\r
+       Dem_FreezeFrameStorageConditonType prefailedOrFailed;\r
+       Std_ReturnType callbackReturnCode;\r
+       uint16 i = 0;\r
+       uint16 storeIndex = 0;\r
+       uint16 recordSize = 0;\r
+       imask_t state;\r
+       const Dem_FreezeFrameClassType *FreezeFrameLocal = NULL;\r
+       Dcm_NegativeResponseCodeType errorCode;//should include Dcm_Lcfg.h\r
+\r
+       /* clear FF data record */\r
+       memset(freezeFrame, 0, sizeof(FreezeFrameRecType ));\r
+\r
+       /* check if prefailed or failed */\r
+       if(eventStatusRec->eventStatusExtended & DEM_TEST_FAILED){\r
+               prefailedOrFailed = FAILED;//confirm the FF is stored for failed\r
+\r
+       }\r
+       else{\r
+                if(eventStatus == DEM_EVENT_STATUS_PREFAILED){\r
+                       prefailedOrFailed = PREFAILED;//confirm the FF is stored for prefailed\r
+                }\r
+                else{\r
+                       prefailedOrFailed = FF_STORAGE_CONDITION_WRONG;\r
+                       freezeFrame->eventId = DEM_EVENT_ID_NULL;\r
+                       return;\r
+                }\r
+       }\r
+\r
+       /* Find out the corresponding FF class */\r
+       for(i = 0;(i<DEM_MAX_NR_OF_CLASSES_IN_FREEZEFRAME_DATA) && (eventParam->FreezeFrameClassRef[i] != NULL);i++){\r
+               if(eventParam->FreezeFrameClassRef[i]->FFStorageCondition == prefailedOrFailed){\r
+                       FreezeFrameLocal = eventParam->FreezeFrameClassRef[i];\r
+                       break;\r
+               }\r
+       }\r
+       /* get the dids */\r
+       if(FreezeFrameLocal != NULL){\r
+               if(FreezeFrameLocal->FFIdClassRef != NULL){\r
+                       for (i = 0; (i < DEM_MAX_NR_OF_RECORDS_IN_FREEZEFRAME_DATA) && (!(FreezeFrameLocal->FFIdClassRef[i].Arc_EOL)); i++) {\r
+                               if(FreezeFrameLocal->FFIdClassRef[i].PidOrDidUsePort == FALSE){\r
+                                       if(FreezeFrameLocal->FFIdClassRef[i].DidReadDataLengthFnc != NULL){\r
+                                               callbackReturnCode = FreezeFrameLocal->FFIdClassRef[i].DidReadDataLengthFnc(&recordSize);\r
+                                               if(callbackReturnCode != E_OK){\r
+                                                       //if fail to read data length,discard the storage of FF\r
+                                                       freezeFrame->eventId = DEM_EVENT_ID_NULL;\r
+                                                       DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_GET_FREEZEFRAME_ID, DEM_READ_DATA_LENGTH_FAILED);\r
+                                                       return;\r
+                                               }\r
+                                       }\r
+                                       /* if no readDidDataLengthFunction, then try the PidOrDidSize. */\r
+                                       else{\r
+                                               recordSize = FreezeFrameLocal->FFIdClassRef[i].PidOrDidSize;\r
+                                       }\r
+                                       /* read out the did data */\r
+                                       if ((storeIndex + recordSize + DEM_DID_IDENTIFIER_SIZE_OF_BYTES) <= DEM_MAX_SIZE_FF_DATA) {\r
+                                               /* store DID */\r
+                                               freezeFrame->data[storeIndex] = (FreezeFrameLocal->FFIdClassRef[i].DidIdentifier>> 8) & 0xFFu;\r
+                                               storeIndex++;\r
+                                               freezeFrame->data[storeIndex] = FreezeFrameLocal->FFIdClassRef[i].DidIdentifier & 0xFFu;\r
+                                               storeIndex++;\r
+                                               /* store data */\r
+                                               if(FreezeFrameLocal->FFIdClassRef[i].DidConditionCheckReadFnc != NULL){\r
+                                                       callbackReturnCode = FreezeFrameLocal->FFIdClassRef[i].DidConditionCheckReadFnc(&errorCode);\r
+                                                       if ((callbackReturnCode == E_OK) && (errorCode == DCM_E_POSITIVERESPONSE)) {\r
+                                                               if(FreezeFrameLocal->FFIdClassRef[i].DidReadFnc!= NULL){\r
+                                                                       callbackReturnCode = FreezeFrameLocal->FFIdClassRef[i].DidReadFnc(&freezeFrame->data[storeIndex]);\r
+                                                                       if (callbackReturnCode != E_OK) {\r
+                                                                               memset(&freezeFrame->data[storeIndex], DEM_FREEZEFRAME_DEFAULT_VALUE, recordSize);\r
+                                                                       }\r
+                                                                       storeIndex += recordSize;\r
+\r
+                                                               }\r
+                                                               else{\r
+                                                                       memset(&freezeFrame->data[storeIndex], DEM_FREEZEFRAME_DEFAULT_VALUE, recordSize);\r
+                                                                       storeIndex += recordSize;\r
+                                                               }\r
+\r
+                                                       }\r
+                                                       else{\r
+                                                               memset(&freezeFrame->data[storeIndex], DEM_FREEZEFRAME_DEFAULT_VALUE, recordSize);\r
+                                                               storeIndex += recordSize;\r
+                                                       }\r
+                                               }\r
+                                               else{\r
+                                                       memset(&freezeFrame->data[storeIndex], DEM_FREEZEFRAME_DEFAULT_VALUE, recordSize);\r
+                                                       storeIndex += recordSize;\r
+                                               }\r
+\r
+                                       }\r
+                                       else{\r
+                                               DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_GET_FREEZEFRAME_ID, DEM_E_FF_TOO_BIG);\r
+                                               break;\r
+                                       }\r
+                               }\r
+                               else{\r
+                                       //TODO:RTE should provide the port\r
+                                       DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_GET_FREEZEFRAME_ID, DEM_DSP_DID_USE_PORT_IS_TRUE);\r
+                               }\r
+                       }\r
+               }\r
+\r
+       }\r
+       else{\r
+               /* create an empty FF */\r
+               freezeFrame->eventId = DEM_EVENT_ID_NULL;\r
+       }\r
+\r
+       /* Check if any data has been stored */\r
+       if (storeIndex != 0) {\r
+               freezeFrame->eventId = eventParam->EventID;\r
+               freezeFrame->occurrence = eventStatusRec->occurrence;\r
+               freezeFrame->dataSize = storeIndex;\r
+               freezeFrame->recordNumber = FreezeFrameLocal->FFRecordNumber;\r
+               Irq_Save(state);\r
+\r
+               if(FF_TimeStamp > DEM_MAX_TIMESTAMP_FOR_REARRANGEMENT){\r
+                       rearrangeFreezeFrameTimeStamp(&FF_TimeStamp);\r
+               }\r
+\r
+               freezeFrame->timeStamp = FF_TimeStamp;\r
+\r
+               FF_TimeStamp++;\r
+\r
+               Irq_Restore(state);\r
+\r
+               freezeFrame->checksum = calcChecksum(freezeFrame, sizeof(FreezeFrameRecType)-sizeof(ChecksumType));\r
+       }\r
+       else{\r
+               freezeFrame->eventId = DEM_EVENT_ID_NULL;\r
+               freezeFrame->dataSize = storeIndex;\r
+               freezeFrame->checksum = 0;\r
+       }\r
 }\r
 \r
 \r
-static void storeFreezeFrameDataPreInit(const Dem_EventParameterType *eventParam, FreezeFrameRecType *freezeFrame)\r
+/*\r
+ * Procedure:  storeFreezeFrameDataPreInit\r
+ * Description:        store FF in before  preInitFreezeFrameBuffer DEM's full initialization                          \r
+ */\r
+static void storeFreezeFrameDataPreInit(const Dem_EventParameterType *eventParam, const FreezeFrameRecType *freezeFrame)\r
 {\r
-       // TODO: Fill out\r
+       boolean eventIdFound = FALSE;\r
+       boolean eventIdFreePositionFound=FALSE;\r
+       FreezeFrameRecType *freezeFrameLocal = NULL;\r
+       uint16 i;\r
+       imask_t state;\r
+\r
+       Irq_Save(state);\r
+\r
+       /* Check if already stored */\r
+       for (i = 0; (i<DEM_MAX_NUMBER_FF_DATA_PRE_INIT) && (!eventIdFound); i++){\r
+               eventIdFound = ((preInitFreezeFrameBuffer[i].eventId == eventParam->EventID) && (preInitFreezeFrameBuffer[i].recordNumber== freezeFrame->recordNumber));\r
+       }\r
+\r
+       if(eventIdFound){\r
+               /* overwrite existing */\r
+               memcpy(&preInitFreezeFrameBuffer[i-1], freezeFrame, sizeof(FreezeFrameRecType));\r
+       }\r
+       else{\r
+               /* lookup first free position */\r
+               for (i = 0; (i<DEM_MAX_NUMBER_FF_DATA_PRE_INIT) && (!eventIdFreePositionFound); i++){\r
+                       if(preInitFreezeFrameBuffer[i].eventId == DEM_EVENT_ID_NULL){\r
+                               eventIdFreePositionFound=TRUE;\r
+                       }\r
+               }\r
+\r
+               if (eventIdFreePositionFound) {\r
+                       memcpy(&preInitFreezeFrameBuffer[i-1], freezeFrame, sizeof(FreezeFrameRecType));\r
+               }\r
+               else {\r
+                       /* do displacement */\r
+                       if(lookupFreezeFrameForDisplacementPreInit(&freezeFrameLocal)){\r
+                               memcpy(freezeFrameLocal, freezeFrame, sizeof(FreezeFrameRecType));\r
+                       }\r
+                       else{\r
+                               DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_STORE_FF_DATA_PRE_INIT_ID, DEM_E_PRE_INIT_FF_DATA_BUFF_FULL);\r
+                       }\r
+               }\r
+       }\r
+\r
+       Irq_Restore(state);\r
 }\r
 \r
 \r
-static void updateFreezeFrameOccurrencePreInit(EventRecType *EventBuffer)\r
+/*\r
+ * Procedure:  updateFreezeFrameOccurrencePreInit\r
+ * Description:        update the occurrence in preInitFreezeFrameBuffer according to the occurrence stored in priMemEventBuffer                               \r
+ */\r
+static void updateFreezeFrameOccurrencePreInit(const EventRecType *EventBuffer)\r
 {\r
-       // TODO: Fill out\r
+       uint16 i;\r
+\r
+       for (i = 0; i<DEM_MAX_NUMBER_FF_DATA_PRE_INIT; i++){\r
+               if(preInitFreezeFrameBuffer[i].eventId == EventBuffer->eventId){\r
+                       preInitFreezeFrameBuffer[i].occurrence += EventBuffer->occurrence;\r
+               }\r
+       }\r
+\r
 }\r
+/*\r
+ * Procedure:  initCurrentFreezeFrameTimeStamp\r
+ * Description:        initialize current timestamp and update the corresponding timestamp in preInitFreezeFrameBuffer         \r
+ */\r
+static void initCurrentFreezeFrameTimeStamp(uint32 *timeStampPtr)\r
+{\r
+       uint16 i = 0;\r
+       uint32 temp = 0;\r
+       imask_t state;\r
+\r
+       Irq_Save(state);\r
 \r
+       /* Find out the biggest timestamp in the last power on */\r
+       for (i = 0; i<DEM_MAX_NUMBER_FF_DATA_PRI_MEM; i++){\r
+               if((priMemFreezeFrameBuffer[i].eventId != DEM_EVENT_ID_NULL) &&\r
+                 (priMemFreezeFrameBuffer[i].timeStamp > temp)){\r
+                       temp = priMemFreezeFrameBuffer[i].timeStamp;\r
+               }\r
+       }\r
+       temp++;\r
+       for (i = 0; i<DEM_MAX_NUMBER_FF_DATA_PRE_INIT; i++){\r
+               if(preInitFreezeFrameBuffer[i].eventId != DEM_EVENT_ID_NULL){\r
+                       preInitFreezeFrameBuffer[i].timeStamp += temp;\r
+               }\r
+       }\r
+       *timeStampPtr += temp;\r
+       Irq_Restore(state);\r
+}\r
 \r
 /*\r
  * Procedure:  getExtendedData\r
@@ -683,7 +1157,7 @@ static void getExtendedData(const Dem_EventParameterType *eventParam, ExtDataRec
                for (i = 0; (i < DEM_MAX_NR_OF_RECORDS_IN_EXTENDED_DATA) && (eventParam->ExtendedDataClassRef->ExtendedDataRecordClassRef[i] != NULL); i++) {\r
                        recordSize = eventParam->ExtendedDataClassRef->ExtendedDataRecordClassRef[i]->DataSize;\r
                        if ((storeIndex + recordSize) <= DEM_MAX_SIZE_EXT_DATA) {\r
-                               callbackReturnCode = eventParam->ExtendedDataClassRef->ExtendedDataRecordClassRef[i]->CallbackGetExtDataRecord(&extData->data[storeIndex]);\r
+                               callbackReturnCode = eventParam->ExtendedDataClassRef->ExtendedDataRecordClassRef[i]->CallbackGetExtDataRecord(&extData->data[storeIndex]); /** @req DEM282 */\r
                                if (callbackReturnCode != E_OK) {\r
                                        // Callback data currently not available, clear space.\r
                                        memset(&extData->data[storeIndex], 0xFF, recordSize);\r
@@ -692,9 +1166,7 @@ static void getExtendedData(const Dem_EventParameterType *eventParam, ExtDataRec
                        }\r
                        else {\r
                                // Error: Size of extended data record is bigger than reserved space.\r
-#if (DEM_DEV_ERROR_DETECT == STD_ON)\r
-                               Det_ReportError(MODULE_ID_DEM, 0, DEM_GET_EXTENDED_DATA_ID, DEM_E_EXT_DATA_TOO_BIG);\r
-#endif\r
+                               DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_GET_EXTENDED_DATA_ID, DEM_E_EXT_DATA_TOO_BIG);\r
                                break;  // Break the loop\r
                        }\r
                }\r
@@ -719,122 +1191,135 @@ static void getExtendedData(const Dem_EventParameterType *eventParam, ExtDataRec
  * Description:        Store the extended data pointed by "extendedData" to the "preInitExtDataBuffer",\r
  *                             if non existent a new entry is created.\r
  */\r
-static void storeExtendedDataPreInit(const Dem_EventParameterType *eventParam, ExtDataRecType *extendedData)\r
+static void storeExtendedDataPreInit(const Dem_EventParameterType *eventParam, const ExtDataRecType *extendedData)\r
 {\r
+       boolean eventIdFound = FALSE;\r
+       boolean eventIdFreePositionFound=FALSE;\r
        uint16 i;\r
-       imask_t state = McuE_EnterCriticalSection();\r
+       imask_t state;\r
+    Irq_Save(state);\r
 \r
        // Check if already stored\r
-       for (i = 0; (preInitExtDataBuffer[i].eventId != eventParam->EventID) && (i<DEM_MAX_NUMBER_EXT_DATA_PRE_INIT); i++);\r
+       for (i = 0; (i<DEM_MAX_NUMBER_EXT_DATA_PRE_INIT) && (!eventIdFound); i++){\r
+               eventIdFound = (preInitExtDataBuffer[i].eventId == eventParam->EventID);\r
+       }\r
 \r
-       if (i < DEM_MAX_NUMBER_EXT_DATA_PRE_INIT) {\r
+       if(eventIdFound){\r
                // Yes, overwrite existing\r
-               memcpy(&preInitExtDataBuffer[i], extendedData, sizeof(ExtDataRecType));\r
+               memcpy(&preInitExtDataBuffer[i-1], extendedData, sizeof(ExtDataRecType));\r
        }\r
-       else {\r
+       else{\r
                // No, lookup first free position\r
-               for (i = 0; (preInitExtDataBuffer[i].eventId !=0) && (i<DEM_MAX_NUMBER_EXT_DATA_PRE_INIT); i++);\r
+               for (i = 0; (i<DEM_MAX_NUMBER_EXT_DATA_PRE_INIT) && (!eventIdFreePositionFound); i++){\r
+                       if(preInitExtDataBuffer[i].eventId ==0){\r
+                               eventIdFreePositionFound=TRUE;\r
+                       }\r
+               }\r
 \r
-               if (i < DEM_MAX_NUMBER_EXT_DATA_PRE_INIT) {\r
-                       memcpy(&preInitExtDataBuffer[i], extendedData, sizeof(ExtDataRecType));\r
+               if (eventIdFreePositionFound) {\r
+                       memcpy(&preInitExtDataBuffer[i-1], extendedData, sizeof(ExtDataRecType));\r
                }\r
                else {\r
                        // Error: Pre init extended data buffer full\r
-#if (DEM_DEV_ERROR_DETECT == STD_ON)\r
-                       Det_ReportError(MODULE_ID_DEM, 0, DEM_STORE_EXT_DATA_PRE_INIT_ID, DEM_E_PRE_INIT_EXT_DATA_BUFF_FULL);\r
-#endif\r
+                       DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_STORE_EXT_DATA_PRE_INIT_ID, DEM_E_PRE_INIT_EXT_DATA_BUFF_FULL);\r
                }\r
        }\r
 \r
-       McuE_ExitCriticalSection(state);\r
+    Irq_Restore(state);\r
 }\r
 \r
-\r
 /*\r
  * Procedure:  storeEventPriMem\r
  * Description:        Store the event data of "eventStatus->eventId" in "priMemEventBuffer",\r
  *                             if non existent a new entry is created.\r
  */\r
-static void storeEventPriMem(const Dem_EventParameterType *eventParam, EventStatusRecType *eventStatus)\r
+static void storeEventPriMem(const Dem_EventParameterType *eventParam, const EventStatusRecType *eventStatus)\r
 {\r
+       boolean eventIdFound = FALSE;\r
+       boolean eventIdFreePositionFound=FALSE;\r
        uint16 i;\r
-       imask_t state = McuE_EnterCriticalSection();\r
+       imask_t state;\r
+    Irq_Save(state);\r
 \r
+       (void)*eventParam;      // Currently not used, do this to avoid warning\r
 \r
        // Lookup event ID\r
-       for (i = 0; (priMemEventBuffer[i].eventId != eventStatus->eventId) && (i < DEM_MAX_NUMBER_EVENT_ENTRY_PRI); i++);\r
+       for (i = 0; (i < DEM_MAX_NUMBER_EVENT_ENTRY_PRI) && (!eventIdFound); i++){\r
+               eventIdFound = (priMemEventBuffer[i].eventId == eventStatus->eventId);\r
+       }\r
 \r
-       if (i < DEM_MAX_NUMBER_EVENT_ENTRY_PRI) {\r
+       if (eventIdFound) {\r
                // Update event found\r
-               priMemEventBuffer[i].occurrence = eventStatus->occurrence;\r
-               priMemEventBuffer[i].checksum = calcChecksum(&priMemEventBuffer[i], sizeof(EventRecType)-sizeof(ChecksumType));\r
+               priMemEventBuffer[i-1].occurrence = eventStatus->occurrence;\r
+               priMemEventBuffer[i-1].eventStatusExtended = eventStatus->eventStatusExtended;\r
+               priMemEventBuffer[i-1].checksum = calcChecksum(&priMemEventBuffer[i-1], sizeof(EventRecType)-sizeof(ChecksumType));\r
        }\r
        else {\r
                // Search for free position\r
-               for (i=0; (priMemEventBuffer[i].eventId != DEM_EVENT_ID_NULL) && (i < DEM_MAX_NUMBER_EVENT_ENTRY_PRI); i++);\r
+               for (i=0; (i < DEM_MAX_NUMBER_EVENT_ENTRY_PRI) && (!eventIdFreePositionFound); i++){\r
+                       eventIdFreePositionFound = (priMemEventBuffer[i].eventId == DEM_EVENT_ID_NULL);\r
+               }\r
 \r
-               if (i < DEM_MAX_NUMBER_EVENT_ENTRY_PRI) {\r
-                       priMemEventBuffer[i].eventId = eventStatus->eventId;\r
-                       priMemEventBuffer[i].occurrence = eventStatus->occurrence;\r
-                       priMemEventBuffer[i].checksum = calcChecksum(&priMemEventBuffer[i], sizeof(EventRecType)-sizeof(ChecksumType));\r
+\r
+               if (eventIdFreePositionFound) {\r
+                       priMemEventBuffer[i-1].eventId = eventStatus->eventId;\r
+                       priMemEventBuffer[i-1].occurrence = eventStatus->occurrence;\r
+                       priMemEventBuffer[i-1].eventStatusExtended = eventStatus->eventStatusExtended;\r
+                       priMemEventBuffer[i-1].checksum = calcChecksum(&priMemEventBuffer[i-1], sizeof(EventRecType)-sizeof(ChecksumType));\r
                }\r
                else {\r
                        // Error: Pri mem event buffer full\r
-#if (DEM_DEV_ERROR_DETECT == STD_ON)\r
-                       Det_ReportError(MODULE_ID_DEM, 0, DEM_STORE_EVENT_PRI_MEM_ID, DEM_E_PRI_MEM_EVENT_BUFF_FULL);\r
-#endif\r
+                       DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_STORE_EVENT_PRI_MEM_ID, DEM_E_PRI_MEM_EVENT_BUFF_FULL);\r
                }\r
        }\r
 \r
-       McuE_ExitCriticalSection(state);\r
+    Irq_Restore(state);\r
 }\r
 \r
-\r
 /*\r
  * Procedure:  deleteEventPriMem\r
  * Description:        Delete the event data of "eventParam->eventId" from "priMemEventBuffer".\r
  */\r
 static void deleteEventPriMem(const Dem_EventParameterType *eventParam)\r
 {\r
+       boolean eventIdFound = FALSE;\r
        uint16 i;\r
-       imask_t state = McuE_EnterCriticalSection();\r
+       imask_t state;\r
+    Irq_Save(state);\r
 \r
+       for (i = 0; (i < DEM_MAX_NUMBER_EVENT_ENTRY_PRI) && (!eventIdFound); i++){\r
+               eventIdFound = (priMemEventBuffer[i].eventId == eventParam->EventID);\r
+       }\r
 \r
-       // Lookup event ID\r
-       for (i = 0; (priMemEventBuffer[i].eventId != eventParam->EventID) && (i < DEM_MAX_NUMBER_EVENT_ENTRY_PRI); i++);\r
-\r
-       if (i < DEM_MAX_NUMBER_EVENT_ENTRY_PRI) {\r
-               // Delete event found\r
-               memset(&priMemEventBuffer[i], 0, sizeof(EventRecType));\r
+       if (eventIdFound) {\r
+               memset(&priMemEventBuffer[i-1], 0, sizeof(EventRecType));\r
        }\r
 \r
-       McuE_ExitCriticalSection(state);\r
+    Irq_Restore(state);\r
 }\r
 \r
-\r
 /*\r
  * Procedure:  storeEventEvtMem\r
  * Description:        Store the event data of "eventStatus->eventId" in event memory according to\r
  *                             "eventParam" destination option.\r
  */\r
-static void storeEventEvtMem(const Dem_EventParameterType *eventParam, EventStatusRecType *eventStatus)\r
+static void storeEventEvtMem(const Dem_EventParameterType *eventParam, const EventStatusRecType *eventStatus)\r
 {\r
        uint16 i;\r
 \r
-       for (i = 0; (i < DEM_MAX_NR_OF_EVENT_DESTINATION) && (eventParam->EventClass->EventDestination[i] != NULL); i++) {\r
+       for (i = 0; (i < DEM_MAX_NR_OF_EVENT_DESTINATION)\r
+                                && (eventParam->EventClass->EventDestination[i] != DEM_EVENT_DESTINATION_END_OF_LIST); i++) {\r
                switch (eventParam->EventClass->EventDestination[i])\r
                {\r
                case DEM_DTC_ORIGIN_PRIMARY_MEMORY:\r
-                       storeEventPriMem(eventParam, eventStatus);\r
+                       storeEventPriMem(eventParam, eventStatus);      /** @req DEM010 */\r
                        break;\r
 \r
                case DEM_DTC_ORIGIN_SECONDARY_MEMORY:\r
                case DEM_DTC_ORIGIN_PERMANENT_MEMORY:\r
                case DEM_DTC_ORIGIN_MIRROR_MEMORY:\r
                        // Not yet supported\r
-#if (DEM_DEV_ERROR_DETECT == STD_ON)\r
-                       Det_ReportError(MODULE_ID_DEM, 0, DEM_GLOBAL_ID, DEM_E_NOT_IMPLEMENTED_YET);\r
-#endif\r
+                       DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_GLOBAL_ID, DEM_E_NOT_IMPLEMENTED_YET);\r
                        break;\r
                default:\r
                        break;\r
@@ -848,67 +1333,74 @@ static void storeEventEvtMem(const Dem_EventParameterType *eventParam, EventStat
  * Description:        Store the extended data pointed by "extendedData" to the "priMemExtDataBuffer",\r
  *                             if non existent a new entry is created.\r
  */\r
-static void storeExtendedDataPriMem(const Dem_EventParameterType *eventParam, ExtDataRecType *extendedData)\r
+static void storeExtendedDataPriMem(const Dem_EventParameterType *eventParam, const ExtDataRecType *extendedData) /** @req DEM041 */\r
 {\r
+       boolean eventIdFound = FALSE;\r
+       boolean eventIdFreePositionFound=FALSE;\r
        uint16 i;\r
-       imask_t state = McuE_EnterCriticalSection();\r
+       imask_t state;\r
+    Irq_Save(state);\r
 \r
        // Check if already stored\r
-       for (i = 0; (priMemExtDataBuffer[i].eventId != eventParam->EventID) && (i<DEM_MAX_NUMBER_EXT_DATA_PRI_MEM); i++);\r
+       for (i = 0; (i<DEM_MAX_NUMBER_EXT_DATA_PRI_MEM) && (!eventIdFound); i++){\r
+               eventIdFound = (priMemExtDataBuffer[i].eventId == eventParam->EventID);\r
+       }\r
 \r
-       if (i < DEM_MAX_NUMBER_EXT_DATA_PRI_MEM) {\r
+       if (eventIdFound) {\r
                // Yes, overwrite existing\r
-               memcpy(&priMemExtDataBuffer[i], extendedData, sizeof(ExtDataRecType));\r
+               memcpy(&priMemExtDataBuffer[i-1], extendedData, sizeof(ExtDataRecType));\r
        }\r
        else {\r
                // No, lookup first free position\r
-               for (i = 0; (priMemExtDataBuffer[i].eventId != DEM_EVENT_ID_NULL) && (i < DEM_MAX_NUMBER_EXT_DATA_PRI_MEM); i++);\r
-               if (i < DEM_MAX_NUMBER_EXT_DATA_PRI_MEM) {\r
-                       memcpy(&priMemExtDataBuffer[i], extendedData, sizeof(ExtDataRecType));\r
+               for (i = 0; (i < DEM_MAX_NUMBER_EXT_DATA_PRI_MEM) && (!eventIdFreePositionFound); i++){\r
+                       eventIdFreePositionFound =  (priMemExtDataBuffer[i].eventId == DEM_EVENT_ID_NULL);\r
+               }\r
+               if (eventIdFreePositionFound) {\r
+                       memcpy(&priMemExtDataBuffer[i-1], extendedData, sizeof(ExtDataRecType));\r
                }\r
                else {\r
                        // Error: Pri mem extended data buffer full\r
-#if (DEM_DEV_ERROR_DETECT == STD_ON)\r
-                       Det_ReportError(MODULE_ID_DEM, 0, DEM_STORE_EXT_DATA_PRI_MEM_ID, DEM_E_PRI_MEM_EXT_DATA_BUFF_FULL);\r
-#endif\r
+                       DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_STORE_EXT_DATA_PRI_MEM_ID, DEM_E_PRI_MEM_EXT_DATA_BUFF_FULL);\r
                }\r
        }\r
 \r
-       McuE_ExitCriticalSection(state);\r
+    Irq_Restore(state);\r
 }\r
 \r
-\r
 /*\r
  * Procedure:  deleteExtendedDataPriMem\r
  * Description:        Delete the extended data of "eventParam->eventId" from "priMemExtDataBuffer".\r
  */\r
 static void deleteExtendedDataPriMem(const Dem_EventParameterType *eventParam)\r
 {\r
+       boolean eventIdFound = FALSE;\r
        uint16 i;\r
-       imask_t state = McuE_EnterCriticalSection();\r
+       imask_t state;\r
+    Irq_Save(state);\r
 \r
        // Check if already stored\r
-       for (i = 0; (priMemExtDataBuffer[i].eventId != eventParam->EventID) && (i<DEM_MAX_NUMBER_EXT_DATA_PRI_MEM); i++);\r
+       for (i = 0;(i<DEM_MAX_NUMBER_EXT_DATA_PRI_MEM) && (!eventIdFound); i++){\r
+               eventIdFound = (priMemExtDataBuffer[i].eventId == eventParam->EventID);\r
+       }\r
 \r
-       if (i < DEM_MAX_NUMBER_EXT_DATA_PRI_MEM) {\r
+       if (eventIdFound) {\r
                // Yes, clear record\r
-               memset(&priMemExtDataBuffer[i], 0, sizeof(ExtDataRecType));\r
+               memset(&priMemExtDataBuffer[i-1], 0, sizeof(ExtDataRecType));\r
        }\r
 \r
-       McuE_ExitCriticalSection(state);\r
+    Irq_Restore(state);\r
 }\r
 \r
-\r
 /*\r
  * Procedure:  storeExtendedDataEvtMem\r
  * Description:        Store the extended data in event memory according to\r
  *                             "eventParam" destination option\r
  */\r
-static void storeExtendedDataEvtMem(const Dem_EventParameterType *eventParam, ExtDataRecType *extendedData)\r
+static void storeExtendedDataEvtMem(const Dem_EventParameterType *eventParam, const ExtDataRecType *extendedData)\r
 {\r
        uint16 i;\r
 \r
-       for (i = 0; (i < DEM_MAX_NR_OF_EVENT_DESTINATION) && (eventParam->EventClass->EventDestination[i] != NULL); i++) {\r
+       for (i = 0; (i < DEM_MAX_NR_OF_EVENT_DESTINATION) && (eventParam->EventClass->EventDestination[i] != DEM_EVENT_DESTINATION_END_OF_LIST); i++) {\r
                switch (eventParam->EventClass->EventDestination[i])\r
                {\r
                case DEM_DTC_ORIGIN_PRIMARY_MEMORY:\r
@@ -919,9 +1411,7 @@ static void storeExtendedDataEvtMem(const Dem_EventParameterType *eventParam, Ex
                case DEM_DTC_ORIGIN_PERMANENT_MEMORY:\r
                case DEM_DTC_ORIGIN_MIRROR_MEMORY:\r
                        // Not yet supported\r
-#if (DEM_DEV_ERROR_DETECT == STD_ON)\r
-                       Det_ReportError(MODULE_ID_DEM, 0, DEM_GLOBAL_ID, DEM_E_NOT_IMPLEMENTED_YET);\r
-#endif\r
+                       DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_GLOBAL_ID, DEM_E_NOT_IMPLEMENTED_YET);\r
                        break;\r
 \r
                default:\r
@@ -936,23 +1426,22 @@ static void storeExtendedDataEvtMem(const Dem_EventParameterType *eventParam, Ex
  * Description:        Returns TRUE if the requested extended data number was found among the configured records for the event.\r
  *                             "extDataRecClassPtr" returns a pointer to the record class, "posInExtData" returns the position in stored extended data.\r
  */\r
-static boolean lookupExtendedDataRecNumParam(uint8 extendedDataNumber, const Dem_EventParameterType *eventParam, Dem_ExtendedDataRecordClassType const **extDataRecClassPtr, uint8 *posInExtData)\r
+static boolean lookupExtendedDataRecNumParam(uint8 extendedDataNumber, const Dem_EventParameterType *eventParam, Dem_ExtendedDataRecordClassType const **extDataRecClassPtr, uint16 *posInExtData)\r
 {\r
        boolean recNumFound = FALSE;\r
 \r
        if (eventParam->ExtendedDataClassRef != NULL) {\r
-               Dem_ExtendedDataRecordClassType const* const* extDataRecClassRefList = eventParam->ExtendedDataClassRef->ExtendedDataRecordClassRef;\r
                uint16  byteCnt = 0;\r
                uint16 i;\r
 \r
                // Request extended data and copy it to the buffer\r
-               for (i = 0; (i < DEM_MAX_NR_OF_RECORDS_IN_EXTENDED_DATA) && (extDataRecClassRefList[i] != NULL) && !recNumFound; i++) {\r
-                       if (extDataRecClassRefList[i]->RecordNumber == extendedDataNumber) {\r
-                               *extDataRecClassPtr =  extDataRecClassRefList[i];\r
+               for (i = 0; (i < DEM_MAX_NR_OF_RECORDS_IN_EXTENDED_DATA) && (eventParam->ExtendedDataClassRef->ExtendedDataRecordClassRef[i] != NULL) && (!recNumFound); i++) {\r
+                       if (eventParam->ExtendedDataClassRef->ExtendedDataRecordClassRef[i]->RecordNumber == extendedDataNumber) {\r
+                               *extDataRecClassPtr =  eventParam->ExtendedDataClassRef->ExtendedDataRecordClassRef[i];\r
                                *posInExtData = byteCnt;\r
                                recNumFound = TRUE;\r
                        }\r
-                       byteCnt += extDataRecClassRefList[i]->DataSize;\r
+                       byteCnt += eventParam->ExtendedDataClassRef->ExtendedDataRecordClassRef[i]->DataSize;\r
                }\r
        }\r
 \r
@@ -967,63 +1456,295 @@ static boolean lookupExtendedDataRecNumParam(uint8 extendedDataNumber, const Dem
 static boolean lookupExtendedDataPriMem(Dem_EventIdType eventId, ExtDataRecType **extData)\r
 {\r
        boolean eventIdFound = FALSE;\r
-       uint16 i;\r
+       sint16 i;\r
 \r
        // Lookup corresponding extended data\r
-       for (i = 0; (priMemExtDataBuffer[i].eventId != eventId) && (i < DEM_MAX_NUMBER_EXT_DATA_PRI_MEM); i++);\r
+       for (i = 0; (i < DEM_MAX_NUMBER_EXT_DATA_PRI_MEM) && (!eventIdFound); i++) {\r
+               eventIdFound = (priMemExtDataBuffer[i].eventId == eventId);\r
+       }\r
 \r
-       if (i < DEM_MAX_NUMBER_EXT_DATA_PRI_MEM) {\r
+       if (eventIdFound) {\r
                // Yes, return pointer\r
-               *extData = &priMemExtDataBuffer[i];\r
-               eventIdFound = TRUE;\r
+               *extData = &priMemExtDataBuffer[i-1];\r
        }\r
 \r
        return eventIdFound;\r
 }\r
+/*\r
+ * Procedure:  copyNvmMirror\r
+ * Description: Copies Nvram to buffer\r
+ */\r
 \r
-\r
-static void storeFreezeFrameDataPriMem(const Dem_EventParameterType *eventParam, FreezeFrameRecType *freezeFrame)\r
+Std_ReturnType copyNvmMirror(const NvM_BlockIdType BlockId, uint8 *dstPtr, const uint8 *srcPtr, uint8 len)\r
 {\r
-       // TODO: Fill out\r
-}\r
 \r
+#if (DEM_USE_NVM == STD_ON)\r
+       Std_ReturnType blockReadStatus = E_NOT_OK;\r
+       NvM_RequestResultType requestResult;\r
 \r
-static void deleteFreezeFrameDataPriMem(const Dem_EventParameterType *eventParam)\r
-{\r
-       // TODO: Fill out\r
-}\r
+    if( BlockId != 0 ) {\r
+               NvM_GetErrorStatus(BlockId, &requestResult);\r
+               if(requestResult != NVM_REQ_PENDING ) {\r
+                       memcpy(dstPtr, srcPtr, len);\r
+                       blockReadStatus = E_OK;\r
+               }\r
+    }\r
 \r
+    return blockReadStatus;\r
+#else\r
+    return E_OK;\r
+#endif\r
+}\r
+/*\r
+ * Procedure:  writeNvmMirror\r
+ * Description: store data in NVRam\r
+ */\r
+Std_ReturnType writeNvmMirror(const NvM_BlockIdType BlockId, uint8 *dstPtr, const uint8 *srcPtr, uint8 len)\r
+{\r
+#if (DEM_USE_NVM == STD_ON)\r
+       Std_ReturnType blockWriteStatus = E_NOT_OK;\r
+       NvM_RequestResultType requestResult;\r
+\r
+    if( BlockId != 0 ) {\r
+       NvM_GetErrorStatus(BlockId, &requestResult);\r
+               if(requestResult != NVM_REQ_PENDING ) {\r
+                       memcpy(dstPtr, srcPtr, len);\r
+                       (void)NvM_WriteBlock(BlockId, (const uint8*)dstPtr);\r
+                       blockWriteStatus = E_OK;\r
+               }\r
+    }\r
+\r
+    return blockWriteStatus;\r
+#else\r
+    return E_OK;\r
+#endif\r
+}\r
+\r
+/*\r
+ * Procedure:  storeAgingRecPerMem\r
+ * Description: store aging records in NVRam\r
+ */\r
+static void storeAgingRecPerMem(const NvM_BlockIdType AgingBlockId)\r
+{\r
+       imask_t state;\r
+\r
+       Irq_Save(state);\r
+\r
+       if( E_OK == writeNvmMirror(AgingBlockId, (uint8 *)HealingMirrorBuffer, (const uint8 *)priMemAgingBuffer, sizeof(priMemAgingBuffer)) ){\r
+               AgingIsModified = FALSE;\r
+       } else {\r
+               AgingIsModified = TRUE;\r
+       }\r
+\r
+       Irq_Restore(state);\r
+}\r
+/*\r
+ * Procedure:  deleteAgingRecPriMem\r
+ * Description: delete aging record in primary memory\r
+ */\r
+static void deleteAgingRecPriMem(const Dem_EventParameterType *eventParam)\r
+{\r
+       uint16 i;\r
+       imask_t state;\r
+\r
+       Irq_Save(state);\r
+\r
+       for (i = 0; i<DEM_MAX_NUMBER_FF_DATA_PRI_MEM; i++){\r
+               if (priMemAgingBuffer[i].eventId == eventParam->EventID){\r
+                       memset(&priMemAgingBuffer[i], 0, sizeof(HealingRecType));\r
+               }\r
+       }\r
+\r
+       Irq_Restore(state);\r
+}\r
+\r
+/*\r
+ * Procedure:  storeFreezeFrameDataPriMem\r
+ * Description: store FreezeFrame data record in primary memory\r
+ */\r
+static void storeFreezeFrameDataPriMem(const Dem_EventParameterType *eventParam, const FreezeFrameRecType *freezeFrame)\r
+{\r
+       boolean eventIdFound = FALSE;\r
+       boolean eventIdFreePositionFound=FALSE;\r
+       boolean displacementPositionFound=FALSE;\r
+       FreezeFrameRecType *freezeFrameLocal;\r
+       uint16 i;\r
+       imask_t state;\r
+\r
+       Irq_Save(state);\r
+\r
+       /* Check if already stored */\r
+       for (i = 0; (i<DEM_MAX_NUMBER_FF_DATA_PRI_MEM) && (!eventIdFound); i++){\r
+               eventIdFound = ((priMemFreezeFrameBuffer[i].eventId == eventParam->EventID) && (priMemFreezeFrameBuffer[i].recordNumber == freezeFrame->recordNumber));\r
+       }\r
+\r
+       if (eventIdFound) {\r
+               memcpy(&priMemFreezeFrameBuffer[i-1], freezeFrame, sizeof(FreezeFrameRecType));\r
+       }\r
+       else {\r
+               for (i = 0; (i < DEM_MAX_NUMBER_FF_DATA_PRI_MEM) && (!eventIdFreePositionFound); i++){\r
+                       eventIdFreePositionFound =  (priMemFreezeFrameBuffer[i].eventId == DEM_EVENT_ID_NULL);\r
+               }\r
+               if (eventIdFreePositionFound) {\r
+                       memcpy(&priMemFreezeFrameBuffer[i-1], freezeFrame, sizeof(FreezeFrameRecType));\r
+               }\r
+               else {\r
+                       displacementPositionFound = lookupFreezeFrameForDisplacement(&freezeFrameLocal);\r
+                       if(displacementPositionFound){\r
+                               memcpy(freezeFrameLocal, freezeFrame, sizeof(FreezeFrameRecType));\r
+                       }\r
+                       else{\r
+                               DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_STORE_FF_DATA_PRI_MEM_ID, DEM_E_PRI_MEM_FF_DATA_BUFF_FULL);\r
+                       }\r
+               }\r
+       }\r
+\r
+       Irq_Restore(state);\r
+}\r
+/*\r
+ * Procedure:  storeFreezeFrameDataPerMem\r
+ * Description:        Store the freeze frame data in NVRam\r
+ * \r
+ */\r
+static void storeFreezeFrameDataPerMem()\r
+{\r
+       imask_t state;\r
+\r
+       Irq_Save(state);\r
+\r
+       for(uint16 i = 0; i < DEM_MAX_NUMBER_FF_DATA_PRI_MEM; i++){\r
+               if(memcmp(&priMemFreezeFrameBuffer[i], FreezeFrameMirrorBuffer[i], sizeof(FreezeFrameRecType))){\r
+                       if( E_NOT_OK == writeNvmMirror(FreezeFrameBlockId[i], (uint8 *)FreezeFrameMirrorBuffer[i], (const uint8 *)&priMemFreezeFrameBuffer[i], sizeof(FreezeFrameRecType)) ) {\r
+                               FFIsModified = TRUE;\r
+                       }\r
+               }\r
+       }\r
+\r
+       Irq_Restore(state);\r
+}\r
+\r
+// PC-Lint (715 etc): Remove errors until function is filled.\r
+//lint -e{715}         Symbol not referenced\r
+static void deleteFreezeFrameDataPriMem(const Dem_EventParameterType *eventParam)\r
+{\r
+       uint16 i;\r
+       imask_t state;\r
+\r
+       Irq_Save(state);\r
+\r
+       for (i = 0; i<DEM_MAX_NUMBER_FF_DATA_PRI_MEM; i++){\r
+               if (priMemFreezeFrameBuffer[i].eventId == eventParam->EventID){\r
+                       memset(&priMemFreezeFrameBuffer[i], 0, sizeof(FreezeFrameRecType));\r
+\r
+               }\r
+       }\r
+\r
+       Irq_Restore(state);\r
+}\r
 \r
 /*\r
  * Procedure:  storeFreezeFrameDataEvtMem\r
  * Description:        Store the freeze frame data in event memory according to\r
  *                             "eventParam" destination option\r
  */\r
-static void storeFreezeFrameDataEvtMem(const Dem_EventParameterType *eventParam, FreezeFrameRecType *freezeFrame)\r
+static void storeFreezeFrameDataEvtMem(const Dem_EventParameterType *eventParam, const FreezeFrameRecType *freezeFrame)\r
 {\r
        uint16 i;\r
 \r
-       for (i = 0; (i < DEM_MAX_NR_OF_EVENT_DESTINATION) && (eventParam->EventClass->EventDestination[i] != NULL); i++) {\r
+       for (i = 0; (i < DEM_MAX_NR_OF_EVENT_DESTINATION) && (eventParam->EventClass->EventDestination[i] != DEM_EVENT_DESTINATION_END_OF_LIST); i++) {\r
                switch (eventParam->EventClass->EventDestination[i])\r
                {\r
                case DEM_DTC_ORIGIN_PRIMARY_MEMORY:\r
                        storeFreezeFrameDataPriMem(eventParam, freezeFrame);\r
+                       storeFreezeFrameDataPerMem();\r
                        break;\r
 \r
-               case DEM_DTC_ORIGIN_SECONDARY_MEMORY:\r
                case DEM_DTC_ORIGIN_PERMANENT_MEMORY:\r
+               case DEM_DTC_ORIGIN_SECONDARY_MEMORY:\r
                case DEM_DTC_ORIGIN_MIRROR_MEMORY:\r
                        // Not yet supported\r
-#if (DEM_DEV_ERROR_DETECT == STD_ON)\r
-                       Det_ReportError(MODULE_ID_DEM, 0, DEM_GLOBAL_ID, DEM_E_NOT_IMPLEMENTED_YET);\r
-#endif\r
+                       DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_GLOBAL_ID, DEM_E_NOT_IMPLEMENTED_YET);\r
                        break;\r
+\r
                default:\r
                        break;\r
                }\r
        }\r
 }\r
 \r
+/*\r
+ * Procedure:  lookupFreezeFrameDataRecNumParam\r
+ * Description:        Returns TRUE if the requested freezeFrame data number was found among the configured records for the event.\r
+ *                             "freezeFrameClassPtr" returns a pointer to the record class.\r
+ */\r
+static boolean lookupFreezeFrameDataRecNumParam(uint8 recordNumber, const Dem_EventParameterType *eventParam, Dem_FreezeFrameClassType const **freezeFrameClassPtr)\r
+{\r
+       boolean recNumFound = FALSE;\r
+       uint16 i;\r
+\r
+       if (eventParam->FreezeFrameClassRef != NULL) {\r
+               for (i = 0; (i < DEM_MAX_NR_OF_CLASSES_IN_FREEZEFRAME_DATA) && (eventParam->FreezeFrameClassRef[i] != NULL) && (!recNumFound); i++) {\r
+                       if (eventParam->FreezeFrameClassRef[i]->FFRecordNumber == recordNumber) {\r
+                               *freezeFrameClassPtr =  eventParam->FreezeFrameClassRef[i];\r
+                               recNumFound = TRUE;\r
+                       }\r
+               }\r
+       }\r
+\r
+       return recNumFound;\r
+}\r
+\r
+/*\r
+ * Procedure:  lookupFreezeFrameDataSize\r
+ * Description:        Returns TRUE if the requested freezeFrame data size was obtained successfully from the configuration.\r
+ *                             "dataSize" returns a pointer to the data size.\r
+ */\r
+static boolean lookupFreezeFrameDataSize(uint8 recordNumber, Dem_FreezeFrameClassType const  **freezeFrameClassPtr, uint16 *dataSize)\r
+{\r
+       Std_ReturnType callbackReturnCode;\r
+       boolean dataSizeFound = TRUE;\r
+       uint16 dataSizeLocal = 0;\r
+       uint16 i;\r
+\r
+       if (*freezeFrameClassPtr != NULL) {\r
+               for (i = 0; (i < DEM_MAX_NR_OF_RECORDS_IN_FREEZEFRAME_DATA) && ((*freezeFrameClassPtr)->FFIdClassRef[i].Arc_EOL != TRUE); i++) {\r
+                       if((*freezeFrameClassPtr)->FFIdClassRef[i].DidReadDataLengthFnc != NULL){\r
+                               callbackReturnCode = (*freezeFrameClassPtr)->FFIdClassRef[i].DidReadDataLengthFnc(&dataSizeLocal);\r
+                               if(callbackReturnCode != E_OK){\r
+                                       return (dataSizeFound = FALSE);\r
+                               }\r
+                       }\r
+                       else{\r
+                               dataSizeLocal = (*freezeFrameClassPtr)->FFIdClassRef[i].PidOrDidSize;\r
+                       }\r
+\r
+                       *dataSize += dataSizeLocal + DEM_DID_IDENTIFIER_SIZE_OF_BYTES;\r
+               }\r
+\r
+       }\r
+\r
+       return dataSizeFound;\r
+}\r
+\r
+/*\r
+ * Procedure:  lookupFreezeFrameDataPriMem\r
+ * Description: Returns TRUE if the requested event id is found, "freezeFrame" points to the found data.\r
+ */\r
+static boolean lookupFreezeFrameDataPriMem(Dem_EventIdType eventId,uint8 recordNumber, FreezeFrameRecType **freezeFrame)\r
+{\r
+       boolean eventIdFound = FALSE;\r
+       uint16 i;\r
+\r
+       for (i = 0; (i < DEM_MAX_NUMBER_FF_DATA_PRI_MEM) && (!eventIdFound); i++) {\r
+               eventIdFound = ((priMemFreezeFrameBuffer[i].eventId == eventId) && (priMemFreezeFrameBuffer[i].recordNumber == recordNumber));\r
+       }\r
+\r
+       if (eventIdFound) {\r
+               *freezeFrame = &priMemFreezeFrameBuffer[i-1];\r
+       }\r
+\r
+       return eventIdFound;\r
+}\r
 \r
 /*\r
  * Procedure:  handlePreInitEvent\r
@@ -1037,7 +1758,6 @@ static void handlePreInitEvent(Dem_EventIdType eventId, Dem_EventStatusType even
        FreezeFrameRecType freezeFrameLocal;\r
        ExtDataRecType extendedDataLocal;\r
 \r
-       // Find configuration for this event\r
        lookupEventIdParameter(eventId, &eventParam);\r
        if (eventParam != NULL) {\r
                if (eventParam->EventClass->OperationCycleRef < DEM_OPERATION_CYCLE_ID_ENDMARK) {\r
@@ -1050,21 +1770,19 @@ static void handlePreInitEvent(Dem_EventIdType eventId, Dem_EventStatusType even
                                }\r
 \r
                                if (eventStatusLocal.errorStatusChanged) {\r
-\r
                                        if (eventStatusLocal.eventStatusExtended & DEM_TEST_FAILED) {\r
-                                               // Collect freeze frame data\r
-                                               getFreezeFrameData(eventParam, &freezeFrameLocal);\r
-                                               if (freezeFrameLocal.eventId != DEM_EVENT_ID_NULL) {\r
-                                                       storeFreezeFrameDataPreInit(eventParam, &freezeFrameLocal);\r
-                                               }\r
-\r
-                                               // Collect extended data\r
                                                getExtendedData(eventParam, &extendedDataLocal);\r
                                                if (extendedDataLocal.eventId != DEM_EVENT_ID_NULL) {\r
                                                        storeExtendedDataPreInit(eventParam, &extendedDataLocal);\r
                                                }\r
+                                               getFreezeFrameData(eventParam, &freezeFrameLocal,eventStatus,&eventStatusLocal);\r
+                                               if (freezeFrameLocal.eventId != DEM_EVENT_ID_NULL) {\r
+                                                       storeFreezeFrameDataPreInit(eventParam, &freezeFrameLocal);\r
+                                               }\r
                                        }\r
                                }\r
+\r
+\r
                        }\r
                        else {\r
                                // Operation cycle not started\r
@@ -1095,30 +1813,34 @@ static Std_ReturnType handleEvent(Dem_EventIdType eventId, Dem_EventStatusType e
        EventStatusRecType eventStatusLocal;\r
        FreezeFrameRecType freezeFrameLocal;\r
        ExtDataRecType extendedDataLocal;\r
+       Dem_EventStatusType eventStatusTemp = eventStatus;\r
 \r
-       // Find configuration for this event\r
        lookupEventIdParameter(eventId, &eventParam);\r
        if (eventParam != NULL) {\r
                if (eventParam->EventClass->OperationCycleRef < DEM_OPERATION_CYCLE_ID_ENDMARK) {\r
                        if (operationCycleStateList[eventParam->EventClass->OperationCycleRef] == DEM_CYCLE_STATE_START) {\r
-                               if (!(disableDtcStorage.storageDisabled && checkDtcGroup(disableDtcStorage.dtcGroup, eventParam) && checkDtcKind(disableDtcStorage.dtcKind, eventParam)))  {\r
+                               if ((!((disableDtcStorage.storageDisabled) && (checkDtcGroup(disableDtcStorage.dtcGroup, eventParam)) && (checkDtcKind(disableDtcStorage.dtcKind, eventParam)))))  {\r
                                        updateEventStatusRec(eventParam, eventStatus, TRUE, &eventStatusLocal);\r
                                        if (eventStatusLocal.errorStatusChanged) {\r
+                                               storeEventEvtMem(eventParam, &eventStatusLocal); /** @req DEM184 */\r
                                                if (eventStatusLocal.eventStatusExtended & DEM_TEST_FAILED) {\r
-                                                       storeEventEvtMem(eventParam, &eventStatusLocal);\r
-                                                       // Collect freeze frame data\r
-                                                       getFreezeFrameData(eventParam, &freezeFrameLocal);\r
-                                                       if (freezeFrameLocal.eventId != DEM_EVENT_ID_NULL) {\r
-                                                               storeFreezeFrameDataEvtMem(eventParam, &freezeFrameLocal);\r
-                                                       }\r
-\r
-                                                       // Collect extended data\r
                                                        getExtendedData(eventParam, &extendedDataLocal);\r
                                                        if (extendedDataLocal.eventId != DEM_EVENT_ID_NULL)\r
                                                        {\r
                                                                storeExtendedDataEvtMem(eventParam, &extendedDataLocal);\r
                                                        }\r
                                                }\r
+\r
+                                               if ((eventStatusTemp == DEM_EVENT_STATUS_PREFAILED)\r
+                                                               || (eventStatusLocal.eventStatusExtended & DEM_TEST_FAILED)){\r
+                                                       getFreezeFrameData(eventParam, &freezeFrameLocal,eventStatus,&eventStatusLocal);\r
+                                                       if (freezeFrameLocal.eventId != DEM_EVENT_ID_NULL) {\r
+                                                               storeFreezeFrameDataEvtMem(eventParam, &freezeFrameLocal); /** @req DEM190 */\r
+                                                       }\r
+                                               }\r
+                                               else{\r
+                                                       // do nothing\r
+                                               }\r
                                        }\r
                                }\r
                        }\r
@@ -1147,15 +1869,16 @@ static Std_ReturnType handleEvent(Dem_EventIdType eventId, Dem_EventStatusType e
  */\r
 static void resetEventStatus(Dem_EventIdType eventId)\r
 {\r
-       imask_t state = McuE_EnterCriticalSection();\r
        EventStatusRecType *eventStatusRecPtr;\r
+       imask_t state;\r
+    Irq_Save(state);\r
 \r
        lookupEventStatusRec(eventId, &eventStatusRecPtr);\r
        if (eventStatusRecPtr != NULL) {\r
-               eventStatusRecPtr->eventStatusExtended &= ~DEM_TEST_FAILED;\r
+               eventStatusRecPtr->eventStatusExtended &= (Dem_EventStatusExtendedType)~DEM_TEST_FAILED; /** @req DEM187 */\r
        }\r
 \r
-       McuE_ExitCriticalSection(state);\r
+    Irq_Restore(state);\r
 }\r
 \r
 \r
@@ -1170,7 +1893,7 @@ static void getEventStatus(Dem_EventIdType eventId, Dem_EventStatusExtendedType
        // Get recorded status\r
        getEventStatusRec(eventId, &eventStatusLocal);\r
        if (eventStatusLocal.eventId == eventId) {\r
-               *eventStatusExtended = eventStatusLocal.eventStatusExtended;\r
+               *eventStatusExtended = eventStatusLocal.eventStatusExtended; /** @req DEM051 */\r
        }\r
        else {\r
                // Event Id not found, no report received.\r
@@ -1190,7 +1913,7 @@ static void getEventFailed(Dem_EventIdType eventId, boolean *eventFailed)
        // Get recorded status\r
        getEventStatusRec(eventId, &eventStatusLocal);\r
        if (eventStatusLocal.eventId == eventId) {\r
-               if (eventStatusLocal.eventStatusExtended & DEM_TEST_FAILED) {\r
+               if (eventStatusLocal.eventStatusExtended & DEM_TEST_FAILED) { /** @req DEM052 */\r
                        *eventFailed = TRUE;\r
                }\r
                else {\r
@@ -1216,7 +1939,7 @@ static void getEventTested(Dem_EventIdType eventId, boolean *eventTested)
        // Get recorded status\r
        getEventStatusRec(eventId, &eventStatusLocal);\r
        if (eventStatusLocal.eventId == eventId) {\r
-               if ( !(eventStatusLocal.eventStatusExtended & DEM_TEST_NOT_COMPLETED_THIS_OPERATION_CYCLE)) {\r
+               if ( !(eventStatusLocal.eventStatusExtended & DEM_TEST_NOT_COMPLETED_THIS_OPERATION_CYCLE)) { /** @req DEM053 */\r
                        *eventTested = TRUE;\r
                }\r
                else {\r
@@ -1248,7 +1971,7 @@ static Std_ReturnType getFaultDetectionCounter(Dem_EventIdType eventId, sint8 *c
                        case DEM_NO_PRE_DEBOUNCE:\r
                                if (eventParam->EventClass->PreDebounceAlgorithmClass->PreDebounceAlgorithm.PreDebounceMonitorInternal != NULL) {\r
                                        if (eventParam->EventClass->PreDebounceAlgorithmClass->PreDebounceAlgorithm.PreDebounceMonitorInternal->CallbackGetFDCntFnc != NULL) {\r
-                                               returnCode = eventParam->EventClass->PreDebounceAlgorithmClass->PreDebounceAlgorithm.PreDebounceMonitorInternal->CallbackGetFDCntFnc(counter);\r
+                                               returnCode = eventParam->EventClass->PreDebounceAlgorithmClass->PreDebounceAlgorithm.PreDebounceMonitorInternal->CallbackGetFDCntFnc(counter); /** @req DEM204.None */ /** @req DEM264 */ /** @req DEM265 */\r
                                        }\r
                                }\r
                                break;\r
@@ -1259,7 +1982,7 @@ static Std_ReturnType getFaultDetectionCounter(Dem_EventIdType eventId, sint8 *c
 \r
                                        lookupEventStatusRec(eventId, &eventStatusRec);\r
                                        if (eventStatusRec != NULL) {\r
-                                               *counter = eventStatusRec->faultDetectionCounter;\r
+                                               *counter = eventStatusRec->faultDetectionCounter; /** @req DEM204.Counter */\r
                                        } else {\r
                                                *counter = 0;\r
                                        }\r
@@ -1269,15 +1992,11 @@ static Std_ReturnType getFaultDetectionCounter(Dem_EventIdType eventId, sint8 *c
 \r
                        case DEM_PRE_DEBOUNCE_FREQUENCY_BASED:\r
                        case DEM_PRE_DEBOUNCE_TIME_BASED:\r
-#if (DEM_DEV_ERROR_DETECT == STD_ON)\r
-                               Det_ReportError(MODULE_ID_DEM, 0, DEM_GETFAULTDETECTIONCOUNTER_ID, DEM_E_NOT_IMPLEMENTED_YET);\r
-#endif\r
+                               DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_GETFAULTDETECTIONCOUNTER_ID, DEM_E_NOT_IMPLEMENTED_YET);\r
                                break;\r
 \r
                        default:\r
-#if (DEM_DEV_ERROR_DETECT == STD_ON)\r
-                               Det_ReportError(MODULE_ID_DEM, 0, DEM_GETFAULTDETECTIONCOUNTER_ID, DEM_E_PARAM_DATA);\r
-#endif\r
+                               DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_GETFAULTDETECTIONCOUNTER_ID, DEM_E_PARAM_DATA);\r
                                break;\r
                        }\r
                }\r
@@ -1285,7 +2004,163 @@ static Std_ReturnType getFaultDetectionCounter(Dem_EventIdType eventId, sint8 *c
 \r
        return returnCode;\r
 }\r
+/*\r
+ * Procedure:  deleteEventMemory\r
+ * Description:        If aging of an event occurs, the Dem module shall delete the event from \r
+ *                             the event memory including its event related data\r
+ */\r
+static void deleteEventMemory(const Dem_EventParameterType *eventParam)\r
+{\r
+       uint16 i;\r
 \r
+       for (i = 0; (i < DEM_MAX_NR_OF_EVENT_DESTINATION) && (eventParam->EventClass->EventDestination[i] != DEM_EVENT_DESTINATION_END_OF_LIST); i++) {\r
+               switch (eventParam->EventClass->EventDestination[i])\r
+               {\r
+               case DEM_DTC_ORIGIN_PRIMARY_MEMORY:\r
+                       deleteEventPriMem(eventParam);\r
+                       deleteFreezeFrameDataPriMem(eventParam);\r
+                       deleteExtendedDataPriMem(eventParam);\r
+                       storeFreezeFrameDataPerMem();\r
+                       break;\r
+\r
+               case DEM_DTC_ORIGIN_PERMANENT_MEMORY:\r
+                       //TODO:need to add corresponding event and extended deleting functions\r
+\r
+                       break;\r
+\r
+               case DEM_DTC_ORIGIN_SECONDARY_MEMORY:\r
+               case DEM_DTC_ORIGIN_MIRROR_MEMORY:\r
+                       // Not yet supported\r
+                       DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_GLOBAL_ID, DEM_E_NOT_IMPLEMENTED_YET);\r
+                       break;\r
+\r
+               default:\r
+                       break;\r
+               }\r
+\r
+       }\r
+\r
+}\r
+/*\r
+ * Procedure:  lookupAgingRecPriMem\r
+ * Description:        Returns the pointer to event id parameters of "eventId" in "*priMemAgingBuffer",\r
+ *                             if not found NULL is returned.\r
+ */\r
+static boolean lookupAgingRecPriMem(Dem_EventIdType eventId, const HealingRecType **agingRec)\r
+{\r
+       uint16 i;\r
+       boolean agingRecFound = FALSE;\r
+\r
+       for (i = 0; i < DEM_MAX_NUMBER_AGING_PRI_MEM && (!agingRecFound); i++) {\r
+               if(priMemAgingBuffer[i].eventId == eventId){\r
+                       agingRecFound = TRUE;\r
+               }\r
+\r
+       }\r
+\r
+       if(agingRecFound){\r
+               *agingRec = &priMemAgingBuffer[i-1];\r
+       }\r
+       else{\r
+               *agingRec = NULL;\r
+       }\r
+\r
+       return agingRecFound;\r
+\r
+}\r
+\r
+\r
+/*\r
+ * Procedure:  handleAging\r
+ * Description:        according to the operation state of "operationCycleId" to "cycleState" , handle the aging relatived data\r
+ *                             Returns E_OK if operation was successful else E_NOT_OK.\r
+ */\r
+static Std_ReturnType handleAging(Dem_OperationCycleIdType operationCycleId, Dem_OperationCycleStateType cycleState)\r
+{\r
+       uint16 i;\r
+       Std_ReturnType returnCode = E_OK;\r
+       HealingRecType *agingRecLocal = NULL;\r
+       boolean agingRecFound = FALSE;\r
+\r
+       if (operationCycleId < DEM_OPERATION_CYCLE_ID_ENDMARK) {\r
+               switch (cycleState)\r
+               {\r
+               case DEM_CYCLE_STATE_START:\r
+                       break;\r
+\r
+               case DEM_CYCLE_STATE_END:/** @req Dem490 */\r
+                       for (i = 0; i < DEM_MAX_NUMBER_EVENT; i++) {\r
+                               if(eventStatusBuffer[i].eventId != DEM_EVENT_ID_NULL){\r
+                                       if(eventStatusBuffer[i].eventParamRef != NULL){\r
+                                               if(eventStatusBuffer[i].eventParamRef->EventClass != NULL){\r
+                                                       if((eventStatusBuffer[i].eventParamRef->EventClass->HealingAllowed == TRUE)\\r
+                                                               && (eventStatusBuffer[i].eventParamRef->EventClass->HealingCycleRef == operationCycleId)){\r
+                                                               if((eventStatusBuffer[i].eventStatusExtended & DEM_CONFIRMED_DTC)\\r
+                                                                       && (!(eventStatusBuffer[i].eventStatusExtended & DEM_TEST_FAILED))\\r
+                                                                       && (!(eventStatusBuffer[i].eventStatusExtended & DEM_TEST_NOT_COMPLETED_THIS_OPERATION_CYCLE))){\r
+                                                                       agingRecFound = lookupAgingRecPriMem(eventStatusBuffer[i].eventId, (const HealingRecType **)(&agingRecLocal));\r
+                                                                       if(agingRecFound){\r
+                                                                               agingRecLocal->agingCounter++;/** @req Dem489 */\r
+                                                                               agingRecLocal->checksum = calcChecksum(agingRecLocal,sizeof(HealingRecType) - sizeof(ChecksumType));\r
+                                                                               if(agingRecLocal->agingCounter > eventStatusBuffer[i].eventParamRef->EventClass->HealingCycleCounter){\r
+                                                                                       //deleteEventMemory(eventStatusBuffer[i].eventParamRef); /** @req Dem497 */\r
+\r
+                                                                                       deleteAgingRecPriMem(eventStatusBuffer[i].eventParamRef);\r
+\r
+                                                                                       eventStatusBuffer[i].eventStatusExtended &= (Dem_EventStatusExtendedType)(~DEM_CONFIRMED_DTC);\r
+                                                                                       eventStatusBuffer[i].eventStatusExtended &= (Dem_EventStatusExtendedType)(~DEM_PENDING_DTC);\r
+                                                                                       eventStatusBuffer[i].eventStatusExtended &= (Dem_EventStatusExtendedType)(~DEM_WARNING_INDICATOR_REQUESTED);\r
+                                                                               }\r
+                                                                               /* Set the flag,start up the storage of NVRam in main function. */\r
+                                                                               AgingIsModified = TRUE;\r
+                                                                       }\r
+                                                                       else{\r
+                                                                               /* If it does exist,establish a new record for the corresponding event */\r
+                                                                               agingRecFound = lookupAgingRecPriMem(DEM_EVENT_ID_NULL, (const HealingRecType **)(&agingRecLocal));\r
+                                                                               if(agingRecFound){\r
+                                                                                       agingRecLocal->eventId = eventStatusBuffer[i].eventId;\r
+                                                                                       agingRecLocal->agingCounter++;\r
+                                                                                       agingRecLocal->checksum = calcChecksum(agingRecLocal,sizeof(HealingRecType) - sizeof(ChecksumType));\r
+                                                                                       AgingIsModified = TRUE;\r
+                                                                               }\r
+                                                                               else{\r
+                                                                                       /* primary memory of aging records is full. */\r
+                                                                               }\r
+                                                                       }\r
+                                                               }\r
+                                                               else{\r
+                                                                       /* If the status bit testFailed (bit 0) is set during the operation cycle, the counter shall be reset. */\r
+                                                                       if(eventStatusBuffer[i].eventStatusExtended & DEM_TEST_FAILED){\r
+                                                                               agingRecFound = lookupAgingRecPriMem(eventStatusBuffer[i].eventId, (const HealingRecType **)(&agingRecLocal));\r
+                                                                               if(agingRecFound){\r
+                                                                                       if(agingRecLocal->agingCounter){\r
+                                                                                               agingRecLocal->agingCounter = 0;\r
+                                                                                               agingRecLocal->checksum = calcChecksum(agingRecLocal,sizeof(HealingRecType) - sizeof(ChecksumType));\r
+                                                                                               AgingIsModified = TRUE;\r
+                                                                                       }\r
+                                                                               }\r
+                                                                       }\r
+                                                               }\r
+                                                       }\r
+                                               }\r
+                                       }\r
+                               }\r
+                       }\r
+                       break;\r
+               default:\r
+                       DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_SETOPERATIONCYCLESTATE_ID, DEM_E_PARAM_DATA);\r
+                       returnCode = E_NOT_OK;\r
+                       break;\r
+               }\r
+       }\r
+       else {\r
+               DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_SETOPERATIONCYCLESTATE_ID, DEM_E_PARAM_DATA);\r
+               returnCode = E_NOT_OK;\r
+               }\r
+\r
+       return returnCode;\r
+\r
+}\r
 \r
 /*\r
  * Procedure:  setOperationCycleState\r
@@ -1293,7 +2168,7 @@ static Std_ReturnType getFaultDetectionCounter(Dem_EventIdType eventId, sint8 *c
  *                             event connected to this cycle id.\r
  *                             Returns E_OK if operation was successful else E_NOT_OK.\r
  */\r
-static Std_ReturnType setOperationCycleState(Dem_OperationCycleIdType operationCycleId, Dem_OperationCycleStateType cycleState)\r
+static Std_ReturnType setOperationCycleState(Dem_OperationCycleIdType operationCycleId, Dem_OperationCycleStateType cycleState) /** @req DEM338 */\r
 {\r
        uint16 i;\r
        Std_ReturnType returnCode = E_OK;\r
@@ -1306,7 +2181,7 @@ static Std_ReturnType setOperationCycleState(Dem_OperationCycleIdType operationC
                        // Lookup event ID\r
                        for (i = 0; i < DEM_MAX_NUMBER_EVENT; i++) {\r
                                if ((eventStatusBuffer[i].eventId != DEM_EVENT_ID_NULL) && (eventStatusBuffer[i].eventParamRef->EventClass->OperationCycleRef == operationCycleId)) {\r
-                                       eventStatusBuffer[i].eventStatusExtended &= ~DEM_TEST_FAILED_THIS_OPERATION_CYCLE;\r
+                                       eventStatusBuffer[i].eventStatusExtended &= (Dem_EventStatusExtendedType)~DEM_TEST_FAILED_THIS_OPERATION_CYCLE;\r
                                        eventStatusBuffer[i].eventStatusExtended |= DEM_TEST_NOT_COMPLETED_THIS_OPERATION_CYCLE;\r
                                }\r
                        }\r
@@ -1317,24 +2192,21 @@ static Std_ReturnType setOperationCycleState(Dem_OperationCycleIdType operationC
                        // Lookup event ID\r
                        for (i = 0; i < DEM_MAX_NUMBER_EVENT; i++) {\r
                                if ((eventStatusBuffer[i].eventId != DEM_EVENT_ID_NULL) && (eventStatusBuffer[i].eventParamRef->EventClass->OperationCycleRef == operationCycleId)) {\r
-                                       if (!(eventStatusBuffer[i].eventStatusExtended & DEM_TEST_FAILED_THIS_OPERATION_CYCLE) && !(eventStatusBuffer[i].eventStatusExtended & DEM_TEST_NOT_COMPLETED_THIS_OPERATION_CYCLE)) {\r
-                                               eventStatusBuffer[i].eventStatusExtended &= ~DEM_PENDING_DTC;           // Clear pendingDTC bit\r
+                                       if ((!(eventStatusBuffer[i].eventStatusExtended & DEM_TEST_FAILED_THIS_OPERATION_CYCLE)) && (!(eventStatusBuffer[i].eventStatusExtended & DEM_TEST_NOT_COMPLETED_THIS_OPERATION_CYCLE))) {\r
+                                               eventStatusBuffer[i].eventStatusExtended &= (Dem_EventStatusExtendedType)~DEM_PENDING_DTC;              // Clear pendingDTC bit /** @req DEM379.PendingClear\r
+                                               storeEventEvtMem(eventStatusBuffer[i].eventParamRef, &eventStatusBuffer[i]);\r
                                        }\r
                                }\r
                        }\r
                        break;\r
                default:\r
-#if (DEM_DEV_ERROR_DETECT == STD_ON)\r
-                       Det_ReportError(MODULE_ID_DEM, 0, DEM_SETOPERATIONCYCLESTATE_ID, DEM_E_PARAM_DATA);\r
-#endif\r
+                       DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_SETOPERATIONCYCLESTATE_ID, DEM_E_PARAM_DATA);\r
                        returnCode = E_NOT_OK;\r
                        break;\r
                }\r
        }\r
        else {\r
-#if (DEM_DEV_ERROR_DETECT == STD_ON)\r
-               Det_ReportError(MODULE_ID_DEM, 0, DEM_SETOPERATIONCYCLESTATE_ID, DEM_E_PARAM_DATA);\r
-#endif\r
+               DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_SETOPERATIONCYCLESTATE_ID, DEM_E_PARAM_DATA);\r
                returnCode = E_NOT_OK;\r
                }\r
 \r
@@ -1369,16 +2241,15 @@ static Std_ReturnType setOperationCycleState(Dem_OperationCycleIdType operationC
  */\r
 void Dem_PreInit(void)\r
 {\r
-       int i, j;\r
+       /** @req DEM180 */\r
+       uint16 i, j;\r
 \r
-       if (DEM_Config.ConfigSet == NULL) {\r
-#if (DEM_DEV_ERROR_DETECT == STD_ON)\r
-               Det_ReportError(MODULE_ID_DEM, 0, DEM_PREINIT_ID, DEM_E_CONFIG_PTR_INVALID);\r
-#endif\r
-               return;\r
-       } else {\r
-               configSet = DEM_Config.ConfigSet;\r
-       }\r
+       EventStatusRecType *eventStatusRecPtr;\r
+       const Dem_EventParameterType *eventIdParamList;\r
+\r
+       VALIDATE_NO_RV(DEM_Config.ConfigSet != NULL, DEM_PREINIT_ID, DEM_E_CONFIG_PTR_INVALID);\r
+\r
+       configSet = DEM_Config.ConfigSet;\r
 \r
        // Initializion of operation cycle states.\r
        for (i = 0; i < DEM_OPERATION_CYCLE_ID_ENDMARK; i++) {\r
@@ -1395,27 +2266,49 @@ void Dem_PreInit(void)
                eventStatusBuffer[i].errorStatusChanged = FALSE;\r
        }\r
 \r
+       // Insert all supported events into event status buffer\r
+       uint16 index = 0;\r
+       eventIdParamList = configSet->EventParameter;\r
+       while( !eventIdParamList[index].Arc_EOL ) {\r
+               // Find next free position in event status buffer\r
+               lookupEventStatusRec(DEM_EVENT_ID_NULL, &eventStatusRecPtr);\r
+               if(NULL != eventStatusRecPtr) {\r
+                       eventStatusRecPtr->eventId = eventIdParamList[index].EventID;\r
+                       eventStatusRecPtr->eventParamRef = &eventIdParamList[index];\r
+               } else {\r
+                       // event status buffer is full\r
+                       DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_PREINIT_ID, DEM_E_EVENT_STATUS_BUFF_FULL);\r
+               }\r
+               index++;\r
+       }\r
+\r
+       //lint -save\r
+       //lint -e568 -e685 //PC-Lint exception.\r
+       //lint -e681 //PC-Lint exception to MISRA 14.1: Loop is not entered. This only happens when config variable is zero. Keep as it is for less complex code.\r
        // Initialize the pre init buffers\r
        for (i = 0; i < DEM_MAX_NUMBER_FF_DATA_PRE_INIT; i++) {\r
                preInitFreezeFrameBuffer[i].checksum = 0;\r
                preInitFreezeFrameBuffer[i].eventId = DEM_EVENT_ID_NULL;\r
                preInitFreezeFrameBuffer[i].occurrence = 0;\r
                preInitFreezeFrameBuffer[i].dataSize = 0;\r
-               for (j = 0; j < DEM_MAX_SIZE_FF_DATA;j++)\r
+               for (j = 0; j < DEM_MAX_SIZE_FF_DATA;j++){\r
                        preInitFreezeFrameBuffer[i].data[j] = 0;\r
+               }\r
        }\r
+       //lint -restore\r
 \r
        for (i = 0; i < DEM_MAX_NUMBER_EXT_DATA_PRE_INIT; i++) {\r
                preInitExtDataBuffer[i].checksum = 0;\r
                preInitExtDataBuffer[i].eventId = DEM_EVENT_ID_NULL;\r
                preInitExtDataBuffer[i].dataSize = 0;\r
-               for (j = 0; j < DEM_MAX_SIZE_EXT_DATA;j++)\r
+               for (j = 0; j < DEM_MAX_SIZE_EXT_DATA;j++){\r
                        preInitExtDataBuffer[i].data[j] = 0;\r
+               }\r
        }\r
 \r
        disableDtcStorage.storageDisabled = FALSE;\r
 \r
-       setOperationCycleState(DEM_ACTIVE, DEM_CYCLE_STATE_START);\r
+       (void)setOperationCycleState(DEM_ACTIVE, DEM_CYCLE_STATE_START); /** @req DEM047 */\r
 \r
        demState = DEM_PREINITIALIZED;\r
 }\r
@@ -1428,74 +2321,117 @@ void Dem_PreInit(void)
 void Dem_Init(void)\r
 {\r
        uint16 i;\r
-       ChecksumType cSum;\r
+//     ChecksumType cSum;\r
+       boolean entryValid = FALSE;\r
        const Dem_EventParameterType *eventParam;\r
 \r
-       /*\r
-        *  Validate and read out saved error log from non volatile memory\r
-        */\r
+       if(DEM_PREINITIALIZED != demState){\r
+               /*\r
+                * Dem_PreInit was has not been called since last time Dem_Shutdown was called.\r
+                * This suggests that we are resuming from sleep. According to section 5.7 in\r
+                * EcuM specification, RAM content is assumed to be still valid from the previous cycle.\r
+                * Do not read from saved error log since buffers already contains this data.\r
+                */\r
+               (void)setOperationCycleState(DEM_ACTIVE, DEM_CYCLE_STATE_START);\r
+\r
+       } else {\r
 \r
-       // Validate event records stored in primary memory\r
-       for (i = 0; i < DEM_MAX_NUMBER_EVENT_PRI_MEM; i++) {\r
-               cSum = calcChecksum(&priMemEventBuffer[i], sizeof(EventRecType)-sizeof(ChecksumType));\r
-               if ((cSum != priMemEventBuffer[i].checksum) || priMemEventBuffer[i].eventId == DEM_EVENT_ID_NULL) {\r
-                       // Unlegal record, clear the record\r
-                       memset(&priMemEventBuffer[i], 0, sizeof(EventRecType));\r
+               for(i = 0; i < DEM_MAX_NUMBER_FF_DATA_PRI_MEM; i++){\r
+                       if( E_NOT_OK == copyNvmMirror(FreezeFrameBlockId[i], (uint8 *)&priMemFreezeFrameBuffer[i], (const uint8 *)FreezeFrameMirrorBuffer[i], sizeof(FreezeFrameRecType)) ){\r
+                               //TODO:NVM is busy or block id is 0,report error or what?\r
+                       }\r
                }\r
-               else {\r
-                       // Valid, update current status\r
-                       mergeEventStatusRec(&priMemEventBuffer[i]);\r
+               //recover Aging from NVRam to RAM\r
+               if(E_OK == copyNvmMirror(HealingBlockId, (uint8*)priMemAgingBuffer, (const uint8*)HealingMirrorBuffer, sizeof(priMemAgingBuffer)) ){\r
 \r
-                       // Update occurrence counter on pre init stored freeze frames\r
-                       updateFreezeFrameOccurrencePreInit(&priMemEventBuffer[i]);\r
                }\r
-       }\r
 \r
-       // Validate extended data records stored in primary memory\r
-       for (i = 0; i < DEM_MAX_NUMBER_EXT_DATA_PRI_MEM; i++) {\r
-               cSum = calcChecksum(&priMemExtDataBuffer[i], sizeof(ExtDataRecType)-sizeof(ChecksumType));\r
-               if ((cSum != priMemExtDataBuffer[i].checksum) || priMemExtDataBuffer[i].eventId == DEM_EVENT_ID_NULL) {\r
-                       // Unlegal record, clear the record\r
-                       memset(&priMemExtDataBuffer[i], 0, sizeof(ExtDataRecType));\r
+               // Validate aging records stored in primary memory\r
+               for (i = 0; i < DEM_MAX_NUMBER_AGING_PRI_MEM; i++){\r
+                       entryValid = checkEntryValid(priMemAgingBuffer[i].eventId);\r
+//                     cSum = calcChecksum(&priMemAgingBuffer[i], sizeof(HealingRecType) - sizeof(ChecksumType));\r
+                       if ((priMemAgingBuffer[i].eventId == DEM_EVENT_ID_NULL) || (FALSE == entryValid)) {\r
+                               // Unlegal record, clear the record\r
+                               memset(&priMemAgingBuffer[i], 0, sizeof(HealingRecType));\r
+                               AgingIsModified = TRUE;\r
+                       }\r
                }\r
-       }\r
 \r
-       // Validate freeze frame records stored in primary memory\r
-       for (i = 0; i < DEM_MAX_NUMBER_FF_DATA_PRI_MEM; i++) {\r
-               cSum = calcChecksum(&priMemFreezeFrameBuffer[i], sizeof(FreezeFrameRecType)-sizeof(ChecksumType));\r
-               if ((cSum != priMemFreezeFrameBuffer[i].checksum) || (priMemFreezeFrameBuffer[i].eventId == DEM_EVENT_ID_NULL)) {\r
-                       // Unlegal record, clear the record\r
-                       memset(&priMemFreezeFrameBuffer[i], 0, sizeof(FreezeFrameRecType));\r
+               // Validate event records stored in primary memory\r
+               for (i = 0; i < DEM_MAX_NUMBER_EVENT_PRI_MEM; i++) {\r
+                       entryValid = checkEntryValid(priMemEventBuffer[i].eventId);\r
+//                     cSum = calcChecksum(&priMemEventBuffer[i], sizeof(EventRecType)-sizeof(ChecksumType));\r
+                       if ((priMemEventBuffer[i].eventId == DEM_EVENT_ID_NULL) || (FALSE == entryValid)) {\r
+                               // Unlegal record, clear the record\r
+                               memset(&priMemEventBuffer[i], 0, sizeof(EventRecType));\r
+                       }\r
+                       else {\r
+                               // Valid, update current status\r
+                               mergeEventStatusRec(&priMemEventBuffer[i]);\r
+\r
+                               // Update occurrence counter on pre init stored freeze frames\r
+                               updateFreezeFrameOccurrencePreInit(&priMemEventBuffer[i]);\r
+                       }\r
                }\r
-       }\r
 \r
-       /*\r
-        *  Handle errors stored in temporary buffer (if any)\r
-        */\r
 \r
-       // Transfer updated event data to event memory\r
-       for (i = 0; i < DEM_MAX_NUMBER_EVENT; i++) {\r
-               if (eventStatusBuffer[i].eventId != DEM_EVENT_ID_NULL) {\r
-                       // Update the event memory\r
-                       lookupEventIdParameter(eventStatusBuffer[i].eventId, &eventParam);\r
-                       storeEventEvtMem(eventParam, &eventStatusBuffer[i]);\r
+\r
+               // Validate extended data records stored in primary memory\r
+               for (i = 0; i < DEM_MAX_NUMBER_EXT_DATA_PRI_MEM; i++) {\r
+                       entryValid = checkEntryValid(priMemExtDataBuffer[i].eventId);\r
+//                     cSum = calcChecksum(&priMemExtDataBuffer[i], sizeof(ExtDataRecType)-sizeof(ChecksumType));\r
+                       if ((priMemExtDataBuffer[i].eventId == DEM_EVENT_ID_NULL) || (FALSE == entryValid)) {\r
+                               // Unlegal record, clear the record\r
+                               memset(&priMemExtDataBuffer[i], 0, sizeof(ExtDataRecType));\r
+                       }\r
                }\r
-       }\r
 \r
-       // Transfer extended data to event memory if necessary\r
-       for (i = 0; i < DEM_MAX_NUMBER_EXT_DATA_PRE_INIT; i++) {\r
-               if (preInitExtDataBuffer[i].eventId !=  DEM_EVENT_ID_NULL) {\r
-                       lookupEventIdParameter(preInitExtDataBuffer[i].eventId, &eventParam);\r
-                       storeExtendedDataEvtMem(eventParam, &preInitExtDataBuffer[i]);\r
+               //initialize the current timestamp and update the timestamp in pre init\r
+               initCurrentFreezeFrameTimeStamp(&FF_TimeStamp);\r
+\r
+               //lint -save\r
+               //lint -e568 //PC-Lint exception.\r
+               //lint -e685 //PC-Lint exception.\r
+               //lint -e681 //PC-Lint exception to MISRA 14.1: Loop is not entered. This only happens when DEM_MAX_NUMBER_FF_DATA_PRE_INIT is zero. Keep as it is for less complex code.\r
+               // Validate freeze frame records stored in primary memory\r
+               for (i = 0; i < DEM_MAX_NUMBER_FF_DATA_PRI_MEM; i++) {\r
+                       entryValid = checkEntryValid(priMemFreezeFrameBuffer[i].eventId);\r
+//                     cSum = calcChecksum(&priMemFreezeFrameBuffer[i], sizeof(FreezeFrameRecType)-sizeof(ChecksumType));\r
+                       if ((priMemFreezeFrameBuffer[i].eventId == DEM_EVENT_ID_NULL) || (FALSE == entryValid)) {\r
+                               // Unlegal record, clear the record\r
+                               memset(&priMemFreezeFrameBuffer[i], 0, sizeof(FreezeFrameRecType));\r
+                       }\r
                }\r
-       }\r
+               //lint -restore\r
 \r
-       // Transfer freeze frames to event memory\r
-       for (i = 0; i < DEM_MAX_NUMBER_FF_DATA_PRE_INIT; i++) {\r
-               if (preInitFreezeFrameBuffer[i].eventId != DEM_EVENT_ID_NULL) {\r
-                       lookupEventIdParameter(preInitFreezeFrameBuffer[i].eventId, &eventParam);\r
-                       storeFreezeFrameDataEvtMem(eventParam, &preInitFreezeFrameBuffer[i]);\r
+               /* Transfer updated event data to event memory */\r
+               for (i = 0; i < DEM_MAX_NUMBER_EVENT; i++) {\r
+                       if (eventStatusBuffer[i].eventId != DEM_EVENT_ID_NULL) {\r
+                               lookupEventIdParameter(eventStatusBuffer[i].eventId, &eventParam);\r
+                               storeEventEvtMem(eventParam, &eventStatusBuffer[i]);\r
+                       }\r
+               }\r
+\r
+               /* Transfer extended data to event memory if necessary */\r
+               for (i = 0; i < DEM_MAX_NUMBER_EXT_DATA_PRE_INIT; i++) {\r
+                       if (preInitExtDataBuffer[i].eventId !=  DEM_EVENT_ID_NULL) {\r
+                               lookupEventIdParameter(preInitExtDataBuffer[i].eventId, &eventParam);\r
+                               storeExtendedDataEvtMem(eventParam, &preInitExtDataBuffer[i]);\r
+                       }\r
+               }\r
+\r
+               //lint -save\r
+               //lint -e568 //PC-Lint exception.\r
+               //lint -e685 //PC-Lint exception.\r
+               //lint -e681 //PC-Lint exception to MISRA 14.1: Loop is not entered. This only happens when DEM_MAX_NUMBER_FF_DATA_PRE_INIT is zero. Keep as it is for less complex code.\r
+               /* Transfer freeze frames to event memory */\r
+               for (i = 0; i < DEM_MAX_NUMBER_FF_DATA_PRE_INIT; i++) {\r
+                       if (preInitFreezeFrameBuffer[i].eventId != DEM_EVENT_ID_NULL) {\r
+                               lookupEventIdParameter(preInitFreezeFrameBuffer[i].eventId, &eventParam);\r
+                               storeFreezeFrameDataEvtMem(eventParam, &preInitFreezeFrameBuffer[i]);\r
+                       }\r
                }\r
+               //lint -restore\r
        }\r
 \r
        // Init the dtc filter\r
@@ -1520,18 +2456,27 @@ void Dem_Init(void)
  */\r
 void Dem_Shutdown(void)\r
 {\r
-       setOperationCycleState(DEM_ACTIVE, DEM_CYCLE_STATE_END);\r
+       (void)setOperationCycleState(DEM_ACTIVE, DEM_CYCLE_STATE_END); /** @req DEM047 */\r
 \r
-       demState = DEM_UNINITIALIZED;\r
+       /* handleAging() should be called behind setOperationCycleState() */\r
+       (void)handleAging(DEM_ACTIVE, DEM_CYCLE_STATE_END);\r
+\r
+       demState = DEM_UNINITIALIZED; /** @req DEM368 */\r
 }\r
 \r
 \r
 /*\r
  * Interface for basic software scheduler\r
  */\r
-void Dem_MainFunction(void)\r
+void Dem_MainFunction(void)/** @req DEM125 */\r
 {\r
+       if (FFIsModified) {\r
+               storeFreezeFrameDataPerMem(FreezeFrameBlockId);\r
+       }\r
 \r
+       if (AgingIsModified) {\r
+               storeAgingRecPerMem(HealingBlockId);\r
+       }\r
 }\r
 \r
 \r
@@ -1543,7 +2488,7 @@ void Dem_MainFunction(void)
  * Procedure:  Dem_SetEventStatus\r
  * Reentrant:  Yes\r
  */\r
-Std_ReturnType Dem_SetEventStatus(Dem_EventIdType eventId, Dem_EventStatusType eventStatus)\r
+Std_ReturnType Dem_SetEventStatus(Dem_EventIdType eventId, Dem_EventStatusType eventStatus) /** @req DEM330 */\r
 {\r
        Std_ReturnType returnCode = E_OK;\r
 \r
@@ -1553,9 +2498,7 @@ Std_ReturnType Dem_SetEventStatus(Dem_EventIdType eventId, Dem_EventStatusType e
        }\r
        else\r
        {\r
-#if (DEM_DEV_ERROR_DETECT == STD_ON)\r
-               Det_ReportError(MODULE_ID_DEM, 0, DEM_SETEVENTSTATUS_ID, DEM_E_UNINIT);\r
-#endif\r
+               DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_SETEVENTSTATUS_ID, DEM_E_UNINIT);\r
                returnCode = E_NOT_OK;\r
        }\r
 \r
@@ -1567,19 +2510,17 @@ Std_ReturnType Dem_SetEventStatus(Dem_EventIdType eventId, Dem_EventStatusType e
  * Procedure:  Dem_ResetEventStatus\r
  * Reentrant:  Yes\r
  */\r
-Std_ReturnType Dem_ResetEventStatus(Dem_EventIdType eventId)\r
+Std_ReturnType Dem_ResetEventStatus(Dem_EventIdType eventId) /** @req DEM331 */\r
 {\r
        Std_ReturnType returnCode = E_OK;\r
 \r
        if (demState == DEM_INITIALIZED) // No action is taken if the module is not started\r
        {\r
-               resetEventStatus(eventId);\r
+               resetEventStatus(eventId); /** @req DEM186 */\r
        }\r
        else\r
        {\r
-#if (DEM_DEV_ERROR_DETECT == STD_ON)\r
-               Det_ReportError(MODULE_ID_DEM, 0, DEM_RESETEVENTSTATUS_ID, DEM_E_UNINIT);\r
-#endif\r
+               DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_RESETEVENTSTATUS_ID, DEM_E_UNINIT);\r
                returnCode = E_NOT_OK;\r
        }\r
 \r
@@ -1591,7 +2532,7 @@ Std_ReturnType Dem_ResetEventStatus(Dem_EventIdType eventId)
  * Procedure:  Dem_GetEventStatus\r
  * Reentrant:  Yes\r
  */\r
-Std_ReturnType Dem_GetEventStatus(Dem_EventIdType eventId, Dem_EventStatusExtendedType *eventStatusExtended)\r
+Std_ReturnType Dem_GetEventStatus(Dem_EventIdType eventId, Dem_EventStatusExtendedType *eventStatusExtended) /** @req DEM332 */\r
 {\r
        Std_ReturnType returnCode = E_OK;\r
 \r
@@ -1601,9 +2542,7 @@ Std_ReturnType Dem_GetEventStatus(Dem_EventIdType eventId, Dem_EventStatusExtend
        }\r
        else\r
        {\r
-#if (DEM_DEV_ERROR_DETECT == STD_ON)\r
-               Det_ReportError(MODULE_ID_DEM, 0, DEM_GETEVENTSTATUS_ID, DEM_E_UNINIT);\r
-#endif\r
+               DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_GETEVENTSTATUS_ID, DEM_E_UNINIT);\r
                returnCode = E_NOT_OK;\r
        }\r
 \r
@@ -1615,7 +2554,7 @@ Std_ReturnType Dem_GetEventStatus(Dem_EventIdType eventId, Dem_EventStatusExtend
  * Procedure:  Dem_GetEventFailed\r
  * Reentrant:  Yes\r
  */\r
-Std_ReturnType Dem_GetEventFailed(Dem_EventIdType eventId, boolean *eventFailed)\r
+Std_ReturnType Dem_GetEventFailed(Dem_EventIdType eventId, boolean *eventFailed) /** @req DEM333 */\r
 {\r
        Std_ReturnType returnCode = E_OK;\r
 \r
@@ -1625,9 +2564,7 @@ Std_ReturnType Dem_GetEventFailed(Dem_EventIdType eventId, boolean *eventFailed)
        }\r
        else\r
        {\r
-#if (DEM_DEV_ERROR_DETECT == STD_ON)\r
-               Det_ReportError(MODULE_ID_DEM, 0, DEM_GETEVENTFAILED_ID, DEM_E_UNINIT);\r
-#endif\r
+               DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_GETEVENTFAILED_ID, DEM_E_UNINIT);\r
                returnCode = E_NOT_OK;\r
        }\r
 \r
@@ -1649,9 +2586,7 @@ Std_ReturnType Dem_GetEventTested(Dem_EventIdType eventId, boolean *eventTested)
        }\r
        else\r
        {\r
-#if (DEM_DEV_ERROR_DETECT == STD_ON)\r
-               Det_ReportError(MODULE_ID_DEM, 0, DEM_GETEVENTTESTED_ID, DEM_E_UNINIT);\r
-#endif\r
+               DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_GETEVENTTESTED_ID, DEM_E_UNINIT);\r
                returnCode = E_NOT_OK;\r
        }\r
 \r
@@ -1673,9 +2608,7 @@ Std_ReturnType Dem_GetFaultDetectionCounter(Dem_EventIdType eventId, sint8 *coun
        }\r
        else\r
        {\r
-#if (DEM_DEV_ERROR_DETECT == STD_ON)\r
-               Det_ReportError(MODULE_ID_DEM, 0, DEM_GETFAULTDETECTIONCOUNTER_ID, DEM_E_UNINIT);\r
-#endif\r
+               DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_GETFAULTDETECTIONCOUNTER_ID, DEM_E_UNINIT);\r
                returnCode = E_NOT_OK;\r
        }\r
 \r
@@ -1694,13 +2627,12 @@ Std_ReturnType Dem_SetOperationCycleState(Dem_OperationCycleIdType operationCycl
        if (demState == DEM_INITIALIZED) // No action is taken if the module is not started\r
        {\r
                returnCode = setOperationCycleState(operationCycleId, cycleState);\r
+               (void)handleAging(operationCycleId, cycleState);\r
 \r
        }\r
        else\r
        {\r
-#if (DEM_DEV_ERROR_DETECT == STD_ON)\r
-               Det_ReportError(MODULE_ID_DEM, 0, DEM_SETOPERATIONCYCLESTATE_ID, DEM_E_UNINIT);\r
-#endif\r
+               DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_SETOPERATIONCYCLESTATE_ID, DEM_E_UNINIT);\r
                returnCode = E_NOT_OK;\r
        }\r
 \r
@@ -1717,18 +2649,26 @@ Std_ReturnType Dem_GetDTCOfEvent(Dem_EventIdType eventId, Dem_DTCKindType dtcKin
        Std_ReturnType returnCode = E_NO_DTC_AVAILABLE;\r
        const Dem_EventParameterType *eventParam;\r
 \r
-       lookupEventIdParameter(eventId, &eventParam);\r
+       if (demState == DEM_INITIALIZED) // No action is taken if the module is not started\r
+       {\r
+               lookupEventIdParameter(eventId, &eventParam);\r
 \r
-       if (eventParam != NULL) {\r
-               if (checkDtcKind(dtcKind, eventParam)) {\r
-                       if (eventParam->DTCClassRef != NULL) {\r
-                               *dtcOfEvent = eventParam->DTCClassRef->DTC;\r
-                               returnCode = E_OK;\r
+               if (eventParam != NULL) {\r
+                       if (checkDtcKind(dtcKind, eventParam)) {\r
+                               if (eventParam->DTCClassRef != NULL) {\r
+                                       *dtcOfEvent = eventParam->DTCClassRef->DTC; /** @req DEM269 */\r
+                                       returnCode = E_OK;\r
+                               }\r
                        }\r
                }\r
+               else {\r
+                       // Event Id not found\r
+                       returnCode = E_NOT_OK;\r
+               }\r
        }\r
-       else {\r
-               // Event Id not found\r
+       else\r
+       {\r
+               DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_GETDTCOFEVENT_ID, DEM_UNINITIALIZED);\r
                returnCode = E_NOT_OK;\r
        }\r
 \r
@@ -1744,27 +2684,26 @@ Std_ReturnType Dem_GetDTCOfEvent(Dem_EventIdType eventId, Dem_DTCKindType dtcKin
  * Procedure:  Dem_ReportErrorStatus\r
  * Reentrant:  Yes\r
  */\r
-void Dem_ReportErrorStatus( Dem_EventIdType eventId, Dem_EventStatusType eventStatus )\r
+void Dem_ReportErrorStatus( Dem_EventIdType eventId, Dem_EventStatusType eventStatus ) /** @req DEM107 *//** @req DEM206 */\r
 {\r
 \r
        switch (demState) {\r
                case DEM_PREINITIALIZED:\r
                        // Update status and check if is to be stored\r
                        if ((eventStatus == DEM_EVENT_STATUS_PASSED) || (eventStatus == DEM_EVENT_STATUS_FAILED)) {\r
-                               handlePreInitEvent(eventId, eventStatus);\r
+                               handlePreInitEvent(eventId, eventStatus); /** @req DEM168 */\r
                        }\r
                        break;\r
 \r
                case DEM_INITIALIZED:\r
-                       (void)handleEvent(eventId, eventStatus);\r
+                       (void)handleEvent(eventId, eventStatus);        /** @req DEM167 */\r
                        break;\r
 \r
                case DEM_UNINITIALIZED:\r
                default:\r
                        // Uninitialized can not do anything\r
-#if (DEM_DEV_ERROR_DETECT == STD_ON)\r
-                       Det_ReportError(MODULE_ID_DEM, 0, DEM_REPORTERRORSTATUS_ID, DEM_E_UNINIT);\r
-#endif\r
+                       DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_REPORTERRORSTATUS_ID, DEM_E_UNINIT);\r
+\r
                        break;\r
 \r
        } // switch (demState)\r
@@ -1777,13 +2716,13 @@ void Dem_ReportErrorStatus( Dem_EventIdType eventId, Dem_EventStatusType eventSt
  * Procedure:  Dem_GetDTCStatusAvailabilityMask\r
  * Reentrant:  No\r
  */\r
-Std_ReturnType Dem_GetDTCStatusAvailabilityMask(uint8 *dtcStatusMask)\r
+Std_ReturnType Dem_GetDTCStatusAvailabilityMask(uint8 *dtcStatusMask) /** @req DEM014 */\r
 {\r
        *dtcStatusMask =        DEM_DTC_STATUS_AVAILABILITY_MASK;               // User configuration mask\r
-       *dtcStatusMask &=       DEM_TEST_FAILED                                                 // Mask with supported bits\r
+       *dtcStatusMask &=       DEM_TEST_FAILED                                                 // Mask with supported bits /** @req DEM060 */\r
                                                | DEM_TEST_FAILED_THIS_OPERATION_CYCLE\r
                                                | DEM_PENDING_DTC\r
-//                                             | DEM_CONFIRMED_DTC                                     TODO: Add support for this bit\r
+                                               | DEM_CONFIRMED_DTC\r
                                                | DEM_TEST_NOT_COMPLETED_SINCE_LAST_CLEAR\r
                                                | DEM_TEST_FAILED_SINCE_LAST_CLEAR\r
                                                | DEM_TEST_NOT_COMPLETED_THIS_OPERATION_CYCLE\r
@@ -1803,35 +2742,37 @@ Dem_ReturnSetDTCFilterType Dem_SetDTCFilter(uint8 dtcStatusMask,
                Dem_DTCOriginType dtcOrigin,\r
                Dem_FilterWithSeverityType filterWithSeverity,\r
                Dem_DTCSeverityType dtcSeverityMask,\r
-               Dem_FilterForFDCType filterForFaultDetectionCounter) {\r
-\r
-       Dem_ReturnSetDTCFilterType returnCode = DEM_WRONG_FILTER;\r
+               Dem_FilterForFDCType filterForFaultDetectionCounter)\r
+{\r
+       Dem_ReturnSetDTCFilterType returnCode = DEM_FILTER_ACCEPTED;\r
 \r
-       // Check dtcKind parameter\r
-       if ((dtcKind == DEM_DTC_KIND_ALL_DTCS) || (dtcKind ==  DEM_DTC_KIND_EMISSION_REL_DTCS)) {\r
+       if (demState == DEM_INITIALIZED) {\r
+               // Check dtcKind parameter\r
+               VALIDATE_RV((dtcKind == DEM_DTC_KIND_ALL_DTCS) || (dtcKind == DEM_DTC_KIND_EMISSION_REL_DTCS), DEM_SETDTCFILTER_ID, DEM_E_PARAM_DATA, DEM_WRONG_FILTER);\r
 \r
                // Check dtcOrigin parameter\r
-               if ((dtcOrigin == DEM_DTC_ORIGIN_SECONDARY_MEMORY) || (dtcOrigin == DEM_DTC_ORIGIN_PRIMARY_MEMORY)\r
-                       || (dtcOrigin == DEM_DTC_ORIGIN_PERMANENT_MEMORY) || (dtcOrigin == DEM_DTC_ORIGIN_MIRROR_MEMORY)) {\r
-\r
-                       // Check filterWithSeverity and dtcSeverityMask parameter\r
-                       if ((filterWithSeverity == DEM_FILTER_WITH_SEVERITY_NO)\r
-                               || ((filterWithSeverity == DEM_FILTER_WITH_SEVERITY_YES) && !(dtcSeverityMask & ~(DEM_SEVERITY_MAINTENANCE_ONLY | DEM_SEVERITY_CHECK_AT_NEXT_FALT | DEM_SEVERITY_CHECK_IMMEDIATELY)))){\r
-\r
-                               // Check filterForFaultDetectionCounter parameter\r
-                               if ((filterForFaultDetectionCounter == DEM_FILTER_FOR_FDC_YES) || (filterForFaultDetectionCounter ==  DEM_FILTER_FOR_FDC_NO)) {\r
-                                       // Yes all parameters correct, set the new filters.\r
-                                       dtcFilter.dtcStatusMask = dtcStatusMask;\r
-                                       dtcFilter.dtcKind = dtcKind;\r
-                                       dtcFilter.dtcOrigin = dtcOrigin;\r
-                                       dtcFilter.filterWithSeverity = filterWithSeverity;\r
-                                       dtcFilter.dtcSeverityMask = dtcSeverityMask;\r
-                                       dtcFilter.filterForFaultDetectionCounter = filterForFaultDetectionCounter;\r
-                                       dtcFilter.faultIndex = DEM_MAX_NUMBER_EVENT;\r
-                                       returnCode = DEM_FILTER_ACCEPTED;\r
-                               }\r
-                       }\r
-               }\r
+               VALIDATE_RV((dtcOrigin == DEM_DTC_ORIGIN_SECONDARY_MEMORY) || (dtcOrigin == DEM_DTC_ORIGIN_PRIMARY_MEMORY)\r
+                                       || (dtcOrigin == DEM_DTC_ORIGIN_PERMANENT_MEMORY) || (dtcOrigin == DEM_DTC_ORIGIN_MIRROR_MEMORY), DEM_SETDTCFILTER_ID, DEM_E_PARAM_DATA, DEM_WRONG_FILTER);\r
+\r
+               // Check filterWithSeverity and dtcSeverityMask parameter\r
+               VALIDATE_RV(((filterWithSeverity == DEM_FILTER_WITH_SEVERITY_NO)\r
+                                       || ((filterWithSeverity == DEM_FILTER_WITH_SEVERITY_YES)\r
+                                               && (!(dtcSeverityMask & (Dem_DTCSeverityType)~(DEM_SEVERITY_MAINTENANCE_ONLY | DEM_SEVERITY_CHECK_AT_NEXT_FALT | DEM_SEVERITY_CHECK_IMMEDIATELY))))), DEM_SETDTCFILTER_ID, DEM_E_PARAM_DATA, DEM_WRONG_FILTER);\r
+\r
+               // Check filterForFaultDetectionCounter parameter\r
+               VALIDATE_RV((filterForFaultDetectionCounter == DEM_FILTER_FOR_FDC_YES) || (filterForFaultDetectionCounter ==  DEM_FILTER_FOR_FDC_NO), DEM_SETDTCFILTER_ID, DEM_E_PARAM_DATA, DEM_WRONG_FILTER);\r
+\r
+               // Yes all parameters correct, set the new filters.  /** @req DEM057 */\r
+               dtcFilter.dtcStatusMask = dtcStatusMask;\r
+               dtcFilter.dtcKind = dtcKind;\r
+               dtcFilter.dtcOrigin = dtcOrigin;\r
+               dtcFilter.filterWithSeverity = filterWithSeverity;\r
+               dtcFilter.dtcSeverityMask = dtcSeverityMask;\r
+               dtcFilter.filterForFaultDetectionCounter = filterForFaultDetectionCounter;\r
+               dtcFilter.faultIndex = DEM_MAX_NUMBER_EVENT;\r
+       } else {\r
+               DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_SETDTCFILTER_ID, DEM_E_UNINIT);\r
+               returnCode = DEM_WRONG_FILTER;\r
        }\r
 \r
        return returnCode;\r
@@ -1846,22 +2787,27 @@ Dem_ReturnGetStatusOfDTCType Dem_GetStatusOfDTC(uint32 dtc, Dem_DTCKindType dtcK
        Dem_ReturnGetStatusOfDTCType returnCode = DEM_STATUS_FAILED;\r
        EventStatusRecType *eventRec;\r
 \r
-       if (lookupDtcEvent(dtc, &eventRec)) {\r
-               if (checkDtcKind(dtcKind, eventRec->eventParamRef)) {\r
-                       if (checkDtcOrigin(dtcOrigin,eventRec->eventParamRef)) {\r
-                               *status = eventRec->eventStatusExtended;\r
-                               returnCode = DEM_STATUS_OK;\r
+       if (demState == DEM_INITIALIZED) {\r
+               if (lookupDtcEvent(dtc, &eventRec)) {\r
+                       if (checkDtcKind(dtcKind, eventRec->eventParamRef)) {\r
+                               if (checkDtcOrigin(dtcOrigin,eventRec->eventParamRef)) {\r
+                                       *status = eventRec->eventStatusExtended; /** @req DEM059 */\r
+                                       returnCode = DEM_STATUS_OK;\r
+                               }\r
+                               else {\r
+                                       returnCode = DEM_STATUS_WRONG_DTCORIGIN; /** @req DEM171 */\r
+                               }\r
                        }\r
                        else {\r
-                               returnCode = DEM_STATUS_WRONG_DTCORIGIN;\r
+                               returnCode = DEM_STATUS_WRONG_DTCKIND;\r
                        }\r
                }\r
                else {\r
-                       returnCode = DEM_STATUS_WRONG_DTCKIND;\r
+                       returnCode = DEM_STATUS_WRONG_DTC; /** @req DEM172 */\r
                }\r
-       }\r
-       else {\r
-               returnCode = DEM_STATUS_WRONG_DTC;\r
+       } else {\r
+               DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_GETSTATUSOFDTC_ID, DEM_E_UNINIT);\r
+               returnCode = DEM_STATUS_FAILED;\r
        }\r
 \r
        return returnCode;\r
@@ -1875,24 +2821,30 @@ Dem_ReturnGetStatusOfDTCType Dem_GetStatusOfDTC(uint32 dtc, Dem_DTCKindType dtcK
 Dem_ReturnGetNumberOfFilteredDTCType Dem_GetNumberOfFilteredDtc(uint16 *numberOfFilteredDTC) {\r
        uint16 i;\r
        uint16 numberOfFaults = 0;\r
+       Dem_ReturnGetNumberOfFilteredDTCType returnCode = DEM_NUMBER_OK;\r
 \r
-       //Dem_DisableEventStatusUpdate();\r
+       if (demState == DEM_INITIALIZED) {\r
+               //Dem_DisableEventStatusUpdate();\r
 \r
-       for (i = 0; i < DEM_MAX_NUMBER_EVENT; i++) {\r
-               if (eventStatusBuffer[i].eventId != DEM_EVENT_ID_NULL) {\r
-                       if (matchEventWithDtcFilter(&eventStatusBuffer[i])) {\r
-                               if (eventStatusBuffer[i].eventParamRef->DTCClassRef != NULL) {\r
-                                       numberOfFaults++;\r
+               for (i = 0; i < DEM_MAX_NUMBER_EVENT; i++) {\r
+                       if (eventStatusBuffer[i].eventId != DEM_EVENT_ID_NULL) {\r
+                               if (matchEventWithDtcFilter(&eventStatusBuffer[i])) {\r
+                                       if (eventStatusBuffer[i].eventParamRef->DTCClassRef != NULL) {\r
+                                               numberOfFaults++;\r
+                                       }\r
                                }\r
                        }\r
                }\r
-       }\r
 \r
-       //Dem_EnableEventStatusUpdate();\r
+               //Dem_EnableEventStatusUpdate();\r
 \r
-       *numberOfFilteredDTC = numberOfFaults;\r
+               *numberOfFilteredDTC = numberOfFaults; /** @req DEM061 */\r
+       } else {\r
+               DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_GETNUMBEROFFILTEREDDTC_ID, DEM_E_UNINIT);\r
+               returnCode = DEM_NUMBER_FAILED;\r
+       }\r
 \r
-       return DEM_NUMBER_OK;\r
+       return returnCode;\r
 }\r
 \r
 \r
@@ -1905,22 +2857,27 @@ Dem_ReturnGetNextFilteredDTCType Dem_GetNextFilteredDTC(uint32 *dtc, Dem_EventSt
        Dem_ReturnGetNextFilteredDTCType returnCode = DEM_FILTERED_OK;\r
        boolean dtcFound = FALSE;\r
 \r
-       // TODO: This job should be done in an more advanced way according to Dem288\r
-       while (!dtcFound && (dtcFilter.faultIndex != 0)) {\r
-               dtcFilter.faultIndex--;\r
-               if (eventStatusBuffer[dtcFilter.faultIndex].eventId != DEM_EVENT_ID_NULL) {\r
-                       if (matchEventWithDtcFilter(&eventStatusBuffer[dtcFilter.faultIndex])) {\r
-                               if (eventStatusBuffer[dtcFilter.faultIndex].eventParamRef->DTCClassRef != NULL) {\r
-                                       *dtc = eventStatusBuffer[dtcFilter.faultIndex].eventParamRef->DTCClassRef->DTC;\r
-                                       *dtcStatus = eventStatusBuffer[dtcFilter.faultIndex].eventStatusExtended;\r
-                                       dtcFound = TRUE;\r
+       if (demState == DEM_INITIALIZED) {\r
+               // TODO: This job should be done in an more advanced way according to Dem217\r
+               while ((!dtcFound) && (dtcFilter.faultIndex != 0)) {\r
+                       dtcFilter.faultIndex--;\r
+                       if (eventStatusBuffer[dtcFilter.faultIndex].eventId != DEM_EVENT_ID_NULL) {\r
+                               if (matchEventWithDtcFilter(&eventStatusBuffer[dtcFilter.faultIndex])) {\r
+                                       if (eventStatusBuffer[dtcFilter.faultIndex].eventParamRef->DTCClassRef != NULL) {\r
+                                               *dtc = eventStatusBuffer[dtcFilter.faultIndex].eventParamRef->DTCClassRef->DTC; /** @req DEM216 */\r
+                                               *dtcStatus = eventStatusBuffer[dtcFilter.faultIndex].eventStatusExtended;\r
+                                               dtcFound = TRUE;\r
+                                       }\r
                                }\r
                        }\r
                }\r
-       }\r
 \r
-       if (!dtcFound) {\r
-               dtcFilter.faultIndex = DEM_MAX_NUMBER_EVENT;\r
+               if (!dtcFound) {\r
+                       dtcFilter.faultIndex = DEM_MAX_NUMBER_EVENT;\r
+                       returnCode = DEM_FILTERED_NO_MATCHING_DTC;\r
+               }\r
+       } else {\r
+               DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_GETNEXTFILTEREDDTC_ID, DEM_E_UNINIT);\r
                returnCode = DEM_FILTERED_NO_MATCHING_DTC;\r
        }\r
 \r
@@ -1934,7 +2891,7 @@ Dem_ReturnGetNextFilteredDTCType Dem_GetNextFilteredDTC(uint32 *dtc, Dem_EventSt
  */\r
 Dem_ReturnTypeOfDtcSupportedType Dem_GetTranslationType(void)\r
 {\r
-       return DEM_TYPE_OF_DTC_SUPPORTED;\r
+       return DEM_TYPE_OF_DTC_SUPPORTED; /** @req DEM231 */\r
 }\r
 \r
 \r
@@ -1942,59 +2899,68 @@ Dem_ReturnTypeOfDtcSupportedType Dem_GetTranslationType(void)
  * Procedure:  Dem_ClearDTC\r
  * Reentrant:  No\r
  */\r
-Dem_ReturnClearDTCType Dem_ClearDTC(uint32 dtc, Dem_DTCKindType dtcKind, Dem_DTCOriginType dtcOrigin)\r
+Dem_ReturnClearDTCType Dem_ClearDTC(uint32 dtc, Dem_DTCKindType dtcKind, Dem_DTCOriginType dtcOrigin) /** @req DEM009 *//** @req DEM241 */\r
 {\r
        Dem_ReturnClearDTCType returnCode = DEM_CLEAR_OK;\r
        Dem_EventIdType eventId;\r
        const Dem_EventParameterType *eventParam;\r
        uint16 i, j;\r
 \r
-       // Loop through the event buffer\r
-       for (i = 0; i < DEM_MAX_NUMBER_EVENT; i++) {\r
-               eventId = eventStatusBuffer[i].eventId;\r
-               if (eventId != DEM_EVENT_ID_NULL) {\r
-                       eventParam = eventStatusBuffer[i].eventParamRef;\r
-                       if (eventParam != NULL) {\r
-                               if (DEM_CLEAR_ALL_EVENTS | (eventParam->DTCClassRef != NULL)) {\r
-                                       if (checkDtcKind(dtcKind, eventParam)) {\r
-                                               if (checkDtcGroup(dtc, eventParam)) {\r
-                                                       for (j = 0; (j < DEM_MAX_NR_OF_EVENT_DESTINATION) && (eventParam->EventClass->EventDestination[j] != dtcOrigin); j++);\r
-                                                       if (j < DEM_MAX_NR_OF_EVENT_DESTINATION) {\r
-                                                               // Yes! All conditions met.\r
-                                                               switch (dtcOrigin)\r
-                                                               {\r
-                                                               case DEM_DTC_ORIGIN_PRIMARY_MEMORY:\r
-                                                                       deleteEventPriMem(eventParam);\r
-                                                                       deleteFreezeFrameDataPriMem(eventParam);\r
-                                                                       deleteExtendedDataPriMem(eventParam);\r
-                                                                       deleteEventStatusRec(eventParam);               // TODO: Shall this be done or just resetting the status?\r
-                                                                       break;\r
-\r
-                                                               case DEM_DTC_ORIGIN_SECONDARY_MEMORY:\r
-                                                               case DEM_DTC_ORIGIN_PERMANENT_MEMORY:\r
-                                                               case DEM_DTC_ORIGIN_MIRROR_MEMORY:\r
-                                                                       // Not yet supported\r
-                                                                       returnCode = DEM_CLEAR_WRONG_DTCORIGIN;\r
-#if (DEM_DEV_ERROR_DETECT == STD_ON)\r
-                                                                       Det_ReportError(MODULE_ID_DEM, 0, DEM_CLEARDTC_ID, DEM_E_NOT_IMPLEMENTED_YET);\r
-#endif\r
-                                                                       break;\r
-                                                               default:\r
-                                                                       returnCode = DEM_CLEAR_WRONG_DTCORIGIN;\r
-                                                                       break;\r
+       if (demState == DEM_INITIALIZED) {\r
+               for (i = 0; i < DEM_MAX_NUMBER_EVENT; i++) {\r
+                       eventId = eventStatusBuffer[i].eventId;\r
+                       if (eventId != DEM_EVENT_ID_NULL) {\r
+                               eventParam = eventStatusBuffer[i].eventParamRef;\r
+                               if (eventParam != NULL) {\r
+                                       //lint --e(506) PC-Lint exception Misra 13.7, 14.1 Allow configuration variables in boolean expression\r
+                                       //lint --e(774) PC-Lint exception       Related to MISRA 13.7\r
+                                       if ((DEM_CLEAR_ALL_EVENTS == STD_ON) || (eventParam->DTCClassRef != NULL)) {\r
+                                               if (checkDtcKind(dtcKind, eventParam)) {\r
+                                                       if (checkDtcGroup(dtc, eventParam)) {\r
+                                                               boolean dtcOriginFound = FALSE;\r
+                                                               for (j = 0; (j < DEM_MAX_NR_OF_EVENT_DESTINATION) && (!dtcOriginFound) ; j++){\r
+                                                                       dtcOriginFound =(eventParam->EventClass->EventDestination[j] == dtcOrigin);\r
+                                                               }\r
+                                                               if (dtcOriginFound) {\r
+                                                                       switch (dtcOrigin)\r
+                                                                       {\r
+                                                                       case DEM_DTC_ORIGIN_PRIMARY_MEMORY:\r
+                                                                               /** @req DEM077 */\r
+                                                                               deleteEventPriMem(eventParam);\r
+                                                                               deleteFreezeFrameDataPriMem(eventParam);\r
+                                                                               deleteExtendedDataPriMem(eventParam);\r
+                                                                               resetEventStatusRec(eventParam);\r
+                                                                               storeFreezeFrameDataPerMem();\r
+                                                                               break;\r
+\r
+                                                                       case DEM_DTC_ORIGIN_PERMANENT_MEMORY:\r
+\r
+                                                                               break;\r
+\r
+                                                                       case DEM_DTC_ORIGIN_SECONDARY_MEMORY:\r
+                                                                       case DEM_DTC_ORIGIN_MIRROR_MEMORY:\r
+                                                                               // Not yet supported\r
+                                                                               returnCode = DEM_CLEAR_WRONG_DTCORIGIN;\r
+                                                                               DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_CLEARDTC_ID, DEM_E_NOT_IMPLEMENTED_YET);\r
+                                                                               break;\r
+                                                                       default:\r
+                                                                               returnCode = DEM_CLEAR_WRONG_DTCORIGIN;\r
+                                                                               break;\r
+                                                                       }\r
                                                                }\r
                                                        }\r
                                                }\r
                                        }\r
                                }\r
-                       }\r
-                       else {\r
-                               // Fatal error, no event parameters found for the stored event!\r
-#if (DEM_DEV_ERROR_DETECT == STD_ON)\r
-                       Det_ReportError(MODULE_ID_DEM, 0, DEM_CLEARDTC_ID, DEM_E_UNEXPECTED_EXECUTION);\r
-#endif\r
+                               else {\r
+                                       // Fatal error, no event parameters found for the stored event!\r
+                                       DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_CLEARDTC_ID, DEM_E_UNEXPECTED_EXECUTION);\r
+                               }\r
                        }\r
                }\r
+       } else {\r
+               DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_CLEARDTC_ID, DEM_E_UNINIT);\r
+               returnCode = DEM_CLEAR_FAILED;\r
        }\r
 \r
        return returnCode;\r
@@ -2005,23 +2971,28 @@ Dem_ReturnClearDTCType Dem_ClearDTC(uint32 dtc, Dem_DTCKindType dtcKind, Dem_DTC
  * Procedure:  Dem_DisableDTCStorage\r
  * Reentrant:  No\r
  */\r
-Dem_ReturnControlDTCStorageType Dem_DisableDTCStorage(Dem_DTCGroupType dtcGroup, Dem_DTCKindType dtcKind)\r
+Dem_ReturnControlDTCStorageType Dem_DisableDTCStorage(Dem_DTCGroupType dtcGroup, Dem_DTCKindType dtcKind) /** @req DEM035 */\r
 {\r
-       Dem_ReturnControlDTCStorageType returnCode = DEM_CONTROL_DTC_STORAGE_N_OK;\r
-\r
-       // Check dtcGroup parameter\r
-       if (dtcGroup == DEM_DTC_GROUP_ALL_DTCS) {\r
-               // Check dtcKind parameter\r
-               if ((dtcKind == DEM_DTC_KIND_ALL_DTCS) || (dtcKind ==  DEM_DTC_KIND_EMISSION_REL_DTCS)) {\r
-                       disableDtcStorage.dtcGroup = dtcGroup;\r
-                       disableDtcStorage.dtcKind = dtcKind;\r
-                       disableDtcStorage.storageDisabled = TRUE;\r
-\r
-                       returnCode = DEM_CONTROL_DTC_STORAGE_OK;\r
+       Dem_ReturnControlDTCStorageType returnCode = DEM_CONTROL_DTC_STORAGE_OK;\r
+\r
+       if (demState == DEM_INITIALIZED) {\r
+               // Check dtcGroup parameter\r
+               if (dtcGroup == DEM_DTC_GROUP_ALL_DTCS) {\r
+                       // Check dtcKind parameter\r
+                       if ((dtcKind == DEM_DTC_KIND_ALL_DTCS) || (dtcKind ==  DEM_DTC_KIND_EMISSION_REL_DTCS)) {\r
+                               /** @req DEM079 */\r
+                               disableDtcStorage.dtcGroup = dtcGroup;\r
+                               disableDtcStorage.dtcKind = dtcKind;\r
+                               disableDtcStorage.storageDisabled = TRUE;\r
+                       } else {\r
+                               returnCode = DEM_CONTROL_DTC_STORAGE_N_OK;\r
+                       }\r
+               } else {\r
+                       returnCode = DEM_CONTROL_DTC_WRONG_DTCGROUP;\r
                }\r
-       }\r
-       else {\r
-               returnCode = DEM_CONTROL_DTC_WRONG_DTCGROUP;\r
+       } else {\r
+               DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_DISABLEDTCSTORAGE_ID, DEM_E_UNINIT);\r
+               returnCode = DEM_CONTROL_DTC_STORAGE_N_OK;\r
        }\r
 \r
        return returnCode;\r
@@ -2034,74 +3005,85 @@ Dem_ReturnControlDTCStorageType Dem_DisableDTCStorage(Dem_DTCGroupType dtcGroup,
  */\r
 Dem_ReturnControlDTCStorageType Dem_EnableDTCStorage(Dem_DTCGroupType dtcGroup, Dem_DTCKindType dtcKind)\r
 {\r
-       // TODO: Behavior is not defined if group or kind do not match active settings, therefore the filter is just switched off.\r
-       disableDtcStorage.storageDisabled = FALSE;\r
+       Dem_ReturnControlDTCStorageType returnCode = DEM_CONTROL_DTC_STORAGE_OK;\r
+\r
+       if (demState == DEM_INITIALIZED) {\r
+               // TODO: Behavior is not defined if group or kind do not match active settings, therefore the filter is just switched off.\r
+               (void)dtcGroup; (void)dtcKind;  // Just to make get rid of PC-Lint warnings\r
+               disableDtcStorage.storageDisabled = FALSE; /** @req DEM080 */\r
+       } else {\r
+               DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_ENABLEDTCSTORAGE_ID, DEM_E_UNINIT);\r
+               returnCode = DEM_CONTROL_DTC_STORAGE_N_OK;\r
+       }\r
 \r
-       return DEM_CONTROL_DTC_STORAGE_OK;\r
+       return returnCode;\r
 }\r
 \r
 /*\r
  * Procedure:  Dem_GetExtendedDataRecordByDTC\r
  * Reentrant:  No\r
  */\r
-Dem_ReturnGetExtendedDataRecordByDTCType Dem_GetExtendedDataRecordByDTC(uint32 dtc, Dem_DTCKindType dtcKind, Dem_DTCOriginType dtcOrigin, uint8 extendedDataNumber, uint8 *destBuffer, uint8 *bufSize)\r
+Dem_ReturnGetExtendedDataRecordByDTCType Dem_GetExtendedDataRecordByDTC(uint32 dtc, Dem_DTCKindType dtcKind, Dem_DTCOriginType dtcOrigin, uint8 extendedDataNumber, uint8 *destBuffer, uint16 *bufSize)\r
 {\r
        Dem_ReturnGetExtendedDataRecordByDTCType returnCode = DEM_RECORD_WRONG_DTC;\r
        EventStatusRecType *eventRec;\r
        Dem_ExtendedDataRecordClassType const *extendedDataRecordClass = NULL;\r
        ExtDataRecType *extData;\r
-       uint8 posInExtData = 0;\r
-\r
-       if (lookupDtcEvent(dtc, &eventRec)) {\r
-               if (checkDtcKind(dtcKind, eventRec->eventParamRef)) {\r
-                       if (checkDtcOrigin(dtcOrigin, eventRec->eventParamRef)) {\r
-                               if (lookupExtendedDataRecNumParam(extendedDataNumber, eventRec->eventParamRef, &extendedDataRecordClass, &posInExtData)) {\r
-                                       if (*bufSize >= extendedDataRecordClass->DataSize) {\r
-                                               switch (dtcOrigin)\r
-                                               {\r
-                                               case DEM_DTC_ORIGIN_PRIMARY_MEMORY:\r
-                                                       if (lookupExtendedDataPriMem(eventRec->eventId, &extData)) {\r
-                                                               // Yes all conditions met, copy the extended data record to destination buffer.\r
-                                                               memcpy(destBuffer, &extData->data[posInExtData], extendedDataRecordClass->DataSize);\r
-                                                               *bufSize = extendedDataRecordClass->DataSize;\r
-                                                               returnCode = DEM_RECORD_OK;\r
-                                                       }\r
-                                                       else {\r
-                                                               // The record number is legal but no record was found for the DTC\r
-                                                               *bufSize = 0;\r
-                                                               returnCode = DEM_RECORD_OK;\r
+       uint16 posInExtData = 0;\r
+\r
+       if (demState == DEM_INITIALIZED) {\r
+               if (lookupDtcEvent(dtc, &eventRec)) {\r
+                       if (checkDtcKind(dtcKind, eventRec->eventParamRef)) {\r
+                               if (checkDtcOrigin(dtcOrigin, eventRec->eventParamRef)) {\r
+                                       if (lookupExtendedDataRecNumParam(extendedDataNumber, eventRec->eventParamRef, &extendedDataRecordClass, &posInExtData)) {\r
+                                               if (*bufSize >= extendedDataRecordClass->DataSize) {\r
+                                                       switch (dtcOrigin)\r
+                                                       {\r
+                                                       case DEM_DTC_ORIGIN_PRIMARY_MEMORY:\r
+                                                               if (lookupExtendedDataPriMem(eventRec->eventId, &extData)) {\r
+                                                                       // Yes all conditions met, copy the extended data record to destination buffer.\r
+                                                                       memcpy(destBuffer, &extData->data[posInExtData], extendedDataRecordClass->DataSize); /** @req DEM075 */\r
+                                                                       *bufSize = extendedDataRecordClass->DataSize;\r
+                                                                       returnCode = DEM_RECORD_OK;\r
+                                                               }\r
+                                                               else {\r
+                                                                       // The record number is legal but no record was found for the DTC\r
+                                                                       *bufSize = 0;\r
+                                                                       returnCode = DEM_RECORD_OK;\r
+                                                               }\r
+                                                               break;\r
+\r
+                                                       case DEM_DTC_ORIGIN_SECONDARY_MEMORY:\r
+                                                       case DEM_DTC_ORIGIN_PERMANENT_MEMORY:\r
+                                                       case DEM_DTC_ORIGIN_MIRROR_MEMORY:\r
+                                                               // Not yet supported\r
+                                                               returnCode = DEM_RECORD_WRONG_DTCORIGIN;\r
+                                                               DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_GETEXTENDEDDATARECORDBYDTC_ID, DEM_E_NOT_IMPLEMENTED_YET);\r
+                                                               break;\r
+                                                       default:\r
+                                                               returnCode = DEM_RECORD_WRONG_DTCORIGIN;\r
+                                                               break;\r
                                                        }\r
-                                                       break;\r
-\r
-                                               case DEM_DTC_ORIGIN_SECONDARY_MEMORY:\r
-                                               case DEM_DTC_ORIGIN_PERMANENT_MEMORY:\r
-                                               case DEM_DTC_ORIGIN_MIRROR_MEMORY:\r
-                                                       // Not yet supported\r
-                                                       returnCode = DEM_RECORD_WRONG_DTCORIGIN;\r
-#if (DEM_DEV_ERROR_DETECT == STD_ON)\r
-                                                       Det_ReportError(MODULE_ID_DEM, 0, DEM_GETEXTENDEDDATARECORDBYDTC_ID, DEM_E_NOT_IMPLEMENTED_YET);\r
-#endif\r
-                                                       break;\r
-                                               default:\r
-                                                       returnCode = DEM_RECORD_WRONG_DTCORIGIN;\r
-                                                       break;\r
+                                               }\r
+                                               else {\r
+                                                       returnCode = DEM_RECORD_BUFFERSIZE;\r
                                                }\r
                                        }\r
                                        else {\r
-                                               returnCode = DEM_RECORD_BUFFERSIZE;\r
+                                               returnCode = DEM_RECORD_NUMBER;\r
                                        }\r
                                }\r
                                else {\r
-                                       returnCode = DEM_RECORD_NUMBER;\r
+                                       returnCode = DEM_RECORD_WRONG_DTCORIGIN;\r
                                }\r
                        }\r
                        else {\r
-                               returnCode = DEM_RECORD_WRONG_DTCORIGIN;\r
+                               returnCode = DEM_RECORD_DTCKIND;\r
                        }\r
                }\r
-               else {\r
-                       returnCode = DEM_RECORD_DTCKIND;\r
-               }\r
+       } else {\r
+               DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_GETEXTENDEDDATARECORDBYDTC_ID, DEM_E_UNINIT);\r
+               returnCode = DEM_RECORD_WRONG_DTC;\r
        }\r
 \r
        return returnCode;\r
@@ -2117,31 +3099,274 @@ Dem_ReturnGetSizeOfExtendedDataRecordByDTCType Dem_GetSizeOfExtendedDataRecordBy
        Dem_ReturnGetExtendedDataRecordByDTCType returnCode = DEM_GET_SIZEOFEDRBYDTC_W_DTC;\r
        EventStatusRecType *eventRec;\r
        Dem_ExtendedDataRecordClassType const *extendedDataRecordClass = NULL;\r
-       uint8 posInExtData;\r
-\r
-       if (lookupDtcEvent(dtc, &eventRec)) {\r
-               if (checkDtcKind(dtcKind, eventRec->eventParamRef)) {\r
-                       if (checkDtcOrigin(dtcOrigin, eventRec->eventParamRef)) {\r
-                               if (lookupExtendedDataRecNumParam(extendedDataNumber, eventRec->eventParamRef, &extendedDataRecordClass, &posInExtData)) {\r
-                                       *sizeOfExtendedDataRecord = extendedDataRecordClass->DataSize;\r
-                                       returnCode = DEM_GET_SIZEOFEDRBYDTC_OK;\r
+       uint16 posInExtData;\r
+\r
+       if (demState == DEM_INITIALIZED) {\r
+               if (lookupDtcEvent(dtc, &eventRec)) {\r
+                       if (checkDtcKind(dtcKind, eventRec->eventParamRef)) {\r
+                               if (checkDtcOrigin(dtcOrigin, eventRec->eventParamRef)) {\r
+                                       if (lookupExtendedDataRecNumParam(extendedDataNumber, eventRec->eventParamRef, &extendedDataRecordClass, &posInExtData)) {\r
+                                               *sizeOfExtendedDataRecord = extendedDataRecordClass->DataSize; /** @req DEM076 */\r
+                                               returnCode = DEM_GET_SIZEOFEDRBYDTC_OK;\r
+                                       }\r
+                                       else {\r
+                                               returnCode = DEM_GET_SIZEOFEDRBYDTC_W_RNUM;\r
+                                       }\r
                                }\r
                                else {\r
-                                       returnCode = DEM_GET_SIZEOFEDRBYDTC_W_RNUM;\r
+                                       returnCode = DEM_GET_SIZEOFEDRBYDTC_W_DTCOR;\r
                                }\r
                        }\r
                        else {\r
-                               returnCode = DEM_GET_SIZEOFEDRBYDTC_W_DTCOR;\r
+                               returnCode = DEM_GET_SIZEOFEDRBYDTC_W_DTCKI;\r
                        }\r
                }\r
-               else {\r
-                       returnCode = DEM_GET_SIZEOFEDRBYDTC_W_DTCKI;\r
+       } else {\r
+               DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_GETSIZEOFEXTENDEDDATARECORDBYDTC_ID, DEM_E_UNINIT);\r
+               returnCode = DEM_GET_SIZEOFEDRBYDTC_W_DTC;\r
+       }\r
+\r
+       return returnCode;\r
+}\r
+\r
+/*\r
+ * Procedure:  Dem_GetFreezeFrameDataByDTC\r
+ * Reentrant:  No\r
+ */\r
+/** @req DEM236 */\r
+Dem_ReturnGetFreezeFrameDataByDTCType Dem_GetFreezeFrameDataByDTC(uint32  dtc,Dem_DTCKindType  dtcKind,Dem_DTCOriginType  dtcOrigin,uint8  recordNumber,uint8*  destBuffer,uint8*  bufSize)\r
+{\r
+       Dem_ReturnGetFreezeFrameDataByDTCType returnCode = DEM_GET_FFDATABYDTC_WRONG_DTC;\r
+       EventStatusRecType *eventRec;\r
+       Dem_FreezeFrameClassType const *FFDataRecordClass = NULL;\r
+       FreezeFrameRecType *freezeframe;\r
+       uint16 FFDataSize = 0;\r
+\r
+       if (demState == DEM_INITIALIZED) {\r
+               if (lookupDtcEvent(dtc, &eventRec)) {\r
+                       if (checkDtcKind(dtcKind, eventRec->eventParamRef)) {\r
+                               if (checkDtcOrigin(dtcOrigin, eventRec->eventParamRef)) {\r
+                                       if (lookupFreezeFrameDataRecNumParam(recordNumber, eventRec->eventParamRef, &FFDataRecordClass)) {\r
+                                               if(lookupFreezeFrameDataSize(recordNumber, &FFDataRecordClass, &FFDataSize)){\r
+                                                       if (*bufSize >= FFDataSize) {\r
+                                                               switch (dtcOrigin)\r
+                                                               {\r
+                                                               case DEM_DTC_ORIGIN_PRIMARY_MEMORY:\r
+                                                                       if (lookupFreezeFrameDataPriMem(eventRec->eventId,recordNumber, &freezeframe)) {\r
+                                                                               memcpy(destBuffer, freezeframe->data, FFDataSize); /** @req DEM071 */\r
+                                                                               *bufSize = FFDataSize;\r
+                                                                               returnCode = DEM_GET_FFDATABYDTC_OK;\r
+                                                                       }\r
+                                                                       else {\r
+                                                                               *bufSize = 0;\r
+                                                                               returnCode = DEM_GET_FFDATABYDTC_OK;\r
+                                                                       }\r
+                                                                       break;\r
+\r
+                                                               case DEM_DTC_ORIGIN_SECONDARY_MEMORY:\r
+                                                               case DEM_DTC_ORIGIN_PERMANENT_MEMORY:\r
+                                                               case DEM_DTC_ORIGIN_MIRROR_MEMORY:\r
+                                                                       // Not yet supported\r
+                                                                       returnCode = DEM_GET_FFDATABYDTC_WRONG_DTCORIGIN;\r
+                                                                       DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_GETFREEZEFRAMEDATARECORDBYDTC_ID, DEM_E_NOT_IMPLEMENTED_YET);\r
+                                                                       break;\r
+                                                               default:\r
+                                                                       returnCode = DEM_GET_FFDATABYDTC_WRONG_DTCORIGIN;\r
+                                                                       break;\r
+                                                               }\r
+                                                       }\r
+                                                       else{\r
+                                                               returnCode = DEM_GET_FFDATABYDTC_BUFFERSIZE;\r
+                                                       }\r
+                                               }\r
+                                               else {\r
+                                                       returnCode = DEM_GET_FFDATABYDTC_BUFFERSIZE;\r
+                                               }\r
+                                       }\r
+                                       else {\r
+                                               returnCode = DEM_GET_FFDATABYDTC_RECORDNUMBER;\r
+                                       }\r
+                               }\r
+                               else {\r
+                                       returnCode = DEM_GET_FFDATABYDTC_WRONG_DTCORIGIN;\r
+                               }\r
+                       }\r
+                       else {\r
+                               returnCode = DEM_GET_FFDATABYDTC_WRONG_DTCKIND;\r
+                       }\r
                }\r
+               else{\r
+                       returnCode = DEM_GET_FFDATABYDTC_WRONG_DTC;\r
+\r
+               }\r
+       } else {\r
+               DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_GETFREEZEFRAMEDATARECORDBYDTC_ID, DEM_E_UNINIT);\r
+               returnCode = DEM_GET_ID_PENDING;\r
        }\r
 \r
        return returnCode;\r
+\r
+\r
 }\r
 \r
+/*\r
+ * Procedure:  Dem_GetFreezeFrameDataIdentifierByDTC\r
+ * Reentrant:  No\r
+ */\r
+Dem_GetFreezeFameDataIdentifierByDTCType Dem_GetFreezeFrameDataIdentifierByDTC(uint32  dtc,\r
+                                                                                                                                                                               Dem_DTCKindType  dtcKind,\r
+                                                                                                                                                                               Dem_DTCOriginType  dtcOrigin,\r
+                                                                                                                                                                               uint8  recordNumber,\r
+                                                                                                                                                                               uint8*  arraySize,\r
+                                                                                                                                                                               const  uint16** dataId )/** @req DEM237 */\r
+{\r
+       Dem_GetFreezeFameDataIdentifierByDTCType returnCode = DEM_GET_ID_WRONG_FF_TYPE;\r
+       Dem_FreezeFrameClassType const *FFDataRecordClass = NULL;\r
+       EventStatusRecType *eventRec;\r
+       uint8 didNum = 0;\r
+       uint16 i = 0;\r
+       if (demState == DEM_INITIALIZED) {\r
+               if (lookupDtcEvent(dtc, &eventRec)) {\r
+                       if (checkDtcKind(dtcKind, eventRec->eventParamRef)) {\r
+                               if (checkDtcOrigin(dtcOrigin, eventRec->eventParamRef)) {\r
+                                       if (lookupFreezeFrameDataRecNumParam(recordNumber, eventRec->eventParamRef, &FFDataRecordClass)) {\r
+                                               if(FFDataRecordClass->FFIdClassRef != NULL){\r
+                                                       for(i=0; (i < DEM_MAX_NR_OF_RECORDS_IN_FREEZEFRAME_DATA) && (!(FFDataRecordClass->FFIdClassRef[i].Arc_EOL)); i++){\r
+                                                               if(didNum < *arraySize){\r
+                                                                       dataId[didNum] = &FFDataRecordClass->FFIdClassRef[i].DidIdentifier;/** @req DEM073 */\r
+                                                                       didNum++;\r
+                                                                       returnCode = DEM_GET_ID_OK;\r
+                                                               }else{\r
+                                                                       returnCode = DEM_GET_ID_WRONG_FF_TYPE;\r
+                                                               }\r
+                                                       }\r
+                                                       *arraySize = didNum;\r
+                                               }\r
+\r
+                                       }\r
+                                       else{\r
+                                               returnCode = DEM_GET_ID_WRONG_FF_TYPE;\r
+                                       }\r
+                               }\r
+                               else{\r
+                                       returnCode = DEM_GET_ID_WRONG_DTCORIGIN;\r
+                               }\r
+                       }\r
+                       else{\r
+                               returnCode = DEM_GET_ID_WRONG_DTCKIND;\r
+                       }\r
+               }\r
+               else{\r
+                       returnCode = DEM_GET_ID_WRONG_DTC;\r
+               }\r
+\r
+       }\r
+       else{\r
+               DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_GETFREEZEFRAMEDATAIDENTIFIERBYDTC_ID, DEM_E_UNINIT);\r
+       }\r
+\r
+       return returnCode;\r
+\r
+}\r
+\r
+/*\r
+ * Procedure:  Dem_GetSizeOfFreezeFrame\r
+ * Reentrant:  No\r
+ */\r
+ /** @req DEM238 */\r
+Dem_ReturnGetSizeOfFreezeFrameType Dem_GetSizeOfFreezeFrame(uint32  dtc,Dem_DTCKindType  dtcKind,Dem_DTCOriginType  dtcOrigin,uint8  recordNumber,uint16*  sizeOfFreezeFrame)\r
+{\r
+       Dem_ReturnGetSizeOfFreezeFrameType returnCode = DEM_GET_SIZEOFFF_PENDING;\r
+       Dem_FreezeFrameClassType const *FFDataRecordClass = NULL;\r
+       Std_ReturnType callbackReturnCode;\r
+       EventStatusRecType *eventRec;\r
+       uint16 dataSize = 0;\r
+       uint16 i = 0;\r
+\r
+       if (demState == DEM_INITIALIZED) {\r
+               if (lookupDtcEvent(dtc, &eventRec)) {\r
+                       if (checkDtcKind(dtcKind, eventRec->eventParamRef)) {\r
+                               if (checkDtcOrigin(dtcOrigin, eventRec->eventParamRef)) {\r
+                                       if (lookupFreezeFrameDataRecNumParam(recordNumber, eventRec->eventParamRef, &FFDataRecordClass)) {\r
+                                               if(FFDataRecordClass->FFIdClassRef != NULL){\r
+                                                       for(i = 0; (i < DEM_MAX_NR_OF_RECORDS_IN_FREEZEFRAME_DATA) && (!(FFDataRecordClass->FFIdClassRef[i].Arc_EOL)); i++){\r
+                                                               /* read out the did size */\r
+                                                               if(FFDataRecordClass->FFIdClassRef[i].DidReadDataLengthFnc != NULL){\r
+                                                                       callbackReturnCode = FFDataRecordClass->FFIdClassRef[i].DidReadDataLengthFnc(&dataSize);\r
+                                                                       if(callbackReturnCode != E_OK){\r
+                                                                               return (returnCode = DEM_GET_SIZEOFFF_PENDING);\r
+                                                                       }\r
+                                                               }\r
+                                                               else{\r
+                                                                       dataSize = FFDataRecordClass->FFIdClassRef[i].PidOrDidSize;\r
+                                                               }\r
+                                                               *sizeOfFreezeFrame += dataSize+DEM_DID_IDENTIFIER_SIZE_OF_BYTES;/** @req DEM074 */\r
+                                                               returnCode = DEM_GET_SIZEOFFF_OK;\r
+                                                       }\r
+                                               }\r
+                                       }\r
+                                       else{\r
+                                               returnCode = DEM_GET_SIZEOFFF_WRONG_RNUM;\r
+                                       }\r
+                               }\r
+                               else{\r
+                                       returnCode = DEM_GET_SIZEOFFF_WRONG_DTCOR;\r
+                               }\r
+                       }\r
+                       else{\r
+                               returnCode = DEM_GET_SIZEOFFF_WRONG_DTCKIND;\r
+                       }\r
+               }\r
+               else{\r
+                       returnCode = DEM_GET_SIZEOFFF_WRONG_DTC;\r
+               }\r
+\r
+       }\r
+       else{\r
+                       DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_GETFREEZEFRAMEDATAIDENTIFIERBYDTC_ID, DEM_E_UNINIT);\r
+                       returnCode = DEM_GET_SIZEOFFF_PENDING;\r
+               }\r
+\r
+       return returnCode;\r
+\r
+\r
+}\r
+\r
+#define DEM_UNIT_TEST\r
+#ifdef DEM_UNIT_TEST\r
+void getFFDataPreInit(FreezeFrameRecType **buf)\r
+{\r
+       *buf = &preInitFreezeFrameBuffer[0];\r
+       return;\r
+}\r
+void getPriMemFFBufPtr(FreezeFrameRecType **buf)\r
+{\r
+       *buf = &priMemFreezeFrameBuffer[0];\r
+       return;\r
+}\r
+\r
+uint32 getCurTimeStamp()\r
+{\r
+       return FF_TimeStamp;\r
+}\r
+\r
+void getPriMemEventRecBufPtr(EventStatusRecType **buf)\r
+{\r
+       *buf = &eventStatusBuffer[0];\r
+       return;\r
+}\r
+\r
+void getPriMemAgingBufPtr(HealingRecType **buf)\r
+{\r
+       *buf = &priMemAgingBuffer[0];\r
+       return;\r
+}\r
+#endif\r
+\r
+\r
+\r
+\r
+\r
 /***********************************\r
  * OBD-specific Interfaces (8.3.6) *\r
  ***********************************/\r