2015-08-13 27 views
6

GPS özellikli Raspberry Pi'm için bir sayı-çatırdayan veri kayıt C programı yazıyorum. gpsd'u yakaladım ve örnek uygulama cgps'i gps bilgilerini doğru bir şekilde görüntüler. Uygulamamda tüm bu kullanışlı bilgilere sahip olabilmem için, benon'la arabirim kurmak üzere libgps'u kullanmak istedim, ancak API'sinin karmaşıklığından hızlıca bunaldım.libgps C code örneği

HOWTO page belgesindeki belgeler, örneğin kod için cgps ve gpxlogger'a bakmam için bana işaret ediyor, ancak tüm bunların üzerinden geçemediğim kadar çok bağlantı var. Spektrumun karşı ucunda, libgps sayfasındaki C kodu örneği, kullanılamaz hale geldiği şekilde sıyrılmıştır.

Bu durumu açığa çıkarabilecek tek bir sınıf örneğine işaret eden var mı? Belki de getCoordinates() işlevini içeren bir şey?

cevap

10

Çok erken konuştum. Diğer SO sorularına göz attıktan sonra, this tamamen ilgisiz soruya koştum.

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

Ben gcc -o gps filename.c -lm -lgps

+0

çalıştırarak derlemek Eğer gps süresini nasıl biliyor musunuz: İşte benim çok biraz değiştirilmiş bir versiyonu? C'ye çok aşina değilim ama 'tv.tv_sec' sistem saatine benziyor mu? – bakalolo

+0

Muhtemelen bunun yerine 'gps_data.fix.time' kullanmalıyım. Onu yakaladığın için teşekkürler! –

+0

Bu biraz gecikmeli, ancak başka biri için yararlı olabilir: zaman damgasını '% lf' olarak yazdırmalısınız. _gps.h_ dosyasında 'gps_data.fix.time ', bir çift için bir takma ad olan' timestamp_t' olarak tanımlanır. Aksi halde mükemmel cevap! –