PolicyManager can judge the current car state
[apps/agl-service-windowmanager.git] / src / policy_manager / zipc / dummy_stm.c
index 3c9cba2..968b086 100644 (file)
-
 #include <string.h>
 #include "dummy_stm.h"
 
-stm_state_t g_crr_state = {0};
-stm_state_t g_prv_state = {0};
+const char* gStmEventName[] = {
+    "activate",
+    "deactivate",
+    "parking_brake_off",
+    "parking_brake_on",
+    "accel_pedal_off",
+    "accel_pedal_on",
+    "timer_expired",
+    "lamp_off",
+    "lamp_on"
+};
+
+const int gStmEventNo[] = {
+    STM_EVT_NO_ACTIVATE,
+    STM_EVT_NO_DEACTIVATE,
+    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_TIMER_EXPIRED,
+    STM_EVT_NO_LAMP_OFF,
+    STM_EVT_NO_LAMP_ON
+};
+
+const char* gStmCategoryName[] = {
+    "homescreen",
+    "map",
+    "general",
+    "splitable",
+    "popup",
+    "system_alert",
+    "restriction",
+};
+
+const int gStmCategoryNo[] = {
+    STM_CTG_NO_HOMESCREEN,
+    STM_CTG_NO_MAP,
+    STM_CTG_NO_GENERAL,
+    STM_CTG_NO_SPLITABLE,
+    STM_CTG_NO_POPUP,
+    STM_CTG_NO_SYSTEM_ALERT,
+    STM_CTG_NO_RESTRICTION,
+};
+
+const char* gStmAreaName[] = {
+    "full",
+    "normal",
+    "split.main",
+    "split.sub",
+    "onscreen",
+    "restriction.normal",
+    "restriction.split.main",
+    "restriction.split.sub",
+};
+
+const int gStmAreaNo[] = {
+    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_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* gStmAccelPedalStateNo2Name[] = {
+    "accel_pedal_off",
+    "accel_pedal_on"
+};
+
+const char* gStmCarStateNo2Name[] = {
+    "car_stop",
+    "car_run"
+};
+
+const char* gStmLampStateNo2Name[] = {
+    "lamp_off",
+    "lamp_on"
+};
+
+const char* gStmLayoutNo2Name[] = {
+    "none",
+    "pu",
+    "sa",
+    "m1",
+    "m2",
+    "mf",
+    "s1",
+    "s2",
+    "g",
+    "hs",
+    "restriction",
+    "restriction.split.main",
+    "restriction.split.sub",
+};
+
+stm_state_t g_crr_state;
+stm_state_t g_prv_state;
+int g_prv_restriction_state_car_stop = 0;
 int g_prv_apps_state_car_stop = 0;
 
+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;
+
+    // Initialize current state
+    g_crr_state = g_prv_state;
+}
+
 int stmTransitionState(int event, stm_state_t* state) {
     int event_no, category_no, area_no;
-    int apps_state, car_state, lamp_state;
+    int restriction_state, apps_state;
+    int parking_brake_state, accel_pedal_state, car_state, lamp_state;
 
     event_no    = event & STM_MSK_EVT_NO;
     category_no = event & STM_MSK_CTG_NO;
@@ -18,12 +139,22 @@ 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;
 
-    // Clear current state
-    memset(&g_crr_state, 0, sizeof(g_crr_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;
 
     switch (event_no) {
     case STM_EVT_NO_ACTIVATE:
@@ -105,12 +236,13 @@ int stmTransitionState(int event, stm_state_t* state) {
             case STM_ARA_NO_NORMAL:
                 // Apps layer
                 switch (apps_state) {
-                case gStmLayoutNoMf:
-                    // nop
+                case gStmLayoutNoM1:
+                    g_crr_state.layer.apps.state = gStmLayoutNoM2;
+                    g_crr_state.layer.apps.is_changed = STM_TRUE;
                     break;
+                case gStmLayoutNoMf:
                 case gStmLayoutNoS1:
-                    g_crr_state.layer.apps.state = gStmLayoutNoS2;
-                    g_crr_state.layer.apps.is_changed = STM_TRUE;
+                    // nop
                     break;
                 default:
                     g_crr_state.layer.apps.state = gStmLayoutNoS1;
@@ -163,28 +295,95 @@ 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
+                    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;
+                    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;
+                    break;
+                default:
+                    // nop
+                    break;
+                }
+                break;
+            default:
+                // nop
+                break;
+            }
+            break;
         default:
-          // nop
-          break;
+            // nop
+            break;
+        }
+    case STM_EVT_NO_DEACTIVATE:
+        switch (category_no) {
+        case STM_CTG_NO_RESTRICTION:
+            // restriction Layer
+            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;
+                break;
+            default:
+                // nop
+                break;
+            }
+        default:
+            // nop
+            break;
         }
         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;
+    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_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;
+    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.accel_pedal.state = gStmAccelPedalStateNoOff;
+            g_crr_state.accel_pedal.is_changed = STM_TRUE;
+        }
+        break;
+    case STM_EVT_NO_ACCEL_PEDAL_ON:
+        if (gStmAccelPedalStateNoOn != accel_pedal_state) {
+            g_crr_state.accel_pedal.state = gStmAccelPedalStateNoOn;
+            g_crr_state.accel_pedal.is_changed = STM_TRUE;
         }
         break;
     case STM_EVT_NO_LAMP_OFF:
@@ -204,9 +403,46 @@ int stmTransitionState(int event, stm_state_t* state) {
         break;
     }
 
+    // Set car state
+    if (g_crr_state.parking_brake.is_changed
+        || g_crr_state.accel_pedal.is_changed) {
+        if ((gStmParkingBrakeStateNoOff == g_crr_state.parking_brake.state)
+            && (gStmAccelPedalStateNoOn == g_crr_state.accel_pedal.state)){
+            if (gStmCarStateNoRun != car_state) {
+                // Car state is changed stop -> run
+                g_crr_state.car.state = gStmCarStateNoRun;
+                g_crr_state.car.is_changed = STM_TRUE;
+
+                // Update restriction layer
+                g_prv_restriction_state_car_stop = restriction_state;
+                g_crr_state.layer.restriction.state = gStmLayoutNoNone;
+                g_crr_state.layer.restriction.is_changed = STM_TRUE;
+
+                // Update apps layer
+                g_prv_apps_state_car_stop = apps_state;
+                g_crr_state.layer.apps.state = gStmLayoutNoM1;
+                g_crr_state.layer.apps.is_changed = STM_TRUE;
+            }
+        }
+        else {
+            if (gStmCarStateNoStop != car_state) {
+                // Car state is changed run -> stop
+                g_crr_state.car.state = gStmCarStateNoStop;
+                g_crr_state.car.is_changed = STM_TRUE;
+
+                // Update restriction layer
+                g_crr_state.layer.restriction.state = g_prv_restriction_state_car_stop;
+                g_crr_state.layer.restriction.is_changed = STM_TRUE;
+
+                // Update apps layer
+                g_crr_state.layer.apps.state = g_prv_apps_state_car_stop;
+                g_crr_state.layer.apps.is_changed = STM_TRUE;
+            }
+        }
+    }
+
     // Copy current state for return
     memcpy(state, &g_crr_state, sizeof(g_crr_state));
 
     return 0;
 }
-