summaryrefslogtreecommitdiff
path: root/packet.c
diff options
context:
space:
mode:
authorEric S. Raymond <esr@thyrsus.com>2014-08-27 10:02:42 -0400
committerEric S. Raymond <esr@thyrsus.com>2014-08-27 10:02:42 -0400
commite897f0486257632728cdea0076bafc9dd1ede09a (patch)
tree136b2dcfff0ea3ef11c9614bda6123c6298c3e96 /packet.c
parentde759d4e3ec9363b3e0b7388a57fe010a38880b1 (diff)
downloadgpsd-e897f0486257632728cdea0076bafc9dd1ede09a.tar.gz
Modify packet.c so it no longer requires gpsd_report().
This is a large step towards eliminating the reverse linkage of gpsd_report(). Temporarily, it means that gpsmon will not redirect these messages to the screen display properly. This will be fixed later.
Diffstat (limited to 'packet.c')
-rw-r--r--packet.c90
1 files changed, 56 insertions, 34 deletions
diff --git a/packet.c b/packet.c
index b72a9ee5..36d67664 100644
--- a/packet.c
+++ b/packet.c
@@ -119,6 +119,22 @@ enum
#include "packet_states.h"
};
+static void lexer_report(const struct gps_lexer_t *lexer,
+ const int errlevel,
+ const char *fmt, ...)
+{
+ if (lexer->debug >= errlevel)
+ {
+ char buf[128];
+ va_list ap;
+
+ va_start(ap, fmt);
+ vsnprintf(buf, sizeof(buf), fmt, ap);
+ lexer->report(buf);
+ va_end(ap);
+ }
+}
+
#define SOH (unsigned char)0x01
#define DLE (unsigned char)0x10
#define STX (unsigned char)0x02
@@ -189,7 +205,7 @@ static void character_pushback(struct gps_lexer_t *lexer)
--lexer->inbufptr;
/*@+modobserver@*/
--lexer->char_counter;
- gpsd_report(lexer->debug, LOG_RAW + 2,
+ lexer_report(lexer, LOG_RAW + 2,
"%08ld: character pushed back\n",
lexer->char_counter);
}
@@ -926,7 +942,7 @@ static void nextstate(struct gps_lexer_t *lexer, unsigned char c)
n++)
csum ^= lexer->inbuffer[n];
if (csum != c) {
- gpsd_report(lexer->debug, LOG_IO,
+ lexer_report(lexer, LOG_IO,
"Navcom packet type 0x%hhx bad checksum 0x%hhx, expecting 0x%x\n",
lexer->inbuffer[3], csum, c);
lexer->state = GROUND_STATE;
@@ -1013,14 +1029,14 @@ static void nextstate(struct gps_lexer_t *lexer, unsigned char c)
short sum = getword(0) + getword(1) + getword(2) + getword(3);
sum *= -1;
if (sum != getword(4)) {
- gpsd_report(lexer->debug, LOG_IO,
+ lexer_report(lexer, LOG_IO,
"Zodiac Header checksum 0x%hx expecting 0x%hx\n",
sum, getword(4));
lexer->state = GROUND_STATE;
break;
}
}
- gpsd_report(lexer->debug, LOG_RAW + 1,
+ lexer_report(lexer, LOG_RAW + 1,
"Zodiac header id=%hd len=%hd flags=%hx\n",
getword(1), getword(2), getword(3));
#undef getword
@@ -1151,7 +1167,7 @@ static void nextstate(struct gps_lexer_t *lexer, unsigned char c)
if ((c == '>') && (lexer->inbufptr[0] == '<') &&
(lexer->inbufptr[1] == '!')) {
lexer->state = ITALK_RECOGNIZED;
- gpsd_report(lexer->debug, LOG_IO,
+ lexer_report(lexer, LOG_IO,
"ITALK: trying to process runt packet\n");
break;
} else if (--lexer->length == 0)
@@ -1299,7 +1315,7 @@ static void nextstate(struct gps_lexer_t *lexer, unsigned char c)
lexer->state = JSON_STRINGLITERAL;
lexer->json_after = JSON_END_ATTRIBUTE;
} else {
- gpsd_report(lexer->debug, LOG_RAW + 2,
+ lexer_report(lexer, LOG_RAW + 2,
"%08ld: missing attribute start after header\n",
lexer->char_counter);
lexer->state = GROUND_STATE;
@@ -1394,7 +1410,7 @@ static void packet_accept(struct gps_lexer_t *lexer, int packet_type)
lexer->type = packet_type;
if (lexer->debug >= LOG_RAW+1) {
char scratchbuf[MAX_PACKET_LENGTH*2+1];
- gpsd_report(lexer->debug, LOG_RAW+1,
+ lexer_report(lexer, LOG_RAW+1,
"Packet type %d accepted %zu = %s\n",
packet_type, packetlen,
gpsd_packetdump(scratchbuf, sizeof(scratchbuf),
@@ -1402,7 +1418,7 @@ static void packet_accept(struct gps_lexer_t *lexer, int packet_type)
lexer->outbuflen));
}
} else {
- gpsd_report(lexer->debug, LOG_ERROR,
+ lexer_report(lexer, LOG_ERROR,
"Rejected too long packet type %d len %zu\n",
packet_type, packetlen);
}
@@ -1417,7 +1433,7 @@ static void packet_discard(struct gps_lexer_t *lexer)
lexer->inbuflen = remaining;
if (lexer->debug >= LOG_RAW+1) {
char scratchbuf[MAX_PACKET_LENGTH*2+1];
- gpsd_report(lexer->debug, LOG_RAW + 1,
+ lexer_report(lexer, LOG_RAW + 1,
"Packet discard of %zu, chars remaining is %zu = %s\n",
discard, remaining,
gpsd_packetdump(scratchbuf, sizeof(scratchbuf),
@@ -1432,7 +1448,7 @@ static void character_discard(struct gps_lexer_t *lexer)
lexer->inbufptr = lexer->inbuffer;
if (lexer->debug >= LOG_RAW+1) {
char scratchbuf[MAX_PACKET_LENGTH*2+1];
- gpsd_report(lexer->debug, LOG_RAW + 1,
+ lexer_report(lexer, LOG_RAW + 1,
"Character discarded, buffer %zu chars = %s\n",
lexer->inbuflen,
gpsd_packetdump(scratchbuf, sizeof(scratchbuf),
@@ -1443,6 +1459,11 @@ static void character_discard(struct gps_lexer_t *lexer)
/* get 0-origin big-endian words relative to start of packet buffer */
#define getword(i) (short)(lexer->inbuffer[2*(i)] | (lexer->inbuffer[2*(i)+1] << 8))
+static void basic_lexer_report(const char *buf)
+{
+ (void)fputs(buf, stderr);
+}
+
/* entry points begin here */
void lexer_init( /*@out@*/ struct gps_lexer_t *lexer)
@@ -1456,6 +1477,7 @@ void lexer_init( /*@out@*/ struct gps_lexer_t *lexer)
lexer->start_time = 0.0;
#endif /* TIMING_ENABLE */
packet_reset(lexer);
+ lexer->report = basic_lexer_report;
}
void packet_parse(struct gps_lexer_t *lexer)
@@ -1470,7 +1492,7 @@ void packet_parse(struct gps_lexer_t *lexer)
#include "packet_names.h"
};
nextstate(lexer, c);
- gpsd_report(lexer->debug, LOG_RAW + 2,
+ lexer_report(lexer, LOG_RAW + 2,
"%08ld: character '%c' [%02x], new state: %s\n",
lexer->char_counter, (isprint(c) ? c : '.'), c,
state_table[lexer->state]);
@@ -1512,7 +1534,7 @@ void packet_parse(struct gps_lexer_t *lexer)
&& csum[1] == toupper(end[2]));
}
if (!checksum_ok) {
- gpsd_report(lexer->debug, LOG_WARN,
+ lexer_report(lexer, LOG_WARN,
"bad checksum in NMEA packet; expected %s.\n",
csum);
packet_accept(lexer, BAD_PACKET);
@@ -1565,11 +1587,11 @@ void packet_parse(struct gps_lexer_t *lexer)
for (n = 0; n < lexer->length - 2; n++)
a += (unsigned)lexer->inbuffer[n];
b = (unsigned)getleu16(lexer->inbuffer, lexer->length - 2);
- gpsd_report(lexer->debug, LOG_IO,
+ lexer_report(lexer, LOG_IO,
"SuperStarII pkt dump: type %u len %u\n",
lexer->inbuffer[1], (unsigned int)lexer->length);
if (a != b) {
- gpsd_report(lexer->debug, LOG_IO,
+ lexer_report(lexer, LOG_IO,
"REJECT SuperStarII packet type 0x%02x"
"%zd bad checksum 0x%04x, expecting 0x%04x\n",
lexer->inbuffer[1], lexer->length, a, b);
@@ -1593,12 +1615,12 @@ void packet_parse(struct gps_lexer_t *lexer)
for (i = 2; i < len - 3; i++)
b ^= lexer->inbuffer[i];
if (a == b) {
- gpsd_report(lexer->debug, LOG_IO,
+ lexer_report(lexer, LOG_IO,
"Accept OnCore packet @@%c%c len %d\n",
lexer->inbuffer[2], lexer->inbuffer[3], len);
packet_accept(lexer, ONCORE_PACKET);
} else {
- gpsd_report(lexer->debug, LOG_IO,
+ lexer_report(lexer, LOG_IO,
"REJECT OnCore packet @@%c%c len %d\n",
lexer->inbuffer[2], lexer->inbuffer[3], len);
packet_accept(lexer, BAD_PACKET);
@@ -1621,7 +1643,7 @@ void packet_parse(struct gps_lexer_t *lexer)
if (dlecnt > 2) {
dlecnt -= 2;
dlecnt /= 2;
- gpsd_report(lexer->debug, LOG_RAW,
+ lexer_report(lexer, LOG_RAW,
"Unstuffed %d DLEs\n", dlecnt);
packetlen -= dlecnt;
}
@@ -1672,7 +1694,7 @@ void packet_parse(struct gps_lexer_t *lexer)
/*@ +charint */
chksum &= 0xff;
if (chksum) {
- gpsd_report(lexer->debug, LOG_IO,
+ lexer_report(lexer, LOG_IO,
"Garmin checksum failed: %02x!=0\n", chksum);
goto not_garmin;
}
@@ -1680,7 +1702,7 @@ void packet_parse(struct gps_lexer_t *lexer)
packet_discard(lexer);
break;
not_garmin:;
- gpsd_report(lexer->debug, LOG_RAW + 1,
+ lexer_report(lexer, LOG_RAW + 1,
"Not a Garmin packet\n");
#endif /* GARMIN_ENABLE */
#ifdef TSIP_ENABLE
@@ -1731,7 +1753,7 @@ void packet_parse(struct gps_lexer_t *lexer)
(0xbc == pkt_id) ||
(0x38 == pkt_id))
&& ((0x41 > pkt_id) || (0x8f < pkt_id))) {
- gpsd_report(lexer->debug, LOG_IO,
+ lexer_report(lexer, LOG_IO,
"Packet ID 0x%02x out of range for TSIP\n",
pkt_id);
goto not_tsip;
@@ -1815,14 +1837,14 @@ void packet_parse(struct gps_lexer_t *lexer)
/* pass */ ;
else {
/* pass */ ;
- gpsd_report(lexer->debug, LOG_IO,
+ lexer_report(lexer, LOG_IO,
"TSIP REJECT pkt_id = %#02x, packetlen= %zu\n",
pkt_id, packetlen);
goto not_tsip;
}
#undef TSIP_ID_AND_LENGTH
/* Debug */
- gpsd_report(lexer->debug, LOG_RAW,
+ lexer_report(lexer, LOG_RAW,
"TSIP pkt_id = %#02x, packetlen= %zu\n",
pkt_id, packetlen);
/*@ -charint +ifempty @*/
@@ -1830,7 +1852,7 @@ void packet_parse(struct gps_lexer_t *lexer)
packet_discard(lexer);
break;
not_tsip:
- gpsd_report(lexer->debug, LOG_RAW + 1, "Not a TSIP packet\n");
+ lexer_report(lexer, LOG_RAW + 1, "Not a TSIP packet\n");
/*
* More attempts to recognize ambiguous TSIP-like
* packet types could go here.
@@ -1849,7 +1871,7 @@ void packet_parse(struct gps_lexer_t *lexer)
lexer->inbufptr - lexer->inbuffer)) {
packet_accept(lexer, RTCM3_PACKET);
} else {
- gpsd_report(lexer->debug, LOG_IO,
+ lexer_report(lexer, LOG_IO,
"RTCM3 data checksum failure, "
"%0x against %02x %02x %02x\n",
crc24q_hash(lexer->inbuffer,
@@ -1873,7 +1895,7 @@ void packet_parse(struct gps_lexer_t *lexer)
if (len == 0 || sum == getword(5 + len)) {
packet_accept(lexer, ZODIAC_PACKET);
} else {
- gpsd_report(lexer->debug, LOG_IO,
+ lexer_report(lexer, LOG_IO,
"Zodiac data checksum 0x%hx over length %hd, expecting 0x%hx\n",
sum, len, getword(5 + len));
packet_accept(lexer, BAD_PACKET);
@@ -1890,7 +1912,7 @@ void packet_parse(struct gps_lexer_t *lexer)
unsigned char ck_a = (unsigned char)0;
unsigned char ck_b = (unsigned char)0;
len = lexer->inbufptr - lexer->inbuffer;
- gpsd_report(lexer->debug, LOG_IO, "UBX: len %d\n", len);
+ lexer_report(lexer, LOG_IO, "UBX: len %d\n", len);
for (n = 2; n < (len - 2); n++) {
ck_a += lexer->inbuffer[n];
ck_b += ck_a;
@@ -1899,7 +1921,7 @@ void packet_parse(struct gps_lexer_t *lexer)
ck_b == lexer->inbuffer[len - 1])
packet_accept(lexer, UBX_PACKET);
else {
- gpsd_report(lexer->debug, LOG_IO,
+ lexer_report(lexer, LOG_IO,
"UBX checksum 0x%02hhx%02hhx over length %d,"
" expecting 0x%02hhx%02hhx (type 0x%02hhx%02hhx)\n",
ck_a,
@@ -1950,7 +1972,7 @@ void packet_parse(struct gps_lexer_t *lexer)
goto not_evermore;
crc &= 0xff;
if (crc != checksum) {
- gpsd_report(lexer->debug, LOG_IO,
+ lexer_report(lexer, LOG_IO,
"EverMore checksum failed: %02x != %02x\n",
crc, checksum);
goto not_evermore;
@@ -1992,7 +2014,7 @@ void packet_parse(struct gps_lexer_t *lexer)
if (len == 0 || csum == xsum)
packet_accept(lexer, ITALK_PACKET);
else {
- gpsd_report(lexer->debug, LOG_IO,
+ lexer_report(lexer, LOG_IO,
"ITALK: checksum failed - "
"type 0x%02x expected 0x%04x got 0x%04x\n",
lexer->inbuffer[4], xsum, csum);
@@ -2028,7 +2050,7 @@ void packet_parse(struct gps_lexer_t *lexer)
if (cs == 0)
packet_accept(lexer, GEOSTAR_PACKET);
else {
- gpsd_report(lexer->debug, LOG_IO,
+ lexer_report(lexer, LOG_IO,
"GeoStar checksum failed 0x%x over length %d\n",
cs, len);
packet_accept(lexer, BAD_PACKET);
@@ -2094,18 +2116,18 @@ ssize_t packet_get(int fd, struct gps_lexer_t *lexer)
/*@ +modobserver @*/
if (recvd == -1) {
if ((errno == EAGAIN) || (errno == EINTR)) {
- gpsd_report(lexer->debug, LOG_RAW + 2, "no bytes ready\n");
+ lexer_report(lexer, LOG_RAW + 2, "no bytes ready\n");
recvd = 0;
/* fall through, input buffer may be nonempty */
} else {
- gpsd_report(lexer->debug, LOG_RAW + 2,
+ lexer_report(lexer, LOG_RAW + 2,
"errno: %s\n", strerror(errno));
return -1;
}
} else {
if (lexer->debug >= LOG_RAW+1) {
char scratchbuf[MAX_PACKET_LENGTH*2+1];
- gpsd_report(lexer->debug, LOG_RAW + 1,
+ lexer_report(lexer, LOG_RAW + 1,
"Read %zd chars to buffer offset %zd (total %zd): %s\n",
recvd, lexer->inbuflen, lexer->inbuflen + recvd,
gpsd_packetdump(scratchbuf, sizeof(scratchbuf),
@@ -2113,7 +2135,7 @@ ssize_t packet_get(int fd, struct gps_lexer_t *lexer)
}
lexer->inbuflen += recvd;
}
- gpsd_report(lexer->debug, LOG_SPIN,
+ lexer_report(lexer, LOG_SPIN,
"packet_get() fd %d -> %zd (%d)\n",
fd, recvd, errno);