]> rtime.felk.cvut.cz Git - arc.git/blobdiff - system/EcuM/EcuM.c
EcuM: More EcuM fixes.
[arc.git] / system / EcuM / EcuM.c
index 77a32b1e907b1acc39a1e61e56d61a206d623c11..d2c009accdac43edcd4295d0ae4e123d3d5a38b2 100644 (file)
  * -------------------------------- Arctic Core ------------------------------*/\r
 \r
 \r
+/** @reqSettings DEFAULT_SPECIFICATION_REVISION=3.1.5 */\r
 \r
+/* ----------------------------[information]----------------------------------*/\r
+/*\r
+ * Author: ?+mahi\r
+ *\r
+ * Part of Release:\r
+ *   3.1.5\r
+ *\r
+ * Description:\r
+ *   Implements the Can Driver module\r
+ *\r
+ * Support:\r
+ *   General                  Have Support\r
+ *   -------------------------------------------\r
+ *   ECUM_TTII_ENABLED                         N\r
+ *   ECUM_DEV_ERROR_DETECT                             Y\r
+ *   ECUM_VERSION_INFO_API                             Y\r
+ *   ECUM_INCLUDE_DEM                                  N (controlled by USE_x macro's instead)\r
+ *   ECUM_INCLUDE_NVRAM_MGR                            N (controlled by USE_x macro's instead)\r
+ *   ECUM_INLCUDE_DET                                  N (controlled by USE_x macro's instead)\r
+ *   ECUM_MAIN_FUNCTION_PERDIOD                        Y\r
+ *   ECUM_TTII_WKSOURCE                                        N\r
+ *\r
+ *   Configuration            Have Support\r
+ *   -------------------------------------------\r
+ *   ECUM_SLEEP_ACTIVITY_PERIOD                        ?\r
+ *   ECUM_CONFIGCONSISTENCY_HASH               N\r
+ *   ECUM_RUN_SELF_REQUEST_PERIOD              ?\r
+ *   ECUM_NVRAM_WRITEALL_TIMEOUT               Y\r
+ *   ECUM_DEFAULT_APP_MODE                             ?\r
+ *\r
+ *\r
+ *   DefaultShutdownTarget\r
+ *   -------------------------------------------\r
+ *   ECUM_DEFAULT_SHUTDOWN_TARGET              N\r
+ *\r
+ *\r
+ * Things to start with:\r
+ * - EcuM2181\r
+ * - EcuM2861 , Watchdog\r
+ * - ComM_EcuM_RunModeIndication()  not called, See Figure 8 (Seems that the ComM does not do much either)\r
+ *\r
+ *\r
+ *\r
+ */\r
 \r
+//lint -emacro(904,VALIDATE,VALIDATE_RV,VALIDATE_NO_RV) //904 PC-Lint exception to MISRA 14.7 (validate macros).\r
 \r
 \r
+/* ----------------------------[includes]------------------------------------*/\r
 \r
-\r
+#include "Std_Types.h"\r
 #include "EcuM.h"\r
 #include "Modules.h"\r
-#include "string.h"\r
-#include "Os.h"\r
+#include <string.h>\r
+#include <Os.h>\r
+#include "EcuM_Generated_Types.h"\r
 #include "EcuM_Internals.h"\r
 #include "EcuM_Cbk.h"\r
+#include "SchM_EcuM.h"\r
+#include "MemMap.h"\r
 #include "Mcu.h"\r
+#include "ComStack_Types.h"\r
+#if defined(USE_DET)\r
 #include "Det.h"\r
-#include "irq.h"\r
+#endif\r
+#include "isr.h"\r
+#if defined(USE_NVM)\r
+#include "NvM.h"\r
+#endif\r
+#if defined(USE_RTE)\r
+#include "Rte_Main.h"\r
+#endif\r
+#if defined(USE_SCHM)\r
+#include "SchM.h"\r
+#endif\r
+\r
+\r
+/* ----------------------------[private define]------------------------------*/\r
+/* ----------------------------[private macro]-------------------------------*/\r
+/* ----------------------------[private typedef]-----------------------------*/\r
+/* ----------------------------[private function prototypes]-----------------*/\r
+/* ----------------------------[private variables]---------------------------*/\r
+\r
+EcuM_GlobalType internal_data;\r
 \r
