diff options
author | Romain Forlot <romain.forlot@iot.bzh> | 2019-11-26 16:19:11 +0100 |
---|---|---|
committer | Romain Forlot <romain.forlot@iot.bzh> | 2019-11-28 16:11:47 +0100 |
commit | aeeb786722b5cdeabff5568b40f7075dc23140b9 (patch) | |
tree | 95ae1bf9efcfdad6fa94247cc9c310465257742d | |
parent | dfc20c88b083f06aad5048f2facf4cbde1ea3de4 (diff) |
Add function to convert vector to canfd or can frame.
This commit allows to convert the data vector to canfd or
can frame. In the two cases the struct is a canfd frame,
but if the type is not fd, the max size of a frame is 8.
Bug-AGL : SPEC-2779
Bug-AGL: SPEC-2976
Change-Id: I60edf6a602a47572d5e5bfb508c7ca6d8761832b
Signed-off-by: Arthur Guyader <arthur.guyader@iot.bzh>
Signed-off-by: Romain Forlot <romain.forlot@iot.bzh>
-rw-r--r-- | low-can-binding/can/message/can-message.cpp | 64 | ||||
-rw-r--r-- | low-can-binding/can/message/can-message.hpp | 1 |
2 files changed, 64 insertions, 1 deletions
diff --git a/low-can-binding/can/message/can-message.cpp b/low-can-binding/can/message/can-message.cpp index 90bade53..deca5c72 100644 --- a/low-can-binding/can/message/can-message.cpp +++ b/low-can-binding/can/message/can-message.cpp @@ -67,7 +67,7 @@ bool can_message_t::is_correct_to_send() if (id_ != 0 && length_ != 0 && format_ != message_format_t::INVALID) { int i; - for(i=0;i<CAN_MESSAGE_SIZE;i++) + for(i=0;i<length_;i++) if(data_[i] != 0) return true; } @@ -185,6 +185,68 @@ struct canfd_frame can_message_t::convert_to_canfd_frame() } /// @brief Take all initialized class members and build a +/// canfd_frame struct that can be use to send a CAN message over +/// the bus. +/// +/// @return canfd_frame struct built from class members. +struct std::vector<canfd_frame> can_message_t::convert_to_canfd_frame_vector() +{ + std::vector<canfd_frame> ret; + if(is_correct_to_send()) + { + if(flags_ & CAN_FD_FRAME) + { + int i=0; + do + { + canfd_frame frame; + frame.can_id = id_; + frame.len = 64; + std::vector<uint8_t> data = get_data_vector((i*64),(i*64)+63); + if(data.size()<64) + { + ::memset(frame.data,0,sizeof(frame.data)); + ::memcpy(frame.data,data.data(),data.size()); + } + else + { + ::memcpy(frame.data,data.data(),64); + } + ret.push_back(frame); + i++; + } while (i<(length_ >> 6)); + } + else + { + int i=0; + do + { + canfd_frame frame; + frame.can_id = id_; + frame.len = 8; + std::vector<uint8_t> data = get_data_vector(i*8,(i*8)+7); + if(data.size()<8) + { + ::memset(frame.data,0,sizeof(frame.data)); + ::memcpy(frame.data,data.data(),data.size()); + } + else + { + ::memset(frame.data,0,sizeof(frame.data)); + ::memcpy(frame.data,data.data(),8); + } + ret.push_back(frame); + i++; + } while (i<(length_ >> 3)); + } + } + else + AFB_ERROR("can_message_t not correctly initialized to be sent"); + + return ret; +} + +/// @brief Take all initialized class members and build a /// can_frame struct that can be use to send a CAN message over /// the bus. /// diff --git a/low-can-binding/can/message/can-message.hpp b/low-can-binding/can/message/can-message.hpp index 0f8bc9b5..9e75887f 100644 --- a/low-can-binding/can/message/can-message.hpp +++ b/low-can-binding/can/message/can-message.hpp @@ -46,6 +46,7 @@ class can_message_t : public message_t { static std::shared_ptr<can_message_t> convert_from_frame(const canfd_frame& frame, size_t nbytes, uint64_t timestamp); struct canfd_frame convert_to_canfd_frame(); + struct std::vector<canfd_frame> convert_to_canfd_frame_vector(); struct can_frame convert_to_can_frame(); bool is_correct_to_send(); |