Diff of /trunk/src/gps.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 232 by harbaum, Tue Nov 17 20:13:09 2009 UTC revision 233 by harbaum, Wed Dec 9 19:45:36 2009 UTC
# Line 182  void gps_clear_fix(struct gps_fix_t *fix Line 182  void gps_clear_fix(struct gps_fix_t *fix
182    fixp->mode = MODE_NOT_SEEN;    fixp->mode = MODE_NOT_SEEN;
183    fixp->pos.lat = fixp->pos.lon = NAN;    fixp->pos.lat = fixp->pos.lon = NAN;
184    fixp->track = NAN;    fixp->track = NAN;
   fixp->speed = NAN;  
   fixp->climb = NAN;  
   fixp->altitude = NAN;  
   fixp->ept = NAN;  
185    fixp->eph = NAN;    fixp->eph = NAN;
   fixp->epd = NAN;  
   fixp->eps = NAN;  
   fixp->epc = NAN;  
186  }  }
187    
188  /* unpack a daemon response into a status structure */  /* unpack a daemon response into a status structure */
# Line 205  static void gps_unpack(char *buf, struct Line 198  static void gps_unpack(char *buf, struct
198          else *tp = '\0';          else *tp = '\0';
199    
200          switch (*sp) {          switch (*sp) {
201          case 'A':            /* A - altitude is not supported */
           if (sp[2] == '?') {  
             gpsdata->fix.altitude = NAN;  
           } else {  
             (void)sscanf(sp, "A=%lf", &gpsdata->fix.altitude);  
             gpsdata->set |= ALTITUDE_SET;  
           }  
           break;  
202            /* B - baudrate isn't supported by gpxview */            /* B - baudrate isn't supported by gpxview */
203            /* C - cycle isn't supported by gpxview */            /* C - cycle isn't supported by gpxview */
204            /* D - utc time isn't supported by gpxview */            /* D - utc time isn't supported by gpxview */
# Line 261  static void gps_unpack(char *buf, struct Line 247  static void gps_unpack(char *buf, struct
247  #define DEFAULT(val) (val[0] == '?') ? NAN : g_ascii_strtod(val, NULL)  #define DEFAULT(val) (val[0] == '?') ? NAN : g_ascii_strtod(val, NULL)
248                nf.pos.lat = DEFAULT(lat);                nf.pos.lat = DEFAULT(lat);
249                nf.pos.lon = DEFAULT(lon);                nf.pos.lon = DEFAULT(lon);
               nf.ept = DEFAULT(ept);  
               nf.altitude = DEFAULT(alt);  
250                nf.eph = DEFAULT(eph);                nf.eph = DEFAULT(eph);
251                nf.track = DEFAULT(track);                nf.track = DEFAULT(track);
               nf.speed = DEFAULT(speed);  
               nf.climb = DEFAULT(climb);  
               nf.epd = DEFAULT(epd);  
               nf.eps = DEFAULT(eps);  
               nf.epc = DEFAULT(epc);  
252  #undef DEFAULT  #undef DEFAULT
253                if (st >= 15)                if (st >= 15)
254                  nf.mode = (mode[0] == '?') ? MODE_NOT_SEEN : atoi(mode);                  nf.mode = (mode[0] == '?') ? MODE_NOT_SEEN : atoi(mode);
255                else                else
256                  nf.mode = (alt[0] == '?') ? MODE_2D : MODE_3D;                  nf.mode = (alt[0] == '?') ? MODE_2D : MODE_3D;
               if (alt[0] != '?')  
                 gpsdata->set |= ALTITUDE_SET | CLIMB_SET;  
257                if (isnan(nf.eph)==0)                if (isnan(nf.eph)==0)
258                  gpsdata->set |= HERR_SET;                  gpsdata->set |= HERR_SET;
259                if (isnan(nf.track)==0)                if (isnan(nf.track)==0)
260                  gpsdata->set |= TRACK_SET | SPEED_SET;                  gpsdata->set |= TRACK_SET;
               if (isnan(nf.eps)==0)  
                 gpsdata->set |= SPEEDERR_SET;  
               if (isnan(nf.epc)==0)  
                 gpsdata->set |= CLIMBERR_SET;  
261                gpsdata->fix = nf;                gpsdata->fix = nf;
262                gpsdata->set |= TIME_SET|TIMERR_SET|LATLON_SET|MODE_SET;                gpsdata->set |= LATLON_SET|MODE_SET;
263                gpsdata->status = STATUS_FIX;                gpsdata->status = STATUS_FIX;
264                gpsdata->set |= STATUS_SET;                gpsdata->set |= STATUS_SET;
265              }              }
# Line 304  static void gps_unpack(char *buf, struct Line 277  static void gps_unpack(char *buf, struct
277              gpsdata->set |= LATLON_SET;              gpsdata->set |= LATLON_SET;
278            }            }
279            break;            break;
280          case 'Q':            /* Q is not supported */
           if (sp[2] == '?') {  
             gpsdata->satellites_used = 0;  
             gpsdata->pdop = 0;  
             gpsdata->hdop = 0;  
             gpsdata->vdop = 0;  
           } else {  
             (void)sscanf(sp, "Q=%d %lf %lf %lf %lf %lf",  
                          &gpsdata->satellites_used,  
                          &gpsdata->pdop,  
                          &gpsdata->hdop,  
                          &gpsdata->vdop,  
                          &gpsdata->tdop,  
                          &gpsdata->gdop);  
             gpsdata->set |= HDOP_SET | VDOP_SET | PDOP_SET;  
           }  
           break;  
