static gps_mask_t decode_itk_subframe(struct gps_device_t *session, unsigned char *buf, size_t len) { unsigned short flags, prn, sf; unsigned int i; uint32_t words[10]; if (len != 64) { gpsd_report(LOG_PROG, "ITALK: bad SUBFRAME (len %zu, should be 64)\n", len); return 0; } flags = (ushort) getleu16(buf, 7 + 4); prn = (ushort) getleu16(buf, 7 + 6); sf = (ushort) getleu16(buf, 7 + 8); gpsd_report(LOG_PROG, "iTalk 50B SUBFRAME prn %u sf %u - decode %s %s\n", prn, sf, flags & SUBFRAME_WORD_FLAG_MASK ? "error" : "ok", flags & SUBFRAME_GPS_PREAMBLE_INVERTED ? "(inverted)" : ""); if (flags & SUBFRAME_WORD_FLAG_MASK) return 0; // don't try decode an erroneous packet /* * Timo says "SUBRAME message contains decoded navigation message subframe * words with parity checking done but parity bits still present." */ for (i = 0; i < 10; i++) words[i] = (uint32_t)(getleu32(buf, 7 + 14 + 4 * i) >> 6) & 0xffffff; return gpsd_interpret_subframe(session, prn, words); }
/* * decode MID 0xE0, GPS Subframe data * * len 33 bytes * */ static gps_mask_t sky_msg_E0(struct gps_device_t *session, unsigned char *buf, size_t len UNUSED) { int i; unsigned int prn; /* GPS sat PRN */ unsigned int subf; /* subframe 1-5 */ /* the words are preprocessed, not raw, just the 24bits of data */ uint32_t words[10]; /* subframe 1-5 */ if ( 33 != len) return 0; prn = (unsigned int)getub(buf, 1); subf = (unsigned int)getub(buf, 2); for ( i = 0; i < 10; i++ ) { words[i] = (uint32_t)getbeu24(buf, 3 + (i * 3)); } gpsd_log(&session->context->errout, LOG_DATA, "Skytraq: 50B MID 0xE0: prn=%u, subf=%u\n", prn, subf); return gpsd_interpret_subframe(session, prn, words); }