aboutsummaryrefslogtreecommitdiffstats
path: root/src/can
diff options
context:
space:
mode:
authorRomain Forlot <romain.forlot@iot.bzh>2017-03-08 18:37:43 +0100
committerRomain Forlot <romain.forlot@iot.bzh>2017-03-16 17:10:40 +0100
commit8cc56c40c96a63b157ee11ac7fd2494ffa63357d (patch)
tree9ac7b4dc84455c9dc2d8880f5e5959ac6e86da6b /src/can
parent966a1cd8e6bea71ebadc20a38b1d46482d5cff2a (diff)
Make convert method static to get called at the return
statement of read. Also clean unsafe function, that can't be called separatly because they need to get called in a certain order. Change-Id: I5670f0cd1c0fdea4f228045b9124ecd60097ebb2 Signed-off-by: Romain Forlot <romain.forlot@iot.bzh>
Diffstat (limited to 'src/can')
-rw-r--r--src/can/can-message.cpp208
-rw-r--r--src/can/can-message.hpp25
2 files changed, 80 insertions, 153 deletions
diff --git a/src/can/can-message.cpp b/src/can/can-message.cpp
index 68279e2d..eec19d9b 100644
--- a/src/can/can-message.cpp
+++ b/src/can/can-message.cpp
@@ -32,7 +32,7 @@
* Constructor about can_message_t class.
*/
can_message_t::can_message_t()
- : id_{0}, rtr_flag_{false}, length_{0}, flags_{0}, format_{CanMessageFormat::ERROR}
+ : id_{0}, rtr_flag_{false}, length_{0}, flags_{0}, format_{CanMessageFormat::ERROR}, maxdlen_{0}
{}
/**
@@ -98,26 +98,6 @@ uint8_t can_message_t::get_length() const
return length_;
}
-void can_message_t::set_max_data_length(size_t nbytes)
-{
- maxdlen_ = 0;
-
- switch(nbytes)
- {
- case CANFD_MTU:
- DEBUG(binder_interface, "set_max_data_length: Got an CAN FD frame");
- maxdlen_ = CANFD_MAX_DLEN;
- break;
- case CAN_MTU:
- DEBUG(binder_interface, "set_max_data_length: Got a legacy CAN frame");
- maxdlen_ = CAN_MAX_DLEN;
- break;
- default:
- ERROR(binder_interface, "set_max_data_length: unsupported CAN frame");
- break;
- }
-}
-
/**
* @brief Control whether the object is correctly initialized
* to be sent over the CAN bus
@@ -137,34 +117,6 @@ bool can_message_t::is_correct_to_send()
}
/**
-* @brief Set id_ member value.
-*
-* Preferred way to initialize these members by using
-* convert_from_canfd_frame method.
-*
-* @param[in] id_ class member
-*/
-void can_message_t::set_id_and_format(const uint32_t new_id)
-{
- set_format(new_id);
- switch(format_)
- {
- case CanMessageFormat::STANDARD:
- id_ = new_id & CAN_SFF_MASK;
- break;
- case CanMessageFormat::EXTENDED:
- id_ = new_id & CAN_EFF_MASK;
- break;
- case CanMessageFormat::ERROR:
- id_ = new_id & (CAN_ERR_MASK|CAN_ERR_FLAG);
- break;
- default:
- ERROR(binder_interface, "ERROR: Can set id, not a compatible format or format not set prior to set id.");
- break;
- }
-}
-
-/**
* @brief Set format_ member value.
*
* Preferred way to initialize these members by using
@@ -181,111 +133,94 @@ void can_message_t::set_format(const CanMessageFormat new_format)
}
/**
-* @brief Set format_ member value. Deduced from the can_id
-* of a canfd_frame.
+* @brief Take a canfd_frame struct to initialize class members
*
-* Preferred way to initialize these members by using
-* convert_from_canfd_frame method.
+* This is the preferred way to initialize class members.
*
-* @param[in] can_id - integer from a canfd_frame
+* @param[in] args - struct read from can bus device.
*/
-void can_message_t::set_format(const uint32_t can_id)
+can_message_t can_message_t::convert_to_canfd_frame(const struct canfd_frame& frame, size_t nbytes)
{
- if (can_id & CAN_ERR_FLAG)
+ switch(nbytes)
+ {
+ case CANFD_MTU:
+ DEBUG(binder_interface, "set_max_data_length: Got an CAN FD frame");
+ maxdlen_ = CANFD_MAX_DLEN;
+ break;
+ case CAN_MTU:
+ DEBUG(binder_interface, "set_max_data_length: Got a legacy CAN frame");
+ maxdlen_ = CAN_MAX_DLEN;
+ break;
+ default:
+ ERROR(binder_interface, "set_max_data_length: unsupported CAN frame");
+ break;
+ }
+
+ if(rtr_flag_)
+ length_ = frame.len& 0xF;
+ else
+ {
+ length_ = (frame.len > maxdlen_) ? maxdlen_ : frame.len;
+ }
+
+ if (frame.can_id & CAN_ERR_FLAG)
format_ = CanMessageFormat::ERROR;
- else if (can_id & CAN_EFF_FLAG)
+ else if (frame.can_id & CAN_EFF_FLAG)
format_ = CanMessageFormat::EXTENDED;
else
format_ = CanMessageFormat::STANDARD;
-}
-
-/**
-* @brief Set format_ member value.
-*
-* Preferred way to initialize these members by using
-* convert_from_canfd_frame method.
-*
-* @param[in] format_ - class member
-*/
-void can_message_t::set_flags(const uint8_t flags)
-{
- flags_ = flags & 0xF;
-}
-
-/**
-* @brief Set length_ member value.
-*
-* Preferred way to initialize these members by using
-* convert_from_canfd_frame method.
-*
-* @param[in] new_length - array with a max size of 8 elements.
-*/
-void can_message_t::set_length(const uint8_t new_length)
-{
- if(rtr_flag_)
- length_ = new_length & 0xF;
- else
+
+ switch(format_)
{
- length_ = (new_length > maxdlen_) ? maxdlen_ : new_length;
+ case CanMessageFormat::STANDARD:
+ id_ = frame.can_id & CAN_SFF_MASK;
+ break;
+ case CanMessageFormat::EXTENDED:
+ id_ = frame.can_id & CAN_EFF_MASK;
+ break;
+ case CanMessageFormat::ERROR:
+ id_ = frame.can_id & (CAN_ERR_MASK|CAN_ERR_FLAG);
+ break;
+ default:
+ ERROR(binder_interface, "ERROR: Can set id, not a compatible format or format not set prior to set id.");
+ break;
}
-}
-
-/**
-* @brief Set data_ member value.
-*
-* Preferred way to initialize these members by using
-* convert_from_canfd_frame method.
-*
-* @param[in] new_data - array with a max size of 8 elements.
-*/
-void can_message_t::set_data(const __u8* new_data)
-{
- int i;
-
- data_.clear();
- /* maxdlen_ is now set at CAN_MAX_DLEN or CANFD_MAX_DLEN, respectively 8 and 64 bytes*/
- for(i=0;i<maxdlen_;i++)
- {
- data_.push_back(new_data[i]);
- }
-}
-
-/**
-* @brief Take a canfd_frame struct to initialize class members
-*
-* This is the preferred way to initialize class members.
-*
-* @param[in] args - struct read from can bus device.
-*/
-void can_message_t::convert_from_canfd_frame(const std::pair<struct canfd_frame&, size_t> args)
-{
- // May be it's overkill to assign member of the pair... May be it will change...
- struct canfd_frame frame = args.first;
- size_t nbytes = args.second;
- set_max_data_length(nbytes);
- set_length(frame.len);
- set_id_and_format(frame.can_id);
-
+
/* Overwrite lenght_ if RTR flags is detected.
* standard CAN frames may have RTR enabled. There are no ERR frames with RTR */
if (frame.can_id & CAN_RTR_FLAG)
{
rtr_flag_ = true;
if(frame.len && frame.len <= CAN_MAX_DLC)
- set_length(frame.len);
- return;
+ {
+ if(rtr_flag_)
+ length_ = frame.len& 0xF;
+ else
+ {
+ length_ = (frame.len > maxdlen_) ? maxdlen_ : frame.len;
+ }
+ }
}
+ else
+ {
+ /* Flags field only present for CAN FD frames*/
+ if(maxdlen_ == CANFD_MAX_DLEN)
+ flags_ = frame.flags & 0xF;
+
+ if (data_.capacity() < maxdlen_)
+ data_.reserve(maxdlen_);
+ int i;
- /* Flags field only present for CAN FD frames*/
- if(maxdlen_ == CANFD_MAX_DLEN)
- set_flags(frame.flags);
-
- if ( data_.capacity() < maxdlen_)
- data_.reserve(maxdlen_);
- set_data(frame.data);
-
- DEBUG(binder_interface, "convert_from_canfd_frame: Found id: %X, format: %X, length: %X, data %02X%02X%02X%02X%02X%02X%02X%02X", id_, format_, length_,
- data_[0], data_[1], data_[2], data_[3], data_[4], data_[5], data_[6], data_[7]);
+ data_.clear();
+ /* maxdlen_ is now set at CAN_MAX_DLEN or CANFD_MAX_DLEN, respectively 8 and 64 bytes*/
+ for(i=0;i<maxdlen_;i++)
+ {
+ data_.push_back(frame.data[i]);
+ };
+
+ DEBUG(binder_interface, "convert_from_canfd_frame: Found id: %X, format: %X, length: %X, data %02X%02X%02X%02X%02X%02X%02X%02X", id_, format_, length_,
+ data_[0], data_[1], data_[2], data_[3], data_[4], data_[5], data_[6], data_[7]);
+ }
}
/**
@@ -310,4 +245,3 @@ canfd_frame can_message_t::convert_to_canfd_frame()
return frame;
}
-
diff --git a/src/can/can-message.hpp b/src/can/can-message.hpp
index b88a1770..5d796cdc 100644
--- a/src/can/can-message.hpp
+++ b/src/can/can-message.hpp
@@ -31,19 +31,11 @@
* @enum CanMessageFormat
* @brief The ID format for a CAN message.
*/
-enum CanMessageFormat {
+class enum CanMessageFormat {
STANDARD, /*!< STANDARD - standard 11-bit CAN arbitration ID. */
EXTENDED, /*!< EXTENDED - an extended frame, with a 29-bit arbitration ID. */
ERROR, /*!< ERROR - ERROR code used at initialization to signify that it isn't usable'*/
};
-typedef enum CanMessageFormat CanMessageFormat;
-
-/**
- * @class can_message_t
- *
- * @brief A compact representation of a single CAN message, meant to be used in in/out
- * buffers.
- */
/*************************
* old CanMessage struct *
@@ -56,6 +48,13 @@ struct CanMessage {
};
typedef struct CanMessage CanMessage;
*/
+
+/**
+ * @class can_message_t
+ *
+ * @brief A compact representation of a single CAN message, meant to be used in in/out
+ * buffers.
+ */
class can_message_t {
private:
uint32_t id_; /*!< id_ - The ID of the message. */
@@ -77,17 +76,11 @@ class can_message_t {
const uint8_t* get_data() const;
uint8_t get_length() const;
- void set_max_data_length(size_t nbytes);
- void set_id_and_format(const uint32_t new_id);
void set_format(const CanMessageFormat new_format);
- void set_format(const uint32_t can_id);
- void set_flags(const uint8_t flags);
- void set_data(const __u8* new_data);
- void set_length(const uint8_t new_length);
bool is_correct_to_send();
- void convert_from_canfd_frame(const std::pair<struct canfd_frame&, size_t>args);
+ static can_message_t convert_to_canfd_frame(const struct canfd_frame& frame, size_t nbytes);
canfd_frame convert_to_canfd_frame();
};