]> rtime.felk.cvut.cz Git - arc.git/blobdiff - system/EcuM/EcuM_Main.c
EcuM: Adding more sleep functionility
[arc.git] / system / EcuM / EcuM_Main.c
index 811c1dd43184b2229cf15f27fffe17a88dcabd09..a96cabeff1e763c82bf6b569ae961f3db9afc3b4 100644 (file)
@@ -209,6 +209,16 @@ static void in_state_sleep ( void ) {
        sleepModePtr = &internal_data.config->EcuMSleepModeConfig[internal_data.sleep_mode];\r
 \r
        Mcu_SetMode(sleepModePtr->EcuMSleepModeMcuMode);\r
+\r
+       /* @req 3.1.5/ECUM2863 */\r
+       if( EcuM_CheckRamHash() == 0) {\r
+#if defined(USE_DEM)\r
+               //\r
+               EcuM_ErrorHook(ECUM_E_RAM_CHECK_FAILED);\r
+#endif\r
+       }\r
+\r
+       set_current_state(ECUM_STATE_WAKEUP_ONE);\r
 }\r
 \r
 static inline void enter_go_off_one_mode(void){\r
@@ -337,6 +347,8 @@ static inline void in_state_goOffOne(void){
 \r
 //----- MAIN -----------------------------------------------------------------------------------------------------------------\r
 void EcuM_MainFunction(void){\r
+       EcuM_WakeupSourceType wMask;\r
+\r
        VALIDATE_NO_RV(internal_data.initiated, ECUM_MAINFUNCTION_ID, ECUM_E_NOT_INITIATED);\r
 \r
        switch(internal_data.current_state){\r
@@ -361,6 +373,73 @@ void EcuM_MainFunction(void){
                case ECUM_STATE_SLEEP:\r
                        in_state_sleep();\r
                        break;\r
+               case ECUM_STATE_WAKEUP_ONE:\r
+               {\r
+                       /* TODO: we must have a normal RUN mode.. can't find any\r
+                        * in the A3.1.5 spec. */\r
+                       Mcu_SetMode(MCU_MODE_NORMAL);\r
+\r
+#if defined(USE_WDGM)\r
+                       WdgM_SetMode(FIXME_MODE);\r
+#endif\r
+\r
+                       wMask = EcuM_GetPendingWakeupEvents();\r
+\r
+                       EcuM_DisableWakeupSources(wMask);\r
+\r
+                       EcuM_AL_DriverRestart();\r
+\r
+                       ReleaseResource(RES_SCHEDULER);\r
+\r
+                       set_current_state(ECUM_STATE_WAKEUP_VALIDATION);\r
+\r
+                       break;\r
+               }\r
+\r
+               case ECUM_STATE_WAKEUP_VALIDATION:\r
+               {\r
+                       wMask = EcuM_GetPendingWakeupEvents();\r
+\r
+                       EcuM_StartWakeupSources(wMask);\r
+\r
+                       EcuM_CheckValidation( wMask );\r
+\r
+                       // TODO:\r
+                       // ComM_EcuM_WakeupIndication( network handle )\r
+\r
+                       set_current_state(ECUM_STATE_WAKEUP_REACTION);\r
+                       break;\r
+               }\r
+\r
+               case ECUM_STATE_WAKEUP_REACTION:\r
+               {\r
+                       /*\r
+                        * At this stage we want to know how to react to the wakeup, e.g. go\r
+                        * back to RUN or SHUTDOWN, etc.\r
+                        */\r
+                       EcuM_WakeupReactionType wReaction;\r
+\r
+                       wMask = EcuM_GetValidatedWakeupEvents();\r
+\r
+                       /* TODO: We have skipped the TTII timer here */\r
+                       wReaction = ( 0 == wMask ) ? ECUM_WKACT_SHUTDOWN : ECUM_WKACT_RUN\r
+                       wReaction = EcuM_OnWakeupReaction(wReaction);\r
+\r
+                       if( wReaction == ECUM_WKACT_RUN) {\r
+\r
+                               set_current_state(ECUM_STATE_WAKEUP_TWO);\r
+                       } else {\r
+                               /* Shutdown, again */\r
+                               /* TODO:\r
+                               set_current_state(ECUM_STATE_WAKEUP_TWO);\r
+                       }\r
+                       break;\r
+               }\r
+\r
+               case ECUM_STATE_WAKEUP_TWO:\r
+                       Dem_Init();\r
+\r
+                       break;\r
 \r
                default:\r
                        //TODO: Report error.\r