gpsd-dev
[Top][All Lists]
Advanced

[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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]