*
*********************************************************************************/
-CanBus_c::CanBus_c(afb_binding_interface *itf, const std:string& dev_name)
+can_bus_t::can_bus_t(afb_binding_interface *itf, const std:string& dev_name)
: interface{itf}, deviceName{dev_name}
{
}
-int CanBus_c::open()
+int can_bus_t::open()
{
const int canfd_on = 1;
struct ifreq ifr;
struct timeval timeout = {1, 0};
- DEBUG(interface, "open_can_dev: CAN Handler socket : %d", socket);
+ DEBUG(interface_, "open_can_dev: CAN Handler socket : %d", can_socket_);
if (can_socket_ >= 0)
return 0;
can_socket_ = ::socket(PF_CAN, SOCK_RAW, CAN_RAW);
if (socket < 0)
{
- ERROR(interface, "open_can_dev: socket could not be created");
+ ERROR(interface_, "open_can_dev: socket could not be created");
}
else
{
/* try to switch the socket into CAN_FD mode */
if (::setsockopt(can_socket_, SOL_CAN_RAW, CAN_RAW_FD_FRAMES, &canfd_on, sizeof(canfd_on)) < 0)
{
- NOTICE(interface, "open_can_dev: Can not switch into CAN Extended frame format.");
- is_fdmode_on = false;
+ NOTICE(interface_, "open_can_dev: Can not switch into CAN Extended frame format.");
+ is_fdmode_on_ = false;
} else {
- is_fdmode_on = true;
+ is_fdmode_on_ = true;
}
/* Attempts to open a socket to CAN bus */
::strcpy(ifr.ifr_name, device);
if(ioctl(can_socket_, SIOCGIFINDEX, &ifr) < 0)
- ERROR(interface, "open_can_dev: ioctl failed");
+ ERROR(interface_, "open_can_dev: ioctl failed");
else
{
txAddress.can_family = AF_CAN;
txAddress.can_ifindex = ifr.ifr_ifindex;
/* And bind it to txAddress */
- if (::bind(can_socket_, (struct sockaddr *)&txAddress, sizeof(txAddress)) < 0)
+ if (::bind(can_socket_, (struct sockaddr *)&txAddress_, sizeof(txAddress_)) < 0)
{
- ERROR(interface, "open_can_dev: bind failed");
+ ERROR(interface_, "open_can_dev: bind failed");
}
else
{
return -1;
}
-int CanBus_c::close()
+int can_bus_t::close()
{
::close(can_socket_);
can_socket_ = -1;
}
-void CanBus_c::start_threads()
+
+canfd_frame can_bus_t::can_read()
+{
+ ssize_t nbytes;
+ int maxdlen;
+ canfd_frame canfd_frame;
+
+ /* Test that socket is really opened */
+ if (can_socket_ < 0)
+ {
+ ERROR(interface_, "read_can: Socket unavailable. Closing thread.");
+ is_running_ = false;
+ }
+
+ nbytes = ::read(can_socket_, &canfd_frame, CANFD_MTU);
+
+ switch(nbytes)
+ {
+ case CANFD_MTU:
+ DEBUG(interface_, "read_can: Got an CAN FD frame with length %d", canfd_frame.len);
+ maxdlen = CANFD_MAX_DLEN;
+ break;
+ case CAN_MTU:
+ DEBUG(interface_, "read_can: Got a legacy CAN frame with length %d", canfd_frame.len);
+ maxdlen = CAN_MAX_DLEN;
+ break;
+ default:
+ if (errno == ENETDOWN)
+ ERROR(interface_, "read_can: %s interface down", device);
+ ERROR(interface_, "read_can: Error reading CAN bus");
+ ::memset(&canfd_frame, 0, sizeof(canfd_frame));
+ break;
+ }
+
+ return canfd_frame;
+}
+
+void can_bus_t::start_threads()
{
th_reading_ = std::thread(can_reader, interface, socket, can_message_q_);
+ is_running_ = true;
+
th_decoding_ = std::thread(can_decoder, interface, can_message_q, can_message_q_);
th_pushing_ = std::thread(can_event_push, interface, can_message_q_);
}
/*
- * Send a can message from a CanMessage_c object.
+ * Return is_running_ bool
+ */
+bool can_bus_t::is_running()
+{
+ return is_running_;
+}
+
+/*
+ * Send a can message from a can_message_t object.
*/
-int CanBus_c::send_can_message(CanMessage_c can_msg)
+int can_bus_t::send_can_message(can_message_t &can_msg)
{
int nbytes;
canfd_frame *f;
*
* Return the next queue element or NULL if queue is empty.
*/
-CanMessage_c* CanBus_c::next_can_message()
+can_message_t* can_bus_t::next_can_message()
{
if(! can_message_q_.empty())
{
- CanMessage_c can_msg = can_message_q_.front();
+ can_message_t can_msg = can_message_q_.front();
can_message_q_.pop()
return &can_msg;
}
return nullptr;
}
-void CanBus_c::insert_new_can_message(CanMessage_c *can_msg)
+void can_bus_t::insert_new_can_message(can_message_t &can_msg)
{
can_message_q_.push(can_msg);
}
*
* Return the next queue element or NULL if queue is empty.
*/
-openxc_VehicleMessage* CanBus_c::next_vehicle_message()
+openxc_VehicleMessage* can_bus_t::next_vehicle_message()
{
if(! vehicle_message_q_.empty())
{
return nullptr;
}
-void CanBus_c::insert_new_vehicle_message(openxc_VehicleMessage *v_msg)
+void can_bus_t::insert_new_vehicle_message(openxc_VehicleMessage *v_msg)
{
vehicle_message_q_.push(v_msg);
}
*
*********************************************************************************/
-uint32_t CanMessage_c::get_id() const
+uint32_t can_message_t::get_id() const
{
return id;
}
-int CanMessage_c::get_format() const
+int can_message_t::get_format() const
{
return format;
}
-uint8_t CanMessage_c::get_data() const
+uint8_t can_message_t::get_data() const
{
return data;
}
-uint8_t CanMessage_c::get_lenght() const
+uint8_t can_message_t::get_lenght() const
{
return lenght;
}
-void CanMessage_c::set_id(uint32_t new_id)
+void can_message_t::set_id(uint32_t new_id)
{
switch(format):
case CanMessageFormat::SIMPLE:
ERROR(interface, "ERROR: Can set id, not a compatible format or format not set prior to set id.");
}
-void CanMessage_c::set_format(CanMessageFormat new_format)
+void can_message_t::set_format(CanMessageFormat new_format)
{
if(new_format == CanMessageFormat::SIMPLE || new_format == CanMessageFormat::EXTENDED)
format = new_format;
ERROR(interface, "ERROR: Can set format, wrong format chosen");
}
-void CanMessage_c::set_data(uint8_t new_data)
+void can_message_t::set_data(uint8_t new_data)
{
data = new_data;
}
-void CanMessage_c::set_lenght(uint8_t new_length)
+void can_message_t::set_lenght(uint8_t new_length)
{
lenght = new_lenght;
}
*
* params: canfd_frame pointer
*/
-void CanMessage_c::convert_from_canfd_frame(canfd_frame *frame)
+void can_message_t::convert_from_canfd_frame(canfd_frame *frame)
{
lenght = (canfd_frame->len > maxdlen) ? maxdlen : canfd_frame->len;
memcpy(data, canfd_frame->data, lenght);
return 0;
} else if (sizeof(canfd_frame->data) >= CAN_MAX_DLEN)
- ERROR(interface, "CanMessage_c: canfd_frame data too long to be stored into CanMessage object");
+ ERROR(interface, "can_message_t: canfd_frame data too long to be stored into CanMessage object");
}
canfd_frame* convert_to_canfd_frame()