2 * Copyright (c) 2018 TOYOTA MOTOR CORPORATION
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 #include "pm_wrapper.hpp"
18 #include "json_helper.hpp"
24 static PMWrapper *g_context;
29 static void onStateTransitioned(json_object *json_out)
31 g_context->updateStates(json_out);
34 static void onError(json_object *json_out)
36 HMI_DEBUG("error message from PolicyManager:%s",
37 json_object_get_string(json_out));
39 g_context->processError();
44 PMWrapper::PMWrapper() {}
46 int PMWrapper::initialize(std::string ecu_name)
50 ret = this->pm.initialize(ecu_name);
53 HMI_ERROR("wm:pmw", "Faild to initialize PolicyManager");
61 void PMWrapper::registerCallback(StateTransitionHandler on_state_transitioned,
62 ErrorHandler on_error)
64 this->on_state_transitioned = on_state_transitioned;
65 this->on_error = on_error;
67 PolicyManager::CallbackTable my_callback;
68 my_callback.onStateTransitioned = onStateTransitioned;
69 my_callback.onError = onError;
70 this->pm.registerCallback(my_callback);
73 int PMWrapper::setInputEventData(Task task, std::string role, std::string area)
76 if (Task::TASK_ALLOCATE == task)
80 else if (Task::TASK_RELEASE == task)
84 else if (Task::TASK_PARKING_BRAKE_OFF == task)
86 event = "parking_brake_off";
88 else if (Task::TASK_PARKING_BRAKE_ON == task)
90 event = "parking_brake_on";
92 else if (Task::TASK_ACCEL_PEDAL_OFF == task)
94 event = "accel_pedal_off";
96 else if (Task::TASK_ACCEL_PEDAL_ON == task)
98 event = "accel_pedal_on";
100 else if (Task::TASK_HEDLAMP_OFF == task)
102 event = "headlamp_off";
104 else if (Task::TASK_HEDLAMP_ON == task)
106 event = "headlamp_on";
108 else if (Task::TASK_LIGHTSTATUS_BRAKE_OFF == task)
110 event = "lightstatus_brake_off";
112 else if (Task::TASK_LIGHTSTATUS_BRAKE_ON == task)
114 event = "lightstatus_brake_on";
121 json_object *json_in = json_object_new_object();
122 json_object_object_add(json_in, "event", json_object_new_string(event));
123 json_object_object_add(json_in, "role", json_object_new_string(role.c_str()));
124 json_object_object_add(json_in, "area", json_object_new_string(area.c_str()));
127 ret = this->pm.setInputEventData(json_in);
130 HMI_ERROR("wm:pmw", "Faild to set input event data to PolicyManager");
132 json_object_put(json_in);
137 int PMWrapper::executeStateTransition()
140 ret = this->pm.executeStateTransition();
143 HMI_ERROR("wm:pmw", "Failed to execute state transition for PolicyManager");
149 void PMWrapper::undoState()
151 this->pm.undoState();
153 this->crrlayer2rolestate = this->prvlayer2rolestate;
156 void PMWrapper::updateStates(json_object *json_out)
158 std::vector<WMAction> actions;
160 HMI_DEBUG("json_out dump:%s", json_object_get_string(json_out));
162 this->createCarStateChangeAction(json_out, actions);
163 this->createLayoutChangeAction(json_out, actions);
165 this->on_state_transitioned(actions);
168 void PMWrapper::createCarStateChangeAction(json_object *json_out, std::vector<WMAction> &actions)
170 json_object *json_car_ele;
171 if (!json_object_object_get_ex(json_out, "car_elements", &json_car_ele))
173 HMI_DEBUG("Not found key \"car_elements\"");
177 int len = json_object_array_length(json_car_ele);
178 HMI_DEBUG("json_car_ele len:%d", len);
180 for (int i = 0; i < len; i++)
182 json_object *json_tmp = json_object_array_get_idx(json_car_ele, i);
184 std::string car_ele_name = jh::getStringFromJson(json_tmp, "name");
185 std::string state = jh::getStringFromJson(json_tmp, "state");
186 json_bool changed = jh::getBoolFromJson(json_tmp, "changed");
187 HMI_DEBUG("car_element:%s changed:%d", car_ele_name.c_str(), changed);
191 TaskCarState task = TaskCarState::NO_TASK;
192 if ("parking_brake" == car_ele_name)
196 task = TaskCarState::PARKING_BRAKE_OFF;
198 else if ("on" == state)
200 task = TaskCarState::PARKING_BRAKE_ON;
204 HMI_DEBUG("Unknown parking brake state: %s", state.c_str());
207 else if ("accel_pedal" == car_ele_name)
211 task = TaskCarState::ACCEL_PEDAL_OFF;
213 else if ("on" == state)
215 task = TaskCarState::ACCEL_PEDAL_ON;
219 HMI_DEBUG("Unknown accel pedal state: %s", state.c_str());
222 else if ("lamp" == car_ele_name)
226 task = TaskCarState::HEDLAMP_OFF;
228 else if ("on" == state)
230 task = TaskCarState::HEDLAMP_ON;
234 HMI_DEBUG("Unknown lamp state: %s", state.c_str());
237 else if ("lightstatus_brake" == car_ele_name)
241 task = TaskCarState::LIGHTSTATUS_BRAKE_OFF;
243 else if ("on" == state)
245 task = TaskCarState::LIGHTSTATUS_BRAKE_ON;
249 HMI_DEBUG("Unknown lightstatus brake state: %s", state.c_str());
252 else if ("running" == car_ele_name)
256 task = TaskCarState::CAR_STOP;
258 else if ("run" == state)
260 task = TaskCarState::CAR_RUN;
264 HMI_DEBUG("Unknown car state: %s", state.c_str());
267 else if ("restriction_mode" == car_ele_name)
271 task = TaskCarState::RESTRICTION_MODE_OFF;
273 else if ("on" == state)
275 task = TaskCarState::RESTRICTION_MODE_ON;
279 HMI_DEBUG("Unknown car state: %s", state.c_str());
284 HMI_DEBUG("Unknown car element: %s", car_ele_name.c_str());
288 if (TaskCarState::NO_TASK != task)
290 bool end_draw_finished = true;
297 TaskVisible::NO_CHANGE,
301 actions.push_back(act);
307 void PMWrapper::createLayoutChangeAction(json_object *json_out, std::vector<WMAction> &actions)
309 // Get displayed roles from previous layout
310 json_object *json_layers;
311 if (!json_object_object_get_ex(json_out, "layers", &json_layers))
313 HMI_DEBUG("Not found key \"layers\"");
317 int len = json_object_array_length(json_layers);
318 HMI_DEBUG("json_layers len:%d", len);
320 for (int i = 0; i < len; i++)
322 json_object *json_tmp = json_object_array_get_idx(json_layers, i);
324 std::string layer_name = jh::getStringFromJson(json_tmp, "name");
325 json_bool changed = jh::getBoolFromJson(json_tmp, "changed");
326 HMI_DEBUG("layer:%s changed:%d", layer_name.c_str(), changed);
330 json_object *json_areas;
331 if (!json_object_object_get_ex(json_tmp, "areas", &json_areas))
333 HMI_DEBUG("Not found key \"areas\"");
337 int len = json_object_array_length(json_areas);
338 HMI_DEBUG("json_layers len:%d", len);
340 // Store previous role state in this layer
341 this->prvlayer2rolestate[layer_name] = this->crrlayer2rolestate[layer_name];
344 RoleState prv_roles = this->prvlayer2rolestate[layer_name];
345 for (int j = 0; j < len; j++)
347 json_object *json_tmp2 = json_object_array_get_idx(json_areas, j);
349 std::string area_name = jh::getStringFromJson(json_tmp2, "name");
350 std::string role_name = jh::getStringFromJson(json_tmp2, "role");
352 crr_roles[role_name] = area_name;
354 auto i_prv = prv_roles.find(role_name);
355 HMI_DEBUG("current role:%s area:%s",
356 role_name.c_str(), area_name.c_str());
358 // If current role does not exist in previous
359 if (prv_roles.end() == i_prv)
361 HMI_DEBUG("current role does not exist in previous");
363 // Set activate action
364 bool end_draw_finished = false;
371 TaskVisible::VISIBLE,
373 TaskCarState::NO_TASK
375 actions.push_back(act);
379 HMI_DEBUG("previous role:%s area:%s",
380 i_prv->first.c_str(), i_prv->second.c_str());
382 // If current role exists in previous and area is different with previous
383 if (area_name != i_prv->second)
385 HMI_DEBUG("current role exists in previous and area is different with previous");
387 // Set activate action
388 bool end_draw_finished = false;
395 TaskVisible::VISIBLE,
397 TaskCarState::NO_TASK
399 actions.push_back(act);
402 // Remove role which exist in current list from previous list
403 prv_roles.erase(i_prv);
407 // Deactivate roles which remains in previous list
408 // because these are not displayed in current layout
409 for (auto i_prv : prv_roles)
411 HMI_DEBUG("Deactivate role:%s", i_prv.first.c_str());
413 // Set deactivate action
414 bool end_draw_finished = true;
421 TaskVisible::INVISIBLE,
423 TaskCarState::NO_TASK
425 actions.push_back(act);
428 // Update previous role list
429 this->crrlayer2rolestate[layer_name] = crr_roles;
434 void PMWrapper::processError()