summaryrefslogtreecommitdiff
path: root/packet.c
diff options
context:
space:
mode:
authorChris Kuethe <ckuethe@users.berlios.de>2010-12-11 22:35:45 -0800
committerChris Kuethe <ckuethe@users.berlios.de>2010-12-11 22:35:45 -0800
commit0c4a5a791a4a6f0cab765cc53fc8556834c975fd (patch)
tree0ace1e52d84847ae811b9c93304c7781a9bcd674 /packet.c
parentf520c08d5913c74a9f9d8fbdec9d26d33e9aeb27 (diff)
downloadgpsd-0c4a5a791a4a6f0cab765cc53fc8556834c975fd.tar.gz
Wow, I totally baked the geostar import...
Diffstat (limited to 'packet.c')
-rw-r--r--packet.c91
1 files changed, 91 insertions, 0 deletions
diff --git a/packet.c b/packet.c
index d3b169d5..4837d072 100644
--- a/packet.c
+++ b/packet.c
@@ -220,6 +220,12 @@ static void nextstate(struct gps_packet_t *lexer, unsigned char c)
break;
}
#endif /* NAVCOM_ENABLE */
+#ifdef GEOSTAR_ENABLE
+ if (c == 'P') {
+ lexer->state = GEOSTAR_LEADER_1;
+ break;
+ }
+#endif /* GEOSTAR_ENABLE */
#ifdef RTCM104V2_ENABLE
if ((isgpsstat = rtcm2_decode(lexer, c)) == ISGPS_SYNC) {
lexer->state = RTCM2_SYNC_STATE;
@@ -979,6 +985,66 @@ static void nextstate(struct gps_packet_t *lexer, unsigned char c)
lexer->state = GROUND_STATE;
break;
#endif /* ITRAX_ENABLE */
+#ifdef GEOSTAR_ENABLE
+ case GEOSTAR_LEADER_1:
+ if (c == 'S')
+ lexer->state = GEOSTAR_LEADER_2;
+ else
+ lexer->state = GROUND_STATE;
+ break;
+ case GEOSTAR_LEADER_2:
+ if (c == 'G')
+ lexer->state = GEOSTAR_LEADER_3;
+ else
+ lexer->state = GROUND_STATE;
+ break;
+ case GEOSTAR_LEADER_3:
+ if (c == 'G')
+ lexer->state = GEOSTAR_LEADER_4;
+ else
+ lexer->state = GROUND_STATE;
+ break;
+ case GEOSTAR_LEADER_4:
+ lexer->state = GEOSTAR_MESSAGE_ID_1;
+ break;
+ case GEOSTAR_MESSAGE_ID_1:
+ lexer->state = GEOSTAR_MESSAGE_ID_2;
+ break;
+ case GEOSTAR_MESSAGE_ID_2:
+ lexer->length = (size_t)(c * 4);
+ lexer->state = GEOSTAR_LENGTH_1;
+ break;
+ case GEOSTAR_LENGTH_1:
+ lexer->length += (c << 8) * 4;
+ if (lexer->length <= MAX_PACKET_LENGTH)
+ lexer->state = GEOSTAR_LENGTH_2;
+ else
+ lexer->state = GROUND_STATE;
+ break;
+ case GEOSTAR_LENGTH_2:
+ lexer->state = GEOSTAR_PAYLOAD;
+ break;
+ case GEOSTAR_PAYLOAD:
+ if (--lexer->length == 0)
+ lexer->state = GEOSTAR_CHECKSUM_A;
+ /* else stay in payload state */
+ break;
+ case GEOSTAR_CHECKSUM_A:
+ lexer->state = GEOSTAR_CHECKSUM_B;
+ break;
+ case GEOSTAR_CHECKSUM_B:
+ lexer->state = GEOSTAR_CHECKSUM_C;
+ break;
+ case GEOSTAR_CHECKSUM_C:
+ lexer->state = GEOSTAR_RECOGNIZED;
+ break;
+ case GEOSTAR_RECOGNIZED:
+ if (c == 'P')
+ lexer->state = GEOSTAR_LEADER_1;
+ else
+ lexer->state = GROUND_STATE;
+ break;
+#endif /* GEOSTAR_ENABLE */
#ifdef TSIP_ENABLE
case TSIP_LEADER:
/* unused case */
@@ -1609,6 +1675,31 @@ void packet_parse(struct gps_packet_t *lexer)
break;
}
#endif /* NAVCOM_ENABLE */
+#ifdef GEOSTAR_ENABLE
+ else if (lexer->state == GEOSTAR_RECOGNIZED) {
+ /* GeoStar uses a XOR 32bit checksum */
+ int n, len;
+ unsigned int cs = 0L;
+ len = lexer->inbufptr - lexer->inbuffer;
+
+ /* Calculate checksum */
+ for (n = 0; n < len; n += sizeof(long)) {
+ cs ^= getleul(lexer->inbuffer, n);
+ }
+
+ if (cs == 0)
+ packet_accept(lexer, GEOSTAR_PACKET);
+ else {
+ gpsd_report(LOG_IO,
+ "GeoStar checksum failed 0x%x over length %d\n",
+ cs, len);
+ packet_accept(lexer, BAD_PACKET);
+ lexer->state = GROUND_STATE;
+ }
+ packet_discard(lexer);
+ break;
+ }
+#endif /* GEOSTAR_ENABLE */
#ifdef RTCM104V2_ENABLE
else if (lexer->state == RTCM2_RECOGNIZED) {
/*