Fix: OBD2_PIDS array initialization
[apps/agl-service-can-low-level.git] / src / can_decode_message.cpp
index ba82202..a28fa18 100644 (file)
 #include <linux/can.h>
 #include <linux/can/raw.h>
 #include <queue>
+#include <sys/timeb.h>
 
 #include <afb/afb-binding.h>
 
-#include "can-utils.h"
+#include "can-utils.hpp"
+#include "can-decoder.hpp"
 #include "openxc.pb.h"
+#include "openxc-utils.hpp"
 
-void can_decode_message(CanBus_c *can_bus)
+void can_decode_message(can_bus_t &can_bus)
 {
-       CanMessage_c can_message;
+       can_message_t can_message;
+       std:vector <CanSignal> signals;
+       std:vector <CanSignal>::iterator signals_i;
+       openxc_VehicleMessage vehicle_message;
+       openxc_DynamicField search_key, ret;
+       bool send = true;
+       
+       decoder_t decoder();
 
        while(true)
        {
-               if(! can_bus->can_message_q.empty())
+               if(can_message = can_bus.next_can_message())
                {
-                       can_message = can_bus->can_message_q.front();
-                       can_bus->can_message_q.pop();
+                       /* First we have to found which CanSignal is */
+                       search_key = build_DynamicField(openxc_DynamicField_Type::openxc_DynamicField_Type_NUM, (double)can_message.get_id())
+
+                       signals = find_can_signals(search_key);
+                       
+                       /* Decoding the message ! Don't kill the messenger ! */
+                       for(const auto& sig : signals)
+                       {       
+                               subscribed_signals_i = subscribed_signals.find(sig.genericName);
+                               
+                               if(subscribed_signals_i != subscribed_signals.end() &&
+                                       afb_event_is_valid(subscribed_signals_i->second))
+                               {
+                                       ret = decoder.decodeSignal(sig, can_message, getSignals(), &send);
+
+                                       s_message = build_SimpleMessage(sig.genericName, ret);
+                                               
+                                       vehicle_message = build_VehicleMessage_with_SimpleMessage(openxc_DynamicField_Type::openxc_DynamicField_Type_NUM, s_message);
+                                       vehicle_message_q.push(vehicle_message);
+                               }
+                       }
                }
        }
-}
\ No newline at end of file
+}