-/* -------------------------------- Arctic Core ------------------------------
- * Arctic Core - the open source AUTOSAR platform http://arccore.com
- *
- * Copyright (C) 2009 ArcCore AB <contact@arccore.com>
- *
- * This source code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 as published by the
- * Free Software Foundation; See <http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt>.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * for more details.
- * -------------------------------- Arctic Core ------------------------------*/
-
-
-
-
-
-#include <string.h>
-#include "Dem.h"
-#include "Det.h"
-//#include "Fim.h"
-//#include "Nvm.h"
-//#include "SchM_Dem.h"
-#include "MemMap.h"
-#include "Mcu.h"
-
-/*
- * Local types
- */
-
-typedef uint16 ChecksumType;
-
-// DtcFilterType
-typedef struct {
- Dem_EventStatusExtendedType dtcStatusMask;
- Dem_DTCKindType dtcKind;
- Dem_DTCOriginType dtcOrigin;
- Dem_FilterWithSeverityType filterWithSeverity;
- Dem_DTCSeverityType dtcSeverityMask;
- Dem_FilterForFDCType filterForFaultDetectionCounter;
- uint16 faultIndex;
-} DtcFilterType;
-
-// DisableDtcStorageType
-typedef struct {
- boolean storageDisabled;
- Dem_DTCGroupType dtcGroup;
- Dem_DTCKindType dtcKind;
-} DisableDtcStorageType;
-
-// For keeping track of the events status
-typedef struct {
- Dem_EventIdType eventId;
- const Dem_EventParameterType *eventParamRef;
- uint16 occurrence;
- Dem_EventStatusType eventStatus;
- boolean eventStatusChanged;
- Dem_EventStatusExtendedType eventStatusExtended;
-} EventStatusRecType;
-
-
-// Types for storing different event data on event memory
-typedef struct {
- Dem_EventIdType eventId;
- uint16 occurrence;
- ChecksumType checksum;
-} EventRecType;
-
-typedef struct {
- Dem_EventIdType eventId;
- uint16 occurrence;
- uint16 dataSize;
- sint8 data[DEM_MAX_SIZE_FF_DATA];
- ChecksumType checksum;
-} FreezeFrameRecType;
-
-typedef struct {
- Dem_EventIdType eventId;
- uint16 dataSize;
- uint8 data[DEM_MAX_SIZE_EXT_DATA];
- ChecksumType checksum;
-} ExtDataRecType;
-
-
-// State variable
-typedef enum
-{
- DEM_UNINITIALIZED = 0,
- DEM_PREINITIALIZED,
- DEM_INITIALIZED
-} Dem_StateType;
-
-static Dem_StateType demState = DEM_UNINITIALIZED;
-
-// Help pointer to configuration set
-static const Dem_ConfigSetType *configSet;
-
-#if (DEM_VERSION_INFO_API == STD_ON)
-static Std_VersionInfoType _Dem_VersionInfo =
-{
- .vendorID = (uint16)1,
- .moduleID = (uint16)1,
- .instanceID = (uint8)1,
- .sw_major_version = (uint8)DEM_SW_MAJOR_VERSION,
- .sw_minor_version = (uint8)DEM_SW_MINOR_VERSION,
- .sw_patch_version = (uint8)DEM_SW_PATCH_VERSION,
- .ar_major_version = (uint8)DEM_AR_MAJOR_VERSION,
- .ar_minor_version = (uint8)DEM_AR_MINOR_VERSION,
- .ar_patch_version = (uint8)DEM_AR_PATCH_VERSION,
-};
-#endif /* DEM_VERSION_INFO_API */
-
-/*
- * Allocation of DTC filter parameters
- */
-static DtcFilterType dtcFilter;
-
-/*
- * Allocation of Disable/Enable DTC storage parameters
- */
-static DisableDtcStorageType disableDtcStorage;
-
-/*
- * Allocation of operation cycle state list
- */
-static Dem_OperationCycleStateType operationCycleStateList[DEM_OPERATION_CYCLE_ID_ENDMARK];
-
-/*
- * Allocation of local event status buffer
- */
-static EventStatusRecType eventStatusBuffer[DEM_MAX_NUMBER_EVENT];
-
-/*
- * Allocation of pre-init event memory (used between pre-init and init)
- */
-static FreezeFrameRecType preInitFreezeFrameBuffer[DEM_MAX_NUMBER_FF_DATA_PRE_INIT];
-static ExtDataRecType preInitExtDataBuffer[DEM_MAX_NUMBER_EXT_DATA_PRE_INIT];
-
-/*
- * Allocation of primary event memory ramlog (after init) in uninitialized memory
- */
-static EventRecType priMemEventBuffer[DEM_MAX_NUMBER_EVENT_PRI_MEM] __attribute__ ((section (".dem_eventmemory_pri")));
-static FreezeFrameRecType priMemFreezeFrameBuffer[DEM_MAX_NUMBER_FF_DATA_PRI_MEM] __attribute__ ((section (".dem_eventmemory_pri")));
-static ExtDataRecType priMemExtDataBuffer[DEM_MAX_NUMBER_EXT_DATA_PRI_MEM] __attribute__ ((section (".dem_eventmemory_pri")));
-
-
-/*
- * Procedure: zeroPriMemBuffers
- * Description: Fill the primary buffers with zeroes
- */
-void zeroPriMemBuffers(void)
-{
- memset(priMemEventBuffer, 0, sizeof(priMemEventBuffer));
- memset(priMemFreezeFrameBuffer, 0, sizeof(priMemFreezeFrameBuffer));
- memset(priMemExtDataBuffer, 0, sizeof(priMemExtDataBuffer));
-}
-
-
-/*
- * Procedure: calcChecksum
- * Description: Calculate checksum over *data to *(data+nrOfBytes-1) area
- */
-ChecksumType calcChecksum(void *data, uint16 nrOfBytes)
-{
- uint16 i;
- uint8 *ptr = (uint8*)data;
- ChecksumType sum = 0;
-
- for (i = 0; i < nrOfBytes; i++)
- sum += *ptr++;
- sum ^= 0xaaaa;
- return sum;
-}
-
-
-/*
- * Procedure: checkDtcKind
- * Description: Return TRUE if "dtcKind" match the events DTCKind or "dtcKind"
- * is "DEM_DTC_KIND_ALL_DTCS" otherwise FALSE.
- */
-boolean checkDtcKind(Dem_DTCKindType dtcKind, const Dem_EventParameterType *eventParam)
-{
- boolean result = FALSE;
-
- if (dtcKind == DEM_DTC_KIND_ALL_DTCS) {
- result = TRUE;
- }
- else {
- if (eventParam->DTCClassRef != NULL) {
- if (eventParam->DTCClassRef->DTCKind == dtcKind) {
- result = TRUE;
- }
- }
- }
- return result;
-}
-
-
-/*
- * Procedure: checkDtcGroup
- * Description: Return TRUE if "dtc" match the events DTC or "dtc" is
- * "DEM_DTC_GROUP_ALL_DTCS" otherwise FALSE.
- */
-boolean checkDtcGroup(uint32 dtc, const Dem_EventParameterType *eventParam)
-{
- boolean result = FALSE;
-
- if (dtc == DEM_DTC_GROUP_ALL_DTCS) {
- result = TRUE;
- }
- else {
- if (eventParam->DTCClassRef != NULL) {
- if (eventParam->DTCClassRef->DTC == dtc) {
- result = TRUE;
- }
- }
- }
- return result;
-}
-
-
-/*
- * Procedure: checkDtcOrigin
- * Description: Return TRUE if "dtcOrigin" match any of the events DTCOrigin otherwise FALSE.
- */
-boolean checkDtcOrigin(Dem_DTCOriginType dtcOrigin, const Dem_EventParameterType *eventParam)
-{
- boolean result = FALSE;
- uint16 i;
-
- for (i = 0; (eventParam->EventClass->EventDestination[i] != dtcOrigin) && (i < DEM_MAX_NR_OF_EVENT_DESTINATION); i++);
-
- if (i < DEM_MAX_NR_OF_EVENT_DESTINATION) {
- result = TRUE;
- }
-
- return result;
-}
-
-
-/*
- * Procedure: checkDtcSeverityMask
- * Description: Return TRUE if "dtcSeverityMask" match any of the events DTC severity otherwise FALSE.
- */
-boolean checkDtcSeverityMask(Dem_DTCSeverityType dtcSeverityMask, const Dem_EventParameterType *eventParam)
-{
- boolean result = TRUE;
-
- // TODO: This function is optional, may be implemented here.
-
- return result;
-}
-
-
-/*
- * Procedure: checkDtcFaultDetectionCounterMask
- * Description: TBD.
- */
-boolean checkDtcFaultDetectionCounter(const Dem_EventParameterType *eventParam)
-{
- boolean result = TRUE;
-
- // TODO: Not implemented yet.
-
- return result;
-}
-
-
-/*
- * Procedure: lookupEventStatusRec
- * Description: Returns the pointer to event id parameters of "eventId" in "*eventStatusBuffer",
- * if not found NULL is returned.
- */
-void lookupEventStatusRec(Dem_EventIdType eventId, EventStatusRecType **const eventStatusRec)
-{
- EventStatusRecType *eventStatusRecPtr = eventStatusBuffer;
-
- while ((eventStatusRecPtr->eventId != eventId) && (eventStatusRecPtr < &eventStatusBuffer[DEM_MAX_NUMBER_EVENT])) {
- eventStatusRecPtr++;
- }
-
- if (eventStatusRecPtr < &eventStatusBuffer[DEM_MAX_NUMBER_EVENT]) {
- *eventStatusRec = eventStatusRecPtr;
- } else {
- *eventStatusRec = NULL;
- }
-}
-
-
-/*
- * Procedure: lookupEventIdParameter
- * Description: Returns the pointer to event id parameters of "eventId" in "*eventIdParam",
- * if not found NULL is returned.
- */
-void lookupEventIdParameter(Dem_EventIdType eventId, const Dem_EventParameterType **const eventIdParam)
-{
- const Dem_EventParameterType *EventIdParamPtr = configSet->EventParameter;
-
- // Lookup the correct event id parameters
- while ((EventIdParamPtr->EventID != eventId) && !EventIdParamPtr->Arc_EOL) {
- EventIdParamPtr++;
- }
-
- if (!EventIdParamPtr->Arc_EOL) {
- *eventIdParam = EventIdParamPtr;
- } else {
- *eventIdParam = NULL;
- }
-}
-
-/*
- * Procedure: updateEventStatusRec
- * Description: Update the status of "eventId", if not exist and "createIfNotExist" is
- * true a new record is created
- */
-void updateEventStatusRec(const Dem_EventParameterType *eventParam, Dem_EventStatusType eventStatus, boolean createIfNotExist, EventStatusRecType *eventStatusRec)
-{
- EventStatusRecType *eventStatusRecPtr;
- imask_t state = McuE_EnterCriticalSection();
-
- // Lookup event ID
- lookupEventStatusRec(eventParam->EventID, &eventStatusRecPtr);
-
- if ((eventStatusRecPtr == NULL) && (createIfNotExist)) {
- // Search for free position
- lookupEventStatusRec(DEM_EVENT_ID_NULL, &eventStatusRecPtr);
-
- if (eventStatusRecPtr != NULL) {
- // Create new event record
- eventStatusRecPtr->eventId = eventParam->EventID;
- eventStatusRecPtr->eventParamRef = eventParam;
- eventStatusRecPtr->occurrence = 0;
- eventStatusRecPtr->eventStatus = DEM_EVENT_STATUS_PASSED;
- eventStatusRecPtr->eventStatusChanged = FALSE;
- eventStatusRecPtr->eventStatusExtended = DEM_TEST_NOT_COMPLETED_SINCE_LAST_CLEAR | DEM_TEST_NOT_COMPLETED_THIS_OPERATION_CYCLE;
- }
- else {
- // Error: Event status buffer full
-#if (DEM_DEV_ERROR_DETECT == STD_ON)
- Det_ReportError(MODULE_ID_DEM, 0, DEM_UPDATE_EVENT_STATUS_ID, DEM_E_EVENT_STATUS_BUFF_FULL);
-#endif
- }
- }
-
- if (eventStatusRecPtr != NULL) {
- // Update event record
- eventStatusRecPtr->eventStatusExtended &= ~(DEM_TEST_NOT_COMPLETED_SINCE_LAST_CLEAR | DEM_TEST_NOT_COMPLETED_THIS_OPERATION_CYCLE);
-
- if (eventStatus == DEM_EVENT_STATUS_FAILED) {
- eventStatusRecPtr->eventStatusExtended |= (DEM_TEST_FAILED | DEM_TEST_FAILED_THIS_OPERATION_CYCLE | DEM_TEST_FAILED_SINCE_LAST_CLEAR | DEM_PENDING_DTC);
- if (eventStatusRecPtr->eventStatus != eventStatus) {
- eventStatusRecPtr->occurrence++;
- }
- }
-
- if (eventStatus == DEM_EVENT_STATUS_PASSED) {
- eventStatusRecPtr->eventStatusExtended &= ~DEM_TEST_FAILED;
- }
-
- if (eventStatusRecPtr->eventStatus != eventStatus) {
- eventStatusRecPtr->eventStatus = eventStatus;
- eventStatusRecPtr->eventStatusChanged = TRUE;
- }
- else {
- eventStatusRecPtr->eventStatusChanged = FALSE;
- }
-
- // Copy the record
- memcpy(eventStatusRec, eventStatusRecPtr, sizeof(EventStatusRecType));
- }
- else {
- // Copy an empty record to return data
- eventStatusRec->eventId = DEM_EVENT_ID_NULL;
- eventStatusRec->eventStatus = DEM_EVENT_STATUS_PASSED;
- eventStatusRec->occurrence = 0;
- eventStatusRec->eventStatusChanged = FALSE;
- eventStatusRec->eventStatusExtended = DEM_TEST_NOT_COMPLETED_THIS_OPERATION_CYCLE | DEM_TEST_NOT_COMPLETED_SINCE_LAST_CLEAR;
- }
-
- McuE_ExitCriticalSection(state);
-}
-
-
-/*
- * Procedure: mergeEventStatusRec
- * Description: Update the occurrence counter of status, if not exist a new record is created
- */
-void mergeEventStatusRec(EventRecType *eventRec)
-{
- EventStatusRecType *eventStatusRecPtr;
- imask_t state = McuE_EnterCriticalSection();
-
- // Lookup event ID
- lookupEventStatusRec(eventRec->eventId, &eventStatusRecPtr);
-
- if (eventStatusRecPtr != NULL) {
- // Update occurrence counter, rest of pre init state is kept.
- eventStatusRecPtr->occurrence += eventRec->occurrence;
-
- }
- else {
- // Search for free position
- lookupEventStatusRec(DEM_EVENT_ID_NULL, &eventStatusRecPtr);
-
- if (eventStatusRecPtr != NULL) {
- // Create new event, from stored event
- eventStatusRecPtr->eventId = eventRec->eventId;
- lookupEventIdParameter(eventRec->eventId, &eventStatusRecPtr->eventParamRef);
- eventStatusRecPtr->occurrence = eventRec->occurrence;
- eventStatusRecPtr->eventStatus = DEM_EVENT_STATUS_PASSED;
- eventStatusRecPtr->eventStatusChanged = FALSE;
- eventStatusRecPtr->eventStatusExtended = DEM_TEST_NOT_COMPLETED_THIS_OPERATION_CYCLE | DEM_TEST_NOT_COMPLETED_SINCE_LAST_CLEAR;
- }
- else {
- // Error: Event status buffer full
-#if (DEM_DEV_ERROR_DETECT == STD_ON)
- Det_ReportError(MODULE_ID_DEM, 0, DEM_MERGE_EVENT_STATUS_ID, DEM_E_EVENT_STATUS_BUFF_FULL);
-#endif
- }
- }
-
- McuE_ExitCriticalSection(state);
-}
-
-
-/*
- * Procedure: deleteEventStatusRec
- * Description: Delete the status record of "eventParam->eventId" from "eventStatusBuffer".
- */
-void deleteEventStatusRec(const Dem_EventParameterType *eventParam)
-{
- EventStatusRecType *eventStatusRecPtr;
- imask_t state = McuE_EnterCriticalSection();
-
- // Lookup event ID
- lookupEventStatusRec(eventParam->EventID, &eventStatusRecPtr);
-
- if (eventStatusRecPtr != NULL) {
- // Delete event record
- memset(eventStatusRecPtr, 0, sizeof(EventStatusRecType));
- }
-
- McuE_ExitCriticalSection(state);
-}
-
-
-/*
- * Procedure: getEventStatusRec
- * Description: Returns the status record of "eventId" in "eventStatusRec"
- */
-void getEventStatusRec(Dem_EventIdType eventId, EventStatusRecType *eventStatusRec)
-{
- EventStatusRecType *eventStatusRecPtr;
-
- // Lookup event ID
- lookupEventStatusRec(eventId, &eventStatusRecPtr);
-
- if (eventStatusRecPtr != NULL) {
- // Copy the record
- memcpy(eventStatusRec, eventStatusRecPtr, sizeof(EventStatusRecType));
- }
- else {
- eventStatusRec->eventId = DEM_EVENT_ID_NULL;
- eventStatusRec->eventStatus = DEM_EVENT_STATUS_PASSED;
- eventStatusRec->occurrence = 0;
- }
-}
-
-
-/*
- * Procedure: lookupDtcEvent
- * Description: Returns TRUE if the DTC was found and "eventStatusRec" points
- * to the event record found.
- */
-boolean lookupDtcEvent(uint32 dtc, EventStatusRecType **eventStatusRec)
-{
- boolean dtcFound = FALSE;
- uint16 i;
-
- *eventStatusRec = NULL;
-
- for (i = 0; (i < DEM_MAX_NUMBER_EVENT) && !dtcFound; i++) {
- if (eventStatusBuffer[i].eventId != DEM_EVENT_ID_NULL) {
- if (eventStatusBuffer[i].eventParamRef->DTCClassRef != NULL) {
-
- // Check DTC
- if (eventStatusBuffer[i].eventParamRef->DTCClassRef->DTC == dtc) {
- *eventStatusRec = &eventStatusBuffer[i];
- dtcFound = TRUE;
- }
- }
- }
- }
-
- return dtcFound;
-}
-
-
-/*
- * Procedure: matchEventWithDtcFilter
- * Description: Returns TRUE if the event pointed by "event" fulfill
- * the "dtcFilter" global filter settings.
- */
-boolean matchEventWithDtcFilter(const EventStatusRecType *eventRec)
-{
- boolean dtcMatch = FALSE;
-
- // Check status
- if ((dtcFilter.dtcStatusMask == DEM_DTC_STATUS_MASK_ALL) || (eventRec->eventStatusExtended & dtcFilter.dtcStatusMask)) {
- if (eventRec->eventParamRef != NULL) {
-
- // Check dtcKind
- if (checkDtcKind(dtcFilter.dtcKind, eventRec->eventParamRef)) {
-
- // Check dtcOrigin
- if (checkDtcOrigin(dtcFilter.dtcOrigin, eventRec->eventParamRef)) {
-
- // Check severity
- if ((dtcFilter.filterWithSeverity == DEM_FILTER_WITH_SEVERITY_NO)
- || ((dtcFilter.filterWithSeverity == DEM_FILTER_WITH_SEVERITY_YES) && checkDtcSeverityMask(dtcFilter.dtcSeverityMask, eventRec->eventParamRef))) {
-
- // Check fault detection counter
- if ((dtcFilter.filterForFaultDetectionCounter == DEM_FILTER_FOR_FDC_NO)
- || ((dtcFilter.filterWithSeverity == DEM_FILTER_FOR_FDC_YES) && checkDtcFaultDetectionCounter(eventRec->eventParamRef))) {
- dtcMatch = TRUE;
- }
- }
- }
- }
- }
- }
-
- return dtcMatch;
-}
-
-
-void getFreezeFrameData(const Dem_EventParameterType *eventParam, FreezeFrameRecType *freezeFrame)
-{
- // TODO: Fill out
- freezeFrame->eventId = DEM_EVENT_ID_NULL; // Not supported yet
-}
-
-
-void storeFreezeFrameDataPreInit(const Dem_EventParameterType *eventParam, FreezeFrameRecType *freezeFrame)
-{
- // TODO: Fill out
-}
-
-
-void updateFreezeFrameOccurrencePreInit(EventRecType *EventBuffer)
-{
- // TODO: Fill out
-}
-
-
-/*
- * Procedure: getExtendedData
- * Description: Collects the extended data according to "eventParam" and return it in "extData",
- * if not found eventId is set to DEM_EVENT_ID_NULL.
- */
-void getExtendedData(const Dem_EventParameterType *eventParam, ExtDataRecType *extData)
-{
- Std_ReturnType callbackReturnCode;
- uint16 i;
- uint16 storeIndex = 0;
- uint16 recordSize;
-
- // Clear ext data record
- memset(extData, 0, sizeof(ExtDataRecType));
-
- // Check if any pointer to extended data class
- if (eventParam->ExtendedDataClassRef != NULL) {
- // Request extended data and copy it to the buffer
- for (i = 0; (i < DEM_MAX_NR_OF_RECORDS_IN_EXTENDED_DATA) && (eventParam->ExtendedDataClassRef->ExtendedDataRecordClassRef[i] != NULL); i++) {
- recordSize = eventParam->ExtendedDataClassRef->ExtendedDataRecordClassRef[i]->DataSize;
- if ((storeIndex + recordSize) <= DEM_MAX_SIZE_EXT_DATA) {
- callbackReturnCode = eventParam->ExtendedDataClassRef->ExtendedDataRecordClassRef[i]->CallbackGetExtDataRecord(&extData->data[storeIndex]);
- if (callbackReturnCode != E_OK) {
- // Callback data currently not available, clear space.
- memset(&extData->data[storeIndex], 0xFF, recordSize);
- }
- storeIndex += recordSize;
- }
- else {
- // Error: Size of extended data record is bigger than reserved space.
-#if (DEM_DEV_ERROR_DETECT == STD_ON)
- Det_ReportError(MODULE_ID_DEM, 0, DEM_GET_EXTENDED_DATA_ID, DEM_E_EXT_DATA_TO_BIG);
-#endif
- break; // Break the loop
- }
- }
- }
-
- // Check if any data has been stored
- if (storeIndex != 0) {
- extData->eventId = eventParam->EventID;
- extData->dataSize = storeIndex;
- extData->checksum = calcChecksum(extData, sizeof(ExtDataRecType)-sizeof(ChecksumType));
- }
- else {
- extData->eventId = DEM_EVENT_ID_NULL;
- extData->dataSize = storeIndex;
- extData->checksum = 0;
- }
-}
-
-
-/*
- * Procedure: storeExtendedDataPreInit
- * Description: Store the extended data pointed by "extendedData" to the "preInitExtDataBuffer",
- * if non existent a new entry is created.
- */
-void storeExtendedDataPreInit(const Dem_EventParameterType *eventParam, ExtDataRecType *extendedData)
-{
- uint16 i;
- imask_t state = McuE_EnterCriticalSection();
-
- // Check if already stored
- for (i = 0; (preInitExtDataBuffer[i].eventId != eventParam->EventID) && (i<DEM_MAX_NUMBER_EXT_DATA_PRE_INIT); i++);
-
- if (i < DEM_MAX_NUMBER_EXT_DATA_PRE_INIT) {
- // Yes, overwrite existing
- memcpy(&preInitExtDataBuffer[i], extendedData, sizeof(ExtDataRecType));
- }
- else {
- // No, lookup first free position
- for (i = 0; (preInitExtDataBuffer[i].eventId !=0) && (i<DEM_MAX_NUMBER_EXT_DATA_PRE_INIT); i++);
-
- if (i < DEM_MAX_NUMBER_EXT_DATA_PRE_INIT) {
- memcpy(&preInitExtDataBuffer[i], extendedData, sizeof(ExtDataRecType));
- }
- else {
- // Error: Pre init extended data buffer full
-#if (DEM_DEV_ERROR_DETECT == STD_ON)
- Det_ReportError(MODULE_ID_DEM, 0, DEM_STORE_EXT_DATA_PRE_INIT_ID, DEM_E_PRE_INIT_EXT_DATA_BUFF_FULL);
-#endif
- }
- }
-
- McuE_ExitCriticalSection(state);
-}
-
-
-/*
- * Procedure: storeEventPriMem
- * Description: Store the event data of "eventStatus->eventId" in "priMemEventBuffer",
- * if non existent a new entry is created.
- */
-void storeEventPriMem(const Dem_EventParameterType *eventParam, EventStatusRecType *eventStatus)
-{
- uint16 i;
- imask_t state = McuE_EnterCriticalSection();
-
-
- // Lookup event ID
- for (i = 0; (priMemEventBuffer[i].eventId != eventStatus->eventId) && (i < DEM_MAX_NUMBER_EVENT_ENTRY_PRI); i++);
-
- if (i < DEM_MAX_NUMBER_EVENT_ENTRY_PRI) {
- // Update event found
- priMemEventBuffer[i].occurrence = eventStatus->occurrence;
- priMemEventBuffer[i].checksum = calcChecksum(&priMemEventBuffer[i], sizeof(EventRecType)-sizeof(ChecksumType));
- }
- else {
- // Search for free position
- for (i=0; (priMemEventBuffer[i].eventId != DEM_EVENT_ID_NULL) && (i < DEM_MAX_NUMBER_EVENT_ENTRY_PRI); i++);
-
- if (i < DEM_MAX_NUMBER_EVENT_ENTRY_PRI) {
- priMemEventBuffer[i].eventId = eventStatus->eventId;
- priMemEventBuffer[i].occurrence = eventStatus->occurrence;
- priMemEventBuffer[i].checksum = calcChecksum(&priMemEventBuffer[i], sizeof(EventRecType)-sizeof(ChecksumType));
- }
- else {
- // Error: Pri mem event buffer full
-#if (DEM_DEV_ERROR_DETECT == STD_ON)
- Det_ReportError(MODULE_ID_DEM, 0, DEM_STORE_EVENT_PRI_MEM_ID, DEM_E_PRI_MEM_EVENT_BUFF_FULL);
-#endif
- }
- }
-
- McuE_ExitCriticalSection(state);
-}
-
-
-/*
- * Procedure: deleteEventPriMem
- * Description: Delete the event data of "eventParam->eventId" from "priMemEventBuffer".
- */
-void deleteEventPriMem(const Dem_EventParameterType *eventParam)
-{
- uint16 i;
- imask_t state = McuE_EnterCriticalSection();
-
-
- // Lookup event ID
- for (i = 0; (priMemEventBuffer[i].eventId != eventParam->EventID) && (i < DEM_MAX_NUMBER_EVENT_ENTRY_PRI); i++);
-
- if (i < DEM_MAX_NUMBER_EVENT_ENTRY_PRI) {
- // Delete event found
- memset(&priMemEventBuffer[i], 0, sizeof(EventRecType));
- }
-
- McuE_ExitCriticalSection(state);
-}
-
-
-/*
- * Procedure: storeEventEvtMem
- * Description: Store the event data of "eventStatus->eventId" in event memory according to
- * "eventParam" destination option.
- */
-void storeEventEvtMem(const Dem_EventParameterType *eventParam, EventStatusRecType *eventStatus)
-{
- uint16 i;
-
- for (i = 0; (i < DEM_MAX_NR_OF_EVENT_DESTINATION) && (eventParam->EventClass->EventDestination[i] != NULL); i++) {
- switch (eventParam->EventClass->EventDestination[i])
- {
- case DEM_DTC_ORIGIN_PRIMARY_MEMORY:
- storeEventPriMem(eventParam, eventStatus);
- break;
-
- case DEM_DTC_ORIGIN_SECONDARY_MEMORY:
- case DEM_DTC_ORIGIN_PERMANENT_MEMORY:
- case DEM_DTC_ORIGIN_MIRROR_MEMORY:
- // Not yet supported
-#if (DEM_DEV_ERROR_DETECT == STD_ON)
- Det_ReportError(MODULE_ID_DEM, 0, DEM_GLOBAL_ID, DEM_E_NOT_IMPLEMENTED_YET);
-#endif
- break;
- default:
- break;
- }
- }
-}
-
-
-/*
- * Procedure: storeExtendedDataPriMem
- * Description: Store the extended data pointed by "extendedData" to the "priMemExtDataBuffer",
- * if non existent a new entry is created.
- */
-void storeExtendedDataPriMem(const Dem_EventParameterType *eventParam, ExtDataRecType *extendedData)
-{
- uint16 i;
- imask_t state = McuE_EnterCriticalSection();
-
- // Check if already stored
- for (i = 0; (priMemExtDataBuffer[i].eventId != eventParam->EventID) && (i<DEM_MAX_NUMBER_EXT_DATA_PRI_MEM); i++);
-
- if (i < DEM_MAX_NUMBER_EXT_DATA_PRI_MEM) {
- // Yes, overwrite existing
- memcpy(&priMemExtDataBuffer[i], extendedData, sizeof(ExtDataRecType));
- }
- else {
- // No, lookup first free position
- for (i = 0; (priMemExtDataBuffer[i].eventId != DEM_EVENT_ID_NULL) && (i < DEM_MAX_NUMBER_EXT_DATA_PRI_MEM); i++);
- if (i < DEM_MAX_NUMBER_EXT_DATA_PRI_MEM) {
- memcpy(&priMemExtDataBuffer[i], extendedData, sizeof(ExtDataRecType));
- }
- else {
- // Error: Pri mem extended data buffer full
-#if (DEM_DEV_ERROR_DETECT == STD_ON)
- Det_ReportError(MODULE_ID_DEM, 0, DEM_STORE_EXT_DATA_PRI_MEM_ID, DEM_E_PRI_MEM_EXT_DATA_BUFF_FULL);
-#endif
- }
- }
-
- McuE_ExitCriticalSection(state);
-}
-
-
-/*
- * Procedure: deleteExtendedDataPriMem
- * Description: Delete the extended data of "eventParam->eventId" from "priMemExtDataBuffer".
- */
-void deleteExtendedDataPriMem(const Dem_EventParameterType *eventParam)
-{
- uint16 i;
- imask_t state = McuE_EnterCriticalSection();
-
- // Check if already stored
- for (i = 0; (priMemExtDataBuffer[i].eventId != eventParam->EventID) && (i<DEM_MAX_NUMBER_EXT_DATA_PRI_MEM); i++);
-
- if (i < DEM_MAX_NUMBER_EXT_DATA_PRI_MEM) {
- // Yes, clear record
- memset(&priMemExtDataBuffer[i], 0, sizeof(ExtDataRecType));
- }
-
- McuE_ExitCriticalSection(state);
-}
-
-
-/*
- * Procedure: storeExtendedDataEvtMem
- * Description: Store the extended data in event memory according to
- * "eventParam" destination option
- */
-void storeExtendedDataEvtMem(const Dem_EventParameterType *eventParam, ExtDataRecType *extendedData)
-{
- uint16 i;
-
- for (i = 0; (i < DEM_MAX_NR_OF_EVENT_DESTINATION) && (eventParam->EventClass->EventDestination[i] != NULL); i++) {
- switch (eventParam->EventClass->EventDestination[i])
- {
- case DEM_DTC_ORIGIN_PRIMARY_MEMORY:
- storeExtendedDataPriMem(eventParam, extendedData);
- break;
-
- case DEM_DTC_ORIGIN_SECONDARY_MEMORY:
- case DEM_DTC_ORIGIN_PERMANENT_MEMORY:
- case DEM_DTC_ORIGIN_MIRROR_MEMORY:
- // Not yet supported
-#if (DEM_DEV_ERROR_DETECT == STD_ON)
- Det_ReportError(MODULE_ID_DEM, 0, DEM_GLOBAL_ID, DEM_E_NOT_IMPLEMENTED_YET);
-#endif
- break;
-
- default:
- break;
- }
- }
-}
-
-
-/*
- * Procedure: lookupExtendedDataRecNumParam
- * Description: Returns TRUE if the requested extended data number was found among the configured records for the event.
- * "extDataRecClassPtr" returns a pointer to the record class, "posInExtData" returns the position in stored extended data.
- */
-boolean lookupExtendedDataRecNumParam(uint8 extendedDataNumber, const Dem_EventParameterType *eventParam, Dem_ExtendedDataRecordClassType const **extDataRecClassPtr, uint8 *posInExtData)
-{
- boolean recNumFound = FALSE;
-
- if (eventParam->ExtendedDataClassRef != NULL) {
- Dem_ExtendedDataRecordClassType const* const* extDataRecClassRefList = eventParam->ExtendedDataClassRef->ExtendedDataRecordClassRef;
- uint16 byteCnt = 0;
- uint16 i;
-
- // Request extended data and copy it to the buffer
- for (i = 0; (i < DEM_MAX_NR_OF_RECORDS_IN_EXTENDED_DATA) && (extDataRecClassRefList[i] != NULL) && !recNumFound; i++) {
- if (extDataRecClassRefList[i]->RecordNumber == extendedDataNumber) {
- *extDataRecClassPtr = extDataRecClassRefList[i];
- *posInExtData = byteCnt;
- recNumFound = TRUE;
- }
- byteCnt += extDataRecClassRefList[i]->DataSize;
- }
- }
-
- return recNumFound;
-}
-
-
-/*
- * Procedure: lookupExtendedDataPriMem
- * Description: Returns TRUE if the requested event id is found, "extData" points to the found data.
- */
-boolean lookupExtendedDataPriMem(Dem_EventIdType eventId, ExtDataRecType **extData)
-{
- boolean eventIdFound = FALSE;
- uint16 i;
-
- // Lookup corresponding extended data
- for (i = 0; (priMemExtDataBuffer[i].eventId != eventId) && (i < DEM_MAX_NUMBER_EXT_DATA_PRI_MEM); i++);
-
- if (i < DEM_MAX_NUMBER_EXT_DATA_PRI_MEM) {
- // Yes, return pointer
- *extData = &priMemExtDataBuffer[i];
- eventIdFound = TRUE;
- }
-
- return eventIdFound;
-}
-
-
-void storeFreezeFrameDataPriMem(const Dem_EventParameterType *eventParam, FreezeFrameRecType *freezeFrame)
-{
- // TODO: Fill out
-}
-
-
-void deleteFreezeFrameDataPriMem(const Dem_EventParameterType *eventParam)
-{
- // TODO: Fill out
-}
-
-
-/*
- * Procedure: storeFreezeFrameDataEvtMem
- * Description: Store the freeze frame data in event memory according to
- * "eventParam" destination option
- */
-void storeFreezeFrameDataEvtMem(const Dem_EventParameterType *eventParam, FreezeFrameRecType *freezeFrame)
-{
- uint16 i;
-
- for (i = 0; (i < DEM_MAX_NR_OF_EVENT_DESTINATION) && (eventParam->EventClass->EventDestination[i] != NULL); i++) {
- switch (eventParam->EventClass->EventDestination[i])
- {
- case DEM_DTC_ORIGIN_PRIMARY_MEMORY:
- storeFreezeFrameDataPriMem(eventParam, freezeFrame);
- break;
-
- case DEM_DTC_ORIGIN_SECONDARY_MEMORY:
- case DEM_DTC_ORIGIN_PERMANENT_MEMORY:
- case DEM_DTC_ORIGIN_MIRROR_MEMORY:
- // Not yet supported
-#if (DEM_DEV_ERROR_DETECT == STD_ON)
- Det_ReportError(MODULE_ID_DEM, 0, DEM_GLOBAL_ID, DEM_E_NOT_IMPLEMENTED_YET);
-#endif
- break;
- default:
- break;
- }
- }
-}
-
-
-/*
- * Procedure: handlePreInitEvent
- * Description: Handle the updating of event status and storing of
- * event related data in preInit buffers.
- */
-void handlePreInitEvent(Dem_EventIdType eventId, Dem_EventStatusType eventStatus)
-{
- const Dem_EventParameterType *eventParam;
- EventStatusRecType eventStatusLocal;
- FreezeFrameRecType freezeFrameLocal;
- ExtDataRecType extendedDataLocal;
-
- // Find configuration for this event
- lookupEventIdParameter(eventId, &eventParam);
- if (eventParam != NULL) {
- if (eventParam->EventClass->OperationCycleRef < DEM_OPERATION_CYCLE_ID_ENDMARK) {
- if (operationCycleStateList[eventParam->EventClass->OperationCycleRef] == DEM_CYCLE_STATE_START) {
- if (eventStatus == DEM_EVENT_STATUS_PASSED) {
- updateEventStatusRec(eventParam, eventStatus, FALSE, &eventStatusLocal);
- }
- else {
- updateEventStatusRec(eventParam, eventStatus, TRUE, &eventStatusLocal);
- }
-
- if (eventStatusLocal.eventStatusChanged) {
-
- if (eventStatusLocal.eventStatus == DEM_EVENT_STATUS_FAILED) {
- // Collect freeze frame data
- getFreezeFrameData(eventParam, &freezeFrameLocal);
- if (freezeFrameLocal.eventId != DEM_EVENT_ID_NULL) {
- storeFreezeFrameDataPreInit(eventParam, &freezeFrameLocal);
- }
-
- // Collect extended data
- getExtendedData(eventParam, &extendedDataLocal);
- if (extendedDataLocal.eventId != DEM_EVENT_ID_NULL) {
- storeExtendedDataPreInit(eventParam, &extendedDataLocal);
- }
- }
- }
- }
- else {
- // Operation cycle not started
- // TODO: Report error?
- }
- }
- else {
- // Operation cycle not set
- // TODO: Report error?
- }
- }
- else {
- // Event ID not configured
- // TODO: Report error?
- }
-}
-
-
-/*
- * Procedure: handleEvent
- * Description: Handle the updating of event status and storing of
- * event related data in event memory.
- */
-Std_ReturnType handleEvent(Dem_EventIdType eventId, Dem_EventStatusType eventStatus)
-{
- Std_ReturnType returnCode = E_OK;
- const Dem_EventParameterType *eventParam;
- EventStatusRecType eventStatusLocal;
- FreezeFrameRecType freezeFrameLocal;
- ExtDataRecType extendedDataLocal;
-
- // Find configuration for this event
- lookupEventIdParameter(eventId, &eventParam);
- if (eventParam != NULL) {
- if (eventParam->EventClass->OperationCycleRef < DEM_OPERATION_CYCLE_ID_ENDMARK) {
- if (operationCycleStateList[eventParam->EventClass->OperationCycleRef] == DEM_CYCLE_STATE_START) {
- if (!(disableDtcStorage.storageDisabled && checkDtcGroup(disableDtcStorage.dtcGroup, eventParam) && checkDtcKind(disableDtcStorage.dtcKind, eventParam))) {
- updateEventStatusRec(eventParam, eventStatus, TRUE, &eventStatusLocal);
- if (eventStatusLocal.eventStatusChanged) {
- if (eventStatusLocal.eventStatus == DEM_EVENT_STATUS_FAILED) {
- storeEventEvtMem(eventParam, &eventStatusLocal);
- // Collect freeze frame data
- getFreezeFrameData(eventParam, &freezeFrameLocal);
- if (freezeFrameLocal.eventId != DEM_EVENT_ID_NULL) {
- storeFreezeFrameDataEvtMem(eventParam, &freezeFrameLocal);
- }
-
- // Collect extended data
- getExtendedData(eventParam, &extendedDataLocal);
- if (extendedDataLocal.eventId != DEM_EVENT_ID_NULL)
- {
- storeExtendedDataEvtMem(eventParam, &extendedDataLocal);
- }
- }
- }
- }
- }
- else {
- // Operation cycle not started
- returnCode = E_NOT_OK;
- }
- }
- else {
- // Operation cycle not set
- returnCode = E_NOT_OK;
- }
- }
- else {
- // Event ID not configured
- returnCode = E_NOT_OK;
- }
-
- return returnCode;
-}
-
-
-/*
- * Procedure: getEventStatus
- * Description: Returns the extended event status bitmask of eventId in "eventStatusExtended".
- */
-void getEventStatus(Dem_EventIdType eventId, Dem_EventStatusExtendedType *eventStatusExtended)
-{
- EventStatusRecType eventStatusLocal;
-
- // Get recorded status
- getEventStatusRec(eventId, &eventStatusLocal);
- if (eventStatusLocal.eventId == eventId) {
- *eventStatusExtended = eventStatusLocal.eventStatusExtended;
- }
- else {
- // Event Id not found, no report received.
- *eventStatusExtended = DEM_TEST_NOT_COMPLETED_THIS_OPERATION_CYCLE | DEM_TEST_NOT_COMPLETED_SINCE_LAST_CLEAR;
- }
-}
-
-
-/*
- * Procedure: getEventFailed
- * Description: Returns the TRUE or FALSE of "eventId" in "eventFailed" depending on current status.
- */
-void getEventFailed(Dem_EventIdType eventId, boolean *eventFailed)
-{
- EventStatusRecType eventStatusLocal;
-
- // Get recorded status
- getEventStatusRec(eventId, &eventStatusLocal);
- if (eventStatusLocal.eventId == eventId) {
- if (eventStatusLocal.eventStatusExtended & DEM_TEST_FAILED) {
- *eventFailed = TRUE;
- }
- else {
- *eventFailed = FALSE;
- }
- }
- else {
- // Event Id not found, assume ok.
- *eventFailed = FALSE;
- }
-}
-
-
-/*
- * Procedure: getEventTested
- * Description: Returns the TRUE or FALSE of "eventId" in "eventTested" depending on
- * current status the "test not completed this operation cycle" bit.
- */
-void getEventTested(Dem_EventIdType eventId, boolean *eventTested)
-{
- EventStatusRecType eventStatusLocal;
-
- // Get recorded status
- getEventStatusRec(eventId, &eventStatusLocal);
- if (eventStatusLocal.eventId == eventId) {
- if ( !(eventStatusLocal.eventStatusExtended & DEM_TEST_NOT_COMPLETED_THIS_OPERATION_CYCLE)) {
- *eventTested = TRUE;
- }
- else {
- *eventTested = FALSE;
- }
- }
- else {
- // Event Id not found, not tested.
- *eventTested = FALSE;
- }
-}
-
-
-/*
- * Procedure: getFaultDetectionCounter
- * Description: Returns pre debounce counter of "eventId" in "counter" and return value E_OK if
- * the counter was available else E_NOT_OK.
- */
-Std_ReturnType getFaultDetectionCounter(Dem_EventIdType eventId, sint8 *counter)
-{
- Std_ReturnType returnCode = E_NOT_OK;
- const Dem_EventParameterType *eventParam;
-
- lookupEventIdParameter(eventId, &eventParam);
- if (eventParam != NULL) {
- if (eventParam->EventClass->PreDebounceAlgorithmClass != NULL) {
- switch (eventParam->EventClass->PreDebounceAlgorithmClass->PreDebounceName)
- {
- case DEM_NO_PRE_DEBOUNCE:
- if (eventParam->EventClass->PreDebounceAlgorithmClass->PreDebounceAlgorithm.PreDebounceMonitorInternal != NULL) {
- returnCode = eventParam->EventClass->PreDebounceAlgorithmClass->PreDebounceAlgorithm.PreDebounceMonitorInternal->CallbackGetFDCntFnc(counter);
- }
- break;
-
- case DEM_PRE_DEBOUNCE_COUNTER_BASED:
- case DEM_PRE_DEBOUNCE_FREQUENCY_BASED:
- case DEM_PRE_DEBOUNCE_TIME_BASED:
-#if (DEM_DEV_ERROR_DETECT == STD_ON)
- Det_ReportError(MODULE_ID_DEM, 0, DEM_GETFAULTDETECTIONCOUNTER_ID, DEM_E_NOT_IMPLEMENTED_YET);
-#endif
- break;
-
- default:
-#if (DEM_DEV_ERROR_DETECT == STD_ON)
- Det_ReportError(MODULE_ID_DEM, 0, DEM_GETFAULTDETECTIONCOUNTER_ID, DEM_E_PARAM_DATA);
-#endif
- break;
- }
- }
- }
-
- return returnCode;
-}
-
-
-/*
- * Procedure: setOperationCycleState
- * Description: Change the operation state of "operationCycleId" to "cycleState" and updates stored
- * event connected to this cycle id.
- * Returns E_OK if operation was successful else E_NOT_OK.
- */
-Std_ReturnType setOperationCycleState(Dem_OperationCycleIdType operationCycleId, Dem_OperationCycleStateType cycleState)
-{
- uint16 i;
- Std_ReturnType returnCode = E_OK;
-
- if (operationCycleId < DEM_OPERATION_CYCLE_ID_ENDMARK) {
- switch (cycleState)
- {
- case DEM_CYCLE_STATE_START:
- operationCycleStateList[operationCycleId] = cycleState;
- // Lookup event ID
- for (i = 0; i < DEM_MAX_NUMBER_EVENT; i++) {
- if ((eventStatusBuffer[i].eventId != DEM_EVENT_ID_NULL) && (eventStatusBuffer[i].eventParamRef->EventClass->OperationCycleRef == operationCycleId)) {
- eventStatusBuffer[i].eventStatusExtended &= ~DEM_TEST_FAILED_THIS_OPERATION_CYCLE;
- eventStatusBuffer[i].eventStatusExtended |= DEM_TEST_NOT_COMPLETED_THIS_OPERATION_CYCLE;
- }
- }
- break;
-
- case DEM_CYCLE_STATE_END:
- operationCycleStateList[operationCycleId] = cycleState;
- // Lookup event ID
- for (i = 0; i < DEM_MAX_NUMBER_EVENT; i++) {
- if ((eventStatusBuffer[i].eventId != DEM_EVENT_ID_NULL) && (eventStatusBuffer[i].eventParamRef->EventClass->OperationCycleRef == operationCycleId)) {
- if (!(eventStatusBuffer[i].eventStatusExtended & DEM_TEST_FAILED_THIS_OPERATION_CYCLE) && !(eventStatusBuffer[i].eventStatusExtended & DEM_TEST_NOT_COMPLETED_THIS_OPERATION_CYCLE)) {
- eventStatusBuffer[i].eventStatusExtended &= ~DEM_PENDING_DTC; // Clear pendingDTC bit
- }
- }
- }
- break;
- default:
-#if (DEM_DEV_ERROR_DETECT == STD_ON)
- Det_ReportError(MODULE_ID_DEM, 0, DEM_SETOPERATIONCYCLESTATE_ID, DEM_E_PARAM_DATA);
-#endif
- returnCode = E_NOT_OK;
- break;
- }
- }
- else {
-#if (DEM_DEV_ERROR_DETECT == STD_ON)
- Det_ReportError(MODULE_ID_DEM, 0, DEM_SETOPERATIONCYCLESTATE_ID, DEM_E_PARAM_DATA);
-#endif
- returnCode = E_NOT_OK;
- }
-
- return returnCode;
-}
-
-
-//==============================================================================//
-// //
-// E X T E R N A L F U N C T I O N S //
-// //
-//==============================================================================//
-
-/*********************************************
- * Interface for upper layer modules (8.3.1) *
- *********************************************/
-
-/*
- * Procedure: Dem_GetVersionInfo
- * Reentrant: Yes
- */
-#if (DEM_VERSION_INFO_API == STD_ON)
-void Dem_GetVersionInfo(Std_VersionInfoType *versionInfo) {
- memcpy(versionInfo, &_Dem_VersionInfo, sizeof(Std_VersionInfoType));
-}
-#endif /* DEM_VERSION_INFO_API */
-
-
-/***********************************************
- * Interface ECU State Manager <-> DEM (8.3.2) *
- ***********************************************/
-
-/*
- * Procedure: Dem_PreInit
- * Reentrant: No
- */
-void Dem_PreInit(void)
-{
- int i, j;
-
- if (DEM_Config.ConfigSet == NULL) {
-#if (DEM_DEV_ERROR_DETECT == STD_ON)
- Det_ReportError(MODULE_ID_DEM, 0, DEM_PREINIT_ID, DEM_E_CONFIG_PTR_INVALID);
-#endif
- return;
- } else {
- configSet = DEM_Config.ConfigSet;
- }
-
- // Initializion of operation cycle states.
- for (i = 0; i < DEM_OPERATION_CYCLE_ID_ENDMARK; i++) {
- operationCycleStateList[i] = DEM_CYCLE_STATE_END;
- }
-
- // Initialize the event status buffer
- for (i = 0; i < DEM_MAX_NUMBER_EVENT; i++) {
- eventStatusBuffer[i].eventId = DEM_EVENT_ID_NULL;
- eventStatusBuffer[i].occurrence = 0;
- eventStatusBuffer[i].eventStatusExtended = DEM_TEST_NOT_COMPLETED_THIS_OPERATION_CYCLE | DEM_TEST_NOT_COMPLETED_SINCE_LAST_CLEAR;
- eventStatusBuffer[i].eventStatus = DEM_EVENT_STATUS_PASSED;
- eventStatusBuffer[i].eventStatusChanged = FALSE;
- }
-
- // Initialize the pre init buffers
- for (i = 0; i < DEM_MAX_NUMBER_FF_DATA_PRE_INIT; i++) {
- preInitFreezeFrameBuffer[i].checksum = 0;
- preInitFreezeFrameBuffer[i].eventId = DEM_EVENT_ID_NULL;
- preInitFreezeFrameBuffer[i].occurrence = 0;
- preInitFreezeFrameBuffer[i].dataSize = 0;
- for (j = 0; j < DEM_MAX_SIZE_FF_DATA;j++)
- preInitFreezeFrameBuffer[i].data[j] = 0;
- }
-
- for (i = 0; i < DEM_MAX_NUMBER_EXT_DATA_PRE_INIT; i++) {
- preInitExtDataBuffer[i].checksum = 0;
- preInitExtDataBuffer[i].eventId = DEM_EVENT_ID_NULL;
- preInitExtDataBuffer[i].dataSize = 0;
- for (j = 0; j < DEM_MAX_SIZE_EXT_DATA;j++)
- preInitExtDataBuffer[i].data[j] = 0;
- }
-
- disableDtcStorage.storageDisabled = FALSE;
-
- setOperationCycleState(DEM_ACTIVE, DEM_CYCLE_STATE_START);
-
- demState = DEM_PREINITIALIZED;
-}
-
-
-/*
- * Procedure: Dem_Init
- * Reentrant: No
- */
-void Dem_Init(void)
-{
- uint16 i;
- ChecksumType cSum;
- const Dem_EventParameterType *eventParam;
-
- /*
- * Validate and read out saved error log from non volatile memory
- */
-
- // Validate event records stored in primary memory
- for (i = 0; i < DEM_MAX_NUMBER_EVENT_PRI_MEM; i++) {
- cSum = calcChecksum(&priMemEventBuffer[i], sizeof(EventRecType)-sizeof(ChecksumType));
- if ((cSum != priMemEventBuffer[i].checksum) || priMemEventBuffer[i].eventId == DEM_EVENT_ID_NULL) {
- // Unlegal record, clear the record
- memset(&priMemEventBuffer[i], 0, sizeof(EventRecType));
- }
- else {
- // Valid, update current status
- mergeEventStatusRec(&priMemEventBuffer[i]);
-
- // Update occurrence counter on pre init stored freeze frames
- updateFreezeFrameOccurrencePreInit(&priMemEventBuffer[i]);
- }
- }
-
- // Validate extended data records stored in primary memory
- for (i = 0; i < DEM_MAX_NUMBER_EXT_DATA_PRI_MEM; i++) {
- cSum = calcChecksum(&priMemExtDataBuffer[i], sizeof(ExtDataRecType)-sizeof(ChecksumType));
- if ((cSum != priMemExtDataBuffer[i].checksum) || priMemExtDataBuffer[i].eventId == DEM_EVENT_ID_NULL) {
- // Unlegal record, clear the record
- memset(&priMemExtDataBuffer[i], 0, sizeof(ExtDataRecType));
- }
- }
-
- // Validate freeze frame records stored in primary memory
- for (i = 0; i < DEM_MAX_NUMBER_FF_DATA_PRI_MEM; i++) {
- cSum = calcChecksum(&priMemFreezeFrameBuffer[i], sizeof(FreezeFrameRecType)-sizeof(ChecksumType));
- if ((cSum != priMemFreezeFrameBuffer[i].checksum) || (priMemFreezeFrameBuffer[i].eventId == DEM_EVENT_ID_NULL)) {
- // Unlegal record, clear the record
- memset(&priMemFreezeFrameBuffer[i], 0, sizeof(FreezeFrameRecType));
- }
- }
-
- /*
- * Handle errors stored in temporary buffer (if any)
- */
-
- // Transfer updated event data to event memory
- for (i = 0; i < DEM_MAX_NUMBER_EVENT; i++) {
- if (eventStatusBuffer[i].eventId != DEM_EVENT_ID_NULL) {
- // Update the event memory
- lookupEventIdParameter(eventStatusBuffer[i].eventId, &eventParam);
- storeEventEvtMem(eventParam, &eventStatusBuffer[i]);
- }
- }
-
- // Transfer extended data to event memory if necessary
- for (i = 0; i < DEM_MAX_NUMBER_EXT_DATA_PRE_INIT; i++) {
- if (preInitExtDataBuffer[i].eventId != DEM_EVENT_ID_NULL) {
- lookupEventIdParameter(preInitExtDataBuffer[i].eventId, &eventParam);
- storeExtendedDataEvtMem(eventParam, &preInitExtDataBuffer[i]);
- }
- }
-
- // Transfer freeze frames to event memory
- for (i = 0; i < DEM_MAX_NUMBER_FF_DATA_PRE_INIT; i++) {
- if (preInitFreezeFrameBuffer[i].eventId != DEM_EVENT_ID_NULL) {
- lookupEventIdParameter(preInitFreezeFrameBuffer[i].eventId, &eventParam);
- storeFreezeFrameDataEvtMem(eventParam, &preInitFreezeFrameBuffer[i]);
- }
- }
-
- // Init the dtc filter
- dtcFilter.dtcStatusMask = DEM_DTC_STATUS_MASK_ALL; // All allowed
- dtcFilter.dtcKind = DEM_DTC_KIND_ALL_DTCS; // All kinds of DTCs
- dtcFilter.dtcOrigin = DEM_DTC_ORIGIN_PRIMARY_MEMORY; // Primary memory
- dtcFilter.filterWithSeverity = DEM_FILTER_WITH_SEVERITY_NO; // No Severity filtering
- dtcFilter.dtcSeverityMask = DEM_SEVERITY_NO_SEVERITY; // Not used when filterWithSeverity is FALSE
- dtcFilter.filterForFaultDetectionCounter = DEM_FILTER_FOR_FDC_NO; // No fault detection counter filtering
-
- dtcFilter.faultIndex = DEM_MAX_NUMBER_EVENT;
-
- disableDtcStorage.storageDisabled = FALSE;
-
- demState = DEM_INITIALIZED;
-}
-
-
-/*
- * Procedure: Dem_shutdown
- * Reentrant: No
- */
-void Dem_Shutdown(void)
-{
- setOperationCycleState(DEM_ACTIVE, DEM_CYCLE_STATE_END);
-
- demState = DEM_UNINITIALIZED;
-}
-
-
-/*
- * Interface for basic software scheduler
- */
-void Dem_MainFunction(void)
-{
-
-}
-
-
-/***************************************************
- * Interface SW-Components via RTE <-> DEM (8.3.3) *
- ***************************************************/
-
-/*
- * Procedure: Dem_SetEventStatus
- * Reentrant: Yes
- */
-Std_ReturnType Dem_SetEventStatus(Dem_EventIdType eventId, Dem_EventStatusType eventStatus)
-{
- Std_ReturnType returnCode = E_OK;
-
- if (demState == DEM_INITIALIZED) // No action is taken if the module is not started
- {
- returnCode = handleEvent(eventId, eventStatus);
- }
- else
- {
-#if (DEM_DEV_ERROR_DETECT == STD_ON)
- Det_ReportError(MODULE_ID_DEM, 0, DEM_SETEVENTSTATUS_ID, DEM_E_UNINIT);
-#endif
- returnCode = E_NOT_OK;
- }
-
- return returnCode;
-}
-
-
-/*
- * Procedure: Dem_ResetEventStatus
- * Reentrant: Yes
- */
-Std_ReturnType Dem_ResetEventStatus(Dem_EventIdType eventId)
-{
- const Dem_EventParameterType *eventParam;
- EventStatusRecType eventStatusLocal;
- Std_ReturnType returnCode = E_OK;
-
- if (demState == DEM_INITIALIZED) // No action is taken if the module is not started
- {
- lookupEventIdParameter(eventId, &eventParam);
- if (eventParam != NULL) {
- updateEventStatusRec(eventParam, DEM_EVENT_STATUS_PASSED, FALSE, &eventStatusLocal);
- }
- }
- else
- {
-#if (DEM_DEV_ERROR_DETECT == STD_ON)
- Det_ReportError(MODULE_ID_DEM, 0, DEM_RESETEVENTSTATUS_ID, DEM_E_UNINIT);
-#endif
- returnCode = E_NOT_OK;
- }
-
- return returnCode;
-}
-
-
-/*
- * Procedure: Dem_GetEventStatus
- * Reentrant: Yes
- */
-Std_ReturnType Dem_GetEventStatus(Dem_EventIdType eventId, Dem_EventStatusExtendedType *eventStatusExtended)
-{
- Std_ReturnType returnCode = E_OK;
-
- if (demState == DEM_INITIALIZED) // No action is taken if the module is not started
- {
- getEventStatus(eventId, eventStatusExtended);
- }
- else
- {
-#if (DEM_DEV_ERROR_DETECT == STD_ON)
- Det_ReportError(MODULE_ID_DEM, 0, DEM_GETEVENTSTATUS_ID, DEM_E_UNINIT);
-#endif
- returnCode = E_NOT_OK;
- }
-
- return returnCode;
-}
-
-
-/*
- * Procedure: Dem_GetEventFailed
- * Reentrant: Yes
- */
-Std_ReturnType Dem_GetEventFailed(Dem_EventIdType eventId, boolean *eventFailed)
-{
- Std_ReturnType returnCode = E_OK;
-
- if (demState == DEM_INITIALIZED) // No action is taken if the module is not started
- {
- getEventFailed(eventId, eventFailed);
- }
- else
- {
-#if (DEM_DEV_ERROR_DETECT == STD_ON)
- Det_ReportError(MODULE_ID_DEM, 0, DEM_GETEVENTFAILED_ID, DEM_E_UNINIT);
-#endif
- returnCode = E_NOT_OK;
- }
-
- return returnCode;
-}
-
-
-/*
- * Procedure: Dem_GetEventTested
- * Reentrant: Yes
- */
-Std_ReturnType Dem_GetEventTested(Dem_EventIdType eventId, boolean *eventTested)
-{
- Std_ReturnType returnCode = E_OK;
-
- if (demState == DEM_INITIALIZED) // No action is taken if the module is not started
- {
- getEventTested(eventId, eventTested);
- }
- else
- {
-#if (DEM_DEV_ERROR_DETECT == STD_ON)
- Det_ReportError(MODULE_ID_DEM, 0, DEM_GETEVENTTESTED_ID, DEM_E_UNINIT);
-#endif
- returnCode = E_NOT_OK;
- }
-
- return returnCode;
-}
-
-
-/*
- * Procedure: Dem_GetFaultDetectionCounter
- * Reentrant: No
- */
-Std_ReturnType Dem_GetFaultDetectionCounter(Dem_EventIdType eventId, sint8 *counter)
-{
- Std_ReturnType returnCode = E_OK;
-
- if (demState == DEM_INITIALIZED) // No action is taken if the module is not started
- {
- returnCode = getFaultDetectionCounter(eventId, counter);
- }
- else
- {
-#if (DEM_DEV_ERROR_DETECT == STD_ON)
- Det_ReportError(MODULE_ID_DEM, 0, DEM_GETFAULTDETECTIONCOUNTER_ID, DEM_E_UNINIT);
-#endif
- returnCode = E_NOT_OK;
- }
-
- return returnCode;
-}
-
-
-/*
- * Procedure: Dem_SetOperationCycleState
- * Reentrant: No
- */
-Std_ReturnType Dem_SetOperationCycleState(Dem_OperationCycleIdType operationCycleId, Dem_OperationCycleStateType cycleState)
-{
- Std_ReturnType returnCode = E_OK;
-
- if (demState == DEM_INITIALIZED) // No action is taken if the module is not started
- {
- returnCode = setOperationCycleState(operationCycleId, cycleState);
-
- }
- else
- {
-#if (DEM_DEV_ERROR_DETECT == STD_ON)
- Det_ReportError(MODULE_ID_DEM, 0, DEM_SETOPERATIONCYCLESTATE_ID, DEM_E_UNINIT);
-#endif
- returnCode = E_NOT_OK;
- }
-
- return returnCode;
-}
-
-
-/*
- * Procedure: Dem_GetDTCOfEvent
- * Reentrant: Yes
- */
-Std_ReturnType Dem_GetDTCOfEvent(Dem_EventIdType eventId, Dem_DTCKindType dtcKind, uint32* dtcOfEvent)
-{
- Std_ReturnType returnCode = E_NO_DTC_AVAILABLE;
- const Dem_EventParameterType *eventParam;
-
- lookupEventIdParameter(eventId, &eventParam);
-
- if (eventParam != NULL) {
- if (checkDtcKind(dtcKind, eventParam)) {
- if (eventParam->DTCClassRef != NULL) {
- *dtcOfEvent = eventParam->DTCClassRef->DTC;
- returnCode = E_OK;
- }
- }
- }
- else {
- // Event Id not found
- returnCode = E_NOT_OK;
- }
-
- return returnCode;
-}
-
-
-/********************************************
- * Interface BSW-Components <-> DEM (8.3.4) *
- ********************************************/
-
-/*
- * Procedure: Dem_ReportErrorStatus
- * Reentrant: Yes
- */
-void Dem_ReportErrorStatus( Dem_EventIdType eventId, Dem_EventStatusType eventStatus )
-{
-
- switch (demState) {
- case DEM_PREINITIALIZED:
- // Update status and check if is to be stored
- if ((eventStatus == DEM_EVENT_STATUS_PASSED) || (eventStatus == DEM_EVENT_STATUS_FAILED)) {
- handlePreInitEvent(eventId, eventStatus);
- }
- break;
-
- case DEM_INITIALIZED:
- // Handle report
- if ((eventStatus == DEM_EVENT_STATUS_PASSED) || (eventStatus == DEM_EVENT_STATUS_FAILED)) {
- (void)handleEvent(eventId, eventStatus);
- }
- break;
-
- case DEM_UNINITIALIZED:
- default:
- // Uninitialized can not do anything
-#if (DEM_DEV_ERROR_DETECT == STD_ON)
- Det_ReportError(MODULE_ID_DEM, 0, DEM_REPORTERRORSTATUS_ID, DEM_E_UNINIT);
-#endif
- break;
-
- } // switch (demState)
-}
-
-/*********************************
- * Interface DCM <-> DEM (8.3.5) *
- *********************************/
-/*
- * Procedure: Dem_GetDTCStatusAvailabilityMask
- * Reentrant: No
- */
-Std_ReturnType Dem_GetDTCStatusAvailabilityMask(uint8 *dtcStatusMask)
-{
- *dtcStatusMask = DEM_DTC_STATUS_AVAILABILITY_MASK; // User configuration mask
- *dtcStatusMask &= DEM_TEST_FAILED // Mask with supported bits
- | DEM_TEST_FAILED_THIS_OPERATION_CYCLE
- | DEM_PENDING_DTC
-// | DEM_CONFIRMED_DTC TODO: Add support for this bit
- | DEM_TEST_NOT_COMPLETED_SINCE_LAST_CLEAR
- | DEM_TEST_FAILED_SINCE_LAST_CLEAR
- | DEM_TEST_NOT_COMPLETED_THIS_OPERATION_CYCLE
-// | DEM_WARNING_INDICATOR_REQUESTED TODO: Add support for this bit
- ;
-
- return E_OK;
-}
-
-
-/*
- * Procedure: Dem_SetDTCFilter
- * Reentrant: No
- */
-Dem_ReturnSetDTCFilterType Dem_SetDTCFilter(uint8 dtcStatusMask,
- Dem_DTCKindType dtcKind,
- Dem_DTCOriginType dtcOrigin,
- Dem_FilterWithSeverityType filterWithSeverity,
- Dem_DTCSeverityType dtcSeverityMask,
- Dem_FilterForFDCType filterForFaultDetectionCounter) {
-
- Dem_ReturnSetDTCFilterType returnCode = DEM_WRONG_FILTER;
-
- // Check dtcKind parameter
- if ((dtcKind == DEM_DTC_KIND_ALL_DTCS) || (dtcKind == DEM_DTC_KIND_EMISSION_REL_DTCS)) {
-
- // Check dtcOrigin parameter
- if ((dtcOrigin == DEM_DTC_ORIGIN_SECONDARY_MEMORY) || (dtcOrigin == DEM_DTC_ORIGIN_PRIMARY_MEMORY)
- || (dtcOrigin == DEM_DTC_ORIGIN_PERMANENT_MEMORY) || (dtcOrigin == DEM_DTC_ORIGIN_MIRROR_MEMORY)) {
-
- // Check filterWithSeverity and dtcSeverityMask parameter
- if ((filterWithSeverity == DEM_FILTER_WITH_SEVERITY_NO)
- || ((filterWithSeverity == DEM_FILTER_WITH_SEVERITY_YES) && !(dtcSeverityMask & ~(DEM_SEVERITY_MAINTENANCE_ONLY | DEM_SEVERITY_CHECK_AT_NEXT_FALT | DEM_SEVERITY_CHECK_IMMEDIATELY)))){
-
- // Check filterForFaultDetectionCounter parameter
- if ((filterForFaultDetectionCounter == DEM_FILTER_FOR_FDC_YES) || (filterForFaultDetectionCounter == DEM_FILTER_FOR_FDC_NO)) {
- // Yes all parameters correct, set the new filters.
- dtcFilter.dtcStatusMask = dtcStatusMask;
- dtcFilter.dtcKind = dtcKind;
- dtcFilter.dtcOrigin = dtcOrigin;
- dtcFilter.filterWithSeverity = filterWithSeverity;
- dtcFilter.dtcSeverityMask = dtcSeverityMask;
- dtcFilter.filterForFaultDetectionCounter = filterForFaultDetectionCounter;
- dtcFilter.faultIndex = DEM_MAX_NUMBER_EVENT;
- returnCode = DEM_FILTER_ACCEPTED;
- }
- }
- }
- }
-
- return returnCode;
-}
-
-
-/*
- * Procedure: Dem_GetStatusOfDTC
- * Reentrant: No
- */
-Dem_ReturnGetStatusOfDTCType Dem_GetStatusOfDTC(uint32 dtc, Dem_DTCKindType dtcKind, Dem_DTCOriginType dtcOrigin, Dem_EventStatusExtendedType* status) {
- Dem_ReturnGetStatusOfDTCType returnCode = DEM_STATUS_FAILED;
- EventStatusRecType *eventRec;
-
- if (lookupDtcEvent(dtc, &eventRec)) {
- if (checkDtcKind(dtcKind, eventRec->eventParamRef)) {
- if (checkDtcOrigin(dtcOrigin,eventRec->eventParamRef)) {
- *status = eventRec->eventStatusExtended;
- returnCode = DEM_STATUS_OK;
- }
- else {
- returnCode = DEM_STATUS_WRONG_DTCORIGIN;
- }
- }
- else {
- returnCode = DEM_STATUS_WRONG_DTCKIND;
- }
- }
- else {
- returnCode = DEM_STATUS_WRONG_DTC;
- }
-
- return returnCode;
-}
-
-
-/*
- * Procedure: Dem_GetNumberOfFilteredDtc
- * Reentrant: No
- */
-Dem_ReturnGetNumberOfFilteredDTCType Dem_GetNumberOfFilteredDtc(uint16 *numberOfFilteredDTC) {
- uint16 i;
- uint16 numberOfFaults = 0;
-
- //Dem_DisableEventStatusUpdate();
-
- for (i = 0; i < DEM_MAX_NUMBER_EVENT; i++) {
- if (eventStatusBuffer[i].eventId != DEM_EVENT_ID_NULL) {
- if (matchEventWithDtcFilter(&eventStatusBuffer[i])) {
- if (eventStatusBuffer[i].eventParamRef->DTCClassRef != NULL) {
- numberOfFaults++;
- }
- }
- }
- }
-
- //Dem_EnableEventStatusUpdate();
-
- *numberOfFilteredDTC = numberOfFaults;
-
- return DEM_NUMBER_OK;
-}
-
-
-/*
- * Procedure: Dem_GetNextFilteredDTC
- * Reentrant: No
- */
-Dem_ReturnGetNextFilteredDTCType Dem_GetNextFilteredDTC(uint32 *dtc, Dem_EventStatusExtendedType *dtcStatus)
-{
- Dem_ReturnGetNextFilteredDTCType returnCode = DEM_FILTERED_OK;
- boolean dtcFound = FALSE;
-
- // TODO: This job should be done in an more advanced way according to Dem288
- while (!dtcFound && (dtcFilter.faultIndex != 0)) {
- dtcFilter.faultIndex--;
- if (eventStatusBuffer[dtcFilter.faultIndex].eventId != DEM_EVENT_ID_NULL) {
- if (matchEventWithDtcFilter(&eventStatusBuffer[dtcFilter.faultIndex])) {
- if (eventStatusBuffer[dtcFilter.faultIndex].eventParamRef->DTCClassRef != NULL) {
- *dtc = eventStatusBuffer[dtcFilter.faultIndex].eventParamRef->DTCClassRef->DTC;
- *dtcStatus = eventStatusBuffer[dtcFilter.faultIndex].eventStatusExtended;
- dtcFound = TRUE;
- }
- }
- }
- }
-
- if (!dtcFound) {
- dtcFilter.faultIndex = DEM_MAX_NUMBER_EVENT;
- returnCode = DEM_FILTERED_NO_MATCHING_DTC;
- }
-
- return returnCode;
-}
-
-
-/*
- * Procedure: Dem_GetTranslationType
- * Reentrant: No
- */
-Dem_ReturnTypeOfDtcSupportedType Dem_GetTranslationType(void)
-{
- return DEM_TYPE_OF_DTC_SUPPORTED;
-}
-
-
-/*
- * Procedure: Dem_ClearDTC
- * Reentrant: No
- */
-Dem_ReturnClearDTCType Dem_ClearDTC(uint32 dtc, Dem_DTCKindType dtcKind, Dem_DTCOriginType dtcOrigin)
-{
- Dem_ReturnClearDTCType returnCode = DEM_CLEAR_OK;
- Dem_EventIdType eventId;
- const Dem_EventParameterType *eventParam;
- uint16 i, j;
-
- // Loop through the event buffer
- for (i = 0; i < DEM_MAX_NUMBER_EVENT; i++) {
- eventId = eventStatusBuffer[i].eventId;
- if (eventId != DEM_EVENT_ID_NULL) {
- eventParam = eventStatusBuffer[i].eventParamRef;
- if (eventParam != NULL) {
- if (DEM_CLEAR_ALL_EVENTS | (eventParam->DTCClassRef != NULL)) {
- if (checkDtcKind(dtcKind, eventParam)) {
- if (checkDtcGroup(dtc, eventParam)) {
- for (j = 0; (j < DEM_MAX_NR_OF_EVENT_DESTINATION) && (eventParam->EventClass->EventDestination[j] != dtcOrigin); j++);
- if (j < DEM_MAX_NR_OF_EVENT_DESTINATION) {
- // Yes! All conditions met.
- switch (dtcOrigin)
- {
- case DEM_DTC_ORIGIN_PRIMARY_MEMORY:
- deleteEventPriMem(eventParam);
- deleteFreezeFrameDataPriMem(eventParam);
- deleteExtendedDataPriMem(eventParam);
- deleteEventStatusRec(eventParam); // TODO: Shall this be done or just resetting the status?
- break;
-
- case DEM_DTC_ORIGIN_SECONDARY_MEMORY:
- case DEM_DTC_ORIGIN_PERMANENT_MEMORY:
- case DEM_DTC_ORIGIN_MIRROR_MEMORY:
- // Not yet supported
- returnCode = DEM_CLEAR_WRONG_DTCORIGIN;
-#if (DEM_DEV_ERROR_DETECT == STD_ON)
- Det_ReportError(MODULE_ID_DEM, 0, DEM_CLEARDTC_ID, DEM_E_NOT_IMPLEMENTED_YET);
-#endif
- break;
- default:
- returnCode = DEM_CLEAR_WRONG_DTCORIGIN;
- break;
- }
- }
- }
- }
- }
- }
- else {
- // Fatal error, no event parameters found for the stored event!
-#if (DEM_DEV_ERROR_DETECT == STD_ON)
- Det_ReportError(MODULE_ID_DEM, 0, DEM_CLEARDTC_ID, DEM_E_UNEXPECTED_EXECUTION);
-#endif
- }
- }
- }
-
- return returnCode;
-}
-
-
-/*
- * Procedure: Dem_DisableDTCStorage
- * Reentrant: No
- */
-Dem_ReturnControlDTCStorageType Dem_DisableDTCStorage(Dem_DTCGroupType dtcGroup, Dem_DTCKindType dtcKind)
-{
- Dem_ReturnControlDTCStorageType returnCode = DEM_CONTROL_DTC_STORAGE_N_OK;
-
- // Check dtcGroup parameter
- if (dtcGroup == DEM_DTC_GROUP_ALL_DTCS) {
- // Check dtcKind parameter
- if ((dtcKind == DEM_DTC_KIND_ALL_DTCS) || (dtcKind == DEM_DTC_KIND_EMISSION_REL_DTCS)) {
- disableDtcStorage.dtcGroup = dtcGroup;
- disableDtcStorage.dtcKind = dtcKind;
- disableDtcStorage.storageDisabled = TRUE;
-
- returnCode = DEM_CONTROL_DTC_STORAGE_OK;
- }
- }
- else {
- returnCode = DEM_CONTROL_DTC_WRONG_DTCGROUP;
- }
-
- return returnCode;
-}
-
-
-/*
- * Procedure: Dem_EnableDTCStorage
- * Reentrant: No
- */
-Dem_ReturnControlDTCStorageType Dem_EnableDTCStorage(Dem_DTCGroupType dtcGroup, Dem_DTCKindType dtcKind)
-{
- // TODO: Behavior is not defined if group or kind do not match active settings, therefore the filter is just switched off.
- disableDtcStorage.storageDisabled = FALSE;
-
- return DEM_CONTROL_DTC_STORAGE_OK;
-}
-
-/*
- * Procedure: Dem_GetExtendedDataRecordByDTC
- * Reentrant: No
- */
-Dem_ReturnGetExtendedDataRecordByDTCType Dem_GetExtendedDataRecordByDTC(uint32 dtc, Dem_DTCKindType dtcKind, Dem_DTCOriginType dtcOrigin, uint8 extendedDataNumber, uint8 *destBuffer, uint8 *bufSize)
-{
- Dem_ReturnGetExtendedDataRecordByDTCType returnCode = DEM_RECORD_WRONG_DTC;
- EventStatusRecType *eventRec;
- Dem_ExtendedDataRecordClassType const *extendedDataRecordClass = NULL;
- ExtDataRecType *extData;
- uint8 posInExtData = 0;
-
- if (lookupDtcEvent(dtc, &eventRec)) {
- if (checkDtcKind(dtcKind, eventRec->eventParamRef)) {
- if (checkDtcOrigin(dtcOrigin, eventRec->eventParamRef)) {
- if (lookupExtendedDataRecNumParam(extendedDataNumber, eventRec->eventParamRef, &extendedDataRecordClass, &posInExtData)) {
- if (*bufSize >= extendedDataRecordClass->DataSize) {
- switch (dtcOrigin)
- {
- case DEM_DTC_ORIGIN_PRIMARY_MEMORY:
- if (lookupExtendedDataPriMem(eventRec->eventId, &extData)) {
- // Yes all conditions met, copy the extended data record to destination buffer.
- memcpy(destBuffer, &extData->data[posInExtData], extendedDataRecordClass->DataSize);
- *bufSize = extendedDataRecordClass->DataSize;
- returnCode = DEM_RECORD_OK;
- }
- else {
- // The record number is legal but no record was found for the DTC
- *bufSize = 0;
- returnCode = DEM_RECORD_OK;
- }
- break;
-
- case DEM_DTC_ORIGIN_SECONDARY_MEMORY:
- case DEM_DTC_ORIGIN_PERMANENT_MEMORY:
- case DEM_DTC_ORIGIN_MIRROR_MEMORY:
- // Not yet supported
- returnCode = DEM_RECORD_WRONG_DTCORIGIN;
-#if (DEM_DEV_ERROR_DETECT == STD_ON)
- Det_ReportError(MODULE_ID_DEM, 0, DEM_GETEXTENDEDDATARECORDBYDTC_ID, DEM_E_NOT_IMPLEMENTED_YET);
-#endif
- break;
- default:
- returnCode = DEM_RECORD_WRONG_DTCORIGIN;
- break;
- }
- }
- else {
- returnCode = DEM_RECORD_BUFFERSIZE;
- }
- }
- else {
- returnCode = DEM_RECORD_NUMBER;
- }
- }
- else {
- returnCode = DEM_RECORD_WRONG_DTCORIGIN;
- }
- }
- else {
- returnCode = DEM_RECORD_DTCKIND;
- }
- }
-
- return returnCode;
-}
-
-
-/*
- * Procedure: Dem_GetSizeOfExtendedDataRecordByDTC
- * Reentrant: No
- */
-Dem_ReturnGetSizeOfExtendedDataRecordByDTCType Dem_GetSizeOfExtendedDataRecordByDTC(uint32 dtc, Dem_DTCKindType dtcKind, Dem_DTCOriginType dtcOrigin, uint8 extendedDataNumber, uint16 *sizeOfExtendedDataRecord)
-{
- Dem_ReturnGetExtendedDataRecordByDTCType returnCode = DEM_GET_SIZEOFEDRBYDTC_W_DTC;
- EventStatusRecType *eventRec;
- Dem_ExtendedDataRecordClassType const *extendedDataRecordClass = NULL;
- uint8 posInExtData;
-
- if (lookupDtcEvent(dtc, &eventRec)) {
- if (checkDtcKind(dtcKind, eventRec->eventParamRef)) {
- if (checkDtcOrigin(dtcOrigin, eventRec->eventParamRef)) {
- if (lookupExtendedDataRecNumParam(extendedDataNumber, eventRec->eventParamRef, &extendedDataRecordClass, &posInExtData)) {
- *sizeOfExtendedDataRecord = extendedDataRecordClass->DataSize;
- returnCode = DEM_GET_SIZEOFEDRBYDTC_OK;
- }
- else {
- returnCode = DEM_GET_SIZEOFEDRBYDTC_W_RNUM;
- }
- }
- else {
- returnCode = DEM_GET_SIZEOFEDRBYDTC_W_DTCOR;
- }
- }
- else {
- returnCode = DEM_GET_SIZEOFEDRBYDTC_W_DTCKI;
- }
- }
-
- return returnCode;
-}
-
-/***********************************
- * OBD-specific Interfaces (8.3.6) *
- ***********************************/
-
-
-
+/* -------------------------------- Arctic Core ------------------------------\r
+ * Arctic Core - the open source AUTOSAR platform http://arccore.com\r
+ *\r
+ * Copyright (C) 2009 ArcCore AB <contact@arccore.com>\r
+ *\r
+ * This source code is free software; you can redistribute it and/or modify it\r
+ * under the terms of the GNU General Public License version 2 as published by the\r
+ * Free Software Foundation; See <http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt>.\r
+ *\r
+ * This program is distributed in the hope that it will be useful, but\r
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\r
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License\r
+ * for more details.\r
+ * -------------------------------- Arctic Core ------------------------------*/\r
+\r
+// 904 PC-Lint MISRA 14.7: OK. Allow VALIDATE, VALIDATE_RV and VALIDATE_NO_RV to return value.\r
+//lint -emacro(904,VALIDATE_RV,VALIDATE_NO_RV,VALIDATE)\r
+\r
+// 522 PC-Lint exception for empty functions\r
+//lint -esym(522,storeFreezeFrameDataEvtMem)\r
+//lint -esym(522,deleteFreezeFrameDataPriMem)\r
+//lint -esym(522,storeFreezeFrameDataPreInit)\r
+//lint -esym(522,storeFreezeFrameDataPriMem)\r
+//lint -esym(522,updateFreezeFrameOccurrencePreInit)\r
+\r
+// PC-Lint misunderstanding of MISRA 8.12, 18.1: Empty arrays are OK as long as size 0 is specified.\r
+//lint -esym(85,preInitFreezeFrameBuffer)\r
+//lint -esym(85,priMemFreezeFrameBuffer)\r
+\r
+\r
+/*\r
+ * General requirements\r
+ */\r
+/** @req DEM126 */\r
+/** @req DEM151.partially */\r
+/** @req DEM152 */\r
+/** @req DEM013.14229-1 */\r
+/** @req DEM277 */\r
+/** @req DEM363 */\r
+/** @req DEM113 */ /** @req DEM174 */\r
+/** @req DEM286 */\r
+/** @req DEM267 */\r
+/** @req DEM364 */\r
+/** @req DEM114 */\r
+/** @req DEM124 */\r
+/** @req DEM370 */\r
+\r
+\r
+\r
+#include <string.h>\r
+#include "Dem.h"\r
+//#include "Fim.h"\r
+#include "NvM.h"\r
+//#include "SchM_Dem.h"\r
+#include "MemMap.h"\r
+#include "Cpu.h"\r
+#include "Dem_Types.h"\r
+#include "Dem_Lcfg.h"\r
+\r
+#define USE_DEBUG_PRINTF\r
+#include "debug.h"\r
+/*\r
+ * Local defines\r
+ */\r
+#define DEBOUNCE_FDC_TEST_FAILED 127\r
+#define DEBOUNCE_FDC_TEST_PASSED -128\r
+\r
+#if ( DEM_DEV_ERROR_DETECT == STD_ON )\r
+#include "Det.h"\r
+/** @req DEM117 */\r
+#define VALIDATE_RV(_exp,_api,_err,_rv ) \\r
+ if( !(_exp) ) { \\r
+ Det_ReportError(MODULE_ID_DEM, 0, _api, _err); \\r
+ return _rv; \\r
+ }\r
+\r
+#define VALIDATE_NO_RV(_exp,_api,_err ) \\r
+ if( !(_exp) ) { \\r
+ Det_ReportError(MODULE_ID_DEM, 0, _api, _err); \\r
+ return; \\r
+ }\r
+#define DET_REPORTERROR(_x,_y,_z,_q) Det_ReportError(_x, _y, _z, _q)\r
+\r
+#else\r
+#define VALIDATE_RV(_exp,_api,_err,_rv )\r
+#define VALIDATE_NO_RV(_exp,_api,_err )\r
+#define DET_REPORTERROR(_x,_y,_z,_q)\r
+#endif\r
+\r
+#if (DEM_OBD_SUPPORT == STD_ON)\r
+#error "DEM_OBD_SUPPORT is set to STD_ON, this is not supported by the code."\r
+#endif\r
+\r
+#if (DEM_PTO_SUPPORT == STD_ON)\r
+#error "DEM_PTO_SUPPORT is set to STD_ON, this is not supported by the code."\r
+#endif\r
+\r
+#if (DEM_TYPE_OF_DTC_SUPPORTED != 0x01)\r
+#error "DEM_TYPE_OF_DTC_SUPPORTED is not set to 1 (ISO14229-1), only ISO14229-1 is currently supported by the code."\r
+#endif\r
+\r
+\r
+/*\r
+ * Local types\r
+ */\r
+#if !defined(USE_DCM)\r
+typedef uint8 Dcm_NegativeResponseCodeType;\r
+#define DCM_E_POSITIVERESPONSE ((Dcm_NegativeResponseCodeType)0x00)\r
+#endif\r
+\r
+// DtcFilterType\r
+typedef struct {\r
+ Dem_EventStatusExtendedType dtcStatusMask;\r
+ Dem_DTCKindType dtcKind;\r
+ Dem_DTCOriginType dtcOrigin;\r
+ Dem_FilterWithSeverityType filterWithSeverity;\r
+ Dem_DTCSeverityType dtcSeverityMask;\r
+ Dem_FilterForFDCType filterForFaultDetectionCounter;\r
+ uint16 faultIndex;\r
+} DtcFilterType;\r
+\r
+// DisableDtcStorageType\r
+typedef struct {\r
+ boolean storageDisabled;\r
+ Dem_DTCGroupType dtcGroup;\r
+ Dem_DTCKindType dtcKind;\r
+} DisableDtcStorageType;\r
+\r
+// For keeping track of the events status\r
+typedef struct {\r
+ Dem_EventIdType eventId;\r
+ const Dem_EventParameterType *eventParamRef;\r
+ sint8 faultDetectionCounter;\r
+ uint16 occurrence; /** @req DEM011 */\r
+ Dem_EventStatusExtendedType eventStatusExtended; /** @req DEM006 */\r
+ boolean errorStatusChanged;\r
+} EventStatusRecType;\r
+\r
+// Types for storing different event data on event memory\r
+typedef struct {\r
+ Dem_EventIdType eventId;\r
+ uint16 occurrence;\r
+ Dem_EventStatusExtendedType eventStatusExtended;\r
+ ChecksumType checksum;\r
+} EventRecType;\r
+\r
+typedef struct {\r
+ Dem_EventIdType eventId;\r
+ uint16 dataSize;\r
+ uint8 data[DEM_MAX_SIZE_EXT_DATA];\r
+ ChecksumType checksum;\r
+} ExtDataRecType;\r
+\r
+\r
+// State variable\r
+typedef enum\r
+{\r
+ DEM_UNINITIALIZED = 0,\r
+ DEM_PREINITIALIZED,\r
+ DEM_INITIALIZED\r
+} Dem_StateType; /** @req DEM169 */\r
+\r
+\r
+static Dem_StateType demState = DEM_UNINITIALIZED;\r
+\r
+// Help pointer to configuration set\r
+static const Dem_ConfigSetType *configSet;\r
+\r
+/*\r
+ * Allocation of DTC filter parameters\r
+ */\r
+static DtcFilterType dtcFilter;\r
+\r
+/*\r
+ * Allocation of Disable/Enable DTC storage parameters\r
+ */\r
+static DisableDtcStorageType disableDtcStorage;\r
+\r
+/*\r
+ * Allocation of operation cycle state list\r
+ */\r
+static Dem_OperationCycleStateType operationCycleStateList[DEM_OPERATION_CYCLE_ID_ENDMARK];\r
+\r
+/*\r
+ * Allocation of local event status buffer\r
+ */\r
+static EventStatusRecType eventStatusBuffer[DEM_MAX_NUMBER_EVENT];\r
+\r
+/*\r
+ * Allocation of pre-init event memory (used between pre-init and init)\r
+ */\r
+/** @req DEM207 */\r
+static FreezeFrameRecType preInitFreezeFrameBuffer[DEM_MAX_NUMBER_FF_DATA_PRE_INIT];\r
+static ExtDataRecType preInitExtDataBuffer[DEM_MAX_NUMBER_EXT_DATA_PRE_INIT];\r
+\r
+/*\r
+ * Allocation of primary event memory ramlog (after init) in uninitialized memory\r
+ */\r
+/** @req DEM162 */\r
+EventRecType priMemEventBuffer[DEM_MAX_NUMBER_EVENT_PRI_MEM];\r
+static FreezeFrameRecType priMemFreezeFrameBuffer[DEM_MAX_NUMBER_FF_DATA_PRI_MEM];\r
+//FreezeFrameRecType FreezeFrameMirrorBuffer[DEM_MAX_NUMBER_FF_DATA_PRI_MEM];\r
+extern FreezeFrameRecType* FreezeFrameMirrorBuffer[];\r
+static ExtDataRecType priMemExtDataBuffer[DEM_MAX_NUMBER_EXT_DATA_PRI_MEM];\r
+HealingRecType priMemAgingBuffer[DEM_MAX_NUMBER_AGING_PRI_MEM];\r
+extern HealingRecType HealingMirrorBuffer[DEM_MAX_NUMBER_AGING_PRI_MEM];\r
+\r
+/* block in NVRam, use for freezeframe */\r
+extern const NvM_BlockIdType FreezeFrameBlockId[DEM_MAX_NUMBER_FF_DATA_PRI_MEM];\r
+/* block in NVRam, use for aging */\r
+extern const NvM_BlockIdType HealingBlockId;\r
+\r
+\r
+/*\r
+*Allocation of freezeFrame storage timestamp,record the time order\r
+*/\r
+/**private variable for freezeframe */\r
+static uint32 FF_TimeStamp = 0;\r
+\r
+/*\r
+ * TRUE: priMemFreezeFrameBuffer changed,\r
+ * FALSE: priMemFreezeFrameBuffer not changed\r
+ */\r
+static boolean FFIsModified = FALSE;\r
+\r
+/*\r
+ * TRUE: priMemAgingBuffer changed,\r
+ * FALSE: priMemAgingBuffer not changed\r
+ */\r
+static boolean AgingIsModified = FALSE;\r
+\r
+/*\r
+ * Procedure: zeroPriMemBuffers\r
+ * Description: Fill the primary buffers with zeroes\r
+ */\r
+//lint -save\r
+//lint -e84 //PC-Lint exception, size 0 is OK.\r
+//lint -e957 PC-Lint exception - Used only by DemTest\r
+void demZeroPriMemBuffers(void)\r
+{\r
+ memset(priMemEventBuffer, 0, sizeof(priMemEventBuffer));\r
+ memset(priMemFreezeFrameBuffer, 0, sizeof(priMemFreezeFrameBuffer));\r
+ memset(priMemExtDataBuffer, 0, sizeof(priMemExtDataBuffer));\r
+}\r
+//lint -restore\r
+\r
+/*\r
+ * Procedure: calcChecksum\r
+ * Description: Calculate checksum over *data to *(data+nrOfBytes-1) area\r
+ */\r
+static ChecksumType calcChecksum(void *data, uint16 nrOfBytes)\r
+{\r
+ uint16 i;\r
+ uint8 *byte = (uint8*)data;\r
+ ChecksumType sum = 0;\r
+\r
+ for (i = 0; i < nrOfBytes; i++) {\r
+ sum += byte[i];\r
+ }\r
+ sum ^= 0xaaaau;\r
+ return sum;\r
+}\r
+\r
+\r
+/*\r
+ * Procedure: checkDtcKind\r
+ * Description: Return TRUE if "dtcKind" match the events DTCKind or "dtcKind"\r
+ * is "DEM_DTC_KIND_ALL_DTCS" otherwise FALSE.\r
+ */\r
+static boolean checkDtcKind(Dem_DTCKindType dtcKind, const Dem_EventParameterType *eventParam)\r
+{\r
+ boolean result = FALSE;\r
+\r
+ if (dtcKind == DEM_DTC_KIND_ALL_DTCS) {\r
+ result = TRUE;\r
+ }\r
+ else {\r
+ if (eventParam->DTCClassRef != NULL) {\r
+ if (eventParam->DTCClassRef->DTCKind == dtcKind) {\r
+ result = TRUE;\r
+ }\r
+ }\r
+ }\r
+ return result;\r
+}\r
+\r
+\r
+/*\r
+ * Procedure: checkDtcGroup\r
+ * Description: Return TRUE if "dtc" match the events DTC or "dtc" is\r
+ * "DEM_DTC_GROUP_ALL_DTCS" otherwise FALSE.\r
+ */\r
+static boolean checkDtcGroup(uint32 dtc, const Dem_EventParameterType *eventParam)\r
+{\r
+ boolean result = FALSE;\r
+\r
+ if (dtc == DEM_DTC_GROUP_ALL_DTCS) {\r
+ result = TRUE;\r
+ }\r
+ else {\r
+ if (eventParam->DTCClassRef != NULL) {\r
+ if (eventParam->DTCClassRef->DTC == dtc) {\r
+ result = TRUE;\r
+ }\r
+ }\r
+ }\r
+ return result;\r
+}\r
+\r
+\r
+/*\r
+ * Procedure: checkDtcOrigin\r
+ * Description: Return TRUE if "dtcOrigin" match any of the events DTCOrigin otherwise FALSE.\r
+ */\r
+static boolean checkDtcOrigin(Dem_DTCOriginType dtcOrigin, const Dem_EventParameterType *eventParam)\r
+{\r
+ boolean result = FALSE;\r
+ boolean dtcOriginFound = FALSE;\r
+ uint16 i;\r
+\r
+ for (i = 0;(i < DEM_MAX_NR_OF_EVENT_DESTINATION) && (!dtcOriginFound); i++){\r
+ dtcOriginFound = (eventParam->EventClass->EventDestination[i] == dtcOrigin);\r
+ }\r
+\r
+ if (dtcOriginFound) {\r
+ result = TRUE;\r
+ }\r
+\r
+ return result;\r
+}\r
+\r
+/*\r
+ * Procedure: checkDtcSeverityMask\r
+ * Description: Return TRUE if "dtcSeverityMask" match any of the events DTC severity otherwise FALSE.\r
+ */\r
+// PC-Lint (715 etc): Remove errors until function is filled.\r
+//lint -e{715} Symbol not referenced\r
+static boolean checkDtcSeverityMask(Dem_DTCSeverityType dtcSeverityMask, const Dem_EventParameterType *eventParam)\r
+{\r
+ boolean result = TRUE;\r
+\r
+ // TODO: This function is optional, may be implemented here.\r
+\r
+ return result;\r
+}\r
+\r
+\r
+/*\r
+ * Procedure: checkDtcFaultDetectionCounterMask\r
+ * Description: TBD.\r
+ */\r
+// PC-Lint (715 etc): Remove errors until function is filled.\r
+//lint -e{715} Symbol not referenced\r
+static boolean checkDtcFaultDetectionCounter(const Dem_EventParameterType *eventParam)\r
+{\r
+ boolean result = TRUE;\r
+\r
+ // TODO: Not implemented yet.\r
+\r
+ return result;\r
+}\r
+\r
+\r
+/*\r
+ * Procedure: lookupEventStatusRec\r
+ * Description: Returns the pointer to event id parameters of "eventId" in "*eventStatusBuffer",\r
+ * if not found NULL is returned.\r
+ */\r
+static void lookupEventStatusRec(Dem_EventIdType eventId, EventStatusRecType **const eventStatusRec)\r
+{\r
+ uint8 i;\r
+ boolean eventIdFound = FALSE;\r
+\r
+ for (i = 0; (i < DEM_MAX_NUMBER_EVENT) && (!eventIdFound); i++) {\r
+ eventIdFound = (eventStatusBuffer[i].eventId == eventId);\r
+ }\r
+\r
+ if (eventIdFound) {\r
+ *eventStatusRec = &eventStatusBuffer[i-1];\r
+ } else {\r
+ *eventStatusRec = NULL;\r
+ }\r
+}\r
+\r
+\r
+/*\r
+ * Procedure: lookupEventIdParameter\r
+ * Description: Returns the pointer to event id parameters of "eventId" in "*eventIdParam",\r
+ * if not found NULL is returned.\r
+ */\r
+static void lookupEventIdParameter(Dem_EventIdType eventId, const Dem_EventParameterType **const eventIdParam)\r
+{\r
+ const Dem_EventParameterType *EventIdParamList = configSet->EventParameter;\r
+\r
+ /* Lookup the correct event id parameters */\r
+ uint16 i=0;\r
+ while ((EventIdParamList[i].EventID != eventId) && (!EventIdParamList[i].Arc_EOL)) {\r
+ i++;\r
+ }\r
+\r
+ if (!EventIdParamList[i].Arc_EOL) {\r
+ *eventIdParam = &EventIdParamList[i];\r
+ } else {\r
+ *eventIdParam = NULL;\r
+ }\r
+}\r
+/*\r
+ * Procedure: checkEntryValid\r
+ * Description: Returns whether event id "eventId" is a valid entry in primary memory\r
+ */\r
+static boolean checkEntryValid(Dem_EventIdType eventId){\r
+ const Dem_EventParameterType *EventIdParamList = configSet->EventParameter;\r
+ boolean isValid = FALSE;\r
+ uint16 i=0;\r
+ while ((EventIdParamList[i].EventID != eventId) && (!EventIdParamList[i].Arc_EOL)) {\r
+ i++;\r
+ }\r
+\r
+ if (!EventIdParamList[i].Arc_EOL) {\r
+ // Event was found\r
+ uint16 index = 0;\r
+ for (index = 0; (index < DEM_MAX_NR_OF_EVENT_DESTINATION)\r
+ && (EventIdParamList[i].EventClass->EventDestination[index] != DEM_EVENT_DESTINATION_END_OF_LIST); index++) {\r
+ if( DEM_DTC_ORIGIN_PRIMARY_MEMORY == EventIdParamList[i].EventClass->EventDestination[index]){\r
+ // Event should be stored in primary memory.\r
+ isValid = TRUE;\r
+ }\r
+ }\r
+\r
+ } else {\r
+ // The event did not exist\r
+ }\r
+ return isValid;\r
+}\r
+/*\r
+ * Procedure: preDebounceNone\r
+ * Description: Returns the result of the debouncing.\r
+ */\r
+static Dem_EventStatusType preDebounceNone(const Dem_EventStatusType reportedStatus, const EventStatusRecType* statusRecord) {\r
+ Dem_EventStatusType returnCode;\r
+ (void)statusRecord; // Just to get rid of PC-Lint warnings\r
+\r
+ switch (reportedStatus) {\r
+ case DEM_EVENT_STATUS_FAILED: /** @req DEM091.NoneFailed */\r
+ case DEM_EVENT_STATUS_PASSED: /** @req DEM091.NonePassed */\r
+ // Already debounced, do nothing.\r
+ break;\r
+\r
+ default:\r
+ // TODO: What to do with PREFAIL and PREPASSED on no debouncing?\r
+ DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_PREDEBOUNCE_NONE_ID, DEM_E_PARAM_DATA);\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
+static 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 + (sint8)pdVars->CountInStepSize) < DEBOUNCE_FDC_TEST_FAILED) {\r
+ statusRecord->faultDetectionCounter += (sint8)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 - (sint8)pdVars->CountOutStepSize) > DEBOUNCE_FDC_TEST_PASSED) {\r
+ statusRecord->faultDetectionCounter -= (sint8)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; /** @req DEM091.CounterFailed */\r
+ break;\r
+\r
+ case DEM_EVENT_STATUS_PASSED:\r
+ statusRecord->faultDetectionCounter = DEBOUNCE_FDC_TEST_PASSED; /** @req DEM091.CounterPassed */\r
+ break;\r
+\r
+ default:\r
+ DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_PREDEBOUNCE_COUNTER_BASED_ID, DEM_E_PARAM_DATA);\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
+ * true a new record is created\r
+ */\r
+static void updateEventStatusRec(const Dem_EventParameterType *eventParam, Dem_EventStatusType eventStatus, boolean createIfNotExist, EventStatusRecType *eventStatusRec)\r
+{\r
+ EventStatusRecType *eventStatusRecPtr;\r
+ sint8 faultCounterBeforeDebounce = 0;\r
+ sint8 faultCounterAfterDebounce = 0;\r
+ imask_t state;\r
+ Irq_Save(state);\r
+\r
+ lookupEventStatusRec(eventParam->EventID, &eventStatusRecPtr);\r
+\r
+ if ((eventStatusRecPtr == NULL) && (createIfNotExist)) {\r
+ lookupEventStatusRec(DEM_EVENT_ID_NULL, &eventStatusRecPtr);\r
+ if (eventStatusRecPtr != NULL) {\r
+ eventStatusRecPtr->eventId = eventParam->EventID;\r
+ eventStatusRecPtr->eventParamRef = eventParam;\r
+ eventStatusRecPtr->faultDetectionCounter = 0;\r
+ eventStatusRecPtr->occurrence = 0;\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
+ DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_UPDATE_EVENT_STATUS_ID, DEM_E_EVENT_STATUS_BUFF_FULL);\r
+ }\r
+ }\r
+\r
+\r
+ if (eventStatusRecPtr != NULL) {\r
+ faultCounterBeforeDebounce = eventStatusRecPtr->faultDetectionCounter;\r
+\r
+ if (eventParam->EventClass->PreDebounceAlgorithmClass != NULL) {\r
+ switch (eventParam->EventClass->PreDebounceAlgorithmClass->PreDebounceName) { /** @req DEM004 */ /** @req DEM342 */\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
+ DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_UPDATE_EVENT_STATUS_ID, DEM_E_NOT_IMPLEMENTED_YET);\r
+ break;\r
+ }\r
+ }\r
+ faultCounterAfterDebounce = eventStatusRecPtr->faultDetectionCounter;\r
+\r
+ eventStatusRecPtr->errorStatusChanged = FALSE;\r
+\r
+ if (eventStatus == DEM_EVENT_STATUS_FAILED) {\r
+ if (!(eventStatusRecPtr->eventStatusExtended & DEM_TEST_FAILED)) {\r
+ eventStatusRecPtr->occurrence++;\r
+ eventStatusRecPtr->errorStatusChanged = TRUE;\r
+ }\r
+ /** @req DEM036 */ /** @req DEM379.PendingSet */\r
+ eventStatusRecPtr->eventStatusExtended |= (DEM_TEST_FAILED | DEM_TEST_FAILED_THIS_OPERATION_CYCLE | DEM_TEST_FAILED_SINCE_LAST_CLEAR | DEM_PENDING_DTC | DEM_CONFIRMED_DTC);\r
+ eventStatusRecPtr->eventStatusExtended &= (Dem_EventStatusExtendedType)~(DEM_TEST_NOT_COMPLETED_SINCE_LAST_CLEAR | DEM_TEST_NOT_COMPLETED_THIS_OPERATION_CYCLE);\r
+ }\r
+\r
+ if (eventStatus == DEM_EVENT_STATUS_PASSED) {\r
+ if (eventStatusRecPtr->eventStatusExtended & (DEM_TEST_FAILED | DEM_TEST_NOT_COMPLETED_THIS_OPERATION_CYCLE)) {\r
+ eventStatusRecPtr->errorStatusChanged = TRUE;\r
+ }\r
+ /** @req DEM036 */\r
+ eventStatusRecPtr->eventStatusExtended &= (Dem_EventStatusExtendedType)~DEM_TEST_FAILED;\r
+ eventStatusRecPtr->eventStatusExtended &= (Dem_EventStatusExtendedType)~(DEM_TEST_NOT_COMPLETED_SINCE_LAST_CLEAR | DEM_TEST_NOT_COMPLETED_THIS_OPERATION_CYCLE);\r
+ }\r
+\r
+ if ((eventStatus == DEM_EVENT_STATUS_PREFAILED)\\r
+ && (faultCounterBeforeDebounce <= 0) && (faultCounterAfterDebounce > 0)){\r
+ eventStatusRecPtr->errorStatusChanged = TRUE;\r
+ }\r
+\r
+ memcpy(eventStatusRec, eventStatusRecPtr, sizeof(EventStatusRecType));\r
+ }\r
+ else {\r
+ eventStatusRec->eventId = DEM_EVENT_ID_NULL;\r
+ eventStatusRec->faultDetectionCounter = 0;\r
+ eventStatusRec->occurrence = 0;\r
+ eventStatusRec->eventStatusExtended = DEM_TEST_NOT_COMPLETED_THIS_OPERATION_CYCLE | DEM_TEST_NOT_COMPLETED_SINCE_LAST_CLEAR;\r
+ eventStatusRec->errorStatusChanged = FALSE;\r
+ }\r
+\r
+ Irq_Restore(state);\r
+}\r
+\r
+\r
+/*\r
+ * Procedure: mergeEventStatusRec\r
+ * Description: Update the occurrence counter of status, if not exist a new record is created\r
+ */\r
+static void mergeEventStatusRec(const EventRecType *eventRec)\r
+{\r
+ EventStatusRecType *eventStatusRecPtr;\r
+ imask_t state;\r
+ Irq_Save(state);\r
+\r
+ // Lookup event ID\r
+ lookupEventStatusRec(eventRec->eventId, &eventStatusRecPtr);\r
+\r
+ if (eventStatusRecPtr != NULL) {\r
+ // Update occurrence counter.\r
+ eventStatusRecPtr->occurrence += eventRec->occurrence;\r
+ // Merge event status extended with stored\r
+ // TEST_FAILED_SINCE_LAST_CLEAR should be set if set if set in either\r
+ eventStatusRecPtr->eventStatusExtended |= (Dem_EventStatusExtendedType)(eventRec->eventStatusExtended & DEM_TEST_FAILED_SINCE_LAST_CLEAR);\r
+ // DEM_TEST_NOT_COMPLETED_SINCE_LAST_CLEAR should cleared if cleared in either\r
+ eventStatusRecPtr->eventStatusExtended |= (Dem_EventStatusExtendedType)(eventRec->eventStatusExtended & eventStatusRecPtr->eventStatusExtended & DEM_TEST_NOT_COMPLETED_SINCE_LAST_CLEAR);\r
+ // DEM_PENDING_DTC and DEM_CONFIRMED_DTC should be set if set in either\r
+ eventStatusRecPtr->eventStatusExtended |= (Dem_EventStatusExtendedType)(eventRec->eventStatusExtended & (DEM_PENDING_DTC | DEM_CONFIRMED_DTC));\r
+\r
+ }\r
+\r
+ Irq_Restore(state);\r
+}\r
+\r
+/*\r
+ * Procedure: resetEventStatusRec\r
+ * Description: Reset the status record of "eventParam->eventId" from "eventStatusBuffer".\r
+ */\r
+static void resetEventStatusRec(const Dem_EventParameterType *eventParam)\r
+{\r
+ EventStatusRecType *eventStatusRecPtr;\r
+ imask_t state;\r
+ Irq_Save(state);\r
+\r
+ // Lookup event ID\r
+ lookupEventStatusRec(eventParam->EventID, &eventStatusRecPtr);\r
+\r
+ if (eventStatusRecPtr != NULL) {\r
+ // Reset event record\r
+ eventStatusRecPtr->faultDetectionCounter = 0;\r
+ eventStatusRecPtr->eventStatusExtended = (DEM_TEST_NOT_COMPLETED_THIS_OPERATION_CYCLE | DEM_TEST_NOT_COMPLETED_SINCE_LAST_CLEAR);\r
+ eventStatusRecPtr->errorStatusChanged = FALSE;\r
+ eventStatusRecPtr->occurrence = 0;\r
+ }\r
+\r
+ Irq_Restore(state);\r
+}\r
+\r
+/*\r
+ * Procedure: getEventStatusRec\r
+ * Description: Returns the status record of "eventId" in "eventStatusRec"\r
+ */\r
+static void getEventStatusRec(Dem_EventIdType eventId, EventStatusRecType *eventStatusRec)\r
+{\r
+ EventStatusRecType *eventStatusRecPtr;\r
+\r
+ // Lookup event ID\r
+ lookupEventStatusRec(eventId, &eventStatusRecPtr);\r
+\r
+ if (eventStatusRecPtr != NULL) {\r
+ // Copy the record\r
+ memcpy(eventStatusRec, eventStatusRecPtr, sizeof(EventStatusRecType));\r
+ }\r
+ else {\r
+ eventStatusRec->eventId = DEM_EVENT_ID_NULL;\r
+ }\r
+}\r
+\r
+\r
+/*\r
+ * Procedure: lookupDtcEvent\r
+ * Description: Returns TRUE if the DTC was found and "eventStatusRec" points\r
+ * to the event record found.\r
+ */\r
+static boolean lookupDtcEvent(uint32 dtc, EventStatusRecType **eventStatusRec)\r
+{\r
+ boolean dtcFound = FALSE;\r
+ uint16 i;\r
+\r
+ *eventStatusRec = NULL;\r
+\r
+ for (i = 0; (i < DEM_MAX_NUMBER_EVENT) && (!dtcFound); i++) {\r
+ if (eventStatusBuffer[i].eventId != DEM_EVENT_ID_NULL) {\r
+ if (eventStatusBuffer[i].eventParamRef->DTCClassRef != NULL) {\r
+\r
+ // Check DTC\r
+ if (eventStatusBuffer[i].eventParamRef->DTCClassRef->DTC == dtc) {\r
+ *eventStatusRec = &eventStatusBuffer[i];\r
+ dtcFound = TRUE;\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ return dtcFound;\r
+}\r
+\r
+\r
+/*\r
+ * Procedure: matchEventWithDtcFilter\r
+ * Description: Returns TRUE if the event pointed by "event" fulfill\r
+ * the "dtcFilter" global filter settings.\r
+ */\r
+static boolean matchEventWithDtcFilter(const EventStatusRecType *eventRec)\r
+{\r
+ boolean dtcMatch = FALSE;\r
+\r
+ // Check status\r
+ if ((dtcFilter.dtcStatusMask == DEM_DTC_STATUS_MASK_ALL) || (eventRec->eventStatusExtended & dtcFilter.dtcStatusMask)) {\r
+ if (eventRec->eventParamRef != NULL) {\r
+\r
+ // Check dtcKind\r
+ if (checkDtcKind(dtcFilter.dtcKind, eventRec->eventParamRef)) {\r
+\r
+ // Check dtcOrigin\r
+ if (checkDtcOrigin(dtcFilter.dtcOrigin, eventRec->eventParamRef)) {\r
+\r
+ // Check severity\r
+ if ((dtcFilter.filterWithSeverity == DEM_FILTER_WITH_SEVERITY_NO)\r
+ || ((dtcFilter.filterWithSeverity == DEM_FILTER_WITH_SEVERITY_YES) && (checkDtcSeverityMask(dtcFilter.dtcSeverityMask, eventRec->eventParamRef)))) {\r
+\r
+ // Check fault detection counter\r
+ if ((dtcFilter.filterForFaultDetectionCounter == DEM_FILTER_FOR_FDC_NO)\r
+ || ((dtcFilter.filterWithSeverity == DEM_FILTER_FOR_FDC_YES) && (checkDtcFaultDetectionCounter(eventRec->eventParamRef)))) {\r
+ dtcMatch = TRUE;\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ return dtcMatch;\r
+}\r
+/*\r
+ * Procedure: bubbleSort\r
+ * Description: bubble sort\r
+ */\r
+static void bubbleSort(FreezeFrameRecType *freezeFrameBuf, uint16 length)\r
+{\r
+ FreezeFrameRecType temp;\r
+ uint16 i = 0;\r
+ uint16 j = 0;\r
+\r
+ //Bubble sort:rearrange priMemFreezeFrameBuffer from little to big\r
+ for(i=0;i<length;i++){\r
+ for(j=length-1; j > i; j--){\r
+ if(freezeFrameBuf[i].timeStamp > freezeFrameBuf[j].timeStamp){\r
+ //exchange buffer data\r
+ memcpy(&temp,&freezeFrameBuf[i],sizeof(FreezeFrameRecType));\r
+ memcpy(&freezeFrameBuf[i],&freezeFrameBuf[j],sizeof(FreezeFrameRecType));\r
+ memcpy(&freezeFrameBuf[j],&temp,sizeof(FreezeFrameRecType));\r
+ }\r
+ }\r
+ }\r
+\r
+}\r
+\r
+/*\r
+ * Procedure: retrieveEventStatusBit\r
+ * Description: retrieve Event Status Bit\r
+ */\r
+static boolean retrieveEventStatusBit(FreezeFrameRecType *freezeFrameBuf,\r
+ uint16 length ,\r
+ Dem_EventStatusExtendedType nBit,\r
+ FreezeFrameRecType **freezeFrame)\r
+{\r
+ boolean freezeFrameFound = FALSE;\r
+ uint16 i = 0;\r
+ uint16 j = 0;\r
+\r
+ for(i=0;i<length;i++){\r
+ for(j=0; (j < DEM_MAX_NUMBER_EVENT) && (!freezeFrameFound); j++){\r
+ freezeFrameFound = (eventStatusBuffer[j].eventId == freezeFrameBuf[i].eventId)\\r
+ && (!(eventStatusBuffer[j].eventStatusExtended & nBit));\r
+ if(freezeFrameFound == TRUE){\r
+ *freezeFrame = &freezeFrameBuf[i];\r
+ }\r
+ }\r
+ }\r
+\r
+ return freezeFrameFound;\r
+\r
+}\r
+\r
+/*\r
+ * Procedure: lookupFreezeFrameForDisplacementPreInit\r
+ * Description: implement displacement strategy preinit:1.find out the oldest "not confirmed" DTC\r
+ * 2.find out the oldest inactive DTC,inactive:testFailed is not set\r
+ * 3.find ou the oldest active DTC,active:testFailed is set\r
+ */\r
+static boolean lookupFreezeFrameForDisplacementPreInit(FreezeFrameRecType **freezeFrame)\r
+{\r
+ boolean freezeFrameFound = FALSE;\r
+\r
+ /* Bubble sort:rearrange priMemFreezeFrameBuffer from little to big */\r
+ bubbleSort(preInitFreezeFrameBuffer, DEM_MAX_NUMBER_FF_DATA_PRE_INIT);\r
+\r
+ /* find out the oldest not confirmed dtc */\r
+ freezeFrameFound = retrieveEventStatusBit(preInitFreezeFrameBuffer, DEM_MAX_NUMBER_FF_DATA_PRE_INIT, DEM_CONFIRMED_DTC, freezeFrame);\r
+\r
+ /* if all confirmed,lookup the oldest inactive dtc */\r
+ if(freezeFrameFound == FALSE){\r
+ freezeFrameFound = retrieveEventStatusBit(preInitFreezeFrameBuffer, DEM_MAX_NUMBER_FF_DATA_PRE_INIT, DEM_TEST_FAILED, freezeFrame);\r
+ }\r
+\r
+ /* if all confirmed,lookup the oldest active dtc */\r
+ if(freezeFrameFound == FALSE){\r
+ *freezeFrame = &preInitFreezeFrameBuffer[0];\r
+ freezeFrameFound = TRUE;\r
+ }\r
+\r
+ return freezeFrameFound;\r
+}\r
+\r
+/*\r
+ * Procedure: lookupFreezeFrameForDisplacement\r
+ * Description: implement displacement strategy:1.find out the oldest "not confirmed" DTC\r
+ * 2.find out the oldest inactive DTC,inactive:testFailed is not set\r
+ * 3.find ou the oldest active DTC,active:testFailed is set\r
+ */\r
+static boolean lookupFreezeFrameForDisplacement(FreezeFrameRecType **freezeFrame)\r
+{\r
+ boolean freezeFrameFound = FALSE;\r
+\r
+ bubbleSort(priMemFreezeFrameBuffer, DEM_MAX_NUMBER_FF_DATA_PRI_MEM);\r
+\r
+ /* Find out the oldest not confirmed dtc */\r
+ freezeFrameFound = retrieveEventStatusBit(priMemFreezeFrameBuffer, DEM_MAX_NUMBER_FF_DATA_PRI_MEM, DEM_CONFIRMED_DTC, freezeFrame);\r
+\r
+ /* If all confirmed, lookup the oldest inactive dtc */\r
+ if(freezeFrameFound == FALSE){\r
+ freezeFrameFound = retrieveEventStatusBit(priMemFreezeFrameBuffer, DEM_MAX_NUMBER_FF_DATA_PRI_MEM, DEM_TEST_FAILED, freezeFrame);\r
+ }\r
+\r
+ /* If all confirmed,lookup the oldest active dtc */\r
+ if(freezeFrameFound == FALSE){\r
+ *freezeFrame = &priMemFreezeFrameBuffer[0];\r
+ freezeFrameFound = TRUE;\r
+ }\r
+\r
+ return freezeFrameFound;\r
+}\r
+/*\r
+ * Procedure: rearrangeFreezeFrameTimeStamp\r
+ * Description: rearrange FF timestamp when timestamp is beyond DEM_MAX_TIMESTAMP_FOR_REARRANGEMENT \r
+ */\r
+static void rearrangeFreezeFrameTimeStamp(uint32 *timeStamp)\r
+{\r
+ FreezeFrameRecType temp;\r
+ uint32 i = 0;\r
+ uint32 j = 0;\r
+ uint32 k = 0;\r
+\r
+ /* Bubble sort:rearrange priMemFreezeFrameBuffer from little to big */\r
+ for(i=0;i<DEM_MAX_NUMBER_FF_DATA_PRI_MEM;i++){\r
+ if(priMemFreezeFrameBuffer[i].eventId != DEM_EVENT_ID_NULL){\r
+ for(j=DEM_MAX_NUMBER_FF_DATA_PRI_MEM-1; j > i; j--){\r
+ if(priMemFreezeFrameBuffer[j].eventId != DEM_EVENT_ID_NULL){\r
+ if(priMemFreezeFrameBuffer[i].timeStamp > priMemFreezeFrameBuffer[j].timeStamp){\r
+ //exchange buffer data\r
+ memcpy(&temp,&priMemFreezeFrameBuffer[i],sizeof(FreezeFrameRecType));\r
+ memcpy(&priMemFreezeFrameBuffer[i],&priMemFreezeFrameBuffer[j],sizeof(FreezeFrameRecType));\r
+ memcpy(&priMemFreezeFrameBuffer[j],&temp,sizeof(FreezeFrameRecType));\r
+ }\r
+\r
+ }\r
+\r
+ }\r
+ priMemFreezeFrameBuffer[i].timeStamp = k++;\r
+ }\r
+\r
+ }\r
+ /* update the current timeStamp */\r
+ *timeStamp = k;\r
+\r
+}\r
+/*\r
+ * Procedure: getFreezeFrameData\r
+ * Description: get FF data according configuration \r
+ */\r
+static void getFreezeFrameData(const Dem_EventParameterType *eventParam,\r
+ FreezeFrameRecType *freezeFrame,\r
+ Dem_EventStatusType eventStatus,\r
+ EventStatusRecType *eventStatusRec)\r
+{\r
+ Dem_FreezeFrameStorageConditonType prefailedOrFailed;\r
+ Std_ReturnType callbackReturnCode;\r
+ uint16 i = 0;\r
+ uint16 storeIndex = 0;\r
+ uint16 recordSize = 0;\r
+ imask_t state;\r
+ const Dem_FreezeFrameClassType *FreezeFrameLocal = NULL;\r
+ Dcm_NegativeResponseCodeType errorCode;//should include Dcm_Lcfg.h\r
+\r
+ /* clear FF data record */\r
+ memset(freezeFrame, 0, sizeof(FreezeFrameRecType ));\r
+\r
+ /* check if prefailed or failed */\r
+ if(eventStatusRec->eventStatusExtended & DEM_TEST_FAILED){\r
+ prefailedOrFailed = FAILED;//confirm the FF is stored for failed\r
+\r
+ }\r
+ else{\r
+ if(eventStatus == DEM_EVENT_STATUS_PREFAILED){\r
+ prefailedOrFailed = PREFAILED;//confirm the FF is stored for prefailed\r
+ }\r
+ else{\r
+ prefailedOrFailed = FF_STORAGE_CONDITION_WRONG;\r
+ freezeFrame->eventId = DEM_EVENT_ID_NULL;\r
+ return;\r
+ }\r
+ }\r
+\r
+ /* Find out the corresponding FF class */\r
+ for(i = 0;(i<DEM_MAX_NR_OF_CLASSES_IN_FREEZEFRAME_DATA) && (eventParam->FreezeFrameClassRef[i] != NULL);i++){\r
+ if(eventParam->FreezeFrameClassRef[i]->FFStorageCondition == prefailedOrFailed){\r
+ FreezeFrameLocal = eventParam->FreezeFrameClassRef[i];\r
+ break;\r
+ }\r
+ }\r
+ /* get the dids */\r
+ if(FreezeFrameLocal != NULL){\r
+ if(FreezeFrameLocal->FFIdClassRef != NULL){\r
+ for (i = 0; (i < DEM_MAX_NR_OF_RECORDS_IN_FREEZEFRAME_DATA) && (!(FreezeFrameLocal->FFIdClassRef[i].Arc_EOL)); i++) {\r
+ if(FreezeFrameLocal->FFIdClassRef[i].PidOrDidUsePort == FALSE){\r
+ if(FreezeFrameLocal->FFIdClassRef[i].DidReadDataLengthFnc != NULL){\r
+ callbackReturnCode = FreezeFrameLocal->FFIdClassRef[i].DidReadDataLengthFnc(&recordSize);\r
+ if(callbackReturnCode != E_OK){\r
+ //if fail to read data length,discard the storage of FF\r
+ freezeFrame->eventId = DEM_EVENT_ID_NULL;\r
+ DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_GET_FREEZEFRAME_ID, DEM_READ_DATA_LENGTH_FAILED);\r
+ return;\r
+ }\r
+ }\r
+ /* if no readDidDataLengthFunction, then try the PidOrDidSize. */\r
+ else{\r
+ recordSize = FreezeFrameLocal->FFIdClassRef[i].PidOrDidSize;\r
+ }\r
+ /* read out the did data */\r
+ if ((storeIndex + recordSize + DEM_DID_IDENTIFIER_SIZE_OF_BYTES) <= DEM_MAX_SIZE_FF_DATA) {\r
+ /* store DID */\r
+ freezeFrame->data[storeIndex] = (FreezeFrameLocal->FFIdClassRef[i].DidIdentifier>> 8) & 0xFFu;\r
+ storeIndex++;\r
+ freezeFrame->data[storeIndex] = FreezeFrameLocal->FFIdClassRef[i].DidIdentifier & 0xFFu;\r
+ storeIndex++;\r
+ /* store data */\r
+ if(FreezeFrameLocal->FFIdClassRef[i].DidConditionCheckReadFnc != NULL){\r
+ callbackReturnCode = FreezeFrameLocal->FFIdClassRef[i].DidConditionCheckReadFnc(&errorCode);\r
+ if ((callbackReturnCode == E_OK) && (errorCode == DCM_E_POSITIVERESPONSE)) {\r
+ if(FreezeFrameLocal->FFIdClassRef[i].DidReadFnc!= NULL){\r
+ callbackReturnCode = FreezeFrameLocal->FFIdClassRef[i].DidReadFnc(&freezeFrame->data[storeIndex]);\r
+ if (callbackReturnCode != E_OK) {\r
+ memset(&freezeFrame->data[storeIndex], DEM_FREEZEFRAME_DEFAULT_VALUE, recordSize);\r
+ }\r
+ storeIndex += recordSize;\r
+\r
+ }\r
+ else{\r
+ memset(&freezeFrame->data[storeIndex], DEM_FREEZEFRAME_DEFAULT_VALUE, recordSize);\r
+ storeIndex += recordSize;\r
+ }\r
+\r
+ }\r
+ else{\r
+ memset(&freezeFrame->data[storeIndex], DEM_FREEZEFRAME_DEFAULT_VALUE, recordSize);\r
+ storeIndex += recordSize;\r
+ }\r
+ }\r
+ else{\r
+ memset(&freezeFrame->data[storeIndex], DEM_FREEZEFRAME_DEFAULT_VALUE, recordSize);\r
+ storeIndex += recordSize;\r
+ }\r
+\r
+ }\r
+ else{\r
+ DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_GET_FREEZEFRAME_ID, DEM_E_FF_TOO_BIG);\r
+ break;\r
+ }\r
+ }\r
+ else{\r
+ //TODO:RTE should provide the port\r
+ DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_GET_FREEZEFRAME_ID, DEM_DSP_DID_USE_PORT_IS_TRUE);\r
+ }\r
+ }\r
+ }\r
+\r
+ }\r
+ else{\r
+ /* create an empty FF */\r
+ freezeFrame->eventId = DEM_EVENT_ID_NULL;\r
+ }\r
+\r
+ /* Check if any data has been stored */\r
+ if (storeIndex != 0) {\r
+ freezeFrame->eventId = eventParam->EventID;\r
+ freezeFrame->occurrence = eventStatusRec->occurrence;\r
+ freezeFrame->dataSize = storeIndex;\r
+ freezeFrame->recordNumber = FreezeFrameLocal->FFRecordNumber;\r
+ Irq_Save(state);\r
+\r
+ if(FF_TimeStamp > DEM_MAX_TIMESTAMP_FOR_REARRANGEMENT){\r
+ rearrangeFreezeFrameTimeStamp(&FF_TimeStamp);\r
+ }\r
+\r
+ freezeFrame->timeStamp = FF_TimeStamp;\r
+\r
+ FF_TimeStamp++;\r
+\r
+ Irq_Restore(state);\r
+\r
+ freezeFrame->checksum = calcChecksum(freezeFrame, sizeof(FreezeFrameRecType)-sizeof(ChecksumType));\r
+ }\r
+ else{\r
+ freezeFrame->eventId = DEM_EVENT_ID_NULL;\r
+ freezeFrame->dataSize = storeIndex;\r
+ freezeFrame->checksum = 0;\r
+ }\r
+}\r
+\r
+\r
+/*\r
+ * Procedure: storeFreezeFrameDataPreInit\r
+ * Description: store FF in before preInitFreezeFrameBuffer DEM's full initialization \r
+ */\r
+static void storeFreezeFrameDataPreInit(const Dem_EventParameterType *eventParam, const FreezeFrameRecType *freezeFrame)\r
+{\r
+ boolean eventIdFound = FALSE;\r
+ boolean eventIdFreePositionFound=FALSE;\r
+ FreezeFrameRecType *freezeFrameLocal = NULL;\r
+ uint16 i;\r
+ imask_t state;\r
+\r
+ Irq_Save(state);\r
+\r
+ /* Check if already stored */\r
+ for (i = 0; (i<DEM_MAX_NUMBER_FF_DATA_PRE_INIT) && (!eventIdFound); i++){\r
+ eventIdFound = ((preInitFreezeFrameBuffer[i].eventId == eventParam->EventID) && (preInitFreezeFrameBuffer[i].recordNumber== freezeFrame->recordNumber));\r
+ }\r
+\r
+ if(eventIdFound){\r
+ /* overwrite existing */\r
+ memcpy(&preInitFreezeFrameBuffer[i-1], freezeFrame, sizeof(FreezeFrameRecType));\r
+ }\r
+ else{\r
+ /* lookup first free position */\r
+ for (i = 0; (i<DEM_MAX_NUMBER_FF_DATA_PRE_INIT) && (!eventIdFreePositionFound); i++){\r
+ if(preInitFreezeFrameBuffer[i].eventId == DEM_EVENT_ID_NULL){\r
+ eventIdFreePositionFound=TRUE;\r
+ }\r
+ }\r
+\r
+ if (eventIdFreePositionFound) {\r
+ memcpy(&preInitFreezeFrameBuffer[i-1], freezeFrame, sizeof(FreezeFrameRecType));\r
+ }\r
+ else {\r
+ /* do displacement */\r
+ if(lookupFreezeFrameForDisplacementPreInit(&freezeFrameLocal)){\r
+ memcpy(freezeFrameLocal, freezeFrame, sizeof(FreezeFrameRecType));\r
+ }\r
+ else{\r
+ DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_STORE_FF_DATA_PRE_INIT_ID, DEM_E_PRE_INIT_FF_DATA_BUFF_FULL);\r
+ }\r
+ }\r
+ }\r
+\r
+ Irq_Restore(state);\r
+}\r
+\r
+\r
+/*\r
+ * Procedure: updateFreezeFrameOccurrencePreInit\r
+ * Description: update the occurrence in preInitFreezeFrameBuffer according to the occurrence stored in priMemEventBuffer \r
+ */\r
+static void updateFreezeFrameOccurrencePreInit(const EventRecType *EventBuffer)\r
+{\r
+ uint16 i;\r
+\r
+ for (i = 0; i<DEM_MAX_NUMBER_FF_DATA_PRE_INIT; i++){\r
+ if(preInitFreezeFrameBuffer[i].eventId == EventBuffer->eventId){\r
+ preInitFreezeFrameBuffer[i].occurrence += EventBuffer->occurrence;\r
+ }\r
+ }\r
+\r
+}\r
+/*\r
+ * Procedure: initCurrentFreezeFrameTimeStamp\r
+ * Description: initialize current timestamp and update the corresponding timestamp in preInitFreezeFrameBuffer \r
+ */\r
+static void initCurrentFreezeFrameTimeStamp(uint32 *timeStampPtr)\r
+{\r
+ uint16 i = 0;\r
+ uint32 temp = 0;\r
+ imask_t state;\r
+\r
+ Irq_Save(state);\r
+\r
+ /* Find out the biggest timestamp in the last power on */\r
+ for (i = 0; i<DEM_MAX_NUMBER_FF_DATA_PRI_MEM; i++){\r
+ if((priMemFreezeFrameBuffer[i].eventId != DEM_EVENT_ID_NULL) &&\r
+ (priMemFreezeFrameBuffer[i].timeStamp > temp)){\r
+ temp = priMemFreezeFrameBuffer[i].timeStamp;\r
+ }\r
+ }\r
+ temp++;\r
+ for (i = 0; i<DEM_MAX_NUMBER_FF_DATA_PRE_INIT; i++){\r
+ if(preInitFreezeFrameBuffer[i].eventId != DEM_EVENT_ID_NULL){\r
+ preInitFreezeFrameBuffer[i].timeStamp += temp;\r
+ }\r
+ }\r
+ *timeStampPtr += temp;\r
+ Irq_Restore(state);\r
+}\r
+\r
+/*\r
+ * Procedure: getExtendedData\r
+ * Description: Collects the extended data according to "eventParam" and return it in "extData",\r
+ * if not found eventId is set to DEM_EVENT_ID_NULL.\r
+ */\r
+static void getExtendedData(const Dem_EventParameterType *eventParam, ExtDataRecType *extData)\r
+{\r
+ Std_ReturnType callbackReturnCode;\r
+ uint16 i;\r
+ uint16 storeIndex = 0;\r
+ uint16 recordSize;\r
+\r
+ // Clear ext data record\r
+ memset(extData, 0, sizeof(ExtDataRecType));\r
+\r
+ // Check if any pointer to extended data class\r
+ if (eventParam->ExtendedDataClassRef != NULL) {\r
+ // Request extended data and copy it to the buffer\r
+ for (i = 0; (i < DEM_MAX_NR_OF_RECORDS_IN_EXTENDED_DATA) && (eventParam->ExtendedDataClassRef->ExtendedDataRecordClassRef[i] != NULL); i++) {\r
+ recordSize = eventParam->ExtendedDataClassRef->ExtendedDataRecordClassRef[i]->DataSize;\r
+ if ((storeIndex + recordSize) <= DEM_MAX_SIZE_EXT_DATA) {\r
+ callbackReturnCode = eventParam->ExtendedDataClassRef->ExtendedDataRecordClassRef[i]->CallbackGetExtDataRecord(&extData->data[storeIndex]); /** @req DEM282 */\r
+ if (callbackReturnCode != E_OK) {\r
+ // Callback data currently not available, clear space.\r
+ memset(&extData->data[storeIndex], 0xFF, recordSize);\r
+ }\r
+ storeIndex += recordSize;\r
+ }\r
+ else {\r
+ // Error: Size of extended data record is bigger than reserved space.\r
+ DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_GET_EXTENDED_DATA_ID, DEM_E_EXT_DATA_TOO_BIG);\r
+ break; // Break the loop\r
+ }\r
+ }\r
+ }\r
+\r
+ // Check if any data has been stored\r
+ if (storeIndex != 0) {\r
+ extData->eventId = eventParam->EventID;\r
+ extData->dataSize = storeIndex;\r
+ extData->checksum = calcChecksum(extData, sizeof(ExtDataRecType)-sizeof(ChecksumType));\r
+ }\r
+ else {\r
+ extData->eventId = DEM_EVENT_ID_NULL;\r
+ extData->dataSize = storeIndex;\r
+ extData->checksum = 0;\r
+ }\r
+}\r
+\r
+\r
+/*\r
+ * Procedure: storeExtendedDataPreInit\r
+ * Description: Store the extended data pointed by "extendedData" to the "preInitExtDataBuffer",\r
+ * if non existent a new entry is created.\r
+ */\r
+static void storeExtendedDataPreInit(const Dem_EventParameterType *eventParam, const ExtDataRecType *extendedData)\r
+{\r
+ boolean eventIdFound = FALSE;\r
+ boolean eventIdFreePositionFound=FALSE;\r
+ uint16 i;\r
+ imask_t state;\r
+ Irq_Save(state);\r
+\r
+ // Check if already stored\r
+ for (i = 0; (i<DEM_MAX_NUMBER_EXT_DATA_PRE_INIT) && (!eventIdFound); i++){\r
+ eventIdFound = (preInitExtDataBuffer[i].eventId == eventParam->EventID);\r
+ }\r
+\r
+ if(eventIdFound){\r
+ // Yes, overwrite existing\r
+ memcpy(&preInitExtDataBuffer[i-1], extendedData, sizeof(ExtDataRecType));\r
+ }\r
+ else{\r
+ // No, lookup first free position\r
+ for (i = 0; (i<DEM_MAX_NUMBER_EXT_DATA_PRE_INIT) && (!eventIdFreePositionFound); i++){\r
+ if(preInitExtDataBuffer[i].eventId ==0){\r
+ eventIdFreePositionFound=TRUE;\r
+ }\r
+ }\r
+\r
+ if (eventIdFreePositionFound) {\r
+ memcpy(&preInitExtDataBuffer[i-1], extendedData, sizeof(ExtDataRecType));\r
+ }\r
+ else {\r
+ // Error: Pre init extended data buffer full\r
+ DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_STORE_EXT_DATA_PRE_INIT_ID, DEM_E_PRE_INIT_EXT_DATA_BUFF_FULL);\r
+ }\r
+ }\r
+\r
+ Irq_Restore(state);\r
+}\r
+\r
+/*\r
+ * Procedure: storeEventPriMem\r
+ * Description: Store the event data of "eventStatus->eventId" in "priMemEventBuffer",\r
+ * if non existent a new entry is created.\r
+ */\r
+static void storeEventPriMem(const Dem_EventParameterType *eventParam, const EventStatusRecType *eventStatus)\r
+{\r
+ boolean eventIdFound = FALSE;\r
+ boolean eventIdFreePositionFound=FALSE;\r
+ uint16 i;\r
+ imask_t state;\r
+ Irq_Save(state);\r
+\r
+ (void)*eventParam; // Currently not used, do this to avoid warning\r
+\r
+ // Lookup event ID\r
+ for (i = 0; (i < DEM_MAX_NUMBER_EVENT_ENTRY_PRI) && (!eventIdFound); i++){\r
+ eventIdFound = (priMemEventBuffer[i].eventId == eventStatus->eventId);\r
+ }\r
+\r
+ if (eventIdFound) {\r
+ // Update event found\r
+ priMemEventBuffer[i-1].occurrence = eventStatus->occurrence;\r
+ priMemEventBuffer[i-1].eventStatusExtended = eventStatus->eventStatusExtended;\r
+ priMemEventBuffer[i-1].checksum = calcChecksum(&priMemEventBuffer[i-1], sizeof(EventRecType)-sizeof(ChecksumType));\r
+ }\r
+ else {\r
+ // Search for free position\r
+ for (i=0; (i < DEM_MAX_NUMBER_EVENT_ENTRY_PRI) && (!eventIdFreePositionFound); i++){\r
+ eventIdFreePositionFound = (priMemEventBuffer[i].eventId == DEM_EVENT_ID_NULL);\r
+ }\r
+\r
+\r
+ if (eventIdFreePositionFound) {\r
+ priMemEventBuffer[i-1].eventId = eventStatus->eventId;\r
+ priMemEventBuffer[i-1].occurrence = eventStatus->occurrence;\r
+ priMemEventBuffer[i-1].eventStatusExtended = eventStatus->eventStatusExtended;\r
+ priMemEventBuffer[i-1].checksum = calcChecksum(&priMemEventBuffer[i-1], sizeof(EventRecType)-sizeof(ChecksumType));\r
+ }\r
+ else {\r
+ // Error: Pri mem event buffer full\r
+ DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_STORE_EVENT_PRI_MEM_ID, DEM_E_PRI_MEM_EVENT_BUFF_FULL);\r
+ }\r
+ }\r
+\r
+ Irq_Restore(state);\r
+}\r
+\r
+/*\r
+ * Procedure: deleteEventPriMem\r
+ * Description: Delete the event data of "eventParam->eventId" from "priMemEventBuffer".\r
+ */\r
+static void deleteEventPriMem(const Dem_EventParameterType *eventParam)\r
+{\r
+ boolean eventIdFound = FALSE;\r
+ uint16 i;\r
+ imask_t state;\r
+ Irq_Save(state);\r
+\r
+ for (i = 0; (i < DEM_MAX_NUMBER_EVENT_ENTRY_PRI) && (!eventIdFound); i++){\r
+ eventIdFound = (priMemEventBuffer[i].eventId == eventParam->EventID);\r
+ }\r
+\r
+ if (eventIdFound) {\r
+ memset(&priMemEventBuffer[i-1], 0, sizeof(EventRecType));\r
+ }\r
+\r
+ Irq_Restore(state);\r
+}\r
+\r
+/*\r
+ * Procedure: storeEventEvtMem\r
+ * Description: Store the event data of "eventStatus->eventId" in event memory according to\r
+ * "eventParam" destination option.\r
+ */\r
+static void storeEventEvtMem(const Dem_EventParameterType *eventParam, const EventStatusRecType *eventStatus)\r
+{\r
+ uint16 i;\r
+\r
+ for (i = 0; (i < DEM_MAX_NR_OF_EVENT_DESTINATION)\r
+ && (eventParam->EventClass->EventDestination[i] != DEM_EVENT_DESTINATION_END_OF_LIST); i++) {\r
+ switch (eventParam->EventClass->EventDestination[i])\r
+ {\r
+ case DEM_DTC_ORIGIN_PRIMARY_MEMORY:\r
+ storeEventPriMem(eventParam, eventStatus); /** @req DEM010 */\r
+ break;\r
+\r
+ case DEM_DTC_ORIGIN_SECONDARY_MEMORY:\r
+ case DEM_DTC_ORIGIN_PERMANENT_MEMORY:\r
+ case DEM_DTC_ORIGIN_MIRROR_MEMORY:\r
+ // Not yet supported\r
+ DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_GLOBAL_ID, DEM_E_NOT_IMPLEMENTED_YET);\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
+ }\r
+}\r
+\r
+\r
+/*\r
+ * Procedure: storeExtendedDataPriMem\r
+ * Description: Store the extended data pointed by "extendedData" to the "priMemExtDataBuffer",\r
+ * if non existent a new entry is created.\r
+ */\r
+static void storeExtendedDataPriMem(const Dem_EventParameterType *eventParam, const ExtDataRecType *extendedData) /** @req DEM041 */\r
+{\r
+ boolean eventIdFound = FALSE;\r
+ boolean eventIdFreePositionFound=FALSE;\r
+ uint16 i;\r
+ imask_t state;\r
+ Irq_Save(state);\r
+\r
+ // Check if already stored\r
+ for (i = 0; (i<DEM_MAX_NUMBER_EXT_DATA_PRI_MEM) && (!eventIdFound); i++){\r
+ eventIdFound = (priMemExtDataBuffer[i].eventId == eventParam->EventID);\r
+ }\r
+\r
+ if (eventIdFound) {\r
+ // Yes, overwrite existing\r
+ memcpy(&priMemExtDataBuffer[i-1], extendedData, sizeof(ExtDataRecType));\r
+ }\r
+ else {\r
+ // No, lookup first free position\r
+ for (i = 0; (i < DEM_MAX_NUMBER_EXT_DATA_PRI_MEM) && (!eventIdFreePositionFound); i++){\r
+ eventIdFreePositionFound = (priMemExtDataBuffer[i].eventId == DEM_EVENT_ID_NULL);\r
+ }\r
+ if (eventIdFreePositionFound) {\r
+ memcpy(&priMemExtDataBuffer[i-1], extendedData, sizeof(ExtDataRecType));\r
+ }\r
+ else {\r
+ // Error: Pri mem extended data buffer full\r
+ DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_STORE_EXT_DATA_PRI_MEM_ID, DEM_E_PRI_MEM_EXT_DATA_BUFF_FULL);\r
+ }\r
+ }\r
+\r
+ Irq_Restore(state);\r
+}\r
+\r
+/*\r
+ * Procedure: deleteExtendedDataPriMem\r
+ * Description: Delete the extended data of "eventParam->eventId" from "priMemExtDataBuffer".\r
+ */\r
+static void deleteExtendedDataPriMem(const Dem_EventParameterType *eventParam)\r
+{\r
+ boolean eventIdFound = FALSE;\r
+ uint16 i;\r
+ imask_t state;\r
+ Irq_Save(state);\r
+\r
+ // Check if already stored\r
+ for (i = 0;(i<DEM_MAX_NUMBER_EXT_DATA_PRI_MEM) && (!eventIdFound); i++){\r
+ eventIdFound = (priMemExtDataBuffer[i].eventId == eventParam->EventID);\r
+ }\r
+\r
+ if (eventIdFound) {\r
+ // Yes, clear record\r
+ memset(&priMemExtDataBuffer[i-1], 0, sizeof(ExtDataRecType));\r
+ }\r
+\r
+ Irq_Restore(state);\r
+}\r
+\r
+/*\r
+ * Procedure: storeExtendedDataEvtMem\r
+ * Description: Store the extended data in event memory according to\r
+ * "eventParam" destination option\r
+ */\r
+static void storeExtendedDataEvtMem(const Dem_EventParameterType *eventParam, const ExtDataRecType *extendedData)\r
+{\r
+ uint16 i;\r
+\r
+ for (i = 0; (i < DEM_MAX_NR_OF_EVENT_DESTINATION) && (eventParam->EventClass->EventDestination[i] != DEM_EVENT_DESTINATION_END_OF_LIST); i++) {\r
+ switch (eventParam->EventClass->EventDestination[i])\r
+ {\r
+ case DEM_DTC_ORIGIN_PRIMARY_MEMORY:\r
+ storeExtendedDataPriMem(eventParam, extendedData);\r
+ break;\r
+\r
+ case DEM_DTC_ORIGIN_SECONDARY_MEMORY:\r
+ case DEM_DTC_ORIGIN_PERMANENT_MEMORY:\r
+ case DEM_DTC_ORIGIN_MIRROR_MEMORY:\r
+ // Not yet supported\r
+ DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_GLOBAL_ID, DEM_E_NOT_IMPLEMENTED_YET);\r
+ break;\r
+\r
+ default:\r
+ break;\r
+ }\r
+ }\r
+}\r
+\r
+\r
+/*\r
+ * Procedure: lookupExtendedDataRecNumParam\r
+ * Description: Returns TRUE if the requested extended data number was found among the configured records for the event.\r
+ * "extDataRecClassPtr" returns a pointer to the record class, "posInExtData" returns the position in stored extended data.\r
+ */\r
+static boolean lookupExtendedDataRecNumParam(uint8 extendedDataNumber, const Dem_EventParameterType *eventParam, Dem_ExtendedDataRecordClassType const **extDataRecClassPtr, uint16 *posInExtData)\r
+{\r
+ boolean recNumFound = FALSE;\r
+\r
+ if (eventParam->ExtendedDataClassRef != NULL) {\r
+ uint16 byteCnt = 0;\r
+ uint16 i;\r
+\r
+ // Request extended data and copy it to the buffer\r
+ for (i = 0; (i < DEM_MAX_NR_OF_RECORDS_IN_EXTENDED_DATA) && (eventParam->ExtendedDataClassRef->ExtendedDataRecordClassRef[i] != NULL) && (!recNumFound); i++) {\r
+ if (eventParam->ExtendedDataClassRef->ExtendedDataRecordClassRef[i]->RecordNumber == extendedDataNumber) {\r
+ *extDataRecClassPtr = eventParam->ExtendedDataClassRef->ExtendedDataRecordClassRef[i];\r
+ *posInExtData = byteCnt;\r
+ recNumFound = TRUE;\r
+ }\r
+ byteCnt += eventParam->ExtendedDataClassRef->ExtendedDataRecordClassRef[i]->DataSize;\r
+ }\r
+ }\r
+\r
+ return recNumFound;\r
+}\r
+\r
+\r
+/*\r
+ * Procedure: lookupExtendedDataPriMem\r
+ * Description: Returns TRUE if the requested event id is found, "extData" points to the found data.\r
+ */\r
+static boolean lookupExtendedDataPriMem(Dem_EventIdType eventId, ExtDataRecType **extData)\r
+{\r
+ boolean eventIdFound = FALSE;\r
+ sint16 i;\r
+\r
+ // Lookup corresponding extended data\r
+ for (i = 0; (i < DEM_MAX_NUMBER_EXT_DATA_PRI_MEM) && (!eventIdFound); i++) {\r
+ eventIdFound = (priMemExtDataBuffer[i].eventId == eventId);\r
+ }\r
+\r
+ if (eventIdFound) {\r
+ // Yes, return pointer\r
+ *extData = &priMemExtDataBuffer[i-1];\r
+ }\r
+\r
+ return eventIdFound;\r
+}\r
+/*\r
+ * Procedure: copyNvmMirror\r
+ * Description: Copies Nvram to buffer\r
+ */\r
+\r
+Std_ReturnType copyNvmMirror(const NvM_BlockIdType BlockId, uint8 *dstPtr, const uint8 *srcPtr, uint8 len)\r
+{\r
+\r
+#if (DEM_USE_NVM == STD_ON)\r
+ Std_ReturnType blockReadStatus = E_NOT_OK;\r
+ NvM_RequestResultType requestResult;\r
+\r
+ if( BlockId != 0 ) {\r
+ NvM_GetErrorStatus(BlockId, &requestResult);\r
+ if(requestResult != NVM_REQ_PENDING ) {\r
+ memcpy(dstPtr, srcPtr, len);\r
+ blockReadStatus = E_OK;\r
+ }\r
+ }\r
+\r
+ return blockReadStatus;\r
+#else\r
+ return E_OK;\r
+#endif\r
+}\r
+/*\r
+ * Procedure: writeNvmMirror\r
+ * Description: store data in NVRam\r
+ */\r
+Std_ReturnType writeNvmMirror(const NvM_BlockIdType BlockId, uint8 *dstPtr, const uint8 *srcPtr, uint8 len)\r
+{\r
+#if (DEM_USE_NVM == STD_ON)\r
+ Std_ReturnType blockWriteStatus = E_NOT_OK;\r
+ NvM_RequestResultType requestResult;\r
+\r
+ if( BlockId != 0 ) {\r
+ NvM_GetErrorStatus(BlockId, &requestResult);\r
+ if(requestResult != NVM_REQ_PENDING ) {\r
+ memcpy(dstPtr, srcPtr, len);\r
+ (void)NvM_WriteBlock(BlockId, (const uint8*)dstPtr);\r
+ blockWriteStatus = E_OK;\r
+ }\r
+ }\r
+\r
+ return blockWriteStatus;\r
+#else\r
+ return E_OK;\r
+#endif\r
+}\r
+\r
+/*\r
+ * Procedure: storeAgingRecPerMem\r
+ * Description: store aging records in NVRam\r
+ */\r
+static void storeAgingRecPerMem(const NvM_BlockIdType AgingBlockId)\r
+{\r
+ imask_t state;\r
+\r
+ Irq_Save(state);\r
+\r
+ if( E_OK == writeNvmMirror(AgingBlockId, (uint8 *)HealingMirrorBuffer, (const uint8 *)priMemAgingBuffer, sizeof(priMemAgingBuffer)) ){\r
+ AgingIsModified = FALSE;\r
+ } else {\r
+ AgingIsModified = TRUE;\r
+ }\r
+\r
+ Irq_Restore(state);\r
+}\r
+/*\r
+ * Procedure: deleteAgingRecPriMem\r
+ * Description: delete aging record in primary memory\r
+ */\r
+static void deleteAgingRecPriMem(const Dem_EventParameterType *eventParam)\r
+{\r
+ uint16 i;\r
+ imask_t state;\r
+\r
+ Irq_Save(state);\r
+\r
+ for (i = 0; i<DEM_MAX_NUMBER_FF_DATA_PRI_MEM; i++){\r
+ if (priMemAgingBuffer[i].eventId == eventParam->EventID){\r
+ memset(&priMemAgingBuffer[i], 0, sizeof(HealingRecType));\r
+ }\r
+ }\r
+\r
+ Irq_Restore(state);\r
+}\r
+\r
+/*\r
+ * Procedure: storeFreezeFrameDataPriMem\r
+ * Description: store FreezeFrame data record in primary memory\r
+ */\r
+static void storeFreezeFrameDataPriMem(const Dem_EventParameterType *eventParam, const FreezeFrameRecType *freezeFrame)\r
+{\r
+ boolean eventIdFound = FALSE;\r
+ boolean eventIdFreePositionFound=FALSE;\r
+ boolean displacementPositionFound=FALSE;\r
+ FreezeFrameRecType *freezeFrameLocal;\r
+ uint16 i;\r
+ imask_t state;\r
+\r
+ Irq_Save(state);\r
+\r
+ /* Check if already stored */\r
+ for (i = 0; (i<DEM_MAX_NUMBER_FF_DATA_PRI_MEM) && (!eventIdFound); i++){\r
+ eventIdFound = ((priMemFreezeFrameBuffer[i].eventId == eventParam->EventID) && (priMemFreezeFrameBuffer[i].recordNumber == freezeFrame->recordNumber));\r
+ }\r
+\r
+ if (eventIdFound) {\r
+ memcpy(&priMemFreezeFrameBuffer[i-1], freezeFrame, sizeof(FreezeFrameRecType));\r
+ }\r
+ else {\r
+ for (i = 0; (i < DEM_MAX_NUMBER_FF_DATA_PRI_MEM) && (!eventIdFreePositionFound); i++){\r
+ eventIdFreePositionFound = (priMemFreezeFrameBuffer[i].eventId == DEM_EVENT_ID_NULL);\r
+ }\r
+ if (eventIdFreePositionFound) {\r
+ memcpy(&priMemFreezeFrameBuffer[i-1], freezeFrame, sizeof(FreezeFrameRecType));\r
+ }\r
+ else {\r
+ displacementPositionFound = lookupFreezeFrameForDisplacement(&freezeFrameLocal);\r
+ if(displacementPositionFound){\r
+ memcpy(freezeFrameLocal, freezeFrame, sizeof(FreezeFrameRecType));\r
+ }\r
+ else{\r
+ DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_STORE_FF_DATA_PRI_MEM_ID, DEM_E_PRI_MEM_FF_DATA_BUFF_FULL);\r
+ }\r
+ }\r
+ }\r
+\r
+ Irq_Restore(state);\r
+}\r
+/*\r
+ * Procedure: storeFreezeFrameDataPerMem\r
+ * Description: Store the freeze frame data in NVRam\r
+ * \r
+ */\r
+static void storeFreezeFrameDataPerMem()\r
+{\r
+ imask_t state;\r
+\r
+ Irq_Save(state);\r
+\r
+ for(uint16 i = 0; i < DEM_MAX_NUMBER_FF_DATA_PRI_MEM; i++){\r
+ if(memcmp(&priMemFreezeFrameBuffer[i], FreezeFrameMirrorBuffer[i], sizeof(FreezeFrameRecType))){\r
+ if( E_NOT_OK == writeNvmMirror(FreezeFrameBlockId[i], (uint8 *)FreezeFrameMirrorBuffer[i], (const uint8 *)&priMemFreezeFrameBuffer[i], sizeof(FreezeFrameRecType)) ) {\r
+ FFIsModified = TRUE;\r
+ }\r
+ }\r
+ }\r
+\r
+ Irq_Restore(state);\r
+}\r
+\r
+// PC-Lint (715 etc): Remove errors until function is filled.\r
+//lint -e{715} Symbol not referenced\r
+static void deleteFreezeFrameDataPriMem(const Dem_EventParameterType *eventParam)\r
+{\r
+ uint16 i;\r
+ imask_t state;\r
+\r
+ Irq_Save(state);\r
+\r
+ for (i = 0; i<DEM_MAX_NUMBER_FF_DATA_PRI_MEM; i++){\r
+ if (priMemFreezeFrameBuffer[i].eventId == eventParam->EventID){\r
+ memset(&priMemFreezeFrameBuffer[i], 0, sizeof(FreezeFrameRecType));\r
+\r
+ }\r
+ }\r
+\r
+ Irq_Restore(state);\r
+}\r
+\r
+/*\r
+ * Procedure: storeFreezeFrameDataEvtMem\r
+ * Description: Store the freeze frame data in event memory according to\r
+ * "eventParam" destination option\r
+ */\r
+static void storeFreezeFrameDataEvtMem(const Dem_EventParameterType *eventParam, const FreezeFrameRecType *freezeFrame)\r
+{\r
+ uint16 i;\r
+\r
+ for (i = 0; (i < DEM_MAX_NR_OF_EVENT_DESTINATION) && (eventParam->EventClass->EventDestination[i] != DEM_EVENT_DESTINATION_END_OF_LIST); i++) {\r
+ switch (eventParam->EventClass->EventDestination[i])\r
+ {\r
+ case DEM_DTC_ORIGIN_PRIMARY_MEMORY:\r
+ storeFreezeFrameDataPriMem(eventParam, freezeFrame);\r
+ storeFreezeFrameDataPerMem();\r
+ break;\r
+\r
+ case DEM_DTC_ORIGIN_PERMANENT_MEMORY:\r
+ case DEM_DTC_ORIGIN_SECONDARY_MEMORY:\r
+ case DEM_DTC_ORIGIN_MIRROR_MEMORY:\r
+ // Not yet supported\r
+ DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_GLOBAL_ID, DEM_E_NOT_IMPLEMENTED_YET);\r
+ break;\r
+\r
+ default:\r
+ break;\r
+ }\r
+ }\r
+}\r
+\r
+/*\r
+ * Procedure: lookupFreezeFrameDataRecNumParam\r
+ * Description: Returns TRUE if the requested freezeFrame data number was found among the configured records for the event.\r
+ * "freezeFrameClassPtr" returns a pointer to the record class.\r
+ */\r
+static boolean lookupFreezeFrameDataRecNumParam(uint8 recordNumber, const Dem_EventParameterType *eventParam, Dem_FreezeFrameClassType const **freezeFrameClassPtr)\r
+{\r
+ boolean recNumFound = FALSE;\r
+ uint16 i;\r
+\r
+ if (eventParam->FreezeFrameClassRef != NULL) {\r
+ for (i = 0; (i < DEM_MAX_NR_OF_CLASSES_IN_FREEZEFRAME_DATA) && (eventParam->FreezeFrameClassRef[i] != NULL) && (!recNumFound); i++) {\r
+ if (eventParam->FreezeFrameClassRef[i]->FFRecordNumber == recordNumber) {\r
+ *freezeFrameClassPtr = eventParam->FreezeFrameClassRef[i];\r
+ recNumFound = TRUE;\r
+ }\r
+ }\r
+ }\r
+\r
+ return recNumFound;\r
+}\r
+\r
+/*\r
+ * Procedure: lookupFreezeFrameDataSize\r
+ * Description: Returns TRUE if the requested freezeFrame data size was obtained successfully from the configuration.\r
+ * "dataSize" returns a pointer to the data size.\r
+ */\r
+static boolean lookupFreezeFrameDataSize(uint8 recordNumber, Dem_FreezeFrameClassType const **freezeFrameClassPtr, uint16 *dataSize)\r
+{\r
+ Std_ReturnType callbackReturnCode;\r
+ boolean dataSizeFound = TRUE;\r
+ uint16 dataSizeLocal = 0;\r
+ uint16 i;\r
+\r
+ if (*freezeFrameClassPtr != NULL) {\r
+ for (i = 0; (i < DEM_MAX_NR_OF_RECORDS_IN_FREEZEFRAME_DATA) && ((*freezeFrameClassPtr)->FFIdClassRef[i].Arc_EOL != TRUE); i++) {\r
+ if((*freezeFrameClassPtr)->FFIdClassRef[i].DidReadDataLengthFnc != NULL){\r
+ callbackReturnCode = (*freezeFrameClassPtr)->FFIdClassRef[i].DidReadDataLengthFnc(&dataSizeLocal);\r
+ if(callbackReturnCode != E_OK){\r
+ return (dataSizeFound = FALSE);\r
+ }\r
+ }\r
+ else{\r
+ dataSizeLocal = (*freezeFrameClassPtr)->FFIdClassRef[i].PidOrDidSize;\r
+ }\r
+\r
+ *dataSize += dataSizeLocal + DEM_DID_IDENTIFIER_SIZE_OF_BYTES;\r
+ }\r
+\r
+ }\r
+\r
+ return dataSizeFound;\r
+}\r
+\r
+/*\r
+ * Procedure: lookupFreezeFrameDataPriMem\r
+ * Description: Returns TRUE if the requested event id is found, "freezeFrame" points to the found data.\r
+ */\r
+static boolean lookupFreezeFrameDataPriMem(Dem_EventIdType eventId,uint8 recordNumber, FreezeFrameRecType **freezeFrame)\r
+{\r
+ boolean eventIdFound = FALSE;\r
+ uint16 i;\r
+\r
+ for (i = 0; (i < DEM_MAX_NUMBER_FF_DATA_PRI_MEM) && (!eventIdFound); i++) {\r
+ eventIdFound = ((priMemFreezeFrameBuffer[i].eventId == eventId) && (priMemFreezeFrameBuffer[i].recordNumber == recordNumber));\r
+ }\r
+\r
+ if (eventIdFound) {\r
+ *freezeFrame = &priMemFreezeFrameBuffer[i-1];\r
+ }\r
+\r
+ return eventIdFound;\r
+}\r
+\r
+/*\r
+ * Procedure: handlePreInitEvent\r
+ * Description: Handle the updating of event status and storing of\r
+ * event related data in preInit buffers.\r
+ */\r
+static void handlePreInitEvent(Dem_EventIdType eventId, Dem_EventStatusType eventStatus)\r
+{\r
+ const Dem_EventParameterType *eventParam;\r
+ EventStatusRecType eventStatusLocal;\r
+ FreezeFrameRecType freezeFrameLocal;\r
+ ExtDataRecType extendedDataLocal;\r
+\r
+ lookupEventIdParameter(eventId, &eventParam);\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_FAILED) {\r
+ updateEventStatusRec(eventParam, eventStatus, TRUE, &eventStatusLocal);\r
+ }\r
+ else {\r
+ updateEventStatusRec(eventParam, eventStatus, FALSE, &eventStatusLocal);\r
+ }\r
+\r
+ if (eventStatusLocal.errorStatusChanged) {\r
+ if (eventStatusLocal.eventStatusExtended & DEM_TEST_FAILED) {\r
+ getExtendedData(eventParam, &extendedDataLocal);\r
+ if (extendedDataLocal.eventId != DEM_EVENT_ID_NULL) {\r
+ storeExtendedDataPreInit(eventParam, &extendedDataLocal);\r
+ }\r
+ getFreezeFrameData(eventParam, &freezeFrameLocal,eventStatus,&eventStatusLocal);\r
+ if (freezeFrameLocal.eventId != DEM_EVENT_ID_NULL) {\r
+ storeFreezeFrameDataPreInit(eventParam, &freezeFrameLocal);\r
+ }\r
+ }\r
+ }\r
+\r
+\r
+ }\r
+ else {\r
+ // Operation cycle not started\r
+ // TODO: Report error?\r
+ }\r
+ }\r
+ else {\r
+ // Operation cycle not set\r
+ // TODO: Report error?\r
+ }\r
+ }\r
+ else {\r
+ // Event ID not configured\r
+ // TODO: Report error?\r
+ }\r
+}\r
+\r
+\r
+/*\r
+ * Procedure: handleEvent\r
+ * Description: Handle the updating of event status and storing of\r
+ * event related data in event memory.\r
+ */\r
+static Std_ReturnType handleEvent(Dem_EventIdType eventId, Dem_EventStatusType eventStatus)\r
+{\r
+ Std_ReturnType returnCode = E_OK;\r
+ const Dem_EventParameterType *eventParam;\r
+ EventStatusRecType eventStatusLocal;\r
+ FreezeFrameRecType freezeFrameLocal;\r
+ ExtDataRecType extendedDataLocal;\r
+ Dem_EventStatusType eventStatusTemp = eventStatus;\r
+\r
+ lookupEventIdParameter(eventId, &eventParam);\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 ((!((disableDtcStorage.storageDisabled) && (checkDtcGroup(disableDtcStorage.dtcGroup, eventParam)) && (checkDtcKind(disableDtcStorage.dtcKind, eventParam))))) {\r
+ updateEventStatusRec(eventParam, eventStatus, TRUE, &eventStatusLocal);\r
+ if (eventStatusLocal.errorStatusChanged) {\r
+ storeEventEvtMem(eventParam, &eventStatusLocal); /** @req DEM184 */\r
+ if (eventStatusLocal.eventStatusExtended & DEM_TEST_FAILED) {\r
+ getExtendedData(eventParam, &extendedDataLocal);\r
+ if (extendedDataLocal.eventId != DEM_EVENT_ID_NULL)\r
+ {\r
+ storeExtendedDataEvtMem(eventParam, &extendedDataLocal);\r
+ }\r
+ }\r
+\r
+ if ((eventStatusTemp == DEM_EVENT_STATUS_PREFAILED)\r
+ || (eventStatusLocal.eventStatusExtended & DEM_TEST_FAILED)){\r
+ getFreezeFrameData(eventParam, &freezeFrameLocal,eventStatus,&eventStatusLocal);\r
+ if (freezeFrameLocal.eventId != DEM_EVENT_ID_NULL) {\r
+ storeFreezeFrameDataEvtMem(eventParam, &freezeFrameLocal); /** @req DEM190 */\r
+ }\r
+ }\r
+ else{\r
+ // do nothing\r
+ }\r
+ }\r
+ }\r
+ }\r
+ else {\r
+ // Operation cycle not started\r
+ returnCode = E_NOT_OK;\r
+ }\r
+ }\r
+ else {\r
+ // Operation cycle not set\r
+ returnCode = E_NOT_OK;\r
+ }\r
+ }\r
+ else {\r
+ // Event ID not configured\r
+ returnCode = E_NOT_OK;\r
+ }\r
+\r
+ return returnCode;\r
+}\r
+\r
+\r
+/*\r
+ * Procedure: resetEventStatus\r
+ * Description: Resets the events status of eventId.\r
+ */\r
+static void resetEventStatus(Dem_EventIdType eventId)\r
+{\r
+ EventStatusRecType *eventStatusRecPtr;\r
+ imask_t state;\r
+ Irq_Save(state);\r
+\r
+ lookupEventStatusRec(eventId, &eventStatusRecPtr);\r
+ if (eventStatusRecPtr != NULL) {\r
+ eventStatusRecPtr->eventStatusExtended &= (Dem_EventStatusExtendedType)~DEM_TEST_FAILED; /** @req DEM187 */\r
+ }\r
+\r
+ Irq_Restore(state);\r
+}\r
+\r
+\r
+/*\r
+ * Procedure: getEventStatus\r
+ * Description: Returns the extended event status bitmask of eventId in "eventStatusExtended".\r
+ */\r
+static void getEventStatus(Dem_EventIdType eventId, Dem_EventStatusExtendedType *eventStatusExtended)\r
+{\r
+ EventStatusRecType eventStatusLocal;\r
+\r
+ // Get recorded status\r
+ getEventStatusRec(eventId, &eventStatusLocal);\r
+ if (eventStatusLocal.eventId == eventId) {\r
+ *eventStatusExtended = eventStatusLocal.eventStatusExtended; /** @req DEM051 */\r
+ }\r
+ else {\r
+ // Event Id not found, no report received.\r
+ *eventStatusExtended = DEM_TEST_NOT_COMPLETED_THIS_OPERATION_CYCLE | DEM_TEST_NOT_COMPLETED_SINCE_LAST_CLEAR;\r
+ }\r
+}\r
+\r
+\r
+/*\r
+ * Procedure: getEventFailed\r
+ * Description: Returns the TRUE or FALSE of "eventId" in "eventFailed" depending on current status.\r
+ */\r
+static void getEventFailed(Dem_EventIdType eventId, boolean *eventFailed)\r
+{\r
+ EventStatusRecType eventStatusLocal;\r
+\r
+ // Get recorded status\r
+ getEventStatusRec(eventId, &eventStatusLocal);\r
+ if (eventStatusLocal.eventId == eventId) {\r
+ if (eventStatusLocal.eventStatusExtended & DEM_TEST_FAILED) { /** @req DEM052 */\r
+ *eventFailed = TRUE;\r
+ }\r
+ else {\r
+ *eventFailed = FALSE;\r
+ }\r
+ }\r
+ else {\r
+ // Event Id not found, assume ok.\r
+ *eventFailed = FALSE;\r
+ }\r
+}\r
+\r
+\r
+/*\r
+ * Procedure: getEventTested\r
+ * Description: Returns the TRUE or FALSE of "eventId" in "eventTested" depending on\r
+ * current status the "test not completed this operation cycle" bit.\r
+ */\r
+static void getEventTested(Dem_EventIdType eventId, boolean *eventTested)\r
+{\r
+ EventStatusRecType eventStatusLocal;\r
+\r
+ // Get recorded status\r
+ getEventStatusRec(eventId, &eventStatusLocal);\r
+ if (eventStatusLocal.eventId == eventId) {\r
+ if ( !(eventStatusLocal.eventStatusExtended & DEM_TEST_NOT_COMPLETED_THIS_OPERATION_CYCLE)) { /** @req DEM053 */\r
+ *eventTested = TRUE;\r
+ }\r
+ else {\r
+ *eventTested = FALSE;\r
+ }\r
+ }\r
+ else {\r
+ // Event Id not found, not tested.\r
+ *eventTested = FALSE;\r
+ }\r
+}\r
+\r
+\r
+/*\r
+ * Procedure: getFaultDetectionCounter\r
+ * Description: Returns pre debounce counter of "eventId" in "counter" and return value E_OK if\r
+ * the counter was available else E_NOT_OK.\r
+ */\r
+static Std_ReturnType getFaultDetectionCounter(Dem_EventIdType eventId, sint8 *counter)\r
+{\r
+ Std_ReturnType returnCode = E_NOT_OK;\r
+ const Dem_EventParameterType *eventParam;\r
+\r
+ lookupEventIdParameter(eventId, &eventParam);\r
+ if (eventParam != NULL) {\r
+ if (eventParam->EventClass->PreDebounceAlgorithmClass != NULL) {\r
+ switch (eventParam->EventClass->PreDebounceAlgorithmClass->PreDebounceName)\r
+ {\r
+ case DEM_NO_PRE_DEBOUNCE:\r
+ if (eventParam->EventClass->PreDebounceAlgorithmClass->PreDebounceAlgorithm.PreDebounceMonitorInternal != NULL) {\r
+ if (eventParam->EventClass->PreDebounceAlgorithmClass->PreDebounceAlgorithm.PreDebounceMonitorInternal->CallbackGetFDCntFnc != NULL) {\r
+ returnCode = eventParam->EventClass->PreDebounceAlgorithmClass->PreDebounceAlgorithm.PreDebounceMonitorInternal->CallbackGetFDCntFnc(counter); /** @req DEM204.None */ /** @req DEM264 */ /** @req DEM265 */\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; /** @req DEM204.Counter */\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
+ DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_GETFAULTDETECTIONCOUNTER_ID, DEM_E_NOT_IMPLEMENTED_YET);\r
+ break;\r
+\r
+ default:\r
+ DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_GETFAULTDETECTIONCOUNTER_ID, DEM_E_PARAM_DATA);\r
+ break;\r
+ }\r
+ }\r
+ }\r
+\r
+ return returnCode;\r
+}\r
+/*\r
+ * Procedure: deleteEventMemory\r
+ * Description: If aging of an event occurs, the Dem module shall delete the event from \r
+ * the event memory including its event related data\r
+ */\r
+static void deleteEventMemory(const Dem_EventParameterType *eventParam)\r
+{\r
+ uint16 i;\r
+\r
+ for (i = 0; (i < DEM_MAX_NR_OF_EVENT_DESTINATION) && (eventParam->EventClass->EventDestination[i] != DEM_EVENT_DESTINATION_END_OF_LIST); i++) {\r
+ switch (eventParam->EventClass->EventDestination[i])\r
+ {\r
+ case DEM_DTC_ORIGIN_PRIMARY_MEMORY:\r
+ deleteEventPriMem(eventParam);\r
+ deleteFreezeFrameDataPriMem(eventParam);\r
+ deleteExtendedDataPriMem(eventParam);\r
+ storeFreezeFrameDataPerMem();\r
+ break;\r
+\r
+ case DEM_DTC_ORIGIN_PERMANENT_MEMORY:\r
+ //TODO:need to add corresponding event and extended deleting functions\r
+\r
+ break;\r
+\r
+ case DEM_DTC_ORIGIN_SECONDARY_MEMORY:\r
+ case DEM_DTC_ORIGIN_MIRROR_MEMORY:\r
+ // Not yet supported\r
+ DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_GLOBAL_ID, DEM_E_NOT_IMPLEMENTED_YET);\r
+ break;\r
+\r
+ default:\r
+ break;\r
+ }\r
+\r
+ }\r
+\r
+}\r
+/*\r
+ * Procedure: lookupAgingRecPriMem\r
+ * Description: Returns the pointer to event id parameters of "eventId" in "*priMemAgingBuffer",\r
+ * if not found NULL is returned.\r
+ */\r
+static boolean lookupAgingRecPriMem(Dem_EventIdType eventId, const HealingRecType **agingRec)\r
+{\r
+ uint16 i;\r
+ boolean agingRecFound = FALSE;\r
+\r
+ for (i = 0; i < DEM_MAX_NUMBER_AGING_PRI_MEM && (!agingRecFound); i++) {\r
+ if(priMemAgingBuffer[i].eventId == eventId){\r
+ agingRecFound = TRUE;\r
+ }\r
+\r
+ }\r
+\r
+ if(agingRecFound){\r
+ *agingRec = &priMemAgingBuffer[i-1];\r
+ }\r
+ else{\r
+ *agingRec = NULL;\r
+ }\r
+\r
+ return agingRecFound;\r
+\r
+}\r
+\r
+\r
+/*\r
+ * Procedure: handleAging\r
+ * Description: according to the operation state of "operationCycleId" to "cycleState" , handle the aging relatived data\r
+ * Returns E_OK if operation was successful else E_NOT_OK.\r
+ */\r
+static Std_ReturnType handleAging(Dem_OperationCycleIdType operationCycleId, Dem_OperationCycleStateType cycleState)\r
+{\r
+ uint16 i;\r
+ Std_ReturnType returnCode = E_OK;\r
+ HealingRecType *agingRecLocal = NULL;\r
+ boolean agingRecFound = FALSE;\r
+\r
+ if (operationCycleId < DEM_OPERATION_CYCLE_ID_ENDMARK) {\r
+ switch (cycleState)\r
+ {\r
+ case DEM_CYCLE_STATE_START:\r
+ break;\r
+\r
+ case DEM_CYCLE_STATE_END:/** @req Dem490 */\r
+ for (i = 0; i < DEM_MAX_NUMBER_EVENT; i++) {\r
+ if(eventStatusBuffer[i].eventId != DEM_EVENT_ID_NULL){\r
+ if(eventStatusBuffer[i].eventParamRef != NULL){\r
+ if(eventStatusBuffer[i].eventParamRef->EventClass != NULL){\r
+ if((eventStatusBuffer[i].eventParamRef->EventClass->HealingAllowed == TRUE)\\r
+ && (eventStatusBuffer[i].eventParamRef->EventClass->HealingCycleRef == operationCycleId)){\r
+ if((eventStatusBuffer[i].eventStatusExtended & DEM_CONFIRMED_DTC)\\r
+ && (!(eventStatusBuffer[i].eventStatusExtended & DEM_TEST_FAILED))\\r
+ && (!(eventStatusBuffer[i].eventStatusExtended & DEM_TEST_NOT_COMPLETED_THIS_OPERATION_CYCLE))){\r
+ agingRecFound = lookupAgingRecPriMem(eventStatusBuffer[i].eventId, (const HealingRecType **)(&agingRecLocal));\r
+ if(agingRecFound){\r
+ agingRecLocal->agingCounter++;/** @req Dem489 */\r
+ agingRecLocal->checksum = calcChecksum(agingRecLocal,sizeof(HealingRecType) - sizeof(ChecksumType));\r
+ if(agingRecLocal->agingCounter > eventStatusBuffer[i].eventParamRef->EventClass->HealingCycleCounter){\r
+ //deleteEventMemory(eventStatusBuffer[i].eventParamRef); /** @req Dem497 */\r
+\r
+ deleteAgingRecPriMem(eventStatusBuffer[i].eventParamRef);\r
+\r
+ eventStatusBuffer[i].eventStatusExtended &= (Dem_EventStatusExtendedType)(~DEM_CONFIRMED_DTC);\r
+ eventStatusBuffer[i].eventStatusExtended &= (Dem_EventStatusExtendedType)(~DEM_PENDING_DTC);\r
+ eventStatusBuffer[i].eventStatusExtended &= (Dem_EventStatusExtendedType)(~DEM_WARNING_INDICATOR_REQUESTED);\r
+ }\r
+ /* Set the flag,start up the storage of NVRam in main function. */\r
+ AgingIsModified = TRUE;\r
+ }\r
+ else{\r
+ /* If it does exist,establish a new record for the corresponding event */\r
+ agingRecFound = lookupAgingRecPriMem(DEM_EVENT_ID_NULL, (const HealingRecType **)(&agingRecLocal));\r
+ if(agingRecFound){\r
+ agingRecLocal->eventId = eventStatusBuffer[i].eventId;\r
+ agingRecLocal->agingCounter++;\r
+ agingRecLocal->checksum = calcChecksum(agingRecLocal,sizeof(HealingRecType) - sizeof(ChecksumType));\r
+ AgingIsModified = TRUE;\r
+ }\r
+ else{\r
+ /* primary memory of aging records is full. */\r
+ }\r
+ }\r
+ }\r
+ else{\r
+ /* If the status bit testFailed (bit 0) is set during the operation cycle, the counter shall be reset. */\r
+ if(eventStatusBuffer[i].eventStatusExtended & DEM_TEST_FAILED){\r
+ agingRecFound = lookupAgingRecPriMem(eventStatusBuffer[i].eventId, (const HealingRecType **)(&agingRecLocal));\r
+ if(agingRecFound){\r
+ if(agingRecLocal->agingCounter){\r
+ agingRecLocal->agingCounter = 0;\r
+ agingRecLocal->checksum = calcChecksum(agingRecLocal,sizeof(HealingRecType) - sizeof(ChecksumType));\r
+ AgingIsModified = TRUE;\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+ break;\r
+ default:\r
+ DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_SETOPERATIONCYCLESTATE_ID, DEM_E_PARAM_DATA);\r
+ returnCode = E_NOT_OK;\r
+ break;\r
+ }\r
+ }\r
+ else {\r
+ DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_SETOPERATIONCYCLESTATE_ID, DEM_E_PARAM_DATA);\r
+ returnCode = E_NOT_OK;\r
+ }\r
+\r
+ return returnCode;\r
+\r
+}\r
+\r
+/*\r
+ * Procedure: setOperationCycleState\r
+ * Description: Change the operation state of "operationCycleId" to "cycleState" and updates stored\r
+ * event connected to this cycle id.\r
+ * Returns E_OK if operation was successful else E_NOT_OK.\r
+ */\r
+static Std_ReturnType setOperationCycleState(Dem_OperationCycleIdType operationCycleId, Dem_OperationCycleStateType cycleState) /** @req DEM338 */\r
+{\r
+ uint16 i;\r
+ Std_ReturnType returnCode = E_OK;\r
+\r
+ if (operationCycleId < DEM_OPERATION_CYCLE_ID_ENDMARK) {\r
+ switch (cycleState)\r
+ {\r
+ case DEM_CYCLE_STATE_START:\r
+ operationCycleStateList[operationCycleId] = cycleState;\r
+ // Lookup event ID\r
+ for (i = 0; i < DEM_MAX_NUMBER_EVENT; i++) {\r
+ if ((eventStatusBuffer[i].eventId != DEM_EVENT_ID_NULL) && (eventStatusBuffer[i].eventParamRef->EventClass->OperationCycleRef == operationCycleId)) {\r
+ eventStatusBuffer[i].eventStatusExtended &= (Dem_EventStatusExtendedType)~DEM_TEST_FAILED_THIS_OPERATION_CYCLE;\r
+ eventStatusBuffer[i].eventStatusExtended |= DEM_TEST_NOT_COMPLETED_THIS_OPERATION_CYCLE;\r
+ }\r
+ }\r
+ break;\r
+\r
+ case DEM_CYCLE_STATE_END:\r
+ operationCycleStateList[operationCycleId] = cycleState;\r
+ // Lookup event ID\r
+ for (i = 0; i < DEM_MAX_NUMBER_EVENT; i++) {\r
+ if ((eventStatusBuffer[i].eventId != DEM_EVENT_ID_NULL) && (eventStatusBuffer[i].eventParamRef->EventClass->OperationCycleRef == operationCycleId)) {\r
+ if ((!(eventStatusBuffer[i].eventStatusExtended & DEM_TEST_FAILED_THIS_OPERATION_CYCLE)) && (!(eventStatusBuffer[i].eventStatusExtended & DEM_TEST_NOT_COMPLETED_THIS_OPERATION_CYCLE))) {\r
+ eventStatusBuffer[i].eventStatusExtended &= (Dem_EventStatusExtendedType)~DEM_PENDING_DTC; // Clear pendingDTC bit /** @req DEM379.PendingClear\r
+ storeEventEvtMem(eventStatusBuffer[i].eventParamRef, &eventStatusBuffer[i]);\r
+ }\r
+ }\r
+ }\r
+ break;\r
+ default:\r
+ DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_SETOPERATIONCYCLESTATE_ID, DEM_E_PARAM_DATA);\r
+ returnCode = E_NOT_OK;\r
+ break;\r
+ }\r
+ }\r
+ else {\r
+ DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_SETOPERATIONCYCLESTATE_ID, DEM_E_PARAM_DATA);\r
+ returnCode = E_NOT_OK;\r
+ }\r
+\r
+ return returnCode;\r
+}\r
+\r
+\r
+//==============================================================================//\r
+// //\r
+// E X T E R N A L F U N C T I O N S //\r
+// //\r
+//==============================================================================//\r
+\r
+/*********************************************\r
+ * Interface for upper layer modules (8.3.1) *\r
+ *********************************************/\r
+\r
+/*\r
+ * Procedure: Dem_GetVersionInfo\r
+ * Reentrant: Yes\r
+ */\r
+// Defined in Dem.h\r
+\r
+\r
+/***********************************************\r
+ * Interface ECU State Manager <-> DEM (8.3.2) *\r
+ ***********************************************/\r
+\r
+/*\r
+ * Procedure: Dem_PreInit\r
+ * Reentrant: No\r
+ */\r
+void Dem_PreInit(void)\r
+{\r
+ /** @req DEM180 */\r
+ uint16 i, j;\r
+\r
+ EventStatusRecType *eventStatusRecPtr;\r
+ const Dem_EventParameterType *eventIdParamList;\r
+\r
+ VALIDATE_NO_RV(DEM_Config.ConfigSet != NULL, DEM_PREINIT_ID, DEM_E_CONFIG_PTR_INVALID);\r
+\r
+ configSet = DEM_Config.ConfigSet;\r
+\r
+ // Initializion of operation cycle states.\r
+ for (i = 0; i < DEM_OPERATION_CYCLE_ID_ENDMARK; i++) {\r
+ operationCycleStateList[i] = DEM_CYCLE_STATE_END;\r
+ }\r
+\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].errorStatusChanged = FALSE;\r
+ }\r
+\r
+ // Insert all supported events into event status buffer\r
+ uint16 index = 0;\r
+ eventIdParamList = configSet->EventParameter;\r
+ while( !eventIdParamList[index].Arc_EOL ) {\r
+ // Find next free position in event status buffer\r
+ lookupEventStatusRec(DEM_EVENT_ID_NULL, &eventStatusRecPtr);\r
+ if(NULL != eventStatusRecPtr) {\r
+ eventStatusRecPtr->eventId = eventIdParamList[index].EventID;\r
+ eventStatusRecPtr->eventParamRef = &eventIdParamList[index];\r
+ } else {\r
+ // event status buffer is full\r
+ DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_PREINIT_ID, DEM_E_EVENT_STATUS_BUFF_FULL);\r
+ }\r
+ index++;\r
+ }\r
+\r
+ //lint -save\r
+ //lint -e568 -e685 //PC-Lint exception.\r
+ //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
+ // Initialize the pre init buffers\r
+ for (i = 0; i < DEM_MAX_NUMBER_FF_DATA_PRE_INIT; i++) {\r
+ preInitFreezeFrameBuffer[i].checksum = 0;\r
+ preInitFreezeFrameBuffer[i].eventId = DEM_EVENT_ID_NULL;\r
+ preInitFreezeFrameBuffer[i].occurrence = 0;\r
+ preInitFreezeFrameBuffer[i].dataSize = 0;\r
+ for (j = 0; j < DEM_MAX_SIZE_FF_DATA;j++){\r
+ preInitFreezeFrameBuffer[i].data[j] = 0;\r
+ }\r
+ }\r
+ //lint -restore\r
+\r
+ for (i = 0; i < DEM_MAX_NUMBER_EXT_DATA_PRE_INIT; i++) {\r
+ preInitExtDataBuffer[i].checksum = 0;\r
+ preInitExtDataBuffer[i].eventId = DEM_EVENT_ID_NULL;\r
+ preInitExtDataBuffer[i].dataSize = 0;\r
+ for (j = 0; j < DEM_MAX_SIZE_EXT_DATA;j++){\r
+ preInitExtDataBuffer[i].data[j] = 0;\r
+ }\r
+ }\r
+\r
+ disableDtcStorage.storageDisabled = FALSE;\r
+\r
+ (void)setOperationCycleState(DEM_ACTIVE, DEM_CYCLE_STATE_START); /** @req DEM047 */\r
+\r
+ demState = DEM_PREINITIALIZED;\r
+}\r
+\r
+\r
+/*\r
+ * Procedure: Dem_Init\r
+ * Reentrant: No\r
+ */\r
+void Dem_Init(void)\r
+{\r
+ uint16 i;\r
+// ChecksumType cSum;\r
+ boolean entryValid = FALSE;\r
+ const Dem_EventParameterType *eventParam;\r
+\r
+ if(DEM_PREINITIALIZED != demState){\r
+ /*\r
+ * Dem_PreInit was has not been called since last time Dem_Shutdown was called.\r
+ * This suggests that we are resuming from sleep. According to section 5.7 in\r
+ * EcuM specification, RAM content is assumed to be still valid from the previous cycle.\r
+ * Do not read from saved error log since buffers already contains this data.\r
+ */\r
+ (void)setOperationCycleState(DEM_ACTIVE, DEM_CYCLE_STATE_START);\r
+\r
+ } else {\r
+\r
+ for(i = 0; i < DEM_MAX_NUMBER_FF_DATA_PRI_MEM; i++){\r
+ if( E_NOT_OK == copyNvmMirror(FreezeFrameBlockId[i], (uint8 *)&priMemFreezeFrameBuffer[i], (const uint8 *)FreezeFrameMirrorBuffer[i], sizeof(FreezeFrameRecType)) ){\r
+ //TODO:NVM is busy or block id is 0,report error or what?\r
+ }\r
+ }\r
+ //recover Aging from NVRam to RAM\r
+ if(E_OK == copyNvmMirror(HealingBlockId, (uint8*)priMemAgingBuffer, (const uint8*)HealingMirrorBuffer, sizeof(priMemAgingBuffer)) ){\r
+\r
+ }\r
+\r
+ // Validate aging records stored in primary memory\r
+ for (i = 0; i < DEM_MAX_NUMBER_AGING_PRI_MEM; i++){\r
+ entryValid = checkEntryValid(priMemAgingBuffer[i].eventId);\r
+// cSum = calcChecksum(&priMemAgingBuffer[i], sizeof(HealingRecType) - sizeof(ChecksumType));\r
+ if ((priMemAgingBuffer[i].eventId == DEM_EVENT_ID_NULL) || (FALSE == entryValid)) {\r
+ // Unlegal record, clear the record\r
+ memset(&priMemAgingBuffer[i], 0, sizeof(HealingRecType));\r
+ AgingIsModified = TRUE;\r
+ }\r
+ }\r
+\r
+ // Validate event records stored in primary memory\r
+ for (i = 0; i < DEM_MAX_NUMBER_EVENT_PRI_MEM; i++) {\r
+ entryValid = checkEntryValid(priMemEventBuffer[i].eventId);\r
+// cSum = calcChecksum(&priMemEventBuffer[i], sizeof(EventRecType)-sizeof(ChecksumType));\r
+ if ((priMemEventBuffer[i].eventId == DEM_EVENT_ID_NULL) || (FALSE == entryValid)) {\r
+ // Unlegal record, clear the record\r
+ memset(&priMemEventBuffer[i], 0, sizeof(EventRecType));\r
+ }\r
+ else {\r
+ // Valid, update current status\r
+ mergeEventStatusRec(&priMemEventBuffer[i]);\r
+\r
+ // Update occurrence counter on pre init stored freeze frames\r
+ updateFreezeFrameOccurrencePreInit(&priMemEventBuffer[i]);\r
+ }\r
+ }\r
+\r
+\r
+\r
+ // Validate extended data records stored in primary memory\r
+ for (i = 0; i < DEM_MAX_NUMBER_EXT_DATA_PRI_MEM; i++) {\r
+ entryValid = checkEntryValid(priMemExtDataBuffer[i].eventId);\r
+// cSum = calcChecksum(&priMemExtDataBuffer[i], sizeof(ExtDataRecType)-sizeof(ChecksumType));\r
+ if ((priMemExtDataBuffer[i].eventId == DEM_EVENT_ID_NULL) || (FALSE == entryValid)) {\r
+ // Unlegal record, clear the record\r
+ memset(&priMemExtDataBuffer[i], 0, sizeof(ExtDataRecType));\r
+ }\r
+ }\r
+\r
+ //initialize the current timestamp and update the timestamp in pre init\r
+ initCurrentFreezeFrameTimeStamp(&FF_TimeStamp);\r
+\r
+ //lint -save\r
+ //lint -e568 //PC-Lint exception.\r
+ //lint -e685 //PC-Lint exception.\r
+ //lint -e681 //PC-Lint exception to MISRA 14.1: Loop is not entered. This only happens when DEM_MAX_NUMBER_FF_DATA_PRE_INIT is zero. Keep as it is for less complex code.\r
+ // Validate freeze frame records stored in primary memory\r
+ for (i = 0; i < DEM_MAX_NUMBER_FF_DATA_PRI_MEM; i++) {\r
+ entryValid = checkEntryValid(priMemFreezeFrameBuffer[i].eventId);\r
+// cSum = calcChecksum(&priMemFreezeFrameBuffer[i], sizeof(FreezeFrameRecType)-sizeof(ChecksumType));\r
+ if ((priMemFreezeFrameBuffer[i].eventId == DEM_EVENT_ID_NULL) || (FALSE == entryValid)) {\r
+ // Unlegal record, clear the record\r
+ memset(&priMemFreezeFrameBuffer[i], 0, sizeof(FreezeFrameRecType));\r
+ }\r
+ }\r
+ //lint -restore\r
+\r
+ /* Transfer updated event data to event memory */\r
+ for (i = 0; i < DEM_MAX_NUMBER_EVENT; i++) {\r
+ if (eventStatusBuffer[i].eventId != DEM_EVENT_ID_NULL) {\r
+ lookupEventIdParameter(eventStatusBuffer[i].eventId, &eventParam);\r
+ storeEventEvtMem(eventParam, &eventStatusBuffer[i]);\r
+ }\r
+ }\r
+\r
+ /* Transfer extended data to event memory if necessary */\r
+ for (i = 0; i < DEM_MAX_NUMBER_EXT_DATA_PRE_INIT; i++) {\r
+ if (preInitExtDataBuffer[i].eventId != DEM_EVENT_ID_NULL) {\r
+ lookupEventIdParameter(preInitExtDataBuffer[i].eventId, &eventParam);\r
+ storeExtendedDataEvtMem(eventParam, &preInitExtDataBuffer[i]);\r
+ }\r
+ }\r
+\r
+ //lint -save\r
+ //lint -e568 //PC-Lint exception.\r
+ //lint -e685 //PC-Lint exception.\r
+ //lint -e681 //PC-Lint exception to MISRA 14.1: Loop is not entered. This only happens when DEM_MAX_NUMBER_FF_DATA_PRE_INIT is zero. Keep as it is for less complex code.\r
+ /* Transfer freeze frames to event memory */\r
+ for (i = 0; i < DEM_MAX_NUMBER_FF_DATA_PRE_INIT; i++) {\r
+ if (preInitFreezeFrameBuffer[i].eventId != DEM_EVENT_ID_NULL) {\r
+ lookupEventIdParameter(preInitFreezeFrameBuffer[i].eventId, &eventParam);\r
+ storeFreezeFrameDataEvtMem(eventParam, &preInitFreezeFrameBuffer[i]);\r
+ }\r
+ }\r
+ //lint -restore\r
+ }\r
+\r
+ // Init the dtc filter\r
+ dtcFilter.dtcStatusMask = DEM_DTC_STATUS_MASK_ALL; // All allowed\r
+ dtcFilter.dtcKind = DEM_DTC_KIND_ALL_DTCS; // All kinds of DTCs\r
+ dtcFilter.dtcOrigin = DEM_DTC_ORIGIN_PRIMARY_MEMORY; // Primary memory\r
+ dtcFilter.filterWithSeverity = DEM_FILTER_WITH_SEVERITY_NO; // No Severity filtering\r
+ dtcFilter.dtcSeverityMask = DEM_SEVERITY_NO_SEVERITY; // Not used when filterWithSeverity is FALSE\r
+ dtcFilter.filterForFaultDetectionCounter = DEM_FILTER_FOR_FDC_NO; // No fault detection counter filtering\r
+\r
+ dtcFilter.faultIndex = DEM_MAX_NUMBER_EVENT;\r
+\r
+ disableDtcStorage.storageDisabled = FALSE;\r
+\r
+ demState = DEM_INITIALIZED;\r
+}\r
+\r
+\r
+/*\r
+ * Procedure: Dem_shutdown\r
+ * Reentrant: No\r
+ */\r
+void Dem_Shutdown(void)\r
+{\r
+ (void)setOperationCycleState(DEM_ACTIVE, DEM_CYCLE_STATE_END); /** @req DEM047 */\r
+\r
+ /* handleAging() should be called behind setOperationCycleState() */\r
+ (void)handleAging(DEM_ACTIVE, DEM_CYCLE_STATE_END);\r
+\r
+ demState = DEM_UNINITIALIZED; /** @req DEM368 */\r
+}\r
+\r
+\r
+/*\r
+ * Interface for basic software scheduler\r
+ */\r
+void Dem_MainFunction(void)/** @req DEM125 */\r
+{\r
+ if (FFIsModified) {\r
+ storeFreezeFrameDataPerMem(FreezeFrameBlockId);\r
+ }\r
+\r
+ if (AgingIsModified) {\r
+ storeAgingRecPerMem(HealingBlockId);\r
+ }\r
+}\r
+\r
+\r
+/***************************************************\r
+ * Interface SW-Components via RTE <-> DEM (8.3.3) *\r
+ ***************************************************/\r
+\r
+/*\r
+ * Procedure: Dem_SetEventStatus\r
+ * Reentrant: Yes\r
+ */\r
+Std_ReturnType Dem_SetEventStatus(Dem_EventIdType eventId, Dem_EventStatusType eventStatus) /** @req DEM330 */\r
+{\r
+ Std_ReturnType returnCode = E_OK;\r
+\r
+ if (demState == DEM_INITIALIZED) // No action is taken if the module is not started\r
+ {\r
+ returnCode = handleEvent(eventId, eventStatus);\r
+ }\r
+ else\r
+ {\r
+ DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_SETEVENTSTATUS_ID, DEM_E_UNINIT);\r
+ returnCode = E_NOT_OK;\r
+ }\r
+\r
+ return returnCode;\r
+}\r
+\r
+\r
+/*\r
+ * Procedure: Dem_ResetEventStatus\r
+ * Reentrant: Yes\r
+ */\r
+Std_ReturnType Dem_ResetEventStatus(Dem_EventIdType eventId) /** @req DEM331 */\r
+{\r
+ Std_ReturnType returnCode = E_OK;\r
+\r
+ if (demState == DEM_INITIALIZED) // No action is taken if the module is not started\r
+ {\r
+ resetEventStatus(eventId); /** @req DEM186 */\r
+ }\r
+ else\r
+ {\r
+ DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_RESETEVENTSTATUS_ID, DEM_E_UNINIT);\r
+ returnCode = E_NOT_OK;\r
+ }\r
+\r
+ return returnCode;\r
+}\r
+\r
+\r
+/*\r
+ * Procedure: Dem_GetEventStatus\r
+ * Reentrant: Yes\r
+ */\r
+Std_ReturnType Dem_GetEventStatus(Dem_EventIdType eventId, Dem_EventStatusExtendedType *eventStatusExtended) /** @req DEM332 */\r
+{\r
+ Std_ReturnType returnCode = E_OK;\r
+\r
+ if (demState == DEM_INITIALIZED) // No action is taken if the module is not started\r
+ {\r
+ getEventStatus(eventId, eventStatusExtended);\r
+ }\r
+ else\r
+ {\r
+ DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_GETEVENTSTATUS_ID, DEM_E_UNINIT);\r
+ returnCode = E_NOT_OK;\r
+ }\r
+\r
+ return returnCode;\r
+}\r
+\r
+\r
+/*\r
+ * Procedure: Dem_GetEventFailed\r
+ * Reentrant: Yes\r
+ */\r
+Std_ReturnType Dem_GetEventFailed(Dem_EventIdType eventId, boolean *eventFailed) /** @req DEM333 */\r
+{\r
+ Std_ReturnType returnCode = E_OK;\r
+\r
+ if (demState == DEM_INITIALIZED) // No action is taken if the module is not started\r
+ {\r
+ getEventFailed(eventId, eventFailed);\r
+ }\r
+ else\r
+ {\r
+ DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_GETEVENTFAILED_ID, DEM_E_UNINIT);\r
+ returnCode = E_NOT_OK;\r
+ }\r
+\r
+ return returnCode;\r
+}\r
+\r
+\r
+/*\r
+ * Procedure: Dem_GetEventTested\r
+ * Reentrant: Yes\r
+ */\r
+Std_ReturnType Dem_GetEventTested(Dem_EventIdType eventId, boolean *eventTested)\r
+{\r
+ Std_ReturnType returnCode = E_OK;\r
+\r
+ if (demState == DEM_INITIALIZED) // No action is taken if the module is not started\r
+ {\r
+ getEventTested(eventId, eventTested);\r
+ }\r
+ else\r
+ {\r
+ DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_GETEVENTTESTED_ID, DEM_E_UNINIT);\r
+ returnCode = E_NOT_OK;\r
+ }\r
+\r
+ return returnCode;\r
+}\r
+\r
+\r
+/*\r
+ * Procedure: Dem_GetFaultDetectionCounter\r
+ * Reentrant: No\r
+ */\r
+Std_ReturnType Dem_GetFaultDetectionCounter(Dem_EventIdType eventId, sint8 *counter)\r
+{\r
+ Std_ReturnType returnCode = E_OK;\r
+\r
+ if (demState == DEM_INITIALIZED) // No action is taken if the module is not started\r
+ {\r
+ returnCode = getFaultDetectionCounter(eventId, counter);\r
+ }\r
+ else\r
+ {\r
+ DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_GETFAULTDETECTIONCOUNTER_ID, DEM_E_UNINIT);\r
+ returnCode = E_NOT_OK;\r
+ }\r
+\r
+ return returnCode;\r
+}\r
+\r
+\r
+/*\r
+ * Procedure: Dem_SetOperationCycleState\r
+ * Reentrant: No\r
+ */\r
+Std_ReturnType Dem_SetOperationCycleState(Dem_OperationCycleIdType operationCycleId, Dem_OperationCycleStateType cycleState)\r
+{\r
+ Std_ReturnType returnCode = E_OK;\r
+\r
+ if (demState == DEM_INITIALIZED) // No action is taken if the module is not started\r
+ {\r
+ returnCode = setOperationCycleState(operationCycleId, cycleState);\r
+ (void)handleAging(operationCycleId, cycleState);\r
+\r
+ }\r
+ else\r
+ {\r
+ DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_SETOPERATIONCYCLESTATE_ID, DEM_E_UNINIT);\r
+ returnCode = E_NOT_OK;\r
+ }\r
+\r
+ return returnCode;\r
+}\r
+\r
+\r
+/*\r
+ * Procedure: Dem_GetDTCOfEvent\r
+ * Reentrant: Yes\r
+ */\r
+Std_ReturnType Dem_GetDTCOfEvent(Dem_EventIdType eventId, Dem_DTCKindType dtcKind, uint32* dtcOfEvent)\r
+{\r
+ Std_ReturnType returnCode = E_NO_DTC_AVAILABLE;\r
+ const Dem_EventParameterType *eventParam;\r
+\r
+ if (demState == DEM_INITIALIZED) // No action is taken if the module is not started\r
+ {\r
+ lookupEventIdParameter(eventId, &eventParam);\r
+\r
+ if (eventParam != NULL) {\r
+ if (checkDtcKind(dtcKind, eventParam)) {\r
+ if (eventParam->DTCClassRef != NULL) {\r
+ *dtcOfEvent = eventParam->DTCClassRef->DTC; /** @req DEM269 */\r
+ returnCode = E_OK;\r
+ }\r
+ }\r
+ }\r
+ else {\r
+ // Event Id not found\r
+ returnCode = E_NOT_OK;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_GETDTCOFEVENT_ID, DEM_UNINITIALIZED);\r
+ returnCode = E_NOT_OK;\r
+ }\r
+\r
+ return returnCode;\r
+}\r
+\r
+\r
+/********************************************\r
+ * Interface BSW-Components <-> DEM (8.3.4) *\r
+ ********************************************/\r
+\r
+/*\r
+ * Procedure: Dem_ReportErrorStatus\r
+ * Reentrant: Yes\r
+ */\r
+void Dem_ReportErrorStatus( Dem_EventIdType eventId, Dem_EventStatusType eventStatus ) /** @req DEM107 *//** @req DEM206 */\r
+{\r
+\r
+ switch (demState) {\r
+ case DEM_PREINITIALIZED:\r
+ // Update status and check if is to be stored\r
+ if ((eventStatus == DEM_EVENT_STATUS_PASSED) || (eventStatus == DEM_EVENT_STATUS_FAILED)) {\r
+ handlePreInitEvent(eventId, eventStatus); /** @req DEM168 */\r
+ }\r
+ break;\r
+\r
+ case DEM_INITIALIZED:\r
+ (void)handleEvent(eventId, eventStatus); /** @req DEM167 */\r
+ break;\r
+\r
+ case DEM_UNINITIALIZED:\r
+ default:\r
+ // Uninitialized can not do anything\r
+ DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_REPORTERRORSTATUS_ID, DEM_E_UNINIT);\r
+\r
+ break;\r
+\r
+ } // switch (demState)\r
+}\r
+\r
+/*********************************\r
+ * Interface DCM <-> DEM (8.3.5) *\r
+ *********************************/\r
+/*\r
+ * Procedure: Dem_GetDTCStatusAvailabilityMask\r
+ * Reentrant: No\r
+ */\r
+Std_ReturnType Dem_GetDTCStatusAvailabilityMask(uint8 *dtcStatusMask) /** @req DEM014 */\r
+{\r
+ *dtcStatusMask = DEM_DTC_STATUS_AVAILABILITY_MASK; // User configuration mask\r
+ *dtcStatusMask &= DEM_TEST_FAILED // Mask with supported bits /** @req DEM060 */\r
+ | DEM_TEST_FAILED_THIS_OPERATION_CYCLE\r
+ | DEM_PENDING_DTC\r
+ | DEM_CONFIRMED_DTC\r
+ | DEM_TEST_NOT_COMPLETED_SINCE_LAST_CLEAR\r
+ | DEM_TEST_FAILED_SINCE_LAST_CLEAR\r
+ | DEM_TEST_NOT_COMPLETED_THIS_OPERATION_CYCLE\r
+// | DEM_WARNING_INDICATOR_REQUESTED TODO: Add support for this bit\r
+ ;\r
+\r
+ return E_OK;\r
+}\r
+\r
+\r
+/*\r
+ * Procedure: Dem_SetDTCFilter\r
+ * Reentrant: No\r
+ */\r
+Dem_ReturnSetDTCFilterType Dem_SetDTCFilter(uint8 dtcStatusMask,\r
+ Dem_DTCKindType dtcKind,\r
+ Dem_DTCOriginType dtcOrigin,\r
+ Dem_FilterWithSeverityType filterWithSeverity,\r
+ Dem_DTCSeverityType dtcSeverityMask,\r
+ Dem_FilterForFDCType filterForFaultDetectionCounter)\r
+{\r
+ Dem_ReturnSetDTCFilterType returnCode = DEM_FILTER_ACCEPTED;\r
+\r
+ if (demState == DEM_INITIALIZED) {\r
+ // Check dtcKind parameter\r
+ 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
+\r
+ // Check dtcOrigin parameter\r
+ VALIDATE_RV((dtcOrigin == DEM_DTC_ORIGIN_SECONDARY_MEMORY) || (dtcOrigin == DEM_DTC_ORIGIN_PRIMARY_MEMORY)\r
+ || (dtcOrigin == DEM_DTC_ORIGIN_PERMANENT_MEMORY) || (dtcOrigin == DEM_DTC_ORIGIN_MIRROR_MEMORY), DEM_SETDTCFILTER_ID, DEM_E_PARAM_DATA, DEM_WRONG_FILTER);\r
+\r
+ // Check filterWithSeverity and dtcSeverityMask parameter\r
+ VALIDATE_RV(((filterWithSeverity == DEM_FILTER_WITH_SEVERITY_NO)\r
+ || ((filterWithSeverity == DEM_FILTER_WITH_SEVERITY_YES)\r
+ && (!(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
+\r
+ // Check filterForFaultDetectionCounter parameter\r
+ 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
+\r
+ // Yes all parameters correct, set the new filters. /** @req DEM057 */\r
+ dtcFilter.dtcStatusMask = dtcStatusMask;\r
+ dtcFilter.dtcKind = dtcKind;\r
+ dtcFilter.dtcOrigin = dtcOrigin;\r
+ dtcFilter.filterWithSeverity = filterWithSeverity;\r
+ dtcFilter.dtcSeverityMask = dtcSeverityMask;\r
+ dtcFilter.filterForFaultDetectionCounter = filterForFaultDetectionCounter;\r
+ dtcFilter.faultIndex = DEM_MAX_NUMBER_EVENT;\r
+ } else {\r
+ DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_SETDTCFILTER_ID, DEM_E_UNINIT);\r
+ returnCode = DEM_WRONG_FILTER;\r
+ }\r
+\r
+ return returnCode;\r
+}\r
+\r
+\r
+/*\r
+ * Procedure: Dem_GetStatusOfDTC\r
+ * Reentrant: No\r
+ */\r
+Dem_ReturnGetStatusOfDTCType Dem_GetStatusOfDTC(uint32 dtc, Dem_DTCKindType dtcKind, Dem_DTCOriginType dtcOrigin, Dem_EventStatusExtendedType* status) {\r
+ Dem_ReturnGetStatusOfDTCType returnCode = DEM_STATUS_FAILED;\r
+ EventStatusRecType *eventRec;\r
+\r
+ if (demState == DEM_INITIALIZED) {\r
+ if (lookupDtcEvent(dtc, &eventRec)) {\r
+ if (checkDtcKind(dtcKind, eventRec->eventParamRef)) {\r
+ if (checkDtcOrigin(dtcOrigin,eventRec->eventParamRef)) {\r
+ *status = eventRec->eventStatusExtended; /** @req DEM059 */\r
+ returnCode = DEM_STATUS_OK;\r
+ }\r
+ else {\r
+ returnCode = DEM_STATUS_WRONG_DTCORIGIN; /** @req DEM171 */\r
+ }\r
+ }\r
+ else {\r
+ returnCode = DEM_STATUS_WRONG_DTCKIND;\r
+ }\r
+ }\r
+ else {\r
+ returnCode = DEM_STATUS_WRONG_DTC; /** @req DEM172 */\r
+ }\r
+ } else {\r
+ DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_GETSTATUSOFDTC_ID, DEM_E_UNINIT);\r
+ returnCode = DEM_STATUS_FAILED;\r
+ }\r
+\r
+ return returnCode;\r
+}\r
+\r
+\r
+/*\r
+ * Procedure: Dem_GetNumberOfFilteredDtc\r
+ * Reentrant: No\r
+ */\r
+Dem_ReturnGetNumberOfFilteredDTCType Dem_GetNumberOfFilteredDtc(uint16 *numberOfFilteredDTC) {\r
+ uint16 i;\r
+ uint16 numberOfFaults = 0;\r
+ Dem_ReturnGetNumberOfFilteredDTCType returnCode = DEM_NUMBER_OK;\r
+\r
+ if (demState == DEM_INITIALIZED) {\r
+ //Dem_DisableEventStatusUpdate();\r
+\r
+ for (i = 0; i < DEM_MAX_NUMBER_EVENT; i++) {\r
+ if (eventStatusBuffer[i].eventId != DEM_EVENT_ID_NULL) {\r
+ if (matchEventWithDtcFilter(&eventStatusBuffer[i])) {\r
+ if (eventStatusBuffer[i].eventParamRef->DTCClassRef != NULL) {\r
+ numberOfFaults++;\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ //Dem_EnableEventStatusUpdate();\r
+\r
+ *numberOfFilteredDTC = numberOfFaults; /** @req DEM061 */\r
+ } else {\r
+ DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_GETNUMBEROFFILTEREDDTC_ID, DEM_E_UNINIT);\r
+ returnCode = DEM_NUMBER_FAILED;\r
+ }\r
+\r
+ return returnCode;\r
+}\r
+\r
+\r
+/*\r
+ * Procedure: Dem_GetNextFilteredDTC\r
+ * Reentrant: No\r
+ */\r
+Dem_ReturnGetNextFilteredDTCType Dem_GetNextFilteredDTC(uint32 *dtc, Dem_EventStatusExtendedType *dtcStatus)\r
+{\r
+ Dem_ReturnGetNextFilteredDTCType returnCode = DEM_FILTERED_OK;\r
+ boolean dtcFound = FALSE;\r
+\r
+ if (demState == DEM_INITIALIZED) {\r
+ // TODO: This job should be done in an more advanced way according to Dem217\r
+ while ((!dtcFound) && (dtcFilter.faultIndex != 0)) {\r
+ dtcFilter.faultIndex--;\r
+ if (eventStatusBuffer[dtcFilter.faultIndex].eventId != DEM_EVENT_ID_NULL) {\r
+ if (matchEventWithDtcFilter(&eventStatusBuffer[dtcFilter.faultIndex])) {\r
+ if (eventStatusBuffer[dtcFilter.faultIndex].eventParamRef->DTCClassRef != NULL) {\r
+ *dtc = eventStatusBuffer[dtcFilter.faultIndex].eventParamRef->DTCClassRef->DTC; /** @req DEM216 */\r
+ *dtcStatus = eventStatusBuffer[dtcFilter.faultIndex].eventStatusExtended;\r
+ dtcFound = TRUE;\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ if (!dtcFound) {\r
+ dtcFilter.faultIndex = DEM_MAX_NUMBER_EVENT;\r
+ returnCode = DEM_FILTERED_NO_MATCHING_DTC;\r
+ }\r
+ } else {\r
+ DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_GETNEXTFILTEREDDTC_ID, DEM_E_UNINIT);\r
+ returnCode = DEM_FILTERED_NO_MATCHING_DTC;\r
+ }\r
+\r
+ return returnCode;\r
+}\r
+\r
+\r
+/*\r
+ * Procedure: Dem_GetTranslationType\r
+ * Reentrant: No\r
+ */\r
+Dem_ReturnTypeOfDtcSupportedType Dem_GetTranslationType(void)\r
+{\r
+ return DEM_TYPE_OF_DTC_SUPPORTED; /** @req DEM231 */\r
+}\r
+\r
+\r
+/*\r
+ * Procedure: Dem_ClearDTC\r
+ * Reentrant: No\r
+ */\r
+Dem_ReturnClearDTCType Dem_ClearDTC(uint32 dtc, Dem_DTCKindType dtcKind, Dem_DTCOriginType dtcOrigin) /** @req DEM009 *//** @req DEM241 */\r
+{\r
+ Dem_ReturnClearDTCType returnCode = DEM_CLEAR_OK;\r
+ Dem_EventIdType eventId;\r
+ const Dem_EventParameterType *eventParam;\r
+ uint16 i, j;\r
+\r
+ if (demState == DEM_INITIALIZED) {\r
+ for (i = 0; i < DEM_MAX_NUMBER_EVENT; i++) {\r
+ eventId = eventStatusBuffer[i].eventId;\r
+ if (eventId != DEM_EVENT_ID_NULL) {\r
+ eventParam = eventStatusBuffer[i].eventParamRef;\r
+ if (eventParam != NULL) {\r
+ //lint --e(506) PC-Lint exception Misra 13.7, 14.1 Allow configuration variables in boolean expression\r
+ //lint --e(774) PC-Lint exception Related to MISRA 13.7\r
+ if ((DEM_CLEAR_ALL_EVENTS == STD_ON) || (eventParam->DTCClassRef != NULL)) {\r
+ if (checkDtcKind(dtcKind, eventParam)) {\r
+ if (checkDtcGroup(dtc, eventParam)) {\r
+ boolean dtcOriginFound = FALSE;\r
+ for (j = 0; (j < DEM_MAX_NR_OF_EVENT_DESTINATION) && (!dtcOriginFound) ; j++){\r
+ dtcOriginFound =(eventParam->EventClass->EventDestination[j] == dtcOrigin);\r
+ }\r
+ if (dtcOriginFound) {\r
+ switch (dtcOrigin)\r
+ {\r
+ case DEM_DTC_ORIGIN_PRIMARY_MEMORY:\r
+ /** @req DEM077 */\r
+ deleteEventPriMem(eventParam);\r
+ deleteFreezeFrameDataPriMem(eventParam);\r
+ deleteExtendedDataPriMem(eventParam);\r
+ resetEventStatusRec(eventParam);\r
+ storeFreezeFrameDataPerMem();\r
+ break;\r
+\r
+ case DEM_DTC_ORIGIN_PERMANENT_MEMORY:\r
+\r
+ break;\r
+\r
+ case DEM_DTC_ORIGIN_SECONDARY_MEMORY:\r
+ case DEM_DTC_ORIGIN_MIRROR_MEMORY:\r
+ // Not yet supported\r
+ returnCode = DEM_CLEAR_WRONG_DTCORIGIN;\r
+ DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_CLEARDTC_ID, DEM_E_NOT_IMPLEMENTED_YET);\r
+ break;\r
+ default:\r
+ returnCode = DEM_CLEAR_WRONG_DTCORIGIN;\r
+ break;\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+ else {\r
+ // Fatal error, no event parameters found for the stored event!\r
+ DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_CLEARDTC_ID, DEM_E_UNEXPECTED_EXECUTION);\r
+ }\r
+ }\r
+ }\r
+ } else {\r
+ DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_CLEARDTC_ID, DEM_E_UNINIT);\r
+ returnCode = DEM_CLEAR_FAILED;\r
+ }\r
+\r
+ return returnCode;\r
+}\r
+\r
+\r
+/*\r
+ * Procedure: Dem_DisableDTCStorage\r
+ * Reentrant: No\r
+ */\r
+Dem_ReturnControlDTCStorageType Dem_DisableDTCStorage(Dem_DTCGroupType dtcGroup, Dem_DTCKindType dtcKind) /** @req DEM035 */\r
+{\r
+ Dem_ReturnControlDTCStorageType returnCode = DEM_CONTROL_DTC_STORAGE_OK;\r
+\r
+ if (demState == DEM_INITIALIZED) {\r
+ // Check dtcGroup parameter\r
+ if (dtcGroup == DEM_DTC_GROUP_ALL_DTCS) {\r
+ // Check dtcKind parameter\r
+ if ((dtcKind == DEM_DTC_KIND_ALL_DTCS) || (dtcKind == DEM_DTC_KIND_EMISSION_REL_DTCS)) {\r
+ /** @req DEM079 */\r
+ disableDtcStorage.dtcGroup = dtcGroup;\r
+ disableDtcStorage.dtcKind = dtcKind;\r
+ disableDtcStorage.storageDisabled = TRUE;\r
+ } else {\r
+ returnCode = DEM_CONTROL_DTC_STORAGE_N_OK;\r
+ }\r
+ } else {\r
+ returnCode = DEM_CONTROL_DTC_WRONG_DTCGROUP;\r
+ }\r
+ } else {\r
+ DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_DISABLEDTCSTORAGE_ID, DEM_E_UNINIT);\r
+ returnCode = DEM_CONTROL_DTC_STORAGE_N_OK;\r
+ }\r
+\r
+ return returnCode;\r
+}\r
+\r
+\r
+/*\r
+ * Procedure: Dem_EnableDTCStorage\r
+ * Reentrant: No\r
+ */\r
+Dem_ReturnControlDTCStorageType Dem_EnableDTCStorage(Dem_DTCGroupType dtcGroup, Dem_DTCKindType dtcKind)\r
+{\r
+ Dem_ReturnControlDTCStorageType returnCode = DEM_CONTROL_DTC_STORAGE_OK;\r
+\r
+ if (demState == DEM_INITIALIZED) {\r
+ // TODO: Behavior is not defined if group or kind do not match active settings, therefore the filter is just switched off.\r
+ (void)dtcGroup; (void)dtcKind; // Just to make get rid of PC-Lint warnings\r
+ disableDtcStorage.storageDisabled = FALSE; /** @req DEM080 */\r
+ } else {\r
+ DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_ENABLEDTCSTORAGE_ID, DEM_E_UNINIT);\r
+ returnCode = DEM_CONTROL_DTC_STORAGE_N_OK;\r
+ }\r
+\r
+ return returnCode;\r
+}\r
+\r
+/*\r
+ * Procedure: Dem_GetExtendedDataRecordByDTC\r
+ * Reentrant: No\r
+ */\r
+Dem_ReturnGetExtendedDataRecordByDTCType Dem_GetExtendedDataRecordByDTC(uint32 dtc, Dem_DTCKindType dtcKind, Dem_DTCOriginType dtcOrigin, uint8 extendedDataNumber, uint8 *destBuffer, uint16 *bufSize)\r
+{\r
+ Dem_ReturnGetExtendedDataRecordByDTCType returnCode = DEM_RECORD_WRONG_DTC;\r
+ EventStatusRecType *eventRec;\r
+ Dem_ExtendedDataRecordClassType const *extendedDataRecordClass = NULL;\r
+ ExtDataRecType *extData;\r
+ uint16 posInExtData = 0;\r
+\r
+ if (demState == DEM_INITIALIZED) {\r
+ if (lookupDtcEvent(dtc, &eventRec)) {\r
+ if (checkDtcKind(dtcKind, eventRec->eventParamRef)) {\r
+ if (checkDtcOrigin(dtcOrigin, eventRec->eventParamRef)) {\r
+ if (lookupExtendedDataRecNumParam(extendedDataNumber, eventRec->eventParamRef, &extendedDataRecordClass, &posInExtData)) {\r
+ if (*bufSize >= extendedDataRecordClass->DataSize) {\r
+ switch (dtcOrigin)\r
+ {\r
+ case DEM_DTC_ORIGIN_PRIMARY_MEMORY:\r
+ if (lookupExtendedDataPriMem(eventRec->eventId, &extData)) {\r
+ // Yes all conditions met, copy the extended data record to destination buffer.\r
+ memcpy(destBuffer, &extData->data[posInExtData], extendedDataRecordClass->DataSize); /** @req DEM075 */\r
+ *bufSize = extendedDataRecordClass->DataSize;\r
+ returnCode = DEM_RECORD_OK;\r
+ }\r
+ else {\r
+ // The record number is legal but no record was found for the DTC\r
+ *bufSize = 0;\r
+ returnCode = DEM_RECORD_OK;\r
+ }\r
+ break;\r
+\r
+ case DEM_DTC_ORIGIN_SECONDARY_MEMORY:\r
+ case DEM_DTC_ORIGIN_PERMANENT_MEMORY:\r
+ case DEM_DTC_ORIGIN_MIRROR_MEMORY:\r
+ // Not yet supported\r
+ returnCode = DEM_RECORD_WRONG_DTCORIGIN;\r
+ DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_GETEXTENDEDDATARECORDBYDTC_ID, DEM_E_NOT_IMPLEMENTED_YET);\r
+ break;\r
+ default:\r
+ returnCode = DEM_RECORD_WRONG_DTCORIGIN;\r
+ break;\r
+ }\r
+ }\r
+ else {\r
+ returnCode = DEM_RECORD_BUFFERSIZE;\r
+ }\r
+ }\r
+ else {\r
+ returnCode = DEM_RECORD_NUMBER;\r
+ }\r
+ }\r
+ else {\r
+ returnCode = DEM_RECORD_WRONG_DTCORIGIN;\r
+ }\r
+ }\r
+ else {\r
+ returnCode = DEM_RECORD_DTCKIND;\r
+ }\r
+ }\r
+ } else {\r
+ DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_GETEXTENDEDDATARECORDBYDTC_ID, DEM_E_UNINIT);\r
+ returnCode = DEM_RECORD_WRONG_DTC;\r
+ }\r
+\r
+ return returnCode;\r
+}\r
+\r
+\r
+/*\r
+ * Procedure: Dem_GetSizeOfExtendedDataRecordByDTC\r
+ * Reentrant: No\r
+ */\r
+Dem_ReturnGetSizeOfExtendedDataRecordByDTCType Dem_GetSizeOfExtendedDataRecordByDTC(uint32 dtc, Dem_DTCKindType dtcKind, Dem_DTCOriginType dtcOrigin, uint8 extendedDataNumber, uint16 *sizeOfExtendedDataRecord)\r
+{\r
+ Dem_ReturnGetExtendedDataRecordByDTCType returnCode = DEM_GET_SIZEOFEDRBYDTC_W_DTC;\r
+ EventStatusRecType *eventRec;\r
+ Dem_ExtendedDataRecordClassType const *extendedDataRecordClass = NULL;\r
+ uint16 posInExtData;\r
+\r
+ if (demState == DEM_INITIALIZED) {\r
+ if (lookupDtcEvent(dtc, &eventRec)) {\r
+ if (checkDtcKind(dtcKind, eventRec->eventParamRef)) {\r
+ if (checkDtcOrigin(dtcOrigin, eventRec->eventParamRef)) {\r
+ if (lookupExtendedDataRecNumParam(extendedDataNumber, eventRec->eventParamRef, &extendedDataRecordClass, &posInExtData)) {\r
+ *sizeOfExtendedDataRecord = extendedDataRecordClass->DataSize; /** @req DEM076 */\r
+ returnCode = DEM_GET_SIZEOFEDRBYDTC_OK;\r
+ }\r
+ else {\r
+ returnCode = DEM_GET_SIZEOFEDRBYDTC_W_RNUM;\r
+ }\r
+ }\r
+ else {\r
+ returnCode = DEM_GET_SIZEOFEDRBYDTC_W_DTCOR;\r
+ }\r
+ }\r
+ else {\r
+ returnCode = DEM_GET_SIZEOFEDRBYDTC_W_DTCKI;\r
+ }\r
+ }\r
+ } else {\r
+ DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_GETSIZEOFEXTENDEDDATARECORDBYDTC_ID, DEM_E_UNINIT);\r
+ returnCode = DEM_GET_SIZEOFEDRBYDTC_W_DTC;\r
+ }\r
+\r
+ return returnCode;\r
+}\r
+\r
+/*\r
+ * Procedure: Dem_GetFreezeFrameDataByDTC\r
+ * Reentrant: No\r
+ */\r
+/** @req DEM236 */\r
+Dem_ReturnGetFreezeFrameDataByDTCType Dem_GetFreezeFrameDataByDTC(uint32 dtc,Dem_DTCKindType dtcKind,Dem_DTCOriginType dtcOrigin,uint8 recordNumber,uint8* destBuffer,uint8* bufSize)\r
+{\r
+ Dem_ReturnGetFreezeFrameDataByDTCType returnCode = DEM_GET_FFDATABYDTC_WRONG_DTC;\r
+ EventStatusRecType *eventRec;\r
+ Dem_FreezeFrameClassType const *FFDataRecordClass = NULL;\r
+ FreezeFrameRecType *freezeframe;\r
+ uint16 FFDataSize = 0;\r
+\r
+ if (demState == DEM_INITIALIZED) {\r
+ if (lookupDtcEvent(dtc, &eventRec)) {\r
+ if (checkDtcKind(dtcKind, eventRec->eventParamRef)) {\r
+ if (checkDtcOrigin(dtcOrigin, eventRec->eventParamRef)) {\r
+ if (lookupFreezeFrameDataRecNumParam(recordNumber, eventRec->eventParamRef, &FFDataRecordClass)) {\r
+ if(lookupFreezeFrameDataSize(recordNumber, &FFDataRecordClass, &FFDataSize)){\r
+ if (*bufSize >= FFDataSize) {\r
+ switch (dtcOrigin)\r
+ {\r
+ case DEM_DTC_ORIGIN_PRIMARY_MEMORY:\r
+ if (lookupFreezeFrameDataPriMem(eventRec->eventId,recordNumber, &freezeframe)) {\r
+ memcpy(destBuffer, freezeframe->data, FFDataSize); /** @req DEM071 */\r
+ *bufSize = FFDataSize;\r
+ returnCode = DEM_GET_FFDATABYDTC_OK;\r
+ }\r
+ else {\r
+ *bufSize = 0;\r
+ returnCode = DEM_GET_FFDATABYDTC_OK;\r
+ }\r
+ break;\r
+\r
+ case DEM_DTC_ORIGIN_SECONDARY_MEMORY:\r
+ case DEM_DTC_ORIGIN_PERMANENT_MEMORY:\r
+ case DEM_DTC_ORIGIN_MIRROR_MEMORY:\r
+ // Not yet supported\r
+ returnCode = DEM_GET_FFDATABYDTC_WRONG_DTCORIGIN;\r
+ DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_GETFREEZEFRAMEDATARECORDBYDTC_ID, DEM_E_NOT_IMPLEMENTED_YET);\r
+ break;\r
+ default:\r
+ returnCode = DEM_GET_FFDATABYDTC_WRONG_DTCORIGIN;\r
+ break;\r
+ }\r
+ }\r
+ else{\r
+ returnCode = DEM_GET_FFDATABYDTC_BUFFERSIZE;\r
+ }\r
+ }\r
+ else {\r
+ returnCode = DEM_GET_FFDATABYDTC_BUFFERSIZE;\r
+ }\r
+ }\r
+ else {\r
+ returnCode = DEM_GET_FFDATABYDTC_RECORDNUMBER;\r
+ }\r
+ }\r
+ else {\r
+ returnCode = DEM_GET_FFDATABYDTC_WRONG_DTCORIGIN;\r
+ }\r
+ }\r
+ else {\r
+ returnCode = DEM_GET_FFDATABYDTC_WRONG_DTCKIND;\r
+ }\r
+ }\r
+ else{\r
+ returnCode = DEM_GET_FFDATABYDTC_WRONG_DTC;\r
+\r
+ }\r
+ } else {\r
+ DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_GETFREEZEFRAMEDATARECORDBYDTC_ID, DEM_E_UNINIT);\r
+ returnCode = DEM_GET_ID_PENDING;\r
+ }\r
+\r
+ return returnCode;\r
+\r
+\r
+}\r
+\r
+/*\r
+ * Procedure: Dem_GetFreezeFrameDataIdentifierByDTC\r
+ * Reentrant: No\r
+ */\r
+Dem_GetFreezeFameDataIdentifierByDTCType Dem_GetFreezeFrameDataIdentifierByDTC(uint32 dtc,\r
+ Dem_DTCKindType dtcKind,\r
+ Dem_DTCOriginType dtcOrigin,\r
+ uint8 recordNumber,\r
+ uint8* arraySize,\r
+ const uint16** dataId )/** @req DEM237 */\r
+{\r
+ Dem_GetFreezeFameDataIdentifierByDTCType returnCode = DEM_GET_ID_WRONG_FF_TYPE;\r
+ Dem_FreezeFrameClassType const *FFDataRecordClass = NULL;\r
+ EventStatusRecType *eventRec;\r
+ uint8 didNum = 0;\r
+ uint16 i = 0;\r
+ if (demState == DEM_INITIALIZED) {\r
+ if (lookupDtcEvent(dtc, &eventRec)) {\r
+ if (checkDtcKind(dtcKind, eventRec->eventParamRef)) {\r
+ if (checkDtcOrigin(dtcOrigin, eventRec->eventParamRef)) {\r
+ if (lookupFreezeFrameDataRecNumParam(recordNumber, eventRec->eventParamRef, &FFDataRecordClass)) {\r
+ if(FFDataRecordClass->FFIdClassRef != NULL){\r
+ for(i=0; (i < DEM_MAX_NR_OF_RECORDS_IN_FREEZEFRAME_DATA) && (!(FFDataRecordClass->FFIdClassRef[i].Arc_EOL)); i++){\r
+ if(didNum < *arraySize){\r
+ dataId[didNum] = &FFDataRecordClass->FFIdClassRef[i].DidIdentifier;/** @req DEM073 */\r
+ didNum++;\r
+ returnCode = DEM_GET_ID_OK;\r
+ }else{\r
+ returnCode = DEM_GET_ID_WRONG_FF_TYPE;\r
+ }\r
+ }\r
+ *arraySize = didNum;\r
+ }\r
+\r
+ }\r
+ else{\r
+ returnCode = DEM_GET_ID_WRONG_FF_TYPE;\r
+ }\r
+ }\r
+ else{\r
+ returnCode = DEM_GET_ID_WRONG_DTCORIGIN;\r
+ }\r
+ }\r
+ else{\r
+ returnCode = DEM_GET_ID_WRONG_DTCKIND;\r
+ }\r
+ }\r
+ else{\r
+ returnCode = DEM_GET_ID_WRONG_DTC;\r
+ }\r
+\r
+ }\r
+ else{\r
+ DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_GETFREEZEFRAMEDATAIDENTIFIERBYDTC_ID, DEM_E_UNINIT);\r
+ }\r
+\r
+ return returnCode;\r
+\r
+}\r
+\r
+/*\r
+ * Procedure: Dem_GetSizeOfFreezeFrame\r
+ * Reentrant: No\r
+ */\r
+ /** @req DEM238 */\r
+Dem_ReturnGetSizeOfFreezeFrameType Dem_GetSizeOfFreezeFrame(uint32 dtc,Dem_DTCKindType dtcKind,Dem_DTCOriginType dtcOrigin,uint8 recordNumber,uint16* sizeOfFreezeFrame)\r
+{\r
+ Dem_ReturnGetSizeOfFreezeFrameType returnCode = DEM_GET_SIZEOFFF_PENDING;\r
+ Dem_FreezeFrameClassType const *FFDataRecordClass = NULL;\r
+ Std_ReturnType callbackReturnCode;\r
+ EventStatusRecType *eventRec;\r
+ uint16 dataSize = 0;\r
+ uint16 i = 0;\r
+\r
+ if (demState == DEM_INITIALIZED) {\r
+ if (lookupDtcEvent(dtc, &eventRec)) {\r
+ if (checkDtcKind(dtcKind, eventRec->eventParamRef)) {\r
+ if (checkDtcOrigin(dtcOrigin, eventRec->eventParamRef)) {\r
+ if (lookupFreezeFrameDataRecNumParam(recordNumber, eventRec->eventParamRef, &FFDataRecordClass)) {\r
+ if(FFDataRecordClass->FFIdClassRef != NULL){\r
+ for(i = 0; (i < DEM_MAX_NR_OF_RECORDS_IN_FREEZEFRAME_DATA) && (!(FFDataRecordClass->FFIdClassRef[i].Arc_EOL)); i++){\r
+ /* read out the did size */\r
+ if(FFDataRecordClass->FFIdClassRef[i].DidReadDataLengthFnc != NULL){\r
+ callbackReturnCode = FFDataRecordClass->FFIdClassRef[i].DidReadDataLengthFnc(&dataSize);\r
+ if(callbackReturnCode != E_OK){\r
+ return (returnCode = DEM_GET_SIZEOFFF_PENDING);\r
+ }\r
+ }\r
+ else{\r
+ dataSize = FFDataRecordClass->FFIdClassRef[i].PidOrDidSize;\r
+ }\r
+ *sizeOfFreezeFrame += dataSize+DEM_DID_IDENTIFIER_SIZE_OF_BYTES;/** @req DEM074 */\r
+ returnCode = DEM_GET_SIZEOFFF_OK;\r
+ }\r
+ }\r
+ }\r
+ else{\r
+ returnCode = DEM_GET_SIZEOFFF_WRONG_RNUM;\r
+ }\r
+ }\r
+ else{\r
+ returnCode = DEM_GET_SIZEOFFF_WRONG_DTCOR;\r
+ }\r
+ }\r
+ else{\r
+ returnCode = DEM_GET_SIZEOFFF_WRONG_DTCKIND;\r
+ }\r
+ }\r
+ else{\r
+ returnCode = DEM_GET_SIZEOFFF_WRONG_DTC;\r
+ }\r
+\r
+ }\r
+ else{\r
+ DET_REPORTERROR(MODULE_ID_DEM, 0, DEM_GETFREEZEFRAMEDATAIDENTIFIERBYDTC_ID, DEM_E_UNINIT);\r
+ returnCode = DEM_GET_SIZEOFFF_PENDING;\r
+ }\r
+\r
+ return returnCode;\r
+\r
+\r
+}\r
+\r
+#define DEM_UNIT_TEST\r
+#ifdef DEM_UNIT_TEST\r
+void getFFDataPreInit(FreezeFrameRecType **buf)\r
+{\r
+ *buf = &preInitFreezeFrameBuffer[0];\r
+ return;\r
+}\r
+void getPriMemFFBufPtr(FreezeFrameRecType **buf)\r
+{\r
+ *buf = &priMemFreezeFrameBuffer[0];\r
+ return;\r
+}\r
+\r
+uint32 getCurTimeStamp()\r
+{\r
+ return FF_TimeStamp;\r
+}\r
+\r
+void getPriMemEventRecBufPtr(EventStatusRecType **buf)\r
+{\r
+ *buf = &eventStatusBuffer[0];\r
+ return;\r
+}\r
+\r
+void getPriMemAgingBufPtr(HealingRecType **buf)\r
+{\r
+ *buf = &priMemAgingBuffer[0];\r
+ return;\r
+}\r
+#endif\r
+\r
+\r
+\r
+\r
+\r
+/***********************************\r
+ * OBD-specific Interfaces (8.3.6) *\r
+ ***********************************/\r
+\r
+\r
+\r