281          case 'S':          case 'S':
282            if (sp[2] == '?') {            if (sp[2] == '?') {
283              gpsdata->status = -1;              gpsdata->status = -1;
# Line 333  static void gps_unpack(char *buf, struct Line 290  static void gps_unpack(char *buf, struct
290            if (sp[2] == '?') {            if (sp[2] == '?') {
291              gpsdata->fix.track = NAN;              gpsdata->fix.track = NAN;
292            } else {            } else {
293              (void)sscanf(sp, "T=%lf", &gpsdata->fix.track);              (void)sscanf(sp, "T=%f", &gpsdata->fix.track);
294              gpsdata->set |= TRACK_SET;              gpsdata->set |= TRACK_SET;
295            }            }
296            break;            break;
297          case 'U':            /* U - climb is not supported */
298            if (sp[2] == '?') {            /* V - is not supported */
299              gpsdata->fix.climb = NAN;            /* X - online is not supported */
           } else {  
             (void)sscanf(sp, "U=%lf", &gpsdata->fix.climb);  
             gpsdata->set |= CLIMB_SET;  
           }  
           break;  
         case 'V':  
           if (sp[2] == '?') {  
             gpsdata->fix.speed = NAN;  
           } else {  
             (void)sscanf(sp, "V=%lf", &gpsdata->fix.speed);  
             /* V reply is in kt, fix.speed is in metres/sec */  
             gpsdata->fix.speed = gpsdata->fix.speed / MPS_TO_KNOTS;  
             gpsdata->set |= SPEED_SET;  
           }  
           break;  
         case 'X':  
           if (sp[2] == '?')  
             gpsdata->online = -1;  
           else {  
             (void)sscanf(sp, "X=%lf", &gpsdata->online);  
             gpsdata->set |= ONLINE_SET;  
           }  
           break;  
300          case 'Y':          case 'Y':
301            if (sp[2] == '?') {            if (sp[2] == '?') {
302              gpsdata->satellites = 0;              gpsdata->satellites = 0;
# Line 472  gpointer gps_thread(gpointer data) { Line 406  gpointer gps_thread(gpointer data) {
406    
407                if(!cnt) appdata->gps_state->gpsdata.set &= ~SATELLITE_SET;                if(!cnt) appdata->gps_state->gpsdata.set &= ~SATELLITE_SET;
408                else     appdata->gps_state->gpsdata.set &=                else     appdata->gps_state->gpsdata.set &=
409                           ~(TIME_SET|TIMERR_SET|LATLON_SET|MODE_SET|STATUS_SET);                           ~(LATLON_SET|MODE_SET|STATUS_SET);
410    
411                gps_unpack(str, &appdata->gps_state->gpsdata);                gps_unpack(str, &appdata->gps_state->gpsdata);
412                g_mutex_unlock(appdata->gps_state->mutex);                g_mutex_unlock(appdata->gps_state->mutex);
# Line 525  location_changed(LocationGPSDevice *devi Line 459  location_changed(LocationGPSDevice *devi
459    gps_state->fields = device->fix->fields;    gps_state->fields = device->fix->fields;
460    
461    if(gps_state->fields & LOCATION_GPS_DEVICE_LATLONG_SET) {    if(gps_state->fields & LOCATION_GPS_DEVICE_LATLONG_SET) {
462      gps_state->latitude = device->fix->latitude;      gps_state->fix.pos.lat = device->fix->latitude;
463      gps_state->longitude = device->fix->longitude;      gps_state->fix.pos.lon = device->fix->longitude;
464      gps_state->eph = device->fix->eph/100.0;  // we want eph in meters      gps_state->fix.eph = device->fix->eph/100.0;  // we want eph in meters
465    }    }
466    
467    if(gps_state->fields & LOCATION_GPS_DEVICE_TRACK_SET)    if(gps_state->fields & LOCATION_GPS_DEVICE_TRACK_SET)
468      gps_state->heading = device->fix->track;      gps_state->fix.track = device->fix->track;
469    
470    /* update list of sattelites */    /* update list of sattelites */
471    
# Line 624  pos_t *gps_get_pos(appdata_t *appdata) { Line 558  pos_t *gps_get_pos(appdata_t *appdata) {
558    if(!(gps_state->fields & LOCATION_GPS_DEVICE_LATLONG_SET))    if(!(gps_state->fields & LOCATION_GPS_DEVICE_LATLONG_SET))
559      return NULL;      return NULL;
560    
561    pos.lat = gps_state->latitude;    pos.lat = gps_state->fix.pos.lat;
562    pos.lon = gps_state->longitude;    pos.lon = gps_state->fix.pos.lon;
563    
564    return &pos;    return &pos;
565  }  }
# Line 636  float gps_get_heading(appdata_t *appdata Line 570  float gps_get_heading(appdata_t *appdata
570    if(!(gps_state->fields & LOCATION_GPS_DEVICE_TRACK_SET))    if(!(gps_state->fields & LOCATION_GPS_DEVICE_TRACK_SET))
571      return NAN;      return NAN;
572    
573    return gps_state->heading;    return gps_state->fix.track;
574  }  }
575    
576  float gps_get_eph(appdata_t *appdata) {  float gps_get_eph(appdata_t *appdata) {
# Line 645  float gps_get_eph(appdata_t *appdata) { Line 579  float gps_get_eph(appdata_t *appdata) {
579    if(!(gps_state->fields & LOCATION_GPS_DEVICE_LATLONG_SET))    if(!(gps_state->fields & LOCATION_GPS_DEVICE_LATLONG_SET))
580      return NAN;      return NAN;
581    
582    return gps_state->eph;    return gps_state->fix.eph;
583  }  }
584    
585  gps_sat_t *gps_get_sats(appdata_t *appdata) {  gps_sat_t *gps_get_sats(appdata_t *appdata) {

Legend:
Removed from v.232  
changed lines
  Added in v.233