#include #include #include /* converte stdin registrato da wildtomd in un xml per openstreetmaps.org */ struct _gpsdata { char zulutime[20]; char latitude[20]; char latdir[20]; char longitude[20]; char longdir[20]; char quality[20]; char numsat[20]; char dilution[20]; char altitude[20]; char altmeas[20]; char geoidheight[20]; char geoidheightmeas[20]; char rmcstatus[20]; char speed[20]; char heading[20]; char date[20]; char magneticvar[20]; char gprmc[1000]; char gpgga[1000]; }; void csvcpy(char*dest,char**src,int len) { /* copia in dest i caratteri in src fino alla prima virgola, spostando src oltre la virgola */ if(!*src || !**src) { *dest=0; return; } while(**src!=',' && len>0) { *dest=**src; dest++; *dest=0; *src=(*src)+1; len--; } if(**src) // se non e' null, e' una virgola: avanzo ancora *src=(*src)+1; } void nmeatime2gpxtime(const char*date,const char*zulutime,char*dest) { if(strlen(date)>=6 && strlen(zulutime)>=6) { sprintf(dest,"20%c%c-%c%c-%c%cT%c%c:%c%c:%c%cZ",date[4],date[5],date[2],date[3],date[0],date[1],zulutime[0],zulutime[1],zulutime[2],zulutime[3],zulutime[4],zulutime[5]); } else sprintf(dest,"%s %sZ",date,zulutime); } void nmeacoord2gpxcoord(char*coord,char*dir,char*dest) { int degs,mins; float secsd60,f1; degs=atoi(coord); sscanf(coord,"%f",&f1); secsd60=(f1-(float)degs); mins=degs%100; degs=degs/100; f1=degs+(float)mins/60.0+secsd60/60.0; if(*dir=='W' || *dir=='S') f1=-f1; sprintf(dest,"%f",f1); // printf("\n coord=%s%s; degs=%d mins=%d secsd60=%f -> f1=%f\n",coord,dir,degs,mins,secsd60,f1); } main() { char buff[1000],*p; int first=1; struct _gpsdata*gpsdata; gpsdata=(struct _gpsdata*)malloc(sizeof(struct _gpsdata)); printf("\n"); printf("\n"); while(fgets(buff,1000,stdin)) { p=buff; csvcpy(gpsdata->zulutime,&p,20); csvcpy(gpsdata->latitude,&p,20); csvcpy(gpsdata->latdir,&p,20); csvcpy(gpsdata->longitude,&p,20); csvcpy(gpsdata->longdir,&p,20); csvcpy(gpsdata->quality,&p,20); csvcpy(gpsdata->numsat,&p,20); csvcpy(gpsdata->dilution,&p,20); csvcpy(gpsdata->altitude,&p,20); csvcpy(gpsdata->altmeas,&p,20); csvcpy(gpsdata->geoidheight,&p,20); csvcpy(gpsdata->geoidheightmeas,&p,20); csvcpy(gpsdata->rmcstatus,&p,20); csvcpy(gpsdata->speed,&p,20); csvcpy(gpsdata->heading,&p,20); csvcpy(gpsdata->date,&p,20); csvcpy(gpsdata->magneticvar,&p,20); if(*gpsdata->rmcstatus=='A') { if(first) { nmeatime2gpxtime(gpsdata->date,gpsdata->zulutime,buff); printf("\n",buff); printf("\n"); printf("LOG RECORDED BY WILDTOM\n"); printf("\n"); first=0; } nmeacoord2gpxcoord(gpsdata->latitude,gpsdata->latdir,buff); printf("longitude,gpsdata->longdir,buff); printf("lon=\"%s\">",buff); printf("%s",gpsdata->altitude); nmeatime2gpxtime(gpsdata->date,gpsdata->zulutime,buff); printf("",buff); printf("\n"); } } printf("\n"); printf("\n"); printf("\n"); }