aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRomain Forlot <romain.forlot@iot.bzh>2019-11-26 16:19:11 +0100
committerRomain Forlot <romain.forlot@iot.bzh>2019-11-28 16:11:47 +0100
commitaeeb786722b5cdeabff5568b40f7075dc23140b9 (patch)
tree95ae1bf9efcfdad6fa94247cc9c310465257742d
parentdfc20c88b083f06aad5048f2facf4cbde1ea3de4 (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.cpp64
-rw-r--r--low-can-binding/can/message/can-message.hpp1
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();