Separation between hat and callback binding parts
authorRomain Forlot <romain.forlot@iot.bzh>
Fri, 5 May 2017 16:31:41 +0000 (18:31 +0200)
committerRomain Forlot <romain.forlot@iot.bzh>
Fri, 5 May 2017 16:31:41 +0000 (18:31 +0200)
As well as handling reading signals BCM socket using systemd event loop.

Change-Id: I1e121635ec5db489b2bcb88a3101e716bf8883d5
Signed-off-by: Romain Forlot <romain.forlot@iot.bzh>
CAN-binder/low-can-binding/binding/configuration.hpp
CAN-binder/low-can-binding/binding/low-can-cb.cpp [moved from CAN-binder/low-can-binding/binding/low-can-binding.cpp with 70% similarity]
CAN-binder/low-can-binding/binding/low-can-hat.cpp [new file with mode: 0644]
CAN-binder/low-can-binding/binding/low-can-hat.hpp [moved from CAN-binder/low-can-binding/binding/low-can-binding.hpp with 88% similarity]
CAN-binder/low-can-binding/can/can-bus-dev.cpp
CAN-binder/low-can-binding/can/can-bus.hpp
CAN-binder/low-can-binding/can/can-decoder.cpp
CAN-binder/low-can-binding/can/can-message.cpp
CAN-binder/low-can-binding/utils/config-parser.cpp
CAN-binder/low-can-binding/utils/signals.hpp
CAN-binder/low-can-binding/utils/socketcan.hpp

index ab799e8..10bdf4b 100644 (file)
@@ -27,7 +27,7 @@
 #include "../can/can-message.hpp"
 #include "../diagnostic/diagnostic-manager.hpp"
 
-#include "low-can-binding.hpp"
+#include "low-can-hat.hpp"
 
 ///
 /// @brief Class representing a configuration attached to the binding.
  * limitations under the License.
  */
 
-#include "low-can-binding.hpp"
+#include "low-can-hat.hpp"
 
 #include <map>
 #include <queue>
 #include <mutex>
 #include <vector>
 #include <thread>
-#include <time.h>
-#include <linux/can.h>
 #include <json-c/json.h>
+#include <systemd/sd-event.h>
 
 #include "openxc.pb.h"
 #include "configuration.hpp"
@@ -42,9 +41,6 @@ extern "C"
        #include <afb/afb-service-itf.h>
 };
 
-// Interface between the daemon and the binding
-const struct afb_binding_interface *binder_interface;
-
 void on_no_clients(std::string message)
 {
        DiagnosticRequest* diag_req = configuration_t::instance().get_request_from_diagnostic_message(message);
@@ -56,6 +52,14 @@ void on_no_clients(std::string message)
        }
 }
 
+int read(sd_event_source *s, int fd, uint32_t revents, void *userdata)
+{
+       can_signal_t* sig= (can_signal_t*)userdata;
+       if(sig->read_socket() != can_message_format_t::ERROR)
+               return 0;
+       return -1;
+}
+
 ///******************************************************************************
 ///
 ///            Subscription and unsubscription
