aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRomain Forlot <romain.forlot@iot.bzh>2019-11-20 15:31:14 +0100
committerRomain Forlot <romain.forlot@iot.bzh>2020-01-09 15:55:03 +0100
commit04b7efcdd1a8dfdf461c78d083aabee5445e54bd (patch)
treeccb146ebee3324b2e220430d476b1d9addaa451c
parent47322aceac11e3142af4339260a74ccfba675e17 (diff)
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. Bug-AGL: SPEC-2988 Change-Id: Id986d19751db958ad5cf3b7f2b2c5443d4ceb062 Signed-off-by: Romain Forlot <romain.forlot@iot.bzh>
-rw-r--r--conf.d/project/etc/control-low-can.json4
-rw-r--r--low-can-binding/CMakeLists.txt1
-rw-r--r--low-can-binding/binding/application.cpp5
-rw-r--r--low-can-binding/binding/low-can-cb.cpp8
-rw-r--r--low-can-binding/can/can-bus.cpp44
-rw-r--r--low-can-binding/can/can-bus.hpp8
-rw-r--r--low-can-binding/utils/config-parser.cpp67
-rw-r--r--low-can-binding/utils/config-parser.hpp44
8 files changed, 42 insertions, 139 deletions
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 35c6d9ee..3037994a 100644
--- a/low-can-binding/binding/low-can-cb.cpp
+++ b/low-can-binding/binding/low-can-cb.cpp
@@ -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();
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 <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
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" <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
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" <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();
- };
-}