Add parking brake ON/OFF event
authorYuta Doi <yuta-d@witz-inc.co.jp>
Wed, 9 May 2018 04:34:19 +0000 (13:34 +0900)
committerYuta Doi <yuta-d@witz-inc.co.jp>
Wed, 9 May 2018 04:34:19 +0000 (13:34 +0900)
Change-Id: I3b9face35972a275918ac4f95f4a97df035ee924
Signed-off-by: Yuta Doi <yuta-d@witz-inc.co.jp>
src/CMakeLists.txt
src/app.cpp
src/app.hpp
src/low_can_client.cpp
src/low_can_client.hpp
src/main.cpp
src/policy_manager/policy_manager.cpp
src/policy_manager/policy_manager.hpp
src/policy_manager/zipc/dummy_stm.c
src/policy_manager/zipc/dummy_stm.h

index 0ce8bb8..60c9394 100644 (file)
@@ -66,7 +66,7 @@ target_link_libraries(${TARGETS_WM}
         ${AFB_LIBRARIES}
         ${WLC_LIBRARIES}
         ${SD_LIBRARIES}
-       ${PLUGIN_PM}
+        ${PLUGIN_PM}
 )
 
 target_compile_definitions(${TARGETS_WM}
index 20f5b56..afd690f 100644 (file)
@@ -351,14 +351,40 @@ void App::allocateWindowResource(char const *event, char const *drawing_name,
     // 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
@@ -378,7 +404,7 @@ void App::allocateWindowResource(char const *event, char const *drawing_name,
         }
     }
 
-    // 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\"");
@@ -587,6 +613,16 @@ void App::emitHeadlampOn() {
     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]);
index 9ab1280..57ffee2 100644 (file)
@@ -148,6 +148,9 @@ struct App {
       Event_HeadlampOff,
       Event_HeadlampOn,
 
+      Event_ParkingBrakeOff,
+      Event_ParkingBrakeOn,
+
       Event_CarStop,
       Event_CarRun,
 
@@ -163,6 +166,8 @@ struct App {
      "flushdraw",
      "headlamp_off",
      "headlamp_on",
+     "parking_brake_off",
+     "parking_brake_on",
      "car_stop",
      "car_run",
    };
@@ -269,6 +274,8 @@ private:
    void emit_visible(char const *label);
    void emitHeadlampOff();
    void emitHeadlampOn();
+   void emitParkingBrakeOff();
+   void emitParkingBrakeOn();
    void emitCarStop();
    void emitCarRun();
 
index 23a39e2..2db565c 100644 (file)
@@ -29,7 +29,7 @@ namespace wm {
 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"),
@@ -102,10 +102,10 @@ void LowCanClient::analyzeCanSignal(struct json_object *object) {
     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")) {
@@ -118,8 +118,17 @@ void LowCanClient::analyzeCanSignal(struct json_object *object) {
         }
     }
 
+    // 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 {
@@ -136,6 +145,15 @@ void LowCanClient::analyzeCanSignal(struct json_object *object) {
     }
     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_) {
@@ -155,6 +173,13 @@ void LowCanClient::analyzeCanSignal(struct json_object *object) {
     }
 }
 
+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");
 
@@ -169,6 +194,16 @@ bool LowCanClient::isChangedLampState() {
     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");
 
index 5119c23..ea441be 100644 (file)
@@ -32,8 +32,10 @@ public:
 
     void initialize();
     void analyzeCanSignal(struct json_object *object);
+    bool isChangedParkingBrakeState();
     bool isChangedCarState();
     bool isChangedLampState();
+    const char* getCurrentParkingBrakeState();
     const char* getCurrentCarState();
     const char* getCurrentLampState();
 
@@ -54,14 +56,17 @@ private:
 
     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_;
 };
index 067a006..7abdfb0 100644 (file)
@@ -667,7 +667,23 @@ void on_event(const char *event, struct json_object *object){
         // 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");
 
index 61d1d7c..47d9eac 100644 (file)
 #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_(),
@@ -124,19 +46,19 @@ int PolicyManager::initialize() {
     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
@@ -210,30 +132,43 @@ int PolicyManager::checkPolicy(json_object* json_in, json_object** json_out) {
 
     // 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": [
@@ -247,7 +182,7 @@ int PolicyManager::checkPolicy(json_object* json_in, json_object** json_out) {
     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);
 
@@ -260,7 +195,7 @@ int PolicyManager::checkPolicy(json_object* json_in, json_object** json_out) {
     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);
 
@@ -275,7 +210,7 @@ int PolicyManager::checkPolicy(json_object* json_in, json_object** json_out) {
     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);
 
index 500120c..e3ee621 100644 (file)
 #include <unordered_map>
 #include <vector>
 
-//namespace stm {
+namespace stm {
 extern "C" {
 #include "dummy_stm.h"
 }
-//} // namespace stm
+} // namespace stm
 
 class PolicyManager {
 
@@ -52,7 +52,7 @@ private:
     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();
index 3c9cba2..78e25d7 100644 (file)
@@ -1,7 +1,93 @@
-
 #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;
@@ -209,4 +295,3 @@ int stmTransitionState(int event, stm_state_t* state) {
 
     return 0;
 }
-
index 18af99b..ae438db 100644 (file)
 #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
@@ -77,32 +89,20 @@ enum stm_layout_ {
 };
 
 
-#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;
@@ -114,8 +114,8 @@ typedef struct stm_layer_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;