can-bus: Use configuration from JSON file 20/23220/6
authorRomain Forlot <romain.forlot@iot.bzh>
Wed, 20 Nov 2019 14:31:14 +0000 (15:31 +0100)
committerRomain Forlot <romain.forlot@iot.bzh>
Thu, 9 Jan 2020 14:55:03 +0000 (15:55 +0100)
Use configuration from JSON file instead of the old INI file. Now all configuration files
lies within the binding tree.

Bug-AGL: SPEC-2988

Change-Id: Id986d19751db958ad5cf3b7f2b2c5443d4ceb062
Signed-off-by: Romain Forlot <romain.forlot@iot.bzh>
conf.d/project/etc/control-low-can.json
low-can-binding/CMakeLists.txt
low-can-binding/binding/application.cpp
low-can-binding/binding/low-can-cb.cpp
low-can-binding/can/can-bus.cpp
low-can-binding/can/can-bus.hpp
low-can-binding/utils/config-parser.cpp [deleted file]
low-can-binding/utils/config-parser.hpp [deleted file]

index e59c39c..0b10d33 100644 (file)
@@ -8,6 +8,10 @@
        },
        "config": {
                "active_message_set": 0,
+               "dev-mapping": {
+                       "hs": "can0",
+                       "ls": "can0"
+               },
                "diagnostic_bus": "hs"
        },
        "plugins": [
index bd304dc..cba07bf 100644 (file)
@@ -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
        )
 
index 063a11d..bb3bf15 100644 (file)
 #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()
 {
index 35c6d9e..3037994 100644 (file)
@@ -65,6 +65,7 @@ int config_low_can(afb_api_t apiHandle, CtlSectionT *section, json_object *json_
        application_t *application = (application_t*) ctrlConfig->external;
 
        int active_message_set;
+       json_object *dev_mapping = nullptr;
        const char *diagnotic_bus = nullptr;
 
        if(wrap_json_unpack(json_obj, "{si, ss}",
@@ -74,6 +75,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))
@@ -867,7 +874,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();
 
index ddf5491..cbe3cda 100644 (file)
@@ -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
index 6b0cc13..5aa7a1d 100644 (file)
@@ -26,7 +26,6 @@
 #include <condition_variable>
 #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<low_can_subscription_t> can_subscription);
        void process_signals(std::shared_ptr<message_t> message, map_subscription& s);
        void process_diagnostic_signals(diagnostic_manager_t& manager, std::shared_ptr<message_t> can_message, map_subscription& s);
@@ -68,11 +65,12 @@ private:
 
        std::vector<std::pair<std::string, std::string> > 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 (file)
index 820c6d9..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright (C) 2015, 2016 , 2017, 2018, 2019 "IoT\.bzh"
- * Author "Romain Forlot" <romain.forlot@iot.bzh>
- *
- * 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<std::pair<std::string, std::string> > config_parser_t::get_devices_name()
-       {
-               std::vector<std::pair<std::string, std::string> > devices_name;
-
-               std::map<std::string, std::string> 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 (file)
index 4553be2..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright (C) 2015, 2016 , 2017, 2018, 2019 "IoT\.bzh"
- * Author "Romain Forlot" <romain.forlot@iot.bzh>
- *
- * 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 <string>
-#include <vector>
-#include <utility>
-#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<std::pair<std::string, std::string> > get_devices_name();
-       };
-}