#include "MemMap.h"\r
#include "Mcu.h"\r
\r
+/*\r
+ * Local defines\r
+ */\r
+#define DEBOUNCE_FDC_TEST_FAILED 127\r
+#define DEBOUNCE_FDC_TEST_PASSED -128\r
+\r
/*\r
* Local types\r
*/\r
typedef struct {\r
Dem_EventIdType eventId;\r
const Dem_EventParameterType *eventParamRef;\r
+ sint8 faultDetectionCounter;\r
uint16 occurrence;\r
- Dem_EventStatusType eventStatus;\r
- boolean eventStatusChanged;\r
Dem_EventStatusExtendedType eventStatusExtended;\r
+ boolean errorStatusChanged;\r
} EventStatusRecType;\r
\r
\r
DEM_INITIALIZED\r
} Dem_StateType;\r
\r
+\r
static Dem_StateType demState = DEM_UNINITIALIZED;\r
\r
// Help pointer to configuration set\r
}\r
}\r
\r
+\r
+/*\r
+ * Procedure: PreDebounceNone\r
+ * Description: Returns the result of the debouncing.\r
+ */\r
+Dem_EventStatusType PreDebounceNone(Dem_EventStatusType reportedStatus, EventStatusRecType* statusRecord) {\r
+ Dem_EventStatusType returnCode;\r
+\r
+ switch (reportedStatus) {\r
+ case DEM_EVENT_STATUS_FAILED:\r
+ case DEM_EVENT_STATUS_PASSED:\r
+ // Already debounced, do nothing.\r
+ break;\r
+\r
+ default:\r
+ // TODO: What to do with PREFAIL and PREPASSED on no debouncing?\r
+#if (DEM_DEV_ERROR_DETECT == STD_ON)\r
+ Det_ReportError(MODULE_ID_DEM, 0, DEM_PREDEBOUNCE_NONE_ID, DEM_E_PARAM_DATA);\r
+#endif\r
+ break;\r
+ }\r
+\r
+ returnCode = reportedStatus;\r
+ return returnCode;\r
+}\r
+\r
+\r
+/*\r
+ * Procedure: PreDebounceCounterBased\r
+ * Description: Returns the result of the debouncing.\r
+ */\r
+Dem_EventStatusType PreDebounceCounterBased(Dem_EventStatusType reportedStatus, EventStatusRecType* statusRecord) {\r
+ Dem_EventStatusType returnCode;\r
+ const Dem_PreDebounceCounterBasedType* pdVars = statusRecord->eventParamRef->EventClass->PreDebounceAlgorithmClass->PreDebounceAlgorithm.PreDebounceCounterBased;\r
+\r
+ switch (reportedStatus) {\r
+ case DEM_EVENT_STATUS_PREFAILED:\r
+ if (statusRecord->faultDetectionCounter < DEBOUNCE_FDC_TEST_FAILED) {\r
+ if (pdVars->JumpUp && (statusRecord->faultDetectionCounter < 0)) {\r
+ statusRecord->faultDetectionCounter = 0;\r
+ } else {\r
+ if (((sint16)statusRecord->faultDetectionCounter + pdVars->CountInStepSize) < DEBOUNCE_FDC_TEST_FAILED) {\r
+ statusRecord->faultDetectionCounter += pdVars->CountInStepSize;\r
+ } else {\r
+ statusRecord->faultDetectionCounter = DEBOUNCE_FDC_TEST_FAILED;\r
+ }\r
+ }\r
+ }\r
+ break;\r
+\r
+ case DEM_EVENT_STATUS_PREPASSED:\r
+ if (statusRecord->faultDetectionCounter > DEBOUNCE_FDC_TEST_PASSED) {\r
+ if (pdVars->JumpDown && (statusRecord->faultDetectionCounter > 0)) {\r
+ statusRecord->faultDetectionCounter = 0;\r
+ } else {\r
+ if (((sint16)statusRecord->faultDetectionCounter - pdVars->CountOutStepSize) > DEBOUNCE_FDC_TEST_PASSED) {\r
+ statusRecord->faultDetectionCounter -= pdVars->CountOutStepSize;\r
+ } else {\r
+ statusRecord->faultDetectionCounter = DEBOUNCE_FDC_TEST_PASSED;\r
+ }\r
+ }\r
+ }\r
+ break;\r
+\r
+ case DEM_EVENT_STATUS_FAILED:\r
+ statusRecord->faultDetectionCounter = DEBOUNCE_FDC_TEST_FAILED;\r
+ break;\r
+\r
+ case DEM_EVENT_STATUS_PASSED:\r
+ statusRecord->faultDetectionCounter = DEBOUNCE_FDC_TEST_PASSED;\r
+ break;\r
+\r
+ default:\r
+#if (DEM_DEV_ERROR_DETECT == STD_ON)\r
+ Det_ReportError(MODULE_ID_DEM, 0, DEM_PREDEBOUNCE_COUNTER_BASED_ID, DEM_E_PARAM_DATA);\r
+#endif\r
+ break;\r
+\r
+ }\r
+\r
+ switch (statusRecord->faultDetectionCounter) {\r
+ case DEBOUNCE_FDC_TEST_FAILED:\r
+ returnCode = DEM_EVENT_STATUS_FAILED;\r
+ break;\r
+\r
+ case DEBOUNCE_FDC_TEST_PASSED:\r
+ returnCode = DEM_EVENT_STATUS_PASSED;\r
+ break;\r
+\r
+ default:\r
+ returnCode = reportedStatus;\r
+ break;\r
+ }\r
+\r
+ return returnCode;\r
+}\r
+\r
+\r
/*\r
* Procedure: updateEventStatusRec\r
* Description: Update the status of "eventId", if not exist and "createIfNotExist" is\r
// Create new event record\r
eventStatusRecPtr->eventId = eventParam->EventID;\r
eventStatusRecPtr->eventParamRef = eventParam;\r
+ eventStatusRecPtr->faultDetectionCounter = 0;\r
eventStatusRecPtr->occurrence = 0;\r
- eventStatusRecPtr->eventStatus = DEM_EVENT_STATUS_PASSED;\r
- eventStatusRecPtr->eventStatusChanged = FALSE;\r
eventStatusRecPtr->eventStatusExtended = DEM_TEST_NOT_COMPLETED_SINCE_LAST_CLEAR | DEM_TEST_NOT_COMPLETED_THIS_OPERATION_CYCLE;\r
+ eventStatusRecPtr->errorStatusChanged = FALSE;\r
}\r
else {\r
// Error: Event status buffer full\r
}\r
}\r
\r
+\r
if (eventStatusRecPtr != NULL) {\r
- // Update event record\r
- eventStatusRecPtr->eventStatusExtended &= ~(DEM_TEST_NOT_COMPLETED_SINCE_LAST_CLEAR | DEM_TEST_NOT_COMPLETED_THIS_OPERATION_CYCLE);\r
+ // Handle debouncing\r
+ switch (eventParam->EventClass->PreDebounceAlgorithmClass->PreDebounceName) {\r
+ case DEM_NO_PRE_DEBOUNCE:\r
+ eventStatus = PreDebounceNone(eventStatus, eventStatusRecPtr);\r
+ break;\r
+\r
+ case DEM_PRE_DEBOUNCE_COUNTER_BASED:\r
+ eventStatus = PreDebounceCounterBased(eventStatus, eventStatusRecPtr);\r
+ break;\r
+\r
+ default:\r
+ // Don't know how to handle this.\r
+#if (DEM_DEV_ERROR_DETECT == STD_ON)\r
+ Det_ReportError(MODULE_ID_DEM, 0, DEM_UPDATE_EVENT_STATUS_ID, DEM_E_NOT_IMPLEMENTED_YET);\r
+#endif\r
+ break;\r
+ }\r
+\r
+\r
+ eventStatusRecPtr->errorStatusChanged = FALSE;\r
\r
+ // Check test failed\r
if (eventStatus == DEM_EVENT_STATUS_FAILED) {\r
- eventStatusRecPtr->eventStatusExtended |= (DEM_TEST_FAILED | DEM_TEST_FAILED_THIS_OPERATION_CYCLE | DEM_TEST_FAILED_SINCE_LAST_CLEAR | DEM_PENDING_DTC);\r
- if (eventStatusRecPtr->eventStatus != eventStatus) {\r
+ if (!(eventStatusRecPtr->eventStatusExtended & DEM_TEST_FAILED)) {\r
eventStatusRecPtr->occurrence++;\r
+ eventStatusRecPtr->errorStatusChanged = TRUE;\r
}\r
+ eventStatusRecPtr->eventStatusExtended |= (DEM_TEST_FAILED | DEM_TEST_FAILED_THIS_OPERATION_CYCLE | DEM_TEST_FAILED_SINCE_LAST_CLEAR | DEM_PENDING_DTC);\r
+ eventStatusRecPtr->eventStatusExtended &= ~(DEM_TEST_NOT_COMPLETED_SINCE_LAST_CLEAR | DEM_TEST_NOT_COMPLETED_THIS_OPERATION_CYCLE);\r
}\r
\r
+ // Check test passed\r
if (eventStatus == DEM_EVENT_STATUS_PASSED) {\r
+ if (eventStatusRecPtr->eventStatusExtended & DEM_TEST_FAILED) {\r
+ eventStatusRecPtr->errorStatusChanged = TRUE;\r
+ }\r
eventStatusRecPtr->eventStatusExtended &= ~DEM_TEST_FAILED;\r
- }\r
-\r
- if (eventStatusRecPtr->eventStatus != eventStatus) {\r
- eventStatusRecPtr->eventStatus = eventStatus;\r
- eventStatusRecPtr->eventStatusChanged = TRUE;\r
- }\r
- else {\r
- eventStatusRecPtr->eventStatusChanged = FALSE;\r
+ eventStatusRecPtr->eventStatusExtended &= ~(DEM_TEST_NOT_COMPLETED_SINCE_LAST_CLEAR | DEM_TEST_NOT_COMPLETED_THIS_OPERATION_CYCLE);\r
}\r
\r
// Copy the record\r
else {\r
// Copy an empty record to return data\r
eventStatusRec->eventId = DEM_EVENT_ID_NULL;\r
- eventStatusRec->eventStatus = DEM_EVENT_STATUS_PASSED;\r
+ eventStatusRecPtr->faultDetectionCounter = 0;\r
eventStatusRec->occurrence = 0;\r
- eventStatusRec->eventStatusChanged = FALSE;\r
eventStatusRec->eventStatusExtended = DEM_TEST_NOT_COMPLETED_THIS_OPERATION_CYCLE | DEM_TEST_NOT_COMPLETED_SINCE_LAST_CLEAR;\r
+ eventStatusRec->errorStatusChanged = FALSE;\r
}\r
\r
McuE_ExitCriticalSection(state);\r
// Create new event, from stored event\r
eventStatusRecPtr->eventId = eventRec->eventId;\r
lookupEventIdParameter(eventRec->eventId, &eventStatusRecPtr->eventParamRef);\r
+ eventStatusRecPtr->faultDetectionCounter = 0;\r
eventStatusRecPtr->occurrence = eventRec->occurrence;\r
- eventStatusRecPtr->eventStatus = DEM_EVENT_STATUS_PASSED;\r
- eventStatusRecPtr->eventStatusChanged = FALSE;\r
eventStatusRecPtr->eventStatusExtended = DEM_TEST_NOT_COMPLETED_THIS_OPERATION_CYCLE | DEM_TEST_NOT_COMPLETED_SINCE_LAST_CLEAR;\r
+ eventStatusRecPtr->errorStatusChanged = FALSE;\r
}\r
else {\r
// Error: Event status buffer full\r
}\r
else {\r
eventStatusRec->eventId = DEM_EVENT_ID_NULL;\r
- eventStatusRec->eventStatus = DEM_EVENT_STATUS_PASSED;\r
- eventStatusRec->occurrence = 0;\r
}\r
}\r
\r
else {\r
// Error: Size of extended data record is bigger than reserved space.\r
#if (DEM_DEV_ERROR_DETECT == STD_ON)\r
- Det_ReportError(MODULE_ID_DEM, 0, DEM_GET_EXTENDED_DATA_ID, DEM_E_EXT_DATA_TO_BIG);\r
+ Det_ReportError(MODULE_ID_DEM, 0, DEM_GET_EXTENDED_DATA_ID, DEM_E_EXT_DATA_TOO_BIG);\r
#endif\r
break; // Break the loop\r
}\r
if (eventParam != NULL) {\r
if (eventParam->EventClass->OperationCycleRef < DEM_OPERATION_CYCLE_ID_ENDMARK) {\r
if (operationCycleStateList[eventParam->EventClass->OperationCycleRef] == DEM_CYCLE_STATE_START) {\r
- if (eventStatus == DEM_EVENT_STATUS_PASSED) {\r
- updateEventStatusRec(eventParam, eventStatus, FALSE, &eventStatusLocal);\r
+ if (eventStatus == DEM_EVENT_STATUS_FAILED) {\r
+ updateEventStatusRec(eventParam, eventStatus, TRUE, &eventStatusLocal);\r
}\r
else {\r
- updateEventStatusRec(eventParam, eventStatus, TRUE, &eventStatusLocal);\r
+ updateEventStatusRec(eventParam, eventStatus, FALSE, &eventStatusLocal);\r
}\r
\r
- if (eventStatusLocal.eventStatusChanged) {\r
+ if (eventStatusLocal.errorStatusChanged) {\r
\r
- if (eventStatusLocal.eventStatus == DEM_EVENT_STATUS_FAILED) {\r
+ if (eventStatusLocal.eventStatusExtended & DEM_TEST_FAILED) {\r
// Collect freeze frame data\r
getFreezeFrameData(eventParam, &freezeFrameLocal);\r
if (freezeFrameLocal.eventId != DEM_EVENT_ID_NULL) {\r
if (operationCycleStateList[eventParam->EventClass->OperationCycleRef] == DEM_CYCLE_STATE_START) {\r
if (!(disableDtcStorage.storageDisabled && checkDtcGroup(disableDtcStorage.dtcGroup, eventParam) && checkDtcKind(disableDtcStorage.dtcKind, eventParam))) {\r
updateEventStatusRec(eventParam, eventStatus, TRUE, &eventStatusLocal);\r
- if (eventStatusLocal.eventStatusChanged) {\r
- if (eventStatusLocal.eventStatus == DEM_EVENT_STATUS_FAILED) {\r
+ if (eventStatusLocal.errorStatusChanged) {\r
+ if (eventStatusLocal.eventStatusExtended & DEM_TEST_FAILED) {\r
storeEventEvtMem(eventParam, &eventStatusLocal);\r
// Collect freeze frame data\r
getFreezeFrameData(eventParam, &freezeFrameLocal);\r
}\r
\r
\r
+/*\r
+ * Procedure: resetEventStatus\r
+ * Description: Resets the events status of eventId.\r
+ */\r
+void resetEventStatus(Dem_EventIdType eventId)\r
+{\r
+ imask_t state = McuE_EnterCriticalSection();\r
+ EventStatusRecType *eventStatusRecPtr;\r
+\r
+ lookupEventStatusRec(eventId, &eventStatusRecPtr);\r
+ if (eventStatusRecPtr != NULL) {\r
+ eventStatusRecPtr->eventStatusExtended &= ~DEM_TEST_FAILED;\r
+ }\r
+\r
+ McuE_ExitCriticalSection(state);\r
+}\r
+\r
+\r
/*\r
* Procedure: getEventStatus\r
* Description: Returns the extended event status bitmask of eventId in "eventStatusExtended".\r
{\r
case DEM_NO_PRE_DEBOUNCE:\r
if (eventParam->EventClass->PreDebounceAlgorithmClass->PreDebounceAlgorithm.PreDebounceMonitorInternal != NULL) {\r
- returnCode = eventParam->EventClass->PreDebounceAlgorithmClass->PreDebounceAlgorithm.PreDebounceMonitorInternal->CallbackGetFDCntFnc(counter);\r
+ if (eventParam->EventClass->PreDebounceAlgorithmClass->PreDebounceAlgorithm.PreDebounceMonitorInternal->CallbackGetFDCntFnc != NULL) {\r
+ returnCode = eventParam->EventClass->PreDebounceAlgorithmClass->PreDebounceAlgorithm.PreDebounceMonitorInternal->CallbackGetFDCntFnc(counter);\r
+ }\r
}\r
break;\r
\r
case DEM_PRE_DEBOUNCE_COUNTER_BASED:\r
+ {\r
+ EventStatusRecType *eventStatusRec;\r
+\r
+ lookupEventStatusRec(eventId, &eventStatusRec);\r
+ if (eventStatusRec != NULL) {\r
+ *counter = eventStatusRec->faultDetectionCounter;\r
+ } else {\r
+ *counter = 0;\r
+ }\r
+ returnCode = E_OK;\r
+ }\r
+ break;\r
+\r
case DEM_PRE_DEBOUNCE_FREQUENCY_BASED:\r
case DEM_PRE_DEBOUNCE_TIME_BASED:\r
#if (DEM_DEV_ERROR_DETECT == STD_ON)\r
// Initialize the event status buffer\r
for (i = 0; i < DEM_MAX_NUMBER_EVENT; i++) {\r
eventStatusBuffer[i].eventId = DEM_EVENT_ID_NULL;\r
+ eventStatusBuffer[i].eventParamRef = NULL;\r
+ eventStatusBuffer[i].faultDetectionCounter = 0;\r
eventStatusBuffer[i].occurrence = 0;\r
eventStatusBuffer[i].eventStatusExtended = DEM_TEST_NOT_COMPLETED_THIS_OPERATION_CYCLE | DEM_TEST_NOT_COMPLETED_SINCE_LAST_CLEAR;\r
- eventStatusBuffer[i].eventStatus = DEM_EVENT_STATUS_PASSED;\r
- eventStatusBuffer[i].eventStatusChanged = FALSE;\r
+ eventStatusBuffer[i].errorStatusChanged = FALSE;\r
}\r
\r
// Initialize the pre init buffers\r
*/\r
Std_ReturnType Dem_ResetEventStatus(Dem_EventIdType eventId)\r
{\r
- const Dem_EventParameterType *eventParam;\r
- EventStatusRecType eventStatusLocal;\r
Std_ReturnType returnCode = E_OK;\r
\r
if (demState == DEM_INITIALIZED) // No action is taken if the module is not started\r
{\r
- lookupEventIdParameter(eventId, &eventParam);\r
- if (eventParam != NULL) {\r
- updateEventStatusRec(eventParam, DEM_EVENT_STATUS_PASSED, FALSE, &eventStatusLocal);\r
- }\r
+ resetEventStatus(eventId);\r
}\r
else\r
{\r
break;\r
\r
case DEM_INITIALIZED:\r
- // Handle report\r
- if ((eventStatus == DEM_EVENT_STATUS_PASSED) || (eventStatus == DEM_EVENT_STATUS_FAILED)) {\r
- (void)handleEvent(eventId, eventStatus);\r
- }\r
+ (void)handleEvent(eventId, eventStatus);\r
break;\r
\r
case DEM_UNINITIALIZED:\r