summaryrefslogtreecommitdiff
path: root/pseudoais.c
diff options
context:
space:
mode:
authorReinhard Arlt <reinhard.arlt@t-online.de>2013-07-23 10:56:57 +0200
committerReinhard Arlt <reinhard.arlt@t-online.de>2013-07-23 10:56:57 +0200
commitc8a15152e74788002ec0129fd36d3f9845ebd707 (patch)
treeec0a57395060e4556da65105d2b67f8acfdb76fc /pseudoais.c
parent14ade3253974b9c41a1f86e7f976e13c5024163a (diff)
downloadgpsd-c8a15152e74788002ec0129fd36d3f9845ebd707.tar.gz
More work on AIVDM messages in nmea mode.
Diffstat (limited to 'pseudoais.c')
-rw-r--r--pseudoais.c95
1 files changed, 93 insertions, 2 deletions
diff --git a/pseudoais.c b/pseudoais.c
index 93a6658c..b3acae23 100644
--- a/pseudoais.c
+++ b/pseudoais.c
@@ -18,6 +18,16 @@
static unsigned char convtab[] = {"0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVW`abcdefghijklmnopqrstuvw"};
+static unsigned char contab1[] = {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,
+ 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
+ 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
+ 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
+
+
static unsigned int ais_addbits(unsigned char *bits,
unsigned int start,
unsigned int len,
@@ -52,6 +62,32 @@ static unsigned int ais_addbits(unsigned char *bits,
}
+static unsigned int ais_addchar(unsigned char *bits,
+ unsigned int start,
+ unsigned int len,
+ char *data)
+{
+ unsigned int l;
+ unsigned int flag;
+
+ for(l=0,flag=0;l<len;l++) {
+ unsigned int a, b;
+
+ a = data[l];
+ if (a == 0) {
+ flag = 1;
+ }
+ if (flag == 0) {
+ b = contab1[a & 0x7f];
+ } else {
+ b = 0;
+ }
+ ais_addbits(bits, start+6*l, 6, b);
+ }
+ return 0;
+}
+
+
static unsigned int ais_binary_to_ascii(unsigned char *bits, unsigned int len)
{
unsigned int l;
@@ -69,7 +105,8 @@ static unsigned int ais_binary_to_ascii(unsigned char *bits, unsigned int len)
unsigned int ais_binary_encode(struct ais_t *ais,
- unsigned char *bits)
+ unsigned char *bits,
+ int flag)
{
unsigned int len;
@@ -115,8 +152,41 @@ unsigned int ais_binary_encode(struct ais_t *ais,
len = 149 + 19;
break;
case 5: /* Ship static and voyage related data */
- break;
+ ais_addbits(bits, 38, 2, ais->type5.ais_version);
+ ais_addbits(bits, 40, 30, ais->type5.imo);
+ ais_addchar(bits, 70, 7, ais->type5.callsign);
+ ais_addchar(bits, 112, 20, ais->type5.shipname);
+ ais_addbits(bits, 232, 8, ais->type5.shiptype);
+ ais_addbits(bits, 240, 9, ais->type5.to_bow);
+ ais_addbits(bits, 249, 9, ais->type5.to_stern);
+ ais_addbits(bits, 258, 6, ais->type5.to_port);
+ ais_addbits(bits, 264, 6, ais->type5.to_starboard);
+ ais_addbits(bits, 270, 4, ais->type5.epfd);
+ ais_addbits(bits, 274, 4, ais->type5.month);
+ ais_addbits(bits, 278, 5, ais->type5.day);
+ ais_addbits(bits, 283, 5, ais->type5.hour);
+ ais_addbits(bits, 288, 6, ais->type5.minute);
+ ais_addbits(bits, 294, 8, ais->type5.draught);
+ ais_addchar(bits, 302, 20, ais->type5.destination);
+ ais_addbits(bits, 422, 1, ais->type5.dte);
+/* ais_addbits(bits, 423, 1, ais->type5.spare); */
+ len = 423 + 1;
+ break;
case 9: /* Standard SAR Aircraft Position Report */
+ ais_addbits(bits, 38, 12, ais->type9.alt);
+ ais_addbits(bits, 50, 10, ais->type9.speed);
+ ais_addbits(bits, 60, 1, ais->type9.accuracy);
+ ais_addbits(bits, 61, 28, ais->type9.lon);
+ ais_addbits(bits, 89, 27, ais->type9.lat);
+ ais_addbits(bits, 116, 12, ais->type9.course);
+ ais_addbits(bits, 128, 6, ais->type9.second);
+ ais_addbits(bits, 134, 8, ais->type9.regional);
+ ais_addbits(bits, 142, 1, ais->type9.dte);
+/* ais_addbits(bits, 143, 3, ais->type9.spare); */
+ ais_addbits(bits, 146, 1, ais->type9.assigned);
+ ais_addbits(bits, 147, 1, ais->type9.raim);
+ ais_addbits(bits, 148, 19, ais->type9.radio);
+ len = 148 + 19;
break;
case 18: /* Standard Class B CS Position Report */
ais_addbits(bits, 38, 8, ais->type18.reserved);
@@ -139,6 +209,27 @@ unsigned int ais_binary_encode(struct ais_t *ais,
len = 148 + 20;
break;
case 19: /* Extended Class B CS Position Report */
+ ais_addbits(bits, 38, 8, ais->type19.reserved);
+ ais_addbits(bits, 46, 10, ais->type19.speed);
+ ais_addbits(bits, 56, 1, ais->type19.accuracy);
+ ais_addbits(bits, 57, 28, ais->type19.lon);
+ ais_addbits(bits, 85, 27, ais->type19.lat);
+ ais_addbits(bits, 112, 12, ais->type19.course);
+ ais_addbits(bits, 124, 9, ais->type19.heading);
+ ais_addbits(bits, 133, 6, ais->type19.second);
+ ais_addbits(bits, 139, 4, ais->type19.regional);
+ ais_addchar(bits, 143, 20, ais->type19.shipname);
+ ais_addbits(bits, 263, 8, ais->type19.shiptype);
+ ais_addbits(bits, 271, 9, ais->type19.to_bow);
+ ais_addbits(bits, 280, 9, ais->type19.to_stern);
+ ais_addbits(bits, 289, 6, ais->type19.to_port);
+ ais_addbits(bits, 295, 6, ais->type19.to_starboard);
+ ais_addbits(bits, 299, 4, ais->type19.epfd);
+ ais_addbits(bits, 302, 1, ais->type19.raim);
+ ais_addbits(bits, 305, 1, ais->type19.dte);
+ ais_addbits(bits, 306, 1, ais->type19.assigned);
+/* ais_addbits(bits, 307, 5, ais->type19.spare); */
+ len = 307 + 5;
break;
case 21: /* Aid-to-Navigation Report */
break;