diff options
-rw-r--r-- | src/diagnostic/diagnostic-manager.cpp | 23 | ||||
-rw-r--r-- | src/low-can-binding.cpp | 7 |
2 files changed, 22 insertions, 8 deletions
diff --git a/src/diagnostic/diagnostic-manager.cpp b/src/diagnostic/diagnostic-manager.cpp index 915b449c..482a88fe 100644 --- a/src/diagnostic/diagnostic-manager.cpp +++ b/src/diagnostic/diagnostic-manager.cpp @@ -15,6 +15,7 @@ * limitations under the License. */ +#include <systemd/sd-event.h> #include <algorithm> #include "diagnostic-manager.hpp" @@ -26,6 +27,7 @@ #define MAX_RECURRING_DIAGNOSTIC_FREQUENCY_HZ 10 #define MAX_SIMULTANEOUS_DIAG_REQUESTS 50 #define MAX_REQUEST_ENTRIES 50 +#define MICRO 1000000 diagnostic_manager_t::diagnostic_manager_t() : request_list_entries_(MAX_REQUEST_ENTRIES, new active_diagnostic_request_t()), initialized_{false} @@ -233,6 +235,7 @@ bool diagnostic_manager_t::add_recurring_request(DiagnosticRequest* request, con if(entry != nullptr) { + sd_event_source *source; // TODO: implement Acceptance Filter //if(updateRequiredAcceptanceFilters(bus, request)) { entry = new active_diagnostic_request_t(bus_, request, name, @@ -247,11 +250,29 @@ bool diagnostic_manager_t::add_recurring_request(DiagnosticRequest* request, con DEBUG(binder_interface, "Added recurring diagnostic request (freq: %f) on bus %s: %s", frequencyHz, bus_->get_device_name().c_str(), request_string); - recurring_requests_.push_back(entry); + if(sd_event_add_time(afb_daemon_get_event_loop(binder_interface->daemon), &source, + CLOCK_MONOTONIC, (uint64_t)frequencyHz*MICRO, 0,send_request, request) >= 0) + { + if(sd_event_source_set_enabled(source, SD_EVENT_ON) >= 0) + recurring_requests_.push_back(entry); + else + { + ERROR(binder_interface, "add_reccurring_request: Request has not been enabled, it will occurs only one time"); + free_request_entries_.push_back(entry); + added = false; + } + } + else + { + ERROR(binder_interface, "add_recurring_request: Request fails to be schedule through event loop"); + free_request_entries_.push_back(entry); + added = false; + } } else { WARNING(binder_interface, "There isn't enough request entry. Vector exhausted %d/%d", (int)request_list_entries_.size(), (int)request_list_entries_.max_size()); + free_request_entries_.push_back(entry); added = false; } } diff --git a/src/low-can-binding.cpp b/src/low-can-binding.cpp index f6e9849f..0c26595b 100644 --- a/src/low-can-binding.cpp +++ b/src/low-can-binding.cpp @@ -25,7 +25,6 @@ #include <time.h> #include <linux/can.h> #include <json-c/json.h> -#include <systemd/sd-event.h> #include "openxc.pb.h" #include "configuration.hpp" @@ -42,8 +41,6 @@ extern "C" #include <afb/afb-service-itf.h> }; -#define MICRO 1000000 - // Interface between the daemon and the binding const struct afb_binding_interface *binder_interface; @@ -124,7 +121,6 @@ static int subscribe_unsubscribe_signal(struct afb_req request, bool subscribe, static int subscribe_unsubscribe_signals(struct afb_req request, bool subscribe, const std::vector<std::string>& signals) { int rets = 0; - sd_event_source *source; //TODO: Implement way to dynamically call the right function no matter // how much signals types we have. @@ -141,9 +137,6 @@ static int subscribe_unsubscribe_signals(struct afb_req request, bool subscribe, configuration_t::instance().get_diagnostic_manager().add_recurring_request( diag_req, sig.c_str(), false, obd2_signal_t::decode_obd2_response, nullptr, (float)frequency); //TODO: Adding callback requesting ignition status: diag_req, sig.c_str(), false, obd2_signal_t::decode_obd2_response, obd2_signal_t::check_ignition_status, frequency); - sd_event_add_time(afb_daemon_get_event_loop(binder_interface->daemon), &source, CLOCK_MONOTONIC, frequency*MICRO, 0, - configuration_t::instance().get_diagnostic_manager().send_request, diag_req); - sd_event_source_set_enabled(source, SD_EVENT_ON); } ret = subscribe_unsubscribe_signal(request, subscribe, sig); |