aboutsummaryrefslogtreecommitdiffstats
path: root/src/policy_manager/policy_manager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/policy_manager/policy_manager.cpp')
-rw-r--r--src/policy_manager/policy_manager.cpp80
1 files changed, 61 insertions, 19 deletions
diff --git a/src/policy_manager/policy_manager.cpp b/src/policy_manager/policy_manager.cpp
index 23d1e29..bc3fd8d 100644
--- a/src/policy_manager/policy_manager.cpp
+++ b/src/policy_manager/policy_manager.cpp
@@ -20,6 +20,7 @@
#include <istream>
#include <thread>
#include <map>
+#include <queue>
#include <systemd/sd-event.h>
#include <json-c/json.h>
#include "policy_manager.hpp"
@@ -43,7 +44,6 @@ typedef std::vector<AreaState> AreaList;
typedef struct LayoutState {
std::string name;
std::map<std::string, int> category_num;
-// int category_num[stm::gStmCategoryNoNum];
AreaList area_list;
std::map<std::string, std::vector<std::string>> role_history;
} LayoutState;
@@ -53,10 +53,17 @@ typedef struct LayerState {
LayoutState layout_state;
} LayerState;
+typedef struct EventInfo {
+ int event;
+ std::string role;
+ uint64_t delay;
+} EventInfo;
+
struct sd_event* event_loop;
std::map<int, struct sd_event_source*> event_source_list;
-std::map<int, std::string> g_event_info_list;
+std::map<int, std::string> g_req_role_list;
PolicyManager::CallbackTable callback;
+std::queue<EventInfo> g_event_info_queue;
std::unordered_map<std::string, LayerState> g_prv_layers;
std::unordered_map<std::string, LayerState> g_crr_layers;
@@ -197,7 +204,7 @@ static void addStateToJson(const char* layer_name, unsigned int changed,
}
-static int checkPolicyEntry(int event, uint64_t delay_ms, const char* role);
+static int checkPolicyEntry(int event, uint64_t delay_ms, std::string role);
static int checkPolicy(sd_event_source *source, void *data) {
HMI_DEBUG("wm:pm", "Call");
HMI_DEBUG("wm:pm", ">>>>>>>>>> START CHECK POLICY");
@@ -265,7 +272,7 @@ static int checkPolicy(sd_event_source *source, void *data) {
// Store previous layers
pm::g_prv_layers = pm::g_crr_layers;
- std::string req_role = pm::g_event_info_list[event_data];
+ std::string req_role = pm::g_req_role_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]);
@@ -611,29 +618,26 @@ static int checkPolicy(sd_event_source *source, void *data) {
}
static int timerEvent(sd_event_source *source, uint64_t usec, void *data) {
+ HMI_DEBUG("wm:pm", "Call");
+
int ret = checkPolicy(source, data);
return ret;
-};
+}
-static int checkPolicyEntry(int event, uint64_t delay_ms, const char* role)
+static int checkPolicyEntry(int event, uint64_t delay_ms, std::string role)
{
HMI_DEBUG("wm:pm", "Call");
- HMI_DEBUG("wm:pm", "event:0x%x", event);
+ HMI_DEBUG("wm:pm", "event:0x%x delay:%d role:%s", event, delay_ms, role.c_str());
- // Store event info
- if (nullptr == role) {
- pm::g_event_info_list[event] = std::string("");
- }
- else {
- pm::g_event_info_list[event] = std::string(role);
- }
+ // Store requested role
+ pm::g_req_role_list[event] = role;
if (0 == delay_ms) {
int ret = sd_event_add_defer(pm::event_loop, NULL,
&checkPolicy, new int(event));
if (0 > ret) {
HMI_ERROR("wm:pm", "Faild to sd_event_add_defer: errno:%d", ret);
- pm::g_event_info_list.erase(event);
+ pm::g_req_role_list.erase(event);
return -1;
}
}
@@ -653,7 +657,7 @@ static int checkPolicyEntry(int event, uint64_t delay_ms, const char* role)
&timerEvent, new int(event));
if (0 > ret) {
HMI_ERROR("wm:pm", "Faild to sd_event_add_time: errno:%d", ret);
- pm::g_event_info_list.erase(event);
+ pm::g_req_role_list.erase(event);
return -1;
}
@@ -665,11 +669,13 @@ static int checkPolicyEntry(int event, uint64_t delay_ms, const char* role)
}
void PolicyManager::registerCallback(CallbackTable callback) {
+ HMI_DEBUG("wm:pm", "Call");
+
pm::callback.onStateTransitioned = callback.onStateTransitioned;
pm::callback.onError = callback.onError;
}
-int PolicyManager::inputEvent(json_object* json_in) {
+int PolicyManager::setInputEventData(json_object* json_in) {
HMI_DEBUG("wm:pm", "Call");
// Check arguments
@@ -715,12 +721,48 @@ int PolicyManager::inputEvent(json_object* json_in) {
HMI_DEBUG("wm:pm", "area(%s:%d)", area, area_no);
}
- // Check policy
- checkPolicyEntry((event_no | category_no | area_no), 0, role);
+ // Set event info to the queue
+ pm::EventInfo event_info;
+ event_info.event = (event_no | category_no | area_no);
+ if (nullptr == role) {
+ event_info.role = std::string("");
+ }
+ else {
+ event_info.role = std::string(role);
+ }
+ event_info.role = std::string(role);
+ event_info.delay = 0;
+ pm::g_event_info_queue.push(event_info);
return 0;
}
+int PolicyManager::executeStateTransition() {
+ HMI_DEBUG("wm:pm", "Call");
+
+ int ret;
+ pm::EventInfo event_info;
+
+ while (!pm::g_event_info_queue.empty()) {
+ // Get event info from queue and delete
+ event_info = pm::g_event_info_queue.front();
+ pm::g_event_info_queue.pop();
+
+ // Set event info for checking policy
+ ret = checkPolicyEntry(event_info.event, event_info.delay, event_info.role);
+ }
+ return ret;
+}
+
+void PolicyManager::undoState() {
+ HMI_DEBUG("wm:pm", "Call");
+
+ // Undo state of STM
+ stm::stmUndoState();
+
+ pm::g_crr_layers = pm::g_prv_layers;
+}
+
extern const char* kDefaultRoleDb;
int PolicyManager::loadRoleDb() {
HMI_DEBUG("wm:pm", "Call");