Create a received job for BCM Socket to handle filtering.
authorRomain Forlot <romain.forlot@iot.bzh>
Mon, 24 Apr 2017 17:15:07 +0000 (19:15 +0200)
committerRomain Forlot <romain.forlot@iot.bzh>
Mon, 24 Apr 2017 17:15:07 +0000 (19:15 +0200)
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 <romain.forlot@iot.bzh>
CAN-binder/low-can-binding/can/can-bus-dev.cpp
CAN-binder/low-can-binding/can/can-bus-dev.hpp
CAN-binder/low-can-binding/can/can-bus.cpp
CAN-binder/low-can-binding/can/can-bus.hpp
CAN-binder/low-can-binding/can/can-message-definition.cpp
CAN-binder/low-can-binding/can/can-message-definition.hpp

index 8470156..6cd2264 100644 (file)
 #include <mutex>
 #include <unistd.h>
 #include <linux/can/raw.h>
 #include <mutex>
 #include <unistd.h>
 #include <linux/can/raw.h>
+#include <linux/can/bcm.h>
 
 #include "can-bus-dev.hpp"
 
 #include "can-bus-dev.hpp"
+#include <cmath>
 
 #include "can-bus.hpp"
 #include "can-message.hpp"
 #include "../low-can-binding.hpp"
 
 #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
 /// @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);
 }
 
        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)
 /// @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)
index 5961214..04914ce 100644 (file)
 #include <string>
 #include <thread>
 
 #include <string>
 #include <thread>
 
-#include "../utils/socket.hpp"
+#include "../utils/socketcan.hpp"
 
 class can_bus_t;
 class can_message_t;
 
 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.
 
 /// @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();
        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);
 
        int send(can_message_t& can_msg);
        bool shims_send(const uint32_t arbitration_id, const uint8_t* data, const uint8_t size);
index 6e6fba2..6665744 100644 (file)
@@ -335,6 +335,15 @@ void can_bus_t::push_new_vehicle_message(const openxc_VehicleMessage& v_msg)
        vehicle_message_q_.push(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
 /// @brief Return a map with the can_bus_dev_t initialized
 ///
 /// @return map can_bus_dev_m_ map
index 764218d..2194fa2 100644 (file)
@@ -27,6 +27,7 @@
 #include "openxc.pb.h"
 #include "can-message.hpp"
 #include "can-bus-dev.hpp"
 #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"
 
 #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);
 
        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<std::string, std::shared_ptr<can_bus_dev_t>>& get_can_devices() const;
        static std::shared_ptr<can_bus_dev_t> get_can_device(std::string bus);
 };
        const std::map<std::string, std::shared_ptr<can_bus_dev_t>>& get_can_devices() const;
        static std::shared_ptr<can_bus_dev_t> get_can_device(std::string bus);
 };
index 206d0b0..9829428 100644 (file)
@@ -49,6 +49,11 @@ can_message_definition_t::can_message_definition_t(std::uint8_t message_set_id,
        last_value_{CAN_MESSAGE_SIZE}
 {}
 
        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_;
 uint32_t can_message_definition_t::get_id() const
 {
        return id_;
index 98cb2c5..7bc982d 100644 (file)
@@ -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);
 
        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;
 };
        uint32_t get_id() const;
 };