+* CanMessage method implementation
+*
+*********************************************************************************/
+
+can_message_t::can_message_t(const struct afb_binding_interface* interface)
+ : interface_{interface}
+{}
+
+uint32_t can_message_t::get_id() const
+{
+ if (id_ != 0)
+ return id_;
+ return 0;
+}
+
+int can_message_t::get_format() const
+{
+ if (format_ != CanMessageFormat::STANDARD || format_ != CanMessageFormat::EXTENDED)
+ return -1;
+ return format_;
+}
+
+const uint8_t* can_message_t::get_data() const
+{
+ return &data_;
+}
+uint8_t can_message_t::get_length() const
+{
+ return length_;
+}
+
+void can_message_t::set_id(const uint32_t new_id)
+{
+ switch(format_)
+ {
+ case CanMessageFormat::STANDARD:
+ id_ = new_id & CAN_SFF_MASK;
+ break;
+ case CanMessageFormat::EXTENDED:
+ id_ = new_id & CAN_EFF_MASK;
+ break;
+ default:
+ ERROR(interface_, "ERROR: Can set id, not a compatible format or format not set prior to set id.");
+ break;
+ }
+}
+
+void can_message_t::set_format(const CanMessageFormat new_format)
+{
+ if(new_format == CanMessageFormat::STANDARD || new_format == CanMessageFormat::EXTENDED)
+ format_ = new_format;
+ else
+ ERROR(interface_, "ERROR: Can set format, wrong format chosen");
+}
+
+void can_message_t::set_data(const uint8_t new_data)
+{
+ ::memcpy(&data_, &new_data, sizeof(new_data));
+ length_ = sizeof(new_data);
+}
+
+/*
+ * @brief This is the preferred way to initialize a CanMessage object
+ * from a read canfd_frame message.
+ *
+ * @param: canfd_frame pointer
+ */
+void can_message_t::convert_from_canfd_frame(const canfd_frame& frame)
+{
+ length_ = (frame.len > CAN_MAX_DLEN) ? (uint8_t)CAN_MAX_DLEN : frame.len;
+ length_ = (frame.len > CANFD_MAX_DLEN) ? (uint8_t)CANFD_MAX_DLEN : frame.len;
+
+ if (frame.can_id & CAN_ERR_FLAG)
+ id_ = frame.can_id & (CAN_ERR_MASK|CAN_ERR_FLAG);
+ else if (frame.can_id & CAN_EFF_FLAG)
+ {
+ id_ = frame.can_id & CAN_EFF_MASK;
+ format_ = CanMessageFormat::EXTENDED;
+ }
+ else
+ {
+ id_ = frame.can_id & CAN_SFF_MASK;
+ format_ = CanMessageFormat::STANDARD;
+ }
+
+ if (sizeof(frame.data) <= sizeof(data_))
+ ::memcpy(&data_, frame.data, length_);
+ else if (sizeof(frame.data) >= CAN_MAX_DLEN)
+ ERROR(interface_, "can_message_t: canfd_frame data too long to be stored into CanMessage object");
+}
+
+canfd_frame can_message_t::convert_to_canfd_frame()
+{
+ canfd_frame frame;
+
+ frame.can_id = get_id();
+ frame.len = get_length();
+ ::memcpy(frame.data, get_data(), length_);
+
+ return frame;
+}
+/********************************************************************************
+*
+* can_bus_dev_t method implementation