X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=CAN-binder%2Flow-can-binding%2Fdiagnostic%2Fdiagnostic-manager.cpp;h=31a3d23fc75a92c41459240556a6749773af15f6;hb=71096ceee301ebc450aacb29d99190b3e158753f;hp=c4be28fa205f01eb26f40226419fecb103db7830;hpb=1a8c681528f9f1ff45d111b0c8cdfed7a697bae6;p=apps%2Fagl-service-can-low-level.git diff --git a/CAN-binder/low-can-binding/diagnostic/diagnostic-manager.cpp b/CAN-binder/low-can-binding/diagnostic/diagnostic-manager.cpp index c4be28fa..31a3d23f 100644 --- a/CAN-binder/low-can-binding/diagnostic/diagnostic-manager.cpp +++ b/CAN-binder/low-can-binding/diagnostic/diagnostic-manager.cpp @@ -33,7 +33,7 @@ #define MICRO 1000000 diagnostic_manager_t::diagnostic_manager_t() - : initialized_{false} + : initialized_{false}, event_source_{nullptr} {} /// @brief Diagnostic manager isn't initialized at launch but after @@ -57,16 +57,6 @@ bool diagnostic_manager_t::initialize() return initialized_; } -void diagnostic_manager_t::read_socket() -{ - can_message_t msg; - can_bus_t& cbm = configuration_t::instance().get_can_bus_manager(); - socket_ >> msg; - std::lock_guard can_message_lock(cbm.get_can_message_mutex()); - { cbm.push_new_can_message(msg); } - cbm.get_new_can_message_cv().notify_one(); -} - utils::socketcan_bcm_t& diagnostic_manager_t::get_socket() { return socket_; @@ -96,7 +86,7 @@ int diagnostic_manager_t::add_rx_filter(uint32_t can_id) { // Make sure that socket has been opened. if(! socket_) - socket_.open(bus_); + socket_.open(get_bus_device_name()); struct utils::simple_bcm_msg bcm_msg; memset(&bcm_msg.msg_head, 0, sizeof(bcm_msg.msg_head)); @@ -152,7 +142,7 @@ bool diagnostic_manager_t::shims_send(const uint32_t arbitration_id, const uint8 // Make sure that socket has been opened. if(! tx_socket) tx_socket.open( - dm.get_can_bus()); + dm.get_bus_device_name()); struct utils::simple_bcm_msg bcm_msg; struct can_frame cfd; @@ -195,17 +185,24 @@ void diagnostic_manager_t::shims_logger(const char* format, ...) vsnprintf(buffer, 256, format, args); DEBUG(binder_interface, "%s: %s", __FUNCTION__, buffer); + va_end(args); } /// @brief The type signature for a... OpenXC TODO: not used yet. void diagnostic_manager_t::shims_timer() {} -std::string diagnostic_manager_t::get_can_bus() +const std::string diagnostic_manager_t::get_bus_name() const { return bus_; } +const std::string diagnostic_manager_t::get_bus_device_name() const +{ + return configuration_t::instance().get_can_bus_manager() + .get_can_device_name(bus_); +} + active_diagnostic_request_t* diagnostic_manager_t::get_last_recurring_requests() const { return recurring_requests_.back(); @@ -217,6 +214,16 @@ DiagnosticShims& diagnostic_manager_t::get_shims() return shims_; } +bool diagnostic_manager_t::socket_close() +{ + if(non_recurring_requests_.empty() && recurring_requests_.empty()) + { + socket_.close(); + return true; + } + return false; +} + /// @brief Search for a specific active diagnostic request in the provided requests list /// and erase it from the vector. This is useful at unsubscription to clean up the list otherwize /// all received CAN messages will be passed to DiagnosticRequestHandle of all active diagnostic request @@ -235,6 +242,8 @@ void diagnostic_manager_t::find_and_erase(active_diagnostic_request_t* entry, st void diagnostic_manager_t::cancel_request(active_diagnostic_request_t* entry) { entry->get_socket().close(); + delete entry; + entry = nullptr; } /// @brief Cleanup a specific request if it isn't running and get complete. As it is almost @@ -252,16 +261,17 @@ void diagnostic_manager_t::cleanup_request(active_diagnostic_request_t* entry, b request_string, sizeof(request_string)); if(force && entry->get_recurring()) { - find_and_erase(entry, recurring_requests_); cancel_request(entry); + find_and_erase(entry, recurring_requests_); DEBUG(binder_interface, "%s: Cancelling completed, recurring request: %s", __FUNCTION__, request_string); } - else + else if (!entry->get_recurring()) { DEBUG(binder_interface, "%s: Cancelling completed, non-recurring request: %s", __FUNCTION__, request_string); - find_and_erase(entry, non_recurring_requests_); cancel_request(entry); + find_and_erase(entry, non_recurring_requests_); } + socket_close(); } } @@ -272,12 +282,17 @@ void diagnostic_manager_t::cleanup_request(active_diagnostic_request_t* entry, b void diagnostic_manager_t::cleanup_active_requests(bool force) { for(auto& entry : non_recurring_requests_) + { if (entry != nullptr) cleanup_request(entry, force); + } for(auto& entry : recurring_requests_) + { if (entry != nullptr) cleanup_request(entry, force); + } + } /// @brief Will return the active_diagnostic_request_t pointer for theDiagnosticRequest or nullptr if @@ -292,10 +307,7 @@ active_diagnostic_request_t* diagnostic_manager_t::find_recurring_request(const if(entry != nullptr) { if(diagnostic_request_equals(&entry->get_handle()->request, request)) - { - return entry; - break; - } + {return entry;} } } return nullptr; @@ -327,7 +339,7 @@ active_diagnostic_request_t* diagnostic_manager_t::find_recurring_request(const /// @return true if the request was added successfully. Returns false if there /// wasn't a free active request entry, if the frequency was too high or if the /// CAN acceptance filters could not be configured, -active_diagnostic_request_t* diagnostic_manager_t::add_request(DiagnosticRequest* request, const std::string name, +active_diagnostic_request_t* diagnostic_manager_t::add_request(DiagnosticRequest* request, const std::string& name, bool wait_for_multiple_responses, const DiagnosticResponseDecoder decoder, const DiagnosticResponseCallback callback) { @@ -454,7 +466,7 @@ active_diagnostic_request_t* diagnostic_manager_t::add_recurring_request(Diagnos &event_source_, socket_.socket(), EPOLLIN, - read_diagnostic_message, + read_message, nullptr) < 0) { cleanup_request(entry, true); @@ -544,7 +556,8 @@ openxc_VehicleMessage diagnostic_manager_t::relay_diagnostic_handle(active_diagn else if(!response.completed && response.multi_frame) { // Reset the timeout clock while completing the multi-frame receive - entry->get_timeout_clock().tick(); + entry->get_timeout_clock().tick( + entry->get_timeout_clock().get_time_function()()); } return build_VehicleMessage();