From 4f1b1d088afe8eb9a5b75287429104e4175e97e7 Mon Sep 17 00:00:00 2001 From: Romain Forlot Date: Tue, 16 May 2017 12:37:46 +0200 Subject: Adding also diagnostic request to systemd event loop As for CAN signal, monitoring diagnostic request messages is now handled by systemD io event loop. Socket reading is common for all OBD2 signals and handled by the diagnostic manager. systemd callback function lies in binding callback which in turns call read_socket method of diagnostic manager. Processing is little bit different from classic CAN messages so it is a separate callback function. Lot of cleaning to do now... Change-Id: I4d2ada0beb5d3348736dfdf3c56a7cb875a1c6c7 Signed-off-by: Romain Forlot --- .../diagnostic/diagnostic-manager.cpp | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) (limited to 'CAN-binder/low-can-binding/diagnostic/diagnostic-manager.cpp') 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; } -- cgit 1.2.3-korg