~ubuntu-branches/debian/stretch/gpsd/stretch

« back to all changes in this revision

Viewing changes to driver_italk.c

  • Committer: Bazaar Package Importer
  • Author(s): Bernd Zeimetz
  • Date: 2010-07-15 14:46:02 UTC
  • mto: (1.1.11)
  • mto: This revision was merged to the branch mainline in revision 25.
  • Revision ID: james.westby@ubuntu.com-20100715144602-v68en708flyrtgcm
Tags: upstream-2.95
ImportĀ upstreamĀ versionĀ 2.95

Show diffs side-by-side

added added

removed removed

Lines of Context:
64
64
    session->context->gps_week = gps_week;
65
65
    tow = (uint) getleul(buf, 7 + 84);
66
66
    session->context->gps_tow = tow / 1000.0;
67
 
    t = gpstime_to_unix((int)gps_week,session->context->gps_tow)
68
 
                        - session->context->leap_seconds;
 
67
    t = gpstime_to_unix((int)gps_week, session->context->gps_tow)
 
68
        - session->context->leap_seconds;
69
69
    session->newdata.time = t;
70
70
    mask |= TIME_IS;
71
71
 
89
89
    mask |= USED_IS;
90
90
 
91
91
    if (flags & FIX_CONV_DOP_VALID) {
92
 
        clear_dop(&session->gpsdata.dop);
93
92
        session->gpsdata.dop.hdop = (double)(getleuw(buf, 7 + 56) / 100.0);
94
93
        session->gpsdata.dop.gdop = (double)(getleuw(buf, 7 + 58) / 100.0);
95
94
        session->gpsdata.dop.pdop = (double)(getleuw(buf, 7 + 60) / 100.0);
134
133
 
135
134
    if (len < 62) {
136
135
        gpsd_report(LOG_PROG, "ITALK: runt PRN_STATUS (len=%zu)\n", len);
137
 
        mask = ERROR_IS;
 
136
        mask = 0;
138
137
    } else {
139
138
        gps_week = (ushort) getleuw(buf, 7 + 4);
140
139
        session->context->gps_week = gps_week;
141
140
        tow = (uint) getleul(buf, 7 + 6);
142
141
        session->context->gps_tow = tow / 1000.0;
143
 
        t = gpstime_to_unix((int)gps_week,session->context->gps_tow)
144
 
                            - session->context->leap_seconds;
 
142
        t = gpstime_to_unix((int)gps_week, session->context->gps_tow)
 
143
            - session->context->leap_seconds;
145
144
        session->gpsdata.skyview_time = t;
146
145
 
147
146
        gpsd_zero_satellites(&session->gpsdata);
190
189
        gpsd_report(LOG_PROG,
191
190
                    "ITALK: bad UTC_IONO_MODEL (len %zu, should be 64)\n",
192
191
                    len);
193
 
        return ERROR_IS;
 
192
        return 0;
194
193
    }
195
194
 
196
195
    flags = (ushort) getleuw(buf, 7);
205
204
    session->context->gps_week = gps_week;
206
205
    tow = (uint) getleul(buf, 7 + 38);
207
206
    session->context->gps_tow = tow / 1000.0;
208
 
    t = gpstime_to_unix((int)gps_week,session->context->gps_tow)
209
 
                        - session->context->leap_seconds;
 
207
    t = gpstime_to_unix((int)gps_week, session->context->gps_tow)
 
208
        - session->context->leap_seconds;
210
209
    session->newdata.time = t;
211
210
 
212
211
    gpsd_report(LOG_DATA,
224
223
    if (len != 64) {
225
224
        gpsd_report(LOG_PROG,
226
225
                    "ITALK: bad SUBFRAME (len %zu, should be 64)\n", len);
227
 
        return ERROR_IS;
 
226
        return 0;
228
227
    }
229
228
 
230
229
    flags = (ushort) getleuw(buf, 7 + 4);
235
234
                flags & SUBFRAME_WORD_FLAG_MASK ? "error" : "ok",
236
235
                flags & SUBFRAME_GPS_PREAMBLE_INVERTED ? "(inverted)" : "");
237
236
    if (flags & SUBFRAME_WORD_FLAG_MASK)
238
 
        return ONLINE_IS | ERROR_IS;    // don't try decode an erroneous packet
 
237
        return 0;       // don't try decode an erroneous packet
239
238
 
240
239
    /*
241
240
     * Timo says "SUBRAME message contains decoded navigation message subframe
242
241
     * words with parity checking done but parity bits still present."
243
242
     */
244
243
    for (i = 0; i < 10; i++)
245
 
        words[i] = (unsigned int)(getleul(buf, 7 + 14 + 4*i) >> 6) & 0xffffff;
 
244
        words[i] =
 
245
            (unsigned int)(getleul(buf, 7 + 14 + 4 * i) >> 6) & 0xffffff;
246
246
 
247
247
    gpsd_interpret_subframe(session, words);
248
248
    return ONLINE_IS;
249
249
}
250
250
 
 
251
static gps_mask_t decode_itk_pseudo(struct gps_device_t *session,
 
252
                                      unsigned char *buf, size_t len)
 
