diff --git a/binding/CMakeLists.txt b/binding/CMakeLists.txt index 908882588eead9126b488196f703e0802d54b831..d8d56c96d5a43b374bfd86fb9fbb6fe8250ed004 100644 --- a/binding/CMakeLists.txt +++ b/binding/CMakeLists.txt @@ -18,10 +18,10 @@ ########################################################################### # Add target to project dependency list -PROJECT_TARGET_ADD(afm-navigation-binding) +PROJECT_TARGET_ADD(afm-osrm-binding) # Define project Targets - add_library(afm-navigation-binding MODULE navigation-api.c) + add_library(afm-osrm-binding MODULE osrm-api.c) # Binder exposes a unique public entry point SET_TARGET_PROPERTIES(${TARGET_NAME} PROPERTIES diff --git a/binding/navigation-api.c b/binding/navigation-api.c deleted file mode 100644 index 07e5216a544f83e3792d4b7203ff8effe05d7580..0000000000000000000000000000000000000000 --- a/binding/navigation-api.c +++ /dev/null @@ -1,371 +0,0 @@ -/* - * Copyright (C) 2019 Konsulko Group - * Author: Matt Ranostay <matt.ranostay@konsulko.com> - * - * 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. - */ - -#define _GNU_SOURCE -#include <errno.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <sys/time.h> -#include <time.h> - -#include <glib.h> -#include <glib/gstdio.h> -#include <gio/gio.h> -#include <json-c/json.h> - -#define AFB_BINDING_VERSION 3 -#include <afb/afb-binding.h> - -#include "navigation-api.h" - -afb_api_t g_api; - -static const char *vshl_capabilities_events[] = { - "setDestination", - "cancelNavigation", - NULL, -}; - -struct navigation_state *navigation_get_userdata(void) -{ - return afb_api_get_userdata(g_api); -} - -static afb_event_t get_event_from_value(struct navigation_state *ns, - const char *value) -{ - if (!g_strcmp0(value, "status")) - return ns->status_event; - - if (!g_strcmp0(value, "position")) - return ns->position_event; - - if (!g_strcmp0(value, "waypoints")) - return ns->waypoints_event; - - return NULL; -} - -static json_object **get_storage_from_value(struct navigation_state *ns, - const char *value) -{ - if (!g_strcmp0(value, "status")) - return &ns->status_storage; - - if (!g_strcmp0(value, "position")) - return &ns->position_storage; - - if (!g_strcmp0(value, "waypoints")) - return &ns->waypoints_storage; - - return NULL; -} - -static void navigation_subscribe_unsubscribe(afb_req_t request, - gboolean unsub) -{ - struct navigation_state *ns = navigation_get_userdata(); - json_object *jresp = NULL; - const char *value; - afb_event_t event; - int rc; - - value = afb_req_value(request, "value"); - if (!value) { - afb_req_fail_f(request, "failed", "Missing \"value\" event"); - return; - } - - event = get_event_from_value(ns, value); - if (!event) { - afb_req_fail_f(request, "failed", "Bad \"value\" event \"%s\"", - value); - return; - } - - if (!unsub) { - json_object *storage; - rc = afb_req_subscribe(request, event); - - g_rw_lock_reader_lock(&ns->rw_lock); - storage = *get_storage_from_value(ns, value); - if (storage) { - // increment reference counter, and send out cached value - json_object_get(storage); - afb_event_push(event, storage); - } - g_rw_lock_reader_unlock(&ns->rw_lock); - } else { - rc = afb_req_unsubscribe(request, event); - } - if (rc != 0) { - afb_req_fail_f(request, "failed", - "%s error on \"value\" event \"%s\"", - !unsub ? "subscribe" : "unsubscribe", - value); - return; - } - - jresp = json_object_new_object(); - afb_req_success_f(request, jresp, "Navigation %s to event \"%s\"", - !unsub ? "subscribed" : "unsubscribed", - value); -} - -static void subscribe(afb_req_t request) -{ - navigation_subscribe_unsubscribe(request, FALSE); -} - -static void unsubscribe(afb_req_t request) -{ - navigation_subscribe_unsubscribe(request, TRUE); -} - -static void broadcast(json_object *jresp, const char *name, gboolean cache) -{ - struct navigation_state *ns = navigation_get_userdata(); - afb_event_t event = get_event_from_value(ns, name); - json_object *tmp = NULL; - - if (json_object_deep_copy(jresp, (json_object **) &tmp, NULL)) - return; - - if (cache) { - json_object **storage; - - g_rw_lock_writer_lock(&ns->rw_lock); - - storage = get_storage_from_value(ns, name); - - if (*storage) - json_object_put(*storage); - *storage = NULL; - - // increment reference for storage - json_object_get(tmp); - *storage = tmp; - - // increment reference for event - json_object_get(tmp); - afb_event_push(event, tmp); - - g_rw_lock_writer_unlock(&ns->rw_lock); - - return; - } - - afb_event_push(event, tmp); -} - -static void broadcast_status(afb_req_t request) -{ - json_object *jresp = afb_req_json(request); - broadcast(jresp, "status", TRUE); - - afb_req_success(request, NULL, "Broadcast status send"); - - // NOTE: If the Alexa SDK API for pushing local navigation - // updates gets exposed, send update to vshl-capabilities - // here. -} - -static void broadcast_position(afb_req_t request) -{ - const char *position = afb_req_value(request, "position"); - gboolean cache = FALSE; - - // only send out a car position event on subscribe - if (position && !g_strcmp0(position, "car")) - cache = TRUE; - - json_object *jresp = afb_req_json(request); - broadcast(jresp, "position", cache); - - afb_req_success(request, NULL, "Broadcast position send"); - - // NOTE: If the Alexa SDK API for pushing local navigation - // updates gets exposed, send update to vshl-capabilities - // here. -} - -static void broadcast_waypoints(afb_req_t request) -{ - json_object *jresp = afb_req_json(request); - broadcast(jresp, "waypoints", TRUE); - - afb_req_success(request, NULL, "Broadcast waypoints send"); - - // NOTE: If the Alexa SDK API for pushing local navigation - // updates gets exposed, send update to vshl-capabilities - // here. -} - -static void handle_setDestination_event(struct json_object *object) -{ - json_object *jdest = NULL; - json_object_object_get_ex(object, "destination", &jdest); - if(!jdest) { - AFB_WARNING("setDestination event missing destination element"); - return; - } - - json_object *jcoord = NULL; - json_object_object_get_ex(jdest, "coordinate", &jcoord); - if(!jcoord) { - AFB_WARNING("setDestination event missing coordinate element"); - return; - } - - json_object *jlat = NULL; - json_object_object_get_ex(jcoord, "latitudeInDegrees", &jlat); - if(!jlat) - return; - errno = 0; - double lat = json_object_get_double(jlat); - if(errno != 0) - return; - - json_object *jlon = NULL; - json_object_object_get_ex(jcoord, "longitudeInDegrees", &jlon); - if(!jlon) - return; - double lon = json_object_get_double(jlon); - if(errno != 0) - return; - - json_object *jobj = json_object_new_object(); - json_object *jpoints = json_object_new_array(); - json_object *jpoint = json_object_new_object(); - jlat = json_object_new_double(lat); - jlon = json_object_new_double(lon); - json_object_object_add(jpoint, "latitude", jlat); - json_object_object_add(jpoint, "longitude", jlon); - json_object_array_add(jpoints, jpoint); - json_object_object_add(jobj, "points", jpoints); - broadcast(jobj, "waypoints", TRUE); -} - -static void handle_cancelNavigation_event(struct json_object *object) -{ - json_object *jobj = json_object_new_object(); - json_object *jstate = json_object_new_string("stop"); - json_object_object_add(jobj, "state", jstate); - broadcast(jobj, "status", TRUE); -} - -static void onevent(afb_api_t api, const char *event, struct json_object *object) -{ - if(!event) - return; - - if(strcmp(event, "vshl-capabilities/setDestination") == 0) { - handle_setDestination_event(object); - } else if(strcmp(event, "vshl-capabilities/cancelNavigation") == 0) { - handle_cancelNavigation_event(object); - } else { - AFB_WARNING("Unhandled vshl-capabilities event"); - } -} - -static int init(afb_api_t api) -{ - struct navigation_state *ns; - int rc; - - ns = g_try_malloc0(sizeof(*ns)); - if (!ns) { - AFB_ERROR("out of memory allocating navigation state"); - return -ENOMEM; - } - - rc = afb_daemon_require_api("vshl-capabilities", 1); - if (!rc) { - const char **tmp = vshl_capabilities_events; - json_object *args = json_object_new_object(); - json_object *actions = json_object_new_array(); - - while (*tmp) { - json_object_array_add(actions, json_object_new_string(*tmp++)); - } - json_object_object_add(args, "actions", actions); - if(json_object_array_length(actions)) { - rc = afb_api_call_sync(api, "vshl-capabilities", "navigation/subscribe", - args, NULL, NULL, NULL); - if(rc != 0) - AFB_WARNING("afb_api_call_sync returned %d", rc); - } else { - json_object_put(args); - } - } else { - AFB_WARNING("unable to initialize vshl-capabilities binding"); - } - - ns->status_event = afb_daemon_make_event("status"); - ns->position_event = afb_daemon_make_event("position"); - ns->waypoints_event = afb_daemon_make_event("waypoints"); - - if (!afb_event_is_valid(ns->status_event) || - !afb_event_is_valid(ns->position_event) || - !afb_event_is_valid(ns->waypoints_event)) { - AFB_ERROR("Cannot create events"); - return -EINVAL; - } - - afb_api_set_userdata(api, ns); - g_api = api; - - g_rw_lock_init(&ns->rw_lock); - - return 0; -} - -static const afb_verb_t binding_verbs[] = { - { - .verb = "subscribe", - .callback = subscribe, - .info = "Subscribe to event" - }, { - .verb = "unsubscribe", - .callback = unsubscribe, - .info = "Unsubscribe to event" - }, { - .verb = "broadcast_status", - .callback = broadcast_status, - .info = "Allows clients to broadcast status events" - }, { - .verb = "broadcast_position", - .callback = broadcast_position, - .info = "Broadcast out position event" - }, { - .verb = "broadcast_waypoints", - .callback = broadcast_waypoints, - .info = "Broadcast out waypoint event" - }, - {} -}; - -/* - * description of the binding for afb-daemon - */ -const afb_binding_t afbBindingV3 = { - .api = "navigation", - .verbs = binding_verbs, - .onevent = onevent, - .init = init, -}; diff --git a/binding/navigation-api.h b/binding/navigation-api.h deleted file mode 100644 index 457a87db35dccbd18adbac0c914353178682c226..0000000000000000000000000000000000000000 --- a/binding/navigation-api.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright 2019 Konsulko Group - * Author: Matt Ranostay <matt.ranostay@konsulko.com> - * - * 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. - */ - -#ifndef NAVIGATION_API_H -#define NAVIGATION_API_H - -#include <stddef.h> - -#define _GNU_SOURCE -#include <glib.h> -#include <stdlib.h> -#include <gio/gio.h> -#include <glib-object.h> - -#include <json-c/json.h> - -#define AFB_BINDING_VERSION 3 -#include <afb/afb-binding.h> - -#include <json-c/json.h> - -struct call_work; - -struct navigation_state { - // events - afb_event_t status_event; - afb_event_t position_event; - afb_event_t waypoints_event; - - // storage - json_object *status_storage; - json_object *position_storage; - json_object *waypoints_storage; - - // locking - GRWLock rw_lock; -}; - -#endif diff --git a/conf.d/cmake/config.cmake b/conf.d/cmake/config.cmake index e09670581fb3751fe88ca19ee498ddcab8f53a08..e056b9d550da3d0c93c40a237fca3e4f323d6cbe 100644 --- a/conf.d/cmake/config.cmake +++ b/conf.d/cmake/config.cmake @@ -18,17 +18,17 @@ # Project Info # ------------------ -set(PROJECT_NAME agl-service-navigation) +set(PROJECT_NAME agl-service-osrm) set(PROJECT_VERSION "1.0") set(PROJECT_PRETTY_NAME "Navigation service for AGL") set(PROJECT_DESCRIPTION "Navigation reporting proxy for consumers") -set(PROJECT_URL "https://gerrit.automotivelinux.org/gerrit/apps/agl-service-navigation") +set(PROJECT_URL "https://github.com/SebEckl/agl-service-osrm.git") set(PROJECT_ICON "icon.png") -set(PROJECT_AUTHOR "Matt Ranostay") -set(PROJECT_AUTHOR_MAIL "matt.ranostay@konsulko.com") +set(PROJECT_AUTHOR "Sebastian Eckl") +set(PROJECT_AUTHOR_MAIL "") set(PROJECT_LICENSE "APL2.0") set(PROJECT_LANGUAGES,"C") -set(API_NAME "navigation") +set(API_NAME "osrm") # Where the project configuration files are stored set(PROJECT_CMAKE_CONF_DIR "conf.d") @@ -119,7 +119,7 @@ set(WIDGET_TYPE application/vnd.agl.service) # This is the file that will be executed, loaded, # at launch time by the application framework. # -set(WIDGET_ENTRY_POINT lib/libafm-navigation-binding.so) +set(WIDGET_ENTRY_POINT lib/libafm-osrm-binding.so) # Print a helper message when every thing is finished # ----------------------------------------------------