summaryrefslogtreecommitdiff
path: root/driver_nmea2000.c
diff options
context:
space:
mode:
authorReinhard Arlt <reinhard.arlt@t-online.de>2012-12-09 02:24:45 +0100
committerReinhard Arlt <reinhard.arlt@t-online.de>2012-12-09 02:24:45 +0100
commitdc7dd3beff7b8ac8f9cf01a45db9ac7663733c5b (patch)
tree9c06cbfb2408d5671b78bea190375fd1905b7dad /driver_nmea2000.c
parent82991fa602cd228190ff491a38d8ab1b8dd4a0d1 (diff)
downloadgpsd-dc7dd3beff7b8ac8f9cf01a45db9ac7663733c5b.tar.gz
Fix bug in nmea2000 fast packet handling.
Diffstat (limited to 'driver_nmea2000.c')
-rw-r--r--driver_nmea2000.c42
1 files changed, 30 insertions, 12 deletions
diff --git a/driver_nmea2000.c b/driver_nmea2000.c
index e15505bd..b385dec2 100644
--- a/driver_nmea2000.c
+++ b/driver_nmea2000.c
@@ -37,6 +37,7 @@
#define MIN(a,b) ((a < b) ? a : b)
#define NMEA2000_DEBUG_AIS 0
+#define NMEA2000_FAST_DEBUG 0
static struct gps_device_t *nmea2000_units[NMEA2000_NETS][NMEA2000_UNITS];
static char can_interface_name[NMEA2000_NETS][CAN_NAMELEN];
@@ -915,11 +916,9 @@ static void find_pgn(struct can_frame *frame, struct gps_device_t *session)
gpsd_report(LOG_DATA, "pgn %6d:%s \n", work->pgn, work->name);
session->driver.nmea2000.workpgn = (void *) work;
- session->driver.nmea2000.idx = 0;
- session->driver.nmea2000.ptr = 0;
/*@i1@*/session->packet.outbuflen = frame->can_dlc & 0x0f;
for (l2=0;l2<session->packet.outbuflen;l2++) {
- /*@i3@*/session->packet.outbuffer[session->driver.nmea2000.ptr++]= frame->data[l2];
+ /*@i3@*/session->packet.outbuffer[l2]= frame->data[l2];
}
}
/*@i2@*/else if ((frame->data[0] & 0x1f) == 0) {
@@ -927,10 +926,16 @@ static void find_pgn(struct can_frame *frame, struct gps_device_t *session)
/*@i2@*/session->driver.nmea2000.fast_packet_len = frame->data[1];
/*@i2@*/session->driver.nmea2000.idx = frame->data[0];
- session->driver.nmea2000.ptr = 0;
+#if NMEA2000_FAST_DEBUG
+ gpsd_report(LOG_ERROR, "Set idx %2x %2x %2x %6d\n", frame->data[0],
+ session->driver.nmea2000.unit,
+ frame->data[1],
+ source_pgn);
+#endif /* of #if NMEA2000_FAST_DEBUG */
+ session->packet.inbuflen = 0;
session->driver.nmea2000.idx += 1;
for (l2=2;l2<8;l2++) {
- /*@i3@*/session->packet.outbuffer[session->driver.nmea2000.ptr++]= frame->data[l2];
+ /*@i3@*/session->packet.inbuffer[session->packet.inbuflen++] = frame->data[l2];
}
gpsd_report(LOG_DATA, "pgn %6d:%s \n", work->pgn, work->name);
}
@@ -938,23 +943,36 @@ static void find_pgn(struct can_frame *frame, struct gps_device_t *session)
unsigned int l2;
for (l2=1;l2<8;l2++) {
- if (session->driver.nmea2000.fast_packet_len > session->driver.nmea2000.ptr) {
- /*@i3@*/session->packet.outbuffer[session->driver.nmea2000.ptr++] = frame->data[l2];
+ if (session->driver.nmea2000.fast_packet_len > session->packet.inbuflen) {
+ /*@i3@*/session->packet.inbuffer[session->packet.inbuflen++] = frame->data[l2];
}
}
- if (session->driver.nmea2000.ptr == session->driver.nmea2000.fast_packet_len) {
- session->driver.nmea2000.workpgn = (void *) work;
+ if (session->packet.inbuflen == session->driver.nmea2000.fast_packet_len) {
+#if NMEA2000_FAST_DEBUG
+ gpsd_report(LOG_ERROR, "Fast done %2x %2x %2x %2x %6d\n", session->driver.nmea2000.idx,
+ frame->data[0],
+ session->driver.nmea2000.unit,
+ (unsigned int) session->driver.nmea2000.fast_packet_len,
+ source_pgn);
+#endif /* of #if NMEA2000_FAST_DEBUG */
+ session->driver.nmea2000.workpgn = (void *) work;
session->packet.outbuflen = session->driver.nmea2000.fast_packet_len;
+ for(l2=0;l2 < session->packet.outbuflen; l2++) {
+ session->packet.outbuffer[l2] = session->packet.inbuffer[l2];
+ }
session->driver.nmea2000.fast_packet_len = 0;
} else {
session->driver.nmea2000.idx += 1;
}
} else {
- session->driver.nmea2000.idx = 0;
- session->driver.nmea2000.fast_packet_len = 0;
- gpsd_report(LOG_ERROR, "Fast error\n");
+ gpsd_report(LOG_ERROR, "Fast error %2x %2x %2x %2x %6d\n", session->driver.nmea2000.idx,
+ frame->data[0],
+ session->driver.nmea2000.unit,
+ (unsigned int) session->driver.nmea2000.fast_packet_len,
+ source_pgn);
}
} else {
+ gpsd_report(LOG_ERROR, "PGN not found %08d %08x \n", source_pgn, source_pgn);
}
} else {
// we got a unknown unit number