summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ais_json.c4
-rw-r--r--gpsd.c3
-rw-r--r--gpsd.xml45
-rw-r--r--gpsd_json.c7
-rw-r--r--test/daemon/ait250.log.chk80
-rw-r--r--test/synthetic-ais.json36
6 files changed, 99 insertions, 76 deletions
diff --git a/ais_json.c b/ais_json.c
index 53c6b1d9..80e25491 100644
--- a/ais_json.c
+++ b/ais_json.c
@@ -36,6 +36,8 @@ int json_ais_read(const char *buf,
struct ais_t *ais,
/*@null@*/const char **endptr)
{
+ /* collected but not actually used yet */
+ bool scaled;
/*@-compdef@*//* splint is confused by storage declared in the .i file */
/*@-nullstate@*/
@@ -45,6 +47,8 @@ int json_ais_read(const char *buf,
{"device", string, .addr.string = path, \
.len = pathlen}, \
{"repeat", uinteger, .addr.uinteger = &ais->repeat}, \
+ {"scaled", boolean, .addr.boolean = &scaled, \
+ .dflt.boolean = false}, \
{"mmsi", uinteger, .addr.uinteger = &ais->mmsi}
int status;
diff --git a/gpsd.c b/gpsd.c
index d4c99e92..7230e233 100644
--- a/gpsd.c
+++ b/gpsd.c
@@ -2383,7 +2383,8 @@ int main(int argc, char *argv[])
#ifdef AIVDM_ENABLE
if ((changed & AIS_SET)!=0) {
aivdm_json_dump(&device->gpsdata.ais,
- false, buf2, sizeof(buf2));
+ sub->policy.scaled,
+ buf2, sizeof(buf2));
(void)throttled_write(sub, buf2, strlen(buf2));
}
#endif /* AIVDM_ENABLE */
diff --git a/gpsd.xml b/gpsd.xml
index 4fbd92de..8d54afe1 100644
--- a/gpsd.xml
+++ b/gpsd.xml
@@ -797,13 +797,11 @@ client each time the GPS gets either a fix update or a satellite
picture, but rather than being raw NMEA the line is a gpsd 'o' or 'y'
response. If the device is a source of RTCM-104 corrections, the
corrections are dumped in the Sager dump format described in
-<citerefentry><refentrytitle>rtcm104</refentrytitle><manvolnum>5</manvolnum></citerefentry>. <!--
-If the device is a source of AIS data, AIS packets are dumped in CSV
-form with each field (other than padding fields) dumped as an unscaled
-integer or string, whichever is appropriate.--> Additionally, watching
-clients get notifications in the form X=0 or X=%f when the
-online/offline status of the GPS changes, and an I response giving the
-device type when the user is assigned a device.</para>
+<citerefentry><refentrytitle>rtcm104</refentrytitle><manvolnum>5</manvolnum></citerefentry>.
+Additionally, watching clients get notifications in the form X=0 or
+X=%f when the online/offline status of the GPS changes, and an I
+response giving the device type when the user is assigned a
+device.</para>
</refsect1>
<refsect1 id='new_protocol'><title>NEW PROTOCOL</title>
@@ -1391,12 +1389,7 @@ undodumented because that portion of the interface is considered
unstable and for developer use only.</para>
<para>In watcher mode, GPS reports are dumpred as TPV and SKY
-responses. If the device is a source of RTCM2 corrections, the
-corrections are dumped in the JSON format described in
-<citerefentry><refentrytitle>rtcm104</refentrytitle><manvolnum>5</manvolnum></citerefentry>. If
-the device is a source of AIS data, AIS packets are dumped in JSON
-form with each field (other than padding fields) dumped as an
-integer or string, whichever is appropriate.</para>
+responses. AIS and RTCM reporting is described in the next section.</para>
<para>When the C client library parses a response of this kind, it
will assert the POLICY_SET bit in the top-level set member.</para>
@@ -1647,6 +1640,32 @@ the following elements:</para>
<para>When the C client library parses a response of this kind, it
will assert the ERR_SET bit in the top-level set member.</para>
</refsect1>
+<refsect1 id='ais-rtcm'><title>AIS AND RTCM DUMP FORMATS</title>
+
+<para>AIS packets are dumped as JSON objects with class "AIS". Each
+AIS report object contains a "type" field giving the AIS message type
+and a "scaled" field telling whether the remainder of the fields are
+dumped in scaled or unscaled form. Other fields are as named ands
+specified in the <cite>AIVDM/AIVDO Protocol Decoding</cite> document.</para>
+
+<para>Most fields in most messages are integer-valued and are dumped
+the same way whether scaled or unscaled. A few are float-valued and
+associated with formulas to translate integer-valued packet bitfields
+into floats, typically by applying a divisor. A few others are
+string-valued fields in which the integer-valued packet bitfield is
+treated as an index into a string list specified in the AIS standards.
+In the latter two cases, an unscsaled dump reports the integer packet
+bitfield value and is lossless; a scaled dump reports a float or
+string.</para>
+
+<para>A few fields may have either integer or string values in a
+scaled dump, with the string values describing various extreme or
+unknown-value conditions.</para>
+
+<para>RTCM2 correctionsare dumped in the JSON format described in
+<citerefentry><refentrytitle>rtcm104</refentrytitle><manvolnum>5</manvolnum></citerefentry>.</para>
+
+</refsect1>
<refsect1 id='devices'><title>GPS DEVICE MANAGEMENT</title>
<para><application>gpsd</application> maintains an internal list of
diff --git a/gpsd_json.c b/gpsd_json.c
index 9b32df5b..ea7aa722 100644
--- a/gpsd_json.c
+++ b/gpsd_json.c
@@ -670,12 +670,11 @@ void aivdm_json_dump(const struct ais_t *ais, bool scaled, /*@out@*/char *buf, s
#define NAVAIDTYPE_DISPLAY(n) (((n) < (uint)NITEMS(navaid_type_legends[0])) ? navaid_type_legends[n] : "INVALID NAVAID TYPE")
+#define JSON_BOOL(x) ((x)?"true":"false")
(void)snprintf(buf, buflen,
"{\"class\":\"AIS\",\"type\":%u,\"repeat\":%u,"
- "\"mmsi\":%u,",
- ais->type, ais->repeat, ais->mmsi);
-
-#define JSON_BOOL(x) ((x)?"true":"false")
+ "\"mmsi\":%u,\"scaled\":%s,",
+ ais->type, ais->repeat, ais->mmsi, JSON_BOOL(scaled));
/*@ -formatcode -mustfreefresh @*/
switch (ais->type) {
case 1: /* Position Report */
diff --git a/test/daemon/ait250.log.chk b/test/daemon/ait250.log.chk
index f9aa13a4..d0ef675d 100644
--- a/test/daemon/ait250.log.chk
+++ b/test/daemon/ait250.log.chk
@@ -2,12 +2,12 @@ $GPRMC,194907.00,A,5241.99815,N,00517.56525,E,0.005,,010809,,,A*7B
{"class":"TPV","tag":"RMC","time":1249156147.000,"ept":0.005,"lat":52.699969167,"lon":5.292754167,"track":0.0000,"speed":0.003,"mode":2}
!AIVDO,1,1,,,B3aC3LP00063aj7RNpl03wSUwP06,0*43
!AIVDM,1,1,,B,13njCt031t0DA=lN2:jKmad60l1p,0*12
-{"class":"AIS","type":1,"repeat":0,"mmsi":258774000,"status":0,"turn":12,"speed":124,"accuracy":false,"lon":2656698,"lat":31492809,"course":3030,"heading":310,"second":3,"maneuver":0,"raim":false,"radio":426224}
+{"class":"AIS","type":1,"repeat":0,"mmsi":258774000,"scaled":false,"status":0,"turn":12,"speed":124,"accuracy":false,"lon":2656698,"lat":31492809,"course":3030,"heading":310,"second":3,"maneuver":0,"raim":false,"radio":426224}
$GPGBS,194907.00,3.0,1.9,4.2,,,,*4E
$GPRMC,194908.00,A,5241.99805,N,00517.56503,E,0.003,,010809,,,A*77
!AIVDO,1,1,,,B3aC3LP00063ai7RNph03wT5wP06,0*23
!AIVDM,1,1,,B,33meMd50000EoJPMvw?:Ubp@0000,0*4F
-{"class":"AIS","type":3,"repeat":0,"mmsi":257646000,"status":5,"turn":0,"speed":0,"accuracy":false,"lon":2866000,"lat":31440700,"course":2710,"heading":348,"second":8,"maneuver":0,"raim":false,"radio":0}
+{"class":"AIS","type":3,"repeat":0,"mmsi":257646000,"scaled":false,"status":5,"turn":0,"speed":0,"accuracy":false,"lon":2866000,"lat":31440700,"course":2710,"heading":348,"second":8,"maneuver":0,"raim":false,"radio":0}
$GPGBS,194908.00,3.0,1.9,4.2,,,,*41
{"class":"TPV","tag":"GBS","time":1249156148.000,"ept":0.005,"lat":52.699967500,"lon":5.292750500,"epx":1.900,"epy":3.000,"epv":4.200,"track":0.0000,"speed":0.002,"mode":2}
$GPRMC,194909.00,A,5241.99792,N,00517.56477,E,0.004,,010809,,,A*72
@@ -15,30 +15,30 @@ $GPRMC,194909.00,A,5241.99792,N,00517.56477,E,0.004,,010809,,,A*72
$GPGBS,194909.00,3.0,1.9,4.2,,,,*40
{"class":"TPV","tag":"GBS","time":1249156149.000,"ept":0.005,"lat":52.699965333,"lon":5.292746167,"epx":1.900,"epy":3.000,"epv":4.200,"track":0.0000,"speed":0.002,"mode":2}
!AIVDM,1,1,,A,B3`gaQ000062PeWRIt403wTUoP06,0*11
-{"class":"AIS","type":18,"repeat":0,"mmsi":244050308,"reserved":0,"speed":0,"accuracy":false,"lon":3166299,"lat":31614913,"course":0,"heading":511,"second":9,"regional":0,"cs":true,"display":false,"dsc":true,"band":true,"msg22":true,"raim":true,"radio":917510}
+{"class":"AIS","type":18,"repeat":0,"mmsi":244050308,"scaled":false,"reserved":0,"speed":0,"accuracy":false,"lon":3166299,"lat":31614913,"course":0,"heading":511,"second":9,"regional":0,"cs":true,"display":false,"dsc":true,"band":true,"msg22":true,"raim":true,"radio":917510}
!AIVDM,1,1,,A,13b?ED00000E2`dN1S9=oS0@00Sb,0*6E
-{"class":"AIS","type":1,"repeat":0,"mmsi":245618000,"status":0,"turn":0,"speed":0,"accuracy":false,"lon":2757910,"lat":31482660,"course":3550,"heading":96,"second":8,"maneuver":0,"raim":false,"radio":4564}
+{"class":"AIS","type":1,"repeat":0,"mmsi":245618000,"scaled":false,"status":0,"turn":0,"speed":0,"accuracy":false,"lon":2757910,"lat":31482660,"course":3550,"heading":96,"second":8,"maneuver":0,"raim":false,"radio":4564}
$GPRMC,194910.00,A,5241.99782,N,00517.56453,E,0.006,,010809,,,A*7F
!AIVDO,1,1,,,B3aC3LP00063afWRNp`03wU5wP06,0*45
!AIVDM,1,1,,A,D02E3:0Alg6D000000000000001,2*17
-{"class":"AIS","type":20,"repeat":0,"mmsi":2442024,"offset1":285,"number1":2,"timeout1":7,"increment1":1125,"offset2":0,"number2":0,"timeout2":0,"increment2":0,"offset3":0,"number3":0,"timeout3":0,"increment3":0,"offset4":0,"number4":0,"timeout4":0,"increment4":0}
+{"class":"AIS","type":20,"repeat":0,"mmsi":2442024,"scaled":false,"offset1":285,"number1":2,"timeout1":7,"increment1":1125,"offset2":0,"number2":0,"timeout2":0,"increment2":0,"offset3":0,"number3":0,"timeout3":0,"increment3":0,"offset4":0,"number4":0,"timeout4":0,"increment4":0}
$GPGBS,194910.00,3.0,1.9,4.2,,,,*48
{"class":"TPV","tag":"GBS","time":1249156150.000,"ept":0.005,"lat":52.699963667,"lon":5.292742167,"epx":1.900,"epy":3.000,"epv":4.200,"track":0.0000,"speed":0.003,"mode":2}
!AIVDM,1,1,,A,139QcE7P?w<tSF0l4Q@>4?wv0PS<,0*5A
-{"class":"AIS","type":1,"repeat":0,"mmsi":211315540,"status":7,"turn":-128,"speed":1023,"accuracy":false,"lon":108600000,"lat":54600000,"course":3600,"heading":511,"second":63,"maneuver":0,"raim":false,"radio":266648}
+{"class":"AIS","type":1,"repeat":0,"mmsi":211315540,"scaled":false,"status":7,"turn":-128,"speed":1023,"accuracy":false,"lon":108600000,"lat":54600000,"course":3600,"heading":511,"second":63,"maneuver":0,"raim":false,"radio":266648}
$GPRMC,194911.00,A,5241.99772,N,00517.56430,E,0.020,229.98,010809,,,A*66
!AIVDM,1,1,,B,402E3:0000HttPGEahN7pi700p6T,0*09
-{"class":"AIS","type":4,"repeat":0,"mmsi":2442024,"timestamp":"0000-00-00T24:60:60Z","accuracy":true,"lon":3059000,"lat":31586500,"epfd":7,"raim":false,"radio":229796}
+{"class":"AIS","type":4,"repeat":0,"mmsi":2442024,"scaled":false,"timestamp":"0000-00-00T24:60:60Z","accuracy":true,"lon":3059000,"lat":31586500,"epfd":7,"raim":false,"radio":229796}
!AIVDM,1,1,,A,14S64>51ASPEeIpN05::v`lF086a,0*3B
-{"class":"AIS","type":1,"repeat":0,"mmsi":305235000,"status":5,"turn":5,"speed":99,"accuracy":true,"lon":2845500,"lat":31458600,"course":2810,"heading":282,"second":11,"maneuver":0,"raim":false,"radio":66386}
+{"class":"AIS","type":1,"repeat":0,"mmsi":305235000,"scaled":false,"status":5,"turn":5,"speed":99,"accuracy":true,"lon":2845500,"lat":31458600,"course":2810,"heading":282,"second":11,"maneuver":0,"raim":false,"radio":66386}
!AIVDO,1,1,,,B3aC3LP00063aeWRNpV?gwUUwP06,0*4B
$GPGBS,194911.00,3.0,1.9,4.2,,,,*49
{"class":"TPV","tag":"GBS","time":1249156151.000,"ept":0.005,"lat":52.699962000,"lon":5.292738333,"epx":1.900,"epy":3.000,"epv":4.200,"track":229.9800,"speed":0.010,"mode":2}
!AIVDM,1,1,,B,13bf9v00010IaB<N8IK3uSvH00SC,0*44
-{"class":"AIS","type":1,"repeat":0,"mmsi":246123000,"status":0,"turn":0,"speed":1,"accuracy":false,"lon":3361350,"lat":31594860,"course":1014,"heading":127,"second":12,"maneuver":0,"raim":false,"radio":4518}
+{"class":"AIS","type":1,"repeat":0,"mmsi":246123000,"scaled":false,"status":0,"turn":0,"speed":1,"accuracy":false,"lon":3361350,"lat":31594860,"course":1014,"heading":127,"second":12,"maneuver":0,"raim":false,"radio":4518}
$GPRMC,194912.00,A,5241.99761,N,00517.56408,E,0.012,,010809,,,A*7B
!AIVDM,1,1,,B,13bcuF0P000H@EhN:0s1dgvF087B,0*28
-{"class":"AIS","type":1,"repeat":0,"mmsi":246087000,"status":0,"turn":-128,"speed":0,"accuracy":false,"lon":3179192,"lat":31621356,"course":434,"heading":511,"second":11,"maneuver":0,"raim":false,"radio":66468}
+{"class":"AIS","type":1,"repeat":0,"mmsi":246087000,"scaled":false,"status":0,"turn":-128,"speed":0,"accuracy":false,"lon":3179192,"lat":31621356,"course":434,"heading":511,"second":11,"maneuver":0,"raim":false,"radio":66468}
!AIVDO,1,1,,,B3aC3LP00063ad7RNpP03wV5wP06,0*14
$GPGBS,194912.00,3.0,1.9,4.2,,,,*4A
{"class":"TPV","tag":"GBS","time":1249156152.000,"ept":0.005,"lat":52.699960167,"lon":5.292734667,"epx":1.900,"epy":3.000,"epv":4.200,"track":0.0000,"speed":0.006,"mode":2}
@@ -51,19 +51,19 @@ $GPRMC,194914.00,A,5241.99742,N,00517.56388,E,0.005,,010809,,,A*75
$GPGBS,194914.00,3.0,1.9,4.2,,,,*4C
{"class":"TPV","tag":"GBS","time":1249156154.000,"ept":0.005,"lat":52.699957000,"lon":5.292731333,"epx":1.900,"epy":3.000,"epv":4.200,"track":0.0000,"speed":0.003,"mode":2}
!AIVDM,1,1,,A,13aC225P130HqLfN3t4i6OvJP<0<,0*33
-{"class":"AIS","type":1,"repeat":0,"mmsi":244630024,"status":5,"turn":-128,"speed":67,"accuracy":false,"lon":3263383,"lat":31521811,"course":281,"heading":511,"second":13,"maneuver":1,"raim":false,"radio":98328}
+{"class":"AIS","type":1,"repeat":0,"mmsi":244630024,"scaled":false,"status":5,"turn":-128,"speed":67,"accuracy":false,"lon":3263383,"lat":31521811,"course":281,"heading":511,"second":13,"maneuver":1,"raim":false,"radio":98328}
$GPRMC,194915.00,A,5241.99733,N,00517.56384,E,0.013,,010809,,,A*79
!AIVDO,1,1,,,B3aC3LP00063ac7RNpD03wWUwP06,0*66
$GPGBS,194915.00,3.0,1.9,4.2,,,,*4D
{"class":"TPV","tag":"GBS","time":1249156155.000,"ept":0.005,"lat":52.699955500,"lon":5.292730667,"epx":1.900,"epy":3.000,"epv":4.200,"track":0.0000,"speed":0.007,"mode":2}
!AIVDM,1,1,,A,13`e>5OP1S0GmF@N0OLBF?vL00SQ,0*35
-{"class":"AIS","type":1,"repeat":0,"mmsi":244010517,"status":15,"turn":-128,"speed":99,"accuracy":false,"lon":3123912,"lat":31465329,"course":600,"heading":511,"second":14,"maneuver":0,"raim":false,"radio":4546}
+{"class":"AIS","type":1,"repeat":0,"mmsi":244010517,"scaled":false,"status":15,"turn":-128,"speed":99,"accuracy":false,"lon":3123912,"lat":31465329,"course":600,"heading":511,"second":14,"maneuver":0,"raim":false,"radio":4546}
$GPRMC,194916.00,A,5241.99726,N,00517.56385,E,0.007,,010809,,,A*7A
!AIVDO,1,1,,,B3aC3LP00063ac7RNp@03w`5wP06,0*35
$GPGBS,194916.00,3.0,1.9,4.2,,,,*4E
{"class":"TPV","tag":"GBS","time":1249156156.000,"ept":0.005,"lat":52.699954333,"lon":5.292730833,"epx":1.900,"epy":3.000,"epv":4.200,"track":0.0000,"speed":0.004,"mode":2}
!AIVDM,1,1,,B,100001?P?w<tSF0l4Q@>4?wp0W3h,0*28
-{"class":"AIS","type":1,"repeat":0,"mmsi":4,"status":15,"turn":-128,"speed":1023,"accuracy":false,"lon":108600000,"lat":54600000,"course":3600,"heading":511,"second":60,"maneuver":0,"raim":false,"radio":319968}
+{"class":"AIS","type":1,"repeat":0,"mmsi":4,"scaled":false,"status":15,"turn":-128,"speed":1023,"accuracy":false,"lon":108600000,"lat":54600000,"course":3600,"heading":511,"second":60,"maneuver":0,"raim":false,"radio":319968}
$GPRMC,194917.00,A,5241.99721,N,00517.56389,E,0.003,,010809,,,A*74
!AIVDO,1,1,,,B3aC3LP00063ac7RNp@03w`UwP06,0*55
$GPGBS,194917.00,3.0,1.9,4.2,,,,*4F
@@ -74,33 +74,33 @@ $GPGBS,194918.00,3.0,1.9,4.2,,,,*40
{"class":"TPV","tag":"GBS","time":1249156158.000,"ept":0.005,"lat":52.699952500,"lon":5.292732333,"epx":1.900,"epy":3.000,"epv":4.200,"track":0.0000,"speed":0.002,"mode":2}
!AIVDM,2,1,8,B,54S64>02;dlqK8@cL00lDADl0000000000000016;0<:65wj0?hCDm1DQ0C@,0*63
!AIVDM,2,2,8,B,00000000002,2*2D
-{"class":"AIS","type":5,"repeat":0,"mmsi":305235000,"imo":9155406,"ais_version":0,"callsign":"V2DJ7","shipname":"MEDUM","shiptype":70,"to_bow":88,"to_stern":12,"to_port":10,"to_starboard":6,"epfd":1,"eta":"07-31T18:00Z","draught":63,"destination":"AMSTERDAM","dte":0}
+{"class":"AIS","type":5,"repeat":0,"mmsi":305235000,"scaled":false,"imo":9155406,"ais_version":0,"callsign":"V2DJ7","shipname":"MEDUM","shiptype":70,"to_bow":88,"to_stern":12,"to_port":10,"to_starboard":6,"epfd":1,"eta":"07-31T18:00Z","draught":63,"destination":"AMSTERDAM","dte":0}
$GPRMC,194919.00,A,5241.99711,N,00517.56399,E,0.004,,010809,,,A*7F
!AIVDO,1,1,,,B3aC3LP00063acWRNp<03waUwP06,0*48
$GPGBS,194919.00,3.0,1.9,4.2,,,,*41
{"class":"TPV","tag":"GBS","time":1249156159.000,"ept":0.005,"lat":52.699951833,"lon":5.292733167,"epx":1.900,"epy":3.000,"epv":4.200,"track":0.0000,"speed":0.002,"mode":2}
$GPRMC,194920.00,A,5241.99711,N,00517.56409,E,0.005,,010809,,,A*7A
!AIVDM,1,1,,B,13`g5:0P0`0E9MbN1FgDE?vV06K4,0*45
-{"class":"AIS","type":1,"repeat":0,"mmsi":244041000,"status":0,"turn":-128,"speed":40,"accuracy":false,"lon":2771893,"lat":31479485,"course":1108,"heading":511,"second":19,"maneuver":0,"raim":false,"radio":52616}
+{"class":"AIS","type":1,"repeat":0,"mmsi":244041000,"scaled":false,"status":0,"turn":-128,"speed":40,"accuracy":false,"lon":2771893,"lat":31479485,"course":1108,"heading":511,"second":19,"maneuver":0,"raim":false,"radio":52616}
!AIVDO,1,1,,,B3aC3LP00063ad7RNp<03wb5wP06,0*4C
!AIVDM,1,1,,A,13BE3l001n0DJHVN1fQJrHjb00SU,0*35
-{"class":"AIS","type":1,"repeat":0,"mmsi":220546000,"status":0,"turn":0,"speed":118,"accuracy":false,"lon":2675475,"lat":31485573,"course":2793,"heading":281,"second":21,"maneuver":0,"raim":false,"radio":4554}
+{"class":"AIS","type":1,"repeat":0,"mmsi":220546000,"scaled":false,"status":0,"turn":0,"speed":118,"accuracy":false,"lon":2675475,"lat":31485573,"course":2793,"heading":281,"second":21,"maneuver":0,"raim":false,"radio":4554}
$GPGBS,194920.00,3.0,1.9,4.2,,,,*4B
{"class":"TPV","tag":"GBS","time":1249156160.000,"ept":0.005,"lat":52.699951833,"lon":5.292734833,"epx":1.900,"epy":3.000,"epv":4.200,"track":0.0000,"speed":0.003,"mode":2}
$GPRMC,194921.00,A,5241.99708,N,00517.56417,E,0.007,,010809,,,A*7E
!AIVDM,1,1,,A,13bf9v00010IaApN8IK3uSvd0H<V,0*26
-{"class":"AIS","type":1,"repeat":0,"mmsi":246123000,"status":0,"turn":0,"speed":1,"accuracy":false,"lon":3361340,"lat":31594860,"course":1014,"heading":127,"second":22,"maneuver":0,"raim":false,"radio":198220}
+{"class":"AIS","type":1,"repeat":0,"mmsi":246123000,"scaled":false,"status":0,"turn":0,"speed":1,"accuracy":false,"lon":3361340,"lat":31594860,"course":1014,"heading":127,"second":22,"maneuver":0,"raim":false,"radio":198220}
!AIVDO,1,1,,,B3aC3LP00063adWRNp803wbUwP06,0*48
$GPGBS,194921.00,3.0,1.9,4.2,,,,*4A
{"class":"TPV","tag":"GBS","time":1249156161.000,"ept":0.005,"lat":52.699951333,"lon":5.292736167,"epx":1.900,"epy":3.000,"epv":4.200,"track":0.0000,"speed":0.004,"mode":2}
!AIVDM,1,1,,A,13bcuF0P000H@EjN:0sEiOv`00T4,0*43
-{"class":"AIS","type":1,"repeat":0,"mmsi":246087000,"status":0,"turn":-128,"speed":0,"accuracy":false,"lon":3179193,"lat":31621357,"course":1477,"heading":511,"second":20,"maneuver":0,"raim":false,"radio":4616}
+{"class":"AIS","type":1,"repeat":0,"mmsi":246087000,"scaled":false,"status":0,"turn":-128,"speed":0,"accuracy":false,"lon":3179193,"lat":31621357,"course":1477,"heading":511,"second":20,"maneuver":0,"raim":false,"radio":4616}
$GPRMC,194922.00,A,5241.99705,N,00517.56418,E,0.003,,010809,,,A*7B
!AIVDO,1,1,,,B3aC3LP00063adWRNp803wc5wP06,0*29
$GPGBS,194922.00,3.0,1.9,4.2,,,,*49
{"class":"TPV","tag":"GBS","time":1249156162.000,"ept":0.005,"lat":52.699950833,"lon":5.292736333,"epx":1.900,"epy":3.000,"epv":4.200,"track":0.0000,"speed":0.002,"mode":2}
!AIVDM,1,1,,A,13ck<f10?wPCe;`N3>f>428b0D1S,0*43
-{"class":"AIS","type":1,"repeat":0,"mmsi":247254200,"status":1,"turn":0,"speed":1023,"accuracy":true,"lon":2582900,"lat":31510200,"course":3600,"heading":68,"second":21,"maneuver":0,"raim":false,"radio":164038}
+{"class":"AIS","type":1,"repeat":0,"mmsi":247254200,"scaled":false,"status":1,"turn":0,"speed":1023,"accuracy":true,"lon":2582900,"lat":31510200,"course":3600,"heading":68,"second":21,"maneuver":0,"raim":false,"radio":164038}
$GPRMC,194923.00,A,5241.99704,N,00517.56423,E,0.007,,010809,,,A*77
$GPGBS,194923.00,3.0,1.9,4.2,,,,*48
{"class":"TPV","tag":"GBS","time":1249156163.000,"ept":0.005,"lat":52.699950667,"lon":5.292737167,"epx":1.900,"epy":3.000,"epv":4.200,"track":0.0000,"speed":0.004,"mode":2}
@@ -110,15 +110,15 @@ $GPGBS,194924.00,3.0,1.9,4.2,,,,*4F
{"class":"TPV","tag":"GBS","time":1249156164.000,"ept":0.005,"lat":52.699950833,"lon":5.292737500,"epx":1.900,"epy":3.000,"epv":4.200,"track":0.0000,"speed":0.003,"mode":2}
!AIVDO,1,1,,,B3aC3LP00063ae7RNp803wd5wP06,0*4F
!AIVDM,1,1,,B,100001?P?w<tSF0l4Q@>4?wp0PS6,0*11
-{"class":"AIS","type":1,"repeat":0,"mmsi":4,"status":15,"turn":-128,"speed":1023,"accuracy":false,"lon":108600000,"lat":54600000,"course":3600,"heading":511,"second":60,"maneuver":0,"raim":false,"radio":266636}
+{"class":"AIS","type":1,"repeat":0,"mmsi":4,"scaled":false,"status":15,"turn":-128,"speed":1023,"accuracy":false,"lon":108600000,"lat":54600000,"course":3600,"heading":511,"second":60,"maneuver":0,"raim":false,"radio":266636}
!AIVDM,1,1,,B,13aC225P130HqQ@N3tfQ5OvfP6K4,0*37
-{"class":"AIS","type":1,"repeat":0,"mmsi":244630024,"status":5,"turn":-128,"speed":67,"accuracy":false,"lon":3263528,"lat":31521978,"course":277,"heading":511,"second":23,"maneuver":1,"raim":false,"radio":52616}
+{"class":"AIS","type":1,"repeat":0,"mmsi":244630024,"scaled":false,"status":5,"turn":-128,"speed":67,"accuracy":false,"lon":3263528,"lat":31521978,"course":277,"heading":511,"second":23,"maneuver":1,"raim":false,"radio":52616}
$GPRMC,194925.00,A,5241.99714,N,00517.56429,E,0.002,,010809,,,A*7F
$GPGBS,194925.00,3.0,1.9,4.2,,,,*4E
{"class":"TPV","tag":"GBS","time":1249156165.000,"ept":0.005,"lat":52.699952333,"lon":5.292738167,"epx":1.900,"epy":3.000,"epv":4.200,"track":0.0000,"speed":0.001,"mode":2}
!AIVDO,1,1,,,B3aC3LP00063ae7RNp<03wdUwP06,0*2B
!AIVDM,1,1,,B,D02E3:1FTg6D000000000000001,2*2A
-{"class":"AIS","type":20,"repeat":0,"mmsi":2442024,"offset1":1385,"number1":2,"timeout1":7,"increment1":1125,"offset2":0,"number2":0,"timeout2":0,"increment2":0,"offset3":0,"number3":0,"timeout3":0,"increment3":0,"offset4":0,"number4":0,"timeout4":0,"increment4":0}
+{"class":"AIS","type":20,"repeat":0,"mmsi":2442024,"scaled":false,"offset1":1385,"number1":2,"timeout1":7,"increment1":1125,"offset2":0,"number2":0,"timeout2":0,"increment2":0,"offset3":0,"number3":0,"timeout3":0,"increment3":0,"offset4":0,"number4":0,"timeout4":0,"increment4":0}
$GPRMC,194926.00,A,5241.99718,N,00517.56440,E,0.010,,010809,,,A*7C
$GPGBS,194926.00,3.0,1.9,4.2,,,,*4D
{"class":"TPV","tag":"GBS","time":1249156166.000,"ept":0.005,"lat":52.699953000,"lon":5.292740000,"epx":1.900,"epy":3.000,"epv":4.200,"track":0.0000,"speed":0.005,"mode":2}
@@ -128,41 +128,41 @@ $GPGBS,194927.00,3.0,1.9,4.2,,,,*4C
{"class":"TPV","tag":"GBS","time":1249156167.000,"ept":0.005,"lat":52.699953833,"lon":5.292742333,"epx":1.900,"epy":3.000,"epv":4.200,"track":0.0000,"speed":0.005,"mode":2}
!AIVDO,1,1,,,B3aC3LP00063afWRNp@03weUsP06,0*31
!AIVDM,1,1,,A,13`p;<0P0`0E8p0N1GU4G?vl@@@G,0*32
-{"class":"AIS","type":1,"repeat":0,"mmsi":244190000,"status":0,"turn":-128,"speed":40,"accuracy":false,"lon":2770688,"lat":31479700,"course":1116,"heading":511,"second":26,"maneuver":0,"raim":false,"radio":133166}
+{"class":"AIS","type":1,"repeat":0,"mmsi":244190000,"scaled":false,"status":0,"turn":-128,"speed":40,"accuracy":false,"lon":2770688,"lat":31479700,"course":1116,"heading":511,"second":26,"maneuver":0,"raim":false,"radio":133166}
$GPRMC,194928.00,A,5241.99730,N,00517.56469,E,0.005,,010809,,,A*77
$GPGBS,194928.00,3.0,1.9,4.2,,,,*43
{"class":"TPV","tag":"GBS","time":1249156168.000,"ept":0.005,"lat":52.699955000,"lon":5.292744833,"epx":1.900,"epy":3.000,"epv":4.200,"track":0.0000,"speed":0.003,"mode":2}
!AIVDO,1,1,,,B3aC3LP00063ag7RNpD03wf5sP06,0*37
!AIVDM,1,1,,B,100001?P?w<tSF0l4Q@>4?wp0PS3,0*14
-{"class":"AIS","type":1,"repeat":0,"mmsi":4,"status":15,"turn":-128,"speed":1023,"accuracy":false,"lon":108600000,"lat":54600000,"course":3600,"heading":511,"second":60,"maneuver":0,"raim":false,"radio":266630}
+{"class":"AIS","type":1,"repeat":0,"mmsi":4,"scaled":false,"status":15,"turn":-128,"speed":1023,"accuracy":false,"lon":108600000,"lat":54600000,"course":3600,"heading":511,"second":60,"maneuver":0,"raim":false,"radio":266630}
$GPRMC,194929.00,A,5241.99738,N,00517.56482,E,0.002,,010809,,,A*7C
$GPGBS,194929.00,3.0,1.9,4.2,,,,*42
{"class":"TPV","tag":"GBS","time":1249156169.000,"ept":0.005,"lat":52.699956333,"lon":5.292747000,"epx":1.900,"epy":3.000,"epv":4.200,"track":0.0000,"speed":0.001,"mode":2}
!AIVDO,1,1,,,B3aC3LP00063ah7RNpD03wfUsP06,0*58
!AIVDM,1,1,,A,139QcE7P?w<tSF0l4Q@>4?wv0URP,0*32
-{"class":"AIS","type":1,"repeat":0,"mmsi":211315540,"status":7,"turn":-128,"speed":1023,"accuracy":false,"lon":108600000,"lat":54600000,"course":3600,"heading":511,"second":63,"maneuver":0,"raim":false,"radio":307520}
+{"class":"AIS","type":1,"repeat":0,"mmsi":211315540,"scaled":false,"status":7,"turn":-128,"speed":1023,"accuracy":false,"lon":108600000,"lat":54600000,"course":3600,"heading":511,"second":63,"maneuver":0,"raim":false,"radio":307520}
$GPRMC,194930.00,A,5241.99745,N,00517.56492,E,0.006,,010809,,,A*7B
$GPGBS,194930.00,3.0,1.9,4.2,,,,*4A
{"class":"TPV","tag":"GBS","time":1249156170.000,"ept":0.005,"lat":52.699957500,"lon":5.292748667,"epx":1.900,"epy":3.000,"epv":4.200,"track":0.0000,"speed":0.003,"mode":2}
!AIVDO,1,1,,,B3aC3LP00063ahWRNpH03wg5sP06,0*55
!AIVDM,1,1,,B,402E3:0000HttPGEahN7pi700pBB,0*6B
-{"class":"AIS","type":4,"repeat":0,"mmsi":2442024,"timestamp":"0000-00-00T24:60:60Z","accuracy":true,"lon":3059000,"lat":31586500,"epfd":7,"raim":false,"radio":230546}
+{"class":"AIS","type":4,"repeat":0,"mmsi":2442024,"scaled":false,"timestamp":"0000-00-00T24:60:60Z","accuracy":true,"lon":3059000,"lat":31586500,"epfd":7,"raim":false,"radio":230546}
$GPRMC,194931.00,A,5241.99750,N,00517.56500,E,0.002,,010809,,,A*70
$GPGBS,194931.00,3.0,1.9,4.2,,,,*4B
{"class":"TPV","tag":"GBS","time":1249156171.000,"ept":0.005,"lat":52.699958333,"lon":5.292750000,"epx":1.900,"epy":3.000,"epv":4.200,"track":0.0000,"speed":0.001,"mode":2}
!AIVDM,1,1,,B,13bcuF0P000H@F2N:0tL<wvt0<0=,0*0D
-{"class":"AIS","type":1,"repeat":0,"mmsi":246087000,"status":0,"turn":-128,"speed":0,"accuracy":false,"lon":3179201,"lat":31621361,"course":3123,"heading":511,"second":30,"maneuver":0,"raim":false,"radio":98330}
+{"class":"AIS","type":1,"repeat":0,"mmsi":246087000,"scaled":false,"status":0,"turn":-128,"speed":0,"accuracy":false,"lon":3179201,"lat":31621361,"course":3123,"heading":511,"second":30,"maneuver":0,"raim":false,"radio":98330}
!AIVDM,1,1,,B,13bf9v00000IaBlN8IMSuSw006K4,0*63
-{"class":"AIS","type":1,"repeat":0,"mmsi":246123000,"status":0,"turn":0,"speed":0,"accuracy":false,"lon":3361370,"lat":31594870,"course":1014,"heading":127,"second":32,"maneuver":0,"raim":false,"radio":52616}
+{"class":"AIS","type":1,"repeat":0,"mmsi":246123000,"scaled":false,"status":0,"turn":0,"speed":0,"accuracy":false,"lon":3361370,"lat":31594870,"course":1014,"heading":127,"second":32,"maneuver":0,"raim":false,"radio":52616}
!AIVDO,1,1,,,B3aC3LP00063ai7RNpL03wgUsP06,0*50
$GPRMC,194932.00,A,5241.99756,N,00517.56508,E,0.002,,010809,,,A*7D
!AIVDM,1,1,,B,33a9=20P@g0DvDhN1Jbd78tv00vi,0*3A
-{"class":"AIS","type":3,"repeat":0,"mmsi":244469000,"status":0,"turn":-127,"speed":47,"accuracy":false,"lon":2749080,"lat":31480490,"course":3100,"heading":286,"second":31,"maneuver":0,"raim":false,"radio":8034}
+{"class":"AIS","type":3,"repeat":0,"mmsi":244469000,"scaled":false,"status":0,"turn":-127,"speed":47,"accuracy":false,"lon":2749080,"lat":31480490,"course":3100,"heading":286,"second":31,"maneuver":0,"raim":false,"radio":8034}
$GPGBS,194932.00,3.0,1.9,4.2,,,,*48
{"class":"TPV","tag":"GBS","time":1249156172.000,"ept":0.005,"lat":52.699959333,"lon":5.292751333,"epx":1.900,"epy":3.000,"epv":4.200,"track":0.0000,"speed":0.001,"mode":2}
!AIVDO,1,1,,,B3aC3LP00063ai7RNpL03wh5sP06,0*3F
!AIVDM,1,1,,A,13c7O4001N0EmBtMweB6GF?22D2n,0*57
-{"class":"AIS","type":1,"repeat":0,"mmsi":246538000,"status":0,"turn":0,"speed":94,"accuracy":false,"lon":2861662,"lat":31452488,"course":1629,"heading":199,"second":33,"maneuver":0,"raim":true,"radio":164204}
+{"class":"AIS","type":1,"repeat":0,"mmsi":246538000,"scaled":false,"status":0,"turn":0,"speed":94,"accuracy":false,"lon":2861662,"lat":31452488,"course":1629,"heading":199,"second":33,"maneuver":0,"raim":true,"radio":164204}
$GPRMC,194933.00,A,5241.99761,N,00517.56512,E,0.011,,010809,,,A*71
$GPGBS,194933.00,3.0,1.9,4.2,,,,*49
{"class":"TPV","tag":"GBS","time":1249156173.000,"ept":0.005,"lat":52.699960167,"lon":5.292752000,"epx":1.900,"epy":3.000,"epv":4.200,"track":0.0000,"speed":0.006,"mode":2}
@@ -172,23 +172,23 @@ $GPGBS,194934.00,3.0,1.9,4.2,,,,*4E
{"class":"TPV","tag":"GBS","time":1249156174.000,"ept":0.005,"lat":52.699961333,"lon":5.292752000,"epx":1.900,"epy":3.000,"epv":4.200,"track":0.0000,"speed":0.008,"mode":2}
!AIVDO,1,1,,,B3aC3LP00063aiWRNpP03wi5sP06,0*42
!AIVDM,1,1,,A,13aC225P150HqUlN3uHA5ww2P<0<,0*31
-{"class":"AIS","type":1,"repeat":0,"mmsi":244630024,"status":5,"turn":-128,"speed":69,"accuracy":false,"lon":3263674,"lat":31522145,"course":279,"heading":511,"second":33,"maneuver":1,"raim":false,"radio":98328}
+{"class":"AIS","type":1,"repeat":0,"mmsi":244630024,"scaled":false,"status":5,"turn":-128,"speed":69,"accuracy":false,"lon":3263674,"lat":31522145,"course":279,"heading":511,"second":33,"maneuver":1,"raim":false,"radio":98328}
$GPRMC,194935.00,A,5241.99779,N,00517.56509,E,0.002,,010809,,,A*76
!AIVDM,1,1,,A,B3`qKD@00064BIWRQGVI;wiUoP06,0*75
-{"class":"AIS","type":18,"repeat":0,"mmsi":244210513,"reserved":0,"speed":0,"accuracy":false,"lon":3180851,"lat":31622521,"course":2450,"heading":511,"second":35,"regional":0,"cs":true,"display":false,"dsc":true,"band":true,"msg22":true,"raim":true,"radio":917510}
+{"class":"AIS","type":18,"repeat":0,"mmsi":244210513,"scaled":false,"reserved":0,"speed":0,"accuracy":false,"lon":3180851,"lat":31622521,"course":2450,"heading":511,"second":35,"regional":0,"cs":true,"display":false,"dsc":true,"band":true,"msg22":true,"raim":true,"radio":917510}
$GPGBS,194935.00,3.0,1.9,4.2,,,,*4F
{"class":"TPV","tag":"GBS","time":1249156175.000,"ept":0.005,"lat":52.699963167,"lon":5.292751500,"epx":1.900,"epy":3.000,"epv":4.200,"track":0.0000,"speed":0.001,"mode":2}
!AIVDM,1,1,,B,H3`gaQ1AU0Pttp0000000000003,2*6D
!AIVDM,1,1,,B,13a6ld3P@9PDv3TN1GdRv7k800SH,0*60
-{"class":"AIS","type":1,"repeat":0,"mmsi":244430000,"status":3,"turn":-127,"speed":9,"accuracy":true,"lon":2748530,"lat":31479730,"course":760,"heading":249,"second":36,"maneuver":0,"raim":false,"radio":4528}
+{"class":"AIS","type":1,"repeat":0,"mmsi":244430000,"scaled":false,"status":3,"turn":-127,"speed":9,"accuracy":true,"lon":2748530,"lat":31479730,"course":760,"heading":249,"second":36,"maneuver":0,"raim":false,"radio":4528}
!AIVDO,1,1,,,B3aC3LP00063ai7RNpT03wiUsP06,0*46
$GPRMC,194936.00,A,5241.99789,N,00517.56508,E,0.014,,010809,,,A*7C
!AIVDM,1,1,,A,33a9=20P@g0DvAtN1Jgd28q20000,0*7E
-{"class":"AIS","type":3,"repeat":0,"mmsi":244469000,"status":0,"turn":-127,"speed":47,"accuracy":false,"lon":2748990,"lat":31480510,"course":3080,"heading":284,"second":33,"maneuver":0,"raim":false,"radio":0}
+{"class":"AIS","type":3,"repeat":0,"mmsi":244469000,"scaled":false,"status":0,"turn":-127,"speed":47,"accuracy":false,"lon":2748990,"lat":31480510,"course":3080,"heading":284,"second":33,"maneuver":0,"raim":false,"radio":0}
$GPGBS,194936.00,3.0,1.9,4.2,,,,*4C
{"class":"TPV","tag":"GBS","time":1249156176.000,"ept":0.005,"lat":52.699964833,"lon":5.292751333,"epx":1.900,"epy":3.000,"epv":4.200,"track":0.0000,"speed":0.007,"mode":2}
!AIVDM,1,1,,B,H3`gaQ4UDBE5847@9nohh01@3220,0*7F
-{"class":"AIS","type":24,"repeat":0,"mmsi":244050308,"shipname":"TYPHOON","shiptype":37,"vendorid":"TRUEHDG","callsign":"PI6700","to_bow":10,"to_stern":3,"to_port":2,"to_starboard":2}
+{"class":"AIS","type":24,"repeat":0,"mmsi":244050308,"scaled":false,"shipname":"TYPHOON","shiptype":37,"vendorid":"TRUEHDG","callsign":"PI6700","to_bow":10,"to_stern":3,"to_port":2,"to_starboard":2}
!AIVDO,1,1,,,B3aC3LP00063ai7RNp`03wj5sP06,0*11
$GPRMC,194937.00,A,5241.99795,N,00517.56519,E,0.008,,010809,,,A*7D
$GPGBS,194937.00,3.0,1.9,4.2,,,,*4D
@@ -198,18 +198,18 @@ $GPRMC,194938.00,A,5241.99803,N,00517.56530,E,0.010,,010809,,,A*70
$GPGBS,194938.00,3.0,1.9,4.2,,,,*42
{"class":"TPV","tag":"GBS","time":1249156178.000,"ept":0.005,"lat":52.699967167,"lon":5.292755000,"epx":1.900,"epy":3.000,"epv":4.200,"track":0.0000,"speed":0.005,"mode":2}
!AIVDM,1,1,,B,13`p;<0P0a0E8upN1GJDG?w:@@Fs,0*7F
-{"class":"AIS","type":1,"repeat":0,"mmsi":244190000,"status":0,"turn":-128,"speed":41,"accuracy":false,"lon":2770876,"lat":31479657,"course":1116,"heading":511,"second":37,"maneuver":0,"raim":false,"radio":134006}
+{"class":"AIS","type":1,"repeat":0,"mmsi":244190000,"scaled":false,"status":0,"turn":-128,"speed":41,"accuracy":false,"lon":2770876,"lat":31479657,"course":1116,"heading":511,"second":37,"maneuver":0,"raim":false,"radio":134006}
!AIVDO,1,1,,,B3aC3LP00063ajWRNph03wk5sP06,0*7B
$GPRMC,194939.00,A,5241.99809,N,00517.56539,E,0.009,,010809,,,A*7A
!AIVDM,1,1,,A,B3`qLQ000061`fWRrD26cwkUoP06,0*7E
-{"class":"AIS","type":18,"repeat":0,"mmsi":244210820,"reserved":0,"speed":0,"accuracy":false,"lon":3159133,"lat":31648064,"course":2154,"heading":511,"second":39,"regional":0,"cs":true,"display":false,"dsc":true,"band":true,"msg22":true,"raim":true,"radio":917510}
+{"class":"AIS","type":18,"repeat":0,"mmsi":244210820,"scaled":false,"reserved":0,"speed":0,"accuracy":false,"lon":3159133,"lat":31648064,"course":2154,"heading":511,"second":39,"regional":0,"cs":true,"display":false,"dsc":true,"band":true,"msg22":true,"raim":true,"radio":917510}
!AIVDM,1,1,,A,B3`jde0000648W7RQ>H03wkUoP06,0*00
-{"class":"AIS","type":18,"repeat":0,"mmsi":244100276,"reserved":0,"speed":0,"accuracy":false,"lon":3179598,"lat":31622374,"course":0,"heading":511,"second":39,"regional":0,"cs":true,"display":false,"dsc":true,"band":true,"msg22":true,"raim":true,"radio":917510}
+{"class":"AIS","type":18,"repeat":0,"mmsi":244100276,"scaled":false,"reserved":0,"speed":0,"accuracy":false,"lon":3179598,"lat":31622374,"course":0,"heading":511,"second":39,"regional":0,"cs":true,"display":false,"dsc":true,"band":true,"msg22":true,"raim":true,"radio":917510}
$GPGBS,194939.00,3.0,1.9,4.2,,,,*43
{"class":"TPV","tag":"GBS","time":1249156179.000,"ept":0.005,"lat":52.699968167,"lon":5.292756500,"epx":1.900,"epy":3.000,"epv":4.200,"track":0.0000,"speed":0.005,"mode":2}
!AIVDM,1,1,,B,B3`gaQ000062Pc7RIt403wkUoP06,0*4B
-{"class":"AIS","type":18,"repeat":0,"mmsi":244050308,"reserved":0,"speed":0,"accuracy":false,"lon":3166294,"lat":31614913,"course":0,"heading":511,"second":39,"regional":0,"cs":true,"display":false,"dsc":true,"band":true,"msg22":true,"raim":true,"radio":917510}
+{"class":"AIS","type":18,"repeat":0,"mmsi":244050308,"scaled":false,"reserved":0,"speed":0,"accuracy":false,"lon":3166294,"lat":31614913,"course":0,"heading":511,"second":39,"regional":0,"cs":true,"display":false,"dsc":true,"band":true,"msg22":true,"raim":true,"radio":917510}
!AIVDM,1,1,,B,139QcE7P?w<tSF0l4Q@>4?wv0l08,0*02
-{"class":"AIS","type":1,"repeat":0,"mmsi":211315540,"status":7,"turn":-128,"speed":1023,"accuracy":false,"lon":108600000,"lat":54600000,"course":3600,"heading":511,"second":63,"maneuver":0,"raim":false,"radio":426000}
+{"class":"AIS","type":1,"repeat":0,"mmsi":211315540,"scaled":false,"status":7,"turn":-128,"speed":1023,"accuracy":false,"lon":108600000,"lat":54600000,"course":3600,"heading":511,"second":63,"maneuver":0,"raim":false,"radio":426000}
!AIVDO,1,1,,,B3aC3LP00063ajWRNph03wkUsP06,0*1B
$GPRMC,194940.00,A,5241.99812,N,00517.56549,E,0.005,,010809,,,A*75
diff --git a/test/synthetic-ais.json b/test/synthetic-ais.json
index f53a3481..c145fbe3 100644
--- a/test/synthetic-ais.json
+++ b/test/synthetic-ais.json
@@ -2,21 +2,21 @@
# These are JSON dumps of the packets in the Schwehr testload,
# with synthetic messages 12 and 14 added
# FIXME: Needs a more complete set of test sentences.
-{"class":"AIS","type":1,"repeat":0,"mmsi":371798000,"status":0,"turn":-127,"speed":123,"accuracy":true,"lon":-74037230,"lat":29028980,"course":2240,"heading":215,"second":33,"maneuver":0,"raim":false,"radio":68034}
-{"class":"AIS","type":1,"repeat":0,"mmsi":440348000,"status":0,"turn":-128,"speed":0,"accuracy":false,"lon":-42454920,"lat":25848090,"course":934,"heading":511,"second":13,"maneuver":0,"raim":false,"radio":66548}
-{"class":"AIS","type":2,"repeat":0,"mmsi":356302000,"status":0,"turn":127,"speed":139,"accuracy":false,"lon":-42975686,"lat":24235415,"course":877,"heading":91,"second":41,"maneuver":0,"raim":false,"radio":98316}
-{"class":"AIS","type":3,"repeat":0,"mmsi":563808000,"status":5,"turn":0,"speed":0,"accuracy":true,"lon":-45796520,"lat":22146000,"course":2520,"heading":352,"second":35,"maneuver":0,"raim":false,"radio":0}
-{"class":"AIS","type":4,"repeat":0,"mmsi":3669702,"timestamp":"2007-05-14T19:57:39Z","accuracy":true,"lon":-45811417,"lat":22130260,"epfd":7,"raim":false,"radio":67039}
-{"class":"AIS","type":5,"repeat":0,"mmsi":351759000,"imo":9134270,"ais_version":0,"callsign":"3FOF8","shipname":"EVER DIADEM","shiptype":70,"to_bow":225,"to_stern":70,"to_port":1,"to_starboard":31,"epfd":1,"eta":"05-15T14:00Z","draught":122,"destination":"NEW YORK","dte":0}
-{"class":"AIS","type":6,"repeat":1,"mmsi":150834090,"seqno":3,"dest_mmsi":313240222,"retransmit":false,"app_id":42827,"data":"50:eb2f118f7ff100"}
-{"class":"AIS","type":7,"repeat":1,"mmsi":655901842,"mmsi1":158483613,"mmsi2":321823389,"mmsi3":836359488,"mmsi4":0}
-{"class":"AIS","type":8,"repeat":0,"mmsi":366999712,"app_id":23480,"data":"256:3a53dbb7be4a773137f87d7b0445f040dea05d93f593783194ae9b9d9dbe05fb"}
-{"class":"AIS","type":9,"repeat":3,"mmsi":1069287948,"alt":4032,"speed":932,"accuracy":true,"lon":106380055,"lat":63811893,"course":2562,"second":48,"regional":91,"dte":1,"raim":false,"radio":424211}
-{"class":"AIS","type":10,"repeat":0,"mmsi":366814480,"dest_mmsi":366832740}
-{"class":"AIS","type":11,"repeat":0,"mmsi":304137000,"timestamp":"2009-05-22T02:22:40Z","accuracy":true,"lon":-56644610,"lat":17045470,"epfd":1,"raim":false,"radio":0}
-{"class":"AIS","type":12,"repeat":0,"mmsi":304137000,"seqno":23,"dest_mmsi":304137023,"retransmit":false,"text":"THIS IS A SYNTHETIC TEST MESSAGE"}
-{"class":"AIS","type":14,"repeat":0,"mmsi":304137000,"text":"THIS IS A SYNTHETIC BROADCAST MESSAGE"}
-{"class":"AIS","type":18,"repeat":0,"mmsi":338087471,"reserved":0,"speed":1,"accuracy":false,"lon":-44443279,"lat":24410724,"course":796,"heading":511,"second":49,"regional":0,"cs":true,"display":false,"dsc":true,"band":true,"msg22":true,"raim":true,"radio":917510}
-{"class":"AIS","type":18,"repeat":0,"mmsi":338088483,"reserved":0,"speed":0,"accuracy":false,"lon":-42486718,"lat":25869335,"course":1716,"heading":511,"second":20,"regional":0,"cs":true,"display":false,"dsc":true,"band":true,"msg22":true,"raim":true,"radio":917510}
-{"class":"AIS","type":19,"repeat":0,"mmsi":367059850,"reserved":248,"speed":87,"accuracy":false,"lon":-53286235,"lat":17726217,"course":3359,"heading":511,"second":46,"regional":4,"shipname":"CAPT.J.RIMES","shiptype":70,"to_bow":5,"to_stern":21,"to_port":4,"to_starboard":4,"epfd":0,"raim":false,"dte":0,"assigned":false}
-{"class":"AIS","type":24,"repeat":2,"mmsi":338085242,"shipname":"CAPTAIN`S PARADISE","shiptype":54,"vendorid":"ACR1234","callsign":"WDD7883","to_bow":8,"to_stern":3,"to_port":2,"to_starboard":1}
+{"class":"AIS","type":1,"repeat":0,"mmsi":371798000,"scaled":false,"status":0,"turn":-127,"speed":123,"accuracy":true,"lon":-74037230,"lat":29028980,"course":2240,"heading":215,"second":33,"maneuver":0,"raim":false,"radio":68034}
+{"class":"AIS","type":1,"repeat":0,"mmsi":440348000,"scaled":false,"status":0,"turn":-128,"speed":0,"accuracy":false,"lon":-42454920,"lat":25848090,"course":934,"heading":511,"second":13,"maneuver":0,"raim":false,"radio":66548}
+{"class":"AIS","type":2,"repeat":0,"mmsi":356302000,"scaled":false,"status":0,"turn":127,"speed":139,"accuracy":false,"lon":-42975686,"lat":24235415,"course":877,"heading":91,"second":41,"maneuver":0,"raim":false,"radio":98316}
+{"class":"AIS","type":3,"repeat":0,"mmsi":563808000,"scaled":false,"status":5,"turn":0,"speed":0,"accuracy":true,"lon":-45796520,"lat":22146000,"course":2520,"heading":352,"second":35,"maneuver":0,"raim":false,"radio":0}
+{"class":"AIS","type":4,"repeat":0,"mmsi":3669702,"scaled":false,"timestamp":"2007-05-14T19:57:39Z","accuracy":true,"lon":-45811417,"lat":22130260,"epfd":7,"raim":false,"radio":67039}
+{"class":"AIS","type":5,"repeat":0,"mmsi":351759000,"scaled":false,"imo":9134270,"ais_version":0,"callsign":"3FOF8","shipname":"EVER DIADEM","shiptype":70,"to_bow":225,"to_stern":70,"to_port":1,"to_starboard":31,"epfd":1,"eta":"05-15T14:00Z","draught":122,"destination":"NEW YORK","dte":0}
+{"class":"AIS","type":6,"repeat":1,"mmsi":150834090,"scaled":false,"seqno":3,"dest_mmsi":313240222,"retransmit":false,"app_id":42827,"data":"50:eb2f118f7ff100"}
+{"class":"AIS","type":7,"repeat":1,"mmsi":655901842,"scaled":false,"mmsi1":158483613,"mmsi2":321823389,"mmsi3":836359488,"mmsi4":0}
+{"class":"AIS","type":8,"repeat":0,"mmsi":366999712,"scaled":false,"app_id":23480,"data":"256:3a53dbb7be4a773137f87d7b0445f040dea05d93f593783194ae9b9d9dbe05fb"}
+{"class":"AIS","type":9,"repeat":3,"mmsi":1069287948,"scaled":false,"alt":4032,"speed":932,"accuracy":true,"lon":106380055,"lat":63811893,"course":2562,"second":48,"regional":91,"dte":1,"raim":false,"radio":424211}
+{"class":"AIS","type":10,"repeat":0,"mmsi":366814480,"scaled":false,"dest_mmsi":366832740}
+{"class":"AIS","type":11,"repeat":0,"mmsi":304137000,"scaled":false,"timestamp":"2009-05-22T02:22:40Z","accuracy":true,"lon":-56644610,"lat":17045470,"epfd":1,"raim":false,"radio":0}
+{"class":"AIS","type":12,"repeat":0,"mmsi":304137000,"scaled":false,"seqno":23,"dest_mmsi":304137023,"retransmit":false,"text":"THIS IS A SYNTHETIC TEST MESSAGE"}
+{"class":"AIS","type":14,"repeat":0,"mmsi":304137000,"scaled":false,"text":"THIS IS A SYNTHETIC BROADCAST MESSAGE"}
+{"class":"AIS","type":18,"repeat":0,"mmsi":338087471,"scaled":false,"reserved":0,"speed":1,"accuracy":false,"lon":-44443279,"lat":24410724,"course":796,"heading":511,"second":49,"regional":0,"cs":true,"display":false,"dsc":true,"band":true,"msg22":true,"raim":true,"radio":917510}
+{"class":"AIS","type":18,"repeat":0,"mmsi":338088483,"scaled":false,"reserved":0,"speed":0,"accuracy":false,"lon":-42486718,"lat":25869335,"course":1716,"heading":511,"second":20,"regional":0,"cs":true,"display":false,"dsc":true,"band":true,"msg22":true,"raim":true,"radio":917510}
+{"class":"AIS","type":19,"repeat":0,"mmsi":367059850,"scaled":false,"reserved":248,"speed":87,"accuracy":false,"lon":-53286235,"lat":17726217,"course":3359,"heading":511,"second":46,"regional":4,"shipname":"CAPT.J.RIMES","shiptype":70,"to_bow":5,"to_stern":21,"to_port":4,"to_starboard":4,"epfd":0,"raim":false,"dte":0,"assigned":false}
+{"class":"AIS","type":24,"repeat":2,"mmsi":338085242,"scaled":false,"shipname":"CAPTAIN`S PARADISE","shiptype":54,"vendorid":"ACR1234","callsign":"WDD7883","to_bow":8,"to_stern":3,"to_port":2,"to_starboard":1}