return -1;
}
-openxc_VehicleMessage diagnostic_manager_t::relay_diagnostic_response(active_diagnostic_request_t* adr, const DiagnosticResponse& response) const
+openxc_VehicleMessage diagnostic_manager_t::relay_diagnostic_response(active_diagnostic_request_t* adr, const DiagnosticResponse& response)
{
openxc_VehicleMessage message = build_VehicleMessage();
float value = (float)diagnostic_payload_to_integer(&response);
message = build_VehicleMessage(adr, response, value);
}
+ // If not success but completed then the pid isn't supported
+ if(!response.success)
+ {
+ std::vector<diagnostic_message_t*> found_signals;
+ configuration_t::instance().find_diagnostic_messages( build_DynamicField(adr->get_name()), found_signals );
+ found_signals.front()->set_supported(false);
+ cleanup_request(adr, true);
+ NOTICE(binder_interface, "relay_diagnostic_response: PID not supported or ill formed. Please unsubscribe from it. Error code : %d", response.negative_response_code);
+ }
+
if(adr->get_callback() != nullptr)
{
adr->get_callback()(adr, &response, value);
static int send_request(sd_event_source *s, uint64_t usec, void *userdata);
// Decoding part
- openxc_VehicleMessage relay_diagnostic_response(active_diagnostic_request_t* adr, const DiagnosticResponse& response) const;
+ openxc_VehicleMessage relay_diagnostic_response(active_diagnostic_request_t* adr, const DiagnosticResponse& response);
openxc_VehicleMessage relay_diagnostic_handle(active_diagnostic_request_t* entry, const can_message_t& cm);
openxc_VehicleMessage find_and_decode_adr(const can_message_t& cm);
bool is_diagnostic_response(const can_message_t& cm);
return callback_;
}
+bool diagnostic_message_t::get_supported() const
+{
+ return supported_;
+}
+
+void diagnostic_message_t::set_supported(bool value)
+{
+ supported_ = value;
+}
+
/**
* @brief Build a DiagnosticRequest struct to be passed
* to diagnostic manager instance.
float get_frequency() const;
DiagnosticResponseDecoder get_decoder() const;
DiagnosticResponseCallback get_callback() const;
+ bool get_supported() const;
+
+ void set_supported(bool value);
const DiagnosticRequest build_diagnostic_request();
std::vector<diagnostic_message_t*> found;
configuration_t::instance().find_diagnostic_messages(build_DynamicField(sig), found);
DiagnosticRequest* diag_req = new DiagnosticRequest(found.front()->build_diagnostic_request());
-
+
+ // If the requested diagnostic message isn't supported by the car then unssubcribe.
+ // no matter what we want, worse case will be a fail unsubscription but at least we don't
+ // poll a PID for nothing.
+ if(found.front()->get_supported())
+ subscribe = false;
if(subscribe)
{
float frequency = found.front()->get_frequency();