Added JSON conf file read and initialize CanBus
[apps/agl-service-can-low-level.git] / can-utils.cpp
index 1e215ba..6721410 100644 (file)
@@ -6,7 +6,7 @@
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
  *
- *   http://www.apache.org/licenses/LICENSE-2.0
+ *      http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
 *
 *********************************************************************************/
 
+CanBus_c::CanBus_c(afb_binding_interface *itf, const std:string& dev_name)
+{
+       interface = itf;
+       deviceName = dev_name;
+}
+
 int CanBus_c::open()
 {
        const int canfd_on = 1;
@@ -85,12 +91,41 @@ int CanBus_c::close()
 
 void CanBus_c::start_threads()
 {
-    std::queue <canfd_frame> canfd_frame_queue;
-    std::queue <openxc_can_message_type> can_message_queue;
+       std::queue <CanMessage_c> can_message_q;
 
-    th_reading = std::thread(can_reader, interface, socket, canfd_frame_queue);
-    th_decoding = std::thread(can_decoder, interface, canfd_frame_queue, can_message_queue);
-    th_pushing = std::thread(can_event_push, interface, can_message_queue);
+       th_reading = std::thread(can_reader, interface, socket, can_message_q);
+       th_decoding = std::thread(can_decoder, interface, can_message_q, can_message_q);
+       th_pushing = std::thread(can_event_push, interface, can_message_q);
+}
+
+/*
+ * Send a can message from a CanMessage_c object.
+ */
+int CanBus_c::send_can_message(CanMessage_c can_msg)
+{
+       int nbytes;
+       canfd_frame *f;
+
+       f = can_msg.convert_to_canfd_frame();
+
+       if(socket >= 0)
+       {
+               nbytes = sendto(socket, &f, sizeof(struct canfd_frame), 0,
+                               (struct sockaddr*)&txAddress, sizeof(txAddress));
+                               
+               if (nbytes == -1)
+               {
+                       ERROR(interface, "send_can_message: Sending CAN frame failed.");
+                       return -1;
+               }
+               return nbytes;
+       }
+       else
+       {
+               ERROR(interface, "send_can_message: socket not initialized. Attempt to reopen can device socket.");
+               open_can_dev();
+       }
+       return 0;
 }
 
 /********************************************************************************
@@ -101,75 +136,91 @@ void CanBus_c::start_threads()
 
 uint32_t CanMessage_c::get_id()
 {
-    return id;
+       return id;
 }
 
 int CanMessage_c::get_format()
 {
-    return format;
+       return format;
 }
 
 uint8_t CanMessage_c::get_data()
 {
-    return data;
+       return data;
 }
 uint8_t CanMessage_c::get_lenght()
 {
-    return lenght;
+       return lenght;
 }
 
 void CanMessage_c::set_id(uint32_t new_id)
 {
-    switch(format):
-        case SIMPLE:
-            id = new_id & CAN_SFF_MASK;
-        case EXTENDED:
-            id = new_id & CAN_EFF_MASK;
-        default:
-            ERROR(interface, "ERROR: Can set id, not a compatible format or format not set prior to set id.");
+       switch(format):
+               case CanMessageFormat::SIMPLE:
+                       id = new_id & CAN_SFF_MASK;
+               case CanMessageFormat::EXTENDED:
+                       id = new_id & CAN_EFF_MASK;
+               default:
+                       ERROR(interface, "ERROR: Can set id, not a compatible format or format not set prior to set id.");
 }
 
 void CanMessage_c::set_format(CanMessageFormat new_format)
 {
-    if(new_format == SIMPLE || new_format == EXTENDED)
-        format = new_format;
-    else
-        ERROR(interface, "ERROR: Can set format, wrong format chosen");
+       if(new_format == CanMessageFormat::SIMPLE || new_format == CanMessageFormat::EXTENDED)
+               format = new_format;
+       else
+               ERROR(interface, "ERROR: Can set format, wrong format chosen");
 }
 
 void CanMessage_c::set_data(uint8_t new_data)
 {
-    data = new_data;
+       data = new_data;
 }
 
 void CanMessage_c::set_lenght(uint8_t new_length)
 {
-    lenght = new_lenght;
+       lenght = new_lenght;
 }
 
-void CanMessage_c::convert_canfd_frame_to_CanMessage(canfd_frame *frame)
+/*
+ * This is the preferred way to initialize a CanMessage object 
+ * from a read canfd_frame message.
+ * 
+ * params: canfd_frame pointer
+ */
+void CanMessage_c::convert_from_canfd_frame(canfd_frame *frame)
 {
-    
+       
        lenght = (canfd_frame->len > maxdlen) ? maxdlen : canfd_frame->len;
 
        switch (canfd_frame->can_id): 
-        case (canfd_frame->can_id & CAN_ERR_FLAG):
-                   id = canfd_frame->can_id & (CAN_ERR_MASK|CAN_ERR_FLAG);
-            break;
-        case (canfd_frame->can_id & CAN_EFF_FLAG):
-                   id = canfd_frame->can_id & CAN_EFF_MASK;
-               format = EXTENDED;
-        default:
-                   format = STANDARD;
-                   id = canfd_frame->can_id & CAN_SFF_MASK;
+               case (canfd_frame->can_id & CAN_ERR_FLAG):
+                       id = canfd_frame->can_id & (CAN_ERR_MASK|CAN_ERR_FLAG);
+                       break;
+               case (canfd_frame->can_id & CAN_EFF_FLAG):
+                       id = canfd_frame->can_id & CAN_EFF_MASK;
+                       format = CanMessageFormat::EXTENDED;
+                       break;
+               default:
+                       format = CanMessageFormat::STANDARD;
+                       id = canfd_frame->can_id & CAN_SFF_MASK;
+                       break;
 
        if (sizeof(canfd_frame->data) <= sizeof(data))
        {
-               for (i = 0; i < lenght; i++)
-                       can_message->data.bytes[i] = canfd_frame->data[i];
+               memcpy(data, canfd_frame->data, lenght);
                return 0;
        } else if (sizeof(canfd_frame->data) >= CAN_MAX_DLEN)
-       {
-               ERROR(interface, "parse_can_frame: can_frame data too long to be stored into openxc_CanMessage data field");
-    }
-}
\ No newline at end of file
+               ERROR(interface, "CanMessage_c: canfd_frame data too long to be stored into CanMessage object");
+}
+
+canfd_frame* convert_to_canfd_frame()
+{
+       canfd_frame frame;
+
+       frame.id = can_msg.get_id();
+       frame.len = can_msg.get_lenght();
+       frame.data = can_msg.get_data();
+
+       return &frame;
+}