From 542518e3f4390fcb0d8fb17bcbb14c7eb4335a61 Mon Sep 17 00:00:00 2001 From: Romain Forlot Date: Mon, 13 Mar 2017 15:03:00 +0100 Subject: Move member from obd2_signals_t class to active_diagnostic_request_t (adr)class. It's more logical to have them here as call about incoming diagnostic CAN messages are made against adr class not obd2_signal_t that it's a subset of diagnostic messages. It's made to handle obd2 requests as well as normal UDS diagnostic request for constructor proprietary diagnostic signals. Change-Id: I96c714640d6ecfa25dfc9942974057c1797eb0e1 Signed-off-by: Romain Forlot --- src/can/can-signals.cpp | 2 +- src/diagnostic/active-diagnostic-request.cpp | 34 +++++++++++++ src/diagnostic/active-diagnostic-request.hpp | 9 +++- src/diagnostic/diagnostic-message.cpp | 72 +--------------------------- src/diagnostic/diagnostic-message.hpp | 12 ++--- src/low-can-binding.cpp | 9 ++-- 6 files changed, 53 insertions(+), 85 deletions(-) diff --git a/src/can/can-signals.cpp b/src/can/can-signals.cpp index 27a7df9..ce4e264 100644 --- a/src/can/can-signals.cpp +++ b/src/can/can-signals.cpp @@ -25,7 +25,7 @@ #include "../obd2/obd2-signals.hpp" #include "../low-can-binding.hpp" -std::string can_signal_t::prefix_ = "messages."; +std::string can_signal_t::prefix_ = "messages"; can_message_definition_t& can_signal_t::get_message() { diff --git a/src/diagnostic/active-diagnostic-request.cpp b/src/diagnostic/active-diagnostic-request.cpp index 7a43a0d..5e43d7a 100644 --- a/src/diagnostic/active-diagnostic-request.cpp +++ b/src/diagnostic/active-diagnostic-request.cpp @@ -17,6 +17,8 @@ #include "active-diagnostic-request.hpp" +std::string active_diagnostic_request_t::prefix_ = "diagnostic_messages"; + bool active_diagnostic_request_t::operator==(const active_diagnostic_request_t& b) { return (bus_ == b.bus_ && id_ == b.id_ && handle_ == b.handle_) ? true : false; @@ -72,6 +74,26 @@ DiagnosticRequestHandle* active_diagnostic_request_t::get_handle() return handle_; } +std::string& active_diagnostic_request_t::get_name() +{ + return name_; +} + +std::string& active_diagnostic_request_t::get_prefix() +{ + return active_diagnostic_request_t::prefix_; +} + +DiagnosticResponseDecoder& active_diagnostic_request_t::get_decoder() +{ + return decoder_; +} + +DiagnosticResponseCallback& active_diagnostic_request_t::get_callback() +{ + return callback_; +} + bool active_diagnostic_request_t::get_recurring() const { return recurring_; @@ -102,6 +124,18 @@ void active_diagnostic_request_t::set_in_flight(bool val) in_flight_ = val; } +/** +* @brief Check if requested signal name is an obd2 pid +* +* @return true if name began with obd2 else false. +*/ +bool active_diagnostic_request_t::is_diagnostic_signal(const std::string& name) +{ + if(name.find_first_of(prefix_.c_str(), 0, prefix_.size())) + return true; + return false; +} + bool active_diagnostic_request_t::should_send() { return !get_in_flight() && ( diff --git a/src/diagnostic/active-diagnostic-request.hpp b/src/diagnostic/active-diagnostic-request.hpp index fb87c83..74a969b 100644 --- a/src/diagnostic/active-diagnostic-request.hpp +++ b/src/diagnostic/active-diagnostic-request.hpp @@ -62,6 +62,8 @@ private: * sending the frames of the request and receiving all frames of the response.*/ std::string name_; /*!< name_ - An optional human readable name this response, to be used when publishing received * responses. If the name is NULL, the published output will use the raw OBD-II response format.*/ + static std::string prefix_; /*!< prefix_ - generic_name_ will be prefixed with it. It has to reflect the used protocol. + * which make easier to sort message when the come in.*/ DiagnosticResponseDecoder decoder_; /*!< decoder_ - An optional DiagnosticResponseDecoder to parse the payload of responses * to this request. If the decoder is NULL, the output will include the raw payload * instead of a parsed value.*/ @@ -82,7 +84,6 @@ public: active_diagnostic_request_t& operator=(const active_diagnostic_request_t& adr); active_diagnostic_request_t(); active_diagnostic_request_t(active_diagnostic_request_t&&) = default; - //active_diagnostic_request_t(const active_diagnostic_request_t&) = default; active_diagnostic_request_t(std::shared_ptr bus, DiagnosticRequest* request, const std::string& name, bool wait_for_multiple_responses, const DiagnosticResponseDecoder decoder, @@ -91,6 +92,10 @@ public: uint32_t get_id() const; std::shared_ptr get_can_bus_dev(); DiagnosticRequestHandle* get_handle(); + std::string& get_name(); + static std::string& get_prefix(); + DiagnosticResponseDecoder& get_decoder(); + DiagnosticResponseCallback& get_callback(); bool get_recurring() const; bool get_in_flight() const; frequency_clock_t& get_frequency_clock(); @@ -99,6 +104,8 @@ public: void set_handle(DiagnosticShims& shims, DiagnosticRequest* request); void set_in_flight(bool val); + static bool is_diagnostic_signal(const std::string& name); + bool should_send(); bool timed_out(); diff --git a/src/diagnostic/diagnostic-message.cpp b/src/diagnostic/diagnostic-message.cpp index 8b2273e..5a8f9e5 100644 --- a/src/diagnostic/diagnostic-message.cpp +++ b/src/diagnostic/diagnostic-message.cpp @@ -33,8 +33,6 @@ const char *UNIT_NAMES[10] = { "NM" }; -std::string obd2_signal_t::prefix_ = "diagnostic_messages."; - obd2_signal_t::obd2_signal_t(uint8_t pid, const char* generic_name, const int min, const int max, enum UNIT unit, int frequency, bool supported) : pid_{pid}, generic_name_{generic_name}, min_{min}, max_{max}, unit_{unit}, frequency_{frequency}, supported_{supported} { @@ -52,12 +50,7 @@ const std::string& obd2_signal_t::get_generic_name() const const std::string obd2_signal_t::get_name() const { - return prefix_ + "." + generic_name_; -} - -const std::string& obd2_signal_t::get_prefix() -{ - return prefix_; + return active_diagnostic_request_t::get_prefix() + "." + generic_name_; } int obd2_signal_t::get_frequency() const @@ -65,11 +58,6 @@ int obd2_signal_t::get_frequency() const return frequency_; } -void obd2_signal_t::set_prefix(const std::string& val) -{ - prefix_ = val; -} - /** * @brief Build a DiagnosticRequest struct to be passed * to diagnostic manager instance. @@ -87,72 +75,16 @@ const DiagnosticRequest obd2_signal_t::build_diagnostic_request() /*DiagnosticRequestType: */DiagnosticRequestType::DIAGNOSTIC_REQUEST_TYPE_PID }; } -bool obd2_signal_t::is_obd2_response(can_message_t can_message) -{ - /* - if(can_message.get_id() >= 0x7E8 && can_message.get_id() <= 0x7EF) - { - openxc_VehicleMessage message = {0}; - message.has_type = true; - message.type = openxc_VehicleMessage_Type_DIAGNOSTIC; - message.has_diagnostic_response = true; - message.diagnostic_response = {0}; - message.diagnostic_response.has_bus = true; - message.diagnostic_response.bus = bus->address; - message.diagnostic_response.has_message_id = true; - //7DF should respond with a random message id between 7e8 and 7ef - //7E0 through 7E7 should respond with a id that is 8 higher (7E0->7E8) - if(can_message.get_id() == 0x7DF) - { - message.diagnostic_response.message_id = rand()%(0x7EF-0x7E8 + 1) + 0x7E8; - } - else if(commandRequest->message_id >= 0x7E0 && commandRequest->message_id <= 0x7E7) - { - message.diagnostic_response.message_id = commandRequest->message_id + 8; - } - message.diagnostic_response.has_mode = true; - message.diagnostic_response.mode = commandRequest->mode; - if(commandRequest->has_pid) - { - message.diagnostic_response.has_pid = true; - message.diagnostic_response.pid = commandRequest->pid; - } - message.diagnostic_response.has_value = true; - message.diagnostic_response.value = rand() % 100; - pipeline::publish(&message, &getConfiguration()->pipeline); - } - else //If it's outside the range, the command_request will return false - { - debug("Sent message ID is outside the valid range for emulator (7DF to 7E7)"); - status=false; - } - return false; - */ - return false; -} - /** * @brief Check if a request is an OBD-II PID request. * * @return true if the request is a mode 1 request and it has a 1 byte PID. */ -bool obd2_signal_t::is_obd2_request(DiagnosticRequest* request) +bool obd2_signal_t::is_obd2_request(const DiagnosticRequest* request) { return request->mode == 0x1 && request->has_pid && request->pid < 0xff; } -/** -* @brief Check if requested signal name is an obd2 pid -* -* @return true if name began with obd2 else false. -*/ -bool obd2_signal_t::is_obd2_signal(const std::string& name) -{ - if(name.find_first_of(prefix_.c_str(), 0, prefix_.size())) - return true; - return false; -} - /** * @brief Decode the payload of an OBD-II PID. * diff --git a/src/diagnostic/diagnostic-message.hpp b/src/diagnostic/diagnostic-message.hpp index ec4521f..7f407b4 100644 --- a/src/diagnostic/diagnostic-message.hpp +++ b/src/diagnostic/diagnostic-message.hpp @@ -46,8 +46,6 @@ class obd2_signal_t { private: uint8_t pid_; /*!< pid - The 1 byte PID.*/ std::string generic_name_; /*!< generic_name_ - A human readable name to use for this PID when published.*/ - static std::string prefix_; /*!< prefix_ - generic_name_ will be prefixed with it. It has to reflect the used protocol. - * which make easier to sort message when the come in.*/ int min_; /*!< min_ - Minimum value that can take this pid */ int max_; /*!< max_ - Maximum value that can take this pid */ enum UNIT unit_; /*!< unit_ : Which unit system is used by that pid. See enum UNIT above.*/ @@ -61,16 +59,12 @@ class obd2_signal_t { uint32_t get_pid(); const std::string& get_generic_name() const; const std::string get_name() const; - static const std::string& get_prefix(); int get_frequency() const; - static void set_prefix(const std::string& val); - const DiagnosticRequest build_diagnostic_request(); - bool is_obd2_response(can_message_t can_message); - bool is_obd2_request(DiagnosticRequest *request); - static bool is_obd2_signal(const std::string& name); + bool is_obd2_response(const can_message_t& can_message); + bool is_obd2_request(const DiagnosticRequest *request); static float decode_obd2_response(const DiagnosticResponse* response, float parsedPayload); -}; \ No newline at end of file +}; diff --git a/src/low-can-binding.cpp b/src/low-can-binding.cpp index 0c418fe..8ecf742 100644 --- a/src/low-can-binding.cpp +++ b/src/low-can-binding.cpp @@ -132,7 +132,7 @@ static int subscribe_unsubscribe_signals(struct afb_req request, bool subscribe, for(const std::string& sig : signals) { int ret; - if (obd2_signal_t::is_obd2_signal(sig)) + if (active_diagnostic_request_t::is_diagnostic_signal(sig)) { std::vector found; configuration_t::instance().find_obd2_signals(build_DynamicField(sig), found); @@ -252,9 +252,10 @@ extern "C" return 0; } - /// Initialize Diagnostic manager that will handle obd2 requests - diagnostic_manager_t& diag_manager = configuration_t::instance().get_diagnostic_manager(); - diag_manager.initialize(can_bus_manager.get_can_devices().front()); + /// Initialize Diagnostic manager that will handle obd2 requests. + /// We pass by default the first CAN bus device to its Initialization. + /// TODO: be able to choose the CAN bus device that will be use as Diagnostic bus. + configuration_t::instance().get_diagnostic_manager().initialize(can_bus_manager.get_can_devices().front()); ERROR(binder_interface, "There was something wrong with CAN device Initialization. Check your config file maybe"); return 1; -- cgit 1.2.3-korg