summaryrefslogtreecommitdiff
path: root/guest/hals/gps/gps_vsoc.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'guest/hals/gps/gps_vsoc.cpp')
-rw-r--r--guest/hals/gps/gps_vsoc.cpp258
1 files changed, 0 insertions, 258 deletions
diff --git a/guest/hals/gps/gps_vsoc.cpp b/guest/hals/gps/gps_vsoc.cpp
deleted file mode 100644
index b17401b7..00000000
--- a/guest/hals/gps/gps_vsoc.cpp
+++ /dev/null
@@ -1,258 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * 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.
- */
-
-/* This implements a GPS hardware HAL library for cuttlefish.
- * A produced shared library is placed in /system/lib/hw/gps.gce.so, and
- * loaded by hardware/libhardware/hardware.c code which is called from
- * android_location_GpsLocationProvider.cpp
- */
-
-#include <errno.h>
-#include <pthread.h>
-#include <stdint.h>
-#include <unistd.h>
-
-#include <log/log.h>
-#include <cutils/sockets.h>
-#include <hardware/gps.h>
-
-#include "guest/hals/gps/gps_thread.h"
-#include "guest/libs/platform_support/api_level_fixes.h"
-
-static GpsState _gps_state;
-
-// Cleans up GpsState data structure.
-static void gps_state_cleanup(GpsState* s) {
- char cmd = CMD_QUIT;
-
- write(s->control[0], &cmd, 1);
- if (s->thread > 0) {
- pthread_join(s->thread, NULL);
- }
-
- close(s->control[0]);
- close(s->control[1]);
- close(s->fd);
-
- s->thread = 0;
- s->control[0] = -1;
- s->control[1] = -1;
- s->fd = -1;
- s->init = 0;
-}
-
-static int gce_gps_init(GpsCallbacks* callbacks) {
- D("%s: called", __FUNCTION__);
- // Stop if the framework does not fulfill its interface contract.
- // We don't want to return an error and continue to ensure that we
- // catch framework breaks ASAP and to give a tombstone to track down the
- // offending code.
- LOG_ALWAYS_FATAL_IF(!callbacks->location_cb);
- LOG_ALWAYS_FATAL_IF(!callbacks->status_cb);
- LOG_ALWAYS_FATAL_IF(!callbacks->sv_status_cb);
- LOG_ALWAYS_FATAL_IF(!callbacks->nmea_cb);
- LOG_ALWAYS_FATAL_IF(!callbacks->set_capabilities_cb);
- LOG_ALWAYS_FATAL_IF(!callbacks->acquire_wakelock_cb);
- LOG_ALWAYS_FATAL_IF(!callbacks->release_wakelock_cb);
- LOG_ALWAYS_FATAL_IF(!callbacks->create_thread_cb);
- LOG_ALWAYS_FATAL_IF(!callbacks->request_utc_time_cb);
- if (!_gps_state.init) {
- _gps_state.init = 1;
- _gps_state.control[0] = -1;
- _gps_state.control[1] = -1;
- _gps_state.thread = 0;
-
- _gps_state.fd = socket_local_client(
- "gps_broadcasts", ANDROID_SOCKET_NAMESPACE_ABSTRACT, SOCK_STREAM);
- if (_gps_state.fd < 0) {
- ALOGE("no GPS emulation detected.");
- goto Fail;
- }
- D("GPS HAL will receive data from remoter via gps_broadcasts channel.");
-
- if (socketpair(AF_LOCAL, SOCK_STREAM, 0, _gps_state.control) < 0) {
- ALOGE("could not create thread control socket pair: %s", strerror(errno));
- goto Fail;
- }
-
- _gps_state.callbacks = *callbacks;
- ALOGE("Starting thread callback=%p", callbacks->location_cb);
- _gps_state.thread = callbacks->create_thread_cb(
- "gps_state_thread", gps_state_thread, &_gps_state);
- if (!_gps_state.thread) {
- ALOGE("could not create GPS thread: %s", strerror(errno));
- goto Fail;
- }
- }
-
- if (_gps_state.fd < 0) return -1;
- return 0;
-
-Fail:
- gps_state_cleanup(&_gps_state);
- return -1;
-}
-
-static void gce_gps_cleanup() {
- D("%s: called", __FUNCTION__);
- if (_gps_state.init) gps_state_cleanup(&_gps_state);
-}
-
-static int gce_gps_start() {
- if (!_gps_state.init) {
- ALOGE("%s: called with uninitialized gps_state!", __FUNCTION__);
- return -1;
- }
-
- char cmd = CMD_START;
- int ret;
- do {
- ret = write(_gps_state.control[0], &cmd, 1);
- } while (ret < 0 && errno == EINTR);
-
- if (ret != 1) {
- D("%s: could not send CMD_START command: ret=%d: %s", __FUNCTION__, ret,
- strerror(errno));
- return -1;
- }
-
- return 0;
-}
-
-static int gce_gps_stop() {
- D("%s: called", __FUNCTION__);
- if (!_gps_state.init) {
- ALOGE("%s: called with uninitialized gps_state!", __FUNCTION__);
- return -1;
- }
-
- char cmd = CMD_STOP;
- int ret;
-
- do {
- ret = write(_gps_state.control[0], &cmd, 1);
- } while (ret < 0 && errno == EINTR);
-
- if (ret != 1) {
- ALOGE("%s: could not send CMD_STOP command: ret=%d: %s", __FUNCTION__, ret,
- strerror(errno));
- return -1;
- }
- return 0;
-}
-
-static int gce_gps_inject_time(GpsUtcTime /*time*/, int64_t /*time_ref*/,
- int /*uncertainty*/) {
- D("%s: called", __FUNCTION__);
- if (!_gps_state.init) {
- ALOGE("%s: called with uninitialized gps_state!", __FUNCTION__);
- return -1;
- }
-
- return 0;
-}
-
-static int gce_gps_inject_location(double /*latitude*/, double /*longitude*/,
- float /*accuracy*/) {
- D("%s: called", __FUNCTION__);
- if (!_gps_state.init) {
- ALOGE("%s: called with uninitialized gps_state!", __FUNCTION__);
- return -1;
- }
-
- return 0;
-}
-
-static void gce_gps_delete_aiding_data(GpsAidingData /*flags*/) {
- D("%s: called", __FUNCTION__);
- if (!_gps_state.init) {
- ALOGE("%s: called with uninitialized gps_state!", __FUNCTION__);
- return;
- }
-}
-
-static int gce_gps_set_position_mode(GpsPositionMode mode,
- GpsPositionRecurrence recurrence,
- uint32_t min_interval,
- uint32_t preferred_accuracy,
- uint32_t preferred_time) {
- D("%s: called", __FUNCTION__);
- if (!_gps_state.init) {
- ALOGE("%s: called with uninitialized gps_state!", __FUNCTION__);
- return -1;
- }
- ALOGE("%s(mode=%d, recurrence=%d, min_interval=%" PRIu32
- ", "
- "preferred_accuracy=%" PRIu32 ", preferred_time=%" PRIu32
- ") unimplemented",
- __FUNCTION__, mode, recurrence, min_interval, preferred_accuracy,
- preferred_time);
- return 0;
-}
-
-static const void* gce_gps_get_extension(const char* name) {
- D("%s: called", __FUNCTION__);
- // It is normal for this to be called before init.
- ALOGE("%s(%s): called but not implemented.", __FUNCTION__,
- name ? name : "NULL");
- return NULL;
-}
-
-static const GpsInterface gceGpsInterface = {
- sizeof(GpsInterface),
- gce_gps_init,
- gce_gps_start,
- gce_gps_stop,
- gce_gps_cleanup,
- gce_gps_inject_time,
- gce_gps_inject_location,
- gce_gps_delete_aiding_data,
- gce_gps_set_position_mode,
- gce_gps_get_extension,
-};
-
-const GpsInterface* gps_get_gps_interface(struct gps_device_t* /*dev*/) {
- return &gceGpsInterface;
-}
-
-static int open_gps(const struct hw_module_t* module, char const* /*name*/,
- struct hw_device_t** device) {
- struct gps_device_t* dev =
- (struct gps_device_t*)malloc(sizeof(struct gps_device_t));
- LOG_FATAL_IF(!dev, "%s: malloc returned NULL.", __FUNCTION__);
- memset(dev, 0, sizeof(*dev));
-
- dev->common.tag = HARDWARE_DEVICE_TAG;
- dev->common.version = 0;
- dev->common.module = (struct hw_module_t*)module;
- dev->get_gps_interface = gps_get_gps_interface;
-
- *device = (struct hw_device_t*)dev;
- return 0;
-}
-
-static struct hw_module_methods_t gps_module_methods = {
- VSOC_STATIC_INITIALIZER(open) open_gps};
-
-struct hw_module_t HAL_MODULE_INFO_SYM = {
- VSOC_STATIC_INITIALIZER(tag) HARDWARE_MODULE_TAG,
- VSOC_STATIC_INITIALIZER(version_major) 1,
- VSOC_STATIC_INITIALIZER(version_minor) 0,
- VSOC_STATIC_INITIALIZER(id) GPS_HARDWARE_MODULE_ID,
- VSOC_STATIC_INITIALIZER(name) "GCE GPS Module",
- VSOC_STATIC_INITIALIZER(author) "The Android Open Source Project",
- VSOC_STATIC_INITIALIZER(methods) & gps_module_methods,
-};