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
25 //#include "SchM_Dem.h"
\r
32 #define DEBOUNCE_FDC_TEST_FAILED 127
\r
33 #define DEBOUNCE_FDC_TEST_PASSED -128
\r
39 typedef uint16 ChecksumType;
\r
43 Dem_EventStatusExtendedType dtcStatusMask;
\r
44 Dem_DTCKindType dtcKind;
\r
45 Dem_DTCOriginType dtcOrigin;
\r
46 Dem_FilterWithSeverityType filterWithSeverity;
\r
47 Dem_DTCSeverityType dtcSeverityMask;
\r
48 Dem_FilterForFDCType filterForFaultDetectionCounter;
\r
52 // DisableDtcStorageType
\r
54 boolean storageDisabled;
\r
55 Dem_DTCGroupType dtcGroup;
\r
56 Dem_DTCKindType dtcKind;
\r
57 } DisableDtcStorageType;
\r
59 // For keeping track of the events status
\r
61 Dem_EventIdType eventId;
\r
62 const Dem_EventParameterType *eventParamRef;
\r
63 sint8 faultDetectionCounter;
\r
65 Dem_EventStatusExtendedType eventStatusExtended;
\r
66 boolean errorStatusChanged;
\r
67 } EventStatusRecType;
\r
70 // Types for storing different event data on event memory
\r
72 Dem_EventIdType eventId;
\r
74 ChecksumType checksum;
\r
78 Dem_EventIdType eventId;
\r
81 sint8 data[DEM_MAX_SIZE_FF_DATA];
\r
82 ChecksumType checksum;
\r
83 } FreezeFrameRecType;
\r
86 Dem_EventIdType eventId;
\r
88 uint8 data[DEM_MAX_SIZE_EXT_DATA];
\r
89 ChecksumType checksum;
\r
96 DEM_UNINITIALIZED = 0,
\r
102 static Dem_StateType demState = DEM_UNINITIALIZED;
\r
104 // Help pointer to configuration set
\r
105 static const Dem_ConfigSetType *configSet;
\r
107 #if (DEM_VERSION_INFO_API == STD_ON)
\r
108 static Std_VersionInfoType _Dem_VersionInfo =
\r
110 .vendorID = (uint16)1,
\r
111 .moduleID = (uint16)1,
\r
112 .instanceID = (uint8)1,
\r
113 .sw_major_version = (uint8)DEM_SW_MAJOR_VERSION,
\r
114 .sw_minor_version = (uint8)DEM_SW_MINOR_VERSION,
\r
115 .sw_patch_version = (uint8)DEM_SW_PATCH_VERSION,
\r
116 .ar_major_version = (uint8)DEM_AR_MAJOR_VERSION,
\r
117 .ar_minor_version = (uint8)DEM_AR_MINOR_VERSION,
\r
118 .ar_patch_version = (uint8)DEM_AR_PATCH_VERSION,
\r
120 #endif /* DEM_VERSION_INFO_API */
\r
123 * Allocation of DTC filter parameters
\r
125 static DtcFilterType dtcFilter;
\r
128 * Allocation of Disable/Enable DTC storage parameters
\r
130 static DisableDtcStorageType disableDtcStorage;
\r
133 * Allocation of operation cycle state list
\r
135 static Dem_OperationCycleStateType operationCycleStateList[DEM_OPERATION_CYCLE_ID_ENDMARK];
\r
138 * Allocation of local event status buffer
\r
140 static EventStatusRecType eventStatusBuffer[DEM_MAX_NUMBER_EVENT];
\r
143 * Allocation of pre-init event memory (used between pre-init and init)
\r
145 static FreezeFrameRecType preInitFreezeFrameBuffer[DEM_MAX_NUMBER_FF_DATA_PRE_INIT];
\r
146 static ExtDataRecType preInitExtDataBuffer[DEM_MAX_NUMBER_EXT_DATA_PRE_INIT];
\r
149 * Allocation of primary event memory ramlog (after init) in uninitialized memory
\r
151 static EventRecType priMemEventBuffer[DEM_MAX_NUMBER_EVENT_PRI_MEM] __attribute__ ((section (".dem_eventmemory_pri")));
\r
152 static FreezeFrameRecType priMemFreezeFrameBuffer[DEM_MAX_NUMBER_FF_DATA_PRI_MEM] __attribute__ ((section (".dem_eventmemory_pri")));
\r
153 static ExtDataRecType priMemExtDataBuffer[DEM_MAX_NUMBER_EXT_DATA_PRI_MEM] __attribute__ ((section (".dem_eventmemory_pri")));
\r
157 * Procedure: zeroPriMemBuffers
\r
158 * Description: Fill the primary buffers with zeroes
\r
160 void demZeroPriMemBuffers(void)
\r
162 memset(priMemEventBuffer, 0, sizeof(priMemEventBuffer));
\r
163 memset(priMemFreezeFrameBuffer, 0, sizeof(priMemFreezeFrameBuffer));
\r
164 memset(priMemExtDataBuffer, 0, sizeof(priMemExtDataBuffer));
\r
169 * Procedure: calcChecksum
\r
170 * Description: Calculate checksum over *data to *(data+nrOfBytes-1) area
\r
172 static ChecksumType calcChecksum(void *data, uint16 nrOfBytes)
\r
175 uint8 *ptr = (uint8*)data;
\r
176 ChecksumType sum = 0;
\r
178 for (i = 0; i < nrOfBytes; i++)
\r
186 * Procedure: checkDtcKind
\r
187 * Description: Return TRUE if "dtcKind" match the events DTCKind or "dtcKind"
\r
188 * is "DEM_DTC_KIND_ALL_DTCS" otherwise FALSE.
\r
190 static boolean checkDtcKind(Dem_DTCKindType dtcKind, const Dem_EventParameterType *eventParam)
\r
192 boolean result = FALSE;
\r
194 if (dtcKind == DEM_DTC_KIND_ALL_DTCS) {
\r
198 if (eventParam->DTCClassRef != NULL) {
\r
199 if (eventParam->DTCClassRef->DTCKind == dtcKind) {
\r
209 * Procedure: checkDtcGroup
\r
210 * Description: Return TRUE if "dtc" match the events DTC or "dtc" is
\r
211 * "DEM_DTC_GROUP_ALL_DTCS" otherwise FALSE.
\r
213 static boolean checkDtcGroup(uint32 dtc, const Dem_EventParameterType *eventParam)
\r
215 boolean result = FALSE;
\r
217 if (dtc == DEM_DTC_GROUP_ALL_DTCS) {
\r
221 if (eventParam->DTCClassRef != NULL) {
\r
222 if (eventParam->DTCClassRef->DTC == dtc) {
\r
232 * Procedure: checkDtcOrigin
\r
233 * Description: Return TRUE if "dtcOrigin" match any of the events DTCOrigin otherwise FALSE.
\r
235 static boolean checkDtcOrigin(Dem_DTCOriginType dtcOrigin, const Dem_EventParameterType *eventParam)
\r
237 boolean result = FALSE;
\r
240 for (i = 0; (eventParam->EventClass->EventDestination[i] != dtcOrigin) && (i < DEM_MAX_NR_OF_EVENT_DESTINATION); i++);
\r
242 if (i < DEM_MAX_NR_OF_EVENT_DESTINATION) {
\r
251 * Procedure: checkDtcSeverityMask
\r
252 * Description: Return TRUE if "dtcSeverityMask" match any of the events DTC severity otherwise FALSE.
\r
254 static boolean checkDtcSeverityMask(Dem_DTCSeverityType dtcSeverityMask, const Dem_EventParameterType *eventParam)
\r
256 boolean result = TRUE;
\r
258 // TODO: This function is optional, may be implemented here.
\r
265 * Procedure: checkDtcFaultDetectionCounterMask
\r
266 * Description: TBD.
\r
268 static boolean checkDtcFaultDetectionCounter(const Dem_EventParameterType *eventParam)
\r
270 boolean result = TRUE;
\r
272 // TODO: Not implemented yet.
\r
279 * Procedure: lookupEventStatusRec
\r
280 * Description: Returns the pointer to event id parameters of "eventId" in "*eventStatusBuffer",
\r
281 * if not found NULL is returned.
\r
283 static void lookupEventStatusRec(Dem_EventIdType eventId, EventStatusRecType **const eventStatusRec)
\r
285 EventStatusRecType *eventStatusRecPtr = eventStatusBuffer;
\r
287 while ((eventStatusRecPtr->eventId != eventId) && (eventStatusRecPtr < &eventStatusBuffer[DEM_MAX_NUMBER_EVENT])) {
\r
288 eventStatusRecPtr++;
\r
291 if (eventStatusRecPtr < &eventStatusBuffer[DEM_MAX_NUMBER_EVENT]) {
\r
292 *eventStatusRec = eventStatusRecPtr;
\r
294 *eventStatusRec = NULL;
\r
300 * Procedure: lookupEventIdParameter
\r
301 * Description: Returns the pointer to event id parameters of "eventId" in "*eventIdParam",
\r
302 * if not found NULL is returned.
\r
304 static void lookupEventIdParameter(Dem_EventIdType eventId, const Dem_EventParameterType **const eventIdParam)
\r
306 const Dem_EventParameterType *EventIdParamPtr = configSet->EventParameter;
\r
308 // Lookup the correct event id parameters
\r
309 while ((EventIdParamPtr->EventID != eventId) && !EventIdParamPtr->Arc_EOL) {
\r
313 if (!EventIdParamPtr->Arc_EOL) {
\r
314 *eventIdParam = EventIdParamPtr;
\r
316 *eventIdParam = NULL;
\r
322 * Procedure: preDebounceNone
\r
323 * Description: Returns the result of the debouncing.
\r
325 static Dem_EventStatusType preDebounceNone(Dem_EventStatusType reportedStatus, EventStatusRecType* statusRecord) {
\r
326 Dem_EventStatusType returnCode;
\r
328 switch (reportedStatus) {
\r
329 case DEM_EVENT_STATUS_FAILED:
\r
330 case DEM_EVENT_STATUS_PASSED:
\r
331 // Already debounced, do nothing.
\r
335 // TODO: What to do with PREFAIL and PREPASSED on no debouncing?
\r
336 #if (DEM_DEV_ERROR_DETECT == STD_ON)
\r
337 Det_ReportError(MODULE_ID_DEM, 0, DEM_PREDEBOUNCE_NONE_ID, DEM_E_PARAM_DATA);
\r
342 returnCode = reportedStatus;
\r
348 * Procedure: preDebounceCounterBased
\r
349 * Description: Returns the result of the debouncing.
\r
351 static Dem_EventStatusType preDebounceCounterBased(Dem_EventStatusType reportedStatus, EventStatusRecType* statusRecord) {
\r
352 Dem_EventStatusType returnCode;
\r
353 const Dem_PreDebounceCounterBasedType* pdVars = statusRecord->eventParamRef->EventClass->PreDebounceAlgorithmClass->PreDebounceAlgorithm.PreDebounceCounterBased;
\r
355 switch (reportedStatus) {
\r
356 case DEM_EVENT_STATUS_PREFAILED:
\r
357 if (statusRecord->faultDetectionCounter < DEBOUNCE_FDC_TEST_FAILED) {
\r
358 if (pdVars->JumpUp && (statusRecord->faultDetectionCounter < 0)) {
\r
359 statusRecord->faultDetectionCounter = 0;
\r
361 if (((sint16)statusRecord->faultDetectionCounter + pdVars->CountInStepSize) < DEBOUNCE_FDC_TEST_FAILED) {
\r
362 statusRecord->faultDetectionCounter += pdVars->CountInStepSize;
\r
364 statusRecord->faultDetectionCounter = DEBOUNCE_FDC_TEST_FAILED;
\r
370 case DEM_EVENT_STATUS_PREPASSED:
\r
371 if (statusRecord->faultDetectionCounter > DEBOUNCE_FDC_TEST_PASSED) {
\r
372 if (pdVars->JumpDown && (statusRecord->faultDetectionCounter > 0)) {
\r
373 statusRecord->faultDetectionCounter = 0;
\r
375 if (((sint16)statusRecord->faultDetectionCounter - pdVars->CountOutStepSize) > DEBOUNCE_FDC_TEST_PASSED) {
\r
376 statusRecord->faultDetectionCounter -= pdVars->CountOutStepSize;
\r
378 statusRecord->faultDetectionCounter = DEBOUNCE_FDC_TEST_PASSED;
\r
384 case DEM_EVENT_STATUS_FAILED:
\r
385 statusRecord->faultDetectionCounter = DEBOUNCE_FDC_TEST_FAILED;
\r
388 case DEM_EVENT_STATUS_PASSED:
\r
389 statusRecord->faultDetectionCounter = DEBOUNCE_FDC_TEST_PASSED;
\r
393 #if (DEM_DEV_ERROR_DETECT == STD_ON)
\r
394 Det_ReportError(MODULE_ID_DEM, 0, DEM_PREDEBOUNCE_COUNTER_BASED_ID, DEM_E_PARAM_DATA);
\r
400 switch (statusRecord->faultDetectionCounter) {
\r
401 case DEBOUNCE_FDC_TEST_FAILED:
\r
402 returnCode = DEM_EVENT_STATUS_FAILED;
\r
405 case DEBOUNCE_FDC_TEST_PASSED:
\r
406 returnCode = DEM_EVENT_STATUS_PASSED;
\r
410 returnCode = reportedStatus;
\r
419 * Procedure: updateEventStatusRec
\r
420 * Description: Update the status of "eventId", if not exist and "createIfNotExist" is
\r
421 * true a new record is created
\r
423 static void updateEventStatusRec(const Dem_EventParameterType *eventParam, Dem_EventStatusType eventStatus, boolean createIfNotExist, EventStatusRecType *eventStatusRec)
\r
425 EventStatusRecType *eventStatusRecPtr;
\r
426 imask_t state = McuE_EnterCriticalSection();
\r
429 lookupEventStatusRec(eventParam->EventID, &eventStatusRecPtr);
\r
431 if ((eventStatusRecPtr == NULL) && (createIfNotExist)) {
\r
432 // Search for free position
\r
433 lookupEventStatusRec(DEM_EVENT_ID_NULL, &eventStatusRecPtr);
\r
435 if (eventStatusRecPtr != NULL) {
\r
436 // Create new event record
\r
437 eventStatusRecPtr->eventId = eventParam->EventID;
\r
438 eventStatusRecPtr->eventParamRef = eventParam;
\r
439 eventStatusRecPtr->faultDetectionCounter = 0;
\r
440 eventStatusRecPtr->occurrence = 0;
\r
441 eventStatusRecPtr->eventStatusExtended = DEM_TEST_NOT_COMPLETED_SINCE_LAST_CLEAR | DEM_TEST_NOT_COMPLETED_THIS_OPERATION_CYCLE;
\r
442 eventStatusRecPtr->errorStatusChanged = FALSE;
\r
445 // Error: Event status buffer full
\r
446 #if (DEM_DEV_ERROR_DETECT == STD_ON)
\r
447 Det_ReportError(MODULE_ID_DEM, 0, DEM_UPDATE_EVENT_STATUS_ID, DEM_E_EVENT_STATUS_BUFF_FULL);
\r
453 if (eventStatusRecPtr != NULL) {
\r
454 // Handle debouncing
\r
455 switch (eventParam->EventClass->PreDebounceAlgorithmClass->PreDebounceName) {
\r
456 case DEM_NO_PRE_DEBOUNCE:
\r
457 eventStatus = preDebounceNone(eventStatus, eventStatusRecPtr);
\r
460 case DEM_PRE_DEBOUNCE_COUNTER_BASED:
\r
461 eventStatus = preDebounceCounterBased(eventStatus, eventStatusRecPtr);
\r
465 // Don't know how to handle this.
\r
466 #if (DEM_DEV_ERROR_DETECT == STD_ON)
\r
467 Det_ReportError(MODULE_ID_DEM, 0, DEM_UPDATE_EVENT_STATUS_ID, DEM_E_NOT_IMPLEMENTED_YET);
\r
473 eventStatusRecPtr->errorStatusChanged = FALSE;
\r
475 // Check test failed
\r
476 if (eventStatus == DEM_EVENT_STATUS_FAILED) {
\r
477 if (!(eventStatusRecPtr->eventStatusExtended & DEM_TEST_FAILED)) {
\r
478 eventStatusRecPtr->occurrence++;
\r
479 eventStatusRecPtr->errorStatusChanged = TRUE;
\r
481 eventStatusRecPtr->eventStatusExtended |= (DEM_TEST_FAILED | DEM_TEST_FAILED_THIS_OPERATION_CYCLE | DEM_TEST_FAILED_SINCE_LAST_CLEAR | DEM_PENDING_DTC);
\r
482 eventStatusRecPtr->eventStatusExtended &= ~(DEM_TEST_NOT_COMPLETED_SINCE_LAST_CLEAR | DEM_TEST_NOT_COMPLETED_THIS_OPERATION_CYCLE);
\r
485 // Check test passed
\r
486 if (eventStatus == DEM_EVENT_STATUS_PASSED) {
\r
487 if (eventStatusRecPtr->eventStatusExtended & DEM_TEST_FAILED) {
\r
488 eventStatusRecPtr->errorStatusChanged = TRUE;
\r
490 eventStatusRecPtr->eventStatusExtended &= ~DEM_TEST_FAILED;
\r
491 eventStatusRecPtr->eventStatusExtended &= ~(DEM_TEST_NOT_COMPLETED_SINCE_LAST_CLEAR | DEM_TEST_NOT_COMPLETED_THIS_OPERATION_CYCLE);
\r
495 memcpy(eventStatusRec, eventStatusRecPtr, sizeof(EventStatusRecType));
\r
498 // Copy an empty record to return data
\r
499 eventStatusRec->eventId = DEM_EVENT_ID_NULL;
\r
500 eventStatusRecPtr->faultDetectionCounter = 0;
\r
501 eventStatusRec->occurrence = 0;
\r
502 eventStatusRec->eventStatusExtended = DEM_TEST_NOT_COMPLETED_THIS_OPERATION_CYCLE | DEM_TEST_NOT_COMPLETED_SINCE_LAST_CLEAR;
\r
503 eventStatusRec->errorStatusChanged = FALSE;
\r
506 McuE_ExitCriticalSection(state);
\r
511 * Procedure: mergeEventStatusRec
\r
512 * Description: Update the occurrence counter of status, if not exist a new record is created
\r
514 static void mergeEventStatusRec(EventRecType *eventRec)
\r
516 EventStatusRecType *eventStatusRecPtr;
\r
517 imask_t state = McuE_EnterCriticalSection();
\r
520 lookupEventStatusRec(eventRec->eventId, &eventStatusRecPtr);
\r
522 if (eventStatusRecPtr != NULL) {
\r
523 // Update occurrence counter, rest of pre init state is kept.
\r
524 eventStatusRecPtr->occurrence += eventRec->occurrence;
\r
528 // Search for free position
\r
529 lookupEventStatusRec(DEM_EVENT_ID_NULL, &eventStatusRecPtr);
\r
531 if (eventStatusRecPtr != NULL) {
\r
532 // Create new event, from stored event
\r
533 eventStatusRecPtr->eventId = eventRec->eventId;
\r
534 lookupEventIdParameter(eventRec->eventId, &eventStatusRecPtr->eventParamRef);
\r
535 eventStatusRecPtr->faultDetectionCounter = 0;
\r
536 eventStatusRecPtr->occurrence = eventRec->occurrence;
\r
537 eventStatusRecPtr->eventStatusExtended = DEM_TEST_NOT_COMPLETED_THIS_OPERATION_CYCLE | DEM_TEST_NOT_COMPLETED_SINCE_LAST_CLEAR;
\r
538 eventStatusRecPtr->errorStatusChanged = FALSE;
\r
541 // Error: Event status buffer full
\r
542 #if (DEM_DEV_ERROR_DETECT == STD_ON)
\r
543 Det_ReportError(MODULE_ID_DEM, 0, DEM_MERGE_EVENT_STATUS_ID, DEM_E_EVENT_STATUS_BUFF_FULL);
\r
548 McuE_ExitCriticalSection(state);
\r
553 * Procedure: deleteEventStatusRec
\r
554 * Description: Delete the status record of "eventParam->eventId" from "eventStatusBuffer".
\r
556 static void deleteEventStatusRec(const Dem_EventParameterType *eventParam)
\r
558 EventStatusRecType *eventStatusRecPtr;
\r
559 imask_t state = McuE_EnterCriticalSection();
\r
562 lookupEventStatusRec(eventParam->EventID, &eventStatusRecPtr);
\r
564 if (eventStatusRecPtr != NULL) {
\r
565 // Delete event record
\r
566 memset(eventStatusRecPtr, 0, sizeof(EventStatusRecType));
\r
569 McuE_ExitCriticalSection(state);
\r
574 * Procedure: getEventStatusRec
\r
575 * Description: Returns the status record of "eventId" in "eventStatusRec"
\r
577 static void getEventStatusRec(Dem_EventIdType eventId, EventStatusRecType *eventStatusRec)
\r
579 EventStatusRecType *eventStatusRecPtr;
\r
582 lookupEventStatusRec(eventId, &eventStatusRecPtr);
\r
584 if (eventStatusRecPtr != NULL) {
\r
586 memcpy(eventStatusRec, eventStatusRecPtr, sizeof(EventStatusRecType));
\r
589 eventStatusRec->eventId = DEM_EVENT_ID_NULL;
\r
595 * Procedure: lookupDtcEvent
\r
596 * Description: Returns TRUE if the DTC was found and "eventStatusRec" points
\r
597 * to the event record found.
\r
599 static boolean lookupDtcEvent(uint32 dtc, EventStatusRecType **eventStatusRec)
\r
601 boolean dtcFound = FALSE;
\r
604 *eventStatusRec = NULL;
\r
606 for (i = 0; (i < DEM_MAX_NUMBER_EVENT) && !dtcFound; i++) {
\r
607 if (eventStatusBuffer[i].eventId != DEM_EVENT_ID_NULL) {
\r
608 if (eventStatusBuffer[i].eventParamRef->DTCClassRef != NULL) {
\r
611 if (eventStatusBuffer[i].eventParamRef->DTCClassRef->DTC == dtc) {
\r
612 *eventStatusRec = &eventStatusBuffer[i];
\r
624 * Procedure: matchEventWithDtcFilter
\r
625 * Description: Returns TRUE if the event pointed by "event" fulfill
\r
626 * the "dtcFilter" global filter settings.
\r
628 static boolean matchEventWithDtcFilter(const EventStatusRecType *eventRec)
\r
630 boolean dtcMatch = FALSE;
\r
633 if ((dtcFilter.dtcStatusMask == DEM_DTC_STATUS_MASK_ALL) || (eventRec->eventStatusExtended & dtcFilter.dtcStatusMask)) {
\r
634 if (eventRec->eventParamRef != NULL) {
\r
637 if (checkDtcKind(dtcFilter.dtcKind, eventRec->eventParamRef)) {
\r
640 if (checkDtcOrigin(dtcFilter.dtcOrigin, eventRec->eventParamRef)) {
\r
643 if ((dtcFilter.filterWithSeverity == DEM_FILTER_WITH_SEVERITY_NO)
\r
644 || ((dtcFilter.filterWithSeverity == DEM_FILTER_WITH_SEVERITY_YES) && checkDtcSeverityMask(dtcFilter.dtcSeverityMask, eventRec->eventParamRef))) {
\r
646 // Check fault detection counter
\r
647 if ((dtcFilter.filterForFaultDetectionCounter == DEM_FILTER_FOR_FDC_NO)
\r
648 || ((dtcFilter.filterWithSeverity == DEM_FILTER_FOR_FDC_YES) && checkDtcFaultDetectionCounter(eventRec->eventParamRef))) {
\r
661 static void getFreezeFrameData(const Dem_EventParameterType *eventParam, FreezeFrameRecType *freezeFrame)
\r
664 freezeFrame->eventId = DEM_EVENT_ID_NULL; // Not supported yet
\r
668 static void storeFreezeFrameDataPreInit(const Dem_EventParameterType *eventParam, FreezeFrameRecType *freezeFrame)
\r
674 static void updateFreezeFrameOccurrencePreInit(EventRecType *EventBuffer)
\r
681 * Procedure: getExtendedData
\r
682 * Description: Collects the extended data according to "eventParam" and return it in "extData",
\r
683 * if not found eventId is set to DEM_EVENT_ID_NULL.
\r
685 static void getExtendedData(const Dem_EventParameterType *eventParam, ExtDataRecType *extData)
\r
687 Std_ReturnType callbackReturnCode;
\r
689 uint16 storeIndex = 0;
\r
692 // Clear ext data record
\r
693 memset(extData, 0, sizeof(ExtDataRecType));
\r
695 // Check if any pointer to extended data class
\r
696 if (eventParam->ExtendedDataClassRef != NULL) {
\r
697 // Request extended data and copy it to the buffer
\r
698 for (i = 0; (i < DEM_MAX_NR_OF_RECORDS_IN_EXTENDED_DATA) && (eventParam->ExtendedDataClassRef->ExtendedDataRecordClassRef[i] != NULL); i++) {
\r
699 recordSize = eventParam->ExtendedDataClassRef->ExtendedDataRecordClassRef[i]->DataSize;
\r
700 if ((storeIndex + recordSize) <= DEM_MAX_SIZE_EXT_DATA) {
\r
701 callbackReturnCode = eventParam->ExtendedDataClassRef->ExtendedDataRecordClassRef[i]->CallbackGetExtDataRecord(&extData->data[storeIndex]);
\r
702 if (callbackReturnCode != E_OK) {
\r
703 // Callback data currently not available, clear space.
\r
704 memset(&extData->data[storeIndex], 0xFF, recordSize);
\r
706 storeIndex += recordSize;
\r
709 // Error: Size of extended data record is bigger than reserved space.
\r
710 #if (DEM_DEV_ERROR_DETECT == STD_ON)
\r
711 Det_ReportError(MODULE_ID_DEM, 0, DEM_GET_EXTENDED_DATA_ID, DEM_E_EXT_DATA_TOO_BIG);
\r
713 break; // Break the loop
\r
718 // Check if any data has been stored
\r
719 if (storeIndex != 0) {
\r
720 extData->eventId = eventParam->EventID;
\r
721 extData->dataSize = storeIndex;
\r
722 extData->checksum = calcChecksum(extData, sizeof(ExtDataRecType)-sizeof(ChecksumType));
\r
725 extData->eventId = DEM_EVENT_ID_NULL;
\r
726 extData->dataSize = storeIndex;
\r
727 extData->checksum = 0;
\r
733 * Procedure: storeExtendedDataPreInit
\r
734 * Description: Store the extended data pointed by "extendedData" to the "preInitExtDataBuffer",
\r
735 * if non existent a new entry is created.
\r
737 static void storeExtendedDataPreInit(const Dem_EventParameterType *eventParam, ExtDataRecType *extendedData)
\r
740 imask_t state = McuE_EnterCriticalSection();
\r
742 // Check if already stored
\r
743 for (i = 0; (preInitExtDataBuffer[i].eventId != eventParam->EventID) && (i<DEM_MAX_NUMBER_EXT_DATA_PRE_INIT); i++);
\r
745 if (i < DEM_MAX_NUMBER_EXT_DATA_PRE_INIT) {
\r
746 // Yes, overwrite existing
\r
747 memcpy(&preInitExtDataBuffer[i], extendedData, sizeof(ExtDataRecType));
\r
750 // No, lookup first free position
\r
751 for (i = 0; (preInitExtDataBuffer[i].eventId !=0) && (i<DEM_MAX_NUMBER_EXT_DATA_PRE_INIT); i++);
\r
753 if (i < DEM_MAX_NUMBER_EXT_DATA_PRE_INIT) {
\r
754 memcpy(&preInitExtDataBuffer[i], extendedData, sizeof(ExtDataRecType));
\r
757 // Error: Pre init extended data buffer full
\r
758 #if (DEM_DEV_ERROR_DETECT == STD_ON)
\r
759 Det_ReportError(MODULE_ID_DEM, 0, DEM_STORE_EXT_DATA_PRE_INIT_ID, DEM_E_PRE_INIT_EXT_DATA_BUFF_FULL);
\r
764 McuE_ExitCriticalSection(state);
\r
769 * Procedure: storeEventPriMem
\r
770 * Description: Store the event data of "eventStatus->eventId" in "priMemEventBuffer",
\r
771 * if non existent a new entry is created.
\r
773 static void storeEventPriMem(const Dem_EventParameterType *eventParam, EventStatusRecType *eventStatus)
\r
776 imask_t state = McuE_EnterCriticalSection();
\r
780 for (i = 0; (priMemEventBuffer[i].eventId != eventStatus->eventId) && (i < DEM_MAX_NUMBER_EVENT_ENTRY_PRI); i++);
\r
782 if (i < DEM_MAX_NUMBER_EVENT_ENTRY_PRI) {
\r
783 // Update event found
\r
784 priMemEventBuffer[i].occurrence = eventStatus->occurrence;
\r
785 priMemEventBuffer[i].checksum = calcChecksum(&priMemEventBuffer[i], sizeof(EventRecType)-sizeof(ChecksumType));
\r
788 // Search for free position
\r
789 for (i=0; (priMemEventBuffer[i].eventId != DEM_EVENT_ID_NULL) && (i < DEM_MAX_NUMBER_EVENT_ENTRY_PRI); i++);
\r
791 if (i < DEM_MAX_NUMBER_EVENT_ENTRY_PRI) {
\r
792 priMemEventBuffer[i].eventId = eventStatus->eventId;
\r
793 priMemEventBuffer[i].occurrence = eventStatus->occurrence;
\r
794 priMemEventBuffer[i].checksum = calcChecksum(&priMemEventBuffer[i], sizeof(EventRecType)-sizeof(ChecksumType));
\r
797 // Error: Pri mem event buffer full
\r
798 #if (DEM_DEV_ERROR_DETECT == STD_ON)
\r
799 Det_ReportError(MODULE_ID_DEM, 0, DEM_STORE_EVENT_PRI_MEM_ID, DEM_E_PRI_MEM_EVENT_BUFF_FULL);
\r
804 McuE_ExitCriticalSection(state);
\r
809 * Procedure: deleteEventPriMem
\r
810 * Description: Delete the event data of "eventParam->eventId" from "priMemEventBuffer".
\r
812 static void deleteEventPriMem(const Dem_EventParameterType *eventParam)
\r
815 imask_t state = McuE_EnterCriticalSection();
\r
819 for (i = 0; (priMemEventBuffer[i].eventId != eventParam->EventID) && (i < DEM_MAX_NUMBER_EVENT_ENTRY_PRI); i++);
\r
821 if (i < DEM_MAX_NUMBER_EVENT_ENTRY_PRI) {
\r
822 // Delete event found
\r
823 memset(&priMemEventBuffer[i], 0, sizeof(EventRecType));
\r
826 McuE_ExitCriticalSection(state);
\r
831 * Procedure: storeEventEvtMem
\r
832 * Description: Store the event data of "eventStatus->eventId" in event memory according to
\r
833 * "eventParam" destination option.
\r
835 static void storeEventEvtMem(const Dem_EventParameterType *eventParam, EventStatusRecType *eventStatus)
\r
839 for (i = 0; (i < DEM_MAX_NR_OF_EVENT_DESTINATION) && (eventParam->EventClass->EventDestination[i] != NULL); i++) {
\r
840 switch (eventParam->EventClass->EventDestination[i])
\r
842 case DEM_DTC_ORIGIN_PRIMARY_MEMORY:
\r
843 storeEventPriMem(eventParam, eventStatus);
\r
846 case DEM_DTC_ORIGIN_SECONDARY_MEMORY:
\r
847 case DEM_DTC_ORIGIN_PERMANENT_MEMORY:
\r
848 case DEM_DTC_ORIGIN_MIRROR_MEMORY:
\r
849 // Not yet supported
\r
850 #if (DEM_DEV_ERROR_DETECT == STD_ON)
\r
851 Det_ReportError(MODULE_ID_DEM, 0, DEM_GLOBAL_ID, DEM_E_NOT_IMPLEMENTED_YET);
\r
862 * Procedure: storeExtendedDataPriMem
\r
863 * Description: Store the extended data pointed by "extendedData" to the "priMemExtDataBuffer",
\r
864 * if non existent a new entry is created.
\r
866 static void storeExtendedDataPriMem(const Dem_EventParameterType *eventParam, ExtDataRecType *extendedData)
\r
869 imask_t state = McuE_EnterCriticalSection();
\r
871 // Check if already stored
\r
872 for (i = 0; (priMemExtDataBuffer[i].eventId != eventParam->EventID) && (i<DEM_MAX_NUMBER_EXT_DATA_PRI_MEM); i++);
\r
874 if (i < DEM_MAX_NUMBER_EXT_DATA_PRI_MEM) {
\r
875 // Yes, overwrite existing
\r
876 memcpy(&priMemExtDataBuffer[i], extendedData, sizeof(ExtDataRecType));
\r
879 // No, lookup first free position
\r
880 for (i = 0; (priMemExtDataBuffer[i].eventId != DEM_EVENT_ID_NULL) && (i < DEM_MAX_NUMBER_EXT_DATA_PRI_MEM); i++);
\r
881 if (i < DEM_MAX_NUMBER_EXT_DATA_PRI_MEM) {
\r
882 memcpy(&priMemExtDataBuffer[i], extendedData, sizeof(ExtDataRecType));
\r
885 // Error: Pri mem extended data buffer full
\r
886 #if (DEM_DEV_ERROR_DETECT == STD_ON)
\r
887 Det_ReportError(MODULE_ID_DEM, 0, DEM_STORE_EXT_DATA_PRI_MEM_ID, DEM_E_PRI_MEM_EXT_DATA_BUFF_FULL);
\r
892 McuE_ExitCriticalSection(state);
\r
897 * Procedure: deleteExtendedDataPriMem
\r
898 * Description: Delete the extended data of "eventParam->eventId" from "priMemExtDataBuffer".
\r
900 static void deleteExtendedDataPriMem(const Dem_EventParameterType *eventParam)
\r
903 imask_t state = McuE_EnterCriticalSection();
\r
905 // Check if already stored
\r
906 for (i = 0; (priMemExtDataBuffer[i].eventId != eventParam->EventID) && (i<DEM_MAX_NUMBER_EXT_DATA_PRI_MEM); i++);
\r
908 if (i < DEM_MAX_NUMBER_EXT_DATA_PRI_MEM) {
\r
909 // Yes, clear record
\r
910 memset(&priMemExtDataBuffer[i], 0, sizeof(ExtDataRecType));
\r
913 McuE_ExitCriticalSection(state);
\r
918 * Procedure: storeExtendedDataEvtMem
\r
919 * Description: Store the extended data in event memory according to
\r
920 * "eventParam" destination option
\r
922 static void storeExtendedDataEvtMem(const Dem_EventParameterType *eventParam, ExtDataRecType *extendedData)
\r
926 for (i = 0; (i < DEM_MAX_NR_OF_EVENT_DESTINATION) && (eventParam->EventClass->EventDestination[i] != NULL); i++) {
\r
927 switch (eventParam->EventClass->EventDestination[i])
\r
929 case DEM_DTC_ORIGIN_PRIMARY_MEMORY:
\r
930 storeExtendedDataPriMem(eventParam, extendedData);
\r
933 case DEM_DTC_ORIGIN_SECONDARY_MEMORY:
\r
934 case DEM_DTC_ORIGIN_PERMANENT_MEMORY:
\r
935 case DEM_DTC_ORIGIN_MIRROR_MEMORY:
\r
936 // Not yet supported
\r
937 #if (DEM_DEV_ERROR_DETECT == STD_ON)
\r
938 Det_ReportError(MODULE_ID_DEM, 0, DEM_GLOBAL_ID, DEM_E_NOT_IMPLEMENTED_YET);
\r
950 * Procedure: lookupExtendedDataRecNumParam
\r
951 * Description: Returns TRUE if the requested extended data number was found among the configured records for the event.
\r
952 * "extDataRecClassPtr" returns a pointer to the record class, "posInExtData" returns the position in stored extended data.
\r
954 static boolean lookupExtendedDataRecNumParam(uint8 extendedDataNumber, const Dem_EventParameterType *eventParam, Dem_ExtendedDataRecordClassType const **extDataRecClassPtr, uint8 *posInExtData)
\r
956 boolean recNumFound = FALSE;
\r
958 if (eventParam->ExtendedDataClassRef != NULL) {
\r
959 Dem_ExtendedDataRecordClassType const* const* extDataRecClassRefList = eventParam->ExtendedDataClassRef->ExtendedDataRecordClassRef;
\r
960 uint16 byteCnt = 0;
\r
963 // Request extended data and copy it to the buffer
\r
964 for (i = 0; (i < DEM_MAX_NR_OF_RECORDS_IN_EXTENDED_DATA) && (extDataRecClassRefList[i] != NULL) && !recNumFound; i++) {
\r
965 if (extDataRecClassRefList[i]->RecordNumber == extendedDataNumber) {
\r
966 *extDataRecClassPtr = extDataRecClassRefList[i];
\r
967 *posInExtData = byteCnt;
\r
968 recNumFound = TRUE;
\r
970 byteCnt += extDataRecClassRefList[i]->DataSize;
\r
974 return recNumFound;
\r
979 * Procedure: lookupExtendedDataPriMem
\r
980 * Description: Returns TRUE if the requested event id is found, "extData" points to the found data.
\r
982 static boolean lookupExtendedDataPriMem(Dem_EventIdType eventId, ExtDataRecType **extData)
\r
984 boolean eventIdFound = FALSE;
\r
987 // Lookup corresponding extended data
\r
988 for (i = 0; (priMemExtDataBuffer[i].eventId != eventId) && (i < DEM_MAX_NUMBER_EXT_DATA_PRI_MEM); i++);
\r
990 if (i < DEM_MAX_NUMBER_EXT_DATA_PRI_MEM) {
\r
991 // Yes, return pointer
\r
992 *extData = &priMemExtDataBuffer[i];
\r
993 eventIdFound = TRUE;
\r
996 return eventIdFound;
\r
1000 static void storeFreezeFrameDataPriMem(const Dem_EventParameterType *eventParam, FreezeFrameRecType *freezeFrame)
\r
1006 static void deleteFreezeFrameDataPriMem(const Dem_EventParameterType *eventParam)
\r
1013 * Procedure: storeFreezeFrameDataEvtMem
\r
1014 * Description: Store the freeze frame data in event memory according to
\r
1015 * "eventParam" destination option
\r
1017 static void storeFreezeFrameDataEvtMem(const Dem_EventParameterType *eventParam, FreezeFrameRecType *freezeFrame)
\r
1021 for (i = 0; (i < DEM_MAX_NR_OF_EVENT_DESTINATION) && (eventParam->EventClass->EventDestination[i] != NULL); i++) {
\r
1022 switch (eventParam->EventClass->EventDestination[i])
\r
1024 case DEM_DTC_ORIGIN_PRIMARY_MEMORY:
\r
1025 storeFreezeFrameDataPriMem(eventParam, freezeFrame);
\r
1028 case DEM_DTC_ORIGIN_SECONDARY_MEMORY:
\r
1029 case DEM_DTC_ORIGIN_PERMANENT_MEMORY:
\r
1030 case DEM_DTC_ORIGIN_MIRROR_MEMORY:
\r
1031 // Not yet supported
\r
1032 #if (DEM_DEV_ERROR_DETECT == STD_ON)
\r
1033 Det_ReportError(MODULE_ID_DEM, 0, DEM_GLOBAL_ID, DEM_E_NOT_IMPLEMENTED_YET);
\r
1044 * Procedure: handlePreInitEvent
\r
1045 * Description: Handle the updating of event status and storing of
\r
1046 * event related data in preInit buffers.
\r
1048 static void handlePreInitEvent(Dem_EventIdType eventId, Dem_EventStatusType eventStatus)
\r
1050 const Dem_EventParameterType *eventParam;
\r
1051 EventStatusRecType eventStatusLocal;
\r
1052 FreezeFrameRecType freezeFrameLocal;
\r
1053 ExtDataRecType extendedDataLocal;
\r
1055 // Find configuration for this event
\r
1056 lookupEventIdParameter(eventId, &eventParam);
\r
1057 if (eventParam != NULL) {
\r
1058 if (eventParam->EventClass->OperationCycleRef < DEM_OPERATION_CYCLE_ID_ENDMARK) {
\r
1059 if (operationCycleStateList[eventParam->EventClass->OperationCycleRef] == DEM_CYCLE_STATE_START) {
\r
1060 if (eventStatus == DEM_EVENT_STATUS_FAILED) {
\r
1061 updateEventStatusRec(eventParam, eventStatus, TRUE, &eventStatusLocal);
\r
1064 updateEventStatusRec(eventParam, eventStatus, FALSE, &eventStatusLocal);
\r
1067 if (eventStatusLocal.errorStatusChanged) {
\r
1069 if (eventStatusLocal.eventStatusExtended & DEM_TEST_FAILED) {
\r
1070 // Collect freeze frame data
\r
1071 getFreezeFrameData(eventParam, &freezeFrameLocal);
\r
1072 if (freezeFrameLocal.eventId != DEM_EVENT_ID_NULL) {
\r
1073 storeFreezeFrameDataPreInit(eventParam, &freezeFrameLocal);
\r
1076 // Collect extended data
\r
1077 getExtendedData(eventParam, &extendedDataLocal);
\r
1078 if (extendedDataLocal.eventId != DEM_EVENT_ID_NULL) {
\r
1079 storeExtendedDataPreInit(eventParam, &extendedDataLocal);
\r
1085 // Operation cycle not started
\r
1086 // TODO: Report error?
\r
1090 // Operation cycle not set
\r
1091 // TODO: Report error?
\r
1095 // Event ID not configured
\r
1096 // TODO: Report error?
\r
1102 * Procedure: handleEvent
\r
1103 * Description: Handle the updating of event status and storing of
\r
1104 * event related data in event memory.
\r
1106 static Std_ReturnType handleEvent(Dem_EventIdType eventId, Dem_EventStatusType eventStatus)
\r
1108 Std_ReturnType returnCode = E_OK;
\r
1109 const Dem_EventParameterType *eventParam;
\r
1110 EventStatusRecType eventStatusLocal;
\r
1111 FreezeFrameRecType freezeFrameLocal;
\r
1112 ExtDataRecType extendedDataLocal;
\r
1114 // Find configuration for this event
\r
1115 lookupEventIdParameter(eventId, &eventParam);
\r
1116 if (eventParam != NULL) {
\r
1117 if (eventParam->EventClass->OperationCycleRef < DEM_OPERATION_CYCLE_ID_ENDMARK) {
\r
1118 if (operationCycleStateList[eventParam->EventClass->OperationCycleRef] == DEM_CYCLE_STATE_START) {
\r
1119 if (!(disableDtcStorage.storageDisabled && checkDtcGroup(disableDtcStorage.dtcGroup, eventParam) && checkDtcKind(disableDtcStorage.dtcKind, eventParam))) {
\r
1120 updateEventStatusRec(eventParam, eventStatus, TRUE, &eventStatusLocal);
\r
1121 if (eventStatusLocal.errorStatusChanged) {
\r
1122 if (eventStatusLocal.eventStatusExtended & DEM_TEST_FAILED) {
\r
1123 storeEventEvtMem(eventParam, &eventStatusLocal);
\r
1124 // Collect freeze frame data
\r
1125 getFreezeFrameData(eventParam, &freezeFrameLocal);
\r
1126 if (freezeFrameLocal.eventId != DEM_EVENT_ID_NULL) {
\r
1127 storeFreezeFrameDataEvtMem(eventParam, &freezeFrameLocal);
\r
1130 // Collect extended data
\r
1131 getExtendedData(eventParam, &extendedDataLocal);
\r
1132 if (extendedDataLocal.eventId != DEM_EVENT_ID_NULL)
\r
1134 storeExtendedDataEvtMem(eventParam, &extendedDataLocal);
\r
1141 // Operation cycle not started
\r
1142 returnCode = E_NOT_OK;
\r
1146 // Operation cycle not set
\r
1147 returnCode = E_NOT_OK;
\r
1151 // Event ID not configured
\r
1152 returnCode = E_NOT_OK;
\r
1155 return returnCode;
\r
1160 * Procedure: resetEventStatus
\r
1161 * Description: Resets the events status of eventId.
\r
1163 static void resetEventStatus(Dem_EventIdType eventId)
\r
1165 imask_t state = McuE_EnterCriticalSection();
\r
1166 EventStatusRecType *eventStatusRecPtr;
\r
1168 lookupEventStatusRec(eventId, &eventStatusRecPtr);
\r
1169 if (eventStatusRecPtr != NULL) {
\r
1170 eventStatusRecPtr->eventStatusExtended &= ~DEM_TEST_FAILED;
\r
1173 McuE_ExitCriticalSection(state);
\r
1178 * Procedure: getEventStatus
\r
1179 * Description: Returns the extended event status bitmask of eventId in "eventStatusExtended".
\r
1181 static void getEventStatus(Dem_EventIdType eventId, Dem_EventStatusExtendedType *eventStatusExtended)
\r
1183 EventStatusRecType eventStatusLocal;
\r
1185 // Get recorded status
\r
1186 getEventStatusRec(eventId, &eventStatusLocal);
\r
1187 if (eventStatusLocal.eventId == eventId) {
\r
1188 *eventStatusExtended = eventStatusLocal.eventStatusExtended;
\r
1191 // Event Id not found, no report received.
\r
1192 *eventStatusExtended = DEM_TEST_NOT_COMPLETED_THIS_OPERATION_CYCLE | DEM_TEST_NOT_COMPLETED_SINCE_LAST_CLEAR;
\r
1198 * Procedure: getEventFailed
\r
1199 * Description: Returns the TRUE or FALSE of "eventId" in "eventFailed" depending on current status.
\r
1201 static void getEventFailed(Dem_EventIdType eventId, boolean *eventFailed)
\r
1203 EventStatusRecType eventStatusLocal;
\r
1205 // Get recorded status
\r
1206 getEventStatusRec(eventId, &eventStatusLocal);
\r
1207 if (eventStatusLocal.eventId == eventId) {
\r
1208 if (eventStatusLocal.eventStatusExtended & DEM_TEST_FAILED) {
\r
1209 *eventFailed = TRUE;
\r
1212 *eventFailed = FALSE;
\r
1216 // Event Id not found, assume ok.
\r
1217 *eventFailed = FALSE;
\r
1223 * Procedure: getEventTested
\r
1224 * Description: Returns the TRUE or FALSE of "eventId" in "eventTested" depending on
\r
1225 * current status the "test not completed this operation cycle" bit.
\r
1227 static void getEventTested(Dem_EventIdType eventId, boolean *eventTested)
\r
1229 EventStatusRecType eventStatusLocal;
\r
1231 // Get recorded status
\r
1232 getEventStatusRec(eventId, &eventStatusLocal);
\r
1233 if (eventStatusLocal.eventId == eventId) {
\r
1234 if ( !(eventStatusLocal.eventStatusExtended & DEM_TEST_NOT_COMPLETED_THIS_OPERATION_CYCLE)) {
\r
1235 *eventTested = TRUE;
\r
1238 *eventTested = FALSE;
\r
1242 // Event Id not found, not tested.
\r
1243 *eventTested = FALSE;
\r
1249 * Procedure: getFaultDetectionCounter
\r
1250 * Description: Returns pre debounce counter of "eventId" in "counter" and return value E_OK if
\r
1251 * the counter was available else E_NOT_OK.
\r
1253 static Std_ReturnType getFaultDetectionCounter(Dem_EventIdType eventId, sint8 *counter)
\r
1255 Std_ReturnType returnCode = E_NOT_OK;
\r
1256 const Dem_EventParameterType *eventParam;
\r
1258 lookupEventIdParameter(eventId, &eventParam);
\r
1259 if (eventParam != NULL) {
\r
1260 if (eventParam->EventClass->PreDebounceAlgorithmClass != NULL) {
\r
1261 switch (eventParam->EventClass->PreDebounceAlgorithmClass->PreDebounceName)
\r
1263 case DEM_NO_PRE_DEBOUNCE:
\r
1264 if (eventParam->EventClass->PreDebounceAlgorithmClass->PreDebounceAlgorithm.PreDebounceMonitorInternal != NULL) {
\r
1265 if (eventParam->EventClass->PreDebounceAlgorithmClass->PreDebounceAlgorithm.PreDebounceMonitorInternal->CallbackGetFDCntFnc != NULL) {
\r
1266 returnCode = eventParam->EventClass->PreDebounceAlgorithmClass->PreDebounceAlgorithm.PreDebounceMonitorInternal->CallbackGetFDCntFnc(counter);
\r
1271 case DEM_PRE_DEBOUNCE_COUNTER_BASED:
\r
1273 EventStatusRecType *eventStatusRec;
\r
1275 lookupEventStatusRec(eventId, &eventStatusRec);
\r
1276 if (eventStatusRec != NULL) {
\r
1277 *counter = eventStatusRec->faultDetectionCounter;
\r
1281 returnCode = E_OK;
\r
1285 case DEM_PRE_DEBOUNCE_FREQUENCY_BASED:
\r
1286 case DEM_PRE_DEBOUNCE_TIME_BASED:
\r
1287 #if (DEM_DEV_ERROR_DETECT == STD_ON)
\r
1288 Det_ReportError(MODULE_ID_DEM, 0, DEM_GETFAULTDETECTIONCOUNTER_ID, DEM_E_NOT_IMPLEMENTED_YET);
\r
1293 #if (DEM_DEV_ERROR_DETECT == STD_ON)
\r
1294 Det_ReportError(MODULE_ID_DEM, 0, DEM_GETFAULTDETECTIONCOUNTER_ID, DEM_E_PARAM_DATA);
\r
1301 return returnCode;
\r
1306 * Procedure: setOperationCycleState
\r
1307 * Description: Change the operation state of "operationCycleId" to "cycleState" and updates stored
\r
1308 * event connected to this cycle id.
\r
1309 * Returns E_OK if operation was successful else E_NOT_OK.
\r
1311 static Std_ReturnType setOperationCycleState(Dem_OperationCycleIdType operationCycleId, Dem_OperationCycleStateType cycleState)
\r
1314 Std_ReturnType returnCode = E_OK;
\r
1316 if (operationCycleId < DEM_OPERATION_CYCLE_ID_ENDMARK) {
\r
1317 switch (cycleState)
\r
1319 case DEM_CYCLE_STATE_START:
\r
1320 operationCycleStateList[operationCycleId] = cycleState;
\r
1321 // Lookup event ID
\r
1322 for (i = 0; i < DEM_MAX_NUMBER_EVENT; i++) {
\r
1323 if ((eventStatusBuffer[i].eventId != DEM_EVENT_ID_NULL) && (eventStatusBuffer[i].eventParamRef->EventClass->OperationCycleRef == operationCycleId)) {
\r
1324 eventStatusBuffer[i].eventStatusExtended &= ~DEM_TEST_FAILED_THIS_OPERATION_CYCLE;
\r
1325 eventStatusBuffer[i].eventStatusExtended |= DEM_TEST_NOT_COMPLETED_THIS_OPERATION_CYCLE;
\r
1330 case DEM_CYCLE_STATE_END:
\r
1331 operationCycleStateList[operationCycleId] = cycleState;
\r
1332 // Lookup event ID
\r
1333 for (i = 0; i < DEM_MAX_NUMBER_EVENT; i++) {
\r
1334 if ((eventStatusBuffer[i].eventId != DEM_EVENT_ID_NULL) && (eventStatusBuffer[i].eventParamRef->EventClass->OperationCycleRef == operationCycleId)) {
\r
1335 if (!(eventStatusBuffer[i].eventStatusExtended & DEM_TEST_FAILED_THIS_OPERATION_CYCLE) && !(eventStatusBuffer[i].eventStatusExtended & DEM_TEST_NOT_COMPLETED_THIS_OPERATION_CYCLE)) {
\r
1336 eventStatusBuffer[i].eventStatusExtended &= ~DEM_PENDING_DTC; // Clear pendingDTC bit
\r
1342 #if (DEM_DEV_ERROR_DETECT == STD_ON)
\r
1343 Det_ReportError(MODULE_ID_DEM, 0, DEM_SETOPERATIONCYCLESTATE_ID, DEM_E_PARAM_DATA);
\r
1345 returnCode = E_NOT_OK;
\r
1350 #if (DEM_DEV_ERROR_DETECT == STD_ON)
\r
1351 Det_ReportError(MODULE_ID_DEM, 0, DEM_SETOPERATIONCYCLESTATE_ID, DEM_E_PARAM_DATA);
\r
1353 returnCode = E_NOT_OK;
\r
1356 return returnCode;
\r
1360 //==============================================================================//
\r
1362 // E X T E R N A L F U N C T I O N S //
\r
1364 //==============================================================================//
\r
1366 /*********************************************
\r
1367 * Interface for upper layer modules (8.3.1) *
\r
1368 *********************************************/
\r
1371 * Procedure: Dem_GetVersionInfo
\r
1374 #if (DEM_VERSION_INFO_API == STD_ON)
\r
1375 void Dem_GetVersionInfo(Std_VersionInfoType *versionInfo) {
\r
1376 memcpy(versionInfo, &_Dem_VersionInfo, sizeof(Std_VersionInfoType));
\r
1378 #endif /* DEM_VERSION_INFO_API */
\r
1381 /***********************************************
\r
1382 * Interface ECU State Manager <-> DEM (8.3.2) *
\r
1383 ***********************************************/
\r
1386 * Procedure: Dem_PreInit
\r
1389 void Dem_PreInit(void)
\r
1393 if (DEM_Config.ConfigSet == NULL) {
\r
1394 #if (DEM_DEV_ERROR_DETECT == STD_ON)
\r
1395 Det_ReportError(MODULE_ID_DEM, 0, DEM_PREINIT_ID, DEM_E_CONFIG_PTR_INVALID);
\r
1399 configSet = DEM_Config.ConfigSet;
\r
1402 // Initializion of operation cycle states.
\r
1403 for (i = 0; i < DEM_OPERATION_CYCLE_ID_ENDMARK; i++) {
\r
1404 operationCycleStateList[i] = DEM_CYCLE_STATE_END;
\r
1407 // Initialize the event status buffer
\r
1408 for (i = 0; i < DEM_MAX_NUMBER_EVENT; i++) {
\r
1409 eventStatusBuffer[i].eventId = DEM_EVENT_ID_NULL;
\r
1410 eventStatusBuffer[i].eventParamRef = NULL;
\r
1411 eventStatusBuffer[i].faultDetectionCounter = 0;
\r
1412 eventStatusBuffer[i].occurrence = 0;
\r
1413 eventStatusBuffer[i].eventStatusExtended = DEM_TEST_NOT_COMPLETED_THIS_OPERATION_CYCLE | DEM_TEST_NOT_COMPLETED_SINCE_LAST_CLEAR;
\r
1414 eventStatusBuffer[i].errorStatusChanged = FALSE;
\r
1417 // Initialize the pre init buffers
\r
1418 for (i = 0; i < DEM_MAX_NUMBER_FF_DATA_PRE_INIT; i++) {
\r
1419 preInitFreezeFrameBuffer[i].checksum = 0;
\r
1420 preInitFreezeFrameBuffer[i].eventId = DEM_EVENT_ID_NULL;
\r
1421 preInitFreezeFrameBuffer[i].occurrence = 0;
\r
1422 preInitFreezeFrameBuffer[i].dataSize = 0;
\r
1423 for (j = 0; j < DEM_MAX_SIZE_FF_DATA;j++)
\r
1424 preInitFreezeFrameBuffer[i].data[j] = 0;
\r
1427 for (i = 0; i < DEM_MAX_NUMBER_EXT_DATA_PRE_INIT; i++) {
\r
1428 preInitExtDataBuffer[i].checksum = 0;
\r
1429 preInitExtDataBuffer[i].eventId = DEM_EVENT_ID_NULL;
\r
1430 preInitExtDataBuffer[i].dataSize = 0;
\r
1431 for (j = 0; j < DEM_MAX_SIZE_EXT_DATA;j++)
\r
1432 preInitExtDataBuffer[i].data[j] = 0;
\r
1435 disableDtcStorage.storageDisabled = FALSE;
\r
1437 setOperationCycleState(DEM_ACTIVE, DEM_CYCLE_STATE_START);
\r
1439 demState = DEM_PREINITIALIZED;
\r
1444 * Procedure: Dem_Init
\r
1447 void Dem_Init(void)
\r
1450 ChecksumType cSum;
\r
1451 const Dem_EventParameterType *eventParam;
\r
1454 * Validate and read out saved error log from non volatile memory
\r
1457 // Validate event records stored in primary memory
\r
1458 for (i = 0; i < DEM_MAX_NUMBER_EVENT_PRI_MEM; i++) {
\r
1459 cSum = calcChecksum(&priMemEventBuffer[i], sizeof(EventRecType)-sizeof(ChecksumType));
\r
1460 if ((cSum != priMemEventBuffer[i].checksum) || priMemEventBuffer[i].eventId == DEM_EVENT_ID_NULL) {
\r
1461 // Unlegal record, clear the record
\r
1462 memset(&priMemEventBuffer[i], 0, sizeof(EventRecType));
\r
1465 // Valid, update current status
\r
1466 mergeEventStatusRec(&priMemEventBuffer[i]);
\r
1468 // Update occurrence counter on pre init stored freeze frames
\r
1469 updateFreezeFrameOccurrencePreInit(&priMemEventBuffer[i]);
\r
1473 // Validate extended data records stored in primary memory
\r
1474 for (i = 0; i < DEM_MAX_NUMBER_EXT_DATA_PRI_MEM; i++) {
\r
1475 cSum = calcChecksum(&priMemExtDataBuffer[i], sizeof(ExtDataRecType)-sizeof(ChecksumType));
\r
1476 if ((cSum != priMemExtDataBuffer[i].checksum) || priMemExtDataBuffer[i].eventId == DEM_EVENT_ID_NULL) {
\r
1477 // Unlegal record, clear the record
\r
1478 memset(&priMemExtDataBuffer[i], 0, sizeof(ExtDataRecType));
\r
1482 // Validate freeze frame records stored in primary memory
\r
1483 for (i = 0; i < DEM_MAX_NUMBER_FF_DATA_PRI_MEM; i++) {
\r
1484 cSum = calcChecksum(&priMemFreezeFrameBuffer[i], sizeof(FreezeFrameRecType)-sizeof(ChecksumType));
\r
1485 if ((cSum != priMemFreezeFrameBuffer[i].checksum) || (priMemFreezeFrameBuffer[i].eventId == DEM_EVENT_ID_NULL)) {
\r
1486 // Unlegal record, clear the record
\r
1487 memset(&priMemFreezeFrameBuffer[i], 0, sizeof(FreezeFrameRecType));
\r
1492 * Handle errors stored in temporary buffer (if any)
\r
1495 // Transfer updated event data to event memory
\r
1496 for (i = 0; i < DEM_MAX_NUMBER_EVENT; i++) {
\r
1497 if (eventStatusBuffer[i].eventId != DEM_EVENT_ID_NULL) {
\r
1498 // Update the event memory
\r
1499 lookupEventIdParameter(eventStatusBuffer[i].eventId, &eventParam);
\r
1500 storeEventEvtMem(eventParam, &eventStatusBuffer[i]);
\r
1504 // Transfer extended data to event memory if necessary
\r
1505 for (i = 0; i < DEM_MAX_NUMBER_EXT_DATA_PRE_INIT; i++) {
\r
1506 if (preInitExtDataBuffer[i].eventId != DEM_EVENT_ID_NULL) {
\r
1507 lookupEventIdParameter(preInitExtDataBuffer[i].eventId, &eventParam);
\r
1508 storeExtendedDataEvtMem(eventParam, &preInitExtDataBuffer[i]);
\r
1512 // Transfer freeze frames to event memory
\r
1513 for (i = 0; i < DEM_MAX_NUMBER_FF_DATA_PRE_INIT; i++) {
\r
1514 if (preInitFreezeFrameBuffer[i].eventId != DEM_EVENT_ID_NULL) {
\r
1515 lookupEventIdParameter(preInitFreezeFrameBuffer[i].eventId, &eventParam);
\r
1516 storeFreezeFrameDataEvtMem(eventParam, &preInitFreezeFrameBuffer[i]);
\r
1520 // Init the dtc filter
\r
1521 dtcFilter.dtcStatusMask = DEM_DTC_STATUS_MASK_ALL; // All allowed
\r
1522 dtcFilter.dtcKind = DEM_DTC_KIND_ALL_DTCS; // All kinds of DTCs
\r
1523 dtcFilter.dtcOrigin = DEM_DTC_ORIGIN_PRIMARY_MEMORY; // Primary memory
\r
1524 dtcFilter.filterWithSeverity = DEM_FILTER_WITH_SEVERITY_NO; // No Severity filtering
\r
1525 dtcFilter.dtcSeverityMask = DEM_SEVERITY_NO_SEVERITY; // Not used when filterWithSeverity is FALSE
\r
1526 dtcFilter.filterForFaultDetectionCounter = DEM_FILTER_FOR_FDC_NO; // No fault detection counter filtering
\r
1528 dtcFilter.faultIndex = DEM_MAX_NUMBER_EVENT;
\r
1530 disableDtcStorage.storageDisabled = FALSE;
\r
1532 demState = DEM_INITIALIZED;
\r
1537 * Procedure: Dem_shutdown
\r
1540 void Dem_Shutdown(void)
\r
1542 setOperationCycleState(DEM_ACTIVE, DEM_CYCLE_STATE_END);
\r
1544 demState = DEM_UNINITIALIZED;
\r
1549 * Interface for basic software scheduler
\r
1551 void Dem_MainFunction(void)
\r
1557 /***************************************************
\r
1558 * Interface SW-Components via RTE <-> DEM (8.3.3) *
\r
1559 ***************************************************/
\r
1562 * Procedure: Dem_SetEventStatus
\r
1565 Std_ReturnType Dem_SetEventStatus(Dem_EventIdType eventId, Dem_EventStatusType eventStatus)
\r
1567 Std_ReturnType returnCode = E_OK;
\r
1569 if (demState == DEM_INITIALIZED) // No action is taken if the module is not started
\r
1571 returnCode = handleEvent(eventId, eventStatus);
\r
1575 #if (DEM_DEV_ERROR_DETECT == STD_ON)
\r
1576 Det_ReportError(MODULE_ID_DEM, 0, DEM_SETEVENTSTATUS_ID, DEM_E_UNINIT);
\r
1578 returnCode = E_NOT_OK;
\r
1581 return returnCode;
\r
1586 * Procedure: Dem_ResetEventStatus
\r
1589 Std_ReturnType Dem_ResetEventStatus(Dem_EventIdType eventId)
\r
1591 Std_ReturnType returnCode = E_OK;
\r
1593 if (demState == DEM_INITIALIZED) // No action is taken if the module is not started
\r
1595 resetEventStatus(eventId);
\r
1599 #if (DEM_DEV_ERROR_DETECT == STD_ON)
\r
1600 Det_ReportError(MODULE_ID_DEM, 0, DEM_RESETEVENTSTATUS_ID, DEM_E_UNINIT);
\r
1602 returnCode = E_NOT_OK;
\r
1605 return returnCode;
\r
1610 * Procedure: Dem_GetEventStatus
\r
1613 Std_ReturnType Dem_GetEventStatus(Dem_EventIdType eventId, Dem_EventStatusExtendedType *eventStatusExtended)
\r
1615 Std_ReturnType returnCode = E_OK;
\r
1617 if (demState == DEM_INITIALIZED) // No action is taken if the module is not started
\r
1619 getEventStatus(eventId, eventStatusExtended);
\r
1623 #if (DEM_DEV_ERROR_DETECT == STD_ON)
\r
1624 Det_ReportError(MODULE_ID_DEM, 0, DEM_GETEVENTSTATUS_ID, DEM_E_UNINIT);
\r
1626 returnCode = E_NOT_OK;
\r
1629 return returnCode;
\r
1634 * Procedure: Dem_GetEventFailed
\r
1637 Std_ReturnType Dem_GetEventFailed(Dem_EventIdType eventId, boolean *eventFailed)
\r
1639 Std_ReturnType returnCode = E_OK;
\r
1641 if (demState == DEM_INITIALIZED) // No action is taken if the module is not started
\r
1643 getEventFailed(eventId, eventFailed);
\r
1647 #if (DEM_DEV_ERROR_DETECT == STD_ON)
\r
1648 Det_ReportError(MODULE_ID_DEM, 0, DEM_GETEVENTFAILED_ID, DEM_E_UNINIT);
\r
1650 returnCode = E_NOT_OK;
\r
1653 return returnCode;
\r
1658 * Procedure: Dem_GetEventTested
\r
1661 Std_ReturnType Dem_GetEventTested(Dem_EventIdType eventId, boolean *eventTested)
\r
1663 Std_ReturnType returnCode = E_OK;
\r
1665 if (demState == DEM_INITIALIZED) // No action is taken if the module is not started
\r
1667 getEventTested(eventId, eventTested);
\r
1671 #if (DEM_DEV_ERROR_DETECT == STD_ON)
\r
1672 Det_ReportError(MODULE_ID_DEM, 0, DEM_GETEVENTTESTED_ID, DEM_E_UNINIT);
\r
1674 returnCode = E_NOT_OK;
\r
1677 return returnCode;
\r
1682 * Procedure: Dem_GetFaultDetectionCounter
\r
1685 Std_ReturnType Dem_GetFaultDetectionCounter(Dem_EventIdType eventId, sint8 *counter)
\r
1687 Std_ReturnType returnCode = E_OK;
\r
1689 if (demState == DEM_INITIALIZED) // No action is taken if the module is not started
\r
1691 returnCode = getFaultDetectionCounter(eventId, counter);
\r
1695 #if (DEM_DEV_ERROR_DETECT == STD_ON)
\r
1696 Det_ReportError(MODULE_ID_DEM, 0, DEM_GETFAULTDETECTIONCOUNTER_ID, DEM_E_UNINIT);
\r
1698 returnCode = E_NOT_OK;
\r
1701 return returnCode;
\r
1706 * Procedure: Dem_SetOperationCycleState
\r
1709 Std_ReturnType Dem_SetOperationCycleState(Dem_OperationCycleIdType operationCycleId, Dem_OperationCycleStateType cycleState)
\r
1711 Std_ReturnType returnCode = E_OK;
\r
1713 if (demState == DEM_INITIALIZED) // No action is taken if the module is not started
\r
1715 returnCode = setOperationCycleState(operationCycleId, cycleState);
\r
1720 #if (DEM_DEV_ERROR_DETECT == STD_ON)
\r
1721 Det_ReportError(MODULE_ID_DEM, 0, DEM_SETOPERATIONCYCLESTATE_ID, DEM_E_UNINIT);
\r
1723 returnCode = E_NOT_OK;
\r
1726 return returnCode;
\r
1731 * Procedure: Dem_GetDTCOfEvent
\r
1734 Std_ReturnType Dem_GetDTCOfEvent(Dem_EventIdType eventId, Dem_DTCKindType dtcKind, uint32* dtcOfEvent)
\r
1736 Std_ReturnType returnCode = E_NO_DTC_AVAILABLE;
\r
1737 const Dem_EventParameterType *eventParam;
\r
1739 lookupEventIdParameter(eventId, &eventParam);
\r
1741 if (eventParam != NULL) {
\r
1742 if (checkDtcKind(dtcKind, eventParam)) {
\r
1743 if (eventParam->DTCClassRef != NULL) {
\r
1744 *dtcOfEvent = eventParam->DTCClassRef->DTC;
\r
1745 returnCode = E_OK;
\r
1750 // Event Id not found
\r
1751 returnCode = E_NOT_OK;
\r
1754 return returnCode;
\r
1758 /********************************************
\r
1759 * Interface BSW-Components <-> DEM (8.3.4) *
\r
1760 ********************************************/
\r
1763 * Procedure: Dem_ReportErrorStatus
\r
1766 void Dem_ReportErrorStatus( Dem_EventIdType eventId, Dem_EventStatusType eventStatus )
\r
1769 switch (demState) {
\r
1770 case DEM_PREINITIALIZED:
\r
1771 // Update status and check if is to be stored
\r
1772 if ((eventStatus == DEM_EVENT_STATUS_PASSED) || (eventStatus == DEM_EVENT_STATUS_FAILED)) {
\r
1773 handlePreInitEvent(eventId, eventStatus);
\r
1777 case DEM_INITIALIZED:
\r
1778 (void)handleEvent(eventId, eventStatus);
\r
1781 case DEM_UNINITIALIZED:
\r
1783 // Uninitialized can not do anything
\r
1784 #if (DEM_DEV_ERROR_DETECT == STD_ON)
\r
1785 Det_ReportError(MODULE_ID_DEM, 0, DEM_REPORTERRORSTATUS_ID, DEM_E_UNINIT);
\r
1789 } // switch (demState)
\r
1792 /*********************************
\r
1793 * Interface DCM <-> DEM (8.3.5) *
\r
1794 *********************************/
\r
1796 * Procedure: Dem_GetDTCStatusAvailabilityMask
\r
1799 Std_ReturnType Dem_GetDTCStatusAvailabilityMask(uint8 *dtcStatusMask)
\r
1801 *dtcStatusMask = DEM_DTC_STATUS_AVAILABILITY_MASK; // User configuration mask
\r
1802 *dtcStatusMask &= DEM_TEST_FAILED // Mask with supported bits
\r
1803 | DEM_TEST_FAILED_THIS_OPERATION_CYCLE
\r
1805 // | DEM_CONFIRMED_DTC TODO: Add support for this bit
\r
1806 | DEM_TEST_NOT_COMPLETED_SINCE_LAST_CLEAR
\r
1807 | DEM_TEST_FAILED_SINCE_LAST_CLEAR
\r
1808 | DEM_TEST_NOT_COMPLETED_THIS_OPERATION_CYCLE
\r
1809 // | DEM_WARNING_INDICATOR_REQUESTED TODO: Add support for this bit
\r
1817 * Procedure: Dem_SetDTCFilter
\r
1820 Dem_ReturnSetDTCFilterType Dem_SetDTCFilter(uint8 dtcStatusMask,
\r
1821 Dem_DTCKindType dtcKind,
\r
1822 Dem_DTCOriginType dtcOrigin,
\r
1823 Dem_FilterWithSeverityType filterWithSeverity,
\r
1824 Dem_DTCSeverityType dtcSeverityMask,
\r
1825 Dem_FilterForFDCType filterForFaultDetectionCounter) {
\r
1827 Dem_ReturnSetDTCFilterType returnCode = DEM_WRONG_FILTER;
\r
1829 // Check dtcKind parameter
\r
1830 if ((dtcKind == DEM_DTC_KIND_ALL_DTCS) || (dtcKind == DEM_DTC_KIND_EMISSION_REL_DTCS)) {
\r
1832 // Check dtcOrigin parameter
\r
1833 if ((dtcOrigin == DEM_DTC_ORIGIN_SECONDARY_MEMORY) || (dtcOrigin == DEM_DTC_ORIGIN_PRIMARY_MEMORY)
\r
1834 || (dtcOrigin == DEM_DTC_ORIGIN_PERMANENT_MEMORY) || (dtcOrigin == DEM_DTC_ORIGIN_MIRROR_MEMORY)) {
\r
1836 // Check filterWithSeverity and dtcSeverityMask parameter
\r
1837 if ((filterWithSeverity == DEM_FILTER_WITH_SEVERITY_NO)
\r
1838 || ((filterWithSeverity == DEM_FILTER_WITH_SEVERITY_YES) && !(dtcSeverityMask & ~(DEM_SEVERITY_MAINTENANCE_ONLY | DEM_SEVERITY_CHECK_AT_NEXT_FALT | DEM_SEVERITY_CHECK_IMMEDIATELY)))){
\r
1840 // Check filterForFaultDetectionCounter parameter
\r
1841 if ((filterForFaultDetectionCounter == DEM_FILTER_FOR_FDC_YES) || (filterForFaultDetectionCounter == DEM_FILTER_FOR_FDC_NO)) {
\r
1842 // Yes all parameters correct, set the new filters.
\r
1843 dtcFilter.dtcStatusMask = dtcStatusMask;
\r
1844 dtcFilter.dtcKind = dtcKind;
\r
1845 dtcFilter.dtcOrigin = dtcOrigin;
\r
1846 dtcFilter.filterWithSeverity = filterWithSeverity;
\r
1847 dtcFilter.dtcSeverityMask = dtcSeverityMask;
\r
1848 dtcFilter.filterForFaultDetectionCounter = filterForFaultDetectionCounter;
\r
1849 dtcFilter.faultIndex = DEM_MAX_NUMBER_EVENT;
\r
1850 returnCode = DEM_FILTER_ACCEPTED;
\r
1856 return returnCode;
\r
1861 * Procedure: Dem_GetStatusOfDTC
\r
1864 Dem_ReturnGetStatusOfDTCType Dem_GetStatusOfDTC(uint32 dtc, Dem_DTCKindType dtcKind, Dem_DTCOriginType dtcOrigin, Dem_EventStatusExtendedType* status) {
\r
1865 Dem_ReturnGetStatusOfDTCType returnCode = DEM_STATUS_FAILED;
\r
1866 EventStatusRecType *eventRec;
\r
1868 if (lookupDtcEvent(dtc, &eventRec)) {
\r
1869 if (checkDtcKind(dtcKind, eventRec->eventParamRef)) {
\r
1870 if (checkDtcOrigin(dtcOrigin,eventRec->eventParamRef)) {
\r
1871 *status = eventRec->eventStatusExtended;
\r
1872 returnCode = DEM_STATUS_OK;
\r
1875 returnCode = DEM_STATUS_WRONG_DTCORIGIN;
\r
1879 returnCode = DEM_STATUS_WRONG_DTCKIND;
\r
1883 returnCode = DEM_STATUS_WRONG_DTC;
\r
1886 return returnCode;
\r
1891 * Procedure: Dem_GetNumberOfFilteredDtc
\r
1894 Dem_ReturnGetNumberOfFilteredDTCType Dem_GetNumberOfFilteredDtc(uint16 *numberOfFilteredDTC) {
\r
1896 uint16 numberOfFaults = 0;
\r
1898 //Dem_DisableEventStatusUpdate();
\r
1900 for (i = 0; i < DEM_MAX_NUMBER_EVENT; i++) {
\r
1901 if (eventStatusBuffer[i].eventId != DEM_EVENT_ID_NULL) {
\r
1902 if (matchEventWithDtcFilter(&eventStatusBuffer[i])) {
\r
1903 if (eventStatusBuffer[i].eventParamRef->DTCClassRef != NULL) {
\r
1910 //Dem_EnableEventStatusUpdate();
\r
1912 *numberOfFilteredDTC = numberOfFaults;
\r
1914 return DEM_NUMBER_OK;
\r
1919 * Procedure: Dem_GetNextFilteredDTC
\r
1922 Dem_ReturnGetNextFilteredDTCType Dem_GetNextFilteredDTC(uint32 *dtc, Dem_EventStatusExtendedType *dtcStatus)
\r
1924 Dem_ReturnGetNextFilteredDTCType returnCode = DEM_FILTERED_OK;
\r
1925 boolean dtcFound = FALSE;
\r
1927 // TODO: This job should be done in an more advanced way according to Dem288
\r
1928 while (!dtcFound && (dtcFilter.faultIndex != 0)) {
\r
1929 dtcFilter.faultIndex--;
\r
1930 if (eventStatusBuffer[dtcFilter.faultIndex].eventId != DEM_EVENT_ID_NULL) {
\r
1931 if (matchEventWithDtcFilter(&eventStatusBuffer[dtcFilter.faultIndex])) {
\r
1932 if (eventStatusBuffer[dtcFilter.faultIndex].eventParamRef->DTCClassRef != NULL) {
\r
1933 *dtc = eventStatusBuffer[dtcFilter.faultIndex].eventParamRef->DTCClassRef->DTC;
\r
1934 *dtcStatus = eventStatusBuffer[dtcFilter.faultIndex].eventStatusExtended;
\r
1942 dtcFilter.faultIndex = DEM_MAX_NUMBER_EVENT;
\r
1943 returnCode = DEM_FILTERED_NO_MATCHING_DTC;
\r
1946 return returnCode;
\r
1951 * Procedure: Dem_GetTranslationType
\r
1954 Dem_ReturnTypeOfDtcSupportedType Dem_GetTranslationType(void)
\r
1956 return DEM_TYPE_OF_DTC_SUPPORTED;
\r
1961 * Procedure: Dem_ClearDTC
\r
1964 Dem_ReturnClearDTCType Dem_ClearDTC(uint32 dtc, Dem_DTCKindType dtcKind, Dem_DTCOriginType dtcOrigin)
\r
1966 Dem_ReturnClearDTCType returnCode = DEM_CLEAR_OK;
\r
1967 Dem_EventIdType eventId;
\r
1968 const Dem_EventParameterType *eventParam;
\r
1971 // Loop through the event buffer
\r
1972 for (i = 0; i < DEM_MAX_NUMBER_EVENT; i++) {
\r
1973 eventId = eventStatusBuffer[i].eventId;
\r
1974 if (eventId != DEM_EVENT_ID_NULL) {
\r
1975 eventParam = eventStatusBuffer[i].eventParamRef;
\r
1976 if (eventParam != NULL) {
\r
1977 if (DEM_CLEAR_ALL_EVENTS | (eventParam->DTCClassRef != NULL)) {
\r
1978 if (checkDtcKind(dtcKind, eventParam)) {
\r
1979 if (checkDtcGroup(dtc, eventParam)) {
\r
1980 for (j = 0; (j < DEM_MAX_NR_OF_EVENT_DESTINATION) && (eventParam->EventClass->EventDestination[j] != dtcOrigin); j++);
\r
1981 if (j < DEM_MAX_NR_OF_EVENT_DESTINATION) {
\r
1982 // Yes! All conditions met.
\r
1983 switch (dtcOrigin)
\r
1985 case DEM_DTC_ORIGIN_PRIMARY_MEMORY:
\r
1986 deleteEventPriMem(eventParam);
\r
1987 deleteFreezeFrameDataPriMem(eventParam);
\r
1988 deleteExtendedDataPriMem(eventParam);
\r
1989 deleteEventStatusRec(eventParam); // TODO: Shall this be done or just resetting the status?
\r
1992 case DEM_DTC_ORIGIN_SECONDARY_MEMORY:
\r
1993 case DEM_DTC_ORIGIN_PERMANENT_MEMORY:
\r
1994 case DEM_DTC_ORIGIN_MIRROR_MEMORY:
\r
1995 // Not yet supported
\r
1996 returnCode = DEM_CLEAR_WRONG_DTCORIGIN;
\r
1997 #if (DEM_DEV_ERROR_DETECT == STD_ON)
\r
1998 Det_ReportError(MODULE_ID_DEM, 0, DEM_CLEARDTC_ID, DEM_E_NOT_IMPLEMENTED_YET);
\r
2002 returnCode = DEM_CLEAR_WRONG_DTCORIGIN;
\r
2011 // Fatal error, no event parameters found for the stored event!
\r
2012 #if (DEM_DEV_ERROR_DETECT == STD_ON)
\r
2013 Det_ReportError(MODULE_ID_DEM, 0, DEM_CLEARDTC_ID, DEM_E_UNEXPECTED_EXECUTION);
\r
2019 return returnCode;
\r
2024 * Procedure: Dem_DisableDTCStorage
\r
2027 Dem_ReturnControlDTCStorageType Dem_DisableDTCStorage(Dem_DTCGroupType dtcGroup, Dem_DTCKindType dtcKind)
\r
2029 Dem_ReturnControlDTCStorageType returnCode = DEM_CONTROL_DTC_STORAGE_N_OK;
\r
2031 // Check dtcGroup parameter
\r
2032 if (dtcGroup == DEM_DTC_GROUP_ALL_DTCS) {
\r
2033 // Check dtcKind parameter
\r
2034 if ((dtcKind == DEM_DTC_KIND_ALL_DTCS) || (dtcKind == DEM_DTC_KIND_EMISSION_REL_DTCS)) {
\r
2035 disableDtcStorage.dtcGroup = dtcGroup;
\r
2036 disableDtcStorage.dtcKind = dtcKind;
\r
2037 disableDtcStorage.storageDisabled = TRUE;
\r
2039 returnCode = DEM_CONTROL_DTC_STORAGE_OK;
\r
2043 returnCode = DEM_CONTROL_DTC_WRONG_DTCGROUP;
\r
2046 return returnCode;
\r
2051 * Procedure: Dem_EnableDTCStorage
\r
2054 Dem_ReturnControlDTCStorageType Dem_EnableDTCStorage(Dem_DTCGroupType dtcGroup, Dem_DTCKindType dtcKind)
\r
2056 // TODO: Behavior is not defined if group or kind do not match active settings, therefore the filter is just switched off.
\r
2057 disableDtcStorage.storageDisabled = FALSE;
\r
2059 return DEM_CONTROL_DTC_STORAGE_OK;
\r
2063 * Procedure: Dem_GetExtendedDataRecordByDTC
\r
2066 Dem_ReturnGetExtendedDataRecordByDTCType Dem_GetExtendedDataRecordByDTC(uint32 dtc, Dem_DTCKindType dtcKind, Dem_DTCOriginType dtcOrigin, uint8 extendedDataNumber, uint8 *destBuffer, uint8 *bufSize)
\r
2068 Dem_ReturnGetExtendedDataRecordByDTCType returnCode = DEM_RECORD_WRONG_DTC;
\r
2069 EventStatusRecType *eventRec;
\r
2070 Dem_ExtendedDataRecordClassType const *extendedDataRecordClass = NULL;
\r
2071 ExtDataRecType *extData;
\r
2072 uint8 posInExtData = 0;
\r
2074 if (lookupDtcEvent(dtc, &eventRec)) {
\r
2075 if (checkDtcKind(dtcKind, eventRec->eventParamRef)) {
\r
2076 if (checkDtcOrigin(dtcOrigin, eventRec->eventParamRef)) {
\r
2077 if (lookupExtendedDataRecNumParam(extendedDataNumber, eventRec->eventParamRef, &extendedDataRecordClass, &posInExtData)) {
\r
2078 if (*bufSize >= extendedDataRecordClass->DataSize) {
\r
2079 switch (dtcOrigin)
\r
2081 case DEM_DTC_ORIGIN_PRIMARY_MEMORY:
\r
2082 if (lookupExtendedDataPriMem(eventRec->eventId, &extData)) {
\r
2083 // Yes all conditions met, copy the extended data record to destination buffer.
\r
2084 memcpy(destBuffer, &extData->data[posInExtData], extendedDataRecordClass->DataSize);
\r
2085 *bufSize = extendedDataRecordClass->DataSize;
\r
2086 returnCode = DEM_RECORD_OK;
\r
2089 // The record number is legal but no record was found for the DTC
\r
2091 returnCode = DEM_RECORD_OK;
\r
2095 case DEM_DTC_ORIGIN_SECONDARY_MEMORY:
\r
2096 case DEM_DTC_ORIGIN_PERMANENT_MEMORY:
\r
2097 case DEM_DTC_ORIGIN_MIRROR_MEMORY:
\r
2098 // Not yet supported
\r
2099 returnCode = DEM_RECORD_WRONG_DTCORIGIN;
\r
2100 #if (DEM_DEV_ERROR_DETECT == STD_ON)
\r
2101 Det_ReportError(MODULE_ID_DEM, 0, DEM_GETEXTENDEDDATARECORDBYDTC_ID, DEM_E_NOT_IMPLEMENTED_YET);
\r
2105 returnCode = DEM_RECORD_WRONG_DTCORIGIN;
\r
2110 returnCode = DEM_RECORD_BUFFERSIZE;
\r
2114 returnCode = DEM_RECORD_NUMBER;
\r
2118 returnCode = DEM_RECORD_WRONG_DTCORIGIN;
\r
2122 returnCode = DEM_RECORD_DTCKIND;
\r
2126 return returnCode;
\r
2131 * Procedure: Dem_GetSizeOfExtendedDataRecordByDTC
\r
2134 Dem_ReturnGetSizeOfExtendedDataRecordByDTCType Dem_GetSizeOfExtendedDataRecordByDTC(uint32 dtc, Dem_DTCKindType dtcKind, Dem_DTCOriginType dtcOrigin, uint8 extendedDataNumber, uint16 *sizeOfExtendedDataRecord)
\r
2136 Dem_ReturnGetExtendedDataRecordByDTCType returnCode = DEM_GET_SIZEOFEDRBYDTC_W_DTC;
\r
2137 EventStatusRecType *eventRec;
\r
2138 Dem_ExtendedDataRecordClassType const *extendedDataRecordClass = NULL;
\r
2139 uint8 posInExtData;
\r
2141 if (lookupDtcEvent(dtc, &eventRec)) {
\r
2142 if (checkDtcKind(dtcKind, eventRec->eventParamRef)) {
\r
2143 if (checkDtcOrigin(dtcOrigin, eventRec->eventParamRef)) {
\r
2144 if (lookupExtendedDataRecNumParam(extendedDataNumber, eventRec->eventParamRef, &extendedDataRecordClass, &posInExtData)) {
\r
2145 *sizeOfExtendedDataRecord = extendedDataRecordClass->DataSize;
\r
2146 returnCode = DEM_GET_SIZEOFEDRBYDTC_OK;
\r
2149 returnCode = DEM_GET_SIZEOFEDRBYDTC_W_RNUM;
\r
2153 returnCode = DEM_GET_SIZEOFEDRBYDTC_W_DTCOR;
\r
2157 returnCode = DEM_GET_SIZEOFEDRBYDTC_W_DTCKI;
\r
2161 return returnCode;
\r
2164 /***********************************
\r
2165 * OBD-specific Interfaces (8.3.6) *
\r
2166 ***********************************/
\r