summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRomain Forlot <romain.forlot@iot.bzh>2019-12-06 11:34:05 +0100
committerRomain Forlot <romain.forlot@iot.bzh>2020-01-09 16:25:36 +0100
commit3c7fa35fe09693f367ee9b159723435007ebfa07 (patch)
treead5d5340a754a739e3a9f3bda04f54b439fdefae
parent4022a03b70337f6f922e97fb2f77d28058612587 (diff)
diag-mngr: Fix sending and change init
This commit fix the wrong bcm ival1 value set because the struct hasn't been initialized so it use a wrong value that can not be handled by the socket. Initialize diagnotstic manager depending on JSON configuration file This avoid to request engine_speed signal when there isn't any diagnostic_bus configured in the JSON file. Change-Id: I98145a6e20c29a644c856d818f104c6bd8069f9f Signed-off-by: Romain Forlot <romain.forlot@iot.bzh>
-rw-r--r--low-can-binding/binding/low-can-cb.cpp33
-rw-r--r--low-can-binding/diagnostic/diagnostic-manager.cpp7
-rw-r--r--low-can-binding/diagnostic/diagnostic-manager.hpp1
3 files changed, 24 insertions, 17 deletions
diff --git a/low-can-binding/binding/low-can-cb.cpp b/low-can-binding/binding/low-can-cb.cpp
index 1ff1d9da..1ebb392a 100644
--- a/low-can-binding/binding/low-can-cb.cpp
+++ b/low-can-binding/binding/low-can-cb.cpp
@@ -63,7 +63,7 @@ int config_low_can(afb_api_t apiHandle, CtlSectionT *section, json_object *json_
application_t *application = (application_t*) ctrlConfig->external;
- if(wrap_json_unpack(json_obj, "{si, ss}",
+ if(wrap_json_unpack(json_obj, "{si, s?s}",
"active_message_set", &active_message_set,
"diagnostic_bus", &diagnotic_bus))
return -1;
@@ -78,11 +78,8 @@ int config_low_can(afb_api_t apiHandle, CtlSectionT *section, json_object *json_
/// 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))
- {
- AFB_ERROR("Diagnostic Manager: error at initialization");
- return -1;
- }
+ if(! diagnotic_bus || application_t::instance().get_diagnostic_manager().initialize(diagnotic_bus))
+ AFB_WARNING("Diagnostic Manager: not initialized");
return 0;
}
@@ -872,22 +869,24 @@ int init_binding(afb_api_t api)
can_bus_manager.start_threads();
utils::signals_manager_t& sm = utils::signals_manager_t::instance();
- // Add a recurring dignostic message request to get engine speed at all times.
- openxc_DynamicField search_key = build_DynamicField("diagnostic_messages.engine.speed");
- struct utils::signals_found sf = sm.find_signals(search_key);
-
- if(sf.signals.empty() && sf.diagnostic_messages.size() == 1)
+ if (application.get_diagnostic_manager().is_initialized())
{
- afb_req_t request = nullptr;
+ // Add a recurring dignostic message request to get engine speed at all times.
+ openxc_DynamicField search_key = build_DynamicField("diagnostic_messages.engine.speed");
+ struct utils::signals_found sf = sm.find_signals(search_key);
- struct event_filter_t event_filter;
- event_filter.frequency = sf.diagnostic_messages.front()->get_frequency();
+ if(sf.signals.empty() && sf.diagnostic_messages.size() == 1)
+ {
+ afb_req_t request = nullptr;
- map_subscription& s = sm.get_subscribed_signals();
+ struct event_filter_t event_filter;
+ event_filter.frequency = sf.diagnostic_messages.front()->get_frequency();
- subscribe_unsubscribe_diagnostic_messages(request, true, sf.diagnostic_messages, event_filter, s, true);
- }
+ map_subscription& s = sm.get_subscribed_signals();
+ subscribe_unsubscribe_diagnostic_messages(request, true, sf.diagnostic_messages, event_filter, s, true);
+ }
+ }
#ifdef USE_FEATURE_J1939
std::string j1939_bus;
diff --git a/low-can-binding/diagnostic/diagnostic-manager.cpp b/low-can-binding/diagnostic/diagnostic-manager.cpp
index f3c513c5..9357883b 100644
--- a/low-can-binding/diagnostic/diagnostic-manager.cpp
+++ b/low-can-binding/diagnostic/diagnostic-manager.cpp
@@ -72,6 +72,11 @@ bool diagnostic_manager_t::initialize(std::string diagnostic_bus)
return initialized_;
}
+bool diagnostic_manager_t::is_initialized() const
+{
+ return initialized_;
+}
+
/// @brief initialize shims used by UDS lib and set initialized_ to true.
/// It is needed before used the diagnostic manager fully because shims are
/// required by most member functions.
@@ -116,6 +121,8 @@ bool diagnostic_manager_t::shims_send(const uint32_t arbitration_id, const uint8
bcm_msg.msg_head.can_id = arbitration_id;
bcm_msg.msg_head.flags = SETTIMER|STARTTIMER|TX_CP_CAN_ID;
bcm_msg.msg_head.count = 0;
+ bcm_msg.msg_head.ival1.tv_sec = 0;
+ bcm_msg.msg_head.ival1.tv_usec = 0;
bcm_msg.msg_head.ival2.tv_sec = freq.tv_sec;
bcm_msg.msg_head.ival2.tv_usec = freq.tv_usec;
bcm_msg.msg_head.nframes = 1;
diff --git a/low-can-binding/diagnostic/diagnostic-manager.hpp b/low-can-binding/diagnostic/diagnostic-manager.hpp
index c0a8255e..3f74ab79 100644
--- a/low-can-binding/diagnostic/diagnostic-manager.hpp
+++ b/low-can-binding/diagnostic/diagnostic-manager.hpp
@@ -60,6 +60,7 @@ public:
~diagnostic_manager_t();
bool initialize(std::string diagnostic_bus);
+ bool is_initialized() const;
const std::string get_bus_name() const;
const std::string get_bus_device_name() const;