Modify for restriction role
authorYuta Doi <yuta-d@witz-inc.co.jp>
Thu, 10 May 2018 04:10:28 +0000 (13:10 +0900)
committerYuta Doi <yuta-d@witz-inc.co.jp>
Thu, 10 May 2018 04:10:28 +0000 (13:10 +0900)
- Add policy for restriction to dummy stm.
- Add the function which inputs json file
  because json_object_from_file can not allows up to only 4KB file.
- Bug fix in json files.
  - Delete unexpected characters.
  - Delete description because it does not follow the format of json array.

Change-Id: I2f8fba1d1001cf244e2531fe3a1a738d5a48091b
Signed-off-by: Yuta Doi <yuta-d@witz-inc.co.jp>
src/app.cpp
src/db/app.db
src/json_helper.cpp
src/json_helper.hpp
src/layout_manager/db/layout.db
src/layout_manager/layout.cpp
src/policy_manager/db/role.db
src/policy_manager/policy_manager.cpp
src/policy_manager/zipc/dummy_stm.c
src/policy_manager/zipc/dummy_stm.h

index b9338a9..777a07f 100644 (file)
@@ -293,6 +293,9 @@ void App::allocateWindowResource(char const *event, char const *drawing_name,
             else if (0 == strcmp("normal.full", drawing_area)) {
                 new_area = "normal";
             }
+            else if (0 == strcmp("restriction.split.sub", drawing_area)) {
+                new_area = "restriction.split.sub";
+            }
             else if (0 == strcmp("homescreen", new_role)) {
                 // Now homescreen specifies "normalfull"
                 new_area = "full";
@@ -909,7 +912,7 @@ int App::allocateSurface() {
          itr_layers != crr_layers.end(); ++itr_layers) {
         // Get layer
         std::string layer = itr_layers->first;
-        HMI_DEBUG("wm", "Update resource in %s layer", layer.c_str());
+        HMI_DEBUG("wm", "Try to update resource in %s layer", layer.c_str());
 
         // If layout is changed, update resouce
         if (this->lm_.isLayoutChanged(layer.c_str())) {
@@ -953,7 +956,7 @@ int App::allocateSurface() {
                     // Get category name
                     std::string crr_ctg = crr_rol_ctg.begin()->second;
 
-                    // Serch relevant role fron previous displayed role list
+                    // Serch relevant role from previous displayed role list
                     for (auto itr_role = prv_role_list.begin();
                          itr_role != prv_role_list.end(); ++itr_role) {
                         std::string prv_ctg = this->pm_.roleToCategory((*itr_role).c_str());
index 32155ac..7ec632b 100644 (file)
         {
             "name": "Splitable2",
             "role": "splitable2"
+        },
+        {
+            "name": "Restriction",
+            "role": "restriction"
         }
     ]
 }
\ No newline at end of file
index ac3d2b0..f9b916e 100644 (file)
@@ -123,13 +123,13 @@ const char* getStringFromJson(json_object* obj, const char* key) {
 
 int getIntFromJson(json_object* obj, const char* key) {
     if ((nullptr == obj) || (nullptr == key)) {
-        HMI_ERROR("wm", "Argument is nullptr!!!");
+        HMI_ERROR("wm:jh", "Argument is nullptr!!!");
         return 0;
     }
 
     json_object* tmp;
     if (!json_object_object_get_ex(obj, key, &tmp)) {
-        HMI_DEBUG("wm", "Not found key \"%s\"", key);
+        HMI_DEBUG("wm:jh", "Not found key \"%s\"", key);
         return 0;
     }
 
@@ -138,17 +138,70 @@ int getIntFromJson(json_object* obj, const char* key) {
 
 json_bool getBoolFromJson(json_object* obj, const char* key) {
     if ((nullptr == obj) || (nullptr == key)) {
-        HMI_ERROR("wm", "Argument is nullptr!!!");
+        HMI_ERROR("wm:jh", "Argument is nullptr!!!");
         return 0;
     }
 
     json_object* tmp;
     if (!json_object_object_get_ex(obj, key, &tmp)) {
-        HMI_DEBUG("wm", "Not found key \"%s\"", key);
+        HMI_DEBUG("wm:jh", "Not found key \"%s\"", key);
         return 0;
     }
 
     return json_object_get_boolean(tmp);
 }
 
+int inputJsonFilie(const char* file, json_object** obj) {
+    const int input_size = 128;
+    int ret = -1;
+
+    if ((nullptr == file) || (nullptr == obj)) {
+        HMI_ERROR("wm:jh", "Argument is nullptr!!!");
+        return ret;
+    }
+
+    HMI_DEBUG("wm:jh", "Input file: %s", file);
+
+    // Open json file
+    FILE *fp = fopen(file, "rb");
+    if (nullptr == fp) {
+        HMI_ERROR("wm:jh", "Could not open file");
+        return ret;
+    }
+
+    // Parse file data
+    struct json_tokener *tokener = json_tokener_new();
+    enum json_tokener_error json_error;
+    char buffer[input_size];
+    int block_cnt = 1;
+    while (1) {
+        size_t len = fread(buffer, sizeof(char), input_size, fp);
+        *obj = json_tokener_parse_ex(tokener, buffer, len);
+        if (nullptr != *obj) {
+            HMI_DEBUG("wm:jh", "File input is success");
+            ret = 0;
+            break;
+        }
+
+        json_error = json_tokener_get_error(tokener);
+        if ((json_tokener_continue != json_error)
+            || (input_size > len)) {
+            HMI_ERROR("wm:jh", "Failed to parse file (byte:%d err:%s)",
+                      (input_size * block_cnt), json_tokener_error_desc(json_error));
+            HMI_ERROR("wm:jh", "\n%s", buffer);
+            *obj = nullptr;
+            break;
+        }
+        block_cnt++;
+    }
+
+    // Close json file
+    fclose(fp);
+
+    // Free json_tokener
+    json_tokener_free(tokener);
+
+    return ret;
+}
+
 } // namespace jh
index c2087cf..22ec3e6 100644 (file)
@@ -33,5 +33,6 @@ namespace jh {
 const char* getStringFromJson(json_object* obj, const char* key);
 int getIntFromJson(json_object* obj, const char* key);
 json_bool getBoolFromJson(json_object* obj, const char* key);
+int inputJsonFilie(const char* file, json_object** obj);
 } // namespace jh
 #endif  // TMCAGLWM_JSON_HELPER_HPP
index 0de262f..02139e6 100644 (file)
@@ -1,6 +1,5 @@
 {
     "layouts": [
-        "description": "The layout is what roles the layer has in the areas.",
         {
             "name": "pu",
             "layer": "on_screen",
                 },
                 {
                     "name": "split.sub",
-                    "role", "general"
+                    "role": "general"
                 }
             ]
         },
         }
     ],
     "areas": [
-        "description": "The area is in the layer. The layout attaches areas to the layer"
         {
             "name": "fullscreen",
             "rect": {
index 3f4013e..faab316 100644 (file)
@@ -104,7 +104,7 @@ bool LayoutManager::updateLayout(json_object* obj,
         json_object_object_foreach(json_tmp, key, val) {
             layer = key;
             json_layer = val;
-            HMI_DEBUG("wm:lm", "Update %s layer state", layer);
+            HMI_DEBUG("wm:lm", "Try to update %s layer state", layer);
         }
 
         // Store previous state
@@ -253,6 +253,7 @@ bool LayoutManager::isLayoutChanged(const char* layer) {
     return this->is_layout_changed_[layer];
 }
 
+
 extern const char* kDefaultLayoutDb;
 int LayoutManager::loadLayoutDb() {
     HMI_DEBUG("wm:lm", "Call");
@@ -270,10 +271,10 @@ int LayoutManager::loadLayoutDb() {
     }
 
     // Load layout.db
-    HMI_DEBUG("wm:lm", "file_name:%s", file_name.c_str());
-    json_object* json_obj = json_object_from_file(file_name.c_str());
-    if (nullptr == json_obj) {
-        HMI_ERROR("wm:lm", "Could not open layout.db, so use default role information");
+    json_object* json_obj;
+    int ret = jh::inputJsonFilie(file_name.c_str(), &json_obj);
+    if (0 > ret) {
+        HMI_DEBUG("wm:lm", "Could not open layout.db, so use default layout information");
         json_obj = json_tokener_parse(kDefaultLayoutDb);
     }
     HMI_DEBUG("wm:lm", "json_obj dump:%s", json_object_get_string(json_obj));
index 247aab2..6c5d715 100644 (file)
@@ -2,13 +2,13 @@
     "roles":[
     {
         "category": "homescreen",
-        "role": "homescreen | "software_keyboard",
+        "role": "homescreen | software_keyboard",
         "area": "full | software_keyboard",
     },
     {
         "category": "restriction",
         "role": "restriction",
-        "area": "normal | restriction.split.main | restriction.split.sub",
+        "area": "restriction.normal | restriction.split.main | restriction.split.sub",
     },
     {
         "category": "map",
index 9ece573..3b0eac6 100644 (file)
@@ -68,9 +68,8 @@ int PolicyManager::initialize() {
         return ret;
     }
 
-    // TODO:
     // Initialize StateTransitioner
-    // stmInitialize();
+    stm::stmInitialize();
 
     return ret;
 }
@@ -123,7 +122,7 @@ int PolicyManager::checkPolicy(json_object* json_in, json_object** json_out) {
 
     // Transition state
     HMI_DEBUG("wm:pm", "set event:0x%x", (event_no | category_no | area_no));
-    int ret = stmTransitionState((event_no | category_no | area_no),
+    int ret = stm::stmTransitionState((event_no | category_no | area_no),
                                        &(this->current_state_));
     if (0 > ret) {
         HMI_ERROR("wm:pm", "Error!!");
@@ -186,6 +185,19 @@ int PolicyManager::checkPolicy(json_object* json_in, json_object** json_out) {
                          &json_tmp);
     json_object_array_add(json_layer, json_tmp);
 
+    //         {
+    //             "restriction": {
+    //                 "is_changed": <bool>,
+    //                 "state": <const char*>
+    //             }
+    //         },
+    json_tmp = json_object_new_object();
+    this->addStateToJson("restriction",
+                         this->current_state_.layer.restriction.is_changed,
+                         stm::gStmLayoutNo2Name[this->current_state_.layer.restriction.state],
+                         &json_tmp);
+    json_object_array_add(json_layer, json_tmp);
+
     //         {
     //             "apps": {
     //                 "is_changed": <bool>,
@@ -217,8 +229,6 @@ int PolicyManager::checkPolicy(json_object* json_in, json_object** json_out) {
     // Add json array of layer
     json_object_object_add(*json_out, "layers", json_layer);
 
-    HMI_DEBUG("wm:pm", "json_out.dump:%s", json_object_get_string(*json_out));
-
     return 0;
 }
 
index 459f58c..07694cf 100644 (file)
@@ -31,7 +31,8 @@ const char* gStmCategoryName[] = {
     "general",
     "splitable",
     "popup",
-    "system_alert"
+    "system_alert",
+    "restriction",
 };
 
 const int gStmCategoryNo[] = {
@@ -40,7 +41,8 @@ const int gStmCategoryNo[] = {
     STM_CTG_NO_GENERAL,
     STM_CTG_NO_SPLITABLE,
     STM_CTG_NO_POPUP,
-    STM_CTG_NO_SYSTEM_ALERT
+    STM_CTG_NO_SYSTEM_ALERT,
+    STM_CTG_NO_RESTRICTION,
 };
 
 const char* gStmAreaName[] = {
@@ -48,7 +50,10 @@ const char* gStmAreaName[] = {
     "normal",
     "split.main",
     "split.sub",
-    "onscreen"
+    "onscreen",
+    "restriction.normal",
+    "restriction.split.main",
+    "restriction.split.sub",
 };
 
 const int gStmAreaNo[] = {
@@ -56,7 +61,10 @@ const int gStmAreaNo[] = {
     STM_ARA_NO_NORMAL,
     STM_ARA_NO_SPLIT_MAIN,
     STM_ARA_NO_SPLIT_SUB,
-    STM_ARA_NO_ON_SCREEN
+    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
@@ -86,15 +94,34 @@ const char* gStmLayoutNo2Name[] = {
     "s2",
     "g",
     "hs",
+    "restriction",
+    "restriction.split.main",
+    "restriction.split.sub",
 };
 
-stm_state_t g_crr_state = {0};
-stm_state_t g_prv_state = {0};
+stm_state_t g_crr_state;
+stm_state_t g_prv_state;
 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.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, parking_brake_state, car_state, lamp_state;
+    int restriction_state, apps_state, parking_brake_state, car_state, lamp_state;
 
     event_no    = event & STM_MSK_EVT_NO;
     category_no = event & STM_MSK_CTG_NO;
@@ -104,13 +131,20 @@ 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;
     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.car.is_changed = STM_FALSE;
+    g_crr_state.lamp.is_changed = STM_FALSE;
 
     switch (event_no) {
     case STM_EVT_NO_ACTIVATE:
@@ -250,9 +284,71 @@ 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_PARKING_BRAKE_OFF:
index ae438db..38d3912 100644 (file)
 #define STM_CTG_NO_SPLITABLE    0x0400
 #define STM_CTG_NO_POPUP        0x0500
 #define STM_CTG_NO_SYSTEM_ALERT 0x0600
+#define STM_CTG_NO_RESTRICTION  0x0700
 
 // Area number
-#define STM_ARA_NO_FULL       0x010000
-#define STM_ARA_NO_NORMAL     0x020000
-#define STM_ARA_NO_SPLIT_MAIN 0x030000
-#define STM_ARA_NO_SPLIT_SUB  0x040000
-#define STM_ARA_NO_ON_SCREEN  0x050000
+#define STM_ARA_NO_FULL                   0x010000
+#define STM_ARA_NO_NORMAL                 0x020000
+#define STM_ARA_NO_SPLIT_MAIN             0x030000
+#define STM_ARA_NO_SPLIT_SUB              0x040000
+#define STM_ARA_NO_ON_SCREEN              0x050000
+#define STM_ARA_NO_RESTRICTION_NORMAL     0x060000
+#define STM_ARA_NO_RESTRICTION_SPLIT_MAIN 0x070000
+#define STM_ARA_NO_RESTRICTION_SPLIT_SUB  0x080000
 
 // Mask
 #define STM_MSK_EVT_NO 0x0000FF
@@ -56,8 +60,8 @@
 
 // Number of events, categories and areas
 #define STM_NUM_EVT 9
-#define STM_NUM_CTG 6
-#define STM_NUM_ARA 5
+#define STM_NUM_CTG 7
+#define STM_NUM_ARA 8
 
 // Enum for state
 enum stm_parking_brake_state_ {
@@ -85,7 +89,10 @@ enum stm_layout_ {
     gStmLayoutNoS1,
     gStmLayoutNoS2,
     gStmLayoutNoG,
-    gStmLayoutNoHs
+    gStmLayoutNoHs,
+    gStmLayoutNoRestriction,
+    gStmLayoutNoRestrictionSplitMain,
+    gStmLayoutNoRestrictionSplitSub,
 };
 
 
@@ -110,6 +117,7 @@ typedef struct stm_base_state_ {
 
 typedef struct stm_layer_state_ {
     stm_base_state on_screen;
+    stm_base_state restriction;
     stm_base_state apps;
     stm_base_state homescreen;
 } stm_layer_state;
@@ -121,6 +129,8 @@ typedef struct {
     stm_layer_state layer;
 } stm_state_t;
 
+
+void stmInitialize();
 int stmTransitionState(int event_no, stm_state_t* state);