-EcuM_GobalType internal_data;\r
+/* ----------------------------[private functions]---------------------------*/\r
+\r
+\r
+/* ----------------------------[public functions]----------------------------*/\r
+\r
+#if !defined(USE_DET) && defined(ECUM_DEV_ERROR_DETECT)\r
+#error EcuM configuration error. DET is not enabled when ECUM_DEV_ERROR_DETECT is set\r
+#endif\r
 \r
 void EcuM_Init( void )\r
 {\r
-       internal_data.current_state = ECUM_STATE_STARTUP_ONE;\r
+       Std_ReturnType status;\r
+       set_current_state(ECUM_STATE_STARTUP_ONE);\r
 \r
        // Initialize drivers that are needed to determine PostBuild configuration\r
        EcuM_AL_DriverInitZero();\r
@@ -42,15 +121,14 @@ void EcuM_Init( void )
        // Initialize the OS\r
        InitOS();\r
 \r
-       // Enable interrupts\r
-       Irq_Init();\r
-\r
+       // Setup interrupts\r
+       Os_IsrInit();\r
 \r
        // Determine PostBuild configuration\r
        internal_data.config = EcuM_DeterminePbConfiguration();\r
 \r
-       // Check consistency of PB configuration\r
-       // TODO\r
+\r
+       // TODO: Check consistency of PB configuration\r
 \r
        // Initialize drivers needed before the OS-starts\r
        EcuM_AL_DriverInitOne(internal_data.config);\r
@@ -58,36 +136,66 @@ void EcuM_Init( void )
        // Determine the reset/wakeup reason\r
        // TODO Mcu_ResetType type = Mcu_GetResetReason();\r
 \r
+       // Moved this here because EcuM_SelectShutdownTarget needs us to be initilized.\r
+       internal_data.initiated = TRUE;\r
+\r
        // Set default shutdown target\r
-       internal_data.shutdown_target = internal_data.config->EcuMDefaultShutdownTarget;\r
-       internal_data.shutdown_mode = internal_data.config->EcuMDefaultShutdownMode;\r
+       status = EcuM_SelectShutdownTarget(internal_data.config->EcuMDefaultShutdownTarget,internal_data.config->EcuMDefaultSleepMode);/** @req EcuM2181 */\r
+       if(status!=E_OK){\r
+               //TODO: Report error.\r
+       }\r
+\r
 \r
        // Set default application mode\r
-       internal_data.app_mode = internal_data.config->EcuMDefaultAppMode;\r
+       status =  EcuM_SelectApplicationMode(internal_data.config->EcuMDefaultAppMode);\r
+       if(status!=E_OK){\r
+               //TODO: Report error.\r
+       }\r
 \r
-       internal_data.initiated = TRUE;\r
+#if defined(USE_COMM) || defined(USE_ECUM_COMM)\r
+       internal_data.run_comm_requests = 0;\r
+#endif\r
+       internal_data.run_requests = 0;\r
+       internal_data.postrun_requests = 0;\r
 \r
        // Start this baby up\r
-       StartOS(internal_data.app_mode);\r
+       AppModeType appMode;\r
+       status = EcuM_GetApplicationMode(&appMode);\r
+       if(status!=E_OK){\r
+               //TODO: Report error.\r
+       }\r
+       StartOS(appMode); /** @req EcuM2141 */\r
 }\r
 \r
