summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/diagnostic/diagnostic-manager.cpp12
-rw-r--r--src/diagnostic/diagnostic-manager.hpp2
-rw-r--r--src/diagnostic/diagnostic-message.cpp10
-rw-r--r--src/diagnostic/diagnostic-message.hpp3
-rw-r--r--src/low-can-binding.cpp7
5 files changed, 31 insertions, 3 deletions
diff --git a/src/diagnostic/diagnostic-manager.cpp b/src/diagnostic/diagnostic-manager.cpp
index ac0aaad..2c0a4d9 100644
--- a/src/diagnostic/diagnostic-manager.cpp
+++ b/src/diagnostic/diagnostic-manager.cpp
@@ -315,7 +315,7 @@ int diagnostic_manager_t::send_request(sd_event_source *s, uint64_t usec, void *
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);
@@ -339,6 +339,16 @@ openxc_VehicleMessage diagnostic_manager_t::relay_diagnostic_response(active_dia
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);
diff --git a/src/diagnostic/diagnostic-manager.hpp b/src/diagnostic/diagnostic-manager.hpp
index 5a4278d..60b8dec 100644
--- a/src/diagnostic/diagnostic-manager.hpp
+++ b/src/diagnostic/diagnostic-manager.hpp
@@ -94,7 +94,7 @@ public:
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);
diff --git a/src/diagnostic/diagnostic-message.cpp b/src/diagnostic/diagnostic-message.cpp
index 7473e7b..62da0dc 100644
--- a/src/diagnostic/diagnostic-message.cpp
+++ b/src/diagnostic/diagnostic-message.cpp
@@ -67,6 +67,16 @@ DiagnosticResponseCallback diagnostic_message_t::get_callback() const
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.
diff --git a/src/diagnostic/diagnostic-message.hpp b/src/diagnostic/diagnostic-message.hpp
index 4feceb4..ae37d7d 100644
--- a/src/diagnostic/diagnostic-message.hpp
+++ b/src/diagnostic/diagnostic-message.hpp
@@ -70,6 +70,9 @@ class diagnostic_message_t {
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();
diff --git a/src/low-can-binding.cpp b/src/low-can-binding.cpp
index 8ea885d..0830193 100644
--- a/src/low-can-binding.cpp
+++ b/src/low-can-binding.cpp
@@ -133,7 +133,12 @@ static int subscribe_unsubscribe_signals(struct afb_req request, bool subscribe,
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();