summaryrefslogtreecommitdiffstats
path: root/src/can/can-message.cpp
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/can-message.cpp
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/can-message.cpp')
-rw-r--r--src/can/can-message.cpp208
1 files changed, 71 insertions, 137 deletions
diff --git a/src/can/can-message.cpp b/src/can/can-message.cpp
index 68279e2..eec19d9 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;
}
-