Bug fix: Always changed flag becomes true when restriction mode is changed
[apps/agl-service-windowmanager.git] / src / policy_manager / zipc / dummy_stm.c
index f174866..0b2120a 100644 (file)
@@ -1,32 +1,41 @@
 #include <string.h>
 #include "dummy_stm.h"
+#include "hmi-debug.h"
 
 const char* gStmEventName[] = {
     "activate",
     "deactivate",
+    "trans_gear_neutral",
+    "trans_gear_not_neutral",
     "parking_brake_off",
     "parking_brake_on",
     "accel_pedal_off",
     "accel_pedal_on",
-    "car_stop",
-    "car_run",
     "timer_expired",
     "lamp_off",
-    "lamp_on"
+    "lamp_on",
+    "lightstatus_brake_off",
+    "lightstatus_brake_on",
+    "restriction_mode_off",
+    "restriction_mode_on",
 };
 
 const int gStmEventNo[] = {
     STM_EVT_NO_ACTIVATE,
     STM_EVT_NO_DEACTIVATE,
+    STM_EVT_NO_TRANS_GEAR_N,
+    STM_EVT_NO_TRANS_GEAR_NOT_N,
     STM_EVT_NO_PARKING_BRAKE_OFF,
     STM_EVT_NO_PARKING_BRAKE_ON,
     STM_EVT_NO_ACCEL_PEDAL_OFF,
     STM_EVT_NO_ACCEL_PEDAL_ON,
-    STM_EVT_NO_CAR_STOP,
-    STM_EVT_NO_CAR_RUN,
     STM_EVT_NO_TIMER_EXPIRED,
     STM_EVT_NO_LAMP_OFF,
-    STM_EVT_NO_LAMP_ON
+    STM_EVT_NO_LAMP_ON,
+    STM_EVT_NO_LIGHTSTATUS_BRAKE_OFF,
+    STM_EVT_NO_LIGHTSTATUS_BRAKE_ON,
+    STM_EVT_NO_RESTRICTION_MODE_OFF,
+    STM_EVT_NO_RESTRICTION_MODE_ON,
 };
 
 const char* gStmCategoryName[] = {
@@ -34,9 +43,10 @@ const char* gStmCategoryName[] = {
     "map",
     "general",
     "splitable",
-    "popup",
+    "pop_up",
     "system_alert",
     "restriction",
+    "system",
 };
 
 const int gStmCategoryNo[] = {
@@ -47,52 +57,70 @@ const int gStmCategoryNo[] = {
     STM_CTG_NO_POPUP,
     STM_CTG_NO_SYSTEM_ALERT,
     STM_CTG_NO_RESTRICTION,
+    STM_CTG_NO_SYSTEM,
 };
 
 const char* gStmAreaName[] = {
-    "full",
+    "none",
+    "fullscreen",
     "normal",
     "split.main",
     "split.sub",
-    "onscreen",
+    "pop_up",
     "restriction.normal",
     "restriction.split.main",
     "restriction.split.sub",
 };
 
 const int gStmAreaNo[] = {
+    STM_ARA_NO_NONE,
     STM_ARA_NO_FULL,
     STM_ARA_NO_NORMAL,
     STM_ARA_NO_SPLIT_MAIN,
     STM_ARA_NO_SPLIT_SUB,
-    STM_ARA_NO_ON_SCREEN,
+    STM_ARA_NO_POP_UP,
     STM_ARA_NO_RESTRICTION_NORMAL,
     STM_ARA_NO_RESTRICTION_SPLIT_MAIN,
     STM_ARA_NO_RESTRICTION_SPLIT_SUB,
 };
 
 // String for state
-const char* gStmParkingBrakeStateNo2Name[] = {
-    "parking_brake_off",
-    "parking_brake_on"
+const char* gStmTransGearStateName[] = {
+    "neutral",
+    "not_neutral"
 };
 
-const char* gStmAccelPedalStateNo2Name[] = {
-    "accel_pedal_off",
-    "accel_pedal_on"
+const char* gStmParkingBrakeStateName[] = {
+    "off",
+    "on"
 };
 
-const char* gStmCarStateNo2Name[] = {
-    "car_stop",
-    "car_run"
+const char* gStmAccelPedalStateName[] = {
+    "off",
+    "on"
 };
 
-const char* gStmLampStateNo2Name[] = {
-    "lamp_off",
-    "lamp_on"
+const char* gStmRunningStateNo2Name[] = {
+    "stop",
+    "run"
 };
 
-const char* gStmLayoutNo2Name[] = {
+const char* gStmLampStateName[] = {
+    "off",
+    "on"
+};
+
+const char* gStmLightstatusBrakeStateName[] = {
+    "off",
+    "on"
+};
+
+const char* gStmRestrictionModeStateName[] = {
+    "off",
+    "on"
+};
+
+const char* gStmLayoutName[] = {
     "none",
     "pu",
     "sa",
@@ -106,24 +134,58 @@ const char* gStmLayoutNo2Name[] = {
     "restriction",
     "restriction.split.main",
     "restriction.split.sub",
+    "system",
+};
+
+const char* gStmLayerName[] = {
+    "homescreen",
+    "apps",
+    "restriction",
+    "on_screen",
+};
+
+const char* gStmCarElementName[] = {
+    "trans_gear",
+    "parking_brake",
+    "accel_pedal",
+    "running",
+    "lamp",
+    "lightstatus_brake",
+    "restriction_mode",
+};
+
+const char** gStmCarStateNameList[] = {
+    gStmTransGearStateName,
+    gStmParkingBrakeStateName,
+    gStmAccelPedalStateName,
+    gStmRunningStateNo2Name,
+    gStmLampStateName,
+    gStmLightstatusBrakeStateName,
+    gStmRestrictionModeStateName,
 };
 
 stm_state_t g_crr_state;
 stm_state_t g_prv_state;
+int g_prv_on_screen_state_car_stop = 0;
+int g_prv_restriction_state_car_stop = 0;
 int g_prv_apps_state_car_stop = 0;
+int g_map_is_activated = STM_FALSE;
 
 void stmInitialize() {
     // Initialize previous state
     memset(&g_prv_state, 0, sizeof(g_prv_state));
 
-    g_prv_state.layer.on_screen.state   = gStmLayoutNoNone;
-    g_prv_state.layer.restriction.state = gStmLayoutNoNone;
-    g_prv_state.layer.apps.state        = gStmLayoutNoNone;
-    g_prv_state.layer.homescreen.state  = gStmLayoutNoNone;
-    g_prv_state.parking_brake.state = gStmParkingBrakeStateNoOn;
-    g_prv_state.accel_pedal.state   = gStmAccelPedalStateNoOff;
-    g_prv_state.car.state           = gStmCarStateNoStop;
-    g_prv_state.lamp.state          = gStmLampStateNoOff;
+    g_prv_state.layer[gStmLayerNoOnScreen].state    = gStmLayoutNoNone;
+    g_prv_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoNone;
+    g_prv_state.layer[gStmLayerNoApps].state        = gStmLayoutNoNone;
+    g_prv_state.layer[gStmLayerNoHomescreen].state  = gStmLayoutNoNone;
+    g_prv_state.car_element[gStmCarElementNoTransGear].state        = gStmTransGearStateNoN;
+    g_prv_state.car_element[gStmCarElementNoLightstatusBrake].state = gStmLightstatusBrakeStateNoOn;
+    g_prv_state.car_element[gStmCarElementNoAccelPedal].state       = gStmAccelPedalStateNoOff;
+    g_prv_state.car_element[gStmCarElementNoRunning].state          = gStmRunningNoStop;
+    g_prv_state.car_element[gStmCarElementNoLamp].state             = gStmLampStateNoOff;
+    g_prv_state.car_element[gStmCarElementNoParkingBrake].state     = gStmParkingBrakeStateNoOn;
+    g_prv_state.car_element[gStmCarElementNoRestrictionMode].state  = gStmRestrictionModeStateNoOff;
 
     // Initialize current state
     g_crr_state = g_prv_state;
@@ -131,8 +193,8 @@ void stmInitialize() {
 
 int stmTransitionState(int event, stm_state_t* state) {
     int event_no, category_no, area_no;
-    int restriction_state, apps_state;
-    int parking_brake_state, accel_pedal_state, car_state, lamp_state;
+    int on_screen_state, restriction_state, apps_state;
+    int trans_gear_state, parking_brake_state, lightstatus_brake_state, accel_pedal_state, car_state, lamp_state, restriction_mode_state;
 
     event_no    = event & STM_MSK_EVT_NO;
     category_no = event & STM_MSK_CTG_NO;
@@ -142,151 +204,330 @@ int stmTransitionState(int event, stm_state_t* state) {
     g_prv_state = g_crr_state;
 
     // Get previous state
-    restriction_state = g_prv_state.layer.restriction.state;
-    apps_state = g_prv_state.layer.apps.state;
-    parking_brake_state  = g_prv_state.parking_brake.state;
-    accel_pedal_state = g_prv_state.accel_pedal.state;
-    car_state  = g_prv_state.car.state;
-    lamp_state = g_prv_state.lamp.state;
+    on_screen_state   = g_prv_state.layer[gStmLayerNoOnScreen].state;
+    restriction_state = g_prv_state.layer[gStmLayerNoRestriction].state;
+    apps_state        = g_prv_state.layer[gStmLayerNoApps].state;
+    trans_gear_state        = g_prv_state.car_element[gStmCarElementNoTransGear].state;
+    parking_brake_state     = g_prv_state.car_element[gStmCarElementNoParkingBrake].state;
+    accel_pedal_state       = g_prv_state.car_element[gStmCarElementNoAccelPedal].state;
+    car_state               = g_prv_state.car_element[gStmCarElementNoRunning].state;
+    lamp_state              = g_prv_state.car_element[gStmCarElementNoLamp].state;
+    lightstatus_brake_state = g_prv_state.car_element[gStmCarElementNoLightstatusBrake].state;
+    restriction_mode_state  = g_prv_state.car_element[gStmCarElementNoRestrictionMode].state;
 
     // Clear flags
-    g_crr_state.layer.on_screen.is_changed = STM_FALSE;
-    g_crr_state.layer.restriction.is_changed = STM_FALSE;
-    g_crr_state.layer.apps.is_changed = STM_FALSE;
-    g_crr_state.layer.homescreen.is_changed = STM_FALSE;
-    g_crr_state.parking_brake.is_changed = STM_FALSE;
-    g_crr_state.accel_pedal.is_changed = STM_FALSE;
-    g_crr_state.car.is_changed = STM_FALSE;
-    g_crr_state.lamp.is_changed = STM_FALSE;
+    g_crr_state.layer[gStmLayerNoOnScreen].changed    = STM_FALSE;
+    g_crr_state.layer[gStmLayerNoRestriction].changed = STM_FALSE;
+    g_crr_state.layer[gStmLayerNoApps].changed        = STM_FALSE;
+    g_crr_state.layer[gStmLayerNoHomescreen].changed  = STM_FALSE;
+    g_crr_state.car_element[gStmCarElementNoTransGear].changed        = STM_FALSE;
+    g_crr_state.car_element[gStmCarElementNoParkingBrake].changed     = STM_FALSE;
+    g_crr_state.car_element[gStmCarElementNoLightstatusBrake].changed = STM_FALSE;
+    g_crr_state.car_element[gStmCarElementNoAccelPedal].changed       = STM_FALSE;
+    g_crr_state.car_element[gStmCarElementNoRunning].changed          = STM_FALSE;
+    g_crr_state.car_element[gStmCarElementNoLamp].changed             = STM_FALSE;
+    g_crr_state.car_element[gStmCarElementNoRestrictionMode].changed  = STM_FALSE;
+
+
+    // Set car state
+    switch (event_no) {
+    case STM_EVT_NO_TRANS_GEAR_N:
+        if (gStmTransGearStateNoN != trans_gear_state) {
+            g_crr_state.car_element[gStmCarElementNoTransGear].state = gStmTransGearStateNoN;
+            g_crr_state.car_element[gStmCarElementNoTransGear].changed = STM_TRUE;
+        }
+        break;
+    case STM_EVT_NO_TRANS_GEAR_NOT_N:
+        if (gStmTransGearStateNoNotN != trans_gear_state) {
+            g_crr_state.car_element[gStmCarElementNoTransGear].state = gStmTransGearStateNoNotN;
+            g_crr_state.car_element[gStmCarElementNoTransGear].changed = STM_TRUE;
+        }
+        break;
+    case STM_EVT_NO_PARKING_BRAKE_OFF:
+        if (gStmParkingBrakeStateNoOff != parking_brake_state) {
+            g_crr_state.car_element[gStmCarElementNoParkingBrake].state = gStmParkingBrakeStateNoOff;
+            g_crr_state.car_element[gStmCarElementNoParkingBrake].changed = STM_TRUE;
+        }
+        break;
+    case STM_EVT_NO_PARKING_BRAKE_ON:
+        if (gStmParkingBrakeStateNoOn != parking_brake_state) {
+            g_crr_state.car_element[gStmCarElementNoParkingBrake].state = gStmParkingBrakeStateNoOn;
+            g_crr_state.car_element[gStmCarElementNoParkingBrake].changed = STM_TRUE;
+        }
+        break;
+    case STM_EVT_NO_ACCEL_PEDAL_OFF:
+        if (gStmAccelPedalStateNoOff != accel_pedal_state) {
+            g_crr_state.car_element[gStmCarElementNoAccelPedal].state = gStmAccelPedalStateNoOff;
+            g_crr_state.car_element[gStmCarElementNoAccelPedal].changed = STM_TRUE;
+        }
+        break;
+    case STM_EVT_NO_ACCEL_PEDAL_ON:
+        if (gStmAccelPedalStateNoOn != accel_pedal_state) {
+            g_crr_state.car_element[gStmCarElementNoAccelPedal].state = gStmAccelPedalStateNoOn;
+            g_crr_state.car_element[gStmCarElementNoAccelPedal].changed = STM_TRUE;
+        }
+        break;
+    case STM_EVT_NO_LAMP_OFF:
+        if (gStmLampStateNoOff != lamp_state) {
+            g_crr_state.car_element[gStmCarElementNoLamp].state = gStmLampStateNoOff;
+            g_crr_state.car_element[gStmCarElementNoLamp].changed = STM_TRUE;
+        }
+        break;
+    case STM_EVT_NO_LAMP_ON:
+        if (gStmLampStateNoOn != lamp_state) {
+            g_crr_state.car_element[gStmCarElementNoLamp].state = gStmLampStateNoOn;
+            g_crr_state.car_element[gStmCarElementNoLamp].changed = STM_TRUE;
+        }
+        break;
+    case STM_EVT_NO_LIGHTSTATUS_BRAKE_OFF:
+        if (gStmLightstatusBrakeStateNoOff != lightstatus_brake_state) {
+            g_crr_state.car_element[gStmCarElementNoLightstatusBrake].state = gStmLightstatusBrakeStateNoOff;
+            g_crr_state.car_element[gStmCarElementNoLightstatusBrake].changed = STM_TRUE;
+        }
+        break;
+    case STM_EVT_NO_LIGHTSTATUS_BRAKE_ON:
+        if (gStmLightstatusBrakeStateNoOn != lightstatus_brake_state) {
+            g_crr_state.car_element[gStmCarElementNoLightstatusBrake].state = gStmLightstatusBrakeStateNoOn;
+            g_crr_state.car_element[gStmCarElementNoLightstatusBrake].changed = STM_TRUE;
+        }
+        break;
+    default:
+        // nop
+        break;
+    }
 
+#if 1 // FOR ALS
+    if (g_crr_state.car_element[gStmCarElementNoLightstatusBrake].changed
+        || g_crr_state.car_element[gStmCarElementNoAccelPedal].changed) {
+        if ((gStmLightstatusBrakeStateNoOff == g_crr_state.car_element[gStmCarElementNoLightstatusBrake].state)
+            && (gStmAccelPedalStateNoOn == g_crr_state.car_element[gStmCarElementNoAccelPedal].state)){
+#else
+    if (g_crr_state.car_element[gStmCarElementNoParkingBrake].changed
+        || g_crr_state.car_element[gStmCarElementNoTransGear].changed) {
+        if ((gStmParkingBrakeStateNoOff == g_crr_state.car_element[gStmCarElementNoParkingBrake].state)
+            && (gStmTransGearStateNoNotN == g_crr_state.car_element[gStmCarElementNoTransGear].state)){
+#endif
+            if (gStmRunningNoRun != car_state) {
+                // Car state is changed stop -> run
+                g_crr_state.car_element[gStmCarElementNoRunning].state = gStmRunningNoRun;
+                g_crr_state.car_element[gStmCarElementNoRunning].changed = STM_TRUE;
+            }
+        }
+        else {
+            if (gStmRunningNoStop != car_state) {
+                // Car state is changed run -> stop
+                g_crr_state.car_element[gStmCarElementNoRunning].state = gStmRunningNoStop;
+                g_crr_state.car_element[gStmCarElementNoRunning].changed = STM_TRUE;
+            }
+        }
+    }
+
+    // Set restriction mode
+    if ((STM_EVT_NO_RESTRICTION_MODE_ON == event_no)
+      && (gStmRestrictionModeStateNoOn != restriction_mode_state)) {
+        HMI_DEBUG("wm:pm:stm", "Restriction mode OFF -> ON");
+
+        // Restriction mode is changed OFF -> ON
+        g_crr_state.car_element[gStmCarElementNoRestrictionMode].state = gStmRestrictionModeStateNoOn;
+        g_crr_state.car_element[gStmCarElementNoRestrictionMode].changed = STM_TRUE;
+
+        // Update on screen layer
+        g_prv_on_screen_state_car_stop = on_screen_state;
+        g_crr_state.layer[gStmLayerNoOnScreen].state = gStmLayoutNoNone;
+        g_crr_state.layer[gStmLayerNoOnScreen].changed = STM_TRUE;
+
+        // Update restriction layer
+        g_prv_restriction_state_car_stop = restriction_state;
+        g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoNone;
+        g_crr_state.layer[gStmLayerNoRestriction].changed = STM_TRUE;
+
+        // Update apps layer
+        g_prv_apps_state_car_stop = apps_state;
+        if ((STM_TRUE == g_map_is_activated)
+           && (gStmLayoutNoSystem != apps_state)) {
+            g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoM1;
+            g_crr_state.layer[gStmLayerNoApps].changed = STM_TRUE;
+        }
+    }
+    else if ((STM_EVT_NO_RESTRICTION_MODE_OFF == event_no)
+      && (gStmRestrictionModeStateNoOff != restriction_mode_state)) {
+        HMI_DEBUG("wm:pm:stm", "Restriction mode ON -> OFF");
+
+        // Restriction mode is changed ON -> OFF
+        g_crr_state.car_element[gStmCarElementNoRestrictionMode].state = gStmRestrictionModeStateNoOff;
+        g_crr_state.car_element[gStmCarElementNoRestrictionMode].changed = STM_TRUE;
+
+        // Update on screen layer
+        g_crr_state.layer[gStmLayerNoOnScreen].state = g_prv_on_screen_state_car_stop;
+        g_crr_state.layer[gStmLayerNoOnScreen].changed = STM_TRUE;
+
+        // Update restriction layer
+        g_crr_state.layer[gStmLayerNoRestriction].state = g_prv_restriction_state_car_stop;
+        g_crr_state.layer[gStmLayerNoRestriction].changed = STM_TRUE;
+
+        // Update apps layer
+        if (STM_TRUE == g_map_is_activated) {
+            g_crr_state.layer[gStmLayerNoApps].state = g_prv_apps_state_car_stop;
+            g_crr_state.layer[gStmLayerNoApps].changed = STM_TRUE;
+        }
+    }
+
+    // Set apps/homescreen layer
     switch (event_no) {
     case STM_EVT_NO_ACTIVATE:
-        switch (category_no) {
-        case STM_CTG_NO_HOMESCREEN:
-            // Apps layer
-            g_crr_state.layer.apps.state = gStmLayoutNoNone;
-            g_crr_state.layer.apps.is_changed = STM_TRUE;
-
-            // Homescreen layer
-            g_crr_state.layer.homescreen.state = gStmLayoutNoHs;
-            g_crr_state.layer.homescreen.is_changed = STM_TRUE;
-            break;
-        case STM_CTG_NO_MAP:
-            switch (area_no) {
-            case STM_ARA_NO_FULL:
+        if (gStmRestrictionModeStateNoOff == restriction_mode_state) {
+            switch (category_no) {
+            case STM_CTG_NO_HOMESCREEN:
+                // Homescreen layer
+                g_crr_state.layer[gStmLayerNoHomescreen].state = gStmLayoutNoHs;
+                g_crr_state.layer[gStmLayerNoHomescreen].changed = STM_TRUE;
+
                 // Apps layer
-                switch (apps_state) {
-                case gStmLayoutNoMf:
-                    // nop
-                    break;
-                default:
-                    g_crr_state.layer.apps.state = gStmLayoutNoMf;
-                    g_crr_state.layer.apps.is_changed = STM_TRUE;
-                    break;
+                if (gStmLayoutNoNone != apps_state) {
+                    g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoNone;
+                    g_crr_state.layer[gStmLayerNoApps].changed = STM_TRUE;
                 }
                 break;
-            case STM_ARA_NO_NORMAL:
-                // Apps layer
-                switch (apps_state) {
-                case gStmLayoutNoM1:
-                    // nop
-                    break;
-                case gStmLayoutNoS1:
-                    g_crr_state.layer.apps.state = gStmLayoutNoM2;
-                    g_crr_state.layer.apps.is_changed = STM_TRUE;
+            case STM_CTG_NO_MAP:
+                switch (area_no) {
+                case STM_ARA_NO_FULL:
+                    // Apps layer
+                    switch (apps_state) {
+                    case gStmLayoutNoMf:
+                        // nop
+                        break;
+                    default:
+                        g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoMf;
+                        g_crr_state.layer[gStmLayerNoApps].changed = STM_TRUE;
+                        break;
+                    }
                     break;
-                default:
-                    g_crr_state.layer.apps.state = gStmLayoutNoM1;
-                    g_crr_state.layer.apps.is_changed = STM_TRUE;
-                }
-                break;
-            case STM_ARA_NO_SPLIT_MAIN:
-                // Apps layer
-                switch (apps_state) {
-                case gStmLayoutNoS1:
-                case gStmLayoutNoS2:
-                    g_crr_state.layer.apps.state = gStmLayoutNoS2;
-                    g_crr_state.layer.apps.is_changed = STM_TRUE;
+                case STM_ARA_NO_NORMAL:
+                    // Apps layer
+                    switch (apps_state) {
+                    case gStmLayoutNoM1:
+                        // nop
+                        break;
+                    case gStmLayoutNoS1:
+                        g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoM2;
+                        g_crr_state.layer[gStmLayerNoApps].changed = STM_TRUE;
+                        break;
+                    default:
+                        g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoM1;
+                        g_crr_state.layer[gStmLayerNoApps].changed = STM_TRUE;
+                    }
                     break;
-                default:
-                    // nop
+                case STM_ARA_NO_SPLIT_MAIN:
+                    // Apps layer
+                    switch (apps_state) {
+                    case gStmLayoutNoS1:
+                    case gStmLayoutNoS2:
+                        g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoS2;
+                        g_crr_state.layer[gStmLayerNoApps].changed = STM_TRUE;
+                        break;
+                    default:
+                        // nop
+                        break;
+                    }
                     break;
                 }
                 break;
-            }
-            break;
-        case STM_CTG_NO_GENERAL:
-            switch (area_no) {
-            case STM_ARA_NO_NORMAL:
-                // Apps layer
-                switch (apps_state) {
-                case gStmLayoutNoMf:
-                    // nop
+            case STM_CTG_NO_GENERAL:
+                switch (area_no) {
+                case STM_ARA_NO_NORMAL:
+                    // Apps layer
+                    switch (apps_state) {
+                    case gStmLayoutNoMf:
+                        // nop
+                        break;
+                    default:
+                        g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoG;
+                        g_crr_state.layer[gStmLayerNoApps].changed = STM_TRUE;
+                        break;
+                    }
                     break;
                 default:
-                    g_crr_state.layer.apps.state = gStmLayoutNoG;
-                    g_crr_state.layer.apps.is_changed = STM_TRUE;
-                    break;
-                }
-                break;
-            default:
-                // nop
-                break;
-            }
-            break;
-        case STM_CTG_NO_SPLITABLE:
-            switch (area_no) {
-            case STM_ARA_NO_NORMAL:
-                // Apps layer
-                switch (apps_state) {
-                case gStmLayoutNoM1:
-                    g_crr_state.layer.apps.state = gStmLayoutNoM2;
-                    g_crr_state.layer.apps.is_changed = STM_TRUE;
-                    break;
-                case gStmLayoutNoMf:
-                case gStmLayoutNoS1:
                     // nop
                     break;
-                default:
-                    g_crr_state.layer.apps.state = gStmLayoutNoS1;
-                    g_crr_state.layer.apps.is_changed = STM_TRUE;
-                    break;
                 }
                 break;
-            case STM_ARA_NO_SPLIT_MAIN:
-                // Apps layer
-                switch (apps_state) {
-                case gStmLayoutNoS1:
-                    g_crr_state.layer.apps.state = gStmLayoutNoS2;
-                    g_crr_state.layer.apps.is_changed = STM_TRUE;
-                    break;
-                case gStmLayoutNoS2:
-                    g_crr_state.layer.apps.state = gStmLayoutNoS2;
-                    g_crr_state.layer.apps.is_changed = STM_TRUE;
+            case STM_CTG_NO_SYSTEM:
+                switch (area_no) {
+                case STM_ARA_NO_NORMAL:
+                    // Apps layer
+                    switch (apps_state) {
+                    case gStmLayoutNoMf:
+                        // nop
+                        break;
+                    default:
+                        g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoSystem;
+                        g_crr_state.layer[gStmLayerNoApps].changed = STM_TRUE;
+                        break;
+                    }
                     break;
                 default:
                     // nop
                     break;
                 }
                 break;
-            case STM_ARA_NO_SPLIT_SUB:
-                // Apps layer
-                switch (apps_state) {
-                case gStmLayoutNoM1:
-                    g_crr_state.layer.apps.state = gStmLayoutNoM2;
-                    g_crr_state.layer.apps.is_changed = STM_TRUE;
+            case STM_CTG_NO_SPLITABLE:
+                switch (area_no) {
+                case STM_ARA_NO_NORMAL:
+                    // Apps layer
+                    switch (apps_state) {
+                    case gStmLayoutNoM1:
+                        g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoM2;
+                        g_crr_state.layer[gStmLayerNoApps].changed = STM_TRUE;
+                        break;
+                    case gStmLayoutNoMf:
+                    case gStmLayoutNoS1:
+                        // nop
+                        break;
+                    default:
+                        g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoS1;
+                        g_crr_state.layer[gStmLayerNoApps].changed = STM_TRUE;
+                        break;
+                    }
                     break;
-                case gStmLayoutNoM2:
-                    g_crr_state.layer.apps.state = gStmLayoutNoM2;
-                    g_crr_state.layer.apps.is_changed = STM_TRUE;
+                case STM_ARA_NO_SPLIT_MAIN:
+                    // Apps layer
+                    switch (apps_state) {
+                    case gStmLayoutNoS1:
+                        g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoS2;
+                        g_crr_state.layer[gStmLayerNoApps].changed = STM_TRUE;
+                        break;
+                    case gStmLayoutNoS2:
+                        g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoS2;
+                        g_crr_state.layer[gStmLayerNoApps].changed = STM_TRUE;
+                        break;
+                    default:
+                        // nop
+                        break;
+                    }
                     break;
-                case gStmLayoutNoS1:
-                    g_crr_state.layer.apps.state = gStmLayoutNoS2;
-                    g_crr_state.layer.apps.is_changed = STM_TRUE;
-                    break;
-                case gStmLayoutNoS2:
-                    g_crr_state.layer.apps.state = gStmLayoutNoS2;
-                    g_crr_state.layer.apps.is_changed = STM_TRUE;
+                case STM_ARA_NO_SPLIT_SUB:
+                    // Apps layer
+                    switch (apps_state) {
+                    case gStmLayoutNoM1:
+                        g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoM2;
+                        g_crr_state.layer[gStmLayerNoApps].changed = STM_TRUE;
+                        break;
+                    case gStmLayoutNoM2:
+                        g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoM2;
+                        g_crr_state.layer[gStmLayerNoApps].changed = STM_TRUE;
+                        break;
+                    case gStmLayoutNoS1:
+                        g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoS2;
+                        g_crr_state.layer[gStmLayerNoApps].changed = STM_TRUE;
+                        break;
+                    case gStmLayoutNoS2:
+                        g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoS2;
+                        g_crr_state.layer[gStmLayerNoApps].changed = STM_TRUE;
+                        break;
+                    default:
+                        // nop
+                        break;
+                    }
                     break;
                 default:
                     // nop
@@ -298,142 +539,187 @@ int stmTransitionState(int event, stm_state_t* state) {
                 break;
             }
             break;
-        case STM_CTG_NO_RESTRICTION:
-            switch (area_no) {
-            case STM_ARA_NO_RESTRICTION_NORMAL:
-                // restriction Layer
-                switch (restriction_state) {
-                case gStmLayoutNoNone:
-                    g_crr_state.layer.restriction.state = gStmLayoutNoRestriction;
-                    g_crr_state.layer.restriction.is_changed = STM_TRUE;
-                    break;
-                default:
-                    // nop
+        }
+       else {  // (gStmRestrictionModeStateNoOn == restriction_mode_state)
+            switch (category_no) {
+            case STM_CTG_NO_MAP:
+                switch (area_no) {
+                case STM_ARA_NO_FULL:
+                case STM_ARA_NO_NORMAL:
+                case STM_ARA_NO_SPLIT_MAIN:
+                    // Apps layer
+                    switch (apps_state) {
+                    case gStmLayoutNoM1:
+                        // nop
+                        break;
+                    default:
+                        g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoM1;
+                        g_crr_state.layer[gStmLayerNoApps].changed = STM_TRUE;
+                    }
                     break;
                 }
                 break;
-            case STM_ARA_NO_RESTRICTION_SPLIT_MAIN:
-                // restriction Layer
-                switch (restriction_state) {
-                case gStmLayoutNoNone:
-                    g_crr_state.layer.restriction.state = gStmLayoutNoRestrictionSplitMain;
-                    g_crr_state.layer.restriction.is_changed = STM_TRUE;
+            case STM_CTG_NO_SYSTEM:
+                switch (area_no) {
+                case STM_ARA_NO_NORMAL:
+                    // Apps layer
+                    switch (apps_state) {
+                    case gStmLayoutNoMf:
+                        // nop
+                        break;
+                    default:
+                        g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoSystem;
+                        g_crr_state.layer[gStmLayerNoApps].changed = STM_TRUE;
+                        break;
+                    }
                     break;
                 default:
                     // nop
                     break;
                 }
                 break;
-            case STM_ARA_NO_RESTRICTION_SPLIT_SUB:
-                // restriction Layer
-                switch (restriction_state) {
-                case gStmLayoutNoNone:
-                    g_crr_state.layer.restriction.state = gStmLayoutNoRestrictionSplitSub;
-                    g_crr_state.layer.restriction.is_changed = STM_TRUE;
+           }
+       }
+    case STM_EVT_NO_DEACTIVATE:
+        switch (category_no) {
+        default:
+            // nop
+            break;
+        }
+        break;
+    default:
+        // nop
+        break;
+    }
+
+
+    // Set restriction layer
+    if (STM_CTG_NO_RESTRICTION == category_no) {
+        if (STM_EVT_NO_ACTIVATE == event_no) {
+            if (gStmLightstatusBrakeStateNoOff == g_crr_state.car_element[gStmCarElementNoLightstatusBrake].state) {
+                switch (area_no) {
+                case STM_ARA_NO_RESTRICTION_NORMAL:
+                    switch (restriction_state) {
+                    case gStmLayoutNoNone:
+                        if (g_crr_state.layer[gStmLayerNoApps].state == gStmLayoutNoS1) {
+                            g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoRestriction;
+                            g_crr_state.layer[gStmLayerNoRestriction].changed = STM_TRUE;
+                        }
+                        break;
+                    default:
+                        // nop
+                        break;
+                    }
+                    break;
+                case STM_ARA_NO_RESTRICTION_SPLIT_MAIN:
+                    switch (restriction_state) {
+                    case gStmLayoutNoNone:
+                        g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoRestrictionSplitMain;
+                        g_crr_state.layer[gStmLayerNoRestriction].changed = STM_TRUE;
+                        break;
+                    default:
+                        // nop
+                        break;
+                    }
+                    break;
+                case STM_ARA_NO_RESTRICTION_SPLIT_SUB:
+                    switch (restriction_state) {
+                    case gStmLayoutNoNone:
+                        if (g_crr_state.layer[gStmLayerNoApps].state == gStmLayoutNoM2) {
+                            g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoRestrictionSplitSub;
+                            g_crr_state.layer[gStmLayerNoRestriction].changed = STM_TRUE;
+                        }
+                        break;
+                    default:
+                        // nop
+                        break;
+                    }
                     break;
                 default:
                     // nop
                     break;
                 }
-                break;
-            default:
-                // nop
-                break;
             }
-            break;
-        default:
-            // nop
-            break;
         }
-    case STM_EVT_NO_DEACTIVATE:
-        switch (category_no) {
-        case STM_CTG_NO_RESTRICTION:
-            // restriction Layer
+        else if (STM_EVT_NO_DEACTIVATE == event_no) {
             switch (restriction_state) {
             case gStmLayoutNoRestriction:
             case gStmLayoutNoRestrictionSplitMain:
             case gStmLayoutNoRestrictionSplitSub:
-                g_crr_state.layer.restriction.state = gStmLayoutNoNone;
-                g_crr_state.layer.restriction.is_changed = STM_TRUE;
+                g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoNone;
+                g_crr_state.layer[gStmLayerNoRestriction].changed = STM_TRUE;
                 break;
             default:
                 // nop
                 break;
             }
-        default:
-            // nop
-            break;
-        }
-        break;
-    case STM_EVT_NO_PARKING_BRAKE_OFF:
-        if (gStmParkingBrakeStateNoOff != parking_brake_state) {
-            g_crr_state.parking_brake.state = gStmParkingBrakeStateNoOff;
-            g_crr_state.parking_brake.is_changed = STM_TRUE;
         }
-        break;
-    case STM_EVT_NO_PARKING_BRAKE_ON:
-        if (gStmParkingBrakeStateNoOn != parking_brake_state) {
-            g_crr_state.parking_brake.state = gStmParkingBrakeStateNoOn;
-            g_crr_state.parking_brake.is_changed = STM_TRUE;
-        }
-        break;
-    case STM_EVT_NO_ACCEL_PEDAL_OFF:
-        if (gStmAccelPedalStateNoOff != accel_pedal_state) {
-            g_crr_state.layer.apps.state = g_prv_apps_state_car_stop;
-            g_crr_state.layer.apps.is_changed = STM_TRUE;
-
-            g_crr_state.accel_pedal.state = gStmAccelPedalStateNoOff;
-            g_crr_state.accel_pedal.is_changed = STM_TRUE;
+    }
+    else if (g_crr_state.layer[gStmLayerNoApps].changed) {
+        if (gStmLightstatusBrakeStateNoOff == g_crr_state.car_element[gStmCarElementNoLightstatusBrake].state) {
+            if (gStmLayoutNoM2 == g_crr_state.layer[gStmLayerNoApps].state) {
+                g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoRestrictionSplitSub;
+                g_crr_state.layer[gStmLayerNoRestriction].changed = STM_TRUE;
+            }
+            else if (gStmLayoutNoS1 == g_crr_state.layer[gStmLayerNoApps].state) {
+                g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoRestriction;
+                g_crr_state.layer[gStmLayerNoRestriction].changed = STM_TRUE;
+            }
+            else {
+                if (gStmLayoutNoNone != g_crr_state.layer[gStmLayerNoRestriction].state) {
+                    g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoNone;
+                    g_crr_state.layer[gStmLayerNoRestriction].changed = STM_TRUE;
+                }
+            }
         }
-        break;
-    case STM_EVT_NO_ACCEL_PEDAL_ON:
-        if (gStmAccelPedalStateNoOn != accel_pedal_state) {
-            g_prv_apps_state_car_stop = apps_state;
-            g_crr_state.layer.apps.state = gStmLayoutNoM1;
-            g_crr_state.layer.apps.is_changed = STM_TRUE;
-
-            g_crr_state.accel_pedal.state = gStmAccelPedalStateNoOn;
-            g_crr_state.accel_pedal.is_changed = STM_TRUE;
+        else {
+            if (gStmLayoutNoNone != g_crr_state.layer[gStmLayerNoRestriction].state) {
+                g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoNone;
+                g_crr_state.layer[gStmLayerNoRestriction].changed = STM_TRUE;
+            }
         }
-        break;
-    case STM_EVT_NO_CAR_STOP:
-        if (gStmCarStateNoStop != car_state) {
-            g_crr_state.layer.apps.state = g_prv_apps_state_car_stop;
-            g_crr_state.layer.apps.is_changed = STM_TRUE;
+    }
 
-            g_crr_state.car.state = gStmCarStateNoStop;
-            g_crr_state.car.is_changed = STM_TRUE;
-        }
-        break;
-    case STM_EVT_NO_CAR_RUN:
-        if (gStmCarStateNoRun != car_state) {
-            g_prv_apps_state_car_stop = apps_state;
-            g_crr_state.layer.apps.state = gStmLayoutNoM1;
-            g_crr_state.layer.apps.is_changed = STM_TRUE;
-
-            g_crr_state.car.state = gStmCarStateNoRun;
-            g_crr_state.car.is_changed = STM_TRUE;
-        }
-        break;
-    case STM_EVT_NO_LAMP_OFF:
-        if (gStmLampStateNoOff != lamp_state) {
-            g_crr_state.lamp.state = gStmLampStateNoOff;
-            g_crr_state.lamp.is_changed = STM_TRUE;
+    // Set on screen layer
+    if (STM_CTG_NO_POPUP == category_no) {
+        if (STM_EVT_NO_ACTIVATE == event_no) {
+            switch (on_screen_state) {
+            case gStmLayoutNoNone:
+                g_crr_state.layer[gStmLayerNoOnScreen].state = gStmLayoutNoPu;
+                g_crr_state.layer[gStmLayerNoOnScreen].changed = STM_TRUE;
+                break;
+            default:
+                // nop
+                break;
+            }
         }
-        break;
-    case STM_EVT_NO_LAMP_ON:
-        if (gStmLampStateNoOn != lamp_state) {
-            g_crr_state.lamp.state = gStmLampStateNoOn;
-            g_crr_state.lamp.is_changed = STM_TRUE;
+        else if (STM_EVT_NO_DEACTIVATE == event_no) {
+            switch (on_screen_state) {
+            case gStmLayoutNoPu:
+                g_crr_state.layer[gStmLayerNoOnScreen].state = gStmLayoutNoNone;
+                g_crr_state.layer[gStmLayerNoOnScreen].changed = STM_TRUE;
+                break;
+            default:
+                // nop
+                break;
+            }
         }
-        break;
-    default:
-        // nop
-        break;
     }
 
     // Copy current state for return
     memcpy(state, &g_crr_state, sizeof(g_crr_state));
 
+    if ((STM_FALSE == g_map_is_activated)
+        && (STM_TRUE == g_crr_state.layer[gStmLayerNoApps].changed)
+        && ((gStmLayoutNoM1 == g_crr_state.layer[gStmLayerNoApps].state)
+            || (gStmLayoutNoM2 == g_crr_state.layer[gStmLayerNoApps].state)
+            || (gStmLayoutNoMf == g_crr_state.layer[gStmLayerNoApps].state))) {
+        g_map_is_activated = STM_TRUE;
+    }
+
     return 0;
 }
+
+void stmUndoState() {
+    g_crr_state = g_prv_state;
+}