/*
* 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_legacy/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;
}