summaryrefslogtreecommitdiffstats
path: root/CAN-binder/low-can-binding/can/can-bus-dev.cpp
diff options
context:
space:
mode:
authorRomain Forlot <romain.forlot@iot.bzh>2017-04-24 19:15:07 +0200
committerRomain Forlot <romain.forlot@iot.bzh>2017-04-24 19:15:07 +0200
commit84264431ca5a9958b3bb00b3de481336cf0cccb1 (patch)
tree068c4a89e3b79db33f0ee6e607ae6cbbbf1eb14b /CAN-binder/low-can-binding/can/can-bus-dev.cpp
parent901a27b0631909647137f49ccf12f4e9bfe38817 (diff)
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 <romain.forlot@iot.bzh>
Diffstat (limited to 'CAN-binder/low-can-binding/can/can-bus-dev.cpp')
-rw-r--r--CAN-binder/low-can-binding/can/can-bus-dev.cpp27
1 files changed, 27 insertions, 0 deletions
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 8470156f..6cd2264b 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 <mutex>
#include <unistd.h>
#include <linux/can/raw.h>
+#include <linux/can/bcm.h>
#include "can-bus-dev.hpp"
+#include <cmath>
#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)