@@ -172,11 +176,13 @@ static int subscribe_unsubscribe_signals(struct afb_req request, bool subscribe,
 
        for(const auto& sig: signals.can_signals)
        {
-               if(conf.get_can_bus_manager().create_rx_filter(*sig) <= 0 && 
-               subscribe_unsubscribe_signal(request, subscribe, sig->get_name()) <=0 )
+               if(sig->create_rx_filter() <= 0 && 
+                       subscribe_unsubscribe_signal(request, subscribe, sig->get_name()) <=0)
                {
                        return -1;
                }
+               struct sd_event_source* e_source;
+               sd_event_add_io(afb_daemon_get_event_loop(binder_interface->daemon), &e_source, sig->get_socket().socket(), EPOLLIN, read, sig);
                rets++;
                DEBUG(binder_interface, "%s: signal: %s subscribed", __FUNCTION__, sig->get_name().c_str());
        }
@@ -212,85 +218,35 @@ static const std::vector<std::string> parse_args_from_request(struct afb_req req
        return ret;
 }
 
-extern "C"
+void subscribe(struct afb_req request)
 {
-       static void subscribe(struct afb_req request)
-       {
-               std::vector<std::string> args;
-               struct utils::signals_found sf;
-               int ok = 0, total = 0;
-               bool subscribe = true;
+       std::vector<std::string> args;
+       struct utils::signals_found sf;
+       int ok = 0, total = 0;
+       bool subscribe = true;
 
-               args = parse_args_from_request(request, subscribe);
-
-               for(const auto& sig: args)
-               {
-                       openxc_DynamicField search_key = build_DynamicField(sig);
-                       sf = utils::signals_manager_t::instance().find_signals(search_key);
-                       total = (int)sf.can_signals.size() + (int)sf.diagnostic_messages.size();
-
-                       if (sf.can_signals.empty() && sf.diagnostic_messages.empty())
-                               NOTICE(binder_interface, "%s: No signal(s) found for %s.", __FUNCTION__, sig.c_str());
-                       else
-                               ok = subscribe_unsubscribe_signals(request, subscribe, sf);
-               }
-
-               NOTICE(binder_interface, "%s: Subscribed/unsubscribe correctly to %d/%d signal(s).", __FUNCTION__, ok, total);
-               if (ok > 0)
-                       afb_req_success(request, NULL, NULL);
-               else
-                       afb_req_fail(request, "error", NULL);
-       }
-
-       static void unsubscribe(struct afb_req request)
-       {
-               parse_args_from_request(request, false);
-       }
+       args = parse_args_from_request(request, subscribe);
 
-       static const struct afb_verb_desc_v1 verbs[]=
+       for(const auto& sig: args)
        {
-               { .name= "subscribe",   .session= AFB_SESSION_NONE, .callback= subscribe,       .info= "subscribe to notification of CAN bus messages." },
-               { .name= "unsubscribe", .session= AFB_SESSION_NONE, .callback= unsubscribe,     .info= "unsubscribe a previous subscription." }
-       };
+               openxc_DynamicField search_key = build_DynamicField(sig);
+               sf = utils::signals_manager_t::instance().find_signals(search_key);
+               total = (int)sf.can_signals.size() + (int)sf.diagnostic_messages.size();
 
-       static const struct afb_binding binding_desc {
-               AFB_BINDING_VERSION_1,
-               {
-                       "Low level CAN bus service",
-                       "low-can",
-                       verbs
-               }
-       };
-
-       const struct afb_binding *afbBindingV1Register (const struct afb_binding_interface *itf)
-       {
-               binder_interface = itf;
-
-               return &binding_desc;
+               if (sf.can_signals.empty() && sf.diagnostic_messages.empty())
+                       NOTICE(binder_interface, "%s: No signal(s) found for %s.", __FUNCTION__, sig.c_str());
+               else
+                       ok = subscribe_unsubscribe_signals(request, subscribe, sf);
        }
 
-       /// @brief Initialize the binding.
-       ///
-       /// @param[in] service Structure which represent the Application Framework Binder.
-       ///
-       /// @return Exit code, zero if success.
-       int afbBindingV1ServiceInit(struct afb_service service)
-       {
-               can_bus_t& can_bus_manager = configuration_t::instance().get_can_bus_manager();
-
-               /// Initialize CAN socket
-               if(can_bus_manager.init_can_dev() == 0)
-               {
-                       can_bus_manager.start_threads();
-
-                       /// Initialize Diagnostic manager that will handle obd2 requests.
-                       /// We pass by default the first CAN bus device to its Initialization.
-                       /// TODO: be able to choose the CAN bus device that will be use as Diagnostic bus.
-                       if(configuration_t::instance().get_diagnostic_manager().initialize())
-                               return 0;
-               }
+       NOTICE(binder_interface, "%s: Subscribed/unsubscribe correctly to %d/%d signal(s).", __FUNCTION__, ok, total);
+       if (ok > 0)
+               afb_req_success(request, NULL, NULL);
+       else
+               afb_req_fail(request, "error", NULL);
+}
 
-               ERROR(binder_interface, "%s: There was something wrong with CAN device Initialization. Check your config file maybe", __FUNCTION__);
-               return 1;
-       }
-};
+       void unsubscribe(struct afb_req request)
+{
+       parse_args_from_request(request, false);
+}
\ No newline at end of file
diff --git a/CAN-binder/low-can-binding/binding/low-can-hat.cpp b/CAN-binder/low-can-binding/binding/low-can-hat.cpp
new file mode 100644 (file)
index 0000000..b115a96
--- /dev/null
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2015, 2016 "IoT.bzh"
+ * Author "Romain Forlot" <romain.forlot@iot.bzh>
+ * Author "Loic Collignon" <loic.collignon@iot.bzh>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * 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
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "low-can-hat.hpp"
+
+#include <map>
+#include <queue>
+#include <mutex>
+#include <vector>
+#include <json-c/json.h>
+
+#include "configuration.hpp"
+#include "../can/can-bus.hpp"
+
+extern "C"
+{
+       #include <afb/afb-service-itf.h>
+};
+
+// Interface between the daemon and the binding
+const struct afb_binding_interface *binder_interface;
+
+extern "C"
+{
+       static const struct afb_verb_desc_v1 verbs[]=
+       {
+               { .name= "subscribe",   .session= AFB_SESSION_NONE, .callback= subscribe,       .info= "subscribe to notification of CAN bus messages." },
+               { .name= "unsubscribe", .session= AFB_SESSION_NONE, .callback= unsubscribe,     .info= "unsubscribe a previous subscription." }
+       };
+
+       static const struct afb_binding binding_desc {
+               AFB_BINDING_VERSION_1,
+               {
+                       "Low level CAN bus service",
+                       "low-can",
+                       verbs
+               }
+       };
+
+       const struct afb_binding *afbBindingV1Register (const struct afb_binding_interface *itf)
+       {
+               binder_interface = itf;
+
+               return &binding_desc;
+       }
+
+       /// @brief Initialize the binding.
+       ///
+       /// @param[in] service Structure which represent the Application Framework Binder.
+       ///
+       /// @return Exit code, zero if success.
+       int afbBindingV1ServiceInit(struct afb_service service)
+       {
+               can_bus_t& can_bus_manager = configuration_t::instance().get_can_bus_manager();
+
+               /// Initialize CAN socket
+               if(can_bus_manager.init_can_dev() == 0)
+               {
+                       can_bus_manager.start_threads();
+
+                       /// Initialize Diagnostic manager that will handle obd2 requests.
+                       /// We pass by default the first CAN bus device to its Initialization.
+                       /// TODO: be able to choose the CAN bus device that will be use as Diagnostic bus.
+                       if(configuration_t::instance().get_diagnostic_manager().initialize())
+                               return 0;
+               }
+
+               ERROR(binder_interface, "%s: There was something wrong with CAN device Initialization. Check your config file maybe", __FUNCTION__);
+               return 1;
+       }
+};
@@ -30,4 +30,7 @@ extern "C" struct afb_binding_interface;
 
 extern const struct afb_binding_interface *binder_interface;
 
