* limitations under the License.
*/
+#include <json-c/json.h>
+#include <systemd/sd-event.h>
+
#include "low-can-binding.hpp"
+#include "can-utils.hpp"
+#include "can-signals.hpp"
+#include "openxc-utils.hpp"
+
+extern "C"
+{
+ #include <afb/afb-binding.h>
+ #include <afb/afb-service-itf.h>
+};
+
+/*
+ * Interface between the daemon and the binding
+ */
+const struct afb_binding_interface *binder_interface;
+
/********************************************************************************
*
* Event management
{
if(!subscribe)
{
- NOTICE(interface, "Event isn't valid, it can't be unsubscribed.");
+ NOTICE(binder_interface, "Event isn't valid, it can't be unsubscribed.");
ret = 1;
}
else
{
- ss_i->second = afb_daemon_make_event(interface->daemon, ss_i->first.c_str());
+ ss_i->second = afb_daemon_make_event(binder_interface->daemon, ss_i->first.c_str());
if (!afb_event_is_valid(ss_i->second))
{
- ERROR(interface, "Can't create an event, something goes wrong.");
+ ERROR(binder_interface, "Can't create an event, something goes wrong.");
ret = 0;
}
}
}
else
{
- subscribed_signals[sig.genericName] = afb_daemon_make_event(interface->daemon, sig.genericName);
+ subscribed_signals[sig.genericName] = afb_daemon_make_event(binder_interface->daemon, sig.genericName);
if (!afb_event_is_valid(ss_i->second))
{
- ERROR(interface, "Can't create an event, something goes wrong.");
+ ERROR(binder_interface, "Can't create an event, something goes wrong.");
ret = 0;
}
}
if (((subscribe ? afb_req_subscribe : afb_req_unsubscribe)(request, subscribed_signals[sig.genericName])) < 0)
{
- ERROR(interface, "Operation goes wrong for signal: %s", sig.genericName);
+ ERROR(binder_interface, "Operation goes wrong for signal: %s", sig.genericName);
ret = 0;
}
else
//for (const auto& sig : SIGNALS)
// e += !subscribe_unsubscribe_signals(request, subscribe, sig);
- e += !subscribe_unsubscribe_signals(request, subscribe, SIGNALS[MESSAGE_SET_ID]);
+ e += !subscribe_unsubscribe_signals(request, subscribe, getSignals());
return e == 0;
}
else
{
openxc_DynamicField search_key = build_DynamicField(name);
- sig = find_can_signals(interface, search_key);
+ sig = find_can_signals(binder_interface, search_key);
if (sig.empty())
ret = 0;
}
afb_req_fail(request, "error", NULL);
}
-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,
- {
- "CAN bus service",
- "can",
- verbs
- }
-};
-
extern "C"
{
static void subscribe(struct afb_req request)
subscribe_unsubscribe(request, false);
}
+ 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,
+ {
+ "CAN bus service",
+ "can",
+ verbs
+ }
+ };
+
const struct afb_binding *afbBindingV1Register (const struct afb_binding_interface *itf)
{
- interface = itf;
+ binder_interface = itf;
return &binding_desc;
}
int afbBindingV1ServiceInit(struct afb_service service)
{
int fd_conf;
- fd_conf = afb_daemon_rootdir_open_locale(interface->daemon, "can_bus.json", O_RDONLY, NULL);
+ fd_conf = afb_daemon_rootdir_open_locale(binder_interface->daemon, "can_bus.json", O_RDONLY, NULL);
/* Open CAN socket */
- can_bus_t can_bus_handler(interface, fd_conf);
+ can_bus_t can_bus_handler(binder_interface, fd_conf);
if(can_bus_handler.init_can_dev() == 0)
{
can_bus_handler.start_threads();
return 1;
}
-};
\ No newline at end of file
+};