1 /* -------------------------------- Arctic Core ------------------------------
\r
2 * Arctic Core - the open source AUTOSAR platform http://arccore.com
\r
4 * Copyright (C) 2009 ArcCore AB <contact@arccore.com>
\r
6 * This source code is free software; you can redistribute it and/or modify it
\r
7 * under the terms of the GNU General Public License version 2 as published by the
\r
8 * Free Software Foundation; See <http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt>.
\r
10 * This program is distributed in the hope that it will be useful, but
\r
11 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
\r
12 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
\r
14 * -------------------------------- Arctic Core ------------------------------*/
\r
16 // 904 PC-Lint MISRA 14.7: OK. Allow VALIDATE, VALIDATE_RV and VALIDATE_NO_RV to return value.
\r
17 //lint -emacro(904,VALIDATE_RV,VALIDATE_NO_RV,VALIDATE)
\r
19 // 522 PC-Lint exception for empty functions
\r
20 //lint -esym(522,storeFreezeFrameDataEvtMem)
\r
21 //lint -esym(522,deleteFreezeFrameDataPriMem)
\r
22 //lint -esym(522,storeFreezeFrameDataPreInit)
\r
23 //lint -esym(522,storeFreezeFrameDataPriMem)
\r
24 //lint -esym(522,updateFreezeFrameOccurrencePreInit)
\r
26 // PC-Lint misunderstanding of MISRA 8.12, 18.1: Empty arrays are OK as long as size 0 is specified.
\r
27 //lint -esym(85,preInitFreezeFrameBuffer)
\r
28 //lint -esym(85,priMemFreezeFrameBuffer)
\r
32 * General requirements
\r
35 /** @req DEM151.partially */
\r
37 /** @req DEM013.14229-1 */
\r
40 /** @req DEM113 */ /** @req DEM174 */
\r
54 //#include "SchM_Dem.h"
\r
57 #include "Dem_Types.h"
\r
58 #include "Dem_Lcfg.h"
\r
60 #define USE_DEBUG_PRINTF
\r
65 #define DEBOUNCE_FDC_TEST_FAILED 127
\r
66 #define DEBOUNCE_FDC_TEST_PASSED -128
\r
68 #if ( DEM_DEV_ERROR_DETECT == STD_ON )
\r
69 #if defined(USE_DET)
\r
73 #define VALIDATE_RV(_exp,_api,_err,_rv ) \
\r
75 Det_ReportError(MODULE_ID_DEM, 0, _api, _err); \
\r
79 #define VALIDATE_NO_RV(_exp,_api,_err ) \
\r
81 Det_ReportError(MODULE_ID_DEM, 0, _api, _err); \
\r
84 #define DET_REPORTERROR(_x,_y,_z,_q) Det_ReportError(_x, _y, _z, _q)
\r
87 #define VALIDATE_RV(_exp,_api,_err,_rv )
\r
88 #define VALIDATE_NO_RV(_exp,_api,_err )
\r
89 #define DET_REPORTERROR(_x,_y,_z,_q)
\r
92 #if (DEM_OBD_SUPPORT == STD_ON)
\r
93 #error "DEM_OBD_SUPPORT is set to STD_ON, this is not supported by the code."
\r
96 #if (DEM_PTO_SUPPORT == STD_ON)
\r
97 #error "DEM_PTO_SUPPORT is set to STD_ON, this is not supported by the code."
\r
100 #if (DEM_TYPE_OF_DTC_SUPPORTED != 0x01)
\r
101 #error "DEM_TYPE_OF_DTC_SUPPORTED is not set to 1 (ISO14229-1), only ISO14229-1 is currently supported by the code."
\r
108 #if !defined(USE_DCM)
\r
109 typedef uint8 Dcm_NegativeResponseCodeType;
\r
110 #define DCM_E_POSITIVERESPONSE ((Dcm_NegativeResponseCodeType)0x00)
\r
115 Dem_EventStatusExtendedType dtcStatusMask;
\r
116 Dem_DTCKindType dtcKind;
\r
117 Dem_DTCOriginType dtcOrigin;
\r
118 Dem_FilterWithSeverityType filterWithSeverity;
\r
119 Dem_DTCSeverityType dtcSeverityMask;
\r
120 Dem_FilterForFDCType filterForFaultDetectionCounter;
\r
124 // DisableDtcStorageType
\r
126 boolean storageDisabled;
\r
127 Dem_DTCGroupType dtcGroup;
\r
128 Dem_DTCKindType dtcKind;
\r
129 } DisableDtcStorageType;
\r
131 // For keeping track of the events status
\r
133 Dem_EventIdType eventId;
\r
134 const Dem_EventParameterType *eventParamRef;
\r
135 sint8 faultDetectionCounter;
\r
136 sint8 maxFaultDetectionCounter;
\r
137 uint16 occurrence; /** @req DEM011 */
\r
138 Dem_EventStatusExtendedType eventStatusExtended; /** @req DEM006 */
\r
139 boolean errorStatusChanged;
\r
140 } EventStatusRecType;
\r
142 // Types for storing different event data on event memory
\r
144 Dem_EventIdType eventId;
\r
146 Dem_EventStatusExtendedType eventStatusExtended;
\r
147 ChecksumType checksum;
\r
151 Dem_EventIdType eventId;
\r
152 uint8 data[DEM_MAX_SIZE_EXT_DATA];
\r
153 ChecksumType checksum;
\r
160 DEM_UNINITIALIZED = 0,
\r
161 DEM_PREINITIALIZED,
\r
163 } Dem_StateType; /** @req DEM169 */
\r
166 static Dem_StateType demState = DEM_UNINITIALIZED;
\r
168 // Help pointer to configuration set
\r
169 static const Dem_ConfigSetType *configSet;
\r
172 * Allocation of DTC filter parameters
\r
174 static DtcFilterType dtcFilter;
\r
177 * Allocation of Disable/Enable DTC storage parameters
\r
179 static DisableDtcStorageType disableDtcStorage;
\r
182 * Allocation of operation cycle state list
\r
184 static Dem_OperationCycleStateType operationCycleStateList[DEM_OPERATION_CYCLE_ID_ENDMARK];
\r
187 * Allocation of local event status buffer
\r
189 static EventStatusRecType eventStatusBuffer[DEM_MAX_NUMBER_EVENT];
\r
192 * Allocation of pre-init event memory (used between pre-init and init)
\r
195 static FreezeFrameRecType preInitFreezeFrameBuffer[DEM_MAX_NUMBER_FF_DATA_PRE_INIT];
\r
196 static ExtDataRecType preInitExtDataBuffer[DEM_MAX_NUMBER_EXT_DATA_PRE_INIT];
\r
199 * Allocation of primary event memory ramlog (after init) in uninitialized memory
\r
202 EventRecType priMemEventBuffer[DEM_MAX_NUMBER_EVENT_PRI_MEM];
\r
203 static FreezeFrameRecType priMemFreezeFrameBuffer[DEM_MAX_NUMBER_FF_DATA_PRI_MEM];
\r
204 //FreezeFrameRecType FreezeFrameMirrorBuffer[DEM_MAX_NUMBER_FF_DATA_PRI_MEM];
\r
205 extern FreezeFrameRecType* FreezeFrameMirrorBuffer[];
\r
206 static ExtDataRecType priMemExtDataBuffer[DEM_MAX_NUMBER_EXT_DATA_PRI_MEM];
\r
207 HealingRecType priMemAgingBuffer[DEM_MAX_NUMBER_AGING_PRI_MEM];
\r
208 extern HealingRecType HealingMirrorBuffer[DEM_MAX_NUMBER_AGING_PRI_MEM];
\r
210 /* block in NVRam, use for freezeframe */
\r
211 extern const NvM_BlockIdType FreezeFrameBlockId[DEM_MAX_NUMBER_FF_DATA_PRI_MEM];
\r
212 /* block in NVRam, use for aging */
\r
213 extern const NvM_BlockIdType HealingBlockId;
\r
217 *Allocation of freezeFrame storage timestamp,record the time order
\r
219 /**private variable for freezeframe */
\r
220 static uint32 FF_TimeStamp = 0;
\r
223 * TRUE: priMemFreezeFrameBuffer changed,
\r
224 * FALSE: priMemFreezeFrameBuffer not changed
\r
226 static boolean FFIsModified = FALSE;
\r
229 * TRUE: priMemAgingBuffer changed,
\r
230 * FALSE: priMemAgingBuffer not changed
\r
232 static boolean AgingIsModified = FALSE;
\r
235 * Procedure: zeroPriMemBuffers
\r
236 * Description: Fill the primary buffers with zeroes
\r
239 //lint -e84 //PC-Lint exception, size 0 is OK.
\r
240 //lint -e957 PC-Lint exception - Used only by DemTest
\r
241 void demZeroPriMemBuffers(void)
\r
243 memset(priMemEventBuffer, 0, sizeof(priMemEventBuffer));
\r
244 memset(priMemFreezeFrameBuffer, 0, sizeof(priMemFreezeFrameBuffer));
\r
245 memset(priMemExtDataBuffer, 0, sizeof(priMemExtDataBuffer));
\r
250 * Procedure: calcChecksum
\r
251 * Description: Calculate checksum over *data to *(data+nrOfBytes-1) area
\r
253 static ChecksumType calcChecksum(void *data, uint16 nrOfBytes)
\r
256 uint8 *byte = (uint8*)data;
\r
257 ChecksumType sum = 0;
\r
259 for (i = 0; i < nrOfBytes; i++) {
\r
268 * Procedure: checkDtcKind
\r
269 * Description: Return TRUE if "dtcKind" match the events DTCKind or "dtcKind"
\r
270 * is "DEM_DTC_KIND_ALL_DTCS" otherwise FALSE.
\r
272 static boolean checkDtcKind(Dem_DTCKindType dtcKind, const Dem_EventParameterType *eventParam)
\r
274 boolean result = FALSE;
\r
276 if (dtcKind == DEM_DTC_KIND_ALL_DTCS) {
\r
280 if (eventParam->DTCClassRef != NULL) {
\r
281 if (eventParam->DTCClassRef->DTCKind == dtcKind) {
\r
291 * Procedure: checkDtcGroup
\r
292 * Description: Return TRUE if "dtc" match the events DTC or "dtc" is
\r
293 * "DEM_DTC_GROUP_ALL_DTCS" otherwise FALSE.
\r
295 static boolean checkDtcGroup(uint32 dtc, const Dem_EventParameterType *eventParam)
\r
297 boolean result = FALSE;
\r
299 if (dtc == DEM_DTC_GROUP_ALL_DTCS) {
\r
303 if (eventParam->DTCClassRef != NULL) {
\r
304 if (eventParam->DTCClassRef->DTC == dtc) {
\r
314 * Procedure: checkDtcOrigin
\r
315 * Description: Return TRUE if "dtcOrigin" match any of the events DTCOrigin otherwise FALSE.
\r
317 static boolean checkDtcOrigin(Dem_DTCOriginType dtcOrigin, const Dem_EventParameterType *eventParam)
\r
319 boolean result = FALSE;
\r
320 boolean dtcOriginFound = FALSE;
\r
323 for (i = 0;(i < DEM_MAX_NR_OF_EVENT_DESTINATION) && (!dtcOriginFound); i++){
\r
324 dtcOriginFound = (eventParam->EventClass->EventDestination[i] == dtcOrigin);
\r
327 if (dtcOriginFound) {
\r
335 * Procedure: checkDtcSeverityMask
\r
336 * Description: Return TRUE if "dtcSeverityMask" match any of the events DTC severity otherwise FALSE.
\r
338 // PC-Lint (715 etc): Remove errors until function is filled.
\r
339 //lint -e{715} Symbol not referenced
\r
340 static boolean checkDtcSeverityMask(Dem_DTCSeverityType dtcSeverityMask, const Dem_EventParameterType *eventParam)
\r
342 boolean result = TRUE;
\r
344 // TODO: This function is optional, may be implemented here.
\r
351 * Procedure: checkDtcFaultDetectionCounterMask
\r
352 * Description: TBD.
\r
354 // PC-Lint (715 etc): Remove errors until function is filled.
\r
355 //lint -e{715} Symbol not referenced
\r
356 static boolean checkDtcFaultDetectionCounter(const Dem_EventParameterType *eventParam)
\r
358 boolean result = TRUE;
\r
360 // TODO: Not implemented yet.
\r
367 * Procedure: lookupEventStatusRec
\r
368 * Description: Returns the pointer to event id parameters of "eventId" in "*eventStatusBuffer",
\r
369 * if not found NULL is returned.
\r
371 static void lookupEventStatusRec(Dem_EventIdType eventId, EventStatusRecType **const eventStatusRec)
\r
374 boolean eventIdFound = FALSE;
\r
376 for (i = 0; (i < DEM_MAX_NUMBER_EVENT) && (!eventIdFound); i++) {
\r
377 eventIdFound = (eventStatusBuffer[i].eventId == eventId);
\r
380 if (eventIdFound) {
\r
381 *eventStatusRec = &eventStatusBuffer[i-1];
\r
383 *eventStatusRec = NULL;
\r
388 * Procedure: lookupEventIdParameter
\r
389 * Description: Returns the pointer to event id parameters of "eventId" in "*eventIdParam",
\r
390 * if not found NULL is returned.
\r
392 static void lookupEventIdParameter(Dem_EventIdType eventId, const Dem_EventParameterType **const eventIdParam)
\r
394 const Dem_EventParameterType *EventIdParamList = configSet->EventParameter;
\r
396 /* Lookup the correct event id parameters */
\r
398 while ((EventIdParamList[i].EventID != eventId) && (!EventIdParamList[i].Arc_EOL)) {
\r
402 if (!EventIdParamList[i].Arc_EOL) {
\r
403 *eventIdParam = &EventIdParamList[i];
\r
405 *eventIdParam = NULL;
\r
409 * Procedure: checkEntryValid
\r
410 * Description: Returns whether event id "eventId" is a valid entry in primary memory
\r
412 static boolean checkEntryValid(Dem_EventIdType eventId){
\r
413 const Dem_EventParameterType *EventIdParamList = configSet->EventParameter;
\r
414 boolean isValid = FALSE;
\r
416 while ((EventIdParamList[i].EventID != eventId) && (!EventIdParamList[i].Arc_EOL)) {
\r
420 if (!EventIdParamList[i].Arc_EOL) {
\r
423 for (index = 0; (index < DEM_MAX_NR_OF_EVENT_DESTINATION)
\r
424 && (EventIdParamList[i].EventClass->EventDestination[index] != DEM_EVENT_DESTINATION_END_OF_LIST); index++) {
\r
425 if( DEM_DTC_ORIGIN_PRIMARY_MEMORY == EventIdParamList[i].EventClass->EventDestination[index]){
\r
426 // Event should be stored in primary memory.
\r
432 // The event did not exist
\r
437 * Procedure: preDebounceNone
\r
438 * Description: Returns the result of the debouncing.
\r
440 static Dem_EventStatusType preDebounceNone(const Dem_EventStatusType reportedStatus, const EventStatusRecType* statusRecord) {
\r
441 Dem_EventStatusType returnCode;
\r
442 (void)statusRecord; // Just to get rid of PC-Lint warnings
\r
444 switch (reportedStatus) {
\r
445 case DEM_EVENT_STATUS_FAILED: /** @req DEM091.NoneFailed */
\r
446 case DEM_EVENT_STATUS_PASSED: /** @req DEM091.NonePassed */
\r
447 // Already debounced, do nothing.
\r
451 // TODO: What to do with PREFAIL and PREPASSED on no debouncing?
\r
452 DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_PREDEBOUNCE_NONE_ID, DEM_E_PARAM_DATA);
\r
456 returnCode = reportedStatus;
\r
462 * Procedure: preDebounceCounterBased
\r
463 * Description: Returns the result of the debouncing.
\r
465 static Dem_EventStatusType preDebounceCounterBased(Dem_EventStatusType reportedStatus, EventStatusRecType* statusRecord) {
\r
466 Dem_EventStatusType returnCode;
\r
467 const Dem_PreDebounceCounterBasedType* pdVars = statusRecord->eventParamRef->EventClass->PreDebounceAlgorithmClass->PreDebounceAlgorithm.PreDebounceCounterBased;
\r
469 switch (reportedStatus) {
\r
470 case DEM_EVENT_STATUS_PREFAILED:
\r
471 if (statusRecord->faultDetectionCounter < DEBOUNCE_FDC_TEST_FAILED) {
\r
472 if ((pdVars->JumpUp) && (statusRecord->faultDetectionCounter < 0)) {
\r
473 statusRecord->faultDetectionCounter = 0;
\r
475 if (((sint16)statusRecord->faultDetectionCounter + (sint8)pdVars->CountInStepSize) < DEBOUNCE_FDC_TEST_FAILED) {
\r
476 statusRecord->faultDetectionCounter += (sint8)pdVars->CountInStepSize;
\r
478 statusRecord->faultDetectionCounter = DEBOUNCE_FDC_TEST_FAILED;
\r
484 case DEM_EVENT_STATUS_PREPASSED:
\r
485 if (statusRecord->faultDetectionCounter > DEBOUNCE_FDC_TEST_PASSED) {
\r
486 if ((pdVars->JumpDown) && (statusRecord->faultDetectionCounter > 0)) {
\r
487 statusRecord->faultDetectionCounter = 0;
\r
489 if (((sint16)statusRecord->faultDetectionCounter - (sint8)pdVars->CountOutStepSize) > DEBOUNCE_FDC_TEST_PASSED) {
\r
490 statusRecord->faultDetectionCounter -= (sint8)pdVars->CountOutStepSize;
\r
492 statusRecord->faultDetectionCounter = DEBOUNCE_FDC_TEST_PASSED;
\r
498 case DEM_EVENT_STATUS_FAILED:
\r
499 statusRecord->faultDetectionCounter = DEBOUNCE_FDC_TEST_FAILED; /** @req DEM091.CounterFailed */
\r
502 case DEM_EVENT_STATUS_PASSED:
\r
503 statusRecord->faultDetectionCounter = DEBOUNCE_FDC_TEST_PASSED; /** @req DEM091.CounterPassed */
\r
507 DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_PREDEBOUNCE_COUNTER_BASED_ID, DEM_E_PARAM_DATA);
\r
512 switch (statusRecord->faultDetectionCounter) {
\r
513 case DEBOUNCE_FDC_TEST_FAILED:
\r
514 returnCode = DEM_EVENT_STATUS_FAILED;
\r
517 case DEBOUNCE_FDC_TEST_PASSED:
\r
518 returnCode = DEM_EVENT_STATUS_PASSED;
\r
522 returnCode = reportedStatus;
\r
526 statusRecord->maxFaultDetectionCounter = MAX(statusRecord->maxFaultDetectionCounter, statusRecord->faultDetectionCounter);
\r
532 * Procedure: updateEventStatusRec
\r
533 * Description: Update the status of "eventId", if not exist and "createIfNotExist" is
\r
534 * true a new record is created
\r
536 static void updateEventStatusRec(const Dem_EventParameterType *eventParam, Dem_EventStatusType eventStatus, boolean createIfNotExist, EventStatusRecType *eventStatusRec)
\r
538 EventStatusRecType *eventStatusRecPtr;
\r
539 sint8 faultCounterBeforeDebounce = 0;
\r
540 sint8 faultCounterAfterDebounce = 0;
\r
544 lookupEventStatusRec(eventParam->EventID, &eventStatusRecPtr);
\r
546 if ((eventStatusRecPtr == NULL) && (createIfNotExist)) {
\r
547 lookupEventStatusRec(DEM_EVENT_ID_NULL, &eventStatusRecPtr);
\r
548 if (eventStatusRecPtr != NULL) {
\r
549 eventStatusRecPtr->eventId = eventParam->EventID;
\r
550 eventStatusRecPtr->eventParamRef = eventParam;
\r
551 eventStatusRecPtr->faultDetectionCounter = 0;
\r
552 eventStatusRecPtr->maxFaultDetectionCounter = 0;
\r
553 eventStatusRecPtr->occurrence = 0;
\r
554 eventStatusRecPtr->eventStatusExtended = DEM_TEST_NOT_COMPLETED_SINCE_LAST_CLEAR | DEM_TEST_NOT_COMPLETED_THIS_OPERATION_CYCLE;
\r
555 eventStatusRecPtr->errorStatusChanged = FALSE;
\r
558 DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_UPDATE_EVENT_STATUS_ID, DEM_E_EVENT_STATUS_BUFF_FULL);
\r
563 if (eventStatusRecPtr != NULL) {
\r
564 faultCounterBeforeDebounce = eventStatusRecPtr->faultDetectionCounter;
\r
566 if (eventParam->EventClass->PreDebounceAlgorithmClass != NULL) {
\r
567 switch (eventParam->EventClass->PreDebounceAlgorithmClass->PreDebounceName) { /** @req DEM004 */ /** @req DEM342 */
\r
568 case DEM_NO_PRE_DEBOUNCE:
\r
569 eventStatus = preDebounceNone(eventStatus, eventStatusRecPtr);
\r
572 case DEM_PRE_DEBOUNCE_COUNTER_BASED:
\r
573 eventStatus = preDebounceCounterBased(eventStatus, eventStatusRecPtr);
\r
577 DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_UPDATE_EVENT_STATUS_ID, DEM_E_NOT_IMPLEMENTED_YET);
\r
581 faultCounterAfterDebounce = eventStatusRecPtr->faultDetectionCounter;
\r
583 eventStatusRecPtr->errorStatusChanged = FALSE;
\r
585 if (eventStatus == DEM_EVENT_STATUS_FAILED) {
\r
586 if (!(eventStatusRecPtr->eventStatusExtended & DEM_TEST_FAILED)) {
\r
587 eventStatusRecPtr->occurrence++;
\r
588 eventStatusRecPtr->errorStatusChanged = TRUE;
\r
590 /** @req DEM036 */ /** @req DEM379.PendingSet */
\r
591 eventStatusRecPtr->eventStatusExtended |= (DEM_TEST_FAILED | DEM_TEST_FAILED_THIS_OPERATION_CYCLE | DEM_TEST_FAILED_SINCE_LAST_CLEAR | DEM_PENDING_DTC | DEM_CONFIRMED_DTC);
\r
592 eventStatusRecPtr->eventStatusExtended &= (Dem_EventStatusExtendedType)~(DEM_TEST_NOT_COMPLETED_SINCE_LAST_CLEAR | DEM_TEST_NOT_COMPLETED_THIS_OPERATION_CYCLE);
\r
595 if (eventStatus == DEM_EVENT_STATUS_PASSED) {
\r
596 if (eventStatusRecPtr->eventStatusExtended & (DEM_TEST_FAILED | DEM_TEST_NOT_COMPLETED_THIS_OPERATION_CYCLE)) {
\r
597 eventStatusRecPtr->errorStatusChanged = TRUE;
\r
600 eventStatusRecPtr->eventStatusExtended &= (Dem_EventStatusExtendedType)~DEM_TEST_FAILED;
\r
601 eventStatusRecPtr->eventStatusExtended &= (Dem_EventStatusExtendedType)~(DEM_TEST_NOT_COMPLETED_SINCE_LAST_CLEAR | DEM_TEST_NOT_COMPLETED_THIS_OPERATION_CYCLE);
\r
604 if ((eventStatus == DEM_EVENT_STATUS_PREFAILED)\
\r
605 && (faultCounterBeforeDebounce <= 0) && (faultCounterAfterDebounce > 0)){
\r
606 eventStatusRecPtr->errorStatusChanged = TRUE;
\r
609 eventStatusRec->maxFaultDetectionCounter = MAX(eventStatusRec->maxFaultDetectionCounter, eventStatusRec->faultDetectionCounter);
\r
610 memcpy(eventStatusRec, eventStatusRecPtr, sizeof(EventStatusRecType));
\r
613 eventStatusRec->eventId = DEM_EVENT_ID_NULL;
\r
614 eventStatusRec->faultDetectionCounter = 0;
\r
615 eventStatusRec->maxFaultDetectionCounter = 0;
\r
616 eventStatusRec->occurrence = 0;
\r
617 eventStatusRec->eventStatusExtended = DEM_TEST_NOT_COMPLETED_THIS_OPERATION_CYCLE | DEM_TEST_NOT_COMPLETED_SINCE_LAST_CLEAR;
\r
618 eventStatusRec->errorStatusChanged = FALSE;
\r
621 Irq_Restore(state);
\r
626 * Procedure: mergeEventStatusRec
\r
627 * Description: Update the occurrence counter of status, if not exist a new record is created
\r
629 static void mergeEventStatusRec(const EventRecType *eventRec)
\r
631 EventStatusRecType *eventStatusRecPtr;
\r
636 lookupEventStatusRec(eventRec->eventId, &eventStatusRecPtr);
\r
638 if (eventStatusRecPtr != NULL) {
\r
639 // Update occurrence counter.
\r
640 eventStatusRecPtr->occurrence += eventRec->occurrence;
\r
641 // Merge event status extended with stored
\r
642 // TEST_FAILED_SINCE_LAST_CLEAR should be set if set if set in either
\r
643 eventStatusRecPtr->eventStatusExtended |= (Dem_EventStatusExtendedType)(eventRec->eventStatusExtended & DEM_TEST_FAILED_SINCE_LAST_CLEAR);
\r
644 // DEM_TEST_NOT_COMPLETED_SINCE_LAST_CLEAR should cleared if cleared in either
\r
645 eventStatusRecPtr->eventStatusExtended |= (Dem_EventStatusExtendedType)(eventRec->eventStatusExtended & eventStatusRecPtr->eventStatusExtended & DEM_TEST_NOT_COMPLETED_SINCE_LAST_CLEAR);
\r
646 // DEM_PENDING_DTC and DEM_CONFIRMED_DTC should be set if set in either
\r
647 eventStatusRecPtr->eventStatusExtended |= (Dem_EventStatusExtendedType)(eventRec->eventStatusExtended & (DEM_PENDING_DTC | DEM_CONFIRMED_DTC));
\r
651 Irq_Restore(state);
\r
655 * Procedure: resetEventStatusRec
\r
656 * Description: Reset the status record of "eventParam->eventId" from "eventStatusBuffer".
\r
658 static void resetEventStatusRec(const Dem_EventParameterType *eventParam)
\r
660 EventStatusRecType *eventStatusRecPtr;
\r
665 lookupEventStatusRec(eventParam->EventID, &eventStatusRecPtr);
\r
667 if (eventStatusRecPtr != NULL) {
\r
668 // Reset event record
\r
669 eventStatusRecPtr->faultDetectionCounter = 0;
\r
670 eventStatusRecPtr->maxFaultDetectionCounter = 0;
\r
671 eventStatusRecPtr->eventStatusExtended = (DEM_TEST_NOT_COMPLETED_THIS_OPERATION_CYCLE | DEM_TEST_NOT_COMPLETED_SINCE_LAST_CLEAR);
\r
672 eventStatusRecPtr->errorStatusChanged = FALSE;
\r
673 eventStatusRecPtr->occurrence = 0;
\r
676 Irq_Restore(state);
\r
680 * Procedure: getEventStatusRec
\r
681 * Description: Returns the status record of "eventId" in "eventStatusRec"
\r
683 static void getEventStatusRec(Dem_EventIdType eventId, EventStatusRecType *eventStatusRec)
\r
685 EventStatusRecType *eventStatusRecPtr;
\r
688 lookupEventStatusRec(eventId, &eventStatusRecPtr);
\r
690 if (eventStatusRecPtr != NULL) {
\r
692 memcpy(eventStatusRec, eventStatusRecPtr, sizeof(EventStatusRecType));
\r
695 eventStatusRec->eventId = DEM_EVENT_ID_NULL;
\r
699 static void getInternalElement( const Dem_EventParameterType *eventParameter, Dem_InternalDataElementType elementType, uint8_t* buf )
\r
701 EventStatusRecType eventStatusRec;
\r
703 getEventStatusRec(eventParameter->EventID, &eventStatusRec);
\r
705 if( DEM_EVENT_ID_NULL != eventStatusRec.eventId ) {
\r
706 if( DEM_OCCCTR == elementType ) {
\r
707 buf[0] = eventStatusRec.occurrence >> 8;
\r
708 buf[1] = eventStatusRec.occurrence;
\r
710 else if( DEM_FAULTDETCTR == elementType ) {
\r
711 buf[0] = eventStatusRec.faultDetectionCounter;
\r
713 else if( DEM_MAXFAULTDETCTR == elementType ) {
\r
714 buf[0] = eventStatusRec.maxFaultDetectionCounter;
\r
720 * Procedure: lookupDtcEvent
\r
721 * Description: Returns TRUE if the DTC was found and "eventStatusRec" points
\r
722 * to the event record found.
\r
724 static boolean lookupDtcEvent(uint32 dtc, EventStatusRecType **eventStatusRec)
\r
726 boolean dtcFound = FALSE;
\r
729 *eventStatusRec = NULL;
\r
731 for (i = 0; (i < DEM_MAX_NUMBER_EVENT) && (!dtcFound); i++) {
\r
732 if (eventStatusBuffer[i].eventId != DEM_EVENT_ID_NULL) {
\r
733 if (eventStatusBuffer[i].eventParamRef->DTCClassRef != NULL) {
\r
736 if (eventStatusBuffer[i].eventParamRef->DTCClassRef->DTC == dtc) {
\r
737 *eventStatusRec = &eventStatusBuffer[i];
\r
749 * Procedure: matchEventWithDtcFilter
\r
750 * Description: Returns TRUE if the event pointed by "event" fulfill
\r
751 * the "dtcFilter" global filter settings.
\r
753 static boolean matchEventWithDtcFilter(const EventStatusRecType *eventRec)
\r
755 boolean dtcMatch = FALSE;
\r
758 if ((dtcFilter.dtcStatusMask == DEM_DTC_STATUS_MASK_ALL) || (eventRec->eventStatusExtended & dtcFilter.dtcStatusMask)) {
\r
759 if (eventRec->eventParamRef != NULL) {
\r
762 if (checkDtcKind(dtcFilter.dtcKind, eventRec->eventParamRef)) {
\r
765 if (checkDtcOrigin(dtcFilter.dtcOrigin, eventRec->eventParamRef)) {
\r
768 if ((dtcFilter.filterWithSeverity == DEM_FILTER_WITH_SEVERITY_NO)
\r
769 || ((dtcFilter.filterWithSeverity == DEM_FILTER_WITH_SEVERITY_YES) && (checkDtcSeverityMask(dtcFilter.dtcSeverityMask, eventRec->eventParamRef)))) {
\r
771 // Check fault detection counter
\r
772 if ((dtcFilter.filterForFaultDetectionCounter == DEM_FILTER_FOR_FDC_NO)
\r
773 || ((dtcFilter.filterWithSeverity == DEM_FILTER_FOR_FDC_YES) && (checkDtcFaultDetectionCounter(eventRec->eventParamRef)))) {
\r
785 * Procedure: bubbleSort
\r
786 * Description: bubble sort
\r
788 static void bubbleSort(FreezeFrameRecType *freezeFrameBuf, uint16 length)
\r
790 FreezeFrameRecType temp;
\r
794 //Bubble sort:rearrange priMemFreezeFrameBuffer from little to big
\r
795 for(i=0;i<length;i++){
\r
796 for(j=length-1; j > i; j--){
\r
797 if(freezeFrameBuf[i].timeStamp > freezeFrameBuf[j].timeStamp){
\r
798 //exchange buffer data
\r
799 memcpy(&temp,&freezeFrameBuf[i],sizeof(FreezeFrameRecType));
\r
800 memcpy(&freezeFrameBuf[i],&freezeFrameBuf[j],sizeof(FreezeFrameRecType));
\r
801 memcpy(&freezeFrameBuf[j],&temp,sizeof(FreezeFrameRecType));
\r
809 * Procedure: retrieveEventStatusBit
\r
810 * Description: retrieve Event Status Bit
\r
812 static boolean retrieveEventStatusBit(FreezeFrameRecType *freezeFrameBuf,
\r
814 Dem_EventStatusExtendedType nBit,
\r
815 FreezeFrameRecType **freezeFrame)
\r
817 boolean freezeFrameFound = FALSE;
\r
821 for(i=0;i<length;i++){
\r
822 for(j=0; (j < DEM_MAX_NUMBER_EVENT) && (!freezeFrameFound); j++){
\r
823 freezeFrameFound = (eventStatusBuffer[j].eventId == freezeFrameBuf[i].eventId)\
\r
824 && (!(eventStatusBuffer[j].eventStatusExtended & nBit));
\r
825 if(freezeFrameFound == TRUE){
\r
826 *freezeFrame = &freezeFrameBuf[i];
\r
831 return freezeFrameFound;
\r
836 * Procedure: lookupFreezeFrameForDisplacementPreInit
\r
837 * Description: implement displacement strategy preinit:1.find out the oldest "not confirmed" DTC
\r
838 * 2.find out the oldest inactive DTC,inactive:testFailed is not set
\r
839 * 3.find ou the oldest active DTC,active:testFailed is set
\r
841 static boolean lookupFreezeFrameForDisplacementPreInit(FreezeFrameRecType **freezeFrame)
\r
843 boolean freezeFrameFound = FALSE;
\r
845 /* Bubble sort:rearrange priMemFreezeFrameBuffer from little to big */
\r
846 bubbleSort(preInitFreezeFrameBuffer, DEM_MAX_NUMBER_FF_DATA_PRE_INIT);
\r
848 /* find out the oldest not confirmed dtc */
\r
849 freezeFrameFound = retrieveEventStatusBit(preInitFreezeFrameBuffer, DEM_MAX_NUMBER_FF_DATA_PRE_INIT, DEM_CONFIRMED_DTC, freezeFrame);
\r
851 /* if all confirmed,lookup the oldest inactive dtc */
\r
852 if(freezeFrameFound == FALSE){
\r
853 freezeFrameFound = retrieveEventStatusBit(preInitFreezeFrameBuffer, DEM_MAX_NUMBER_FF_DATA_PRE_INIT, DEM_TEST_FAILED, freezeFrame);
\r
856 /* if all confirmed,lookup the oldest active dtc */
\r
857 if(freezeFrameFound == FALSE){
\r
858 *freezeFrame = &preInitFreezeFrameBuffer[0];
\r
859 freezeFrameFound = TRUE;
\r
862 return freezeFrameFound;
\r
866 * Procedure: lookupFreezeFrameForDisplacement
\r
867 * Description: implement displacement strategy:1.find out the oldest "not confirmed" DTC
\r
868 * 2.find out the oldest inactive DTC,inactive:testFailed is not set
\r
869 * 3.find ou the oldest active DTC,active:testFailed is set
\r
871 static boolean lookupFreezeFrameForDisplacement(FreezeFrameRecType **freezeFrame)
\r
873 boolean freezeFrameFound = FALSE;
\r
875 bubbleSort(priMemFreezeFrameBuffer, DEM_MAX_NUMBER_FF_DATA_PRI_MEM);
\r
877 /* Find out the oldest not confirmed dtc */
\r
878 freezeFrameFound = retrieveEventStatusBit(priMemFreezeFrameBuffer, DEM_MAX_NUMBER_FF_DATA_PRI_MEM, DEM_CONFIRMED_DTC, freezeFrame);
\r
880 /* If all confirmed, lookup the oldest inactive dtc */
\r
881 if(freezeFrameFound == FALSE){
\r
882 freezeFrameFound = retrieveEventStatusBit(priMemFreezeFrameBuffer, DEM_MAX_NUMBER_FF_DATA_PRI_MEM, DEM_TEST_FAILED, freezeFrame);
\r
885 /* If all confirmed,lookup the oldest active dtc */
\r
886 if(freezeFrameFound == FALSE){
\r
887 *freezeFrame = &priMemFreezeFrameBuffer[0];
\r
888 freezeFrameFound = TRUE;
\r
891 return freezeFrameFound;
\r
894 * Procedure: rearrangeFreezeFrameTimeStamp
\r
895 * Description: rearrange FF timestamp when timestamp is beyond DEM_MAX_TIMESTAMP_FOR_REARRANGEMENT
\r
897 static void rearrangeFreezeFrameTimeStamp(uint32 *timeStamp)
\r
899 FreezeFrameRecType temp;
\r
904 /* Bubble sort:rearrange priMemFreezeFrameBuffer from little to big */
\r
905 for(i=0;i<DEM_MAX_NUMBER_FF_DATA_PRI_MEM;i++){
\r
906 if(priMemFreezeFrameBuffer[i].eventId != DEM_EVENT_ID_NULL){
\r
907 for(j=DEM_MAX_NUMBER_FF_DATA_PRI_MEM-1; j > i; j--){
\r
908 if(priMemFreezeFrameBuffer[j].eventId != DEM_EVENT_ID_NULL){
\r
909 if(priMemFreezeFrameBuffer[i].timeStamp > priMemFreezeFrameBuffer[j].timeStamp){
\r
910 //exchange buffer data
\r
911 memcpy(&temp,&priMemFreezeFrameBuffer[i],sizeof(FreezeFrameRecType));
\r
912 memcpy(&priMemFreezeFrameBuffer[i],&priMemFreezeFrameBuffer[j],sizeof(FreezeFrameRecType));
\r
913 memcpy(&priMemFreezeFrameBuffer[j],&temp,sizeof(FreezeFrameRecType));
\r
919 priMemFreezeFrameBuffer[i].timeStamp = k++;
\r
923 /* update the current timeStamp */
\r
928 * Procedure: getFreezeFrameData
\r
929 * Description: get FF data according configuration
\r
931 static void getFreezeFrameData(const Dem_EventParameterType *eventParam,
\r
932 FreezeFrameRecType *freezeFrame,
\r
933 Dem_EventStatusType eventStatus,
\r
934 EventStatusRecType *eventStatusRec)
\r
936 Dem_FreezeFrameStorageConditonType prefailedOrFailed;
\r
937 Std_ReturnType callbackReturnCode;
\r
939 uint16 storeIndex = 0;
\r
940 uint16 recordSize = 0;
\r
942 const Dem_FreezeFrameClassType *FreezeFrameLocal = NULL;
\r
943 Dcm_NegativeResponseCodeType errorCode;//should include Dcm_Lcfg.h
\r
945 /* clear FF data record */
\r
946 memset(freezeFrame, 0, sizeof(FreezeFrameRecType ));
\r
948 /* check if prefailed or failed */
\r
949 if(eventStatusRec->eventStatusExtended & DEM_TEST_FAILED){
\r
950 prefailedOrFailed = FAILED;//confirm the FF is stored for failed
\r
954 if(eventStatus == DEM_EVENT_STATUS_PREFAILED){
\r
955 prefailedOrFailed = PREFAILED;//confirm the FF is stored for prefailed
\r
958 prefailedOrFailed = FF_STORAGE_CONDITION_WRONG;
\r
959 freezeFrame->eventId = DEM_EVENT_ID_NULL;
\r
964 /* Find out the corresponding FF class */
\r
965 if( eventParam->FreezeFrameClassRef != NULL ) {
\r
966 for(i = 0;(i<DEM_MAX_NR_OF_CLASSES_IN_FREEZEFRAME_DATA) && (eventParam->FreezeFrameClassRef[i] != NULL);i++){
\r
967 if(eventParam->FreezeFrameClassRef[i]->FFStorageCondition == prefailedOrFailed){
\r
968 FreezeFrameLocal = eventParam->FreezeFrameClassRef[i];
\r
975 if(FreezeFrameLocal != NULL){
\r
976 if(FreezeFrameLocal->FFIdClassRef != NULL){
\r
977 for (i = 0; (i < DEM_MAX_NR_OF_RECORDS_IN_FREEZEFRAME_DATA) && (!(FreezeFrameLocal->FFIdClassRef[i]->Arc_EOL)); i++) {
\r
978 if(FreezeFrameLocal->FFIdClassRef[i]->PidOrDidUsePort == FALSE){
\r
979 if(FreezeFrameLocal->FFIdClassRef[i]->DidReadDataLengthFnc != NULL){
\r
980 callbackReturnCode = FreezeFrameLocal->FFIdClassRef[i]->DidReadDataLengthFnc(&recordSize);
\r
981 if(callbackReturnCode != E_OK){
\r
982 //if fail to read data length,discard the storage of FF
\r
983 freezeFrame->eventId = DEM_EVENT_ID_NULL;
\r
984 DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_GET_FREEZEFRAME_ID, DEM_READ_DATA_LENGTH_FAILED);
\r
988 /* if no readDidDataLengthFunction, then try the PidOrDidSize. */
\r
990 recordSize = FreezeFrameLocal->FFIdClassRef[i]->PidOrDidSize;
\r
992 /* read out the did data */
\r
993 if ((storeIndex + recordSize + DEM_DID_IDENTIFIER_SIZE_OF_BYTES) <= DEM_MAX_SIZE_FF_DATA) {
\r
995 freezeFrame->data[storeIndex] = (FreezeFrameLocal->FFIdClassRef[i]->DidIdentifier>> 8) & 0xFFu;
\r
997 freezeFrame->data[storeIndex] = FreezeFrameLocal->FFIdClassRef[i]->DidIdentifier & 0xFFu;
\r
1000 if(FreezeFrameLocal->FFIdClassRef[i]->DidConditionCheckReadFnc != NULL){
\r
1001 callbackReturnCode = FreezeFrameLocal->FFIdClassRef[i]->DidConditionCheckReadFnc(&errorCode);
\r
1002 if ((callbackReturnCode == E_OK) && (errorCode == DCM_E_POSITIVERESPONSE)) {
\r
1003 if(FreezeFrameLocal->FFIdClassRef[i]->DidReadFnc!= NULL){
\r
1004 callbackReturnCode = FreezeFrameLocal->FFIdClassRef[i]->DidReadFnc(&freezeFrame->data[storeIndex]);
\r
1005 if (callbackReturnCode != E_OK) {
\r
1006 memset(&freezeFrame->data[storeIndex], DEM_FREEZEFRAME_DEFAULT_VALUE, recordSize);
\r
1008 storeIndex += recordSize;
\r
1012 memset(&freezeFrame->data[storeIndex], DEM_FREEZEFRAME_DEFAULT_VALUE, recordSize);
\r
1013 storeIndex += recordSize;
\r
1018 memset(&freezeFrame->data[storeIndex], DEM_FREEZEFRAME_DEFAULT_VALUE, recordSize);
\r
1019 storeIndex += recordSize;
\r
1023 memset(&freezeFrame->data[storeIndex], DEM_FREEZEFRAME_DEFAULT_VALUE, recordSize);
\r
1024 storeIndex += recordSize;
\r
1029 DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_GET_FREEZEFRAME_ID, DEM_E_FF_TOO_BIG);
\r
1034 //TODO:RTE should provide the port
\r
1035 DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_GET_FREEZEFRAME_ID, DEM_DSP_DID_USE_PORT_IS_TRUE);
\r
1042 /* create an empty FF */
\r
1043 freezeFrame->eventId = DEM_EVENT_ID_NULL;
\r
1046 /* Check if any data has been stored */
\r
1047 if (storeIndex != 0) {
\r
1048 freezeFrame->eventId = eventParam->EventID;
\r
1049 freezeFrame->occurrence = eventStatusRec->occurrence;
\r
1050 freezeFrame->dataSize = storeIndex;
\r
1051 freezeFrame->recordNumber = FreezeFrameLocal->FFRecordNumber;
\r
1054 if(FF_TimeStamp > DEM_MAX_TIMESTAMP_FOR_REARRANGEMENT){
\r
1055 rearrangeFreezeFrameTimeStamp(&FF_TimeStamp);
\r
1058 freezeFrame->timeStamp = FF_TimeStamp;
\r
1062 Irq_Restore(state);
\r
1064 freezeFrame->checksum = calcChecksum(freezeFrame, sizeof(FreezeFrameRecType)-sizeof(ChecksumType));
\r
1067 freezeFrame->eventId = DEM_EVENT_ID_NULL;
\r
1068 freezeFrame->dataSize = storeIndex;
\r
1069 freezeFrame->checksum = 0;
\r
1075 * Procedure: storeFreezeFrameDataPreInit
\r
1076 * Description: store FF in before preInitFreezeFrameBuffer DEM's full initialization
\r
1078 static void storeFreezeFrameDataPreInit(const Dem_EventParameterType *eventParam, const FreezeFrameRecType *freezeFrame)
\r
1080 boolean eventIdFound = FALSE;
\r
1081 boolean eventIdFreePositionFound=FALSE;
\r
1082 FreezeFrameRecType *freezeFrameLocal = NULL;
\r
1088 /* Check if already stored */
\r
1089 for (i = 0; (i<DEM_MAX_NUMBER_FF_DATA_PRE_INIT) && (!eventIdFound); i++){
\r
1090 eventIdFound = ((preInitFreezeFrameBuffer[i].eventId == eventParam->EventID) && (preInitFreezeFrameBuffer[i].recordNumber== freezeFrame->recordNumber));
\r
1094 /* overwrite existing */
\r
1095 memcpy(&preInitFreezeFrameBuffer[i-1], freezeFrame, sizeof(FreezeFrameRecType));
\r
1098 /* lookup first free position */
\r
1099 for (i = 0; (i<DEM_MAX_NUMBER_FF_DATA_PRE_INIT) && (!eventIdFreePositionFound); i++){
\r
1100 if(preInitFreezeFrameBuffer[i].eventId == DEM_EVENT_ID_NULL){
\r
1101 eventIdFreePositionFound=TRUE;
\r
1105 if (eventIdFreePositionFound) {
\r
1106 memcpy(&preInitFreezeFrameBuffer[i-1], freezeFrame, sizeof(FreezeFrameRecType));
\r
1109 /* do displacement */
\r
1110 if(lookupFreezeFrameForDisplacementPreInit(&freezeFrameLocal)){
\r
1111 memcpy(freezeFrameLocal, freezeFrame, sizeof(FreezeFrameRecType));
\r
1114 DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_STORE_FF_DATA_PRE_INIT_ID, DEM_E_PRE_INIT_FF_DATA_BUFF_FULL);
\r
1119 Irq_Restore(state);
\r
1124 * Procedure: updateFreezeFrameOccurrencePreInit
\r
1125 * Description: update the occurrence in preInitFreezeFrameBuffer according to the occurrence stored in priMemEventBuffer
\r
1127 static void updateFreezeFrameOccurrencePreInit(const EventRecType *EventBuffer)
\r
1131 for (i = 0; i<DEM_MAX_NUMBER_FF_DATA_PRE_INIT; i++){
\r
1132 if(preInitFreezeFrameBuffer[i].eventId == EventBuffer->eventId){
\r
1133 preInitFreezeFrameBuffer[i].occurrence += EventBuffer->occurrence;
\r
1139 * Procedure: initCurrentFreezeFrameTimeStamp
\r
1140 * Description: initialize current timestamp and update the corresponding timestamp in preInitFreezeFrameBuffer
\r
1142 static void initCurrentFreezeFrameTimeStamp(uint32 *timeStampPtr)
\r
1150 /* Find out the biggest timestamp in the last power on */
\r
1151 for (i = 0; i<DEM_MAX_NUMBER_FF_DATA_PRI_MEM; i++){
\r
1152 if((priMemFreezeFrameBuffer[i].eventId != DEM_EVENT_ID_NULL) &&
\r
1153 (priMemFreezeFrameBuffer[i].timeStamp > temp)){
\r
1154 temp = priMemFreezeFrameBuffer[i].timeStamp;
\r
1158 for (i = 0; i<DEM_MAX_NUMBER_FF_DATA_PRE_INIT; i++){
\r
1159 if(preInitFreezeFrameBuffer[i].eventId != DEM_EVENT_ID_NULL){
\r
1160 preInitFreezeFrameBuffer[i].timeStamp += temp;
\r
1163 *timeStampPtr += temp;
\r
1164 Irq_Restore(state);
\r
1168 * Procedure: getExtendedData
\r
1169 * Description: Collects the extended data according to "eventParam" and return it in "extData",
\r
1170 * if not found eventId is set to DEM_EVENT_ID_NULL.
\r
1172 static void storeExtendedData(const Dem_EventParameterType *eventParam, boolean firstFail)
\r
1174 Std_ReturnType callbackReturnCode;
\r
1176 uint16 storeIndex = 0;
\r
1177 uint16 recordSize;
\r
1178 const Dem_ExtendedDataRecordClassType *extendedDataRecord;
\r
1179 ExtDataRecType *extData;
\r
1180 boolean eventIdFound = FALSE;
\r
1181 boolean bStorePrimaryMem = FALSE;
\r
1182 boolean bStoredData = FALSE;
\r
1183 ExtDataRecType *extDataMem;
\r
1185 if( DEM_PREINITIALIZED == demState ) {
\r
1186 extDataMem = preInitExtDataBuffer;
\r
1188 extDataMem = priMemExtDataBuffer;
\r
1191 for (i = 0; (i < DEM_MAX_NR_OF_EVENT_DESTINATION) && (eventParam->EventClass->EventDestination[i] != DEM_EVENT_DESTINATION_END_OF_LIST); i++) {
\r
1192 if (eventParam->EventClass->EventDestination[i] == DEM_DTC_ORIGIN_PRIMARY_MEMORY) {
\r
1193 bStorePrimaryMem = TRUE;
\r
1197 if( TRUE == bStorePrimaryMem ) {
\r
1199 // Check if already stored
\r
1200 for (i = 0; (i<DEM_MAX_NUMBER_EXT_DATA_PRI_MEM) && (!eventIdFound); i++){
\r
1201 eventIdFound = (extDataMem[i].eventId == eventParam->EventID);
\r
1202 extData = &extDataMem[i];
\r
1204 if( FALSE == eventIdFound ) {
\r
1206 for (i = 0; (i < DEM_MAX_NUMBER_EXT_DATA_PRI_MEM); i++){
\r
1207 if( extDataMem[i].eventId == DEM_EVENT_ID_NULL ) {
\r
1208 extData = &extDataMem[i];
\r
1212 if( NULL == extData ) {
\r
1213 // Error: Pri mem extended data buffer full
\r
1214 DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_STORE_EXT_DATA_PRI_MEM_ID, DEM_E_PRI_MEM_EXT_DATA_BUFF_FULL);
\r
1219 // Check if any pointer to extended data class
\r
1220 if (eventParam->ExtendedDataClassRef != NULL) {
\r
1221 // Request extended data and copy it to the buffer
\r
1222 for (i = 0; (i < DEM_MAX_NR_OF_RECORDS_IN_EXTENDED_DATA) && (eventParam->ExtendedDataClassRef->ExtendedDataRecordClassRef[i] != NULL); i++) {
\r
1223 extendedDataRecord = eventParam->ExtendedDataClassRef->ExtendedDataRecordClassRef[i];
\r
1224 if( DEM_UPDATE_RECORD_VOLATILE != extendedDataRecord->UpdateRule )
\r
1226 recordSize = extendedDataRecord->DataSize;
\r
1227 if ((storeIndex + recordSize) <= DEM_MAX_SIZE_EXT_DATA) {
\r
1228 if( DEM_UPDATE_RECORD_YES == extendedDataRecord->UpdateRule ||
\r
1229 (DEM_UPDATE_RECORD_NO == extendedDataRecord->UpdateRule && TRUE == firstFail) )
\r
1231 if( NULL != extendedDataRecord->CallbackGetExtDataRecord ) {
\r
1233 callbackReturnCode = extendedDataRecord->CallbackGetExtDataRecord(&extData->data[storeIndex]); /** @req DEM282 */
\r
1234 if (callbackReturnCode != E_OK) {
\r
1235 // Callback data currently not available, clear space.
\r
1236 memset(&extData->data[storeIndex], 0xFF, recordSize);
\r
1238 bStoredData = TRUE;
\r
1239 } else if( DEM_NO_ELEMENT != extendedDataRecord->InternalDataElement ) {
\r
1240 getInternalElement( eventParam, extendedDataRecord->InternalDataElement, &extData->data[storeIndex] );
\r
1241 bStoredData = TRUE;
\r
1244 storeIndex += recordSize;
\r
1247 // Error: Size of extended data record is bigger than reserved space.
\r
1248 DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_GET_EXTENDED_DATA_ID, DEM_E_EXT_DATA_TOO_BIG);
\r
1249 break; // Break the loop
\r
1255 // Check if any data has been stored
\r
1256 if (TRUE == bStoredData) {
\r
1257 extData->eventId = eventParam->EventID;
\r
1258 extData->checksum = calcChecksum(extData, sizeof(ExtDataRecType)-sizeof(ChecksumType));
\r
1264 * Procedure: storeEventPriMem
\r
1265 * Description: Store the event data of "eventStatus->eventId" in "priMemEventBuffer",
\r
1266 * if non existent a new entry is created.
\r
1268 static void storeEventPriMem(const Dem_EventParameterType *eventParam, const EventStatusRecType *eventStatus)
\r
1270 boolean eventIdFound = FALSE;
\r
1271 boolean eventIdFreePositionFound=FALSE;
\r
1276 (void)*eventParam; // Currently not used, do this to avoid warning
\r
1278 // Lookup event ID
\r
1279 for (i = 0; (i < DEM_MAX_NUMBER_EVENT_ENTRY_PRI) && (!eventIdFound); i++){
\r
1280 eventIdFound = (priMemEventBuffer[i].eventId == eventStatus->eventId);
\r
1283 if (eventIdFound) {
\r
1284 // Update event found
\r
1285 priMemEventBuffer[i-1].occurrence = eventStatus->occurrence;
\r
1286 priMemEventBuffer[i-1].eventStatusExtended = eventStatus->eventStatusExtended;
\r
1287 priMemEventBuffer[i-1].checksum = calcChecksum(&priMemEventBuffer[i-1], sizeof(EventRecType)-sizeof(ChecksumType));
\r
1290 // Search for free position
\r
1291 for (i=0; (i < DEM_MAX_NUMBER_EVENT_ENTRY_PRI) && (!eventIdFreePositionFound); i++){
\r
1292 eventIdFreePositionFound = (priMemEventBuffer[i].eventId == DEM_EVENT_ID_NULL);
\r
1296 if (eventIdFreePositionFound) {
\r
1297 priMemEventBuffer[i-1].eventId = eventStatus->eventId;
\r
1298 priMemEventBuffer[i-1].occurrence = eventStatus->occurrence;
\r
1299 priMemEventBuffer[i-1].eventStatusExtended = eventStatus->eventStatusExtended;
\r
1300 priMemEventBuffer[i-1].checksum = calcChecksum(&priMemEventBuffer[i-1], sizeof(EventRecType)-sizeof(ChecksumType));
\r
1303 // Error: Pri mem event buffer full
\r
1304 DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_STORE_EVENT_PRI_MEM_ID, DEM_E_PRI_MEM_EVENT_BUFF_FULL);
\r
1308 Irq_Restore(state);
\r
1312 * Procedure: deleteEventPriMem
\r
1313 * Description: Delete the event data of "eventParam->eventId" from "priMemEventBuffer".
\r
1315 static void deleteEventPriMem(const Dem_EventParameterType *eventParam)
\r
1317 boolean eventIdFound = FALSE;
\r
1322 for (i = 0; (i < DEM_MAX_NUMBER_EVENT_ENTRY_PRI) && (!eventIdFound); i++){
\r
1323 eventIdFound = (priMemEventBuffer[i].eventId == eventParam->EventID);
\r
1326 if (eventIdFound) {
\r
1327 memset(&priMemEventBuffer[i-1], 0, sizeof(EventRecType));
\r
1330 Irq_Restore(state);
\r
1334 * Procedure: storeEventEvtMem
\r
1335 * Description: Store the event data of "eventStatus->eventId" in event memory according to
\r
1336 * "eventParam" destination option.
\r
1338 static void storeEventEvtMem(const Dem_EventParameterType *eventParam, const EventStatusRecType *eventStatus)
\r
1342 for (i = 0; (i < DEM_MAX_NR_OF_EVENT_DESTINATION)
\r
1343 && (eventParam->EventClass->EventDestination[i] != DEM_EVENT_DESTINATION_END_OF_LIST); i++) {
\r
1344 switch (eventParam->EventClass->EventDestination[i])
\r
1346 case DEM_DTC_ORIGIN_PRIMARY_MEMORY:
\r
1347 storeEventPriMem(eventParam, eventStatus); /** @req DEM010 */
\r
1350 case DEM_DTC_ORIGIN_SECONDARY_MEMORY:
\r
1351 case DEM_DTC_ORIGIN_PERMANENT_MEMORY:
\r
1352 case DEM_DTC_ORIGIN_MIRROR_MEMORY:
\r
1353 // Not yet supported
\r
1354 DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_GLOBAL_ID, DEM_E_NOT_IMPLEMENTED_YET);
\r
1364 * Procedure: getExtendedDataPriMem
\r
1365 * Description: Get record from buffer if it exists, or pick next free if it doesn't
\r
1367 static void getExtendedDataPriMem(const Dem_EventParameterType *eventParam, ExtDataRecType ** const extendedData) /** @req DEM041 */
\r
1369 boolean eventIdFound = FALSE;
\r
1370 boolean eventIdFreePositionFound=FALSE;
\r
1373 // Check if already stored
\r
1374 for (i = 0; (i<DEM_MAX_NUMBER_EXT_DATA_PRI_MEM) && (!eventIdFound); i++){
\r
1375 if( priMemExtDataBuffer[i].eventId == eventParam->EventID ) {
\r
1376 *extendedData = &priMemExtDataBuffer[i];
\r
1377 eventIdFound = TRUE;
\r
1381 if (!eventIdFound) {
\r
1382 // No, lookup first free position
\r
1383 for (i = 0; (i < DEM_MAX_NUMBER_EXT_DATA_PRI_MEM) && (!eventIdFreePositionFound); i++){
\r
1384 eventIdFreePositionFound = (priMemExtDataBuffer[i].eventId == DEM_EVENT_ID_NULL);
\r
1386 if (eventIdFreePositionFound) {
\r
1387 *extendedData = &priMemExtDataBuffer[i-1];
\r
1390 // Error: Pri mem extended data buffer full
\r
1391 DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_STORE_EXT_DATA_PRI_MEM_ID, DEM_E_PRI_MEM_EXT_DATA_BUFF_FULL);
\r
1397 * Procedure: deleteExtendedDataPriMem
\r
1398 * Description: Delete the extended data of "eventParam->eventId" from "priMemExtDataBuffer".
\r
1400 static void deleteExtendedDataPriMem(const Dem_EventParameterType *eventParam)
\r
1402 boolean eventIdFound = FALSE;
\r
1407 // Check if already stored
\r
1408 for (i = 0;(i<DEM_MAX_NUMBER_EXT_DATA_PRI_MEM) && (!eventIdFound); i++){
\r
1409 eventIdFound = (priMemExtDataBuffer[i].eventId == eventParam->EventID);
\r
1412 if (eventIdFound) {
\r
1413 // Yes, clear record
\r
1414 memset(&priMemExtDataBuffer[i-1], 0, sizeof(ExtDataRecType));
\r
1417 Irq_Restore(state);
\r
1421 * Procedure: storeExtendedDataEvtMem
\r
1422 * Description: Store the extended data in event memory according to
\r
1423 * "eventParam" destination option
\r
1425 static void mergeExtendedDataEvtMem(const Dem_EventParameterType *eventParam, const ExtDataRecType *extendedData)
\r
1429 EventRecType *priMemEventRec = NULL;
\r
1430 const Dem_ExtendedDataRecordClassType *extendedDataRecordClass;
\r
1431 ExtDataRecType *priMemExtDataRec = NULL;
\r
1432 uint16 storeIndex = 0;
\r
1433 boolean bCopiedData = FALSE;
\r
1434 boolean bStorePrimarMem = FALSE;
\r
1436 for (i = 0; (i < DEM_MAX_NR_OF_EVENT_DESTINATION) && (eventParam->EventClass->EventDestination[i] != DEM_EVENT_DESTINATION_END_OF_LIST); i++) {
\r
1437 if (eventParam->EventClass->EventDestination[i] == DEM_DTC_ORIGIN_PRIMARY_MEMORY ) {
\r
1438 bStorePrimarMem = TRUE;
\r
1442 if( bStorePrimarMem ) {
\r
1443 /* Management is only relevant for events stored in primary mem (i.e. nvram) */
\r
1445 getExtendedDataPriMem(eventParam, &priMemExtDataRec);
\r
1447 if( NULL != priMemExtDataRec ) {
\r
1448 /* We found an old record or could allocate a new slot */
\r
1450 for( i = 0; i < DEM_MAX_NUMBER_EVENT_PRI_MEM; i++ ) {
\r
1451 if( priMemEventBuffer[i].eventId == eventParam->EventID ) {
\r
1452 priMemEventRec = &priMemEventBuffer[i];
\r
1456 /* Only copy extended data related to event set during pre-init */
\r
1458 for(i = 0; (i < DEM_MAX_NR_OF_RECORDS_IN_EXTENDED_DATA) && (eventParam->ExtendedDataClassRef->ExtendedDataRecordClassRef[i] != NULL); i++) {
\r
1459 extendedDataRecordClass = eventParam->ExtendedDataClassRef->ExtendedDataRecordClassRef[i];
\r
1460 if( DEM_UPDATE_RECORD_VOLATILE != extendedDataRecordClass->UpdateRule ) {
\r
1461 if( DEM_UPDATE_RECORD_YES == extendedDataRecordClass->UpdateRule ) {
\r
1462 /* Copy records that failed during pre init */
\r
1463 memcpy(&priMemExtDataRec->data[storeIndex], &extendedData->data[storeIndex],extendedDataRecordClass->DataSize);
\r
1464 bCopiedData = TRUE;
\r
1466 else if( DEM_UPDATE_RECORD_NO == extendedDataRecordClass->UpdateRule ) {
\r
1467 if( (NULL == priMemEventRec) || !(priMemEventRec->eventStatusExtended && DEM_TEST_FAILED_SINCE_LAST_CLEAR) ) {
\r
1468 /* Copy only records that was not already failed */
\r
1469 memcpy(&priMemExtDataRec->data[storeIndex], &extendedData->data[storeIndex],extendedDataRecordClass->DataSize);
\r
1470 bCopiedData = TRUE;
\r
1476 storeIndex += extendedDataRecordClass->DataSize;
\r
1479 if( TRUE == bCopiedData ) {
\r
1480 priMemExtDataRec->eventId = extendedData->eventId;
\r
1481 priMemExtDataRec->checksum = extendedData->checksum;
\r
1483 Irq_Restore(state);
\r
1493 * Procedure: lookupExtendedDataRecNumParam
\r
1494 * Description: Returns TRUE if the requested extended data number was found among the configured records for the event.
\r
1495 * "extDataRecClassPtr" returns a pointer to the record class, "posInExtData" returns the position in stored extended data.
\r
1497 static boolean lookupExtendedDataRecNumParam(uint8 extendedDataNumber, const Dem_EventParameterType *eventParam, Dem_ExtendedDataRecordClassType const **extDataRecClassPtr, uint16 *posInExtData)
\r
1499 boolean recNumFound = FALSE;
\r
1501 if (eventParam->ExtendedDataClassRef != NULL) {
\r
1502 uint16 byteCnt = 0;
\r
1505 // Request extended data and copy it to the buffer
\r
1506 for (i = 0; (i < DEM_MAX_NR_OF_RECORDS_IN_EXTENDED_DATA) && (eventParam->ExtendedDataClassRef->ExtendedDataRecordClassRef[i] != NULL) && (!recNumFound); i++) {
\r
1507 if (eventParam->ExtendedDataClassRef->ExtendedDataRecordClassRef[i]->RecordNumber == extendedDataNumber) {
\r
1508 *extDataRecClassPtr = eventParam->ExtendedDataClassRef->ExtendedDataRecordClassRef[i];
\r
1509 *posInExtData = byteCnt;
\r
1510 recNumFound = TRUE;
\r
1512 if(DEM_UPDATE_RECORD_VOLATILE != eventParam->ExtendedDataClassRef->ExtendedDataRecordClassRef[i]->UpdateRule) {
\r
1513 byteCnt += eventParam->ExtendedDataClassRef->ExtendedDataRecordClassRef[i]->DataSize;
\r
1518 return recNumFound;
\r
1523 * Procedure: lookupExtendedDataPriMem
\r
1524 * Description: Returns TRUE if the requested event id is found, "extData" points to the found data.
\r
1526 static boolean lookupExtendedDataPriMem(Dem_EventIdType eventId, ExtDataRecType **extData)
\r
1528 boolean eventIdFound = FALSE;
\r
1531 // Lookup corresponding extended data
\r
1532 for (i = 0; (i < DEM_MAX_NUMBER_EXT_DATA_PRI_MEM) && (!eventIdFound); i++) {
\r
1533 eventIdFound = (priMemExtDataBuffer[i].eventId == eventId);
\r
1536 if (eventIdFound) {
\r
1537 // Yes, return pointer
\r
1538 *extData = &priMemExtDataBuffer[i-1];
\r
1541 return eventIdFound;
\r
1544 * Procedure: copyNvmMirror
\r
1545 * Description: Copies Nvram to buffer
\r
1548 Std_ReturnType copyNvmMirror(const NvM_BlockIdType BlockId, uint8 *dstPtr, const uint8 *srcPtr, uint8 len)
\r
1551 #if (DEM_USE_NVM == STD_ON && DEM_UNIT_TEST == STD_OFF)
\r
1552 Std_ReturnType blockReadStatus = E_NOT_OK;
\r
1553 NvM_RequestResultType requestResult;
\r
1555 if( BlockId != 0 ) {
\r
1556 NvM_GetErrorStatus(BlockId, &requestResult);
\r
1557 if(requestResult != NVM_REQ_PENDING ) {
\r
1558 memcpy(dstPtr, srcPtr, len);
\r
1559 blockReadStatus = E_OK;
\r
1563 return blockReadStatus;
\r
1569 * Procedure: writeNvmMirror
\r
1570 * Description: store data in NVRam
\r
1572 Std_ReturnType writeNvmMirror(const NvM_BlockIdType BlockId, uint8 *dstPtr, const uint8 *srcPtr, uint8 len)
\r
1574 #if (DEM_USE_NVM == STD_ON && DEM_UNIT_TEST == STD_OFF)
\r
1575 Std_ReturnType blockWriteStatus = E_NOT_OK;
\r
1576 NvM_RequestResultType requestResult;
\r
1578 if( BlockId != 0 ) {
\r
1579 NvM_GetErrorStatus(BlockId, &requestResult);
\r
1580 if(requestResult != NVM_REQ_PENDING ) {
\r
1581 memcpy(dstPtr, srcPtr, len);
\r
1582 (void)NvM_WriteBlock(BlockId, (const uint8*)dstPtr);
\r
1583 blockWriteStatus = E_OK;
\r
1587 return blockWriteStatus;
\r
1594 * Procedure: storeAgingRecPerMem
\r
1595 * Description: store aging records in NVRam
\r
1597 static void storeAgingRecPerMem(const NvM_BlockIdType AgingBlockId)
\r
1603 if( E_OK == writeNvmMirror(AgingBlockId, (uint8 *)HealingMirrorBuffer, (const uint8 *)priMemAgingBuffer, sizeof(priMemAgingBuffer)) ){
\r
1604 AgingIsModified = FALSE;
\r
1606 AgingIsModified = TRUE;
\r
1609 Irq_Restore(state);
\r
1612 * Procedure: deleteAgingRecPriMem
\r
1613 * Description: delete aging record in primary memory
\r
1615 static void deleteAgingRecPriMem(const Dem_EventParameterType *eventParam)
\r
1622 for (i = 0; i<DEM_MAX_NUMBER_FF_DATA_PRI_MEM; i++){
\r
1623 if (priMemAgingBuffer[i].eventId == eventParam->EventID){
\r
1624 memset(&priMemAgingBuffer[i], 0, sizeof(HealingRecType));
\r
1628 Irq_Restore(state);
\r
1632 * Procedure: storeFreezeFrameDataPriMem
\r
1633 * Description: store FreezeFrame data record in primary memory
\r
1635 static void storeFreezeFrameDataPriMem(const Dem_EventParameterType *eventParam, const FreezeFrameRecType *freezeFrame)
\r
1637 boolean eventIdFound = FALSE;
\r
1638 boolean eventIdFreePositionFound=FALSE;
\r
1639 boolean displacementPositionFound=FALSE;
\r
1640 FreezeFrameRecType *freezeFrameLocal;
\r
1646 /* Check if already stored */
\r
1647 for (i = 0; (i<DEM_MAX_NUMBER_FF_DATA_PRI_MEM) && (!eventIdFound); i++){
\r
1648 eventIdFound = ((priMemFreezeFrameBuffer[i].eventId == eventParam->EventID) && (priMemFreezeFrameBuffer[i].recordNumber == freezeFrame->recordNumber));
\r
1651 if (eventIdFound) {
\r
1652 memcpy(&priMemFreezeFrameBuffer[i-1], freezeFrame, sizeof(FreezeFrameRecType));
\r
1655 for (i = 0; (i < DEM_MAX_NUMBER_FF_DATA_PRI_MEM) && (!eventIdFreePositionFound); i++){
\r
1656 eventIdFreePositionFound = (priMemFreezeFrameBuffer[i].eventId == DEM_EVENT_ID_NULL);
\r
1658 if (eventIdFreePositionFound) {
\r
1659 memcpy(&priMemFreezeFrameBuffer[i-1], freezeFrame, sizeof(FreezeFrameRecType));
\r
1662 displacementPositionFound = lookupFreezeFrameForDisplacement(&freezeFrameLocal);
\r
1663 if(displacementPositionFound){
\r
1664 memcpy(freezeFrameLocal, freezeFrame, sizeof(FreezeFrameRecType));
\r
1667 DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_STORE_FF_DATA_PRI_MEM_ID, DEM_E_PRI_MEM_FF_DATA_BUFF_FULL);
\r
1672 Irq_Restore(state);
\r
1675 * Procedure: storeFreezeFrameDataPerMem
\r
1676 * Description: Store the freeze frame data in NVRam
\r
1679 static void storeFreezeFrameDataPerMem()
\r
1685 for(uint16 i = 0; i < DEM_MAX_NUMBER_FF_DATA_PRI_MEM; i++){
\r
1686 if(memcmp(&priMemFreezeFrameBuffer[i], FreezeFrameMirrorBuffer[i], sizeof(FreezeFrameRecType))){
\r
1687 if( E_OK == writeNvmMirror(FreezeFrameBlockId[i], (uint8 *)FreezeFrameMirrorBuffer[i], (const uint8 *)&priMemFreezeFrameBuffer[i], sizeof(FreezeFrameRecType)) ) {
\r
1688 FFIsModified = FALSE;
\r
1692 FFIsModified = TRUE;
\r
1697 Irq_Restore(state);
\r
1700 // PC-Lint (715 etc): Remove errors until function is filled.
\r
1701 //lint -e{715} Symbol not referenced
\r
1702 static void deleteFreezeFrameDataPriMem(const Dem_EventParameterType *eventParam)
\r
1709 for (i = 0; i<DEM_MAX_NUMBER_FF_DATA_PRI_MEM; i++){
\r
1710 if (priMemFreezeFrameBuffer[i].eventId == eventParam->EventID){
\r
1711 memset(&priMemFreezeFrameBuffer[i], 0, sizeof(FreezeFrameRecType));
\r
1716 Irq_Restore(state);
\r
1720 * Procedure: storeFreezeFrameDataEvtMem
\r
1721 * Description: Store the freeze frame data in event memory according to
\r
1722 * "eventParam" destination option
\r
1724 static void storeFreezeFrameDataEvtMem(const Dem_EventParameterType *eventParam, const FreezeFrameRecType *freezeFrame)
\r
1728 for (i = 0; (i < DEM_MAX_NR_OF_EVENT_DESTINATION) && (eventParam->EventClass->EventDestination[i] != DEM_EVENT_DESTINATION_END_OF_LIST); i++) {
\r
1729 switch (eventParam->EventClass->EventDestination[i])
\r
1731 case DEM_DTC_ORIGIN_PRIMARY_MEMORY:
\r
1732 storeFreezeFrameDataPriMem(eventParam, freezeFrame);
\r
1733 storeFreezeFrameDataPerMem();
\r
1736 case DEM_DTC_ORIGIN_PERMANENT_MEMORY:
\r
1737 case DEM_DTC_ORIGIN_SECONDARY_MEMORY:
\r
1738 case DEM_DTC_ORIGIN_MIRROR_MEMORY:
\r
1739 // Not yet supported
\r
1740 DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_GLOBAL_ID, DEM_E_NOT_IMPLEMENTED_YET);
\r
1750 * Procedure: lookupFreezeFrameDataRecNumParam
\r
1751 * Description: Returns TRUE if the requested freezeFrame data number was found among the configured records for the event.
\r
1752 * "freezeFrameClassPtr" returns a pointer to the record class.
\r
1754 static boolean lookupFreezeFrameDataRecNumParam(uint8 recordNumber, const Dem_EventParameterType *eventParam, Dem_FreezeFrameClassType const **freezeFrameClassPtr)
\r
1756 boolean recNumFound = FALSE;
\r
1759 if (eventParam->FreezeFrameClassRef != NULL) {
\r
1760 for (i = 0; (i < DEM_MAX_NR_OF_CLASSES_IN_FREEZEFRAME_DATA) && (eventParam->FreezeFrameClassRef[i] != NULL) && (!recNumFound); i++) {
\r
1761 if (eventParam->FreezeFrameClassRef[i]->FFRecordNumber == recordNumber) {
\r
1762 *freezeFrameClassPtr = eventParam->FreezeFrameClassRef[i];
\r
1763 recNumFound = TRUE;
\r
1768 return recNumFound;
\r
1772 * Procedure: lookupFreezeFrameDataSize
\r
1773 * Description: Returns TRUE if the requested freezeFrame data size was obtained successfully from the configuration.
\r
1774 * "dataSize" returns a pointer to the data size.
\r
1776 static boolean lookupFreezeFrameDataSize(uint8 recordNumber, Dem_FreezeFrameClassType const **freezeFrameClassPtr, uint16 *dataSize)
\r
1778 Std_ReturnType callbackReturnCode;
\r
1779 boolean dataSizeFound = TRUE;
\r
1780 uint16 dataSizeLocal = 0;
\r
1783 if (*freezeFrameClassPtr != NULL) {
\r
1784 for (i = 0; (i < DEM_MAX_NR_OF_RECORDS_IN_FREEZEFRAME_DATA) && ((*freezeFrameClassPtr)->FFIdClassRef[i]->Arc_EOL != TRUE); i++) {
\r
1785 if((*freezeFrameClassPtr)->FFIdClassRef[i]->DidReadDataLengthFnc != NULL){
\r
1786 callbackReturnCode = (*freezeFrameClassPtr)->FFIdClassRef[i]->DidReadDataLengthFnc(&dataSizeLocal);
\r
1787 if(callbackReturnCode != E_OK){
\r
1788 return (dataSizeFound = FALSE);
\r
1792 dataSizeLocal = (*freezeFrameClassPtr)->FFIdClassRef[i]->PidOrDidSize;
\r
1795 *dataSize += dataSizeLocal + DEM_DID_IDENTIFIER_SIZE_OF_BYTES;
\r
1800 return dataSizeFound;
\r
1804 * Procedure: lookupFreezeFrameDataPriMem
\r
1805 * Description: Returns TRUE if the requested event id is found, "freezeFrame" points to the found data.
\r
1807 static boolean lookupFreezeFrameDataPriMem(Dem_EventIdType eventId,uint8 recordNumber, FreezeFrameRecType **freezeFrame)
\r
1809 boolean eventIdFound = FALSE;
\r
1812 for (i = 0; (i < DEM_MAX_NUMBER_FF_DATA_PRI_MEM) && (!eventIdFound); i++) {
\r
1813 eventIdFound = ((priMemFreezeFrameBuffer[i].eventId == eventId) && (priMemFreezeFrameBuffer[i].recordNumber == recordNumber));
\r
1816 if (eventIdFound) {
\r
1817 *freezeFrame = &priMemFreezeFrameBuffer[i-1];
\r
1820 return eventIdFound;
\r
1824 * Procedure: handlePreInitEvent
\r
1825 * Description: Handle the updating of event status and storing of
\r
1826 * event related data in preInit buffers.
\r
1828 static void handlePreInitEvent(Dem_EventIdType eventId, Dem_EventStatusType eventStatus)
\r
1830 const Dem_EventParameterType *eventParam;
\r
1831 EventStatusRecType *eventStatusBeforeUpdate;
\r
1832 EventStatusRecType eventStatusLocal;
\r
1833 FreezeFrameRecType freezeFrameLocal;
\r
1834 boolean bFirstFail;
\r
1836 lookupEventIdParameter(eventId, &eventParam);
\r
1837 if (eventParam != NULL) {
\r
1838 if (eventParam->EventClass->OperationCycleRef < DEM_OPERATION_CYCLE_ID_ENDMARK) {
\r
1839 if (operationCycleStateList[eventParam->EventClass->OperationCycleRef] == DEM_CYCLE_STATE_START) {
\r
1840 lookupEventStatusRec(eventParam->EventID, &eventStatusBeforeUpdate);
\r
1841 bFirstFail = (NULL == eventStatusBeforeUpdate) || !(eventStatusBeforeUpdate->eventStatusExtended & DEM_TEST_FAILED_SINCE_LAST_CLEAR);
\r
1842 if (eventStatus == DEM_EVENT_STATUS_FAILED) {
\r
1843 updateEventStatusRec(eventParam, eventStatus, TRUE, &eventStatusLocal);
\r
1846 updateEventStatusRec(eventParam, eventStatus, FALSE, &eventStatusLocal);
\r
1849 if (eventStatusLocal.errorStatusChanged) {
\r
1850 if (eventStatusLocal.eventStatusExtended & DEM_TEST_FAILED) {
\r
1851 storeExtendedData(eventParam, bFirstFail);
\r
1852 getFreezeFrameData(eventParam, &freezeFrameLocal,eventStatus,&eventStatusLocal);
\r
1853 if (freezeFrameLocal.eventId != DEM_EVENT_ID_NULL) {
\r
1854 storeFreezeFrameDataPreInit(eventParam, &freezeFrameLocal);
\r
1862 // Operation cycle not started
\r
1863 // TODO: Report error?
\r
1867 // Operation cycle not set
\r
1868 // TODO: Report error?
\r
1872 // Event ID not configured
\r
1873 // TODO: Report error?
\r
1879 * Procedure: handleEvent
\r
1880 * Description: Handle the updating of event status and storing of
\r
1881 * event related data in event memory.
\r
1883 static Std_ReturnType handleEvent(Dem_EventIdType eventId, Dem_EventStatusType eventStatus)
\r
1885 Std_ReturnType returnCode = E_OK;
\r
1886 const Dem_EventParameterType *eventParam;
\r
1887 EventStatusRecType *eventStatusBeforeUpdate;
\r
1888 EventStatusRecType eventStatusLocal;
\r
1889 FreezeFrameRecType freezeFrameLocal;
\r
1890 Dem_EventStatusType eventStatusTemp = eventStatus;
\r
1891 boolean bFirstFail;
\r
1893 lookupEventIdParameter(eventId, &eventParam);
\r
1894 if (eventParam != NULL) {
\r
1895 if (eventParam->EventClass->OperationCycleRef < DEM_OPERATION_CYCLE_ID_ENDMARK) {
\r
1896 if (operationCycleStateList[eventParam->EventClass->OperationCycleRef] == DEM_CYCLE_STATE_START) {
\r
1897 if ((!((disableDtcStorage.storageDisabled) && (checkDtcGroup(disableDtcStorage.dtcGroup, eventParam)) && (checkDtcKind(disableDtcStorage.dtcKind, eventParam))))) {
\r
1898 lookupEventStatusRec(eventParam->EventID, &eventStatusBeforeUpdate);
\r
1899 bFirstFail = (NULL == eventStatusBeforeUpdate) || !(eventStatusBeforeUpdate->eventStatusExtended & DEM_TEST_FAILED_SINCE_LAST_CLEAR);
\r
1900 updateEventStatusRec(eventParam, eventStatus, TRUE, &eventStatusLocal);
\r
1901 if (eventStatusLocal.errorStatusChanged) {
\r
1902 storeEventEvtMem(eventParam, &eventStatusLocal); /** @req DEM184 */
\r
1903 if (eventStatusLocal.eventStatusExtended & DEM_TEST_FAILED) {
\r
1904 storeExtendedData(eventParam, bFirstFail);
\r
1907 if ((eventStatusTemp == DEM_EVENT_STATUS_PREFAILED)
\r
1908 || (eventStatusLocal.eventStatusExtended & DEM_TEST_FAILED)){
\r
1909 getFreezeFrameData(eventParam, &freezeFrameLocal,eventStatus,&eventStatusLocal);
\r
1910 if (freezeFrameLocal.eventId != DEM_EVENT_ID_NULL) {
\r
1911 storeFreezeFrameDataEvtMem(eventParam, &freezeFrameLocal); /** @req DEM190 */
\r
1921 // Operation cycle not started
\r
1922 returnCode = E_NOT_OK;
\r
1926 // Operation cycle not set
\r
1927 returnCode = E_NOT_OK;
\r
1931 // Event ID not configured
\r
1932 returnCode = E_NOT_OK;
\r
1935 return returnCode;
\r
1940 * Procedure: resetEventStatus
\r
1941 * Description: Resets the events status of eventId.
\r
1943 static void resetEventStatus(Dem_EventIdType eventId)
\r
1945 EventStatusRecType *eventStatusRecPtr;
\r
1949 lookupEventStatusRec(eventId, &eventStatusRecPtr);
\r
1950 if (eventStatusRecPtr != NULL) {
\r
1951 eventStatusRecPtr->eventStatusExtended &= (Dem_EventStatusExtendedType)~DEM_TEST_FAILED; /** @req DEM187 */
\r
1954 Irq_Restore(state);
\r
1959 * Procedure: getEventStatus
\r
1960 * Description: Returns the extended event status bitmask of eventId in "eventStatusExtended".
\r
1962 static void getEventStatus(Dem_EventIdType eventId, Dem_EventStatusExtendedType *eventStatusExtended)
\r
1964 EventStatusRecType eventStatusLocal;
\r
1966 // Get recorded status
\r
1967 getEventStatusRec(eventId, &eventStatusLocal);
\r
1968 if (eventStatusLocal.eventId == eventId) {
\r
1969 *eventStatusExtended = eventStatusLocal.eventStatusExtended; /** @req DEM051 */
\r
1972 // Event Id not found, no report received.
\r
1973 *eventStatusExtended = DEM_TEST_NOT_COMPLETED_THIS_OPERATION_CYCLE | DEM_TEST_NOT_COMPLETED_SINCE_LAST_CLEAR;
\r
1979 * Procedure: getEventFailed
\r
1980 * Description: Returns the TRUE or FALSE of "eventId" in "eventFailed" depending on current status.
\r
1982 static void getEventFailed(Dem_EventIdType eventId, boolean *eventFailed)
\r
1984 EventStatusRecType eventStatusLocal;
\r
1986 // Get recorded status
\r
1987 getEventStatusRec(eventId, &eventStatusLocal);
\r
1988 if (eventStatusLocal.eventId == eventId) {
\r
1989 if (eventStatusLocal.eventStatusExtended & DEM_TEST_FAILED) { /** @req DEM052 */
\r
1990 *eventFailed = TRUE;
\r
1993 *eventFailed = FALSE;
\r
1997 // Event Id not found, assume ok.
\r
1998 *eventFailed = FALSE;
\r
2004 * Procedure: getEventTested
\r
2005 * Description: Returns the TRUE or FALSE of "eventId" in "eventTested" depending on
\r
2006 * current status the "test not completed this operation cycle" bit.
\r
2008 static void getEventTested(Dem_EventIdType eventId, boolean *eventTested)
\r
2010 EventStatusRecType eventStatusLocal;
\r
2012 // Get recorded status
\r
2013 getEventStatusRec(eventId, &eventStatusLocal);
\r
2014 if (eventStatusLocal.eventId == eventId) {
\r
2015 if ( !(eventStatusLocal.eventStatusExtended & DEM_TEST_NOT_COMPLETED_THIS_OPERATION_CYCLE)) { /** @req DEM053 */
\r
2016 *eventTested = TRUE;
\r
2019 *eventTested = FALSE;
\r
2023 // Event Id not found, not tested.
\r
2024 *eventTested = FALSE;
\r
2030 * Procedure: getFaultDetectionCounter
\r
2031 * Description: Returns pre debounce counter of "eventId" in "counter" and return value E_OK if
\r
2032 * the counter was available else E_NOT_OK.
\r
2034 static Std_ReturnType getFaultDetectionCounter(Dem_EventIdType eventId, sint8 *counter)
\r
2036 Std_ReturnType returnCode = E_NOT_OK;
\r
2037 const Dem_EventParameterType *eventParam;
\r
2039 lookupEventIdParameter(eventId, &eventParam);
\r
2040 if (eventParam != NULL) {
\r
2041 if (eventParam->EventClass->PreDebounceAlgorithmClass != NULL) {
\r
2042 switch (eventParam->EventClass->PreDebounceAlgorithmClass->PreDebounceName)
\r
2044 case DEM_NO_PRE_DEBOUNCE:
\r
2045 if (eventParam->EventClass->PreDebounceAlgorithmClass->PreDebounceAlgorithm.PreDebounceMonitorInternal != NULL) {
\r
2046 if (eventParam->EventClass->PreDebounceAlgorithmClass->PreDebounceAlgorithm.PreDebounceMonitorInternal->CallbackGetFDCntFnc != NULL) {
\r
2047 returnCode = eventParam->EventClass->PreDebounceAlgorithmClass->PreDebounceAlgorithm.PreDebounceMonitorInternal->CallbackGetFDCntFnc(counter); /** @req DEM204.None */ /** @req DEM264 */ /** @req DEM265 */
\r
2052 case DEM_PRE_DEBOUNCE_COUNTER_BASED:
\r
2054 EventStatusRecType *eventStatusRec;
\r
2056 lookupEventStatusRec(eventId, &eventStatusRec);
\r
2057 if (eventStatusRec != NULL) {
\r
2058 *counter = eventStatusRec->faultDetectionCounter; /** @req DEM204.Counter */
\r
2062 returnCode = E_OK;
\r
2066 case DEM_PRE_DEBOUNCE_FREQUENCY_BASED:
\r
2067 case DEM_PRE_DEBOUNCE_TIME_BASED:
\r
2068 DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_GETFAULTDETECTIONCOUNTER_ID, DEM_E_NOT_IMPLEMENTED_YET);
\r
2072 DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_GETFAULTDETECTIONCOUNTER_ID, DEM_E_PARAM_DATA);
\r
2078 return returnCode;
\r
2081 * Procedure: deleteEventMemory
\r
2082 * Description: If aging of an event occurs, the Dem module shall delete the event from
\r
2083 * the event memory including its event related data
\r
2085 static void deleteEventMemory(const Dem_EventParameterType *eventParam)
\r
2089 for (i = 0; (i < DEM_MAX_NR_OF_EVENT_DESTINATION) && (eventParam->EventClass->EventDestination[i] != DEM_EVENT_DESTINATION_END_OF_LIST); i++) {
\r
2090 switch (eventParam->EventClass->EventDestination[i])
\r
2092 case DEM_DTC_ORIGIN_PRIMARY_MEMORY:
\r
2093 deleteEventPriMem(eventParam);
\r
2094 deleteFreezeFrameDataPriMem(eventParam);
\r
2095 deleteExtendedDataPriMem(eventParam);
\r
2096 storeFreezeFrameDataPerMem();
\r
2099 case DEM_DTC_ORIGIN_PERMANENT_MEMORY:
\r
2100 //TODO:need to add corresponding event and extended deleting functions
\r
2104 case DEM_DTC_ORIGIN_SECONDARY_MEMORY:
\r
2105 case DEM_DTC_ORIGIN_MIRROR_MEMORY:
\r
2106 // Not yet supported
\r
2107 DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_GLOBAL_ID, DEM_E_NOT_IMPLEMENTED_YET);
\r
2118 * Procedure: lookupAgingRecPriMem
\r
2119 * Description: Returns the pointer to event id parameters of "eventId" in "*priMemAgingBuffer",
\r
2120 * if not found NULL is returned.
\r
2122 static boolean lookupAgingRecPriMem(Dem_EventIdType eventId, const HealingRecType **agingRec)
\r
2125 boolean agingRecFound = FALSE;
\r
2127 for (i = 0; i < DEM_MAX_NUMBER_AGING_PRI_MEM && (!agingRecFound); i++) {
\r
2128 if(priMemAgingBuffer[i].eventId == eventId){
\r
2129 agingRecFound = TRUE;
\r
2134 if(agingRecFound){
\r
2135 *agingRec = &priMemAgingBuffer[i-1];
\r
2141 return agingRecFound;
\r
2147 * Procedure: handleAging
\r
2148 * Description: according to the operation state of "operationCycleId" to "cycleState" , handle the aging relatived data
\r
2149 * Returns E_OK if operation was successful else E_NOT_OK.
\r
2151 static Std_ReturnType handleAging(Dem_OperationCycleIdType operationCycleId, Dem_OperationCycleStateType cycleState)
\r
2154 Std_ReturnType returnCode = E_OK;
\r
2155 HealingRecType *agingRecLocal = NULL;
\r
2156 boolean agingRecFound = FALSE;
\r
2158 if (operationCycleId < DEM_OPERATION_CYCLE_ID_ENDMARK) {
\r
2159 switch (cycleState)
\r
2161 case DEM_CYCLE_STATE_START:
\r
2164 case DEM_CYCLE_STATE_END:/** @req Dem490 */
\r
2165 for (i = 0; i < DEM_MAX_NUMBER_EVENT; i++) {
\r
2166 if(eventStatusBuffer[i].eventId != DEM_EVENT_ID_NULL){
\r
2167 if(eventStatusBuffer[i].eventParamRef != NULL){
\r
2168 if(eventStatusBuffer[i].eventParamRef->EventClass != NULL){
\r
2169 if((eventStatusBuffer[i].eventParamRef->EventClass->HealingAllowed == TRUE)\
\r
2170 && (eventStatusBuffer[i].eventParamRef->EventClass->HealingCycleRef == operationCycleId)){
\r
2171 if((eventStatusBuffer[i].eventStatusExtended & DEM_CONFIRMED_DTC)\
\r
2172 && (!(eventStatusBuffer[i].eventStatusExtended & DEM_TEST_FAILED))\
\r
2173 && (!(eventStatusBuffer[i].eventStatusExtended & DEM_TEST_NOT_COMPLETED_THIS_OPERATION_CYCLE))){
\r
2174 agingRecFound = lookupAgingRecPriMem(eventStatusBuffer[i].eventId, (const HealingRecType **)(&agingRecLocal));
\r
2175 if(agingRecFound){
\r
2176 agingRecLocal->agingCounter++;/** @req Dem489 */
\r
2177 agingRecLocal->checksum = calcChecksum(agingRecLocal,sizeof(HealingRecType) - sizeof(ChecksumType));
\r
2178 if(agingRecLocal->agingCounter > eventStatusBuffer[i].eventParamRef->EventClass->HealingCycleCounter){
\r
2179 //deleteEventMemory(eventStatusBuffer[i].eventParamRef); /** @req Dem497 */
\r
2181 deleteAgingRecPriMem(eventStatusBuffer[i].eventParamRef);
\r
2183 eventStatusBuffer[i].eventStatusExtended &= (Dem_EventStatusExtendedType)(~DEM_CONFIRMED_DTC);
\r
2184 eventStatusBuffer[i].eventStatusExtended &= (Dem_EventStatusExtendedType)(~DEM_PENDING_DTC);
\r
2185 eventStatusBuffer[i].eventStatusExtended &= (Dem_EventStatusExtendedType)(~DEM_WARNING_INDICATOR_REQUESTED);
\r
2187 /* Set the flag,start up the storage of NVRam in main function. */
\r
2188 AgingIsModified = TRUE;
\r
2191 /* If it does exist,establish a new record for the corresponding event */
\r
2192 agingRecFound = lookupAgingRecPriMem(DEM_EVENT_ID_NULL, (const HealingRecType **)(&agingRecLocal));
\r
2193 if(agingRecFound){
\r
2194 agingRecLocal->eventId = eventStatusBuffer[i].eventId;
\r
2195 agingRecLocal->agingCounter++;
\r
2196 agingRecLocal->checksum = calcChecksum(agingRecLocal,sizeof(HealingRecType) - sizeof(ChecksumType));
\r
2197 AgingIsModified = TRUE;
\r
2200 /* primary memory of aging records is full. */
\r
2205 /* If the status bit testFailed (bit 0) is set during the operation cycle, the counter shall be reset. */
\r
2206 if(eventStatusBuffer[i].eventStatusExtended & DEM_TEST_FAILED){
\r
2207 agingRecFound = lookupAgingRecPriMem(eventStatusBuffer[i].eventId, (const HealingRecType **)(&agingRecLocal));
\r
2208 if(agingRecFound){
\r
2209 if(agingRecLocal->agingCounter){
\r
2210 agingRecLocal->agingCounter = 0;
\r
2211 agingRecLocal->checksum = calcChecksum(agingRecLocal,sizeof(HealingRecType) - sizeof(ChecksumType));
\r
2212 AgingIsModified = TRUE;
\r
2224 DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_SETOPERATIONCYCLESTATE_ID, DEM_E_PARAM_DATA);
\r
2225 returnCode = E_NOT_OK;
\r
2230 DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_SETOPERATIONCYCLESTATE_ID, DEM_E_PARAM_DATA);
\r
2231 returnCode = E_NOT_OK;
\r
2234 return returnCode;
\r
2239 * Procedure: setOperationCycleState
\r
2240 * Description: Change the operation state of "operationCycleId" to "cycleState" and updates stored
\r
2241 * event connected to this cycle id.
\r
2242 * Returns E_OK if operation was successful else E_NOT_OK.
\r
2244 static Std_ReturnType setOperationCycleState(Dem_OperationCycleIdType operationCycleId, Dem_OperationCycleStateType cycleState) /** @req DEM338 */
\r
2247 Std_ReturnType returnCode = E_OK;
\r
2249 if (operationCycleId < DEM_OPERATION_CYCLE_ID_ENDMARK) {
\r
2250 switch (cycleState)
\r
2252 case DEM_CYCLE_STATE_START:
\r
2253 operationCycleStateList[operationCycleId] = cycleState;
\r
2254 // Lookup event ID
\r
2255 for (i = 0; i < DEM_MAX_NUMBER_EVENT; i++) {
\r
2256 if ((eventStatusBuffer[i].eventId != DEM_EVENT_ID_NULL) && (eventStatusBuffer[i].eventParamRef->EventClass->OperationCycleRef == operationCycleId)) {
\r
2257 eventStatusBuffer[i].eventStatusExtended &= (Dem_EventStatusExtendedType)~DEM_TEST_FAILED_THIS_OPERATION_CYCLE;
\r
2258 eventStatusBuffer[i].eventStatusExtended |= DEM_TEST_NOT_COMPLETED_THIS_OPERATION_CYCLE;
\r
2263 case DEM_CYCLE_STATE_END:
\r
2264 operationCycleStateList[operationCycleId] = cycleState;
\r
2265 // Lookup event ID
\r
2266 for (i = 0; i < DEM_MAX_NUMBER_EVENT; i++) {
\r
2267 if ((eventStatusBuffer[i].eventId != DEM_EVENT_ID_NULL) && (eventStatusBuffer[i].eventParamRef->EventClass->OperationCycleRef == operationCycleId)) {
\r
2268 if ((!(eventStatusBuffer[i].eventStatusExtended & DEM_TEST_FAILED_THIS_OPERATION_CYCLE)) && (!(eventStatusBuffer[i].eventStatusExtended & DEM_TEST_NOT_COMPLETED_THIS_OPERATION_CYCLE))) {
\r
2269 eventStatusBuffer[i].eventStatusExtended &= (Dem_EventStatusExtendedType)~DEM_PENDING_DTC; // Clear pendingDTC bit /** @req DEM379.PendingClear
\r
2270 storeEventEvtMem(eventStatusBuffer[i].eventParamRef, &eventStatusBuffer[i]);
\r
2276 DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_SETOPERATIONCYCLESTATE_ID, DEM_E_PARAM_DATA);
\r
2277 returnCode = E_NOT_OK;
\r
2282 DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_SETOPERATIONCYCLESTATE_ID, DEM_E_PARAM_DATA);
\r
2283 returnCode = E_NOT_OK;
\r
2286 return returnCode;
\r
2289 //==============================================================================//
\r
2291 // E X T E R N A L F U N C T I O N S //
\r
2293 //==============================================================================//
\r
2295 /*********************************************
\r
2296 * Interface for upper layer modules (8.3.1) *
\r
2297 *********************************************/
\r
2300 * Procedure: Dem_GetVersionInfo
\r
2303 // Defined in Dem.h
\r
2306 /***********************************************
\r
2307 * Interface ECU State Manager <-> DEM (8.3.2) *
\r
2308 ***********************************************/
\r
2311 * Procedure: Dem_PreInit
\r
2314 void Dem_PreInit(void)
\r
2316 /** @req DEM180 */
\r
2319 EventStatusRecType *eventStatusRecPtr;
\r
2320 const Dem_EventParameterType *eventIdParamList;
\r
2322 VALIDATE_NO_RV(DEM_Config.ConfigSet != NULL, DEM_PREINIT_ID, DEM_E_CONFIG_PTR_INVALID);
\r
2324 configSet = DEM_Config.ConfigSet;
\r
2326 // Initializion of operation cycle states.
\r
2327 for (i = 0; i < DEM_OPERATION_CYCLE_ID_ENDMARK; i++) {
\r
2328 operationCycleStateList[i] = DEM_CYCLE_STATE_END;
\r
2331 // Initialize the event status buffer
\r
2332 for (i = 0; i < DEM_MAX_NUMBER_EVENT; i++) {
\r
2333 eventStatusBuffer[i].eventId = DEM_EVENT_ID_NULL;
\r
2334 eventStatusBuffer[i].eventParamRef = NULL;
\r
2335 eventStatusBuffer[i].faultDetectionCounter = 0;
\r
2336 eventStatusBuffer[i].maxFaultDetectionCounter = 0;
\r
2337 eventStatusBuffer[i].occurrence = 0;
\r
2338 eventStatusBuffer[i].eventStatusExtended = DEM_TEST_NOT_COMPLETED_THIS_OPERATION_CYCLE | DEM_TEST_NOT_COMPLETED_SINCE_LAST_CLEAR;
\r
2339 eventStatusBuffer[i].errorStatusChanged = FALSE;
\r
2342 // Insert all supported events into event status buffer
\r
2344 eventIdParamList = configSet->EventParameter;
\r
2345 while( !eventIdParamList[index].Arc_EOL ) {
\r
2346 // Find next free position in event status buffer
\r
2347 lookupEventStatusRec(DEM_EVENT_ID_NULL, &eventStatusRecPtr);
\r
2348 if(NULL != eventStatusRecPtr) {
\r
2349 eventStatusRecPtr->eventId = eventIdParamList[index].EventID;
\r
2350 eventStatusRecPtr->eventParamRef = &eventIdParamList[index];
\r
2352 // event status buffer is full
\r
2353 DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_PREINIT_ID, DEM_E_EVENT_STATUS_BUFF_FULL);
\r
2359 //lint -e568 -e685 //PC-Lint exception.
\r
2360 //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
2361 // Initialize the pre init buffers
\r
2362 for (i = 0; i < DEM_MAX_NUMBER_FF_DATA_PRE_INIT; i++) {
\r
2363 preInitFreezeFrameBuffer[i].checksum = 0;
\r
2364 preInitFreezeFrameBuffer[i].eventId = DEM_EVENT_ID_NULL;
\r
2365 preInitFreezeFrameBuffer[i].occurrence = 0;
\r
2366 preInitFreezeFrameBuffer[i].dataSize = 0;
\r
2367 for (j = 0; j < DEM_MAX_SIZE_FF_DATA;j++){
\r
2368 preInitFreezeFrameBuffer[i].data[j] = 0;
\r
2373 for (i = 0; i < DEM_MAX_NUMBER_EXT_DATA_PRE_INIT; i++) {
\r
2374 preInitExtDataBuffer[i].checksum = 0;
\r
2375 preInitExtDataBuffer[i].eventId = DEM_EVENT_ID_NULL;
\r
2376 for (j = 0; j < DEM_MAX_SIZE_EXT_DATA;j++){
\r
2377 preInitExtDataBuffer[i].data[j] = 0;
\r
2381 disableDtcStorage.storageDisabled = FALSE;
\r
2383 (void)setOperationCycleState(DEM_ACTIVE, DEM_CYCLE_STATE_START); /** @req DEM047 */
\r
2385 demState = DEM_PREINITIALIZED;
\r
2390 * Procedure: Dem_Init
\r
2393 void Dem_Init(void)
\r
2396 // ChecksumType cSum;
\r
2397 boolean entryValid = FALSE;
\r
2398 const Dem_EventParameterType *eventParam;
\r
2400 if(DEM_PREINITIALIZED != demState){
\r
2402 * Dem_PreInit was has not been called since last time Dem_Shutdown was called.
\r
2403 * This suggests that we are resuming from sleep. According to section 5.7 in
\r
2404 * EcuM specification, RAM content is assumed to be still valid from the previous cycle.
\r
2405 * Do not read from saved error log since buffers already contains this data.
\r
2407 (void)setOperationCycleState(DEM_ACTIVE, DEM_CYCLE_STATE_START);
\r
2411 for(i = 0; i < DEM_MAX_NUMBER_FF_DATA_PRI_MEM; i++){
\r
2412 if( E_NOT_OK == copyNvmMirror(FreezeFrameBlockId[i], (uint8 *)&priMemFreezeFrameBuffer[i], (const uint8 *)FreezeFrameMirrorBuffer[i], sizeof(FreezeFrameRecType)) ){
\r
2413 //TODO:NVM is busy or block id is 0,report error or what?
\r
2416 //recover Aging from NVRam to RAM
\r
2417 if(E_OK == copyNvmMirror(HealingBlockId, (uint8*)priMemAgingBuffer, (const uint8*)HealingMirrorBuffer, sizeof(priMemAgingBuffer)) ){
\r
2421 // Validate aging records stored in primary memory
\r
2422 for (i = 0; i < DEM_MAX_NUMBER_AGING_PRI_MEM; i++){
\r
2423 entryValid = checkEntryValid(priMemAgingBuffer[i].eventId);
\r
2424 // cSum = calcChecksum(&priMemAgingBuffer[i], sizeof(HealingRecType) - sizeof(ChecksumType));
\r
2425 if ((priMemAgingBuffer[i].eventId == DEM_EVENT_ID_NULL) || (FALSE == entryValid)) {
\r
2426 // Unlegal record, clear the record
\r
2427 memset(&priMemAgingBuffer[i], 0, sizeof(HealingRecType));
\r
2428 AgingIsModified = TRUE;
\r
2432 // Validate extended data records stored in primary memory
\r
2433 for (i = 0; i < DEM_MAX_NUMBER_EXT_DATA_PRI_MEM; i++) {
\r
2434 entryValid = checkEntryValid(priMemExtDataBuffer[i].eventId);
\r
2435 // cSum = calcChecksum(&priMemExtDataBuffer[i], sizeof(ExtDataRecType)-sizeof(ChecksumType));
\r
2436 if ((priMemExtDataBuffer[i].eventId == DEM_EVENT_ID_NULL) || (FALSE == entryValid)) {
\r
2437 // Unlegal record, clear the record
\r
2438 memset(&priMemExtDataBuffer[i], 0, sizeof(ExtDataRecType));
\r
2442 /* Transfer extended data to event memory if necessary */
\r
2443 for (i = 0; i < DEM_MAX_NUMBER_EXT_DATA_PRE_INIT; i++) {
\r
2444 if (preInitExtDataBuffer[i].eventId != DEM_EVENT_ID_NULL) {
\r
2445 lookupEventIdParameter(preInitExtDataBuffer[i].eventId, &eventParam);
\r
2446 mergeExtendedDataEvtMem(eventParam, &preInitExtDataBuffer[i]);
\r
2450 // Validate event records stored in primary memory
\r
2451 for (i = 0; i < DEM_MAX_NUMBER_EVENT_PRI_MEM; i++) {
\r
2452 entryValid = checkEntryValid(priMemEventBuffer[i].eventId);
\r
2453 // cSum = calcChecksum(&priMemEventBuffer[i], sizeof(EventRecType)-sizeof(ChecksumType));
\r
2454 if ((priMemEventBuffer[i].eventId == DEM_EVENT_ID_NULL) || (FALSE == entryValid)) {
\r
2455 // Unlegal record, clear the record
\r
2456 memset(&priMemEventBuffer[i], 0, sizeof(EventRecType));
\r
2459 // Valid, update current status
\r
2460 mergeEventStatusRec(&priMemEventBuffer[i]);
\r
2462 // Update occurrence counter on pre init stored freeze frames
\r
2463 updateFreezeFrameOccurrencePreInit(&priMemEventBuffer[i]);
\r
2467 //initialize the current timestamp and update the timestamp in pre init
\r
2468 initCurrentFreezeFrameTimeStamp(&FF_TimeStamp);
\r
2471 //lint -e568 //PC-Lint exception.
\r
2472 //lint -e685 //PC-Lint exception.
\r
2473 //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
2474 // Validate freeze frame records stored in primary memory
\r
2475 for (i = 0; i < DEM_MAX_NUMBER_FF_DATA_PRI_MEM; i++) {
\r
2476 entryValid = checkEntryValid(priMemFreezeFrameBuffer[i].eventId);
\r
2477 // cSum = calcChecksum(&priMemFreezeFrameBuffer[i], sizeof(FreezeFrameRecType)-sizeof(ChecksumType));
\r
2478 if ((priMemFreezeFrameBuffer[i].eventId == DEM_EVENT_ID_NULL) || (FALSE == entryValid)) {
\r
2479 // Unlegal record, clear the record
\r
2480 memset(&priMemFreezeFrameBuffer[i], 0, sizeof(FreezeFrameRecType));
\r
2485 /* Transfer updated event data to event memory */
\r
2486 for (i = 0; i < DEM_MAX_NUMBER_EVENT; i++) {
\r
2487 if (eventStatusBuffer[i].eventId != DEM_EVENT_ID_NULL) {
\r
2488 lookupEventIdParameter(eventStatusBuffer[i].eventId, &eventParam);
\r
2489 storeEventEvtMem(eventParam, &eventStatusBuffer[i]);
\r
2494 //lint -e568 //PC-Lint exception.
\r
2495 //lint -e685 //PC-Lint exception.
\r
2496 //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
2497 /* Transfer freeze frames to event memory */
\r
2498 for (i = 0; i < DEM_MAX_NUMBER_FF_DATA_PRE_INIT; i++) {
\r
2499 if (preInitFreezeFrameBuffer[i].eventId != DEM_EVENT_ID_NULL) {
\r
2500 lookupEventIdParameter(preInitFreezeFrameBuffer[i].eventId, &eventParam);
\r
2501 storeFreezeFrameDataEvtMem(eventParam, &preInitFreezeFrameBuffer[i]);
\r
2507 // Init the dtc filter
\r
2508 dtcFilter.dtcStatusMask = DEM_DTC_STATUS_MASK_ALL; // All allowed
\r
2509 dtcFilter.dtcKind = DEM_DTC_KIND_ALL_DTCS; // All kinds of DTCs
\r
2510 dtcFilter.dtcOrigin = DEM_DTC_ORIGIN_PRIMARY_MEMORY; // Primary memory
\r
2511 dtcFilter.filterWithSeverity = DEM_FILTER_WITH_SEVERITY_NO; // No Severity filtering
\r
2512 dtcFilter.dtcSeverityMask = DEM_SEVERITY_NO_SEVERITY; // Not used when filterWithSeverity is FALSE
\r
2513 dtcFilter.filterForFaultDetectionCounter = DEM_FILTER_FOR_FDC_NO; // No fault detection counter filtering
\r
2515 dtcFilter.faultIndex = DEM_MAX_NUMBER_EVENT;
\r
2517 disableDtcStorage.storageDisabled = FALSE;
\r
2519 demState = DEM_INITIALIZED;
\r
2524 * Procedure: Dem_shutdown
\r
2527 void Dem_Shutdown(void)
\r
2529 (void)setOperationCycleState(DEM_ACTIVE, DEM_CYCLE_STATE_END); /** @req DEM047 */
\r
2531 /* handleAging() should be called behind setOperationCycleState() */
\r
2532 (void)handleAging(DEM_ACTIVE, DEM_CYCLE_STATE_END);
\r
2534 demState = DEM_UNINITIALIZED; /** @req DEM368 */
\r
2539 * Interface for basic software scheduler
\r
2541 void Dem_MainFunction(void)/** @req DEM125 */
\r
2543 if (FFIsModified) {
\r
2544 storeFreezeFrameDataPerMem();
\r
2547 if (AgingIsModified) {
\r
2548 storeAgingRecPerMem(HealingBlockId);
\r
2553 /***************************************************
\r
2554 * Interface SW-Components via RTE <-> DEM (8.3.3) *
\r
2555 ***************************************************/
\r
2558 * Procedure: Dem_SetEventStatus
\r
2561 Std_ReturnType Dem_SetEventStatus(Dem_EventIdType eventId, Dem_EventStatusType eventStatus) /** @req DEM330 */
\r
2563 Std_ReturnType returnCode = E_OK;
\r
2565 if (demState == DEM_INITIALIZED) // No action is taken if the module is not started
\r
2567 returnCode = handleEvent(eventId, eventStatus);
\r
2571 DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_SETEVENTSTATUS_ID, DEM_E_UNINIT);
\r
2572 returnCode = E_NOT_OK;
\r
2575 return returnCode;
\r
2580 * Procedure: Dem_ResetEventStatus
\r
2583 Std_ReturnType Dem_ResetEventStatus(Dem_EventIdType eventId) /** @req DEM331 */
\r
2585 Std_ReturnType returnCode = E_OK;
\r
2587 if (demState == DEM_INITIALIZED) // No action is taken if the module is not started
\r
2589 resetEventStatus(eventId); /** @req DEM186 */
\r
2593 DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_RESETEVENTSTATUS_ID, DEM_E_UNINIT);
\r
2594 returnCode = E_NOT_OK;
\r
2597 return returnCode;
\r
2602 * Procedure: Dem_GetEventStatus
\r
2605 Std_ReturnType Dem_GetEventStatus(Dem_EventIdType eventId, Dem_EventStatusExtendedType *eventStatusExtended) /** @req DEM332 */
\r
2607 Std_ReturnType returnCode = E_OK;
\r
2609 if (demState == DEM_INITIALIZED) // No action is taken if the module is not started
\r
2611 getEventStatus(eventId, eventStatusExtended);
\r
2615 DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_GETEVENTSTATUS_ID, DEM_E_UNINIT);
\r
2616 returnCode = E_NOT_OK;
\r
2619 return returnCode;
\r
2624 * Procedure: Dem_GetEventFailed
\r
2627 Std_ReturnType Dem_GetEventFailed(Dem_EventIdType eventId, boolean *eventFailed) /** @req DEM333 */
\r
2629 Std_ReturnType returnCode = E_OK;
\r
2631 if (demState == DEM_INITIALIZED) // No action is taken if the module is not started
\r
2633 getEventFailed(eventId, eventFailed);
\r
2637 DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_GETEVENTFAILED_ID, DEM_E_UNINIT);
\r
2638 returnCode = E_NOT_OK;
\r
2641 return returnCode;
\r
2646 * Procedure: Dem_GetEventTested
\r
2649 Std_ReturnType Dem_GetEventTested(Dem_EventIdType eventId, boolean *eventTested)
\r
2651 Std_ReturnType returnCode = E_OK;
\r
2653 if (demState == DEM_INITIALIZED) // No action is taken if the module is not started
\r
2655 getEventTested(eventId, eventTested);
\r
2659 DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_GETEVENTTESTED_ID, DEM_E_UNINIT);
\r
2660 returnCode = E_NOT_OK;
\r
2663 return returnCode;
\r
2668 * Procedure: Dem_GetFaultDetectionCounter
\r
2671 Std_ReturnType Dem_GetFaultDetectionCounter(Dem_EventIdType eventId, sint8 *counter)
\r
2673 Std_ReturnType returnCode = E_OK;
\r
2675 if (demState == DEM_INITIALIZED) // No action is taken if the module is not started
\r
2677 returnCode = getFaultDetectionCounter(eventId, counter);
\r
2681 DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_GETFAULTDETECTIONCOUNTER_ID, DEM_E_UNINIT);
\r
2682 returnCode = E_NOT_OK;
\r
2685 return returnCode;
\r
2690 * Procedure: Dem_SetOperationCycleState
\r
2693 Std_ReturnType Dem_SetOperationCycleState(Dem_OperationCycleIdType operationCycleId, Dem_OperationCycleStateType cycleState)
\r
2695 Std_ReturnType returnCode = E_OK;
\r
2697 if (demState == DEM_INITIALIZED) // No action is taken if the module is not started
\r
2699 returnCode = setOperationCycleState(operationCycleId, cycleState);
\r
2700 (void)handleAging(operationCycleId, cycleState);
\r
2705 DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_SETOPERATIONCYCLESTATE_ID, DEM_E_UNINIT);
\r
2706 returnCode = E_NOT_OK;
\r
2709 return returnCode;
\r
2714 * Procedure: Dem_GetDTCOfEvent
\r
2717 Std_ReturnType Dem_GetDTCOfEvent(Dem_EventIdType eventId, Dem_DTCKindType dtcKind, uint32* dtcOfEvent)
\r
2719 Std_ReturnType returnCode = E_NO_DTC_AVAILABLE;
\r
2720 const Dem_EventParameterType *eventParam;
\r
2722 if (demState == DEM_INITIALIZED) // No action is taken if the module is not started
\r
2724 lookupEventIdParameter(eventId, &eventParam);
\r
2726 if (eventParam != NULL) {
\r
2727 if (checkDtcKind(dtcKind, eventParam)) {
\r
2728 if (eventParam->DTCClassRef != NULL) {
\r
2729 *dtcOfEvent = eventParam->DTCClassRef->DTC; /** @req DEM269 */
\r
2730 returnCode = E_OK;
\r
2735 // Event Id not found
\r
2736 returnCode = E_NOT_OK;
\r
2741 DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_GETDTCOFEVENT_ID, DEM_UNINITIALIZED);
\r
2742 returnCode = E_NOT_OK;
\r
2745 return returnCode;
\r
2749 /********************************************
\r
2750 * Interface BSW-Components <-> DEM (8.3.4) *
\r
2751 ********************************************/
\r
2754 * Procedure: Dem_ReportErrorStatus
\r
2757 void Dem_ReportErrorStatus( Dem_EventIdType eventId, Dem_EventStatusType eventStatus ) /** @req DEM206 */
\r
2760 switch (demState) {
\r
2761 case DEM_PREINITIALIZED:
\r
2762 // Update status and check if is to be stored
\r
2763 if ((eventStatus == DEM_EVENT_STATUS_PASSED) || (eventStatus == DEM_EVENT_STATUS_FAILED)) {
\r
2764 handlePreInitEvent(eventId, eventStatus); /** @req DEM168 */
\r
2768 case DEM_INITIALIZED:
\r
2769 (void)handleEvent(eventId, eventStatus); /** @req DEM167 */
\r
2772 case DEM_UNINITIALIZED:
\r
2774 // Uninitialized can not do anything
\r
2775 DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_REPORTERRORSTATUS_ID, DEM_E_UNINIT);
\r
2779 } // switch (demState)
\r
2782 /*********************************
\r
2783 * Interface DCM <-> DEM (8.3.5) *
\r
2784 *********************************/
\r
2786 * Procedure: Dem_GetDTCStatusAvailabilityMask
\r
2789 Std_ReturnType Dem_GetDTCStatusAvailabilityMask(uint8 *dtcStatusMask) /** @req DEM014 */
\r
2791 *dtcStatusMask = DEM_DTC_STATUS_AVAILABILITY_MASK; // User configuration mask
\r
2792 *dtcStatusMask &= DEM_TEST_FAILED // Mask with supported bits /** @req DEM060 */
\r
2793 | DEM_TEST_FAILED_THIS_OPERATION_CYCLE
\r
2795 | DEM_CONFIRMED_DTC
\r
2796 | DEM_TEST_NOT_COMPLETED_SINCE_LAST_CLEAR
\r
2797 | DEM_TEST_FAILED_SINCE_LAST_CLEAR
\r
2798 | DEM_TEST_NOT_COMPLETED_THIS_OPERATION_CYCLE
\r
2799 // | DEM_WARNING_INDICATOR_REQUESTED TODO: Add support for this bit
\r
2807 * Procedure: Dem_SetDTCFilter
\r
2810 Dem_ReturnSetDTCFilterType Dem_SetDTCFilter(uint8 dtcStatusMask,
\r
2811 Dem_DTCKindType dtcKind,
\r
2812 Dem_DTCOriginType dtcOrigin,
\r
2813 Dem_FilterWithSeverityType filterWithSeverity,
\r
2814 Dem_DTCSeverityType dtcSeverityMask,
\r
2815 Dem_FilterForFDCType filterForFaultDetectionCounter)
\r
2817 Dem_ReturnSetDTCFilterType returnCode = DEM_FILTER_ACCEPTED;
\r
2818 uint8 dtcStatusAvailabilityMask;
\r
2819 Dem_GetDTCStatusAvailabilityMask(&dtcStatusAvailabilityMask);
\r
2821 if (demState == DEM_INITIALIZED) {
\r
2822 // Check dtcKind parameter
\r
2823 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
2825 // Check dtcOrigin parameter
\r
2826 VALIDATE_RV((dtcOrigin == DEM_DTC_ORIGIN_SECONDARY_MEMORY) || (dtcOrigin == DEM_DTC_ORIGIN_PRIMARY_MEMORY)
\r
2827 || (dtcOrigin == DEM_DTC_ORIGIN_PERMANENT_MEMORY) || (dtcOrigin == DEM_DTC_ORIGIN_MIRROR_MEMORY), DEM_SETDTCFILTER_ID, DEM_E_PARAM_DATA, DEM_WRONG_FILTER);
\r
2829 // Check filterWithSeverity and dtcSeverityMask parameter
\r
2830 VALIDATE_RV(((filterWithSeverity == DEM_FILTER_WITH_SEVERITY_NO)
\r
2831 || ((filterWithSeverity == DEM_FILTER_WITH_SEVERITY_YES)
\r
2832 && (!(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
2834 // Check filterForFaultDetectionCounter parameter
\r
2835 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
2837 // Yes all parameters correct, set the new filters. /** @req DEM057 */
\r
2838 dtcFilter.dtcStatusMask = dtcStatusMask & dtcStatusAvailabilityMask;
\r
2839 dtcFilter.dtcKind = dtcKind;
\r
2840 dtcFilter.dtcOrigin = dtcOrigin;
\r
2841 dtcFilter.filterWithSeverity = filterWithSeverity;
\r
2842 dtcFilter.dtcSeverityMask = dtcSeverityMask;
\r
2843 dtcFilter.filterForFaultDetectionCounter = filterForFaultDetectionCounter;
\r
2844 dtcFilter.faultIndex = DEM_MAX_NUMBER_EVENT;
\r
2846 DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_SETDTCFILTER_ID, DEM_E_UNINIT);
\r
2847 returnCode = DEM_WRONG_FILTER;
\r
2850 return returnCode;
\r
2855 * Procedure: Dem_GetStatusOfDTC
\r
2858 Dem_ReturnGetStatusOfDTCType Dem_GetStatusOfDTC(uint32 dtc, Dem_DTCKindType dtcKind, Dem_DTCOriginType dtcOrigin, Dem_EventStatusExtendedType* status) {
\r
2859 Dem_ReturnGetStatusOfDTCType returnCode = DEM_STATUS_FAILED;
\r
2860 EventStatusRecType *eventRec;
\r
2862 if (demState == DEM_INITIALIZED) {
\r
2863 if (lookupDtcEvent(dtc, &eventRec)) {
\r
2864 if (checkDtcKind(dtcKind, eventRec->eventParamRef)) {
\r
2865 if (checkDtcOrigin(dtcOrigin,eventRec->eventParamRef)) {
\r
2866 *status = eventRec->eventStatusExtended; /** @req DEM059 */
\r
2867 returnCode = DEM_STATUS_OK;
\r
2870 returnCode = DEM_STATUS_WRONG_DTCORIGIN; /** @req DEM171 */
\r
2874 returnCode = DEM_STATUS_WRONG_DTCKIND;
\r
2878 returnCode = DEM_STATUS_WRONG_DTC; /** @req DEM172 */
\r
2881 DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_GETSTATUSOFDTC_ID, DEM_E_UNINIT);
\r
2882 returnCode = DEM_STATUS_FAILED;
\r
2885 return returnCode;
\r
2890 * Procedure: Dem_GetNumberOfFilteredDtc
\r
2893 Dem_ReturnGetNumberOfFilteredDTCType Dem_GetNumberOfFilteredDtc(uint16 *numberOfFilteredDTC) {
\r
2895 uint16 numberOfFaults = 0;
\r
2896 Dem_ReturnGetNumberOfFilteredDTCType returnCode = DEM_NUMBER_OK;
\r
2898 if (demState == DEM_INITIALIZED) {
\r
2899 //Dem_DisableEventStatusUpdate();
\r
2901 for (i = 0; i < DEM_MAX_NUMBER_EVENT; i++) {
\r
2902 if (eventStatusBuffer[i].eventId != DEM_EVENT_ID_NULL) {
\r
2903 if (matchEventWithDtcFilter(&eventStatusBuffer[i])) {
\r
2904 if (eventStatusBuffer[i].eventParamRef->DTCClassRef != NULL) {
\r
2911 //Dem_EnableEventStatusUpdate();
\r
2913 *numberOfFilteredDTC = numberOfFaults; /** @req DEM061 */
\r
2915 DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_GETNUMBEROFFILTEREDDTC_ID, DEM_E_UNINIT);
\r
2916 returnCode = DEM_NUMBER_FAILED;
\r
2919 return returnCode;
\r
2924 * Procedure: Dem_GetNextFilteredDTC
\r
2927 Dem_ReturnGetNextFilteredDTCType Dem_GetNextFilteredDTC(uint32 *dtc, Dem_EventStatusExtendedType *dtcStatus)
\r
2929 Dem_ReturnGetNextFilteredDTCType returnCode = DEM_FILTERED_OK;
\r
2930 boolean dtcFound = FALSE;
\r
2932 if (demState == DEM_INITIALIZED) {
\r
2933 // TODO: This job should be done in an more advanced way according to Dem217
\r
2934 while ((!dtcFound) && (dtcFilter.faultIndex != 0)) {
\r
2935 dtcFilter.faultIndex--;
\r
2936 if (eventStatusBuffer[dtcFilter.faultIndex].eventId != DEM_EVENT_ID_NULL) {
\r
2937 if (matchEventWithDtcFilter(&eventStatusBuffer[dtcFilter.faultIndex])) {
\r
2938 if (eventStatusBuffer[dtcFilter.faultIndex].eventParamRef->DTCClassRef != NULL) {
\r
2939 *dtc = eventStatusBuffer[dtcFilter.faultIndex].eventParamRef->DTCClassRef->DTC; /** @req DEM216 */
\r
2940 *dtcStatus = eventStatusBuffer[dtcFilter.faultIndex].eventStatusExtended;
\r
2948 dtcFilter.faultIndex = DEM_MAX_NUMBER_EVENT;
\r
2949 returnCode = DEM_FILTERED_NO_MATCHING_DTC;
\r
2952 DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_GETNEXTFILTEREDDTC_ID, DEM_E_UNINIT);
\r
2953 returnCode = DEM_FILTERED_NO_MATCHING_DTC;
\r
2956 return returnCode;
\r
2961 * Procedure: Dem_GetTranslationType
\r
2964 Dem_ReturnTypeOfDtcSupportedType Dem_GetTranslationType(void)
\r
2966 return DEM_TYPE_OF_DTC_SUPPORTED; /** @req DEM231 */
\r
2971 * Procedure: Dem_ClearDTC
\r
2974 Dem_ReturnClearDTCType Dem_ClearDTC(uint32 dtc, Dem_DTCKindType dtcKind, Dem_DTCOriginType dtcOrigin) /** @req DEM009 *//** @req DEM241 */
\r
2976 Dem_ReturnClearDTCType returnCode = DEM_CLEAR_OK;
\r
2977 Dem_EventIdType eventId;
\r
2978 const Dem_EventParameterType *eventParam;
\r
2981 if (demState == DEM_INITIALIZED) {
\r
2982 for (i = 0; i < DEM_MAX_NUMBER_EVENT; i++) {
\r
2983 eventId = eventStatusBuffer[i].eventId;
\r
2984 if (eventId != DEM_EVENT_ID_NULL) {
\r
2985 eventParam = eventStatusBuffer[i].eventParamRef;
\r
2986 if (eventParam != NULL) {
\r
2987 //lint --e(506) PC-Lint exception Misra 13.7, 14.1 Allow configuration variables in boolean expression
\r
2988 //lint --e(774) PC-Lint exception Related to MISRA 13.7
\r
2989 if ((DEM_CLEAR_ALL_EVENTS == STD_ON) || (eventParam->DTCClassRef != NULL)) {
\r
2990 if (checkDtcKind(dtcKind, eventParam)) {
\r
2991 if (checkDtcGroup(dtc, eventParam)) {
\r
2992 boolean dtcOriginFound = FALSE;
\r
2993 for (j = 0; (j < DEM_MAX_NR_OF_EVENT_DESTINATION) && (!dtcOriginFound) ; j++){
\r
2994 dtcOriginFound =(eventParam->EventClass->EventDestination[j] == dtcOrigin);
\r
2996 if (dtcOriginFound) {
\r
2997 switch (dtcOrigin)
\r
2999 case DEM_DTC_ORIGIN_PRIMARY_MEMORY:
\r
3000 /** @req DEM077 */
\r
3001 deleteEventPriMem(eventParam);
\r
3002 deleteFreezeFrameDataPriMem(eventParam);
\r
3003 deleteExtendedDataPriMem(eventParam);
\r
3004 resetEventStatusRec(eventParam);
\r
3005 storeFreezeFrameDataPerMem();
\r
3008 case DEM_DTC_ORIGIN_SECONDARY_MEMORY:
\r
3009 case DEM_DTC_ORIGIN_PERMANENT_MEMORY:
\r
3010 case DEM_DTC_ORIGIN_MIRROR_MEMORY:
\r
3011 // Not yet supported
\r
3012 returnCode = DEM_CLEAR_WRONG_DTCORIGIN;
\r
3013 DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_CLEARDTC_ID, DEM_E_NOT_IMPLEMENTED_YET);
\r
3016 returnCode = DEM_CLEAR_WRONG_DTCORIGIN;
\r
3025 // Fatal error, no event parameters found for the stored event!
\r
3026 DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_CLEARDTC_ID, DEM_E_UNEXPECTED_EXECUTION);
\r
3031 DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_CLEARDTC_ID, DEM_E_UNINIT);
\r
3032 returnCode = DEM_CLEAR_FAILED;
\r
3035 return returnCode;
\r
3040 * Procedure: Dem_DisableDTCStorage
\r
3043 Dem_ReturnControlDTCStorageType Dem_DisableDTCStorage(Dem_DTCGroupType dtcGroup, Dem_DTCKindType dtcKind) /** @req DEM035 */
\r
3045 Dem_ReturnControlDTCStorageType returnCode = DEM_CONTROL_DTC_STORAGE_OK;
\r
3047 if (demState == DEM_INITIALIZED) {
\r
3048 // Check dtcGroup parameter
\r
3049 if (dtcGroup == DEM_DTC_GROUP_ALL_DTCS) {
\r
3050 // Check dtcKind parameter
\r
3051 if ((dtcKind == DEM_DTC_KIND_ALL_DTCS) || (dtcKind == DEM_DTC_KIND_EMISSION_REL_DTCS)) {
\r
3052 /** @req DEM079 */
\r
3053 disableDtcStorage.dtcGroup = dtcGroup;
\r
3054 disableDtcStorage.dtcKind = dtcKind;
\r
3055 disableDtcStorage.storageDisabled = TRUE;
\r
3057 returnCode = DEM_CONTROL_DTC_STORAGE_N_OK;
\r
3060 returnCode = DEM_CONTROL_DTC_WRONG_DTCGROUP;
\r
3063 DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_DISABLEDTCSTORAGE_ID, DEM_E_UNINIT);
\r
3064 returnCode = DEM_CONTROL_DTC_STORAGE_N_OK;
\r
3067 return returnCode;
\r
3072 * Procedure: Dem_EnableDTCStorage
\r
3075 Dem_ReturnControlDTCStorageType Dem_EnableDTCStorage(Dem_DTCGroupType dtcGroup, Dem_DTCKindType dtcKind)
\r
3077 Dem_ReturnControlDTCStorageType returnCode = DEM_CONTROL_DTC_STORAGE_OK;
\r
3079 if (demState == DEM_INITIALIZED) {
\r
3080 // TODO: Behavior is not defined if group or kind do not match active settings, therefore the filter is just switched off.
\r
3081 (void)dtcGroup; (void)dtcKind; // Just to make get rid of PC-Lint warnings
\r
3082 disableDtcStorage.storageDisabled = FALSE; /** @req DEM080 */
\r
3084 DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_ENABLEDTCSTORAGE_ID, DEM_E_UNINIT);
\r
3085 returnCode = DEM_CONTROL_DTC_STORAGE_N_OK;
\r
3088 return returnCode;
\r
3092 * Procedure: Dem_GetExtendedDataRecordByDTC
\r
3095 Dem_ReturnGetExtendedDataRecordByDTCType Dem_GetExtendedDataRecordByDTC(uint32 dtc, Dem_DTCKindType dtcKind, Dem_DTCOriginType dtcOrigin, uint8 extendedDataNumber, uint8 *destBuffer, uint16 *bufSize)
\r
3097 Dem_ReturnGetExtendedDataRecordByDTCType returnCode = DEM_RECORD_WRONG_DTC;
\r
3098 EventStatusRecType *eventRec;
\r
3099 Dem_ExtendedDataRecordClassType const *extendedDataRecordClass = NULL;
\r
3100 ExtDataRecType *extData;
\r
3101 uint16 posInExtData = 0;
\r
3103 if (demState == DEM_INITIALIZED) {
\r
3104 if (lookupDtcEvent(dtc, &eventRec)) {
\r
3105 if (checkDtcKind(dtcKind, eventRec->eventParamRef)) {
\r
3106 if (checkDtcOrigin(dtcOrigin, eventRec->eventParamRef)) {
\r
3107 if (lookupExtendedDataRecNumParam(extendedDataNumber, eventRec->eventParamRef, &extendedDataRecordClass, &posInExtData)) {
\r
3108 if (*bufSize >= extendedDataRecordClass->DataSize) {
\r
3109 if( extendedDataRecordClass->UpdateRule != DEM_UPDATE_RECORD_VOLATILE )
\r
3111 switch (dtcOrigin)
\r
3113 case DEM_DTC_ORIGIN_PRIMARY_MEMORY:
\r
3114 if (lookupExtendedDataPriMem(eventRec->eventId, &extData)) {
\r
3115 // Yes all conditions met, copy the extended data record to destination buffer.
\r
3116 memcpy(destBuffer, &extData->data[posInExtData], extendedDataRecordClass->DataSize); /** @req DEM075 */
\r
3117 *bufSize = extendedDataRecordClass->DataSize;
\r
3118 returnCode = DEM_RECORD_OK;
\r
3121 // The record number is legal but no record was found for the DTC
\r
3123 returnCode = DEM_RECORD_OK;
\r
3127 case DEM_DTC_ORIGIN_SECONDARY_MEMORY:
\r
3128 case DEM_DTC_ORIGIN_PERMANENT_MEMORY:
\r
3129 case DEM_DTC_ORIGIN_MIRROR_MEMORY:
\r
3130 // Not yet supported
\r
3131 returnCode = DEM_RECORD_WRONG_DTCORIGIN;
\r
3132 DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_GETEXTENDEDDATARECORDBYDTC_ID, DEM_E_NOT_IMPLEMENTED_YET);
\r
3135 returnCode = DEM_RECORD_WRONG_DTCORIGIN;
\r
3140 if( NULL != extendedDataRecordClass->CallbackGetExtDataRecord ) {
\r
3141 extendedDataRecordClass->CallbackGetExtDataRecord(destBuffer);
\r
3142 *bufSize = extendedDataRecordClass->DataSize;
\r
3143 returnCode = DEM_RECORD_OK;
\r
3145 else if (DEM_NO_ELEMENT != extendedDataRecordClass->InternalDataElement ) {
\r
3146 getInternalElement( eventRec->eventParamRef, extendedDataRecordClass->InternalDataElement, destBuffer );
\r
3147 *bufSize = extendedDataRecordClass->DataSize;
\r
3148 returnCode = DEM_RECORD_OK;
\r
3151 returnCode = DEM_RECORD_WRONG_DTC;
\r
3157 returnCode = DEM_RECORD_BUFFERSIZE;
\r
3161 returnCode = DEM_RECORD_NUMBER;
\r
3165 returnCode = DEM_RECORD_WRONG_DTCORIGIN;
\r
3169 returnCode = DEM_RECORD_DTCKIND;
\r
3173 DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_GETEXTENDEDDATARECORDBYDTC_ID, DEM_E_UNINIT);
\r
3174 returnCode = DEM_RECORD_WRONG_DTC;
\r
3177 return returnCode;
\r
3182 * Procedure: Dem_GetSizeOfExtendedDataRecordByDTC
\r
3185 Dem_ReturnGetSizeOfExtendedDataRecordByDTCType Dem_GetSizeOfExtendedDataRecordByDTC(uint32 dtc, Dem_DTCKindType dtcKind, Dem_DTCOriginType dtcOrigin, uint8 extendedDataNumber, uint16 *sizeOfExtendedDataRecord)
\r
3187 Dem_ReturnGetExtendedDataRecordByDTCType returnCode = DEM_GET_SIZEOFEDRBYDTC_W_DTC;
\r
3188 EventStatusRecType *eventRec;
\r
3189 Dem_ExtendedDataRecordClassType const *extendedDataRecordClass = NULL;
\r
3190 uint16 posInExtData;
\r
3192 if (demState == DEM_INITIALIZED) {
\r
3193 if (lookupDtcEvent(dtc, &eventRec)) {
\r
3194 if (checkDtcKind(dtcKind, eventRec->eventParamRef)) {
\r
3195 if (checkDtcOrigin(dtcOrigin, eventRec->eventParamRef)) {
\r
3196 if (lookupExtendedDataRecNumParam(extendedDataNumber, eventRec->eventParamRef, &extendedDataRecordClass, &posInExtData)) {
\r
3197 *sizeOfExtendedDataRecord = extendedDataRecordClass->DataSize; /** @req DEM076 */
\r
3198 returnCode = DEM_GET_SIZEOFEDRBYDTC_OK;
\r
3201 returnCode = DEM_GET_SIZEOFEDRBYDTC_W_RNUM;
\r
3205 returnCode = DEM_GET_SIZEOFEDRBYDTC_W_DTCOR;
\r
3209 returnCode = DEM_GET_SIZEOFEDRBYDTC_W_DTCKI;
\r
3213 DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_GETSIZEOFEXTENDEDDATARECORDBYDTC_ID, DEM_E_UNINIT);
\r
3214 returnCode = DEM_GET_SIZEOFEDRBYDTC_W_DTC;
\r
3217 return returnCode;
\r
3221 * Procedure: Dem_GetFreezeFrameDataByDTC
\r
3224 /** @req DEM236 */
\r
3225 Dem_ReturnGetFreezeFrameDataByDTCType Dem_GetFreezeFrameDataByDTC(uint32 dtc,Dem_DTCKindType dtcKind,Dem_DTCOriginType dtcOrigin,uint8 recordNumber,uint8* destBuffer,uint8* bufSize)
\r
3227 Dem_ReturnGetFreezeFrameDataByDTCType returnCode = DEM_GET_FFDATABYDTC_WRONG_DTC;
\r
3228 EventStatusRecType *eventRec;
\r
3229 Dem_FreezeFrameClassType const *FFDataRecordClass = NULL;
\r
3230 FreezeFrameRecType *freezeframe;
\r
3231 uint16 FFDataSize = 0;
\r
3233 if (demState == DEM_INITIALIZED) {
\r
3234 if (lookupDtcEvent(dtc, &eventRec)) {
\r
3235 if (checkDtcKind(dtcKind, eventRec->eventParamRef)) {
\r
3236 if (checkDtcOrigin(dtcOrigin, eventRec->eventParamRef)) {
\r
3237 if (lookupFreezeFrameDataRecNumParam(recordNumber, eventRec->eventParamRef, &FFDataRecordClass)) {
\r
3238 lookupFreezeFrameDataSize(recordNumber, &FFDataRecordClass, &FFDataSize);
\r
3239 if (*bufSize >= FFDataSize) {
\r
3240 switch (dtcOrigin)
\r
3242 case DEM_DTC_ORIGIN_PRIMARY_MEMORY:
\r
3243 if (lookupFreezeFrameDataPriMem(eventRec->eventId,recordNumber, &freezeframe)) {
\r
3244 memcpy(destBuffer, freezeframe->data, FFDataSize); /** @req DEM071 */
\r
3245 *bufSize = FFDataSize;
\r
3246 returnCode = DEM_GET_FFDATABYDTC_OK;
\r
3250 returnCode = DEM_GET_FFDATABYDTC_OK;
\r
3254 case DEM_DTC_ORIGIN_SECONDARY_MEMORY:
\r
3255 case DEM_DTC_ORIGIN_PERMANENT_MEMORY:
\r
3256 case DEM_DTC_ORIGIN_MIRROR_MEMORY:
\r
3257 // Not yet supported
\r
3258 returnCode = DEM_GET_FFDATABYDTC_WRONG_DTCORIGIN;
\r
3259 DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_GETFREEZEFRAMEDATARECORDBYDTC_ID, DEM_E_NOT_IMPLEMENTED_YET);
\r
3262 returnCode = DEM_GET_FFDATABYDTC_WRONG_DTCORIGIN;
\r
3267 returnCode = DEM_GET_FFDATABYDTC_BUFFERSIZE;
\r
3271 returnCode = DEM_GET_FFDATABYDTC_RECORDNUMBER;
\r
3275 returnCode = DEM_GET_FFDATABYDTC_WRONG_DTCORIGIN;
\r
3279 returnCode = DEM_GET_FFDATABYDTC_WRONG_DTCKIND;
\r
3283 returnCode = DEM_GET_FFDATABYDTC_WRONG_DTC;
\r
3287 DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_GETFREEZEFRAMEDATARECORDBYDTC_ID, DEM_E_UNINIT);
\r
3288 returnCode = DEM_GET_ID_PENDING;
\r
3291 return returnCode;
\r
3297 * Procedure: Dem_GetFreezeFrameDataIdentifierByDTC
\r
3300 Dem_GetFreezeFameDataIdentifierByDTCType Dem_GetFreezeFrameDataIdentifierByDTC(uint32 dtc,
\r
3301 Dem_DTCKindType dtcKind,
\r
3302 Dem_DTCOriginType dtcOrigin,
\r
3303 uint8 recordNumber,
\r
3305 const uint16** dataId )/** @req DEM237 */
\r
3307 Dem_GetFreezeFameDataIdentifierByDTCType returnCode = DEM_GET_ID_WRONG_FF_TYPE;
\r
3308 Dem_FreezeFrameClassType const *FFDataRecordClass = NULL;
\r
3309 EventStatusRecType *eventRec;
\r
3312 if (demState == DEM_INITIALIZED) {
\r
3313 if (lookupDtcEvent(dtc, &eventRec)) {
\r
3314 if (checkDtcKind(dtcKind, eventRec->eventParamRef)) {
\r
3315 if (checkDtcOrigin(dtcOrigin, eventRec->eventParamRef)) {
\r
3316 if (lookupFreezeFrameDataRecNumParam(recordNumber, eventRec->eventParamRef, &FFDataRecordClass)) {
\r
3317 if(FFDataRecordClass->FFIdClassRef != NULL){
\r
3318 for(i=0; (i < DEM_MAX_NR_OF_RECORDS_IN_FREEZEFRAME_DATA) && (!(FFDataRecordClass->FFIdClassRef[i]->Arc_EOL)); i++){
\r
3319 dataId[didNum] = &FFDataRecordClass->FFIdClassRef[i]->DidIdentifier;/** @req DEM073 */
\r
3321 returnCode = DEM_GET_ID_OK;
\r
3324 *arraySize = didNum;
\r
3327 returnCode = DEM_GET_ID_WRONG_FF_TYPE;
\r
3331 returnCode = DEM_GET_ID_WRONG_FF_TYPE;
\r
3335 returnCode = DEM_GET_ID_WRONG_DTCORIGIN;
\r
3339 returnCode = DEM_GET_ID_WRONG_DTCKIND;
\r
3343 returnCode = DEM_GET_ID_WRONG_DTC;
\r
3348 DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_GETFREEZEFRAMEDATAIDENTIFIERBYDTC_ID, DEM_E_UNINIT);
\r
3351 return returnCode;
\r
3356 * Procedure: Dem_GetSizeOfFreezeFrame
\r
3359 /** @req DEM238 */
\r
3360 Dem_ReturnGetSizeOfFreezeFrameType Dem_GetSizeOfFreezeFrame(uint32 dtc,Dem_DTCKindType dtcKind,Dem_DTCOriginType dtcOrigin,uint8 recordNumber,uint16* sizeOfFreezeFrame)
\r
3362 Dem_ReturnGetSizeOfFreezeFrameType returnCode = DEM_GET_SIZEOFFF_PENDING;
\r
3363 Dem_FreezeFrameClassType const *FFDataRecordClass = NULL;
\r
3364 Std_ReturnType callbackReturnCode;
\r
3365 EventStatusRecType *eventRec;
\r
3366 uint16 dataSize = 0;
\r
3369 if (demState == DEM_INITIALIZED) {
\r
3370 if (lookupDtcEvent(dtc, &eventRec)) {
\r
3371 if (checkDtcKind(dtcKind, eventRec->eventParamRef)) {
\r
3372 if (checkDtcOrigin(dtcOrigin, eventRec->eventParamRef)) {
\r
3373 if (lookupFreezeFrameDataRecNumParam(recordNumber, eventRec->eventParamRef, &FFDataRecordClass)) {
\r
3374 if(FFDataRecordClass->FFIdClassRef != NULL){
\r
3375 /* Note - there is a function called lookupFreezeFrameDataSize that can be used here */
\r
3376 for(i = 0; (i < DEM_MAX_NR_OF_RECORDS_IN_FREEZEFRAME_DATA) && (!(FFDataRecordClass->FFIdClassRef[i]->Arc_EOL)); i++){
\r
3377 /* read out the did size */
\r
3378 if(FFDataRecordClass->FFIdClassRef[i]->DidReadDataLengthFnc != NULL){
\r
3379 callbackReturnCode = FFDataRecordClass->FFIdClassRef[i]->DidReadDataLengthFnc(&dataSize);
\r
3380 if(callbackReturnCode != E_OK){
\r
3381 return (returnCode = DEM_GET_SIZEOFFF_PENDING);
\r
3385 dataSize = FFDataRecordClass->FFIdClassRef[i]->PidOrDidSize;
\r
3387 *sizeOfFreezeFrame += dataSize+DEM_DID_IDENTIFIER_SIZE_OF_BYTES;/** @req DEM074 */
\r
3388 returnCode = DEM_GET_SIZEOFFF_OK;
\r
3392 returnCode = DEM_GET_SIZEOFFF_WRONG_RNUM;
\r
3396 returnCode = DEM_GET_SIZEOFFF_WRONG_RNUM;
\r
3400 returnCode = DEM_GET_SIZEOFFF_WRONG_DTCOR;
\r
3404 returnCode = DEM_GET_SIZEOFFF_WRONG_DTCKIND;
\r
3408 returnCode = DEM_GET_SIZEOFFF_WRONG_DTC;
\r
3413 DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_GETFREEZEFRAMEDATAIDENTIFIERBYDTC_ID, DEM_E_UNINIT);
\r
3414 returnCode = DEM_GET_SIZEOFFF_PENDING;
\r
3417 return returnCode;
\r
3422 #if (DEM_UNIT_TEST == STD_ON)
\r
3423 void getFFDataPreInit(FreezeFrameRecType **buf)
\r
3425 *buf = &preInitFreezeFrameBuffer[0];
\r
3428 void getPriMemFFBufPtr(FreezeFrameRecType **buf)
\r
3430 *buf = &priMemFreezeFrameBuffer[0];
\r
3434 uint32 getCurTimeStamp()
\r
3436 return FF_TimeStamp;
\r
3439 void getPriMemEventRecBufPtr(EventStatusRecType **buf)
\r
3441 *buf = &eventStatusBuffer[0];
\r
3445 void getPriMemAgingBufPtr(HealingRecType **buf)
\r
3447 *buf = &priMemAgingBuffer[0];
\r
3456 /***********************************
\r
3457 * OBD-specific Interfaces (8.3.6) *
\r
3458 ***********************************/
\r