${AFB_LIBRARIES}
${WLC_LIBRARIES}
${SD_LIBRARIES}
- ${PLUGIN_PM}
+ ${PLUGIN_PM}
)
target_compile_definitions(${TARGETS_WM}
// Release json_object
json_object_put(json_in);
- // Cat state
+ // Check parking brake state
+ json_object* json_parking_brake;
+ if (!json_object_object_get_ex(json_out, "parking_brake", &json_parking_brake)) {
+ reply("Not found key \"parking_brake\"");
+ return;
+ }
+
+ json_bool is_changed;
+ is_changed = jh::getBoolFromJson(json_parking_brake, "is_changed");
+ if (is_changed) {
+ // Update parking brake state
+ std::string parking_brake_state = jh::getStringFromJson(json_parking_brake, "state");
+ HMI_DEBUG("wm", "parking_brake_state: %s", parking_brake_state.c_str());
+
+ // Emit parking brake event
+ if ("parking_brake_off" == parking_brake_state) {
+ this->emitParkingBrakeOff();
+ }
+ else if ("parking_brake_on" == parking_brake_state) {
+ this->emitParkingBrakeOn();
+ }
+ else {
+ reply("Unknown parking brake state");
+ return;
+ }
+ }
+
+ // Check car state
json_object* json_car;
if (!json_object_object_get_ex(json_out, "car", &json_car)) {
reply("Not found key \"car\"");
return;
}
- json_bool is_changed;
is_changed = jh::getBoolFromJson(json_car, "is_changed");
if (is_changed) {
// Update car state
}
}
- // Lamp state
+ // Check lamp state
json_object* json_lamp;
if (!json_object_object_get_ex(json_out, "lamp", &json_lamp)) {
reply("Not found key \"lamp\"");
this->send_event(kListEventName[Event_HeadlampOn]);
}
+void App::emitParkingBrakeOff() {
+ // Send ParkingBrakeOff event for all application
+ this->send_event(kListEventName[Event_ParkingBrakeOff]);
+}
+
+void App::emitParkingBrakeOn() {
+ // Send ParkingBrakeOn event for all application
+ this->send_event(kListEventName[Event_ParkingBrakeOn]);
+}
+
void App::emitCarStop() {
// Send CarStop event for all application
this->send_event(kListEventName[Event_CarStop]);
Event_HeadlampOff,
Event_HeadlampOn,
+ Event_ParkingBrakeOff,
+ Event_ParkingBrakeOn,
+
Event_CarStop,
Event_CarRun,
"flushdraw",
"headlamp_off",
"headlamp_on",
+ "parking_brake_off",
+ "parking_brake_on",
"car_stop",
"car_run",
};
void emit_visible(char const *label);
void emitHeadlampOff();
void emitHeadlampOn();
+ void emitParkingBrakeOff();
+ void emitParkingBrakeOn();
void emitCarStop();
void emitCarRun();
LowCanClient::LowCanClient() :
vehicle_speed_(0),
trans_gear_pos_(0),
- park_brake_status_(TRUE),
+ parking_brake_status_(TRUE),
headlamp_status_(FALSE),
prv_car_state_("car_stop"),
crr_car_state_("car_stop"),
else if (strstr(name, "parking_brake_status")) {
HMI_DEBUG("wm:lcc", "Receive parking brake status");
// Update parking gear status
- json_bool park_brake = jh::getBoolFromJson(object, "value");
- if (this->park_brake_status_ != park_brake) {
- this->park_brake_status_ = park_brake;
- HMI_DEBUG("wm:lcc", "Update parking brake status:%d", this->park_brake_status_);
+ json_bool parking_brake = jh::getBoolFromJson(object, "value");
+ if (this->parking_brake_status_ != parking_brake) {
+ this->parking_brake_status_ = parking_brake;
+ HMI_DEBUG("wm:lcc", "Update parking brake status:%d", this->parking_brake_status_);
}
}
else if (strstr(name, "headlamp_status")) {
}
}
+ // Update parking brake state
+ if (this->parking_brake_status_) {
+ this->crr_parking_brake_state_ = "parking_brake_on";
+ }
+ else {
+ this->crr_parking_brake_state_ = "parking_brake_off";
+ }
+ HMI_DEBUG("wm:lcc", "Current parking brake state:%s", this->crr_parking_brake_state_.c_str());
+
// Update car state
- if ((0 == this->vehicle_speed_) || (true == this->park_brake_status_)) {
+ if ((0 == this->vehicle_speed_) || (true == this->parking_brake_status_)) {
this->crr_car_state_ = "car_stop";
}
else {
}
HMI_DEBUG("wm:lcc", "Current lamp state:%s", this->crr_lamp_state_.c_str());
+ // If parking brake state is changed,
+ // backup current state for previous state and set flag
+ if (this->prv_parking_brake_state_ != this->crr_parking_brake_state_) {
+ HMI_DEBUG("wm:lcc", "Parking Brake state is changed: %s -> %s",
+ this->prv_parking_brake_state_.c_str(), this->crr_parking_brake_state_.c_str());
+ this->prv_parking_brake_state_ = this->crr_parking_brake_state_;
+ this->is_changed_parking_brake_state_ = true;
+ }
+
// If car state is changed,
// backup current state for previous state and set flag
if (this->prv_car_state_ != this->crr_car_state_) {
}
}
+bool LowCanClient::isChangedParkingBrakeState() {
+ HMI_DEBUG("wm:lcc", "Call");
+
+ // Return changed flag
+ return this->is_changed_parking_brake_state_;
+}
+
bool LowCanClient::isChangedCarState() {
HMI_DEBUG("wm:lcc", "Call");
return this->is_changed_lamp_state_;
}
+const char* LowCanClient::getCurrentParkingBrakeState() {
+ HMI_DEBUG("wm:lcc", "Call");
+
+ // Clear changed flag
+ this->is_changed_parking_brake_state_ = false;
+
+ // Return current parking brake state
+ return this->crr_parking_brake_state_.c_str();
+}
+
const char* LowCanClient::getCurrentCarState() {
HMI_DEBUG("wm:lcc", "Call");
void initialize();
void analyzeCanSignal(struct json_object *object);
+ bool isChangedParkingBrakeState();
bool isChangedCarState();
bool isChangedLampState();
+ const char* getCurrentParkingBrakeState();
const char* getCurrentCarState();
const char* getCurrentLampState();
int vehicle_speed_;
int trans_gear_pos_;
- json_bool park_brake_status_;
+ json_bool parking_brake_status_;
json_bool headlamp_status_;
+ std::string prv_parking_brake_state_;
+ std::string crr_parking_brake_state_;
std::string prv_car_state_;
std::string crr_car_state_;
std::string prv_lamp_state_;
std::string crr_lamp_state_;
+ bool is_changed_parking_brake_state_;
bool is_changed_car_state_;
bool is_changed_lamp_state_;
};
// Analyze low can signal
g_afb_instance->lcc_.analyzeCanSignal(object);
- if (g_afb_instance->lcc_.isChangedCarState()) {
+ if (g_afb_instance->lcc_.isChangedParkingBrakeState()) {
+ // If parking brake state is changed
+ HMI_DEBUG("wm", "Parking Brake state is changed");
+
+ // Get parking brake state
+ const char* parking_brake_state = g_afb_instance->lcc_.getCurrentParkingBrakeState();
+
+ // Allocate window resource
+ g_afb_instance->app.allocateWindowResource(parking_brake_state, nullptr,
+ nullptr, nullptr,
+ [](const char* errmsg){
+ if (errmsg != nullptr) {
+ HMI_ERROR("wm", errmsg);
+ }
+ });
+ }
+ else if (g_afb_instance->lcc_.isChangedCarState()) {
// If car state is changed
HMI_DEBUG("wm", "Car state is changed");
#include <istream>
#include <json-c/json.h>
#include "policy_manager.hpp"
+#if 0
+extern "C" {
#include "dummy_stm.h"
+}
+#endif
#include "hmi-debug.h"
-namespace {
-
-static const char* kEventName[] = {
- "activate",
- "deactivate",
- "car_stop",
- "car_run",
- "timer_expired",
- "lamp_off",
- "lamp_on"
-};
-
-static const int kEventNo[] = {
- STM_EVT_NO_ACTIVATE,
- STM_EVT_NO_DEACTIVATE,
- STM_EVT_NO_CAR_STOP,
- STM_EVT_NO_CAR_RUN,
- STM_EVT_NO_TIMER_EXPIRED,
- STM_EVT_NO_LAMP_OFF,
- STM_EVT_NO_LAMP_ON
-};
-
-static const char* kCategoryName[] = {
- "homescreen",
- "map",
- "general",
- "splitable",
- "popup",
- "system_alert"
-};
-
-static const int kCategoryNo[] = {
- STM_CTG_NO_HOMESCREEN,
- STM_CTG_NO_MAP,
- STM_CTG_NO_GENERAL,
- STM_CTG_NO_SPLITABLE,
- STM_CTG_NO_POPUP,
- STM_CTG_NO_SYSTEM_ALERT
-};
-
-static const char* kAreaName[] = {
- "full",
- "normal",
- "split.main",
- "split.sub",
- "onscreen"
-};
-
-static const int kAreaNo[] = {
- STM_ARA_NO_FULL,
- STM_ARA_NO_NORMAL,
- STM_ARA_NO_SPLIT_MAIN,
- STM_ARA_NO_SPLIT_SUB,
- STM_ARA_NO_ON_SCREEN
-};
-
-// String for state
-const char* gStmCarStateNo2Name[] = {
- "car_stop",
- "car_run"
-};
-
-const char* gStmLampStateNo2Name[] = {
- "lamp_off",
- "lamp_on"
-};
-
-const char* gStmLayoutNo2Name[] = {
- "none",
- "pu",
- "sa",
- "m1",
- "m2",
- "mf",
- "s1",
- "s2",
- "g",
- "hs",
-};
-
-} // namespace
-
PolicyManager::PolicyManager() :
eventname2no_(),
categoryname2no_(),
int ret = 0;
// Create convert map
- for (unsigned int i=0; i<(sizeof(kEventNo)/sizeof(int)); i++) {
- HMI_DEBUG("wm:pm", "event name:%s no:%d", kEventName[i], kEventNo[i]);
- this->eventname2no_[kEventName[i]] = kEventNo[i];
+ for (unsigned int i=0; i<STM_NUM_EVT; i++) {
+ HMI_DEBUG("wm:pm", "event name:%s no:%d", stm::gStmEventName[i], stm::gStmEventNo[i]);
+ this->eventname2no_[stm::gStmEventName[i]] = stm::gStmEventNo[i];
}
- for (unsigned int i=0; i<(sizeof(kCategoryNo)/sizeof(int)); i++) {
- HMI_DEBUG("wm:pm", "category name:%s no:%d", kCategoryName[i], kCategoryNo[i]);
- this->categoryname2no_[kCategoryName[i]] = kCategoryNo[i];
+ for (unsigned int i=0; i<STM_NUM_CTG; i++) {
+ HMI_DEBUG("wm:pm", "category name:%s no:%d", stm::gStmCategoryName[i], stm::gStmCategoryNo[i]);
+ this->categoryname2no_[stm::gStmCategoryName[i]] = stm::gStmCategoryNo[i];
}
- for (unsigned int i=0; i<(sizeof(kAreaNo)/sizeof(int)); i++) {
- HMI_DEBUG("wm:pm", "area name:%s no:%d", kAreaName[i], kAreaNo[i]);
- this->areaname2no_[kAreaName[i]] = kAreaNo[i];
+ for (unsigned int i=0; i<STM_NUM_ARA; i++) {
+ HMI_DEBUG("wm:pm", "area name:%s no:%d", stm::gStmAreaName[i], stm::gStmAreaNo[i]);
+ this->areaname2no_[stm::gStmAreaName[i]] = stm::gStmAreaNo[i];
}
// Load role.db
// Create result
// {
+ // "parking_brake": {
+ // "is_changed": <bool>,
+ // "state": <const char*>
+ // },
+ HMI_DEBUG("wm", "parking brake state (is_changed:%d state:%d:%s)",
+ this->current_state_.parking_brake.is_changed,
+ this->current_state_.parking_brake.state,
+ stm::gStmCarStateNo2Name[this->current_state_.parking_brake.state]);
+ this->addStateToJson("parking_brake",
+ this->current_state_.parking_brake.is_changed,
+ stm::gStmParkingBrakeStateNo2Name[this->current_state_.parking_brake.state],
+ json_out);
+
// "car": {
// "is_changed": <bool>,
// "state": <const char*>
// },
- HMI_DEBUG("wm", "@@@@@ car state (is_changed:%d state:%d:%s)",
+ HMI_DEBUG("wm", "car state (is_changed:%d state:%d:%s)",
this->current_state_.car.is_changed,
this->current_state_.car.state,
- gStmCarStateNo2Name[this->current_state_.car.state]);
+ stm::gStmCarStateNo2Name[this->current_state_.car.state]);
this->addStateToJson("car",
this->current_state_.car.is_changed,
- gStmCarStateNo2Name[this->current_state_.car.state],
+ stm::gStmCarStateNo2Name[this->current_state_.car.state],
json_out);
// "lamp": {
// "is_changed": <bool>,
// "state": <const char*>
// },
- HMI_DEBUG("wm", "@@@@@ lamp state (is_changed:%d state:%d:%s)",
+ HMI_DEBUG("wm", "lamp state (is_changed:%d state:%d:%s)",
this->current_state_.lamp.is_changed,
this->current_state_.lamp.state,
- gStmLampStateNo2Name[this->current_state_.lamp.state]);
+ stm::gStmLampStateNo2Name[this->current_state_.lamp.state]);
this->addStateToJson("lamp",
this->current_state_.lamp.is_changed,
- gStmLampStateNo2Name[this->current_state_.lamp.state],
+ stm::gStmLampStateNo2Name[this->current_state_.lamp.state],
json_out);
// "layers": [
json_object* json_tmp = json_object_new_object();
this->addStateToJson("on_screen",
this->current_state_.layer.on_screen.is_changed,
- gStmLayoutNo2Name[this->current_state_.layer.on_screen.state],
+ stm::gStmLayoutNo2Name[this->current_state_.layer.on_screen.state],
&json_tmp);
json_object_array_add(json_layer, json_tmp);
json_tmp = json_object_new_object();
this->addStateToJson("apps",
this->current_state_.layer.apps.is_changed,
- gStmLayoutNo2Name[this->current_state_.layer.apps.state],
+ stm::gStmLayoutNo2Name[this->current_state_.layer.apps.state],
&json_tmp);
json_object_array_add(json_layer, json_tmp);
json_tmp = json_object_new_object();
this->addStateToJson("homescreen",
this->current_state_.layer.homescreen.is_changed,
- gStmLayoutNo2Name[this->current_state_.layer.homescreen.state],
+ stm::gStmLayoutNo2Name[this->current_state_.layer.homescreen.state],
&json_tmp);
json_object_array_add(json_layer, json_tmp);
#include <unordered_map>
#include <vector>
-//namespace stm {
+namespace stm {
extern "C" {
#include "dummy_stm.h"
}
-//} // namespace stm
+} // namespace stm
class PolicyManager {
std::unordered_map<std::string, std::string> category2role_;
std::unordered_map<std::string, std::string> role2defaultarea_;
- stm_state_t current_state_;
+ stm::stm_state_t current_state_;
// Load role.db
int loadRoleDb();
-
#include <string.h>
#include "dummy_stm.h"
+const char* gStmEventName[] = {
+ "activate",
+ "deactivate",
+ "parking_brake_off",
+ "parking_brake_on",
+ "car_stop",
+ "car_run",
+ "timer_expired",
+ "lamp_off",
+ "lamp_on"
+};
+
+const int gStmEventNo[] = {
+ STM_EVT_NO_ACTIVATE,
+ STM_EVT_NO_DEACTIVATE,
+ STM_EVT_NO_PARKING_BRAKE_OFF,
+ STM_EVT_NO_PARKING_BRAKE_ON,
+ STM_EVT_NO_CAR_STOP,
+ STM_EVT_NO_CAR_RUN,
+ STM_EVT_NO_TIMER_EXPIRED,
+ STM_EVT_NO_LAMP_OFF,
+ STM_EVT_NO_LAMP_ON
+};
+
+const char* gStmCategoryName[] = {
+ "homescreen",
+ "map",
+ "general",
+ "splitable",
+ "popup",
+ "system_alert"
+};
+
+const int gStmCategoryNo[] = {
+ STM_CTG_NO_HOMESCREEN,
+ STM_CTG_NO_MAP,
+ STM_CTG_NO_GENERAL,
+ STM_CTG_NO_SPLITABLE,
+ STM_CTG_NO_POPUP,
+ STM_CTG_NO_SYSTEM_ALERT
+};
+
+const char* gStmAreaName[] = {
+ "full",
+ "normal",
+ "split.main",
+ "split.sub",
+ "onscreen"
+};
+
+const int gStmAreaNo[] = {
+ STM_ARA_NO_FULL,
+ STM_ARA_NO_NORMAL,
+ STM_ARA_NO_SPLIT_MAIN,
+ STM_ARA_NO_SPLIT_SUB,
+ STM_ARA_NO_ON_SCREEN
+};
+
+// String for state
+const char* gStmParkingBrakeStateNo2Name[] = {
+ "parking_brake_off",
+ "parking_brake_on"
+};
+
+const char* gStmCarStateNo2Name[] = {
+ "car_stop",
+ "car_run"
+};
+
+const char* gStmLampStateNo2Name[] = {
+ "lamp_off",
+ "lamp_on"
+};
+
+const char* gStmLayoutNo2Name[] = {
+ "none",
+ "pu",
+ "sa",
+ "m1",
+ "m2",
+ "mf",
+ "s1",
+ "s2",
+ "g",
+ "hs",
+};
+
stm_state_t g_crr_state = {0};
stm_state_t g_prv_state = {0};
int g_prv_apps_state_car_stop = 0;
return 0;
}
-
#define STM_FALSE 0
// Event number
-#define STM_EVT_NO_ACTIVATE 0x01
-#define STM_EVT_NO_DEACTIVATE 0x02
-#define STM_EVT_NO_CAR_STOP 0x03
-#define STM_EVT_NO_CAR_RUN 0x04
-#define STM_EVT_NO_TIMER_EXPIRED 0x05
-#define STM_EVT_NO_LAMP_OFF 0x06
-#define STM_EVT_NO_LAMP_ON 0x07
+#define STM_EVT_NO_ACTIVATE 0x01
+#define STM_EVT_NO_DEACTIVATE 0x02
+#define STM_EVT_NO_PARKING_BRAKE_OFF 0x03
+#define STM_EVT_NO_PARKING_BRAKE_ON 0x04
+#define STM_EVT_NO_CAR_STOP 0x05
+#define STM_EVT_NO_CAR_RUN 0x06
+#define STM_EVT_NO_TIMER_EXPIRED 0x07
+#define STM_EVT_NO_LAMP_OFF 0x08
+#define STM_EVT_NO_LAMP_ON 0x09
// Category number
#define STM_CTG_NO_HOMESCREEN 0x0100
#define STM_MSK_CTG_NO 0x00FF00
#define STM_MSK_ARA_NO 0xFF0000
+// Number of events, categories and areas
+#define STM_NUM_EVT 9
+#define STM_NUM_CTG 6
+#define STM_NUM_ARA 5
+
// Enum for state
+enum stm_parking_brake_state_ {
+ gStmParkingBrakeStateNoOff = 0,
+ gStmParkingBrakeStateNoOn
+};
+
enum stm_car_state_ {
gStmCarStateNoStop = 0,
gStmCarStateNoRun
};
-#if 0
-// String for state
-const char* gStmCarStateNo2Name[] {
- "car_stop",
- "car_run"
-};
+extern const char* gStmEventName[];
+extern const int gStmEventNo[];
+extern const char* gStmCategoryName[];
+extern const int gStmCategoryNo[];
+extern const char* gStmAreaName[];
+extern const int gStmAreaNo[];
-const char* gStmLampStateNo2Name[] {
- "lamp_off",
- "lamp_on"
-};
-
-const char* gStmLayoutNo2Name[] {
- "none",
- "pu",
- "sa",
- "m1",
- "m2",
- "mf",
- "s1",
- "s2",
- "g",
- "hs",
-};
-#endif
+// String for state
+extern const char* gStmParkingBrakeStateNo2Name[];
+extern const char* gStmCarStateNo2Name[];
+extern const char* gStmLampStateNo2Name[];
+extern const char* gStmLayoutNo2Name[];
+// Struct for state
typedef struct stm_base_state_ {
int is_changed;
int state;
stm_base_state homescreen;
} stm_layer_state;
-// Struct for state
typedef struct {
+ stm_base_state parking_brake;
stm_base_state car;
stm_base_state lamp;
stm_layer_state layer;