From 84264431ca5a9958b3bb00b3de481336cf0cccb1 Mon Sep 17 00:00:00 2001 From: Romain Forlot Date: Mon, 24 Apr 2017 19:15:07 +0200 Subject: [PATCH] Create a received job for BCM Socket to handle filtering. Filter is created using can_signals description and send with appropriate BCM header structure. This is the simplest way to do, no temporal filtering for now is available. Change-Id: Iee49f011ba9316880735d2765c1c23a8b2d3c4d2 Signed-off-by: Romain Forlot --- CAN-binder/low-can-binding/can/can-bus-dev.cpp | 27 ++++++++++++++++++++++ CAN-binder/low-can-binding/can/can-bus-dev.hpp | 4 +++- CAN-binder/low-can-binding/can/can-bus.cpp | 9 ++++++++ CAN-binder/low-can-binding/can/can-bus.hpp | 3 +++ .../low-can-binding/can/can-message-definition.cpp | 5 ++++ .../low-can-binding/can/can-message-definition.hpp | 1 + 6 files changed, 48 insertions(+), 1 deletion(-) diff --git a/CAN-binder/low-can-binding/can/can-bus-dev.cpp b/CAN-binder/low-can-binding/can/can-bus-dev.cpp index 8470156..6cd2264 100644 --- a/CAN-binder/low-can-binding/can/can-bus-dev.cpp +++ b/CAN-binder/low-can-binding/can/can-bus-dev.cpp @@ -20,13 +20,17 @@ #include #include #include +#include #include "can-bus-dev.hpp" +#include #include "can-bus.hpp" #include "can-message.hpp" #include "../low-can-binding.hpp" +#include "canutil/write.h" +#define U64_DATA(p) (*(unsigned long long*)(p)->data) /// @brief Class constructor /// /// @param[in] dev_name - String representing the device name into the linux /dev tree @@ -113,6 +117,29 @@ can_message_t can_bus_dev_t::read() return can_message_t::convert_from_canfd_frame(cfd, nbytes); } +/// @brief Create a RX_SETUP receive job using the BCM socket. +/// +/// @return 0 if ok else -1 +int can_bus_dev_t::create_rx_filter(const can_signal_t& s) +{ + uint32_t can_id = s.get_message().get_id(); + + struct utils::canfd_bcm_msg bcm_msg; + + uint8_t bit_size = s.get_bit_size(); + float val = (float)exp2(bit_size); + uint64_t filter = eightbyte_encode_float(val, s.get_bit_position(), bit_size, s.get_factor(), s.get_offset()); + + bcm_msg.msg_head.opcode = RX_SETUP; + bcm_msg.msg_head.can_id = can_id; + bcm_msg.msg_head.nframes = 1; + U64_DATA(&bcm_msg.frames[0]) = filter; + + if(can_socket_ << bcm_msg) + return 0; + return -1; +} + /// @brief start reading threads and set flag is_running_ /// @param[in] can_bus reference can_bus_t. it will be passed to the thread to allow using can_bus_t queue. void can_bus_dev_t::start_reading(can_bus_t& can_bus) diff --git a/CAN-binder/low-can-binding/can/can-bus-dev.hpp b/CAN-binder/low-can-binding/can/can-bus-dev.hpp index 5961214..04914ce 100644 --- a/CAN-binder/low-can-binding/can/can-bus-dev.hpp +++ b/CAN-binder/low-can-binding/can/can-bus-dev.hpp @@ -23,10 +23,11 @@ #include #include -#include "../utils/socket.hpp" +#include "../utils/socketcan.hpp" class can_bus_t; class can_message_t; +class can_signal_t; /// @brief Object representing a can device. Handle opening, closing and reading on the /// socket. This is the low level object to be initialized and use by can_bus_t. @@ -57,6 +58,7 @@ public: void stop_reading(); can_message_t read(); + int create_rx_filter(const can_signal_t& s); int send(can_message_t& can_msg); bool shims_send(const uint32_t arbitration_id, const uint8_t* data, const uint8_t size); diff --git a/CAN-binder/low-can-binding/can/can-bus.cpp b/CAN-binder/low-can-binding/can/can-bus.cpp index 6e6fba2..6665744 100644 --- a/CAN-binder/low-can-binding/can/can-bus.cpp +++ b/CAN-binder/low-can-binding/can/can-bus.cpp @@ -335,6 +335,15 @@ void can_bus_t::push_new_vehicle_message(const openxc_VehicleMessage& v_msg) vehicle_message_q_.push(v_msg); } +/// @brief Create a RX_SETUP receive job for the BCM socket of a CAN signal. +/// +/// @return 0 if ok. + int can_bus_t::create_rx_filter(const can_signal_t& s) + { + const std::string& bus = s.get_message().get_bus_name(); + return can_bus_t::can_devices_[bus]->create_rx_filter(s); + } + /// @brief Return a map with the can_bus_dev_t initialized /// /// @return map can_bus_dev_m_ map diff --git a/CAN-binder/low-can-binding/can/can-bus.hpp b/CAN-binder/low-can-binding/can/can-bus.hpp index 764218d..2194fa2 100644 --- a/CAN-binder/low-can-binding/can/can-bus.hpp +++ b/CAN-binder/low-can-binding/can/can-bus.hpp @@ -27,6 +27,7 @@ #include "openxc.pb.h" #include "can-message.hpp" #include "can-bus-dev.hpp" +#include "can-signals.hpp" #include "../utils/config-parser.hpp" #include "../diagnostic/active-diagnostic-request.hpp" @@ -90,6 +91,8 @@ public: openxc_VehicleMessage next_vehicle_message(); void push_new_vehicle_message(const openxc_VehicleMessage& v_msg); + int create_rx_filter(const can_signal_t& signal); + const std::map>& get_can_devices() const; static std::shared_ptr get_can_device(std::string bus); }; diff --git a/CAN-binder/low-can-binding/can/can-message-definition.cpp b/CAN-binder/low-can-binding/can/can-message-definition.cpp index 206d0b0..9829428 100644 --- a/CAN-binder/low-can-binding/can/can-message-definition.cpp +++ b/CAN-binder/low-can-binding/can/can-message-definition.cpp @@ -49,6 +49,11 @@ can_message_definition_t::can_message_definition_t(std::uint8_t message_set_id, last_value_{CAN_MESSAGE_SIZE} {} +const std::string& can_message_definition_t::get_bus_name() const +{ + return bus_; +} + uint32_t can_message_definition_t::get_id() const { return id_; diff --git a/CAN-binder/low-can-binding/can/can-message-definition.hpp b/CAN-binder/low-can-binding/can/can-message-definition.hpp index 98cb2c5..7bc982d 100644 --- a/CAN-binder/low-can-binding/can/can-message-definition.hpp +++ b/CAN-binder/low-can-binding/can/can-message-definition.hpp @@ -53,5 +53,6 @@ public: can_message_definition_t(std::uint8_t message_set_id, const std::string bus, uint32_t id, frequency_clock_t frequency_clock, bool force_send_changed); can_message_definition_t(std::uint8_t message_set_id, const std::string bus, uint32_t id, can_message_format_t format, frequency_clock_t frequency_clock, bool force_send_changed); + const std::string& get_bus_name() const; uint32_t get_id() const; }; -- 2.16.6