-void EcuM_StartupTwo()\r
+/*\r
+ * The order defined here is found in 3.1.5/EcuM2411\r
+ */\r
+void EcuM_StartupTwo(void)\r
 {\r
-#if    (ECUM_INCLUDE_NVRAM_MGR == STD_ON)\r
-       uint32 timer;\r
+       //TODO:  Validate that we are in state STARTUP_ONE.\r
+#if defined(USE_NVM)\r
+       extern CounterType Os_Arc_OsTickCounter;\r
+       TickType tickTimerStart, tickTimerElapsed;\r
+       static NvM_RequestResultType readAllResult;\r
+       TickType tickTimer;\r
+       StatusType tickTimerStatus;\r
 #endif\r
 \r
-       internal_data.current_state = ECUM_STATE_STARTUP_TWO;\r
-\r
        // Initialize the BSW scheduler\r
-       // TODO SchM_Init();\r
+#if defined(USE_SCHM)\r
+       SchM_Init();\r
+#endif\r
+\r
+#if defined(USE_WDGM)\r
+       WdgM_SetMode(internal_data.config->EcuMWdgMConfig->EcuMWdgMStartupMode);\r
+#endif\r
 \r
        // Initialize drivers that don't need NVRAM data\r
        EcuM_AL_DriverInitTwo(internal_data.config);\r
 \r
-#if    (ECUM_INCLUDE_NVRAM_MGR == STD_ON)\r
+#if defined(USE_NVM)\r
        // Start timer to wait for NVM job to complete\r
-       timer = Os_SysTickGetTimeElapsed();\r
+       tickTimerStart = GetOsTick();\r
 #endif\r
 \r
        // Prepare the system to startup RTE\r
@@ -96,25 +204,53 @@ void EcuM_StartupTwo()
        Rte_Start();\r
 #endif\r
 \r
-#if    (ECUM_INCLUDE_NVRAM_MGR == STD_ON)\r
-       // Wait for the NVM job to terminate\r
-       while(Os_SysTickGetTimeElapsed()-timer < internal_data.config.EcuMNvramReadAllTimeout)\r
-       {\r
-               //TODO\r
-       }\r
+       set_current_state(ECUM_STATE_STARTUP_TWO);\r
+\r
+#if defined(USE_NVM)\r
+\r
+#if 0\r
+       /* Wait for the NVM job (NvmReadAll) to terminate. This assumes that:\r
+        * - A task runs the memory MainFunctions, e.g. Ea_MainFunction(), Eep_MainFunction()\r
+        *    Prio: HIGH\r
+        * - A task runs the service functions for EcuM, Nvm.\r
+        *    Prio: MIDDLE\r
+        * - This task:\r
+        *    Prio: LOW  (So that the service functions for the other may run)\r
+        */\r
+       do {\r
+               /* Read the multiblock status */\r
+               NvM_GetErrorStatus(0, &readAllResult);\r
+               tickTimerElapsed = OS_TICKS2MS_OsTick(GetOsTick() - tickTimerStart);\r
+               /* The timeout EcuMNvramReadAllTimeout is in ms */\r
+       } while( (readAllResult == NVM_REQ_PENDING) && (tickTimerElapsed < internal_data.config->EcuMNvramReadAllTimeout) );\r
+#else\r
+       // Wait for the NVM job (NvmReadAll) to terminate\r
+               do {\r
+                       NvM_GetErrorStatus(0, &readAllResult);  // Read the multiblock status\r
+                       tickTimer = tickTimerStart;     // Save this because the GetElapsedCounterValue() will destroy it.\r
+                       tickTimerStatus =  GetElapsedCounterValue(Os_Arc_OsTickCounter, &tickTimer, &tickTimerElapsed);\r
+                       if (tickTimerStatus != E_OK) {\r
+                               DET_REPORTERROR(MODULE_ID_ECUM, 0, ECUM_ARC_STARTUPTWO_ID, ECUM_E_ARC_TIMERERROR);\r
+                       }\r
+               } while( (readAllResult == NVM_REQ_PENDING) && (tickTimerElapsed < internal_data.config->EcuMNvramReadAllTimeout) );\r
+#endif\r
 #endif\r
 \r
        // Initialize drivers that need NVRAM data\r
        EcuM_AL_DriverInitThree(internal_data.config);\r
 \r
-       // Indicate mode change to RTE\r
-       // TODO\r
+       // TODO: Indicate mode change to RTE\r
+\r
+       // If coming from startup sequence, enter Run mode\r
+//     if (internal_data.current_state == ECUM_STATE_STARTUP_TWO)\r
+               EcuM_enter_run_mode();\r
+\r
 }\r
 \r
 // Typically called from OS shutdown hook\r
