]> rtime.felk.cvut.cz Git - arc.git/blobdiff - diagnostic/Dem/Dem.c
Dem, use of NvM is disabled when DEM_USE_NVM == STD_OFF. Removed deleteFreezeFrameDat...
[arc.git] / diagnostic / Dem / Dem.c
index e7361b7c1897136d18a67632ee78723824293d53..68034b2fbb5ae7696253dc3d0f98ce231224df37 100644 (file)
@@ -641,26 +641,6 @@ static void mergeEventStatusRec(const EventRecType *eventRec)
     Irq_Restore(state);\r
 }\r
 \r
-\r
-/*\r
- * Procedure:  deleteEventStatusRec\r
- * Description:        Delete the status record of "eventParam->eventId" from "eventStatusBuffer".\r
- */\r
-static void deleteEventStatusRec(const Dem_EventParameterType *eventParam)\r
-{\r
-       EventStatusRecType *eventStatusRecPtr;\r
-       imask_t state;\r
-    Irq_Save(state);\r
-\r
-       lookupEventStatusRec(eventParam->EventID, &eventStatusRecPtr);\r
-\r
-       if (eventStatusRecPtr != NULL) {\r
-               memset(eventStatusRecPtr, 0, sizeof(EventStatusRecType));\r
-       }\r
-\r
-    Irq_Restore(state);\r
-}\r
-\r
 /*\r
  * Procedure:  resetEventStatusRec\r
  * Description:        Reset the status record of "eventParam->eventId" from "eventStatusBuffer".\r
@@ -1485,33 +1465,68 @@ static boolean lookupExtendedDataPriMem(Dem_EventIdType eventId, ExtDataRecType
 \r
        return eventIdFound;\r
 }\r
+/*\r
+ * Procedure:  copyNvmMirror\r
+ * Description: Copies Nvram to buffer\r
+ */\r
+\r
+Std_ReturnType copyNvmMirror(const NvM_BlockIdType BlockId, uint8 *dstPtr, const uint8 *srcPtr, uint8 len)\r
+{\r
+\r
+#if (DEM_USE_NVM == STD_ON)\r
+       Std_ReturnType blockReadStatus = 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
+                       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
-       NvM_RequestResultType requestResult = NVM_REQ_OK;\r
        imask_t state;\r
 \r
        Irq_Save(state);\r
 \r
-       if (AgingBlockId != 0){\r
-               /* check the status,whether it's busy or not? */\r
-               NvM_GetErrorStatus(AgingBlockId, &requestResult);\r
-               /* if writing is not busy,copy priMemFreezeFrameBuffer to NVRam permanent RAM*/\r
-               if (requestResult != NVM_REQ_PENDING){\r
-                       memcpy(HealingMirrorBuffer, priMemAgingBuffer, sizeof(priMemAgingBuffer));\r
-                       (void)NvM_WriteBlock(AgingBlockId, (const uint8 *)HealingMirrorBuffer);\r
-                       AgingIsModified = FALSE;                \r
-               }\r
-               else{\r
-                       AgingIsModified = TRUE;\r
-               }\r
-       }\r
-       else{\r
-               //TODO:report error or doing nothing,assume that doing nothing\r
-\r
+       if( E_NOT_OK == writeNvmMirror(AgingBlockId, (uint8 *)HealingMirrorBuffer, (const uint8 *)priMemAgingBuffer, sizeof(priMemAgingBuffer)) ){\r
+               AgingIsModified = TRUE;\r
        }\r
 \r
        Irq_Restore(state);\r
@@ -1586,31 +1601,14 @@ static void storeFreezeFrameDataPriMem(const Dem_EventParameterType *eventParam,
  */\r
 static void storeFreezeFrameDataPerMem()\r
 {\r
-       NvM_RequestResultType requestResult = NVM_REQ_OK;\r
-       uint16 i = 0;\r
-       boolean FFIsModifiedLocal = FALSE;\r
        imask_t state;\r
 \r
        Irq_Save(state);\r
 \r
-       for(i = 0; i < DEM_MAX_NUMBER_FF_DATA_PRI_MEM; i++){\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(FreezeFrameBlockId[i] != 0){\r
-                               NvM_GetErrorStatus(FreezeFrameBlockId[i], &requestResult);\r
-\r
-                               if(requestResult != NVM_REQ_PENDING ){\r
-                                       memcpy(FreezeFrameMirrorBuffer[i], &priMemFreezeFrameBuffer[i], sizeof(FreezeFrameRecType));\r
-                                       (void)NvM_WriteBlock(FreezeFrameBlockId[i], (const uint8 *)(FreezeFrameMirrorBuffer[i]));\r
-                                       FFIsModifiedLocal = FALSE;\r
-                               }\r
-                               else{\r
-                                       FFIsModifiedLocal = TRUE;\r
-                               }\r
-\r
-                               FFIsModified |= FFIsModifiedLocal;\r
-                       }\r
-                       else{\r
-                               //TODO:report error or doing nothing,assume that doing nothing\r
+                       if( E_NOT_OK == writeNvmMirror(FreezeFrameBlockId[i], (uint8 *)FreezeFrameMirrorBuffer[i], (const uint8 *)&priMemFreezeFrameBuffer[i], sizeof(FreezeFrameRecType)) ) {\r
+                               FFIsModified = TRUE;\r
                        }\r
                }\r
        }\r
@@ -1637,46 +1635,6 @@ static void deleteFreezeFrameDataPriMem(const Dem_EventParameterType *eventParam
        Irq_Restore(state);\r
 }\r
 \r
-/*\r
- * Procedure:  deleteFreezeFrameDataPerMem\r
- * Description:        delete the freeze frame data in event memory according to\r
- *                             "FFBlockId" destination option,it must be used after deleteFreezeFrameDataPriMem()\r
- */\r
-static void deleteFreezeFrameDataPerMem()\r
-{\r
-       NvM_RequestResultType requestResult = NVM_REQ_OK;\r
-       uint16 i = 0;\r
-       boolean FFIsModifiedLocal = FALSE;\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(memcmp(&priMemFreezeFrameBuffer[i], FreezeFrameMirrorBuffer[i], sizeof(FreezeFrameRecType))){\r
-                       if(FreezeFrameBlockId[i] != 0){\r
-                               NvM_GetErrorStatus(FreezeFrameBlockId[i], &requestResult);\r
-                               if(requestResult != NVM_REQ_PENDING){\r
-                                       memcpy(FreezeFrameMirrorBuffer[i], &priMemFreezeFrameBuffer[i], sizeof(FreezeFrameRecType));\r
-                                       (void)NvM_WriteBlock(FreezeFrameBlockId[i], (const uint8 *)(FreezeFrameMirrorBuffer[i]));\r
-                                       FFIsModifiedLocal = FALSE;\r
-                               }\r
-                               else{\r
-                                       FFIsModifiedLocal = TRUE;\r
-                               }\r
-                               FFIsModified |= FFIsModifiedLocal;\r
-\r
-                       }\r
-                       else{\r
-                               //TODO:report error or doing nothing,assume that doing nothing\r
-                       }\r
-               }\r
-\r
-       }\r
-\r
-       Irq_Restore(state);\r
-}\r
-\r
-\r
 /*\r
  * Procedure:  storeFreezeFrameDataEvtMem\r
  * Description:        Store the freeze frame data in event memory according to\r
@@ -1866,8 +1824,8 @@ static Std_ReturnType handleEvent(Dem_EventIdType eventId, Dem_EventStatusType e
                                                        }\r
                                                }\r
 \r
-                                               if (eventStatusTemp == DEM_EVENT_STATUS_PREFAILED\r
-                                                               || eventStatusLocal.eventStatusExtended & DEM_TEST_FAILED){\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
@@ -2055,7 +2013,7 @@ static void deleteEventMemory(const Dem_EventParameterType *eventParam)
                        deleteEventPriMem(eventParam);\r
                        deleteFreezeFrameDataPriMem(eventParam);\r
                        deleteExtendedDataPriMem(eventParam);\r
-                       deleteFreezeFrameDataPerMem();\r
+                       storeFreezeFrameDataPerMem();\r
                        break;\r
 \r
                case DEM_DTC_ORIGIN_PERMANENT_MEMORY:\r
@@ -2358,7 +2316,7 @@ void Dem_Init(void)
        uint16 i;\r
        ChecksumType cSum;\r
        const Dem_EventParameterType *eventParam;\r
-       NvM_RequestResultType requestResult = NVM_REQ_OK;\r
+\r
        if(DEM_PREINITIALIZED != demState){\r
                /*\r
                 * Dem_PreInit was has not been called since last time Dem_Shutdown was called.\r
@@ -2371,37 +2329,15 @@ void Dem_Init(void)
        } else {\r
 \r
                for(i = 0; i < DEM_MAX_NUMBER_FF_DATA_PRI_MEM; i++){\r
-                       if(FreezeFrameBlockId[i] != 0){\r
-                               NvM_GetErrorStatus(FreezeFrameBlockId[i], &requestResult);\r
-                               if(requestResult != NVM_REQ_PENDING){\r
-                                       memcpy(&priMemFreezeFrameBuffer[i], FreezeFrameMirrorBuffer[i], sizeof(FreezeFrameRecType));\r
-                               }\r
-                               else{\r
-                                       //TODO:NVM is busy,report error or what?\r
-                               }\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
                //recover Aging from NVRam to RAM\r
-               if(AgingBlockId != 0)\r
-               {\r
-                       //check the status\r
-                       NvM_GetErrorStatus(AgingBlockId,&requestResult);\r
+               if(E_OK == copyNvmMirror(AgingBlockId, (uint8*)priMemAgingBuffer, (const uint8*)HealingMirrorBuffer, sizeof(priMemAgingBuffer)) ){\r
 \r
-                       //recover Aging from NVRam to RAM\r
-                       if(AgingBlockId != 0){//check the status\r
-                               NvM_GetErrorStatus(AgingBlockId, &requestResult);\r
-\r
-                               //judge whether NVM is busy\r
-                               if(!(requestResult & NVM_REQ_PENDING)){\r
-                                       //copy the permanent RAM to priMemAgingBuffer\r
-                                       memcpy(priMemAgingBuffer, HealingMirrorBuffer, sizeof(priMemAgingBuffer));\r
-                               }\r
-                               else{\r
-\r
-                               }\r
-\r
-                       }\r
                }\r
+\r
                // Validate aging records stored in primary memory\r
                for (i = 0; i < DEM_MAX_NUMBER_AGING_PRI_MEM; i++){\r
                        cSum = calcChecksum(&priMemAgingBuffer[i], sizeof(AgingRecType) - sizeof(ChecksumType));\r
@@ -2983,7 +2919,7 @@ Dem_ReturnClearDTCType Dem_ClearDTC(uint32 dtc, Dem_DTCKindType dtcKind, Dem_DTC
                                                                                deleteFreezeFrameDataPriMem(eventParam);\r
                                                                                deleteExtendedDataPriMem(eventParam);\r
                                                                                resetEventStatusRec(eventParam);\r
-                                                                               deleteFreezeFrameDataPerMem(FreezeFrameBlockId);\r
+                                                                               storeFreezeFrameDataPerMem();\r
                                                                                break;\r
                                                                                \r
                                                                        case DEM_DTC_ORIGIN_PERMANENT_MEMORY:\r