aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--CAN-binder/low-can-binding/binding/low-can-cb.cpp31
-rw-r--r--CAN-binder/low-can-binding/binding/low-can-hat.hpp3
-rw-r--r--CAN-binder/low-can-binding/diagnostic/diagnostic-manager.cpp22
-rw-r--r--CAN-binder/low-can-binding/diagnostic/diagnostic-manager.hpp3
4 files changed, 48 insertions, 11 deletions
diff --git a/CAN-binder/low-can-binding/binding/low-can-cb.cpp b/CAN-binder/low-can-binding/binding/low-can-cb.cpp
index 55d9bdd4..b3c9e2e0 100644
--- a/CAN-binder/low-can-binding/binding/low-can-cb.cpp
+++ b/CAN-binder/low-can-binding/binding/low-can-cb.cpp
@@ -52,7 +52,7 @@ void on_no_clients(std::string message)
}
}
-int read(sd_event_source *s, int fd, uint32_t revents, void *userdata)
+int read_can_signal(sd_event_source *s, int fd, uint32_t revents, void *userdata)
{
can_signal_t* sig= (can_signal_t*)userdata;
sig->read_socket();
@@ -67,6 +67,25 @@ int read(sd_event_source *s, int fd, uint32_t revents, void *userdata)
return 0;
}
+int read_diagnostic_message(sd_event_source *s, int fd, uint32_t revents, void *userdata)
+{
+ diagnostic_manager_t& diag_m = configuration_t::instance().get_diagnostic_manager();
+ diag_m.read_socket();
+
+ /* check if error or hangup */
+ if ((revents & (EPOLLERR|EPOLLRDHUP|EPOLLHUP)) != 0)
+ {
+ sd_event_source_unref(s);
+ diag_m.get_socket().close();
+ diag_m.cleanup_active_requests(true);
+ ERROR(binder_interface, "%s: Error on diagnostic manager socket, cancelling active requests.", __FUNCTION__);
+ return -1;
+ }
+
+ return 0;
+}
+
+
///******************************************************************************
///
/// Subscription and unsubscription
@@ -161,10 +180,9 @@ static int subscribe_unsubscribe_signals(struct afb_req request, bool subscribe,
// poll a PID for nothing.
if(sig->get_supported() && subscribe)
{
- float frequency = sig->get_frequency();
- subscribe = diag_m.add_recurring_request(
- diag_req, sig->get_name().c_str(), false, sig->get_decoder(), sig->get_callback(), (float)frequency);
- //TODO: Adding callback requesting ignition status: diag_req, sig.c_str(), false, diagnostic_message_t::decode_obd2_response, diagnostic_message_t::check_ignition_status, frequency);
+ float frequency = sig->get_frequency();
+ diag_m.add_recurring_request(diag_req, sig->get_name().c_str(), false, sig->get_decoder(), sig->get_callback(), (float)frequency);
+ //TODO: Adding callback requesting ignition status: diag_req, sig.c_str(), false, diagnostic_message_t::decode_obd2_response, diagnostic_message_t::check_ignition_status, frequency);
}
else
{
@@ -188,8 +206,7 @@ static int subscribe_unsubscribe_signals(struct afb_req request, bool subscribe,
{
return -1;
}
- struct sd_event_source* e_source;
- sd_event_add_io(afb_daemon_get_event_loop(binder_interface->daemon), &e_source, sig->get_socket().socket(), EPOLLIN, read, sig.get());
+ sd_event_add_io(afb_daemon_get_event_loop(binder_interface->daemon), &e_source, sig->get_socket().socket(), EPOLLIN, read_can_signal, sig.get());
rets++;
DEBUG(binder_interface, "%s: signal: %s subscribed", __FUNCTION__, sig->get_name().c_str());
}
diff --git a/CAN-binder/low-can-binding/binding/low-can-hat.hpp b/CAN-binder/low-can-binding/binding/low-can-hat.hpp
index 7df4663c..57c0a536 100644
--- a/CAN-binder/low-can-binding/binding/low-can-hat.hpp
+++ b/CAN-binder/low-can-binding/binding/low-can-hat.hpp
@@ -20,6 +20,7 @@
#include <cstddef>
#include <string>
+#include <systemd/sd-event.h>
extern "C"
{
@@ -31,6 +32,8 @@ extern "C" struct afb_binding_interface;
extern const struct afb_binding_interface *binder_interface;
void on_no_clients(std::string message);
+int read_can_signal(sd_event_source *s, int fd, uint32_t revents, void *userdata);
+int read_diagnostic_message(sd_event_source *s, int fd, uint32_t revents, void *userdata);
void subscribe(struct afb_req request);
void unsubscribe(struct afb_req request); \ No newline at end of file
diff --git a/CAN-binder/low-can-binding/diagnostic/diagnostic-manager.cpp b/CAN-binder/low-can-binding/diagnostic/diagnostic-manager.cpp
index 8a55365e..935767a8 100644
--- a/CAN-binder/low-can-binding/diagnostic/diagnostic-manager.cpp
+++ b/CAN-binder/low-can-binding/diagnostic/diagnostic-manager.cpp
@@ -49,6 +49,7 @@ bool diagnostic_manager_t::initialize()
bus_ = configuration_t::instance().get_diagnostic_bus();
init_diagnostic_shims();
+ event_source_ = nullptr;
reset();
initialized_ = true;
@@ -456,15 +457,28 @@ active_diagnostic_request_t* diagnostic_manager_t::add_recurring_request(Diagnos
{
// TODO: implement Acceptance Filter
//if(updateRequiredAcceptanceFilters(bus, request)) {
- active_diagnostic_request_t* entry = new active_diagnostic_request_t(bus_, request, name,
+ entry = new active_diagnostic_request_t(bus_, request, name,
wait_for_multiple_responses, decoder, callback, frequencyHz);
recurring_requests_.push_back(entry);
entry->set_handle(shims_, request);
if(add_rx_filter(OBD2_FUNCTIONAL_BROADCAST_ID) < 0)
- { recurring_requests_.pop_back(); }
+ { recurring_requests_.pop_back(); }
else
- { start_diagnostic_request(&shims_, entry->get_handle()); }
+ {
+ start_diagnostic_request(&shims_, entry->get_handle());
+ if(event_source_ == nullptr && sd_event_add_io(afb_daemon_get_event_loop(binder_interface->daemon),
+ &event_source_,
+ socket_.socket(),
+ EPOLLIN,
+ read_diagnostic_message,
+ nullptr) < 0)
+ {
+ cleanup_request(entry, true);
+ WARNING(binder_interface, "%s: signal: %s isn't supported. Canceling operation.", __FUNCTION__, entry->get_name().c_str());
+ return entry;
+ }
+ }
}
else
{
@@ -473,7 +487,7 @@ active_diagnostic_request_t* diagnostic_manager_t::add_recurring_request(Diagnos
}
}
else
- { DEBUG(binder_interface, "%s: Can't add request, one already exists with same key", __FUNCTION__);}
+ { DEBUG(binder_interface, "%s: Can't add request, one already exists with same key", __FUNCTION__);}
return entry;
}
diff --git a/CAN-binder/low-can-binding/diagnostic/diagnostic-manager.hpp b/CAN-binder/low-can-binding/diagnostic/diagnostic-manager.hpp
index 65ff0cb5..66a4d73f 100644
--- a/CAN-binder/low-can-binding/diagnostic/diagnostic-manager.hpp
+++ b/CAN-binder/low-can-binding/diagnostic/diagnostic-manager.hpp
@@ -57,6 +57,7 @@ private:
* response is received for a non-recurring request or it times out, it is removed*/
bool initialized_; /*!< * initialized - True if the DiagnosticsManager has been initialized with shims. It will interface with the uds-c lib*/
utils::socketcan_bcm_t socket_; ///< rx_socket_ - a BCM socket with 8 RX_SETUP jobs for the 8 CAN ID on which ECU could respond.
+ struct sd_event_source* event_source_;
void init_diagnostic_shims();
void reset();
@@ -66,6 +67,8 @@ public:
bool initialize();
+ void read_socket();
+ utils::socketcan_bcm_t& get_socket();
std::string get_can_bus();
active_diagnostic_request_t* get_last_recurring_requests() const;
DiagnosticShims& get_shims();