summaryrefslogtreecommitdiffstats
path: root/CAN-binder/low-can-binding/binding
diff options
context:
space:
mode:
Diffstat (limited to 'CAN-binder/low-can-binding/binding')
-rw-r--r--CAN-binder/low-can-binding/binding/configuration.hpp2
-rw-r--r--CAN-binder/low-can-binding/binding/low-can-cb.cpp (renamed from CAN-binder/low-can-binding/binding/low-can-binding.cpp)120
-rw-r--r--CAN-binder/low-can-binding/binding/low-can-hat.cpp86
-rw-r--r--CAN-binder/low-can-binding/binding/low-can-hat.hpp (renamed from CAN-binder/low-can-binding/binding/low-can-binding.hpp)5
4 files changed, 129 insertions, 84 deletions
diff --git a/CAN-binder/low-can-binding/binding/configuration.hpp b/CAN-binder/low-can-binding/binding/configuration.hpp
index ab799e8..10bdf4b 100644
--- a/CAN-binder/low-can-binding/binding/configuration.hpp
+++ b/CAN-binder/low-can-binding/binding/configuration.hpp
@@ -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.
diff --git a/CAN-binder/low-can-binding/binding/low-can-binding.cpp b/CAN-binder/low-can-binding/binding/low-can-cb.cpp
index 99d1471..414fa91 100644
--- a/CAN-binder/low-can-binding/binding/low-can-binding.cpp
+++ b/CAN-binder/low-can-binding/binding/low-can-cb.cpp
@@ -16,16 +16,15 @@
* 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
index 0000000..b115a96
--- /dev/null
+++ b/CAN-binder/low-can-binding/binding/low-can-hat.cpp
@@ -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;
+ }
+};
diff --git a/CAN-binder/low-can-binding/binding/low-can-binding.hpp b/CAN-binder/low-can-binding/binding/low-can-hat.hpp
index ed5741d..7df4663 100644
--- a/CAN-binder/low-can-binding/binding/low-can-binding.hpp
+++ b/CAN-binder/low-can-binding/binding/low-can-hat.hpp
@@ -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