//#include "SchM_Dem.h"\r
#include "MemMap.h"\r
#include "Cpu.h"\r
-#include "DEM_Types.h"\r
-#include "DEM_Lcfg.h"\r
+#include "Dem_Types.h"\r
+#include "Dem_Lcfg.h"\r
\r
#define USE_DEBUG_PRINTF\r
#include "debug.h"\r
/*\r
* Local types\r
*/\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
boolean errorStatusChanged;\r
} EventStatusRecType;\r
\r
-// Types for storing different event aging counter\r
-typedef struct {\r
- Dem_EventIdType eventId;\r
- uint8 agingCounter;/** @req Dem019 */\r
- ChecksumType checksum;\r
-} AgingRecType;\r
-\r
// Types for storing different event data on event memory\r
typedef struct {\r
Dem_EventIdType eventId;\r
* Allocation of primary event memory ramlog (after init) in uninitialized memory\r
*/\r
/** @req DEM162 */\r
-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
-//FreezeFrameRecType FreezeFrameMirrorBuffer[DEM_MAX_NUMBER_FF_DATA_PRI_MEM] __attribute__ ((section (".dem_eventmemory_pri")));\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] __attribute__ ((section (".dem_eventmemory_pri")));\r
-AgingRecType priMemAgingBuffer[DEM_MAX_NUMBER_AGING_PRI_MEM] __attribute__ ((section (".dem_eventmemory_pri")));\r
-AgingRecType AgingMirrorBuffer[DEM_MAX_NUMBER_AGING_PRI_MEM] __attribute__ ((section (".dem_eventmemory_pri")));\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
*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
}\r
faultCounterAfterDebounce = eventStatusRecPtr->faultDetectionCounter;\r
- \r
+\r
eventStatusRecPtr->errorStatusChanged = FALSE;\r
\r
if (eventStatus == DEM_EVENT_STATUS_FAILED) {\r
}\r
\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
/** @req DEM036 */\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
- DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_MERGE_EVENT_STATUS_ID, DEM_E_EVENT_STATUS_BUFF_FULL);\r
- }\r
- }\r
-\r
- 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
//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
+ memcpy(&freezeFrameBuf[j],&temp,sizeof(FreezeFrameRecType));\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
+static boolean retrieveEventStatusBit(FreezeFrameRecType *freezeFrameBuf,\r
+ uint16 length ,\r
+ Dem_EventStatusExtendedType nBit,\r
FreezeFrameRecType **freezeFrame)\r
{\r
boolean freezeFrameFound = FALSE;\r
if(freezeFrameFound == TRUE){\r
*freezeFrame = &freezeFrameBuf[i];\r
}\r
- } \r
+ }\r
}\r
\r
return freezeFrameFound;\r
static boolean lookupFreezeFrameForDisplacementPreInit(FreezeFrameRecType **freezeFrame)\r
{\r
boolean freezeFrameFound = FALSE;\r
- \r
+\r
/* Bubble sort:rearrange priMemFreezeFrameBuffer from little to big */\r
bubbleSort(preInitFreezeFrameBuffer, DEM_MAX_NUMBER_FF_DATA_PRE_INIT);\r
\r
if(freezeFrameFound == FALSE){\r
freezeFrameFound = retrieveEventStatusBit(preInitFreezeFrameBuffer, DEM_MAX_NUMBER_FF_DATA_PRE_INIT, DEM_TEST_FAILED, freezeFrame);\r
}\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
\r
return freezeFrameFound;\r
}\r
static boolean lookupFreezeFrameForDisplacement(FreezeFrameRecType **freezeFrame)\r
{\r
boolean freezeFrameFound = FALSE;\r
- \r
+\r
bubbleSort(priMemFreezeFrameBuffer, DEM_MAX_NUMBER_FF_DATA_PRI_MEM);\r
\r
/* Find out the oldest not confirmed dtc */\r
}\r
\r
/* If all confirmed,lookup the oldest active dtc */\r
- if(freezeFrameFound == FALSE){ \r
+ if(freezeFrameFound == FALSE){\r
*freezeFrame = &priMemFreezeFrameBuffer[0];\r
- freezeFrameFound = TRUE; \r
+ freezeFrameFound = TRUE;\r
}\r
\r
return freezeFrameFound;\r
uint32 i = 0;\r
uint32 j = 0;\r
uint32 k = 0;\r
- \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
//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
+ memcpy(&priMemFreezeFrameBuffer[j],&temp,sizeof(FreezeFrameRecType));\r
}\r
\r
}\r
- \r
+\r
}\r
priMemFreezeFrameBuffer[i].timeStamp = k++;\r
}\r
- \r
+\r
}\r
/* update the current timeStamp */\r
*timeStamp = k;\r
* Procedure: getFreezeFrameData\r
* Description: get FF data according configuration \r
*/\r
-static void getFreezeFrameData(const Dem_EventParameterType *eventParam, \r
+static void getFreezeFrameData(const Dem_EventParameterType *eventParam,\r
FreezeFrameRecType *freezeFrame,\r
Dem_EventStatusType eventStatus,\r
EventStatusRecType *eventStatusRec)\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]->FFStorageConditon == prefailedOrFailed){\r
- FreezeFrameLocal = eventParam->FreezeFrameClassRef[i];\r
- break;\r
+ if( eventParam->FreezeFrameClassRef != NULL ) {\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
}\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
+ 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
}\r
/* if no readDidDataLengthFunction, then try the PidOrDidSize. */\r
else{\r
- recordSize = FreezeFrameLocal->FFIdClassRef[i].PidOrDidSize;\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
+ freezeFrame->data[storeIndex] = (FreezeFrameLocal->FFIdClassRef[i]->DidIdentifier>> 8) & 0xFFu;\r
storeIndex++;\r
- freezeFrame->data[storeIndex] = FreezeFrameLocal->FFIdClassRef[i].DidIdentifier & 0xFFu;\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(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(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
else{\r
DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_GET_FREEZEFRAME_ID, DEM_E_FF_TOO_BIG);\r
break;\r
- } \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
}\r
if(FF_TimeStamp > DEM_MAX_TIMESTAMP_FOR_REARRANGEMENT){\r
rearrangeFreezeFrameTimeStamp(&FF_TimeStamp);\r
}\r
- \r
+\r
freezeFrame->timeStamp = FF_TimeStamp;\r
\r
FF_TimeStamp++;\r
freezeFrame->eventId = DEM_EVENT_ID_NULL;\r
freezeFrame->dataSize = storeIndex;\r
freezeFrame->checksum = 0;\r
- } \r
+ }\r
}\r
\r
\r
if (eventIdFreePositionFound) {\r
memcpy(&preInitFreezeFrameBuffer[i-1], freezeFrame, sizeof(FreezeFrameRecType));\r
}\r
- else { \r
+ else {\r
/* do displacement */\r
if(lookupFreezeFrameForDisplacementPreInit(&freezeFrameLocal)){\r
memcpy(freezeFrameLocal, freezeFrame, sizeof(FreezeFrameRecType));\r
preInitFreezeFrameBuffer[i].occurrence += EventBuffer->occurrence;\r
}\r
}\r
- \r
+\r
}\r
/*\r
* Procedure: initCurrentFreezeFrameTimeStamp\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
+ if((priMemFreezeFrameBuffer[i].eventId != DEM_EVENT_ID_NULL) &&\r
(priMemFreezeFrameBuffer[i].timeStamp > temp)){\r
temp = priMemFreezeFrameBuffer[i].timeStamp;\r
}\r
preInitFreezeFrameBuffer[i].timeStamp += temp;\r
}\r
}\r
- *timeStampPtr += temp; \r
+ *timeStampPtr += temp;\r
Irq_Restore(state);\r
}\r
\r
\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 && DEM_UNIT_TEST == STD_OFF)\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 && DEM_UNIT_TEST == STD_OFF)\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 Dem_NvramBlockIdType *AgingBlockIdPtr)\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 (AgingBlockIdPtr->BlockDescriptor != NULL){\r
- /* check the status,whether it's busy or not? */\r
- NvM_GetErrorStatus(AgingBlockIdPtr->BlockDescriptor->NvramBlockIdentifier,&requestResult);\r
- /* if writing is not busy,copy priMemFreezeFrameBuffer to NVRam permanent RAM*/\r
- if (requestResult != NVM_REQ_PENDING){\r
- memcpy(AgingMirrorBuffer, priMemAgingBuffer, sizeof(priMemAgingBuffer));\r
- (void)NvM_WriteBlock(AgingBlockIdPtr->BlockDescriptor->NvramBlockIdentifier, (const uint8 *)AgingMirrorBuffer);\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_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
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(AgingRecType));\r
+ memset(&priMemAgingBuffer[i], 0, sizeof(HealingRecType));\r
}\r
}\r
\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
\r
* Description: Store the freeze frame data in NVRam\r
* \r
*/\r
-static void storeFreezeFrameDataPerMem(const Dem_NvramBlockIdType *FFBlockIdPtr)\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(FFBlockIdPtr->BlockDescriptor != NULL){\r
- NvM_GetErrorStatus(FFBlockIdPtr->BlockDescriptor->NvramBlockIdentifier,&requestResult);\r
-\r
- if(requestResult != NVM_REQ_PENDING ){\r
- memcpy(FreezeFrameMirrorBuffer[i], &priMemFreezeFrameBuffer[i], sizeof(FreezeFrameRecType));\r
- (void)NvM_WriteBlock(FFBlockIdPtr->BlockDescriptor->NvramBlockIdentifier, (const uint8 *)(FreezeFrameMirrorBuffer[i]));\r
- FFIsModifiedLocal = FALSE;\r
- }\r
- else{\r
- FFIsModifiedLocal = TRUE;\r
- }\r
-\r
- FFIsModified |= FFIsModifiedLocal;\r
+ if( E_OK == writeNvmMirror(FreezeFrameBlockId[i], (uint8 *)FreezeFrameMirrorBuffer[i], (const uint8 *)&priMemFreezeFrameBuffer[i], sizeof(FreezeFrameRecType)) ) {\r
+ FFIsModified = FALSE;\r
}\r
- else{\r
- //TODO:report error or doing nothing,assume that doing nothing\r
+ else\r
+ {\r
+ FFIsModified = TRUE;\r
}\r
}\r
- FFBlockIdPtr++;\r
}\r
\r
Irq_Restore(state);\r
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(const Dem_NvramBlockIdType *FFBlockIdPtr)\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(FFBlockIdPtr->BlockDescriptor != NULL){\r
- NvM_GetErrorStatus(FFBlockIdPtr->BlockDescriptor->NvramBlockIdentifier,&requestResult);\r
- if(requestResult != NVM_REQ_PENDING){\r
- memcpy(FreezeFrameMirrorBuffer[i], &priMemFreezeFrameBuffer[i], sizeof(FreezeFrameRecType));\r
- (void)NvM_WriteBlock(FFBlockIdPtr->BlockDescriptor->NvramBlockIdentifier, (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
- FFBlockIdPtr++;\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
{\r
case DEM_DTC_ORIGIN_PRIMARY_MEMORY:\r
storeFreezeFrameDataPriMem(eventParam, freezeFrame);\r
- storeFreezeFrameDataPerMem(FreezeFrameBlockId);\r
+ storeFreezeFrameDataPerMem();\r
break;\r
\r
case DEM_DTC_ORIGIN_PERMANENT_MEMORY:\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
+ 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
+ return (dataSizeFound = FALSE);\r
}\r
}\r
else{\r
- dataSizeLocal = (*freezeFrameClassPtr)->FFIdClassRef[i].PidOrDidSize;\r
+ dataSizeLocal = (*freezeFrameClassPtr)->FFIdClassRef[i]->PidOrDidSize;\r
}\r
- \r
+\r
*dataSize += dataSizeLocal + DEM_DID_IDENTIFIER_SIZE_OF_BYTES;\r
}\r
\r
}\r
}\r
\r
- \r
+\r
}\r
else {\r
// Operation cycle not started\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); /** @req DEM184 */\r
getExtendedData(eventParam, &extendedDataLocal);\r
if (extendedDataLocal.eventId != DEM_EVENT_ID_NULL)\r
{\r
}\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
else{\r
// do nothing\r
}\r
- } \r
+ }\r
}\r
}\r
else {\r
deleteEventPriMem(eventParam);\r
deleteFreezeFrameDataPriMem(eventParam);\r
deleteExtendedDataPriMem(eventParam);\r
- deleteFreezeFrameDataPerMem(FreezeFrameBlockId);\r
+ storeFreezeFrameDataPerMem();\r
break;\r
\r
case DEM_DTC_ORIGIN_PERMANENT_MEMORY:\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 AgingRecType **agingRec)\r
+static boolean lookupAgingRecPriMem(Dem_EventIdType eventId, const HealingRecType **agingRec)\r
{\r
uint16 i;\r
boolean agingRecFound = FALSE;\r
- \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
uint16 i;\r
Std_ReturnType returnCode = E_OK;\r
- AgingRecType *agingRecLocal = NULL;\r
+ HealingRecType *agingRecLocal = NULL;\r
boolean agingRecFound = FALSE;\r
\r
if (operationCycleId < DEM_OPERATION_CYCLE_ID_ENDMARK) {\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 AgingRecType **)(&agingRecLocal));\r
+ agingRecFound = lookupAgingRecPriMem(eventStatusBuffer[i].eventId, (const HealingRecType **)(&agingRecLocal));\r
if(agingRecFound){\r
agingRecLocal->agingCounter++;/** @req Dem489 */\r
- agingRecLocal->checksum = calcChecksum(agingRecLocal,sizeof(AgingRecType) - sizeof(ChecksumType));\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
}\r
else{\r
/* If it does exist,establish a new record for the corresponding event */\r
- agingRecFound = lookupAgingRecPriMem(DEM_EVENT_ID_NULL, (const AgingRecType **)(&agingRecLocal));\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(AgingRecType) - sizeof(ChecksumType));\r
+ agingRecLocal->checksum = calcChecksum(agingRecLocal,sizeof(HealingRecType) - sizeof(ChecksumType));\r
AgingIsModified = TRUE;\r
}\r
else{\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 AgingRecType **)(&agingRecLocal));\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(AgingRecType) - sizeof(ChecksumType));\r
+ agingRecLocal->checksum = calcChecksum(agingRecLocal,sizeof(HealingRecType) - sizeof(ChecksumType));\r
AgingIsModified = TRUE;\r
}\r
}\r
void Dem_Init(void)\r
{\r
uint16 i;\r
- ChecksumType cSum;\r
+// ChecksumType cSum;\r
+ boolean entryValid = FALSE;\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
} else {\r
\r
for(i = 0; i < DEM_MAX_NUMBER_FF_DATA_PRI_MEM; i++){\r
- if(FreezeFrameBlockId[i].BlockDescriptor != NULL){\r
- NvM_GetErrorStatus(FreezeFrameBlockId[i].BlockDescriptor->NvramBlockIdentifier,&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.BlockDescriptor != NULL)\r
- {\r
- //check the status\r
- NvM_GetErrorStatus(AgingBlockId.BlockDescriptor->NvramBlockIdentifier,&requestResult);\r
-\r
- //recover Aging from NVRam to RAM\r
- if(AgingBlockId.BlockDescriptor != NULL){//check the status\r
- NvM_GetErrorStatus(AgingBlockId.BlockDescriptor->NvramBlockIdentifier, &requestResult);\r
-\r
- //judge whether NVM is busy\r
- if(!(requestResult & NVM_REQ_PENDING)){\r
- //copy the permanent RAM to priMemAgingBuffer\r
- memcpy(priMemAgingBuffer, AgingMirrorBuffer, sizeof(priMemAgingBuffer));\r
- }\r
- else{\r
-\r
- }\r
+ if(E_OK == copyNvmMirror(HealingBlockId, (uint8*)priMemAgingBuffer, (const uint8*)HealingMirrorBuffer, sizeof(priMemAgingBuffer)) ){\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
- if ((cSum != priMemAgingBuffer[i].checksum) || (priMemAgingBuffer[i].eventId == DEM_EVENT_ID_NULL)) {\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(AgingRecType));\r
+ memset(&priMemAgingBuffer[i], 0, sizeof(HealingRecType));\r
AgingIsModified = TRUE;\r
}\r
+ }\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
- }\r
- else {\r
- // Valid, update current status\r
- mergeEventStatusRec(&priMemEventBuffer[i]);\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
+ // Update occurrence counter on pre init stored freeze frames\r
+ updateFreezeFrameOccurrencePreInit(&priMemEventBuffer[i]);\r
}\r
+ }\r
\r
- //initialize the current timestamp and update the timestamp in pre init\r
- initCurrentFreezeFrameTimeStamp(&FF_TimeStamp);//add by i-soft\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
- }\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
//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
- cSum = calcChecksum(&priMemFreezeFrameBuffer[i], sizeof(FreezeFrameRecType)-sizeof(ChecksumType));\r
- if ((cSum != priMemFreezeFrameBuffer[i].checksum) || (priMemFreezeFrameBuffer[i].eventId == DEM_EVENT_ID_NULL)) {\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
//lint -restore\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
- // LuYuan: no checksum is needed.\r
- /* for (i = 0; i < DEM_MAX_NUMBER_FF_DATA_PRI_MEM; i++) {\r
- // Bug report by iSOFT, data structure is not byte aligned, use "sizeof is not SAFE! \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
- }\r
- }\r
- */\r
- //lint -restore\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
- lookupEventIdParameter(eventStatusBuffer[i].eventId, &eventParam);\r
- storeEventEvtMem(eventParam, &eventStatusBuffer[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
\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
+ /* 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
\r
//lint -save\r
//lint -e568 //PC-Lint exception.\r
* Interface for basic software scheduler\r
*/\r
void Dem_MainFunction(void)/** @req DEM125 */\r
-{ \r
+{\r
if (FFIsModified) {\r
storeFreezeFrameDataPerMem(FreezeFrameBlockId);\r
}\r
\r
if (AgingIsModified) {\r
- storeAgingRecPerMem(&AgingBlockId);\r
+ storeAgingRecPerMem(HealingBlockId);\r
}\r
}\r
\r
* Procedure: Dem_ReportErrorStatus\r
* Reentrant: Yes\r
*/\r
-void Dem_ReportErrorStatus( Dem_EventIdType eventId, Dem_EventStatusType eventStatus ) /** @req DEM107 *//** @req DEM206 */\r
+void Dem_ReportErrorStatus( Dem_EventIdType eventId, Dem_EventStatusType eventStatus ) /** @req DEM206 */\r
{\r
\r
switch (demState) {\r
deleteFreezeFrameDataPriMem(eventParam);\r
deleteExtendedDataPriMem(eventParam);\r
resetEventStatusRec(eventParam);\r
- deleteFreezeFrameDataPerMem(FreezeFrameBlockId);\r
+ storeFreezeFrameDataPerMem();\r
break;\r
- \r
+\r
+ case DEM_DTC_ORIGIN_SECONDARY_MEMORY:\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
* Procedure: Dem_GetFreezeFrameDataByDTC\r
* Reentrant: No\r
*/\r
-/** @req DEM236 */ \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
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
+ 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
- }\r
- else{\r
- returnCode = DEM_GET_FFDATABYDTC_BUFFERSIZE;\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
+ else{\r
returnCode = DEM_GET_FFDATABYDTC_BUFFERSIZE;\r
}\r
}\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
+ for(i=0; (i < DEM_MAX_NR_OF_RECORDS_IN_FREEZEFRAME_DATA) && (!(FFDataRecordClass->FFIdClassRef[i]->Arc_EOL)); i++){\r
+ dataId[didNum] = &FFDataRecordClass->FFIdClassRef[i]->DidIdentifier;/** @req DEM073 */\r
+ didNum++;\r
+ returnCode = DEM_GET_ID_OK;\r
+\r
}\r
*arraySize = didNum;\r
}\r
- \r
+ else {\r
+ returnCode = DEM_GET_ID_WRONG_FF_TYPE;\r
+ }\r
}\r
else{\r
returnCode = DEM_GET_ID_WRONG_FF_TYPE;\r
else{\r
returnCode = DEM_GET_ID_WRONG_DTC;\r
}\r
- \r
- } \r
+\r
+ }\r
else{\r
DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_GETFREEZEFRAMEDATAIDENTIFIERBYDTC_ID, DEM_E_UNINIT);\r
}\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
+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
EventStatusRecType *eventRec;\r
uint16 dataSize = 0;\r
uint16 i = 0;\r
- \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
+ /* Note - there is a function called lookupFreezeFrameDataSize that can be used here */\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(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
+ 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
+ returnCode = DEM_GET_SIZEOFFF_OK;\r
+ }\r
+ }\r
+ else {\r
+ returnCode = DEM_GET_SIZEOFFF_WRONG_RNUM;\r
}\r
}\r
else{\r
else{\r
returnCode = DEM_GET_SIZEOFFF_WRONG_DTC;\r
}\r
- \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
\r
-\r
-#ifdef DEM_UNIT_TEST\r
+#if (DEM_UNIT_TEST == STD_ON)\r
void getFFDataPreInit(FreezeFrameRecType **buf)\r
{\r
*buf = &preInitFreezeFrameBuffer[0];\r
return;\r
}\r
\r
-void getPriMemAgingBufPtr(AgingRecType **buf)\r
+void getPriMemAgingBufPtr(HealingRecType **buf)\r
{\r
*buf = &priMemAgingBuffer[0];\r
return;\r