X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=low-can-binding%2Fdiagnostic%2Fdiagnostic-manager.cpp;h=ba4b0c876736df154699d04ad0efa71ba70b2286;hb=994b37a0c027b86f5bc257347dd403f71f3ab694;hp=448133ef2ba4c2cb3736f3ae6aec1a20daea4d88;hpb=4becc6d7986cf656f10f02ecdd5202b5b0fdddf1;p=apps%2Fagl-service-can-low-level.git diff --git a/low-can-binding/diagnostic/diagnostic-manager.cpp b/low-can-binding/diagnostic/diagnostic-manager.cpp index 448133ef..ba4b0c87 100644 --- a/low-can-binding/diagnostic/diagnostic-manager.cpp +++ b/low-can-binding/diagnostic/diagnostic-manager.cpp @@ -49,8 +49,8 @@ diagnostic_manager_t::~diagnostic_manager_t() } } -/// @brief Diagnostic manager isn't initialized at launch but after -/// CAN bus devices initialization. For the moment, it is only possible +/// @brief Diagnostic manager is not initialized at launch but after +/// the initialization of CAN bus devices. For the moment, it is only possible /// to have 1 diagnostic bus which are the first bus declared in the JSON /// description file. Configuration instance will return it. /// @@ -102,27 +102,26 @@ 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_bus_device_name()); + tx_socket.open(dm.get_bus_device_name()); - struct utils::simple_bcm_msg bcm_msg; - struct can_frame cfd; - - memset(&cfd, 0, sizeof(cfd)); - memset(&bcm_msg.msg_head, 0, sizeof(bcm_msg.msg_head)); + struct utils::bcm_msg bcm_msg; + struct can_frame cf; struct timeval freq = current_adr->get_frequency_clock().get_timeval_from_period(); bcm_msg.msg_head.opcode = TX_SETUP; bcm_msg.msg_head.can_id = arbitration_id; bcm_msg.msg_head.flags = SETTIMER|STARTTIMER|TX_CP_CAN_ID; + bcm_msg.msg_head.count = 0; bcm_msg.msg_head.ival2.tv_sec = freq.tv_sec; bcm_msg.msg_head.ival2.tv_usec = freq.tv_usec; bcm_msg.msg_head.nframes = 1; - cfd.can_dlc = size; - ::memcpy(cfd.data, data, size); + cf.can_dlc = size; + + ::memset(cf.data, 0, sizeof(cf.data)); + ::memcpy(cf.data, data, size); - bcm_msg.frames = cfd; + bcm_msg.frames[0] = cf; tx_socket << bcm_msg; if(tx_socket) @@ -257,7 +256,7 @@ active_diagnostic_request_t* diagnostic_manager_t::find_recurring_request(Diagno } return nullptr; } - +/* /// @brief Add and send a new one-time diagnostic request. DON'T USED AT THIS TIME /// /// A one-time (aka non-recurring) request can existing in parallel with a @@ -293,7 +292,7 @@ active_diagnostic_request_t* diagnostic_manager_t::add_request(DiagnosticRequest if (non_recurring_requests_.size() <= MAX_SIMULTANEOUS_DIAG_REQUESTS) { active_diagnostic_request_t* entry = new active_diagnostic_request_t(bus_, request->arbitration_id, name, - wait_for_multiple_responses, decoder, callback, 0); + wait_for_multiple_responses, decoder, callback, 0, false); entry->set_handle(shims_, request); char request_string[128] = {0}; @@ -314,7 +313,7 @@ active_diagnostic_request_t* diagnostic_manager_t::add_request(DiagnosticRequest } return entry; } - +*/ /// @brief Validate frequency asked don't get higher than the maximum of a classical /// CAN bus OBD2 request. /// @@ -359,7 +358,7 @@ bool diagnostic_manager_t::validate_optional_request_attributes(float frequencyH /// was too much already running requests, or if the frequency was too high. active_diagnostic_request_t* diagnostic_manager_t::add_recurring_request(DiagnosticRequest* request, const char* name, bool wait_for_multiple_responses, const DiagnosticResponseDecoder decoder, - const DiagnosticResponseCallback callback, float frequencyHz) + const DiagnosticResponseCallback callback, float frequencyHz, bool permanent) { active_diagnostic_request_t* entry = nullptr; @@ -373,7 +372,7 @@ active_diagnostic_request_t* diagnostic_manager_t::add_recurring_request(Diagnos if(recurring_requests_.size() <= MAX_SIMULTANEOUS_DIAG_REQUESTS) { entry = new active_diagnostic_request_t(bus_, request->arbitration_id, name, - wait_for_multiple_responses, decoder, callback, frequencyHz); + wait_for_multiple_responses, decoder, callback, frequencyHz, permanent); recurring_requests_.push_back(entry); entry->set_handle(shims_, request); @@ -396,10 +395,14 @@ active_diagnostic_request_t* diagnostic_manager_t::add_recurring_request(Diagnos /// @param[in] response - The response to decode from which the Vehicle message will be built and returned /// /// @return A filled openxc_VehicleMessage or a zeroed struct if there is an error. -openxc_VehicleMessage diagnostic_manager_t::relay_diagnostic_response(active_diagnostic_request_t* adr, const DiagnosticResponse& response) +openxc_VehicleMessage diagnostic_manager_t::relay_diagnostic_response(active_diagnostic_request_t* adr, const DiagnosticResponse& response, const uint64_t timestamp) { openxc_VehicleMessage message = build_VehicleMessage(); float value = (float)diagnostic_payload_to_integer(&response); + + struct utils::signals_found found_signals; + found_signals = utils::signals_manager_t::instance().find_signals(build_DynamicField((double) adr->get_pid())); + if(adr->get_decoder() != nullptr) { value = adr->get_decoder()(&response, value); @@ -425,8 +428,6 @@ openxc_VehicleMessage diagnostic_manager_t::relay_diagnostic_response(active_dia // If not success but completed then the pid isn't supported if(!response.success) { - struct utils::signals_found found_signals; - found_signals = utils::signals_manager_t::instance().find_signals(build_DynamicField(adr->get_name())); found_signals.diagnostic_messages.front()->set_supported(false); cleanup_request(adr, true); AFB_NOTICE("PID not supported or ill formed. Please unsubscribe from it. Error code : %d", response.negative_response_code); @@ -440,6 +441,20 @@ openxc_VehicleMessage diagnostic_manager_t::relay_diagnostic_response(active_dia // Reset the completed flag handle to make sure that it will be reprocessed the next time. adr->get_handle()->success = false; + + // Save value and timestamp of diagnostic message + if(!found_signals.diagnostic_messages.empty()) + { + // Then, for each diag_message found + for(const auto& diag_mess: found_signals.diagnostic_messages) + { + // Save value and timestamp for this message + diag_mess->set_received(true); + diag_mess->set_last_value(value); + diag_mess->set_timestamp(timestamp); + } + } + return message; } @@ -457,7 +472,7 @@ openxc_VehicleMessage diagnostic_manager_t::relay_diagnostic_handle(active_diagn if(response.completed && entry->get_handle()->completed) { if(entry->get_handle()->success) - return relay_diagnostic_response(entry, response); + return relay_diagnostic_response(entry, response, cm.get_timestamp()); } else if(!response.completed && response.multi_frame) {