diff options
author | Yuta Doi <yuta-d@witz-inc.co.jp> | 2018-06-14 12:16:40 +0900 |
---|---|---|
committer | Yuta Doi <yuta-d@witz-inc.co.jp> | 2018-06-14 12:16:40 +0900 |
commit | 5aab17cd6ef530e367559fa56fcdea3b48f60d54 (patch) | |
tree | 2117c1530d55f131668c4fbdc043df2da3479f4c /src | |
parent | 8e7dc0829ee77e3f5c15973aec54ecbdc49ed617 (diff) |
Modify the process for updating layer state
Change-Id: Iccfc332f996f2bc01cd5c6b9cad46229758c6212
Signed-off-by: Yuta Doi <yuta-d@witz-inc.co.jp>
Diffstat (limited to 'src')
-rw-r--r-- | src/app.cpp | 2 | ||||
-rw-r--r-- | src/policy_manager/policy_manager.cpp | 245 | ||||
-rw-r--r-- | src/policy_manager/zipc/dummy_stm.c | 2 |
3 files changed, 106 insertions, 143 deletions
diff --git a/src/app.cpp b/src/app.cpp index a480e49..769bec3 100644 --- a/src/app.cpp +++ b/src/app.cpp @@ -494,7 +494,7 @@ void App::allocateWindowResource(char const *event, char const *drawing_name, } else if (0 == strcmp("homescreen", new_role)) { // Now homescreen specifies "normalfull" - new_area = "full"; + new_area = "fullscreen"; } else { new_area = "normal"; diff --git a/src/policy_manager/policy_manager.cpp b/src/policy_manager/policy_manager.cpp index 6f12795..b55a44d 100644 --- a/src/policy_manager/policy_manager.cpp +++ b/src/policy_manager/policy_manager.cpp @@ -39,12 +39,13 @@ typedef struct AreaState { std::string role; } AreaState; +typedef std::vector<AreaState> AreaList; typedef struct LayoutState { std::string name; std::map<std::string, int> category_num; // int category_num[stm::gStmCategoryNoNum]; - std::vector<AreaState> area_list; - std::map<std::string, std::string> last_invisibled_role; + AreaList area_list; + std::map<std::string, std::vector<std::string>> role_history; } LayoutState; typedef struct LayerState { @@ -243,10 +244,12 @@ static int checkPolicy(sd_event_source *source, void *data) { // Store previous layers pm::g_prv_layers = pm::g_crr_layers; - std::string role = pm::g_event_info_list[event_data]; - std::string event = std::string(stm::gStmEventName[event_no]); - std::string category = std::string(stm::gStmCategoryName[category_no]); - std::string area = std::string(stm::gStmAreaName[area_no]); + std::string req_role = pm::g_event_info_list[event_data]; + std::string req_evt = std::string(stm::gStmEventName[event_no]); + std::string req_ctg = std::string(stm::gStmCategoryName[category_no]); + std::string req_area = std::string(stm::gStmAreaName[area_no]); + HMI_DEBUG("wm:pm", "REQ: event:%s role%s category:%s area:%s", + req_evt.c_str(), req_role.c_str(), req_ctg.c_str(), req_area.c_str()); // Update layers for (int layer_no = stm::gStmLayerNoMin; @@ -300,19 +303,6 @@ static int checkPolicy(sd_event_source *source, void *data) { crr_layout_state = pm::g_prv_layers_car_stop[layer_name].layout_state; #endif } -#if 0 - else if ("none" == crr_layout_name) { - // If current layout is "none", - // current areas is set with "none" - HMI_DEBUG("wm:pm", "Current layout is \"none\""); - pm::AreaState crr_area_state; - crr_area_state.name = "none"; - crr_area_state.category = "none"; - crr_area_state.role = "none"; - crr_layout_state.name = "none"; - crr_layout_state.area_list.push_back(crr_area_state); - } -#endif else { // Copy previous layout state for current crr_layout_state = prv_layout_state; @@ -329,110 +319,45 @@ static int checkPolicy(sd_event_source *source, void *data) { crr_layout_state.area_list = pm::g_default_layouts[crr_layout_name].area_list; } - // Update role in new area -#if 0 -#if 1 - if (crr_state.restriction_mode.is_changed) { - // Updating role is not necessary - // because new_role is not specified - // when restriction mode is changed - HMI_DEBUG("wm:lm", "Updating role is not necessary because new_role is not specified when restriction mode is changed"); -#else - if (crr_state.car.is_changed) { - // Updating role is not necessary - // because new_role is not specified - // when car state is changed - HMI_DEBUG("wm:lm", "Updating role is not necessary because new_role is not specified when car state is changed"); -#endif - } - else { -#endif - std::map<std::string, std::vector<pm::AreaState>> ctg_list; - for (int ctg_no=stm::gStmCategoryNoMin; - ctg_no<=stm::gStmCategoryNoMax; ctg_no++) { - const char* ctg = stm::gStmCategoryName[ctg_no]; - HMI_DEBUG("wm:pm", "ctg:%s", ctg); - - // Create area list of previous app - std::vector<pm::AreaState> area_list; - for (pm::AreaState area_state : prv_layout_state.area_list) { - if (std::string(ctg) == area_state.category) { - // If there is the category which is same with new category in previous layout, - // push it to area list - HMI_DEBUG("wm:pm", "push area_state to prv list category:%s role:%s", - area_state.category.c_str(), area_state.role.c_str()); - area_list.push_back(area_state); - } - } - - int prv_ctg_num = prv_layout_state.category_num[ctg]; - int crr_ctg_num = crr_layout_state.category_num[ctg]; - HMI_DEBUG("wm:pm", "crr_ctg_num:%d prv_ctg_num:%d", crr_ctg_num, prv_ctg_num); - - // Remove state of area which is used no longer from area list - if (crr_ctg_num < prv_ctg_num) { - HMI_DEBUG("wm:pm", "crr_ctg_num < prv_ctg_num"); - if (0 == strcmp(ctg, category.c_str())) { - for (auto i = area_list.begin(); i != area_list.end(); ++i) { - if ((role == i->role) && (area == i->name)) { - HMI_DEBUG("wm:pm", "store removed role:%s", i->role.c_str()); - crr_layout_state.last_invisibled_role[category] = i->role; - - HMI_DEBUG("wm:pm", "remove area state which have same role with requested role"); - area_list.erase(i); - - prv_ctg_num--; - - if (crr_ctg_num == prv_ctg_num) { - break; - } - } - } - } - else { - HMI_DEBUG("wm:pm", "store removed role:%s", area_list.begin()->role.c_str()); - crr_layout_state.last_invisibled_role[ctg] = area_list.begin()->role; - - HMI_DEBUG("wm:pm", "remove the oldest area data"); - area_list.erase(area_list.begin()); - } - } - else if (crr_ctg_num >= prv_ctg_num) { - HMI_DEBUG("wm:pm", "crr_ctg_num >= prv_ctg_num"); - if (0 == strcmp(ctg, category.c_str())) { - HMI_DEBUG("wm:pm", "category of requested role is same"); - if ((crr_ctg_num == prv_ctg_num) && (0 != prv_ctg_num)) { - HMI_DEBUG("wm:pm", "store removed role:%s", area_list.begin()->role.c_str()); - crr_layout_state.last_invisibled_role[ctg] = area_list.begin()->role; - - HMI_DEBUG("wm:pm", "remove the oldest area data for adding requested role"); - area_list.erase(area_list.begin()); - } - } - } - - // Check - for (pm::AreaState area_state : area_list) { - HMI_DEBUG("wm:pm", "area_list name:%s category:%s role:%s", - area_state.name.c_str(), - area_state.category.c_str(), - area_state.role.c_str()); + // Create candidate list + std::map<std::string, pm::AreaList> cand_list; + for (int ctg_no=stm::gStmCategoryNoMin; + ctg_no<=stm::gStmCategoryNoMax; ctg_no++) { + const char* ctg = stm::gStmCategoryName[ctg_no]; + HMI_DEBUG("wm:pm", "ctg:%s", ctg); + + // Create candidate list for category from the previous displayed categories + pm::AreaList tmp_cand_list; + for (pm::AreaState area_state : prv_layout_state.area_list) { + if (std::string(ctg) == area_state.category) { + // If there is the category which is same with new category in previous layout, + // push it to list + HMI_DEBUG("wm:pm", "Push to candidate list category:%s role:%s", + area_state.category.c_str(), area_state.role.c_str()); + tmp_cand_list.push_back(area_state); } - - ctg_list[ctg] = area_list; } - if (event == "activate") { - HMI_DEBUG("wm:pm", "event is activate"); - // First, update area for requested role - bool request_for_this_layer = false; - bool updated = false; + int candidate_num = prv_layout_state.category_num[ctg]; + int blank_num = crr_layout_state.category_num[ctg]; + HMI_DEBUG("wm:pm", "blank_num:%d candidate_num:%d", blank_num, candidate_num); + + // If requested event is "activate" + // and there are requested category and area, + // update area with requested role in current layout. + bool request_for_this_layer = false; + bool updated = false; + if ((ctg == req_ctg) && ("activate" == req_evt) ) { + HMI_DEBUG("wm:pm", "requested event is activate"); for (pm::AreaState &as : crr_layout_state.area_list) { - if (as.category == category) { + if (as.category == req_ctg) { request_for_this_layer = true; - if (as.name == area) { - HMI_DEBUG("wm:pm", "update area for requested category:%s role:%s area:%s", category.c_str(), role.c_str(), area.c_str()); - as.role = role; + + if (as.name == req_area) { + HMI_DEBUG("wm:pm", "Update current layout: area:%s category:%s role:%s", + as.name.c_str(), as.category.c_str(), as.role.c_str()); + as.role = req_role; + blank_num--; updated = true; break; } @@ -440,39 +365,73 @@ static int checkPolicy(sd_event_source *source, void *data) { } // If NOT updated: there is not requested area in new layout, - // requested role is used later. + // so push requested role to candidate list if (request_for_this_layer && (!updated)) { - HMI_DEBUG("wm:pm", "requested role is used later category:%s role:%s area:%s", category.c_str(), role.c_str(), area.c_str()); + HMI_DEBUG("wm:pm", "Push request to candidate list"); pm::AreaState area_state; - area_state.name = area; - area_state.category = category; - area_state.role = role; - ctg_list[category].push_back(area_state); + area_state.name = req_area; + area_state.category = req_ctg; + area_state.role = req_role; + tmp_cand_list.push_back(area_state); } } - // Update areas - for (pm::AreaState &as : crr_layout_state.area_list) { - HMI_DEBUG("wm:pm", "current area info area:%s category:%s role:%s", - as.name.c_str(), as.category.c_str(), as.role.c_str()); - if ((as.role != role) || ("" == as.role)) { - HMI_DEBUG("wm:pm", "update areas for category:%s", as.category.c_str()); - if (0 != ctg_list[as.category].size()) { - HMI_DEBUG("wm:pm", "update role to %s by using area list this category", - ctg_list[as.category].begin()->role); - as.role = ctg_list[as.category].begin()->role; - ctg_list[as.category].erase(ctg_list[as.category].begin()); + // Compare number of candidate/blank, + // And remove role in order of the oldest as necessary + if (candidate_num < blank_num) { + // Refer history stack + // and add to the top of tmp_cand_list in order to the newest + while (candidate_num != blank_num) { + pm::AreaState area_state; + area_state.name = ""; + area_state.category = ctg; + if (0 != crr_layout_state.role_history[ctg].size()) { + HMI_ERROR("wm:pm", "Use role in history stack:%s", + crr_layout_state.role_history[ctg].back().c_str()); + area_state.role = crr_layout_state.role_history[ctg].back(); + crr_layout_state.role_history[ctg].pop_back(); } else { - HMI_DEBUG("wm:pm", "there is no area list for this category, so update area by last invisibled role:", crr_layout_state.last_invisibled_role[as.category]); - as.role = crr_layout_state.last_invisibled_role[as.category]; - crr_layout_state.last_invisibled_role.erase(as.category); + HMI_ERROR("wm:pm", "There is no role in history stack!!"); + area_state.role = ""; } + tmp_cand_list.push_back(area_state); + candidate_num++; } } -#if 0 + else if (candidate_num > blank_num) { + HMI_DEBUG("wm:pm", "candidate_num > blank_num"); + + // Remove the oldest role from candidate list + while (candidate_num != blank_num) { + std::string removed_role = tmp_cand_list.begin()->role; + HMI_DEBUG("wm:pm", "Remove the oldest data(role:%s) from tmp_cand_list", + removed_role.c_str()); + tmp_cand_list.erase(tmp_cand_list.begin()); + candidate_num--; + + // Push removed data to history stack + crr_layout_state.role_history[ctg].push_back(removed_role); + } + } + else { // (candidate_num == blank_num) + // nop + } + + cand_list[ctg] = tmp_cand_list; + } + + // Update areas + for (pm::AreaState &as : crr_layout_state.area_list) { + HMI_DEBUG("wm:pm", "Current area info area:%s category:%s", + as.name.c_str(), as.category.c_str()); + if ("" == as.role) { + HMI_DEBUG("wm:pm", "Update this area with role:%s", + cand_list[as.category].begin()->role.c_str()); + as.role = cand_list[as.category].begin()->role; + cand_list[as.category].erase(cand_list[as.category].begin()); + } } -#endif } // Update current layout of this layer pm::g_crr_layers[layer_name].layout_state = crr_layout_state; @@ -976,8 +935,12 @@ int PolicyManager::loadLayoutDb() { if (nullptr != role) { // Role is NOT essential here area_state.role = std::string(role); - HMI_DEBUG("wm:pm", ">>> role:%s", role); } + else { + area_state.role = std::string(""); + + } + HMI_DEBUG("wm:pm", ">>> role:%s", role); layout_state.area_list.push_back(area_state); diff --git a/src/policy_manager/zipc/dummy_stm.c b/src/policy_manager/zipc/dummy_stm.c index a53d28f..71dfbaa 100644 --- a/src/policy_manager/zipc/dummy_stm.c +++ b/src/policy_manager/zipc/dummy_stm.c @@ -61,7 +61,7 @@ const int gStmCategoryNo[] = { }; const char* gStmAreaName[] = { - "full", + "fullscreen", "normal", "split.main", "split.sub", |