All queue under can_bus_t class and reading thread
[apps/low-level-can-service.git] / src / can-utils.cpp
index 7144c02..868eb23 100644 (file)
@@ -17,7 +17,6 @@
 
 #include "can-utils.hpp"
 
-
 /********************************************************************************
 *
 *              CanMessage method implementation
@@ -233,9 +232,9 @@ canfd_frame can_bus_dev_t::read(const struct afb_binding_interface* interface)
  * @brief start reading threads and set flag is_running_
  * 
  */
-void can_bus_dev_t::start_reading()
+void can_bus_dev_t::start_reading(can_bus_t& can_bus)
 {
-       th_reading_ = std::thread(can_reader, this);
+       th_reading_ = std::thread(can_reader, std::ref(*this), std::ref(can_bus));
        is_running_ = true;
 }
 
@@ -247,51 +246,6 @@ bool can_bus_dev_t::is_running()
        return is_running_;
 }
 
-/**
- * @brief: Get a can_message_t from can_message_q and return it
- * then point to the next can_message_t in queue.
- * 
- * @return the next queue element or NULL if queue is empty.
- */
-can_message_t can_bus_dev_t::next_can_message(const struct afb_binding_interface* interface)
-{
-       can_message_t can_msg(interface);
-
-       if(!can_message_q_.empty())
-       {
-               can_msg = can_message_q_.front();
-               can_message_q_.pop();
-               DEBUG(interface, "next_can_message: Here is the next can message : id %d, length %d", can_msg.get_id(), can_msg.get_length());
-               return can_msg;
-       }
-       
-       NOTICE(interface, "next_can_message: End of can message queue");
-       has_can_message_ = false;
-       return can_msg;
-}
-
-/**
- * @brief Append a new element to the can message queue and set
- * has_can_message_ boolean to true
- * 
- * @params[const can_message_t& can_msg] the can_message_t to append
- * 
- */
-void can_bus_dev_t::push_new_can_message(const can_message_t& can_msg)
-{
-       can_message_q_.push(can_msg);
-}
-
-/**
- * @brief Flag that let you know when can message queue is exhausted
- * 
- * @return[bool] has_can_message_ bool
- */
-bool can_bus_dev_t::has_can_message() const
-{
-       return has_can_message_;
-}
-
 /**
  * @brief Send a can message from a can_message_t object.
  * 
@@ -300,7 +254,7 @@ bool can_bus_dev_t::has_can_message() const
  */
 int can_bus_dev_t::send_can_message(can_message_t& can_msg, const struct afb_binding_interface* interface)
 {
-       size_t nbytes;
+       ssize_t nbytes;
        canfd_frame f;
 
        f = can_msg.convert_to_canfd_frame();
@@ -329,8 +283,8 @@ int can_bus_dev_t::send_can_message(can_message_t& can_msg, const struct afb_bin
 *
 *********************************************************************************/
 
-can_bus_t::can_bus_t(const afb_binding_interface *itf, int& conf_file)
-       : interface_{itf}, conf_file_{conf_file}
+can_bus_t::can_bus_t(const struct afb_binding_interface *interface, int& conf_file)
+       : interface_{interface}, conf_file_{conf_file}
 {
 }
 
@@ -340,8 +294,8 @@ can_bus_t::can_bus_t(const afb_binding_interface *itf, int& conf_file)
  */
 void can_bus_t::start_threads()
 {
-       th_decoding_ = std::thread(can_decoder, this);
-       th_pushing_ = std::thread(can_event_push, this);
+       th_decoding_ = std::thread(can_decode_message, std::ref(*this));
+       th_pushing_ = std::thread(can_event_push, std::ref(*this));
 }
 
 /**
@@ -367,7 +321,7 @@ int can_bus_t::init_can_dev()
                {
                        can_bus_dev_t can_bus_device_handler(device);
                        can_bus_device_handler.open(interface_);
-                       can_bus_device_handler.start_reading();
+                       can_bus_device_handler.start_reading(std::ref(*this));
                        i++;
                }
 
@@ -387,7 +341,7 @@ std::vector<std::string> can_bus_t::read_conf()
 {
        std::vector<std::string> ret;
        json_object *jo, *canbus;
-       int n, i, ok;
+       int n, i;
 
        FILE *fd = fdopen(conf_file_, "r");
        if (fd)
@@ -411,9 +365,8 @@ std::vector<std::string> can_bus_t::read_conf()
                else
                {
                        n = json_object_array_length(canbus);
-                       ok = 0;
                        for (i = 0 ; i < n ; i++)
-                       ret.push_back(json_object_get_string(json_object_array_get_idx(canbus, i)));
+                               ret.push_back(json_object_get_string(json_object_array_get_idx(canbus, i)));
                }
                return ret;
        }
@@ -422,6 +375,51 @@ std::vector<std::string> can_bus_t::read_conf()
        return ret;
 }
 
+/**
+ * @brief: Get a can_message_t from can_message_q and return it
+ * then point to the next can_message_t in queue.
+ * 
+ * @return the next queue element or NULL if queue is empty.
+ */
+can_message_t can_bus_t::next_can_message()
+{
+       can_message_t can_msg(interface_);
+
+       if(!can_message_q_.empty())
+       {
+               can_msg = can_message_q_.front();
+               can_message_q_.pop();
+               DEBUG(interface_, "next_can_message: Here is the next can message : id %d, length %d", can_msg.get_id(), can_msg.get_length());
+               return can_msg;
+       }
+       
+       NOTICE(interface_, "next_can_message: End of can message queue");
+       has_can_message_ = false;
+       return can_msg;
+}
+
+/**
+ * @brief Append a new element to the can message queue and set
+ * has_can_message_ boolean to true
+ * 
+ * @params[const can_message_t& can_msg] the can_message_t to append
+ * 
+ */
+void can_bus_t::push_new_can_message(const can_message_t& can_msg)
+{
+       can_message_q_.push(can_msg);
+}
+
+/**
+ * @brief Flag that let you know when can message queue is exhausted
+ * 
+ * @return[bool] has_can_message_ bool
+ */
+bool can_bus_t::has_can_message() const
+{
+       return has_can_message_;
+}
+
 /**
  * @brief: Get a VehicleMessage from vehicle_message_q and return it
  * then point to the next VehicleMessage in queue.