+ event_filter_.frequency = freq;
+}
+
+void low_can_subscription_t::set_min(float min)
+{
+ event_filter_.min = min;
+}
+
+void low_can_subscription_t::set_max(float max)
+{
+ event_filter_.max = max;
+}
+
+/// @brief Create a RX_SETUP receive job used by the BCM socket.
+///
+/// @return 0 if ok else -1
+int low_can_subscription_t::create_rx_filter(const std::string& bus_name, const std::string& sig_name, uint32_t can_id, uint8_t bit_position, uint8_t bit_size, float factor, float offset)
+{
+ // Make sure that socket has been opened.
+ if(! socket_)
+ {
+ socket_.open(bus_name);
+ index_ = (int)socket_.socket();
+ }
+
+ sig_name_ = sig_name;
+ bus_name_ = bus_name;
+ can_id_ = can_id;
+ bit_position_ = bit_position;
+ bit_size_ = bit_size;
+ factor_ = factor;
+ offset_ = offset;
+
+ struct utils::simple_bcm_msg bcm_msg;
+ struct can_frame cfd;
+
+ memset(&cfd, 0, sizeof(cfd));
+ memset(&bcm_msg.msg_head, 0, sizeof(bcm_msg.msg_head));
+ float val = (float)(1 << bit_size_) - 1;
+
+ struct timeval freq;
+ frequency_clock_t f(event_filter_.frequency);
+ freq = f.get_timeval_from_period();
+
+ bcm_msg.msg_head.opcode = RX_SETUP;
+ bcm_msg.msg_head.can_id = can_id_;
+ bcm_msg.msg_head.flags = SETTIMER|RX_NO_AUTOTIMER;
+ bcm_msg.msg_head.ival2.tv_sec = freq.tv_sec ;
+ bcm_msg.msg_head.ival2.tv_usec = freq.tv_usec;
+ bcm_msg.msg_head.nframes = 1;
+ bitfield_encode_float(val,
+ bit_position_,
+ bit_size_,
+ factor_,
+ offset_,
+ cfd.data,
+ CAN_MAX_DLEN);
+
+ bcm_msg.frames = cfd;
+
+ if(socket_ << bcm_msg)
+ return 0;
+ return -1;
+}
+
+/// @brief Create a RX_SETUP receive job used by the BCM socket.
+///
+/// @return 0 if ok else -1
+int low_can_subscription_t::create_rx_filter()
+{
+ // Make sure that socket has been opened.
+ if(! socket_)
+ {
+ socket_.open(bus_name_);
+ index_ = (int)socket_.socket();
+ }
+
+ struct utils::simple_bcm_msg bcm_msg;
+ struct can_frame cfd;
+
+ memset(&cfd, 0, sizeof(cfd));
+ memset(&bcm_msg.msg_head, 0, sizeof(bcm_msg.msg_head));
+ float val = (float)(1 << bit_size_) - 1;
+
+ struct timeval freq;
+ frequency_clock_t f(event_filter_.frequency);
+ freq = f.get_timeval_from_period();
+
+ bcm_msg.msg_head.opcode = RX_SETUP;
+ bcm_msg.msg_head.can_id = can_id_;
+ bcm_msg.msg_head.flags = SETTIMER|RX_NO_AUTOTIMER;
+ bcm_msg.msg_head.ival2.tv_sec = freq.tv_sec ;
+ bcm_msg.msg_head.ival2.tv_usec = freq.tv_usec;
+ bcm_msg.msg_head.nframes = 1;
+ bitfield_encode_float(val,
+ bit_position_,
+ bit_size_,
+ factor_,
+ offset_,
+ cfd.data,
+ CAN_MAX_DLEN);
+
+ bcm_msg.frames = cfd;
+
+ if(socket_ << bcm_msg)
+ return 0;
+ return -1;
+}
+
+///******************************************************************************
+///
+/// SystemD event loop Callbacks
+///
+///*******************************************************************************/
+
+void on_no_clients(const std::string& message)
+{
+ DiagnosticRequest* diag_req = application_t::instance().get_request_from_diagnostic_message(message);