-void on_no_clients(std::string message);
\ No newline at end of file
+void on_no_clients(std::string message);
+
+void subscribe(struct afb_req request);
+void unsubscribe(struct afb_req request);
\ No newline at end of file
index 7155a72..bc6f858 100644 (file)
@@ -24,9 +24,7 @@
 
 #include "can-bus.hpp"
 #include "can-message.hpp"
-#include "../binding/low-can-binding.hpp"
-#include "canutil/write.h"
-#include "bitfield/bitfield.h"
+#include "../binding/low-can-hat.hpp"
 
 /// @brief Class constructor
 ///
index 3fcc29f..f6a3745 100644 (file)
@@ -30,7 +30,7 @@
 #include "can-signals.hpp"
 #include "../utils/config-parser.hpp"
 #include "../diagnostic/diagnostic-manager.hpp"
-#include "../binding/low-can-binding.hpp"
+#include "../binding/low-can-hat.hpp"
 
 // TODO actual max is 32 but dropped to 24 for memory considerations
 #define MAX_ACCEPTANCE_FILTERS 24
index 9a38111..f36c4b9 100644 (file)
@@ -20,7 +20,7 @@
 #include "canutil/read.h"
 #include "../utils/openxc-utils.hpp"
 
-#include "../binding/low-can-binding.hpp"
+#include "../binding/low-can-hat.hpp"
 
 /// @brief Parse the signal's bitfield from the given data and return the raw
 /// value.
index b6e4458..ac2610e 100644 (file)
@@ -19,7 +19,7 @@
 
 #include <cstring>
 
-#include "../binding/low-can-binding.hpp"
+#include "../binding/low-can-hat.hpp"
 
 ///
 /// @brief Class constructor
index 60ea118..9c81afb 100644 (file)
@@ -17,7 +17,7 @@
 
 #include "config-parser.hpp"
 
-#include "../binding/low-can-binding.hpp"
+#include "../binding/low-can-hat.hpp"
 
 namespace utils
 {
index 88b9875..053433a 100644 (file)
@@ -26,7 +26,7 @@
 #include "../can/can-signals.hpp"
 #include "../diagnostic/diagnostic-message.hpp"
 
-#include "../binding/low-can-binding.hpp"
+#include "../binding/low-can-hat.hpp"
 
 namespace utils
 {
index 3dcc277..e911664 100644 (file)
@@ -24,7 +24,7 @@
 #include <string.h>
 
 #include "../can/can-message.hpp"
-#include "../binding/low-can-binding.hpp"
+#include "../binding/low-can-hat.hpp"
 
 #define INVALID_SOCKET -1