summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorChristian Gagneraud <cgagneraud@techworks.ie>2012-06-04 01:14:27 +0100
committerChristian Gagneraud <chris@techworks.ie>2012-06-20 10:05:41 +0100
commit5214d309cf07b428ccfac647f7ac9ed8d597186f (patch)
tree672ecb9d61a1973252be347eb5b1bf13b7dfe7d1 /test
parent9e6cdcb27d6af143721bb27bd886fc43d1214626 (diff)
downloadgpsd-5214d309cf07b428ccfac647f7ac9ed8d597186f.tar.gz
[AIS] Fix plenty of small bugs unveiled by aishub test campaign.
A test campaign was run with live data from aishub.net (ca. 25 millions sentence, 1.2 GB of logs), the goal was to check the decoding and the JSON parsing and dumping code. On all the AIS data, the following tests were done: - AIVDM decoding - JSON scaled dump - JSON validity check on scaled dump. - JSON unscaled dump - JSON validity check on unscaled dump - JSON unscaled idempotency check - JSON unscaled/scaled idempotency check The last check consisted of: - parsing the unscaled dump - dumping it back in scaled mode - compare it with the original scaled dump. This test campaign has unveiled plenty of small bugs all around the AIS code. This patch fixes all of them and adds new sentences in the regression tests.
Diffstat (limited to 'test')
-rw-r--r--test/sample.aivdm88
-rw-r--r--test/sample.aivdm.chk24
-rw-r--r--test/sample.aivdm.js.chk26
-rw-r--r--test/sample.aivdm.ju.chk24
4 files changed, 160 insertions, 2 deletions
diff --git a/test/sample.aivdm b/test/sample.aivdm
index a12dc169..7637fe0c 100644
--- a/test/sample.aivdm
+++ b/test/sample.aivdm
@@ -201,6 +201,14 @@
#
# FIX-ME: We need a type 6 test case that requires more than one AIVDM fragment.
#
+# Type 6:
+# Advertised as DAC 1, FID 12, but full of garbage.
+!AIVDM,1,1,,A,63LBA4;WBevJ04k0=@E=B0td,0*17
+# Advertised as DAC 1, FID 14, but full of garbage
+!AIVDM,1,1,,A,6h2E:81>NmKC04p0J<000?vv20Ru,0*31
+# Advertised as DAC 1, FID 18, but full of 0
+!AIVDM,1,1,,B,6h2E3MDrDRiB0580@00000000000,0*04
+
# Type 7:
# From AISHub - reported immediately after the preceding type 6,
# which matches it. One destination MMSI. noaadata-0.43 fails
@@ -591,7 +599,10 @@
# Message type : 0
# Slot offset : 0
#
-# FIX-ME: Need an example of the 160-bit variant of type 15 with two MMSIs.
+# Type 15:
+# From Christian Gagneraud via aishub
+# This is the 160-bit variant of type 15 with two MMSIs.
+!AIVDM,1,1,,A,?39a?2PjKFFPD01o:Gq1igvp2<3w,0*0B
#
# Type 16:
# From AISHub. These are only a regression test to check that the C and Python
@@ -792,6 +803,11 @@ DGNSS data : 376:7c0556c07031febbf52924fe33fa2933ffa0fd2932fdb7062
# Channel A Band : 0
# Zone size : 4
#
+# Type 22:
+# From Christian Gagneraud via aishub
+# Addressed case.
+!AIVDM,1,1,,A,F@@W>gOP00PH=JrN9l000?wB2HH;,0*44
+#
# Type 23:
# From AISHub. Only a regression test to check that the C and Python decoders
# do the same thing, not yet checked against other decoders.
@@ -831,6 +847,51 @@ DGNSS data : 376:7c0556c07031febbf52924fe33fa2933ffa0fd2932fdb7062
# dimC: 0
# dimD: 5
#
+# Type 25:
+# From Christian Gagneraud via aishub
+# Addressed and structured
+!AIVDM,1,1,,A,JB3R0GO7p>vQL8tjw0b5hqpd0706kh9d3lR2vbl0400,2*40
+#
+# Type 25:
+# From Christian Gagneraud via aishub
+# Addressed and not structured
+!AIVDM,1,1,,A,I6SWo?8P00a3PKpEKEVj0?vNP<65,0*73
+#
+# Type 25:
+# From Christian Gagneraud via aishub
+# Broadcast and structured
+!AIVDM,1,1,,A,I8IRGB40QPPa0:<HP::V=gwv0l48,0*0E
+#
+# Type 25:
+# From Christian Gagneraud via aishub
+# Broadcast and not structured
+!AIVDM,1,1,,A,I6SWVNP001a3P8FEKNf=Qb0@00S8,0*6B
+#
+# Type 26:
+# From Christian Gagneraud via aishub
+# Addressed and structured
+!AIVDM,1,1,,A,JB3R0GO7p>vQL8tjw0b5hqpd0706kh9d3lR2vbl0400,2*40
+#
+# Type 26:
+# From Christian Gagneraud via aishub
+# Addressed and not structured
+!AIVDM,1,1,,A,J1@@0IK70PGgT740000000000@000?D0ih1e00006JlPC9C3,0*6B
+#
+# Type 26
+# From Christian Gagneraud via aishub
+# Broadcast and structured
+!AIVDM,1,1,,B,JaL0mr5P000DtRDMddr@0?vF06iD,0*75
+#
+# Type 26
+# From Christian Gagneraud via aishub
+# Broadcast and not structured
+!AIVDM,1,1,,A,J0@00@370>t0Lh3P0000200H:2rN92,4*14
+#
+# Type 27:
+# From Christian Gagneraud via aishub
+# The only message 27 in more than 25 millions messages that is 96 bits long!
+!AIVDM,1,1,,A,KCQ9r=hrFUnH7P00,0*41
+#
#
##############################################################################
# Invalid packet tests:
@@ -874,3 +935,28 @@ AIVDM,2,2,1,B,00000000000,2*26
!AIVDM,2,1,2,A,542M92h00001@<7;?G0PD4i@R0<tqA8tj37>220o0h:2240Ht500000000000000,0*3C
!AIVDM,2,2,2,A,0000002,2*24
!AIVDM,2,2,6,B,00000000000,2*21
+##############################################################################
+# Error and corner case tests:
+##############################################################################
+# Non printable and control character in data or string fields
+!AIVDM,1,1,,A,647sBv00b=E006P9>0,4*1B
+# Type 4 with date/time set to N/A
+!AIVDM,1,1,,A,402Fha0000Htt<tSF0l4Q@000d20,0*65
+# Type 4 with YYYY/MM/DD OK, but HHmmSS N/A
+!AIVDM,1,1,,B,4028n@iuiPpttwIWI<Hl>8700PS:,0*60
+# Type 4 with year set to 10196 (0x27D4), idempotency use to fail on this one
+# It has a bad epfd as well.
+!AIVDM,1,1,,B,4>O7m7Iu@<9qUfbtm`vSnwvH20S8,0*46
+# Type 22 with MMSI1=4059193694, use to fail due to UBITS() instead of SBITS()
+!AIVDM,1,1,,B,Fe3>>MOD@GDF?ThcoCk02?ioQie4,0*03
+# A type 6, DAC 1, FID 18 with plenty of N/A fields, idempotency use to fail
+!AIVDM,1,1,,B,602E:s0tw@9B0580@00000000000,0*68
+# A type 6, DAC 1, FID 30. use to fail idempotency
+!AIVDM,1,1,,B,6h2E3MPr<buN05p0J00000000000,0*0A
+# A type 6, DAC 1, FID 18, use to fail idempotency
+!AIVDM,1,1,,B,602E:s0tw@9B0580@00000000000,0*68
+# Array of struct. use to crash "gpsdecode -j -e -u"
+!AIVDM,1,1,,A,6h2E3MHrg19P0600@00000000000,0*02
+!AIVDM,1,1,,A,6h2E3N0rThqP0600J00000000000,0*51
+
+
diff --git a/test/sample.aivdm.chk b/test/sample.aivdm.chk
index 3b698060..31dc496e 100644
--- a/test/sample.aivdm.chk
+++ b/test/sample.aivdm.chk
@@ -7,6 +7,9 @@
6|1|150834090|3|313240222|0|669|11|48:eb2f118f7ff1
6|0|992509976|0|2500912|0|235|10|274|1|1|2|2|0|0|0
6|0|265538450|0|2655651|0|1|40|16:0000
+6|0|230986000|2|970110950|1|1|12|56:30435445530000
+6|3|002443808|0|329176500|1|1|14|80:00000000000000000000
+6|3|002442101|1|244615956|1|1|18|80:01000000000000000000
7|0|002655651|265538450|0|0|0
7|1|655901842|158483613|321823389|836359488|0
7|2|537411077|43101326|717096664|76161024|0
@@ -32,6 +35,7 @@
14|0|311764000|TEST
15|0|368578000|5158|5|0|0|0|0|0|0
15|3|003669720|367014320|3|516|5|617|0|0|0
+15|0|211439370|211507560|5|0|55|663|605843451|32|560
16|0|002053501|224251000|200|0|0|0|0
17|0|002734450|17478|35992|376:7c0556c07031febbf52924fe33fa2933ffa0fd2932fdb7062922fe3809292afde9122929fcf7002923ffd20c29aaaa
18|0|338087471|0|1|0|-44443279|24410724|796|511|49|0x0|1|0|1|1|1|1|0xe0006
@@ -42,8 +46,28 @@
20|0|003160097|47|1|7|250|2250|1|7|1125|856|5|7|1125|0|0|0|0
21|0|123456789|20|CHINA ROSE MURPHY EXPRESS ALERT|0|-73619155|28752371|5|5|5|5|1|50|165|0x0|0|0
22|0|003160048|2087|2088|0|0|-44100|27330|-48100|25400|0|0|0|4
+22|1|017419965|3584|8|1|1|28144881|268435519|1|0|0|4
23|0|002268120|1578|30642|1096|30408|6|0|2|9|0
24|0|271041815|PROGUY|60|1D00014|TC6163|0|15|0|5
+26|1|137920605|1|1|838351848|23587|180:efa1708f32fc0a85c39e2c007006cf026c0f4882faad00:0
+25|0|440006460|1|0|134218384|0|128:20000a4381be156d59b200ff9e80c185
+25|0|563648328|0|1|0|134|112:082900a31880a2a636fffe034108
+25|0|440002170|0|0|0|0|128:00001a438085956deb8d86a0100008c8
+26|1|137920605|1|1|838351848|23587|180:efa1708f32fc0a85c39e2c007006cf026c0f4882faad00:0
+26|0|084148325|1|0|834699643|0|228:q:0
+26|2|633353704|0|1|0|24576|92:0014f2251db2ce9000ff9600:0
+26|0|016777280|0|0|0|0|116::0
+27|1|236091959|3|0|-92521|52239|0|0|0|0
24|0|271040660|GOZDEM-1|37|1C00045|YM5504|0|24|0|6
5|0|271010059|0|0|TCA2350|HEALTH CONTROL 13|55|6|10|2|2|1|00-00T24:60Z|20||0
5|0|271010059|0|0|TCA2350|HEALTH CONTROL 13|55|6|10|2|2|1|00-00T24:60Z|20||0
+6|0|276747000|0|2766160|0|1|40|16: 8
+4|0|002470052|0000-00-00T24:60:60Z|0|108600000|54600000|0|0|0x2c080
+4|0|002242115|2012-06-01T24:60:60Z|1|-5031130|26021408|7|0|0x208ca
+4|0|972158237|10196-00-24T09:57:37Z|1|123070132|65599231|14|1|0x8c8
+22|2|875794037|3396|373|1|0|837968222|254804543|1|0|1|7
+6|0|002444012|0|255803540|1|1|18|80:01000000000000000000
+6|3|002442102|0|244100055|1|1|30|80:01000000280000000000
+6|0|002444012|0|255803540|1|1|18|80:01000000000000000000
+6|3|002442101|2|246351000|0|1|32|80:00000000000000000000
+6|3|002442104|0|245679000|0|1|32|80:00000000000000000000
diff --git a/test/sample.aivdm.js.chk b/test/sample.aivdm.js.chk
index edaf887b..ff61c1b5 100644
--- a/test/sample.aivdm.js.chk
+++ b/test/sample.aivdm.js.chk
@@ -5,8 +5,11 @@
{"class":"AIS","device":"stdin","type":4,"repeat":0,"mmsi":3669702,"scaled":true,"timestamp":"2007-05-14T19:57:39Z","accuracy":true,"lon":-76.3524,"lat":36.8838,"epfd":"Surveyed","raim":false,"radio":67039}
{"class":"AIS","device":"stdin","type":5,"repeat":0,"mmsi":351759000,"scaled":true,"imo":9134270,"ais_version":0,"callsign":"3FOF8","shipname":"EVER DIADEM","shiptype":"Cargo - all ships of this type","to_bow":225,"to_stern":70,"to_port":1,"to_starboard":31,"epfd":"GPS","eta":"05-15T14:00Z","draught":12.2,"destination":"NEW YORK","dte":0}
{"class":"AIS","device":"stdin","type":6,"repeat":1,"mmsi":150834090,"scaled":true,"seqno":3,"dest_mmsi":313240222,"retransmit":false,"dac":669,"fid":11,"data":"48:eb2f118f7ff1"}
-{"class":"AIS","device":"stdin","type":6,"repeat":0,"mmsi":992509976,"scaled":true,"seqno":0,"dest_mmsi":2500912,"retransmit":false,"dac":235,"fid":10,"off_pos":false,"alarm":false,"stat_ext":0,"ana_int":13.70,"ana_ext1":0.05,"ana_ext2":0.05,"racon":"RACON operational","light":"No RACON installed"}
+{"class":"AIS","device":"stdin","type":6,"repeat":0,"mmsi":992509976,"scaled":true,"seqno":0,"dest_mmsi":2500912,"retransmit":false,"dac":235,"fid":10,"off_pos":false,"alarm":false,"stat_ext":0,"ana_int":13.70,"ana_ext1":0.05,"ana_ext2":0.05,"racon":"RACON operational","light":"Light OFF"}
{"class":"AIS","device":"stdin","type":6,"repeat":0,"mmsi":265538450,"scaled":true,"seqno":0,"dest_mmsi":2655651,"retransmit":false,"dac":1,"fid":40,"data":"16:0000"}
+{"class":"AIS","device":"stdin","type":6,"repeat":0,"mmsi":230986000,"scaled":true,"seqno":2,"dest_mmsi":970110950,"retransmit":true,"dac":1,"fid":12,"lastport":"0CTES","departure":"05-04T00:60Z","nextport":",","eta":"00-00T00:00Z","dangerous":"","imdcat":"","unid":0,"amount":0,"unit":0}
+{"class":"AIS","device":"stdin","type":6,"repeat":3,"mmsi":2443808,"scaled":true,"seqno":0,"dest_mmsi":329176500,"retransmit":true,"dac":1,"fid":14,"month":0,"day":0,"tidals":[{"lon":279.339,"lat":-406.323,"from_hour":1,"from_min":5,"to_hour":29,"to_min":0,"cdir":0,"cspeed":0.0}]}
+{"class":"AIS","device":"stdin","type":6,"repeat":3,"mmsi":2442101,"scaled":true,"seqno":1,"dest_mmsi":244615956,"retransmit":true,"dac":1,"fid":18,"linkage":1,"arrival":"00-00T00:00Z","portname":"","destination":"","lon":0.000,"lat":0.000}
{"class":"AIS","device":"stdin","type":7,"repeat":0,"mmsi":2655651,"scaled":true,"mmsi1":265538450,"mmsi2":0,"mmsi3":0,"mmsi4":0}
{"class":"AIS","device":"stdin","type":7,"repeat":1,"mmsi":655901842,"scaled":true,"mmsi1":158483613,"mmsi2":321823389,"mmsi3":836359488,"mmsi4":0}
{"class":"AIS","device":"stdin","type":7,"repeat":2,"mmsi":537411077,"scaled":true,"mmsi1":43101326,"mmsi2":717096664,"mmsi3":76161024,"mmsi4":0}
@@ -32,6 +35,7 @@
{"class":"AIS","device":"stdin","type":14,"repeat":0,"mmsi":311764000,"scaled":true,"text":"TEST"}
{"class":"AIS","device":"stdin","type":15,"repeat":0,"mmsi":368578000,"scaled":true,"mmsi1":5158,"type1_1":5,"offset1_1":0,"type1_2":0,"offset1_2":0,"mmsi2":0,"type2_1":0,"offset2_1":0}
{"class":"AIS","device":"stdin","type":15,"repeat":3,"mmsi":3669720,"scaled":true,"mmsi1":367014320,"type1_1":3,"offset1_1":516,"type1_2":5,"offset1_2":617,"mmsi2":0,"type2_1":0,"offset2_1":0}
+{"class":"AIS","device":"stdin","type":15,"repeat":0,"mmsi":211439370,"scaled":true,"mmsi1":211507560,"type1_1":5,"offset1_1":0,"type1_2":55,"offset1_2":663,"mmsi2":605843451,"type2_1":32,"offset2_1":560}
{"class":"AIS","device":"stdin","type":16,"repeat":0,"mmsi":2053501,"scaled":true,"mmsi1":224251000,"offset1":200,"increment1":0,"mmsi2":0,"offset2":0,"increment2":0}
{"class":"AIS","device":"stdin","type":17,"repeat":0,"mmsi":2734450,"scaled":true,"lon":29.1,"lat":60.0,"data":"376:7c0556c07031febbf52924fe33fa2933ffa0fd2932fdb7062922fe3809292afde9122929fcf7002923ffd20c29aaaa"}
{"class":"AIS","device":"stdin","type":18,"repeat":0,"mmsi":338087471,"scaled":true,"reserved":0,"speed":0.1,"accuracy":false,"lon":-74.0721,"lat":40.6845,"course":79.6,"heading":511,"second":49,"regional":0,"cs":true,"display":false,"dsc":true,"band":true,"msg22":true,"raim":true,"radio":917510}
@@ -42,8 +46,28 @@
{"class":"AIS","device":"stdin","type":20,"repeat":0,"mmsi":3160097,"scaled":true,"offset1":47,"number1":1,"timeout1":7,"increment1":250,"offset2":2250,"number2":1,"timeout2":7,"increment2":1125,"offset3":856,"number3":5,"timeout3":7,"increment3":1125,"offset4":0,"number4":0,"timeout4":0,"increment4":0}
{"class":"AIS","device":"stdin","type":21,"repeat":0,"mmsi":123456789,"scaled":true,"aid_type":"INVALID NAVAID TYPE","name":"CHINA ROSE MURPHY EXPRESS ALERT","lon":-122.6986,"lat":47.9206,"accuracy":false,"to_bow":5,"to_stern":5,"to_port":5,"to_starboard":5,"epfd":"GPS","second":50,"regional":165,"off_position":false,"raim":false,"virtual_aid":false}
{"class":"AIS","device":"stdin","type":22,"repeat":0,"mmsi":3160048,"scaled":true,"channel_a":2087,"channel_b":2088,"txrx":0,"power":false,"ne_lon":"-73.500000","ne_lat":"45.550000","sw_lon":"-80.166667","sw_lat":"42.333333","addressed":false,"band_a":false,"band_b":false,"zonesize":4}
+{"class":"AIS","device":"stdin","type":22,"repeat":1,"mmsi":17419965,"scaled":true,"channel_a":3584,"channel_b":8,"txrx":1,"power":true,"dest1":28144881,"dest2":268435519,"addressed":true,"band_a":false,"band_b":false,"zonesize":4}
{"class":"AIS","device":"stdin","type":23,"repeat":0,"mmsi":2268120,"scaled":true,"ne_lon":"2.630000","ne_lat":"51.070000","sw_lon":"1.826667","sw_lat":"50.680000","stationtype":"Regional use and inland waterways","shiptype":"Not available","interval":9,"quiet":0}
{"class":"AIS","device":"stdin","type":24,"repeat":0,"mmsi":271041815,"scaled":true,"shipname":"PROGUY","shiptype":"Passenger - all ships of this type","vendorid":"1D00014","callsign":"TC6163","to_bow":0,"to_stern":15,"to_port":0,"to_starboard":5}
+{"class":"AIS","device":"stdin","type":26,"repeat":1,"mmsi":137920605,"scaled":true,"addressed":true,"structured":true,"dest_mmsi":838351848,"app_id":23587,"data":"180:efa1708f32fc0a85c39e2c007006cf026c0f4882faad00","radio":0}
+{"class":"AIS","device":"stdin","type":25,"repeat":0,"mmsi":440006460,"scaled":true,"addressed":true,"structured":false,"dest_mmsi":134218384,"app_id":0,"data":"128:20000a4381be156d59b200ff9e80c185"}
+{"class":"AIS","device":"stdin","type":25,"repeat":0,"mmsi":563648328,"scaled":true,"addressed":false,"structured":true,"dest_mmsi":0,"app_id":134,"data":"112:082900a31880a2a636fffe034108"}
+{"class":"AIS","device":"stdin","type":25,"repeat":0,"mmsi":440002170,"scaled":true,"addressed":false,"structured":false,"dest_mmsi":0,"app_id":0,"data":"128:00001a438085956deb8d86a0100008c8"}
+{"class":"AIS","device":"stdin","type":26,"repeat":1,"mmsi":137920605,"scaled":true,"addressed":true,"structured":true,"dest_mmsi":838351848,"app_id":23587,"data":"180:efa1708f32fc0a85c39e2c007006cf026c0f4882faad00","radio":0}
+{"class":"AIS","device":"stdin","type":26,"repeat":0,"mmsi":84148325,"scaled":true,"addressed":true,"structured":false,"dest_mmsi":834699643,"app_id":0,"data":"228:q","radio":0}
+{"class":"AIS","device":"stdin","type":26,"repeat":2,"mmsi":633353704,"scaled":true,"addressed":false,"structured":true,"dest_mmsi":0,"app_id":24576,"data":"92:0014f2251db2ce9000ff9600","radio":0}
+{"class":"AIS","device":"stdin","type":26,"repeat":0,"mmsi":16777280,"scaled":true,"addressed":false,"structured":false,"dest_mmsi":0,"app_id":0,"data":"116:","radio":0}
+{"class":"AIS","device":"stdin","type":27,"repeat":1,"mmsi":236091959,"scaled":true,"status":"Restricted manoeuverability","accuracy":false,"lon":-154.2,"lat":87.1,"speed":0,"course":0,"raim":false,"gnss":false}
{"class":"AIS","device":"stdin","type":24,"repeat":0,"mmsi":271040660,"scaled":true,"shipname":"GOZDEM-1","shiptype":"Pleasure Craft","vendorid":"1C00045","callsign":"YM5504","to_bow":0,"to_stern":24,"to_port":0,"to_starboard":6}
{"class":"AIS","device":"stdin","type":5,"repeat":0,"mmsi":271010059,"scaled":true,"imo":0,"ais_version":0,"callsign":"TCA2350","shipname":"HEALTH CONTROL 13","shiptype":"Law Enforcement","to_bow":6,"to_stern":10,"to_port":2,"to_starboard":2,"epfd":"GPS","eta":"00-00T24:60Z","draught":2.0,"destination":"","dte":0}
{"class":"AIS","device":"stdin","type":5,"repeat":0,"mmsi":271010059,"scaled":true,"imo":0,"ais_version":0,"callsign":"TCA2350","shipname":"HEALTH CONTROL 13","shiptype":"Law Enforcement","to_bow":6,"to_stern":10,"to_port":2,"to_starboard":2,"epfd":"GPS","eta":"00-00T24:60Z","draught":2.0,"destination":"","dte":0}
+{"class":"AIS","device":"stdin","type":6,"repeat":0,"mmsi":276747000,"scaled":true,"seqno":0,"dest_mmsi":2766160,"retransmit":false,"dac":1,"fid":40,"data":"16:\t8"}
+{"class":"AIS","device":"stdin","type":4,"repeat":0,"mmsi":2470052,"scaled":true,"timestamp":"0-00-00T24:60:60Z","accuracy":false,"lon":181.0000,"lat":91.0000,"epfd":"Undefined","raim":false,"radio":180352}
+{"class":"AIS","device":"stdin","type":4,"repeat":0,"mmsi":2242115,"scaled":true,"timestamp":"2012-06-01T24:60:60Z","accuracy":true,"lon":-8.3852,"lat":43.3690,"epfd":"Surveyed","raim":false,"radio":133322}
+{"class":"AIS","device":"stdin","type":4,"repeat":0,"mmsi":972158237,"scaled":true,"timestamp":"10196-00-24T09:57:37Z","accuracy":true,"lon":205.1169,"lat":109.3321,"epfd":"(null)","raim":true,"radio":2248}
+{"class":"AIS","device":"stdin","type":22,"repeat":2,"mmsi":875794037,"scaled":true,"channel_a":3396,"channel_b":373,"txrx":1,"power":false,"dest1":837968222,"dest2":254804543,"addressed":true,"band_a":false,"band_b":true,"zonesize":7}
+{"class":"AIS","device":"stdin","type":6,"repeat":0,"mmsi":2444012,"scaled":true,"seqno":0,"dest_mmsi":255803540,"retransmit":true,"dac":1,"fid":18,"linkage":1,"arrival":"00-00T00:00Z","portname":"","destination":"","lon":0.000,"lat":0.000}
+{"class":"AIS","device":"stdin","type":6,"repeat":3,"mmsi":2442102,"scaled":true,"seqno":0,"dest_mmsi":244100055,"retransmit":true,"dac":1,"fid":30,"linkage":1,"text":"("}
+{"class":"AIS","device":"stdin","type":6,"repeat":0,"mmsi":2444012,"scaled":true,"seqno":0,"dest_mmsi":255803540,"retransmit":true,"dac":1,"fid":18,"linkage":1,"arrival":"00-00T00:00Z","portname":"","destination":"","lon":0.000,"lat":0.000}
+{"class":"AIS","device":"stdin","type":6,"repeat":3,"mmsi":2442101,"scaled":true,"seqno":2,"dest_mmsi":246351000,"retransmit":false,"dac":1,"fid":32,"month":0,"day":0,"tidals":[{"lon":-279.620,"lat":0.000,"from_hour":0,"from_min":0,"to_hour":0,"to_min":0,"cdir":0,"cspeed":0.0}]}
+{"class":"AIS","device":"stdin","type":6,"repeat":3,"mmsi":2442104,"scaled":true,"seqno":0,"dest_mmsi":245679000,"retransmit":false,"dac":1,"fid":32,"month":0,"day":0,"tidals":[{"lon":-104.858,"lat":0.000,"from_hour":0,"from_min":0,"to_hour":0,"to_min":0,"cdir":0,"cspeed":0.0}]}
diff --git a/test/sample.aivdm.ju.chk b/test/sample.aivdm.ju.chk
index db3b3f8c..e73afb80 100644
--- a/test/sample.aivdm.ju.chk
+++ b/test/sample.aivdm.ju.chk
@@ -7,6 +7,9 @@
{"class":"AIS","device":"stdin","type":6,"repeat":1,"mmsi":150834090,"scaled":false,"seqno":3,"dest_mmsi":313240222,"retransmit":false,"dac":669,"fid":11,"data":"48:eb2f118f7ff1"}
{"class":"AIS","device":"stdin","type":6,"repeat":0,"mmsi":992509976,"scaled":false,"seqno":0,"dest_mmsi":2500912,"retransmit":false,"dac":235,"fid":10,"off_pos":false,"alarm":false,"stat_ext":0,"ana_int":274,"ana_ext1":1,"ana_ext2":1,"racon":2,"light":2}
{"class":"AIS","device":"stdin","type":6,"repeat":0,"mmsi":265538450,"scaled":false,"seqno":0,"dest_mmsi":2655651,"retransmit":false,"dac":1,"fid":40,"data":"16:0000"}
+{"class":"AIS","device":"stdin","type":6,"repeat":0,"mmsi":230986000,"scaled":false,"seqno":2,"dest_mmsi":970110950,"retransmit":true,"dac":1,"fid":12,"lastport":"0CTES","departure":"05-04T00:60Z","nextport":",","eta":"00-00T00:00Z","dangerous":"","imdcat":"","unid":0,"amount":0,"unit":0}
+{"class":"AIS","device":"stdin","type":6,"repeat":3,"mmsi":2443808,"scaled":false,"seqno":0,"dest_mmsi":329176500,"retransmit":true,"dac":1,"fid":14,"month":0,"day":0,"tidals":[{"lon":16760328,"lat":-24379392,"from_hour":1,"from_min":5,"to_hour":29,"to_min":0,"cdir":0,"cspeed":0}]}
+{"class":"AIS","device":"stdin","type":6,"repeat":3,"mmsi":2442101,"scaled":false,"seqno":1,"dest_mmsi":244615956,"retransmit":true,"dac":1,"fid":18,"linkage":1,"arrival":"00-00T00:00Z","portname":"","destination":"","lon":0,"lat":0}
{"class":"AIS","device":"stdin","type":7,"repeat":0,"mmsi":2655651,"scaled":false,"mmsi1":265538450,"mmsi2":0,"mmsi3":0,"mmsi4":0}
{"class":"AIS","device":"stdin","type":7,"repeat":1,"mmsi":655901842,"scaled":false,"mmsi1":158483613,"mmsi2":321823389,"mmsi3":836359488,"mmsi4":0}
{"class":"AIS","device":"stdin","type":7,"repeat":2,"mmsi":537411077,"scaled":false,"mmsi1":43101326,"mmsi2":717096664,"mmsi3":76161024,"mmsi4":0}
@@ -32,6 +35,7 @@
{"class":"AIS","device":"stdin","type":14,"repeat":0,"mmsi":311764000,"scaled":false,"text":"TEST"}
{"class":"AIS","device":"stdin","type":15,"repeat":0,"mmsi":368578000,"scaled":false,"mmsi1":5158,"type1_1":5,"offset1_1":0,"type1_2":0,"offset1_2":0,"mmsi2":0,"type2_1":0,"offset2_1":0}
{"class":"AIS","device":"stdin","type":15,"repeat":3,"mmsi":3669720,"scaled":false,"mmsi1":367014320,"type1_1":3,"offset1_1":516,"type1_2":5,"offset1_2":617,"mmsi2":0,"type2_1":0,"offset2_1":0}
+{"class":"AIS","device":"stdin","type":15,"repeat":0,"mmsi":211439370,"scaled":false,"mmsi1":211507560,"type1_1":5,"offset1_1":0,"type1_2":55,"offset1_2":663,"mmsi2":605843451,"type2_1":32,"offset2_1":560}
{"class":"AIS","device":"stdin","type":16,"repeat":0,"mmsi":2053501,"scaled":false,"mmsi1":224251000,"offset1":200,"increment1":0,"mmsi2":0,"offset2":0,"increment2":0}
{"class":"AIS","device":"stdin","type":17,"repeat":0,"mmsi":2734450,"scaled":false,"lon":17478,"lat":35992,"data":"376:7c0556c07031febbf52924fe33fa2933ffa0fd2932fdb7062922fe3809292afde9122929fcf7002923ffd20c29aaaa"}
{"class":"AIS","device":"stdin","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}
@@ -42,8 +46,28 @@
{"class":"AIS","device":"stdin","type":20,"repeat":0,"mmsi":3160097,"scaled":false,"offset1":47,"number1":1,"timeout1":7,"increment1":250,"offset2":2250,"number2":1,"timeout2":7,"increment2":1125,"offset3":856,"number3":5,"timeout3":7,"increment3":1125,"offset4":0,"number4":0,"timeout4":0,"increment4":0}
{"class":"AIS","device":"stdin","type":21,"repeat":0,"mmsi":123456789,"scaled":false,"aid_type":20,"name":"CHINA ROSE MURPHY EXPRESS ALERT","accuracy":false,"lon":-73619155,"lat":28752371,"to_bow":5,"to_stern":5,"to_port":5,"to_starboard":5,"epfd":1,"second":50,"regional":165,"off_position":false,"raim":false,"virtual_aid":false}
{"class":"AIS","device":"stdin","type":22,"repeat":0,"mmsi":3160048,"scaled":false,"channel_a":2087,"channel_b":2088,"txrx":0,"power":false,"ne_lon":-44100,"ne_lat":27330,"sw_lon":-48100,"sw_lat":25400,"addressed":false,"band_a":false,"band_b":false,"zonesize":4}
+{"class":"AIS","device":"stdin","type":22,"repeat":1,"mmsi":17419965,"scaled":false,"channel_a":3584,"channel_b":8,"txrx":1,"power":true,"dest1":28144881,"dest2":268435519,"addressed":true,"band_a":false,"band_b":false,"zonesize":4}
{"class":"AIS","device":"stdin","type":23,"repeat":0,"mmsi":2268120,"scaled":false,"ne_lon":1578,"ne_lat":30642,"sw_lon":1096,"sw_lat":30408,"stationtype":6,"shiptype":0,"interval":9,"quiet":0}
{"class":"AIS","device":"stdin","type":24,"repeat":0,"mmsi":271041815,"scaled":false,"shipname":"PROGUY","shiptype":60,"vendorid":"1D00014","callsign":"TC6163","to_bow":0,"to_stern":15,"to_port":0,"to_starboard":5}
+{"class":"AIS","device":"stdin","type":26,"repeat":1,"mmsi":137920605,"scaled":false,"addressed":true,"structured":true,"dest_mmsi":838351848,"app_id":23587,"data":"180:efa1708f32fc0a85c39e2c007006cf026c0f4882faad00","radio":0}
+{"class":"AIS","device":"stdin","type":25,"repeat":0,"mmsi":440006460,"scaled":false,"addressed":true,"structured":false,"dest_mmsi":134218384,"app_id":0,"data":"128:20000a4381be156d59b200ff9e80c185"}
+{"class":"AIS","device":"stdin","type":25,"repeat":0,"mmsi":563648328,"scaled":false,"addressed":false,"structured":true,"dest_mmsi":0,"app_id":134,"data":"112:082900a31880a2a636fffe034108"}
+{"class":"AIS","device":"stdin","type":25,"repeat":0,"mmsi":440002170,"scaled":false,"addressed":false,"structured":false,"dest_mmsi":0,"app_id":0,"data":"128:00001a438085956deb8d86a0100008c8"}
+{"class":"AIS","device":"stdin","type":26,"repeat":1,"mmsi":137920605,"scaled":false,"addressed":true,"structured":true,"dest_mmsi":838351848,"app_id":23587,"data":"180:efa1708f32fc0a85c39e2c007006cf026c0f4882faad00","radio":0}
+{"class":"AIS","device":"stdin","type":26,"repeat":0,"mmsi":84148325,"scaled":false,"addressed":true,"structured":false,"dest_mmsi":834699643,"app_id":0,"data":"228:q","radio":0}
+{"class":"AIS","device":"stdin","type":26,"repeat":2,"mmsi":633353704,"scaled":false,"addressed":false,"structured":true,"dest_mmsi":0,"app_id":24576,"data":"92:0014f2251db2ce9000ff9600","radio":0}
+{"class":"AIS","device":"stdin","type":26,"repeat":0,"mmsi":16777280,"scaled":false,"addressed":false,"structured":false,"dest_mmsi":0,"app_id":0,"data":"116:","radio":0}
+{"class":"AIS","device":"stdin","type":27,"repeat":1,"mmsi":236091959,"scaled":false,"status":3,"accuracy":false,"lon":-92521,"lat":52239,"speed":0,"course":0,"raim":false,"gnss":false}
{"class":"AIS","device":"stdin","type":24,"repeat":0,"mmsi":271040660,"scaled":false,"shipname":"GOZDEM-1","shiptype":37,"vendorid":"1C00045","callsign":"YM5504","to_bow":0,"to_stern":24,"to_port":0,"to_starboard":6}
{"class":"AIS","device":"stdin","type":5,"repeat":0,"mmsi":271010059,"scaled":false,"imo":0,"ais_version":0,"callsign":"TCA2350","shipname":"HEALTH CONTROL 13","shiptype":55,"to_bow":6,"to_stern":10,"to_port":2,"to_starboard":2,"epfd":1,"eta":"00-00T24:60Z","draught":20,"destination":"","dte":0}
{"class":"AIS","device":"stdin","type":5,"repeat":0,"mmsi":271010059,"scaled":false,"imo":0,"ais_version":0,"callsign":"TCA2350","shipname":"HEALTH CONTROL 13","shiptype":55,"to_bow":6,"to_stern":10,"to_port":2,"to_starboard":2,"epfd":1,"eta":"00-00T24:60Z","draught":20,"destination":"","dte":0}
+{"class":"AIS","device":"stdin","type":6,"repeat":0,"mmsi":276747000,"scaled":false,"seqno":0,"dest_mmsi":2766160,"retransmit":false,"dac":1,"fid":40,"data":"16:\t8"}
+{"class":"AIS","device":"stdin","type":4,"repeat":0,"mmsi":2470052,"scaled":false,"timestamp":"0-00-00T24:60:60Z","accuracy":false,"lon":108600000,"lat":54600000,"epfd":0,"raim":false,"radio":180352}
+{"class":"AIS","device":"stdin","type":4,"repeat":0,"mmsi":2242115,"scaled":false,"timestamp":"2012-06-01T24:60:60Z","accuracy":true,"lon":-5031130,"lat":26021408,"epfd":7,"raim":false,"radio":133322}
+{"class":"AIS","device":"stdin","type":4,"repeat":0,"mmsi":972158237,"scaled":false,"timestamp":"10196-00-24T09:57:37Z","accuracy":true,"lon":123070132,"lat":65599231,"epfd":14,"raim":true,"radio":2248}
+{"class":"AIS","device":"stdin","type":22,"repeat":2,"mmsi":875794037,"scaled":false,"channel_a":3396,"channel_b":373,"txrx":1,"power":false,"dest1":837968222,"dest2":254804543,"addressed":true,"band_a":false,"band_b":true,"zonesize":7}
+{"class":"AIS","device":"stdin","type":6,"repeat":0,"mmsi":2444012,"scaled":false,"seqno":0,"dest_mmsi":255803540,"retransmit":true,"dac":1,"fid":18,"linkage":1,"arrival":"00-00T00:00Z","portname":"","destination":"","lon":0,"lat":0}
+{"class":"AIS","device":"stdin","type":6,"repeat":3,"mmsi":2442102,"scaled":false,"seqno":0,"dest_mmsi":244100055,"retransmit":true,"dac":1,"fid":30,"linkage":1,"text":"("}
+{"class":"AIS","device":"stdin","type":6,"repeat":0,"mmsi":2444012,"scaled":false,"seqno":0,"dest_mmsi":255803540,"retransmit":true,"dac":1,"fid":18,"linkage":1,"arrival":"00-00T00:00Z","portname":"","destination":"","lon":0,"lat":0}
+{"class":"AIS","device":"stdin","type":6,"repeat":3,"mmsi":2442101,"scaled":false,"seqno":2,"dest_mmsi":246351000,"retransmit":false,"dac":1,"fid":32,"month":0,"day":0,"tidals":[{"lon":-16777216,"lat":0,"from_hour":0,"from_min":0,"to_hour":0,"to_min":0,"cdir":0,"cspeed":0}]}
+{"class":"AIS","device":"stdin","type":6,"repeat":3,"mmsi":2442104,"scaled":false,"seqno":0,"dest_mmsi":245679000,"retransmit":false,"dac":1,"fid":32,"month":0,"day":0,"tidals":[{"lon":-6291456,"lat":0,"from_hour":0,"from_min":0,"to_hour":0,"to_min":0,"cdir":0,"cspeed":0}]}