diff options
-rw-r--r-- | low-can-binding/binding/low-can-subscription.cpp | 40 | ||||
-rw-r--r-- | low-can-binding/binding/low-can-subscription.hpp | 4 |
2 files changed, 43 insertions, 1 deletions
diff --git a/low-can-binding/binding/low-can-subscription.cpp b/low-can-binding/binding/low-can-subscription.cpp index 6cfcb718..99f209be 100644 --- a/low-can-binding/binding/low-can-subscription.cpp +++ b/low-can-binding/binding/low-can-subscription.cpp @@ -280,6 +280,11 @@ std::shared_ptr<utils::socketcan_t> low_can_subscription_t::get_socket() return socket_; } +std::shared_ptr<message_definition_t> low_can_subscription_t::get_message_definition() +{ + return message_; +} + /** * @brief Setter for the frequency of the event_filter * @@ -355,6 +360,10 @@ void low_can_subscription_t::set_signal(std::shared_ptr<signal_t> signal) signal_ = signal; } +void low_can_subscription_t::set_message_definition(std::shared_ptr<message_definition_t> message) +{ + message_ = message; +} /// @brief Based upon which object is a subscribed CAN signal or diagnostic message /// it will open the socket with the required CAN bus device name. @@ -607,6 +616,35 @@ int low_can_subscription_t::create_rx_filter_can(low_can_subscription_t &subscri return create_rx_filter_bcm(subscription, bcm_msg); } + +int low_can_subscription_t::create_rx_filter(std::shared_ptr<message_definition_t> msg) +{ + std::shared_ptr<signal_t> signal_message = + std::make_shared<signal_t>(signal_t{msg->get_name(), + 0, + msg->get_length() * 8, + 1.00000f, + 0.00000f, + 0, + 0, + frequency_clock_t(0.00000f), + true, + false, + {}, + true, + nullptr, + nullptr, + false, + std::make_pair<bool, int>(false, 0), + static_cast<sign_t>(0), + -1, + ""}); + + signal_message->set_parent(msg); + return create_rx_filter(signal_message); +} + + /** * @brief Create the good socket to read message * depending on the signal @@ -626,7 +664,7 @@ int low_can_subscription_t::create_rx_filter(std::shared_ptr<signal_t> sig) else if(sig->get_message()->is_j1939()) return low_can_subscription_t::create_rx_filter_j1939(*this, sig); #endif - AFB_ERROR("Signal can't be j1939 and isotp"); + AFB_ERROR("Signal can't be created (check config)"); return -1; } diff --git a/low-can-binding/binding/low-can-subscription.hpp b/low-can-binding/binding/low-can-subscription.hpp index 972b6d61..df978861 100644 --- a/low-can-binding/binding/low-can-subscription.hpp +++ b/low-can-binding/binding/low-can-subscription.hpp @@ -56,6 +56,7 @@ private: afb_event_t event_; ///< event_ - application framework event used to push on client /// Signal part + std::shared_ptr<message_definition_t> message_; std::shared_ptr<signal_t> signal_; ///< signal_ - the CAN signal subscribed vect_ptr_diag_msg_t diagnostic_message_; ///< diagnostic_message_ - diagnostic messages meant to receive OBD2 /// responses. Normal diagnostic request and response are not tested for now. @@ -92,6 +93,7 @@ public: canid_t get_rx_id() const; canid_t get_tx_id() const; std::shared_ptr<utils::socketcan_t> get_socket(); + std::shared_ptr<message_definition_t> get_message_definition(); void set_frequency(float freq); void set_min(float min); @@ -101,6 +103,7 @@ public: void set_rx_id(canid_t rx_id); void set_tx_id(canid_t tx_id); void set_signal(std::shared_ptr<signal_t> signal); + void set_message_definition(std::shared_ptr<message_definition_t> message); static struct bcm_msg make_bcm_head(uint32_t opcode, uint32_t can_id = 0, uint32_t flags = 0, const struct timeval& timeout = {0, 0}, const struct timeval& frequency_thinning = {0, 0}); static void add_one_bcm_frame(struct canfd_frame& cfd, struct bcm_msg& bcm_msg); @@ -109,6 +112,7 @@ public: static int open_socket(low_can_subscription_t &subscription, const std::string& bus_name = "", uint32_t flags = INVALID_FLAG); int create_rx_filter(std::shared_ptr<signal_t> sig); + int create_rx_filter(std::shared_ptr<message_definition_t> msg); int create_rx_filter(std::shared_ptr<diagnostic_message_t> sig); static int create_rx_filter_can(low_can_subscription_t &subscription, std::shared_ptr<signal_t> sig); static int create_rx_filter_j1939(low_can_subscription_t &subscription, std::shared_ptr<signal_t> sig); |