From 1f57e04d955877654ce4ac055dbb533281ce4af5 Mon Sep 17 00:00:00 2001 From: Romain Forlot Date: Wed, 20 Nov 2019 15:31:14 +0100 Subject: [PATCH] can-bus: Use configuration from JSON file Use configuration from JSON file instead of the old INI file. Now all configuration files lies within the binding tree. Change-Id: Id986d19751db958ad5cf3b7f2b2c5443d4ceb062 Signed-off-by: Romain Forlot --- conf.d/project/etc/control-low-can.json | 4 ++ low-can-binding/CMakeLists.txt | 1 - low-can-binding/binding/application.cpp | 5 +++ low-can-binding/binding/low-can-cb.cpp | 7 +++- low-can-binding/can/can-bus.cpp | 44 +++++++++++----------- low-can-binding/can/can-bus.hpp | 8 ++-- low-can-binding/utils/config-parser.cpp | 67 --------------------------------- low-can-binding/utils/config-parser.hpp | 44 ---------------------- 8 files changed, 41 insertions(+), 139 deletions(-) delete mode 100644 low-can-binding/utils/config-parser.cpp delete mode 100644 low-can-binding/utils/config-parser.hpp diff --git a/conf.d/project/etc/control-low-can.json b/conf.d/project/etc/control-low-can.json index e59c39c4..0b10d33d 100644 --- a/conf.d/project/etc/control-low-can.json +++ b/conf.d/project/etc/control-low-can.json @@ -8,6 +8,10 @@ }, "config": { "active_message_set": 0, + "dev-mapping": { + "hs": "can0", + "ls": "can0" + }, "diagnostic_bus": "hs" }, "plugins": [ diff --git a/low-can-binding/CMakeLists.txt b/low-can-binding/CMakeLists.txt index bd304dc9..cba07bf5 100644 --- a/low-can-binding/CMakeLists.txt +++ b/low-can-binding/CMakeLists.txt @@ -58,7 +58,6 @@ PROJECT_TARGET_ADD(low-can) utils/socketcan.cpp #utils/socketcan-raw.cpp utils/socketcan-bcm.cpp - utils/config-parser.cpp utils/converter.cpp ) diff --git a/low-can-binding/binding/application.cpp b/low-can-binding/binding/application.cpp index 063a11da..bb3bf15b 100644 --- a/low-can-binding/binding/application.cpp +++ b/low-can-binding/binding/application.cpp @@ -25,6 +25,11 @@ #define MICROSECONDS_IN_SECOND 1000000 #define ENGINE_VALUE_TIMEOUT 5 +application_t::application_t() + : can_bus_manager_{} + , message_set_{} +{} + /// @brief Return singleton instance of configuration object. application_t& application_t::instance() { diff --git a/low-can-binding/binding/low-can-cb.cpp b/low-can-binding/binding/low-can-cb.cpp index d1325d35..7182dbfc 100644 --- a/low-can-binding/binding/low-can-cb.cpp +++ b/low-can-binding/binding/low-can-cb.cpp @@ -73,6 +73,12 @@ int config_low_can(afb_api_t apiHandle, CtlSectionT *section, json_object *json_ application->set_active_message_set((uint8_t)active_message_set); + if(wrap_json_unpack(json_obj, "{so}", + "dev-mapping", &dev_mapping)) + return -1; + + application->get_can_bus_manager().set_can_devices(dev_mapping); + /// Initialize Diagnostic manager that will handle obd2 requests. /// We pass by default the first CAN bus device to its Initialization. if(! application_t::instance().get_diagnostic_manager().initialize(diagnotic_bus)) @@ -865,7 +871,6 @@ int init_binding(afb_api_t api) return -1; } - can_bus_manager.set_can_devices(); can_bus_manager.start_threads(); utils::signals_manager_t& sm = utils::signals_manager_t::instance(); diff --git a/low-can-binding/can/can-bus.cpp b/low-can-binding/can/can-bus.cpp index ddf54918..cbe3cda7 100644 --- a/low-can-binding/can/can-bus.cpp +++ b/low-can-binding/can/can-bus.cpp @@ -44,12 +44,31 @@ can_bus_t::~can_bus_t() } /// @brief Class constructor -/// -/// @param[in] conf_file - handle to the json configuration file. -can_bus_t::can_bus_t(utils::config_parser_t conf_file) - : conf_file_{conf_file} +can_bus_t::can_bus_t() {} +/// @brief Fills the CAN device map member with value from device +/// +/// @param[in] mapping configuration section. +void can_bus_t::set_can_devices(json_object *mapping) +{ + if (! mapping) + { + AFB_ERROR("Can't initialize CAN buses with this empty mapping."); + return; + } + + struct json_object_iterator it = json_object_iter_begin(mapping); + struct json_object_iterator end = json_object_iter_end(mapping); + while (! json_object_iter_equal(&it, &end)) { + can_devices_mapping_.push_back(std::make_pair( + json_object_iter_peek_name(&it), + json_object_get_string(json_object_iter_peek_value(&it)) + )); + json_object_iter_next(&it); + } +} + /// @brief Take a decoded message to determine if its value complies with the desired /// filters. /// @@ -303,23 +322,6 @@ void can_bus_t::push_new_vehicle_message(int subscription_id, const openxc_Vehic vehicle_message_q_.push(std::make_pair(subscription_id, v_msg)); } -/// @brief Fills the CAN device map member with value from device -/// mapping configuration file read at initialization. -void can_bus_t::set_can_devices() -{ - if(conf_file_.check_conf()) - { - can_devices_mapping_ = conf_file_.get_devices_name(); - - if(can_devices_mapping_.empty()) - { - AFB_ERROR("No mapping found in config file: '%s'. Check it that it have a CANbus-mapping section.", - conf_file_.filepath().c_str()); - } - } -} - - /// @brief Return the CAN device index from the map /// map are sorted so index depend upon alphabetical sorting. int can_bus_t::get_can_device_index(const std::string& bus_name) const diff --git a/low-can-binding/can/can-bus.hpp b/low-can-binding/can/can-bus.hpp index 6b0cc133..5aa7a1d5 100644 --- a/low-can-binding/can/can-bus.hpp +++ b/low-can-binding/can/can-bus.hpp @@ -26,7 +26,6 @@ #include #include "openxc.pb.h" #include "message/can-message.hpp" -#include "../utils/config-parser.hpp" #include "../binding/low-can-subscription.hpp" #define CAN_ACTIVE_TIMEOUT_S 30 @@ -43,8 +42,6 @@ class diagnostic_manager_t; class can_bus_t { private: - utils::config_parser_t conf_file_; ///< configuration file handle used to initialize can_bus_dev_t objects. - bool apply_filter(const openxc_VehicleMessage& vehicle_message, std::shared_ptr can_subscription); void process_signals(std::shared_ptr message, map_subscription& s); void process_diagnostic_signals(diagnostic_manager_t& manager, std::shared_ptr can_message, map_subscription& s); @@ -68,11 +65,12 @@ private: std::vector > can_devices_mapping_; ///< can_devices_mapping_ - holds a mapping between logical CAN devices names and linux CAN devices names. public: - explicit can_bus_t(utils::config_parser_t conf_file); + explicit can_bus_t(); can_bus_t(can_bus_t&&); ~can_bus_t(); - void set_can_devices(); + void set_can_devices(json_object *mapping); + int get_can_device_index(const std::string& bus_name) const; const std::string get_can_device_name(const std::string& id_name) const; diff --git a/low-can-binding/utils/config-parser.cpp b/low-can-binding/utils/config-parser.cpp deleted file mode 100644 index 820c6d9b..00000000 --- a/low-can-binding/utils/config-parser.cpp +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (C) 2015, 2016 , 2017, 2018, 2019 "IoT\.bzh" - * Author "Romain Forlot" - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "config-parser.hpp" - -#include "../binding/low-can-hat.hpp" - -namespace utils -{ - /// @brief constructor using path to file - config_parser_t::config_parser_t(std::string conf_file) - : filepath_{conf_file}, config_content_{} - { - config_content_.read_file(conf_file); - } - - const std::string& config_parser_t::filepath() const - { - return filepath_; - } - - /// @brief read the conf_file_ and parse it into an INIReader object - /// to search into later. - bool config_parser_t::check_conf() - { - if (config_content_.size() <= 0) - { - AFB_ERROR("Can't load the INI config file: /etc/dev-mapping.conf."); - return false; - } - AFB_DEBUG("Configuration file parsed"); - return true; - } - - /// @brief Public method to access devices_name_ vector. If vector size equal 0 - /// then it will parses the configuration file content to fill it. It could be empty even - /// after parsing if content file just don't have a correct "canbus" directive so you - /// have to test the returned value. - /// - /// @return A const vector with string of linux CAN devices. - const std::vector > config_parser_t::get_devices_name() - { - std::vector > devices_name; - - std::map bus_mapping = config_content_.get_keys("CANbus-mapping"); - for(const auto& busIt : bus_mapping ) - { - devices_name.push_back(std::make_pair(busIt.first, busIt.second)); - } - - return devices_name; - } -} diff --git a/low-can-binding/utils/config-parser.hpp b/low-can-binding/utils/config-parser.hpp deleted file mode 100644 index 4553be2d..00000000 --- a/low-can-binding/utils/config-parser.hpp +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (C) 2015, 2016 , 2017, 2018, 2019 "IoT\.bzh" - * Author "Romain Forlot" - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#pragma once - -#include -#include -#include -#include "ini-config.hpp" - -namespace utils -{ - /// @brief A configuration file parser that handle INI configuration - /// file format. - class config_parser_t - { - private: - const std::string filepath_; /*!< filepath_ - Path to the config file*/ - ini_config config_content_; /*!< config_content_ - Parsed content of INI file.*/ - - public: - config_parser_t(config_parser_t&&) = default; - config_parser_t(const config_parser_t&) = default; - explicit config_parser_t(std::string conf_file); - - const std::string& filepath() const; - bool check_conf(); - const std::vector > get_devices_name(); - }; -} -- 2.16.6