summaryrefslogtreecommitdiffstats
path: root/tests/gpstest/gpstest.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tests/gpstest/gpstest.cpp')
-rw-r--r--tests/gpstest/gpstest.cpp129
1 files changed, 129 insertions, 0 deletions
diff --git a/tests/gpstest/gpstest.cpp b/tests/gpstest/gpstest.cpp
new file mode 100644
index 0000000..79f081d
--- /dev/null
+++ b/tests/gpstest/gpstest.cpp
@@ -0,0 +1,129 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <unistd.h>
+
+extern "C" size_t dlmalloc_footprint();
+
+#include "hardware/gps.h"
+
+static const GpsInterface* sGpsInterface = NULL;
+
+static bool sDone = false;
+static int sFixes = 0;
+static int sMaxFixes = 0;
+static int sStatus = GPS_STATUS_ENGINE_OFF;
+
+static void location_callback(GpsLocation* location)
+{
+ printf("Got Fix: latitude: %lf longitude: %lf altitude: %.1lf\n",
+ location->latitude, location->longitude, location->altitude);
+ sFixes++;
+ if (sMaxFixes > 0 && sFixes >= sMaxFixes) {
+ sDone = true;
+ }
+}
+
+static void status_callback(GpsStatus* status)
+{
+ switch (status->status) {
+ case GPS_STATUS_NONE:
+ printf("status: GPS_STATUS_NONE\n");
+ break;
+ case GPS_STATUS_SESSION_BEGIN:
+ printf("status: GPS_STATUS_SESSION_BEGIN\n");
+ break;
+ case GPS_STATUS_SESSION_END:
+ printf("status: GPS_STATUS_SESSION_END\n");
+ break;
+ case GPS_STATUS_ENGINE_ON:
+ printf("status: GPS_STATUS_ENGINE_ON\n");
+ break;
+ case GPS_STATUS_ENGINE_OFF:
+ printf("status: GPS_STATUS_ENGINE_OFF\n");
+ break;
+ default:
+ printf("unknown status: %d\n", status->status);
+ break;
+ }
+
+ sStatus = status->status;
+}
+
+static void sv_status_callback(GpsSvStatus* sv_status)
+{
+ if (sv_status->num_svs > 0) {
+ for (int i = 0; i < sv_status->num_svs; i++) {
+ printf("SV: %2d SNR: %.1f Elev: %.1f Azim: %.1f %s %s\n", sv_status->sv_list[i].prn,
+ sv_status->sv_list[i].snr, sv_status->sv_list[i].elevation,
+ sv_status->sv_list[i].azimuth,
+ ((sv_status->ephemeris_mask & (1 << (sv_status->sv_list[i].prn - 1))) ? "E" : " "),
+ ((sv_status->almanac_mask & (1 << (sv_status->sv_list[i].prn - 1))) ? "A" : " ")
+ );
+ }
+ printf("\n");
+ }
+}
+
+GpsCallbacks sCallbacks = {
+ location_callback,
+ status_callback,
+ sv_status_callback,
+};
+
+int main(int argc, char *argv[])
+{
+ size_t initial = dlmalloc_footprint();
+
+ if (argc >= 2) {
+ sMaxFixes = atoi(argv[1]);
+ printf("max fixes: %d\n", sMaxFixes);
+ }
+
+ sGpsInterface = gps_get_interface();
+ if (!sGpsInterface) {
+ fprintf(stderr, "could not get gps interface\n");
+ return -1;
+ }
+
+ int err = sGpsInterface->init(&sCallbacks);
+ if (err) {
+ fprintf(stderr, "gps_init failed %d\n", err);
+ return err;
+ }
+
+ sGpsInterface->start();
+
+ while (!sDone) {
+ sleep(1);
+ }
+
+ sGpsInterface->stop();
+
+ printf("waiting for GPS to shut down\n");
+ while (sStatus != GPS_STATUS_ENGINE_OFF) {
+ sleep(1);
+ }
+
+ sGpsInterface->cleanup();
+
+ size_t final = dlmalloc_footprint();
+ fprintf(stderr, "KO: initial == %d, final == %d\n", initial, final );
+
+ return 0;
+}