Add function to convert vector to canfd or can frame. 44/22244/2
authorArthur Guyader <arthur.guyader@iot.bzh>
Mon, 26 Aug 2019 13:32:20 +0000 (15:32 +0200)
committerArthur Guyader <arthur.guyader@iot.bzh>
Thu, 29 Aug 2019 16:03:33 +0000 (18:03 +0200)
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

Change-Id: I60edf6a602a47572d5e5bfb508c7ca6d8761832b
Signed-off-by: Arthur Guyader <arthur.guyader@iot.bzh>
low-can-binding/can/message/can-message.cpp
low-can-binding/can/message/can-message.hpp

index 90bade5..deca5c7 100644 (file)
@@ -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;
        }
@@ -184,6 +184,68 @@ struct canfd_frame can_message_t::convert_to_canfd_frame()
        return 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.
index 0f8bc9b..9e75887 100644 (file)
@@ -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();