[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[gpsd-dev] [RFC 3/3] [AIS] Add UK/ROI AtoN monitoring data message handl
From: |
chgans |
Subject: |
[gpsd-dev] [RFC 3/3] [AIS] Add UK/ROI AtoN monitoring data message handling |
Date: |
Wed, 23 May 2012 01:03:03 +0100 |
From: Christian Gagneraud <address@hidden>
---
driver_ais.c | 18 +++++++++++++++++-
gps.h | 16 ++++++++++++++++
gpsd_json.c | 23 ++++++++++++++++++++++-
jsongen.py.in | 14 ++++++++++++++
4 files changed, 69 insertions(+), 2 deletions(-)
diff --git a/driver_ais.c b/driver_ais.c
index 44ee7ef..4ab8c5a 100644
--- a/driver_ais.c
+++ b/driver_ais.c
@@ -178,7 +178,23 @@ bool ais_binary_decode(struct ais_t *ais,
ais->type6.fid = UBITS(82, 6);
ais->type6.bitcount = bitlen - 88;
imo = false;
- if (ais->type6.dac == 1)
+ /* UK and Republic Of Ireland */
+ if (ais->type6.dac == 235 || ais->type6.dac == 250) {
+ switch (ais->type6.fid) {
+ case 10: /* GLA - AtoN monitoring data */
+ ais->type6.dac235fid10.ana_int = UBITS(88, 10);
+ ais->type6.dac235fid10.ana_ext1 = UBITS(98, 10);
+ ais->type6.dac235fid10.ana_ext2 = UBITS(108, 10);
+ ais->type6.dac235fid10.stat_int = UBITS(118, 5);
+ ais->type6.dac235fid10.stat_ext = UBITS(123, 8);
+ ais->type6.dac235fid10.off_position = UBITS(131, 1);
+ /* skip 4 bits */
+ imo = true;
+ }
+ break;
+ }
+ /* International */
+ else if (ais->type6.dac == 1)
switch (ais->type6.fid) {
case 12: /* IMO236 - Dangerous cargo indication */
UCHARS(88, ais->type6.dac1fid12.lastport);
diff --git a/gps.h b/gps.h
index b74ea29..8330fa0 100644
--- a/gps.h
+++ b/gps.h
@@ -967,6 +967,22 @@ struct ais_t
char bitdata[(AIS_TYPE6_BINARY_MAX + 7) / 8];
/* IMO236 - Dangerous Cargo Indication */
struct {
+ unsigned int type; /* Message Type */
+ unsigned int repeat; /* Repeat Indicator */
+ unsigned int mmsi; /* Source MMSI */
+ unsigned int seqno; /* Sequence Number */
+ unsigned int dest_mmsi; /* Destination MMSI */
+ unsigned int retransmit; /* Retransmit flag */
+ unsigned int dac; /* DAC */
+ unsigned int fid; /* FID */
+ unsigned int ana_int; /* Analogue */
+ unsigned int ana_ext1; /* Analogue (external #1) */
+ unsigned int ana_ext2; /* Analogue (external #2) */
+ unsigned int stat_int; /* Status bits (internal) */
+ unsigned int stat_ext; /* Status bits (external) */
+ bool off_position; /* Off position status */
+ } dac235fid10;
+ struct {
char lastport[5+1]; /* Last Port Of Call */
unsigned int lmonth; /* ETA month */
unsigned int lday; /* ETA day */
diff --git a/gpsd_json.c b/gpsd_json.c
index 7e8c89e..c9d79f1 100644
--- a/gpsd_json.c
+++ b/gpsd_json.c
@@ -1807,7 +1807,28 @@ void json_aivdm_dump(const struct ais_t *ais,
ais->type6.dac,
ais->type6.fid);
imo = false;
- if (ais->type6.dac == 1)
+
+ if (ais->type6.dac == 235 || ais->type6.dac == 250) {
+ switch (ais->type6.fid) {
+ case 10: /* GLA - AtoN monitoring data */
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
+ "\"ana_int\":%u,\"ana_ext1\":%u,"
+
"\"ana_ext2\":%u,\"stat_int\":%u,\"stat_ext\":%u,"
+ "\"off_position\":\"%s\"",
+ ais->type6.dac235fid10.ana_int,
+ ais->type6.dac235fid10.ana_ext1,
+ ais->type6.dac235fid10.ana_ext2,
+ ais->type6.dac235fid10.stat_int,
+ ais->type6.dac235fid10.stat_ext,
+ JSON_BOOL(ais->type6.dac235fid10.off_position));
+ if (buf[strlen(buf) - 1] == ',')
+ buf[strlen(buf)-1] = '\0';
+ (void)strlcat(buf, "]}\r\n,", buflen);
+ imo = true;
+ break;
+ }
+ }
+ else if (ais->type6.dac == 1)
switch (ais->type6.fid) {
case 12: /* IMO236 -Dangerous cargo indication */
/* some fields have beem merged to an ISO8601 partial date */
diff --git a/jsongen.py.in b/jsongen.py.in
index 86e2169..a9075f8 100644
--- a/jsongen.py.in
+++ b/jsongen.py.in
@@ -95,6 +95,20 @@ ais_specs = (
"stringbuffered":("data",),
},
{
+ "initname" : "json_ais6_fid10",
+ "headers": ("AIS_HEADER", "AIS_TYPE6",),
+ "structname": "ais->type6.dac235fid10",
+ "fieldmap":(
+ # fieldname type default
+ ('ana_int', 'uinteger', '0'),
+ ('ana_ext1', 'uinteger', '0'),
+ ('ana_ext2', 'uinteger', '0'),
+ ('stat_int', 'uinteger', '0'),
+ ('stat_ext', 'uinteger', '0'),
+ ('off_position', 'boolean', 'false'),
+ ),
+ },
+ {
"initname" : "json_ais6_fid12",
"headers": ("AIS_HEADER","AIS_TYPE6",),
"structname": "ais->type6.dac1fid12",
--
1.7.7