X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=CAN-binder%2Flow-can-binding%2Fdiagnostic%2Fdiagnostic-manager.cpp;h=7dab7495bab403b4dcfa604e2d1db0f176c452c8;hb=4eb1cc0d69804337ac9e35dea6cc2e22c0fc76c6;hp=f9dc9607151d06832e49b883b80b0846d24f683f;hpb=a1a554bd3dc19580c9b80dc6e4beb6bed4711e53;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 f9dc9607..7dab7495 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}, event_source_{nullptr} + : initialized_{false} {} /// @brief Diagnostic manager isn't initialized at launch but after @@ -49,7 +49,6 @@ bool diagnostic_manager_t::initialize() bus_ = application_t::instance().get_diagnostic_bus(); init_diagnostic_shims(); - event_source_ = nullptr; reset(); initialized_ = true; @@ -57,11 +56,6 @@ bool diagnostic_manager_t::initialize() return initialized_; } -utils::socketcan_bcm_t& diagnostic_manager_t::get_socket() -{ - return socket_; -} - /// @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. @@ -78,52 +72,6 @@ void diagnostic_manager_t::reset() cleanup_active_requests(true); } -/// @brief Adds 8 RX_SETUP jobs to the BCM rx_socket_ then diagnotic manager -/// listens on CAN ID range 7E8 - 7EF affected to the OBD2 communications. -/// -/// @return -1 or negative value on error, 0 if ok. -int diagnostic_manager_t::create_rx_filter(uint32_t can_id, float frequency) -{ - // Make sure that socket has been opened. - if(! socket_) - socket_.open(get_bus_device_name()); - - struct utils::simple_bcm_msg bcm_msg; - memset(&bcm_msg, 0, sizeof(bcm_msg)); - - const struct timeval freq = (frequency == recurring_requests_.back()->get_frequency_clock().get_frequency() ) ? - recurring_requests_.back()->get_frequency_clock().get_timeval_from_period() : frequency_clock_t(frequency).get_timeval_from_period(); - - bcm_msg.msg_head.opcode = RX_SETUP; - bcm_msg.msg_head.flags = SETTIMER|RX_FILTER_ID; - bcm_msg.msg_head.ival2.tv_sec = freq.tv_sec; - bcm_msg.msg_head.ival2.tv_usec = freq.tv_usec; - - // If it isn't an OBD2 CAN ID then just add a simple RX_SETUP job - if(can_id != OBD2_FUNCTIONAL_BROADCAST_ID) - { - bcm_msg.msg_head.can_id = can_id; - - socket_ << bcm_msg; - if(! socket_) - return -1; - } - else - { - for(uint8_t i = 0; i < 8; i++) - { - can_id = OBD2_FUNCTIONAL_RESPONSE_START + i; - bcm_msg.msg_head.can_id = can_id; - - socket_ << bcm_msg; - if(! socket_) - return -1; - } - } - - return 0; -} - /// @brief send function use by diagnostic library. Only one bus used for now /// so diagnostic request is sent using the default diagnostic bus not matter of /// which is specified in the diagnostic message definition. @@ -215,11 +163,10 @@ DiagnosticShims& diagnostic_manager_t::get_shims() return shims_; } -bool diagnostic_manager_t::socket_close() +bool diagnostic_manager_t::is_active_requests_running() { if(non_recurring_requests_.empty() && recurring_requests_.empty()) { - socket_.close(); return true; } return false; @@ -255,7 +202,7 @@ void diagnostic_manager_t::cancel_request(active_diagnostic_request_t* entry) /// @param[in] force - Force the cleaning or not ? void diagnostic_manager_t::cleanup_request(active_diagnostic_request_t* entry, bool force) { - if((force || (entry != nullptr && entry->response_received()))) + if(entry != nullptr && (force || entry->response_received())) { char request_string[128] = {0}; diagnostic_request_to_string(&entry->get_handle()->request, @@ -272,7 +219,6 @@ void diagnostic_manager_t::cleanup_request(active_diagnostic_request_t* entry, b cancel_request(entry); find_and_erase(entry, non_recurring_requests_); } - socket_close(); } } @@ -300,13 +246,13 @@ void diagnostic_manager_t::cleanup_active_requests(bool force) /// /// @param[in] request - Search key, method will go through recurring list to see if it find that request /// holded by the DiagnosticHandle member. -active_diagnostic_request_t* diagnostic_manager_t::find_recurring_request(const DiagnosticRequest* request) +active_diagnostic_request_t* diagnostic_manager_t::find_recurring_request(DiagnosticRequest& request) { for (auto& entry : recurring_requests_) { if(entry != nullptr) { - if(diagnostic_request_equals(&entry->get_handle()->request, request)) + if(diagnostic_request_equals(&entry->get_handle()->request, &request)) {return entry;} } } @@ -351,7 +297,7 @@ active_diagnostic_request_t* diagnostic_manager_t::add_request(DiagnosticRequest { // TODO: implement Acceptance Filter // if(updateRequiredAcceptanceFilters(bus, request)) { - active_diagnostic_request_t* entry = new active_diagnostic_request_t(bus_, request, name, + active_diagnostic_request_t* entry = new active_diagnostic_request_t(bus_, request->arbitration_id, name, wait_for_multiple_responses, decoder, callback, 0); entry->set_handle(shims_, request); @@ -447,38 +393,16 @@ active_diagnostic_request_t* diagnostic_manager_t::add_recurring_request(Diagnos cleanup_active_requests(false); - if(find_recurring_request(request) == nullptr) + if(find_recurring_request(*request) == nullptr) { if(recurring_requests_.size() <= MAX_SIMULTANEOUS_DIAG_REQUESTS) { - // TODO: implement Acceptance Filter - //if(updateRequiredAcceptanceFilters(bus, request)) { - entry = new active_diagnostic_request_t(bus_, request, name, + entry = new active_diagnostic_request_t(bus_, request->arbitration_id, name, wait_for_multiple_responses, decoder, callback, frequencyHz); recurring_requests_.push_back(entry); entry->set_handle(shims_, request); - if(create_rx_filter(OBD2_FUNCTIONAL_BROADCAST_ID, frequencyHz) < 0) - { - recurring_requests_.pop_back(); - delete entry; - entry = nullptr; - } - else - { - 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_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; - } - } + start_diagnostic_request(&shims_, entry->get_handle()); } else { @@ -511,10 +435,12 @@ openxc_VehicleMessage diagnostic_manager_t::relay_diagnostic_response(active_dia // If name, include 'value' instead of payload, and leave of response // details. message = build_VehicleMessage(build_SimpleMessage(adr->get_name(), build_DynamicField(value))); + message.has_diagnostic_response = true; + message.diagnostic_response = build_VehicleMessage(adr, response, value).diagnostic_response; } else { - // If no name, send full details of response but still include 'value' + // If no name, only send full details of response but still include 'value' // instead of 'payload' if they provided a decoder. The one case you // can't get is the full detailed response with 'value'. We could add // another parameter for that but it's onerous to carry that around.