2015-08-13 22 views
6

Sto scrivendo un programma C per la registrazione dei dati per il mio Raspberry Pi abilitato per GPS. Ho afferrato gpsd e il suo cgps dell'app di esempio mostra correttamente le informazioni gps. Volevo usare libgps per interfacciarmi con il demone in modo da poter avere tutte quelle informazioni utili nella mia app, ma sono stato rapidamente sopraffatto dalla complessità della sua API.libgps Esempio di codice C

La documentazione sul suo HOWTO page mi indica di guardare cgps e gpxlogger per codice di esempio, ma c'è così tanto accoppiamento che non riesco a guadare tutto. All'estremo opposto dello spettro, l'esempio di codice C sulla pagina libgps è così ridotto all'indietro che è inutilizzabile.

Qualcuno può indicarmi un solo esempio di classe che potrebbe demistificare questo? Forse qualcosa che contiene una funzione getCoordinates()?

risposta

10

Ho parlato troppo presto. Dopo aver sfogliato altre domande su SO, mi sono imbattuto nella domanda this completamente estranea. Ecco la mia versione molto leggermente modificata:

#include <gps.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <math.h> 

int main() { 
int rc; 
struct timeval tv; 

struct gps_data_t gps_data; 
if ((rc = gps_open("localhost", "2947", &gps_data)) == -1) { 
    printf("code: %d, reason: %s\n", rc, gps_errstr(rc)); 
    return EXIT_FAILURE; 
} 
gps_stream(&gps_data, WATCH_ENABLE | WATCH_JSON, NULL); 

while (1) { 
    /* wait for 2 seconds to receive data */ 
    if (gps_waiting (&gps_data, 2000000)) { 
     /* read data */ 
     if ((rc = gps_read(&gps_data)) == -1) { 
      printf("error occured reading gps data. code: %d, reason: %s\n", rc, gps_errstr(rc)); 
     } else { 
      /* Display data from the GPS receiver. */ 
      if ((gps_data.status == STATUS_FIX) && 
       (gps_data.fix.mode == MODE_2D || gps_data.fix.mode == MODE_3D) && 
       !isnan(gps_data.fix.latitude) && 
       !isnan(gps_data.fix.longitude)) { 
        //gettimeofday(&tv, NULL); EDIT: tv.tv_sec isn't actually the timestamp! 
        printf("latitude: %f, longitude: %f, speed: %f, timestamp: %lf\n", gps_data.fix.latitude, gps_data.fix.longitude, gps_data.fix.speed, gps_data.fix.time); //EDIT: Replaced tv.tv_sec with gps_data.fix.time 
      } else { 
       printf("no GPS data available\n"); 
      } 
     } 
    } 

    sleep(3); 
} 

/* When you are done... */ 
gps_stream(&gps_data, WATCH_DISABLE, NULL); 
gps_close (&gps_data); 

return EXIT_SUCCESS; 
} 

compilo eseguendo gcc -o gps filename.c -lm -lgps

+0

Ti capita di sapere come ottenere il tempo di GPS? Non ho molta familiarità con C ma 'tv.tv_sec' sembra l'ora del sistema? – bakalolo

+0

Probabilmente perché avrei dovuto usare 'gps_data.fix.time'. Grazie per averlo capito! –

+0

Questo è un po 'tardi, ma potrebbe rivelarsi utile a qualcun altro: dovresti stampare il timestamp come un '% lf'. In _gps.h_, 'gps_data.fix.time' è definito come' timestamp_t', che è solo un alias per un doppio. Risposta perfetta altrimenti! –