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.cpp416
1 files changed, 241 insertions, 175 deletions
diff --git a/src/policy_manager/policy_manager.cpp b/src/policy_manager/policy_manager.cpp
index 351c7ce..55d79d9 100644
--- a/src/policy_manager/policy_manager.cpp
+++ b/src/policy_manager/policy_manager.cpp
@@ -19,6 +19,7 @@
#include <sstream>
#include <istream>
#include <thread>
+#include <map>
#include <systemd/sd-event.h>
#include <json-c/json.h>
#include "policy_manager.hpp"
@@ -32,16 +33,18 @@ extern "C" {
namespace pm {
-struct EventData {
- explicit EventData(int event, PolicyManager::Handler handler) {
- this->event = event;
- this->handler = handler;
- };
- ~EventData() = default;
+struct sd_event* event_loop;
+struct sd_event_source* event_source;
+
+struct EventData {
+ PolicyManager *ctx;
int event;
PolicyManager::Handler handler;
};
+
+std::map<int, EventData> event_data_list;
+
} // namespace pm
PolicyManager::PolicyManager() :
@@ -98,7 +101,7 @@ int PolicyManager::initialize() {
int PolicyManager::initializeSdEventLoop() {
// Get default event loop object
- int ret = sd_event_new(&(this->sd_event_));
+ int ret = sd_event_new(&(pm::event_loop));
if (0 > ret) {
HMI_ERROR("wm:pm", "Faild to sd_event_default: errno:%d", ret);
return -1;
@@ -107,7 +110,7 @@ int PolicyManager::initializeSdEventLoop() {
// Create thread for sd_event and detach
std::thread sd_event_loop([this]() {
while (1) {
- sd_event_run(this->sd_event_, 1000);
+ sd_event_run(pm::event_loop, 1000);
}
});
sd_event_loop.detach();
@@ -131,173 +134,221 @@ static void addStateToJson(
json_object_object_add(*json_out, key, json_obj);
}
+static int checkPolicyEntry(PolicyManager* ctx, int event, int delay_ms,
+ PolicyManager::Handler handler);
static int checkPolicy(sd_event_source *source, uint64_t usec, void *data) {
HMI_DEBUG("wm:pm", "Call");
- pm::EventData *event_data = (pm::EventData*)data;
+ int event = *((int*)data);
+
+ pm::EventData event_data;
+ if (pm::event_data_list.find(event) != pm::event_data_list.end()) {
+ event_data = pm::event_data_list[event];
+
+ int event_no, category_no, area_no;
+ event_no = event & STM_MSK_EVT_NO;
+ category_no = event & STM_MSK_CTG_NO;
+ area_no = event & STM_MSK_ARA_NO;
+ HMI_DEBUG("wm:pm", ">>>>>>>>>> START CHECK POLICY");
+ HMI_DEBUG("wm:pm", ">>>>>>>>>> event:%s category:%s area:%s",
+ stm::gStmEventName[event_no - 1],
+ stm::gStmCategoryName[(category_no >> 8) - 1],
+ stm::gStmAreaName[(area_no >> 16) - 1]);
+
+ // Transition state
+ stm::stm_state_t crr_state;
+ int ret = stm::stmTransitionState(event_data.event, &crr_state);
+ if (0 > ret) {
+ HMI_ERROR("wm:pm", "Error!!");
+ return -1;
+ }
- // Transition state
- stm::stm_state_t crr_state;
- int ret = stm::stmTransitionState(event_data->event, &crr_state);
- if (0 > ret) {
- HMI_ERROR("wm:pm", "Error!!");
- return -1;
- }
+ HMI_DEBUG("wm", "parking brake state (is_changed:%d state:%d:%s)",
+ crr_state.parking_brake.is_changed,
+ crr_state.parking_brake.state,
+ stm::gStmParkingBrakeStateNo2Name[crr_state.parking_brake.state]);
+ HMI_DEBUG("wm", "accelerator pedal state (is_changed:%d state:%d:%s)",
+ crr_state.accel_pedal.is_changed,
+ crr_state.accel_pedal.state,
+ stm::gStmAccelPedalStateNo2Name[crr_state.accel_pedal.state]);
+ HMI_DEBUG("wm", "lightstatus brake state (is_changed:%d state:%d:%s)",
+ crr_state.lightstatus_brake.is_changed,
+ crr_state.lightstatus_brake.state,
+ stm::gStmLightstatusBrakeStateNo2Name[crr_state.lightstatus_brake.state]);
+ HMI_DEBUG("wm", "car state (is_changed:%d state:%d:%s)",
+ crr_state.car.is_changed,
+ crr_state.car.state,
+ stm::gStmCarStateNo2Name[crr_state.car.state]);
+ HMI_DEBUG("wm", "lamp state (is_changed:%d state:%d:%s)",
+ crr_state.lamp.is_changed,
+ crr_state.lamp.state,
+ stm::gStmLampStateNo2Name[crr_state.lamp.state]);
+ HMI_DEBUG("wm", "restriction mode state (is_changed:%d state:%d:%s)",
+ crr_state.restriction_mode.is_changed,
+ crr_state.restriction_mode.state,
+ stm::gStmRestrictionModeStateNo2Name[crr_state.restriction_mode.state]);
+ HMI_DEBUG("wm", "homescreen state (is_changed:%d state:%d:%s)",
+ crr_state.layer.homescreen.is_changed,
+ crr_state.layer.homescreen.state,
+ stm::gStmLayoutNo2Name[crr_state.layer.homescreen.state]);
+ HMI_DEBUG("wm", "apps state (is_changed:%d state:%d:%s)",
+ crr_state.layer.apps.is_changed,
+ crr_state.layer.apps.state,
+ stm::gStmLayoutNo2Name[crr_state.layer.apps.state]);
+ HMI_DEBUG("wm", "restriction state (is_changed:%d state:%d:%s)",
+ crr_state.layer.restriction.is_changed,
+ crr_state.layer.restriction.state,
+ stm::gStmLayoutNo2Name[crr_state.layer.restriction.state]);
+ HMI_DEBUG("wm", "on_screen state (is_changed:%d state:%d:%s)",
+ crr_state.layer.on_screen.is_changed,
+ crr_state.layer.on_screen.state,
+ stm::gStmLayoutNo2Name[crr_state.layer.on_screen.state]);
+
+ json_object* json_out = json_object_new_object();
+
+ // Create result
+ // {
+ // "parking_brake": {
+ // "is_changed": <bool>,
+ // "state": <const char*>
+ // },
+ addStateToJson("parking_brake",
+ crr_state.parking_brake.is_changed,
+ stm::gStmParkingBrakeStateNo2Name[crr_state.parking_brake.state],
+ &json_out);
+
+ // "accel_pedal": {
+ // "is_changed": <bool>,
+ // "state": <const char*>
+ // },
+ addStateToJson("accel_pedal",
+ crr_state.accel_pedal.is_changed,
+ stm::gStmAccelPedalStateNo2Name[crr_state.accel_pedal.state],
+ &json_out);
+
+ // "lightstatus_brake": {
+ // "is_changed": <bool>,
+ // "state": <const char*>
+ // },
+ addStateToJson("lightstatus_brake",
+ crr_state.lightstatus_brake.is_changed,
+ stm::gStmLightstatusBrakeStateNo2Name[crr_state.lightstatus_brake.state],
+ &json_out);
+
+ // "car": {
+ // "is_changed": <bool>,
+ // "state": <const char*>
+ // },
+ addStateToJson("car",
+ crr_state.car.is_changed,
+ stm::gStmCarStateNo2Name[crr_state.car.state],
+ &json_out);
+
+ // "lamp": {
+ // "is_changed": <bool>,
+ // "state": <const char*>
+ // },
+ addStateToJson("lamp",
+ crr_state.lamp.is_changed,
+ stm::gStmLampStateNo2Name[crr_state.lamp.state],
+ &json_out);
+
+ // "restriction_mode": {
+ // "is_changed": <bool>,
+ // "state": <const char*>
+ // },
+ addStateToJson("restriction_mode",
+ crr_state.restriction_mode.is_changed,
+ stm::gStmRestrictionModeStateNo2Name[crr_state.restriction_mode.state],
+ &json_out);
+
+ // "layers": [
+ json_object* json_layer = json_object_new_array();
+ json_object* json_tmp;
+
+ // {
+ // "homescreen": {
+ // "is_changed": <bool>,
+ // "state": <const char*>
+ // }
+ // },
+ // ]
+ // }
+ json_tmp = json_object_new_object();
+ addStateToJson("homescreen",
+ crr_state.layer.homescreen.is_changed,
+ stm::gStmLayoutNo2Name[crr_state.layer.homescreen.state],
+ &json_tmp);
+ json_object_array_add(json_layer, json_tmp);
+
+ // {
+ // "apps": {
+ // "is_changed": <bool>,
+ // "state": <const char*>
+ // }
+ // },
+ json_tmp = json_object_new_object();
+ addStateToJson("apps",
+ crr_state.layer.apps.is_changed,
+ stm::gStmLayoutNo2Name[crr_state.layer.apps.state],
+ &json_tmp);
+ json_object_array_add(json_layer, json_tmp);
+
+ // {
+ // "restriction": {
+ // "is_changed": <bool>,
+ // "state": <const char*>
+ // }
+ // },
+ json_tmp = json_object_new_object();
+ addStateToJson("restriction",
+ crr_state.layer.restriction.is_changed,
+ stm::gStmLayoutNo2Name[crr_state.layer.restriction.state],
+ &json_tmp);
+ json_object_array_add(json_layer, json_tmp);
+
+ // {
+ // "on_screen": {
+ // "is_changed": <bool>,
+ // "state": <const char*>
+ // }
+ // },
+ json_tmp = json_object_new_object();
+ addStateToJson("on_screen",
+ crr_state.layer.on_screen.is_changed,
+ stm::gStmLayoutNo2Name[crr_state.layer.on_screen.state],
+ &json_tmp);
+ json_object_array_add(json_layer, json_tmp);
+
+ // Add json array of layer
+ json_object_object_add(json_out, "layers", json_layer);
+
+ // Call event handler
+ event_data.handler(json_out);
+
+ if (crr_state.car.is_changed) {
+ // Set delay event(restriction mode on) when car state is chaged stop -> run
+ if (stm::gStmCarStateNoRun == crr_state.car.state) {
+ checkPolicyEntry(event_data.ctx, STM_EVT_NO_RESTRICTION_MODE_ON,
+ 3000, event_data.handler);
+ }
+ else if (stm::gStmCarStateNoStop == crr_state.car.state) {
+ checkPolicyEntry(event_data.ctx, STM_EVT_NO_RESTRICTION_MODE_OFF,
+ 0, event_data.handler);
+ }
+ }
- json_object* json_out = json_object_new_object();
-
- // Create result
- // {
- // "parking_brake": {
- // "is_changed": <bool>,
- // "state": <const char*>
- // },
- HMI_DEBUG("wm", "parking brake state (is_changed:%d state:%d:%s)",
- crr_state.parking_brake.is_changed,
- crr_state.parking_brake.state,
- stm::gStmParkingBrakeStateNo2Name[crr_state.parking_brake.state]);
- addStateToJson("parking_brake",
- crr_state.parking_brake.is_changed,
- stm::gStmParkingBrakeStateNo2Name[crr_state.parking_brake.state],
- &json_out);
-
- // "accel_pedal": {
- // "is_changed": <bool>,
- // "state": <const char*>
- // },
- HMI_DEBUG("wm", "accelerator pedal state (is_changed:%d state:%d:%s)",
- crr_state.accel_pedal.is_changed,
- crr_state.accel_pedal.state,
- stm::gStmAccelPedalStateNo2Name[crr_state.accel_pedal.state]);
- addStateToJson("accel_pedal",
- crr_state.accel_pedal.is_changed,
- stm::gStmAccelPedalStateNo2Name[crr_state.accel_pedal.state],
- &json_out);
-
- // "lightstatus_brake": {
- // "is_changed": <bool>,
- // "state": <const char*>
- // },
- HMI_DEBUG("wm", "lightstatus brake state (is_changed:%d state:%d:%s)",
- crr_state.lightstatus_brake.is_changed,
- crr_state.lightstatus_brake.state,
- stm::gStmLightstatusBrakeStateNo2Name[crr_state.lightstatus_brake.state]);
- addStateToJson("lightstatus_brake",
- crr_state.lightstatus_brake.is_changed,
- stm::gStmLightstatusBrakeStateNo2Name[crr_state.lightstatus_brake.state],
- &json_out);
-
- // "car": {
- // "is_changed": <bool>,
- // "state": <const char*>
- // },
- HMI_DEBUG("wm", "car state (is_changed:%d state:%d:%s)",
- crr_state.car.is_changed,
- crr_state.car.state,
- stm::gStmCarStateNo2Name[crr_state.car.state]);
- addStateToJson("car",
- crr_state.car.is_changed,
- stm::gStmCarStateNo2Name[crr_state.car.state],
- &json_out);
-
- // "lamp": {
- // "is_changed": <bool>,
- // "state": <const char*>
- // },
- HMI_DEBUG("wm", "lamp state (is_changed:%d state:%d:%s)",
- crr_state.lamp.is_changed,
- crr_state.lamp.state,
- stm::gStmLampStateNo2Name[crr_state.lamp.state]);
- addStateToJson("lamp",
- crr_state.lamp.is_changed,
- stm::gStmLampStateNo2Name[crr_state.lamp.state],
- &json_out);
-
- // "layers": [
- json_object* json_layer = json_object_new_array();
- json_object* json_tmp;
+ // Release json_object
+ json_object_put(json_out);
- // {
- // "homescreen": {
- // "is_changed": <bool>,
- // "state": <const char*>
- // }
- // },
- // ]
- // }
- HMI_DEBUG("wm", "homescreen state (is_changed:%d state:%d:%s)",
- crr_state.layer.homescreen.is_changed,
- crr_state.layer.homescreen.state,
- stm::gStmLayoutNo2Name[crr_state.layer.homescreen.state]);
- json_tmp = json_object_new_object();
- addStateToJson("homescreen",
- crr_state.layer.homescreen.is_changed,
- stm::gStmLayoutNo2Name[crr_state.layer.homescreen.state],
- &json_tmp);
- json_object_array_add(json_layer, json_tmp);
-
- // {
- // "apps": {
- // "is_changed": <bool>,
- // "state": <const char*>
- // }
- // },
- HMI_DEBUG("wm", "apps state (is_changed:%d state:%d:%s)",
- crr_state.layer.apps.is_changed,
- crr_state.layer.apps.state,
- stm::gStmLayoutNo2Name[crr_state.layer.apps.state]);
- json_tmp = json_object_new_object();
- addStateToJson("apps",
- crr_state.layer.apps.is_changed,
- stm::gStmLayoutNo2Name[crr_state.layer.apps.state],
- &json_tmp);
- json_object_array_add(json_layer, json_tmp);
-
- // {
- // "restriction": {
- // "is_changed": <bool>,
- // "state": <const char*>
- // }
- // },
- HMI_DEBUG("wm", "restriction state (is_changed:%d state:%d:%s)",
- crr_state.layer.restriction.is_changed,
- crr_state.layer.restriction.state,
- stm::gStmLayoutNo2Name[crr_state.layer.restriction.state]);
- json_tmp = json_object_new_object();
- addStateToJson("restriction",
- crr_state.layer.restriction.is_changed,
- stm::gStmLayoutNo2Name[crr_state.layer.restriction.state],
- &json_tmp);
- json_object_array_add(json_layer, json_tmp);
-
- // {
- // "on_screen": {
- // "is_changed": <bool>,
- // "state": <const char*>
- // }
- // },
- HMI_DEBUG("wm", "on_screen state (is_changed:%d state:%d:%s)",
- crr_state.layer.on_screen.is_changed,
- crr_state.layer.on_screen.state,
- stm::gStmLayoutNo2Name[crr_state.layer.on_screen.state]);
- json_tmp = json_object_new_object();
- addStateToJson("on_screen",
- crr_state.layer.on_screen.is_changed,
- stm::gStmLayoutNo2Name[crr_state.layer.on_screen.state],
- &json_tmp);
- json_object_array_add(json_layer, json_tmp);
-
- // Add json array of layer
- json_object_object_add(json_out, "layers", json_layer);
-
- // Call event handler
- event_data->handler(json_out);
-
- // Release json_object
- json_object_put(json_out);
+ HMI_DEBUG("wm:pm", ">>>>>>>>>> FINISH CHECK POLICY");
+ }
+ else {
+ HMI_DEBUG("wm", "Request for event:%d is removed", event);
+ }
// Release data
- delete (pm::EventData*)data;
+ delete (int*)data;
// Destroy sd_event_soutce object
sd_event_source_unref(source);
@@ -305,12 +356,26 @@ static int checkPolicy(sd_event_source *source, uint64_t usec, void *data) {
return 0;
}
-void PolicyManager::checkPolicyEntry(int event, int delay_ms, PolicyManager::Handler handler)
+static int checkPolicyEntry(PolicyManager* ctx, int event, int delay_ms,
+ PolicyManager::Handler handler)
{
HMI_DEBUG("wm:pm", "Call");
+ HMI_DEBUG("wm:pm", "event:0x%x", event);
+
+ // If event is restriction off and there is restriction on event,
+ // remove restriction on event
+ if ((STM_EVT_NO_RESTRICTION_MODE_OFF == event)
+ && (pm::event_data_list.find(event) != pm::event_data_list.end())) {
+ HMI_DEBUG("wm:pm", "Remove event: restriction on");
+ pm::event_data_list.erase(STM_EVT_NO_RESTRICTION_MODE_ON);
+ }
// Create event data
- pm::EventData *event_data = new pm::EventData(event, handler);
+ pm::EventData event_data;
+ event_data.ctx = ctx;
+ event_data.event = event;
+ event_data.handler = handler;
+ pm::event_data_list[event] = event_data;
// Get current time
struct timespec time_spec;
@@ -322,12 +387,15 @@ void PolicyManager::checkPolicyEntry(int event, int delay_ms, PolicyManager::Han
+ (delay_ms * 1000);
// Set timer
- int ret = sd_event_add_time(this->sd_event_, NULL, CLOCK_MONOTONIC, usec, 1,
- &checkPolicy, event_data);
+ struct sd_event_source *source;
+ int ret = sd_event_add_time(pm::event_loop, &source, CLOCK_MONOTONIC, usec, 1,
+ &checkPolicy, new int(event));
if (0 > ret) {
HMI_ERROR("wm:pm", "Faild to sd_event_add_time: errno:%d", ret);
- return;
+ return -1;
}
+
+ return 0;
}
int PolicyManager::inputEvent(json_object* json_in, PolicyManager::Handler notify_state) {
@@ -376,10 +444,8 @@ int PolicyManager::inputEvent(json_object* json_in, PolicyManager::Handler notif
HMI_DEBUG("wm:pm", "area(%s:%d)", area, area_no);
}
- HMI_DEBUG("wm:pm", "set event:0x%x", (event_no | category_no | area_no));
-
// Check policy
- this->checkPolicyEntry((event_no | category_no | area_no), 0, notify_state);
+ checkPolicyEntry(this, (event_no | category_no | area_no), 0, notify_state);
return 0;
}