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.
18 #include "low_can_client.hpp"
19 #include "json_helper.hpp"
20 #include "hmi-debug.h"
23 #include <afb/afb-binding.h>
29 LowCanClient::LowCanClient() :
32 headlamp_status_(FALSE),
33 parking_brake_status_(TRUE),
35 accel_pedal_stt_(FALSE),
36 lightstatus_brake_status_(TRUE),
37 is_changed_accel_pedal_stt_(false)
39 HMI_DEBUG("wm:lcc", "Call");
42 void LowCanClient::initialize() {
43 HMI_DEBUG("wm:lcc", "Call");
47 // Require API "low-can"
48 ret = afb_daemon_require_api_v2("low-can", 1);
50 HMI_INFO("wm:lcc", "Requirement API \"low-can\" failed");
54 // Subscribe low-level-can
55 // low-can subscribe { "event": "vehicle.speed" }
56 // low-can subscribe { "event": "transmission_gear_position" }
57 // low-can subscribe { "event": "headlamp_status" }
58 // low-can subscribe { "event": "parking_brake_status" }
59 // low-can subscribe { "event": "accelerator.pedal.position" }
60 // low-can subscribe { "event": "lightstatus.brake" }
61 for (int i=SignalNoMin; i<=SignalNoMax; i++) {
63 json_object *json_obj = json_object_new_object();
64 json_object_object_add(json_obj, "event",
65 json_object_new_string(this->kSignalName_[i]));
68 if (0 != strcmp("", this->kFilterValue_[i])) {
69 json_object_object_add(json_obj, "filter",
70 json_tokener_parse(this->kFilterValue_[i]));
72 HMI_DEBUG("wm:lcc", "subscribe message:%s", json_object_get_string(json_obj));
75 json_object *json_result = json_object_new_object();
76 ret = afb_service_call_sync("low-can", "subscribe", json_obj, &json_result);
78 HMI_INFO("wm:lcc", "Could not subscribe to \"low-can\" :%d", ret);
80 HMI_DEBUG("wm:lcc", "subscribe result:%s", json_object_get_string(json_result));
86 const char* LowCanClient::analyzeCanSignal(struct json_object *object) {
87 HMI_DEBUG("wm:lcc", "object:%s", json_object_get_string(object));
89 const char* name = jh::getStringFromJson(object, "name");
90 HMI_DEBUG("wm:lcc", "CAN signal name:%s", name);
92 if (strstr(name, this->kSignalName_[SignalNoVehicliSpeed])) {
93 // Update vehicle speed
94 this->vehicle_speed_ = jh::getIntFromJson(object, "value");
95 HMI_DEBUG("wm:lcc", "Update vehicle speed:%d", this->vehicle_speed_);
97 else if (strstr(name, this->kSignalName_[SignalNoTransGearPos])) {
98 // Update transmission gear position
99 this->trans_gear_pos_ = jh::getIntFromJson(object, "value");
100 HMI_DEBUG("wm:lcc", "Update transmission gear position:%d", this->trans_gear_pos_);
102 else if (strstr(name, this->kSignalName_[SignalNoHeadlame])) {
103 // Update headlamp status
104 this->headlamp_status_ = jh::getBoolFromJson(object, "value");
105 HMI_DEBUG("wm:lcc", "Update headlamp status:%d", this->headlamp_status_);
107 else if (strstr(name, this->kSignalName_[SignalNoParkingBrake])) {
108 // Update parking gear status
109 this->parking_brake_status_ = jh::getBoolFromJson(object, "value");
110 HMI_DEBUG("wm:lcc", "Update parking brake status:%d", this->parking_brake_status_);
112 else if (strstr(name, this->kSignalName_[SignalNoAccelPedalPos])) {
113 // Clear flag for whether accel pedal state is changed
114 this->is_changed_accel_pedal_stt_ = false;
116 // Update accelerator pedal status
117 this->accel_pedal_pos_ = jh::getDoubleFromJson(object, "value");
118 HMI_DEBUG("wm:lcc", "Update accelerator pedal position:%lf", this->accel_pedal_pos_);
120 bool accel_pedal_stt;
121 if (0 != this->accel_pedal_pos_) {
122 accel_pedal_stt = true;
125 accel_pedal_stt = false;
128 if (accel_pedal_stt != this->accel_pedal_stt_) {
129 this->is_changed_accel_pedal_stt_ = true;
130 this->accel_pedal_stt_ = accel_pedal_stt;
133 else if (strstr(name, this->kSignalName_[SignalNoLightstatusBrake])) {
134 // Update lightstatus brake status
135 this->lightstatus_brake_status_ = jh::getBoolFromJson(object, "value");
136 HMI_DEBUG("wm:lcc", "Update lightstatus brake status:%d", this->lightstatus_brake_status_);
142 bool LowCanClient::isChangedAccelPedalState() {
143 HMI_DEBUG("wm:lcc", "Call");
145 return this->is_changed_accel_pedal_stt_;
148 int LowCanClient::getCurrentTransGearState() {
149 HMI_DEBUG("wm:lcc", "Call");
151 return this->trans_gear_pos_;
154 bool LowCanClient::getCurrentHeadlampState() {
155 HMI_DEBUG("wm:lcc", "Call");
157 return (bool)this->headlamp_status_;
160 bool LowCanClient::getCurrentParkingBrakeState() {
161 HMI_DEBUG("wm:lcc", "Call");
163 return (bool)this->parking_brake_status_;
166 double LowCanClient::getCurrentAccelPedalPosition() {
167 HMI_DEBUG("wm:lcc", "Call");
169 return this->accel_pedal_pos_;
172 bool LowCanClient::getCurrentAccelPedalState() {
173 HMI_DEBUG("wm:lcc", "Call");
175 return this->accel_pedal_stt_;
178 bool LowCanClient::getCurrentLightstatusBrakeState() {
179 HMI_DEBUG("wm:lcc", "Call");
181 return (bool)this->lightstatus_brake_status_;