2015-08-13 13 views
6

Ich schreibe ein numerisches Datenlogging-C-Programm für meinen GPS-fähigen Raspberry Pi. Ich packte gpsd, und seine Beispiel-App cgps zeigt GPS-Informationen korrekt an. Ich wollte libgps verwenden, um mit dem Daemon zu kommunizieren, so dass ich all diese nützlichen Informationen in meiner App haben konnte, aber ich wurde schnell von der Komplexität seiner API überwältigt.libgps C Codebeispiel

Die Dokumentation über seine HOWTO page Punkte mich bei cgps und gpxlogger zum Beispiel Code suchen, aber es gibt so viel Kupplung, die ich nicht durch sie alle waten. Am entgegengesetzten Ende des Spektrums ist das C-Codebeispiel auf der Seite libgps so abgespalten, dass es unbrauchbar ist.

Kann mir jemand auf ein einzelnes Klassenbeispiel hinweisen, das das entmystifizieren könnte? Vielleicht etwas, das eine getCoordinates() Funktion enthält?

Antwort

10

Ich sprach zu früh. Nach dem Durchsuchen anderer SO Fragen, lief ich in this völlig unabhängige Frage. Hier ist meine sehr leicht modifizierte Version:

#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; 
} 

ich es kompilieren von gcc -o gps filename.c -lm -lgps läuft

+0

passieren Sie wissen, wie GPS-Zeit zu bekommen? Ich bin nicht vertraut mit C aber 'tv.tv_sec' sieht aus wie die Systemzeit? – bakalolo

+0

Wahrscheinlich, weil ich 'gps_data.fix.time' stattdessen hätte verwenden sollen. Danke, dass du das erwischt hast! –

+0

Dies ist ein bisschen spät, aber es könnte sich für jemand anderen als nützlich erweisen: Sie sollten den Zeitstempel als '% lf' drucken. In _gps.h_ ist die 'gps_data.fix.time' als 'timestamp_t' definiert, was nur ein Alias ​​für ein Double ist. Perfekte Antwort sonst! –

Verwandte Themen