253
{
 
254
    unsigned short gps_week, flags, n, i;
 
255
    unsigned int tow;
 
256
    union long_double l_d;
 
257
    double t;
 
258
 
 
259
    n = (ushort) getleuw(buf, 7 + 4);
 
260
    if ((n < 1) || (n > MAXCHANNELS)){
 
261
        gpsd_report(LOG_INF, "ITALK: bad PSEUDO channel count\n");
 
262
        return 0;
 
263
    }
 
264
 
 
265
    if (len != (size_t)((n+1)*36)) {
 
266
        gpsd_report(LOG_PROG,
 
267
                    "ITALK: bad PSEUDO len %zu\n", len);
 
268
    }
 
269
 
 
270
    gpsd_report(LOG_PROG, "iTalk PSEUDO [%u]\n", n);
 
271
    flags = (unsigned short)getleuw(buf, 7 + 6);
 
272
    if ((flags & 0x3) != 0x3)
 
273
        return 0; // bail if measurement time not valid.
 
274
 
 
275
    gps_week = (ushort) getleuw(buf, 7 + 8);
 
276
    tow = (uint) getleul(buf, 7 + 38);
 
277
    session->context->gps_week = gps_week;
 
278
    session->context->gps_tow = tow / 1000.0;
 
279
    t = gpstime_to_unix((int)gps_week, session->context->gps_tow)
 
280
        - session->context->leap_seconds;
 
281
 
 
282
    /*@-type@*/
 
283
    for (i = 0; i < n; i++){
 
284
        session->gpsdata.PRN[i] = getleuw(buf, 7 + 26 + (i*36)) & 0xff;
 
285
        session->gpsdata.ss[i] = getleuw(buf, 7 + 26 + (i*36 + 2)) & 0x3f;
 
286
        session->gpsdata.raw.satstat[i] = getleul(buf, 7 + 26 + (i*36 + 4));
 
287
        session->gpsdata.raw.pseudorange[i] = getled(buf, 7 + 26 + (i*36 + 8));
 
288
        session->gpsdata.raw.doppler[i] = getled(buf, 7 + 26 + (i*36 + 16));
 
289
        session->gpsdata.raw.carrierphase[i] = getleuw(buf, 7 + 26 + (i*36 + 28));
 
290
 
 
291
        session->gpsdata.raw.mtime[i] = t;
 
292
        session->gpsdata.raw.codephase[i] = NAN;
 
293
        session->gpsdata.raw.deltarange[i] = NAN;
 
294
    }
 
295
    /*@+type@*/
 
296
    return RAW_IS;
 
297
}
 
298
 
251
299
/*@ +charint @*/
252
300
static gps_mask_t italk_parse(struct gps_device_t *session,
253
301
                              unsigned char *buf, size_t len)
287
335
        break;
288
336
    case ITALK_PSEUDO:
289
337
        gpsd_report(LOG_IO, "iTalk PSEUDO len %zu\n", len);
 
338
        mask = decode_itk_pseudo(session, buf, len);
290
339
        break;
291
340
    case ITALK_RAW_ALMANAC:
292
341
        gpsd_report(LOG_IO, "iTalk RAW_ALMANAC len %zu\n", len);
340
389
        gpsd_report(LOG_IO, "iTalk unknown packet: id 0x%02x length %zu\n",
341
390
                    type, len);
342
391
    }
343
 
    if (mask == ERROR_IS)
344
 
        mask = 0;
345
 
    else
346
 
        (void)snprintf(session->gpsdata.tag, sizeof(session->gpsdata.tag),
 
392
    (void)snprintf(session->gpsdata.tag, sizeof(session->gpsdata.tag),
347
393
                       "ITK-%02x", type);
348
394
 
349
395
    return mask | ONLINE_IS;
431
477
static void italk_event_hook(struct gps_device_t *session, event_t event)
432
478
{
433
479
    /*
434
 
     * FIXME: It might not be necessary to call this on reactivate.
 
480
     * FIX-ME: It might not be necessary to call this on reactivate.
435
481
     * Experiment to see if the holds its settings through a close.
436
482
     */
437
483
    if ((event == event_identified || event == event_reactivate)