-void EcuM_Shutdown()\r
+void EcuM_Shutdown(void)\r
 {\r
-       internal_data.current_state = ECUM_STATE_GO_OFF_TWO;\r
+       set_current_state(ECUM_STATE_GO_OFF_TWO);\r
 \r
        // Let the last drivers do a nice shutdown\r
        EcuM_OnGoOffTwo();\r
@@ -128,20 +264,18 @@ void EcuM_Shutdown()
 #if (MCU_PERFORM_RESET_API == STD_ON)\r
                Mcu_PerformReset();\r
 #else\r
-               for(;;);\r
+               for(;;)\r
+                {\r
+                  ;\r
+                }\r
 #endif\r
        }\r
 }\r
 \r
 Std_ReturnType EcuM_GetState(EcuM_StateType* state)\r
 {\r
-#if (ECUM_DEV_ERROR_DETECT == STD_ON)\r
-       if (state == NULL)\r
-       {\r
-               Det_ReportError(MODULE_ID_ECUM, 1, ECUM_GETSTATE_ID, ECUM_E_NULL_POINTER);\r
-               return E_NOT_OK;\r
-       }\r
-#endif\r
+       VALIDATE_RV(internal_data.initiated, ECUM_GETSTATE_ID, ECUM_E_NOT_INITIATED, E_NOT_OK);\r
+       VALIDATE_RV(state != NULL, ECUM_GETSTATE_ID, ECUM_E_NULL_POINTER, E_NOT_OK);\r
 \r
        *state = internal_data.current_state;\r
 \r
@@ -150,34 +284,17 @@ Std_ReturnType EcuM_GetState(EcuM_StateType* state)
 \r
 Std_ReturnType EcuM_SelectApplicationMode(AppModeType appMode)\r
 {\r
-#if (ECUM_DEV_ERROR_DETECT == STD_ON)\r
-       if (!internal_data.initiated)\r
-       {\r
-               Det_ReportError(MODULE_ID_ECUM, 1, ECUM_SELECTAPPMODE_ID, ECUM_E_NOT_INITIATED);\r
-               return E_NOT_OK;\r
-       }\r
-#endif\r
+       VALIDATE_RV(internal_data.initiated, ECUM_SELECTAPPMODE_ID, ECUM_E_NOT_INITIATED, E_NOT_OK);\r
 \r
-       // TODO Save this application mode for next startup\r
+       internal_data.app_mode = appMode;\r
 \r
-       return E_NOT_OK;\r
+       return E_OK;\r
 }\r
 \r
 Std_ReturnType EcuM_GetApplicationMode(AppModeType* appMode)\r
 {\r
-#if (ECUM_DEV_ERROR_DETECT == STD_ON)\r
-       if (!internal_data.initiated)\r
-       {\r
-               Det_ReportError(MODULE_ID_ECUM, 1, ECUM_GETAPPMODE_ID, ECUM_E_NOT_INITIATED);\r
-               return E_NOT_OK;\r
-       }\r
-\r
-       if (appMode == NULL)\r
-       {\r
-               Det_ReportError(MODULE_ID_ECUM, 1, ECUM_GETAPPMODE_ID, ECUM_E_NULL_POINTER);\r
-               return E_NOT_OK;\r
-       }\r
-#endif\r
+       VALIDATE_RV(internal_data.initiated, ECUM_GETAPPMODE_ID, ECUM_E_NOT_INITIATED, E_NOT_OK);\r
+       VALIDATE_RV(appMode != NULL, ECUM_GETAPPMODE_ID, ECUM_E_NULL_POINTER, E_NOT_OK);\r
 \r
        *appMode = internal_data.app_mode;\r
 \r
@@ -186,36 +303,228 @@ Std_ReturnType EcuM_GetApplicationMode(AppModeType* appMode)
 \r
 Std_ReturnType EcuM_SelectBootTarget(EcuM_BootTargetType target)\r
 {\r
-#if (ECUM_DEV_ERROR_DETECT == STD_ON)\r
-       if (!internal_data.initiated)\r
-       {\r
-               Det_ReportError(MODULE_ID_ECUM, 1, ECUM_SELECT_BOOTARGET_ID, ECUM_E_NOT_INITIATED);\r
-               return E_NOT_OK;\r
-       }\r
-#endif\r
+       VALIDATE_RV(internal_data.initiated, ECUM_SELECT_BOOTARGET_ID, ECUM_E_NOT_INITIATED, E_NOT_OK);\r
 \r
        // TODO Do something great here\r
+       (void) target;\r
 \r
        return E_NOT_OK;\r
 }\r
 \r
 Std_ReturnType EcuM_GetBootTarget(EcuM_BootTargetType* target)\r
 {\r
-#if (ECUM_DEV_ERROR_DETECT == STD_ON)\r
-       if (!internal_data.initiated)\r
-       {\r
-               Det_ReportError(MODULE_ID_ECUM, 1, ECUM_GET_BOOTARGET_ID, ECUM_E_NOT_INITIATED);\r
-               return E_NOT_OK;\r
-       }\r
+       VALIDATE_RV(internal_data.initiated, ECUM_GET_BOOTARGET_ID, ECUM_E_NOT_INITIATED, E_NOT_OK);\r
+       VALIDATE_RV(target != NULL, ECUM_GET_BOOTARGET_ID, ECUM_E_NULL_POINTER, E_NOT_OK);\r
+\r
+       // TODO Return selected boot target here\r
+       (void) target;\r
+\r
+       return E_NOT_OK;\r
+}\r
+\r
+\r
+Std_ReturnType EcuM_SelectShutdownTarget(EcuM_StateType shutdownTarget, uint8 sleepMode)\r
+{\r
+       VALIDATE_RV(internal_data.initiated, ECUM_SELECTSHUTDOWNTARGET_ID, ECUM_E_NOT_INITIATED, E_NOT_OK);\r
+       VALIDATE_RV((shutdownTarget == ECUM_STATE_OFF) || (shutdownTarget == ECUM_STATE_RESET) || (shutdownTarget == ECUM_STATE_SLEEP), ECUM_SELECTSHUTDOWNTARGET_ID, ECUM_E_INVALID_PAR, E_NOT_OK);\r
+\r
+       internal_data.shutdown_target = shutdownTarget;\r
+       internal_data.sleep_mode = sleepMode;\r
+\r
+       return E_OK;\r
+}\r
+\r
+\r
+Std_ReturnType EcuM_GetShutdownTarget(EcuM_StateType* shutdownTarget, uint8* sleepMode) /** @req EcuM2824 */\r
+{\r
+       VALIDATE_RV(internal_data.initiated, ECUM_GETSHUTDOWNTARGET_ID, ECUM_E_NOT_INITIATED, E_NOT_OK);\r
+       VALIDATE_RV(shutdownTarget != NULL, ECUM_GETSHUTDOWNTARGET_ID, ECUM_E_NULL_POINTER, E_NOT_OK);\r
+       VALIDATE_RV(sleepMode != NULL, ECUM_GETSHUTDOWNTARGET_ID, ECUM_E_NULL_POINTER, E_NOT_OK);\r
+\r
+       *shutdownTarget = internal_data.shutdown_target;\r
+       *sleepMode = internal_data.sleep_mode;\r
 \r
-       if (target == NULL)\r
+       return E_OK;\r
+}\r
+\r
+\r
+Std_ReturnType EcuM_RequestRUN(EcuM_UserType user)\r
+{\r
+       VALIDATE_RV(internal_data.initiated, ECUM_REQUESTRUN_ID, ECUM_E_NOT_INITIATED, E_NOT_OK);\r
+       VALIDATE_RV(user < ECUM_USER_ENDMARK, ECUM_REQUESTRUN_ID, ECUM_E_INVALID_PAR, E_NOT_OK);\r
+\r
+       internal_data.run_requests |= (uint32)1 << user;\r
+\r
+       return E_OK;\r
+}\r
+\r
+Std_ReturnType EcuM_ReleaseRUN(EcuM_UserType user)\r
+{\r
+       VALIDATE_RV(internal_data.initiated, ECUM_RELEASERUN_ID, ECUM_E_NOT_INITIATED, E_NOT_OK);\r
+       VALIDATE_RV(user < ECUM_USER_ENDMARK, ECUM_RELEASERUN_ID, ECUM_E_INVALID_PAR, E_NOT_OK);\r
+\r
+       internal_data.run_requests &= ~((uint32)1 << user);\r
+\r
+       return E_OK;\r
+}\r
+\r
+/**\r
+ *\r
+ */\r
+void EcuM_KillAllRUNRequests( void ) {\r
+       /* NOT IMPLEMENTED */\r
+}\r
+\r
+\r
+/**\r
+ *\r
+ * @param sources\r
+ */\r
+void EcuM_SetWakeupEvent(EcuM_WakeupSourceType sources) {\r
+       /* @req 3.1.5/EcuM2826 The function exists */\r
+       /* @req 3.1.5/EcuM2171 */\r
+\r
+       /* @req 3.1.5/EcuM2867 */\r
+#if  ( ECUM_DEV_ERROR_DETECT == STD_ON )\r
        {\r
-               Det_ReportError(MODULE_ID_ECUM, 1, ECUM_GET_BOOTARGET_ID, ECUM_E_NULL_POINTER);\r
-               return E_NOT_OK;\r
+               EcuM_WakeupSourceType wkSource;\r
+               const EcuM_SleepModeType *sleepModePtr;\r
+\r
+               sleepModePtr = &internal_data.config->EcuMSleepModeConfig[internal_data.sleep_mode];\r
+               wkSource =  sleepModePtr->EcuMWakeupSourceMask;\r
+\r
+               if( !((sources | wkSource) ==  wkSource)) {\r
+                       Det_ReportError(MODULE_ID_ECUM, 0, ECUM_VALIDATE_WAKEUP_EVENT_ID, ECUM_E_UNKNOWN_WAKEUP_SOURCE );\r
+                       return;\r
+               }\r
        }\r
 #endif\r
 \r
-       // TODO Return selected boot target here\r
 \r
-       return E_NOT_OK;\r
+       /* @req 3.1.5/EcuM1117 */\r
+       internal_data.wakeupEvents |= sources;\r
+\r
+       /* @req 3.1.5/EcuM2707 @req 3.1.5/EcuM2709*/\r
+//     internal_data.wakeupTimer = ECUM_VALIDATION_TIMEOUT;\r
+\r
+}\r
+\r
+#if defined(USE_COMM) || defined(USE_ECUM_COMM)\r
+Std_ReturnType EcuM_ComM_RequestRUN(NetworkHandleType channel)\r
+{\r
+       VALIDATE_RV(internal_data.initiated, ECUM_COMM_REQUESTRUN_ID, ECUM_E_NOT_INITIATED, E_NOT_OK);\r
+       VALIDATE_RV(channel < 32, ECUM_COMM_REQUESTRUN_ID, ECUM_E_INVALID_PAR, E_NOT_OK);\r
+\r
+       internal_data.run_comm_requests |= (uint32)1 << channel;\r
+\r
+       return E_OK;\r
+}\r
+\r
+Std_ReturnType EcuM_ComM_ReleaseRUN(NetworkHandleType channel)\r
+{\r
+       VALIDATE_RV(internal_data.initiated, ECUM_COMM_RELEASERUN_ID, ECUM_E_NOT_INITIATED, E_NOT_OK);\r
+       VALIDATE_RV(channel < 32, ECUM_COMM_RELEASERUN_ID, ECUM_E_INVALID_PAR, E_NOT_OK);\r
+\r
+       internal_data.run_comm_requests &= ~((uint32)1 << channel);\r
+\r
+       return E_OK;\r
 }\r
+\r
+boolean EcuM_ComM_HasRequestedRUN(NetworkHandleType channel)\r
+{\r
+       VALIDATE_RV(internal_data.initiated, ECUM_COMM_HASREQUESTEDRUN_ID, ECUM_E_NOT_INITIATED, FALSE);\r
+       VALIDATE_RV(channel < 32, ECUM_COMM_HASREQUESTEDRUN_ID, ECUM_E_INVALID_PAR, FALSE);\r
+\r
+       return (internal_data.run_comm_requests &((uint32)1 << channel)) != 0;\r
+}\r
+#endif\r
+\r
+Std_ReturnType EcuM_RequestPOST_RUN(EcuM_UserType user)\r
+{\r
+       VALIDATE_RV(internal_data.initiated, ECUM_REQUESTPOSTRUN_ID, ECUM_E_NOT_INITIATED, E_NOT_OK);\r
+       VALIDATE_RV(user < ECUM_USER_ENDMARK, ECUM_REQUESTPOSTRUN_ID, ECUM_E_INVALID_PAR, E_NOT_OK);\r
+\r
+       internal_data.postrun_requests |= (uint32)1 << user;\r
+\r
+       return E_OK;\r
+}\r
+\r
+Std_ReturnType EcuM_ReleasePOST_RUN(EcuM_UserType user)\r
+{\r
+       VALIDATE_RV(internal_data.initiated, ECUM_RELEASEPOSTRUN_ID, ECUM_E_NOT_INITIATED, E_NOT_OK);\r
+       VALIDATE_RV(user < ECUM_USER_ENDMARK, ECUM_RELEASEPOSTRUN_ID, ECUM_E_INVALID_PAR, E_NOT_OK);\r
+\r
+       internal_data.postrun_requests &= ~((uint32)1 << user);\r
+\r
+       return E_OK;\r
+}\r
+\r
+/*\r
+ * TODO: Don't yet understand the use\r
+ */\r
+void EcuM_ClearWakeupEvent( EcuM_WakeupSourceType source )\r
+{\r
+       switch(source) {\r
+       case ECUM_WKSTATUS_NONE:\r
+               /* Seems quite pointless */\r
+               break;\r
+       case ECUM_WKSTATUS_PENDING:\r
+               break;\r
+       case ECUM_WKSTATUS_VALIDATED:\r
+               break;\r
+       case ECUM_WKSTATUS_EXPIRED:\r
+               break;\r
+       default:\r
+               break;\r
+       }\r
+}\r
+\r
+/**\r
+ * Get the pending wakeup events.\r
+ *\r
+ * @return\r
+ */\r
+EcuM_WakeupSourceType EcuM_GetPendingWakeupEvents( void ) {\r
+       /* @req 3.1.5/EcuM2827 API\r
+        * @req 3.1.5/EcuM2172 Callable from interrupt context\r
+        * */\r
+\r
+       /* @req 3.1.5/EcuM1156 */\r
+       return internal_data.wakeupEvents;\r
+\r
+}\r
+\r
+\r
+EcuM_WakeupSourceType EcuM_GetValidatedWakeupEvents( void ) {\r
+       // TODO:\r
+       return 0;\r
+}\r
+\r
+EcuM_WakeupStatusType EcuM_GetStatusOfWakeupSource( EcuM_WakeupSourceType sources ) {\r
+       return 0;\r
+}\r
+\r
+/**\r
+ *\r
+ * @param sources\r
+ */\r
+void EcuM_ValidateWakeupEvent(EcuM_WakeupSourceType sources) {\r
+\r
+       /* !req 3.1.5/EcuM2344 */\r
+       /* !req 3.1.5/EcuM2645 */\r
+       /* !req 3.1.5/EcuM2868 */\r
+       /* !req 3.1.5/EcuM2345 */\r
+\r
+/*\r
+#if defined(USE_COMM)\r
+       if( internal_data.config->)\r
+       ComM_EcuM_WakeUpIndication()\r
+#endif\r
+*/\r
+       /* !req 3.1.5/EcuM2790 */\r
+       /* !req 3.1.5/EcuM2791 */\r
+\r
+}\r
+\r
+\r
+\r