some little fixes

This commit is contained in:
eddyem 2015-07-01 01:16:24 +03:00
parent 5db2728d5e
commit 5fb62b00ab
3 changed files with 46 additions and 8 deletions

View File

@ -34,6 +34,7 @@ glob_pars Gdefault = {
,.block_msg = {0,1,0,0,0,0} // all exept RMC are blocked by default ,.block_msg = {0,1,0,0,0,0} // all exept RMC are blocked by default
,.polltmout = 10. ,.polltmout = 10.
,.stationary = 0 ,.stationary = 0
,.gettimediff = 0
}; };
/* /*
@ -55,6 +56,7 @@ myoption cmdlnopts[] = {
{"vtg", 0, &G.block_msg[GPVTG], 1, arg_none, NULL, N_("process VTG message")}, {"vtg", 0, &G.block_msg[GPVTG], 1, arg_none, NULL, N_("process VTG message")},
{"timeout", 1, NULL, 't', arg_double, APTR(&G.polltmout), N_("polling timeout")}, {"timeout", 1, NULL, 't', arg_double, APTR(&G.polltmout), N_("polling timeout")},
{"stationary",0, NULL, 's', arg_int, APTR(&G.stationary),N_("configure as stationary")}, {"stationary",0, NULL, 's', arg_int, APTR(&G.stationary),N_("configure as stationary")},
{"timediff",0, NULL, 'T', arg_int, APTR(&G.gettimediff),N_("calculate mean time difference")},
// ... // ...
end_option end_option
}; };

View File

@ -47,6 +47,7 @@ typedef struct{
int block_msg[GPMAXMSG]; // array of messages: 1-show, 0-block int block_msg[GPMAXMSG]; // array of messages: 1-show, 0-block
double polltmout; // polling timeout (program ends after this interval) double polltmout; // polling timeout (program ends after this interval)
int stationary; // configure as stationary int stationary; // configure as stationary
int gettimediff; // calculate mean time difference
}glob_pars; }glob_pars;
glob_pars *parce_args(int argc, char **argv); glob_pars *parce_args(int argc, char **argv);

View File

@ -25,6 +25,8 @@
#include <assert.h> #include <assert.h>
#include <signal.h> #include <signal.h>
#include <time.h>
#ifndef PIDFILE #ifndef PIDFILE
#define PIDFILE "/tmp/GPStest.pid" #define PIDFILE "/tmp/GPStest.pid"
@ -89,8 +91,11 @@ int checksum(uint8_t *buf){
} }
while(++buf != eol) while(++buf != eol)
checksum ^= *buf; checksum ^= *buf;
snprintf(chs, 3, "%X", checksum); snprintf(chs, 3, "%02X", checksum);
if(strncmp(chs, (char*)++buf, 2)) return 0; if(strncmp(chs, (char*)++buf, 2)){
DBG("Wrong checksum: %s", chs);
return 0;
}
return 1; return 1;
} }
@ -107,6 +112,27 @@ uint8_t *nextpos(uint8_t **buf, int pos){
#define NEXT() do{if(!nextpos(&buf, 1)) goto ret;}while(0) #define NEXT() do{if(!nextpos(&buf, 1)) goto ret;}while(0)
#define SKIP(NPOS) do{if(!nextpos(&buf, NPOS)) goto ret;}while(0) #define SKIP(NPOS) do{if(!nextpos(&buf, NPOS)) goto ret;}while(0)
double timediff_aver = 0.;
int timediff_N = 0;
/**
* difference (in seconds) in system & GPS clock
* @return system_time - GPS_time
*/
double timediff(int h, int m, float s){
struct timeval tv;
gettimeofday(&tv, NULL);
time_t tm0 = time(NULL);
struct tm *gmt = gmtime(&tm0);
double td = (gmt->tm_hour - h) * 3600.;
td += (gmt->tm_min - m) * 60.;
td += ((double)tv.tv_usec)/1e6 + (gmt->tm_sec - s);
timediff_aver += td;
++timediff_N;
return td;
}
/* /*
* Satellites in View * Satellites in View
* $GPGSV,NoMsg,MsgNo,NoSv,{,sv,elv,az,cno}*cs * $GPGSV,NoMsg,MsgNo,NoSv,{,sv,elv,az,cno}*cs
@ -230,7 +256,7 @@ printf("\n");
uint8_t prec[48] = {0xb5, 0x62, // header uint8_t prec[48] = {0xb5, 0x62, // header
0x06, 0x23, // CFG-NAVX5 0x06, 0x23, // CFG-NAVX5
40, 0, // 40 bytes, little-endian 40, 0, // 40 bytes, little-endian
0, 0, 0x20}; // mask for PPP 0, 0, 0, 0x20}; // mask for PPP
prec[32] = 1; // usePPP = TRUE (field 26) prec[32] = 1; // usePPP = TRUE (field 26)
for(i = 2; i < 46; ++i){ for(i = 2; i < 46; ++i){
prec[46] += prec[i]; prec[46] += prec[i];
@ -245,7 +271,7 @@ printf("\n");
/* /*
* Recommended minimum specific GPS/Transit data * Recommended minimum specific GPS/Transit data
* $GPRMC,hhmmss.ss,A,llll.ll,a,yyyyy.yy,a,x.x,x.x,ddmmyy,x.x,a*hh * $GPRMC,hhmmss,status,latitude,N,longitude,E,spd,cog,ddmmyy,mv,mvE,mode*cs
* 1 = UTC of position fix * 1 = UTC of position fix
* 2 = Data status (V=navigation receiver warning) * 2 = Data status (V=navigation receiver warning)
* 3 = Latitude of fix * 3 = Latitude of fix
@ -253,11 +279,11 @@ printf("\n");
* 5 = Longitude of fix * 5 = Longitude of fix
* 6 = E or W * 6 = E or W
* 7 = Speed over ground in knots * 7 = Speed over ground in knots
* 8 = Track made good in degrees True * 8 = Cource over ground in degrees
* 9 = UT date * 9 = UT date
* 10 = Magnetic variation degrees (Easterly var. subtracts from true course) * 10 = Magnetic variation degrees (Easterly var. subtracts from true course)
* 11 = E or W * 11 = E or W
* 12 = Checksum * 12 = Mode: N(bad), E(approx), A(auto), D(diff)
* 213457.00,A,4340.59415,N,04127.47560,E,2.494,,290615,,,A*7B * 213457.00,A,4340.59415,N,04127.47560,E,2.494,,290615,,,A*7B
*/ */
void rmc(uint8_t *buf){ void rmc(uint8_t *buf){
@ -265,7 +291,7 @@ void rmc(uint8_t *buf){
int H, M, LO, LA, d, m, y; int H, M, LO, LA, d, m, y;
float S; float S;
float longitude, lattitude, speed, track, mag; float longitude, lattitude, speed, track, mag;
char varn = 'V', north = '0', east = '0', mageast = '0'; char varn = 'V', north = '0', east = '0', mageast = '0', mode = 'N';
sscanf((char*)buf, "%2d%2d%f", &H, &M, &S); sscanf((char*)buf, "%2d%2d%f", &H, &M, &S);
NEXT(); NEXT();
if(*buf != ',') varn = *buf; if(*buf != ',') varn = *buf;
@ -274,6 +300,7 @@ void rmc(uint8_t *buf){
else else
printf("(data valid)"); printf("(data valid)");
printf(" time: %02d:%02d:%05.2f", H, M, S); printf(" time: %02d:%02d:%05.2f", H, M, S);
printf(" timediff: %g", timediff(H, M, S));
NEXT(); NEXT();
sscanf((char*)buf, "%2d%f", &LA, &lattitude); sscanf((char*)buf, "%2d%f", &LA, &lattitude);
NEXT(); NEXT();
@ -306,11 +333,16 @@ void rmc(uint8_t *buf){
if(sscanf((char*)buf, "%2d%2d%2d", &d, &m, &y) == 3) if(sscanf((char*)buf, "%2d%2d%2d", &d, &m, &y) == 3)
printf(" date(dd/mm/yy): %02d/%02d/%02d", d, m, y); printf(" date(dd/mm/yy): %02d/%02d/%02d", d, m, y);
NEXT(); NEXT();
sscanf((char*)buf, "%f,%c*", &mag, &mageast); sscanf((char*)buf, "%f,%c", &mag, &mageast);
if(mageast == 'E' || mageast == 'W'){ if(mageast == 'E' || mageast == 'W'){
if(mageast == 'W') mag = -mag; if(mageast == 'W') mag = -mag;
printf(" magnetic var: %f", mag); printf(" magnetic var: %f", mag);
} }
SKIP(2);
if(*buf != ','){
mode = *buf;
printf(" mode: %c", mode);
}
ret: ret:
printf("\n"); printf("\n");
} }
@ -420,6 +452,7 @@ void pubx(uint8_t *buf){
char north = '0', east = '0'; char north = '0', east = '0';
sscanf((char*)buf, "%2d%2d%f", &H, &M, &S); sscanf((char*)buf, "%2d%2d%f", &H, &M, &S);
printf("time: %02d:%02d:%05.2f", H, M, S); printf("time: %02d:%02d:%05.2f", H, M, S);
printf(" timediff: %g", timediff(H, M, S));
NEXT(); NEXT();
sscanf((char*)buf, "%2d%f", &LA, &lattitude); sscanf((char*)buf, "%2d%f", &LA, &lattitude);
NEXT(); NEXT();
@ -593,6 +626,8 @@ int main(int argc, char **argv){
parce_data(str); parce_data(str);
} }
} }
if(GP->gettimediff)
printf("\nAverage time difference (local-GPS) = %g seconds\n", timediff_aver/timediff_N);
signals(0); signals(0);
return 0; return 0;
} }