From 2779fabdbe5a626891d5b755357a4a7e9faf4704 Mon Sep 17 00:00:00 2001 From: Pierre Garreau Date: Wed, 22 May 2019 13:15:52 +0200 Subject: [PATCH 1/6] add ais6_235_10 logic --- src/libais/ais.h | 17 +++++++++++++++++ src/libais/ais6.cpp | 33 ++++++++++++++++++++++++++++++++ src/libais/ais_py.cpp | 39 +++++++++++++++++++++++++++++++++++--- src/libais/decode_body.cpp | 7 +++++++ 4 files changed, 93 insertions(+), 3 deletions(-) diff --git a/src/libais/ais.h b/src/libais/ais.h index 4619db19..2cdd00c9 100644 --- a/src/libais/ais.h +++ b/src/libais/ais.h @@ -850,6 +850,23 @@ class Ais6_1_40 : public Ais6 { }; ostream& operator<< (ostream &o, const Ais6_1_40 &msg); +// Number of persons on board. ITU 1371-1 +class Ais6_235_10 : public Ais6 { + public: + int ana_int; + int ana_ext1; + int ana_ext2; + int racon; + int light; + bool health; + int stat_ext; + bool off_pos; + int spare2; + + Ais6_235_10(const char *nmea_payload, const size_t pad); +}; +ostream& operator<< (ostream &o, const Ais6_235_10 &msg); + ////////////////////////////////////////////////////////////////////// // 7 and 13 are ACKs for msg 6 and 12 diff --git a/src/libais/ais6.cpp b/src/libais/ais6.cpp index bd4c245e..bbe597e2 100644 --- a/src/libais/ais6.cpp +++ b/src/libais/ais6.cpp @@ -561,4 +561,37 @@ Ais6_1_40::Ais6_1_40(const char *nmea_payload, const size_t pad) status = AIS_OK; } +// This message provides AtoN (Aid to navigation) monitoring data for the General Lighthouse Authorities (GLA) +Ais6_235_10::Ais6_235_10(const char *nmea_payload, const size_t pad) + : Ais6(nmea_payload, pad), ana_int(0), ana_ext1(0), ana_ext2(0), racon(0), light(0), health(0), stat_ext(0), off_pos(0), spare2(0) { + assert(dac == 235); + assert(fi == 10); + + if (num_bits != 136) { + status = AIS_ERR_BAD_BIT_COUNT; + return; + } + + AisBitset bs; + const AIS_STATUS r = bits.ParseNmeaPayload(nmea_payload, pad); + if (r != AIS_OK) { + status = r; + return; + } + + bits.SeekTo(88); + ana_int = bits.ToUnsignedInt(88, 10); + ana_ext1 = bits.ToUnsignedInt(98, 10); + ana_ext2 = bits.ToUnsignedInt(108, 10); + racon = bits.ToUnsignedInt(118, 2); + light = bits.ToUnsignedInt(120, 2); + health = static_cast(bits[122]); + stat_ext = bits.ToUnsignedInt(123, 8); + off_pos = static_cast(bits[131]); + spare2 = bits.ToUnsignedInt(132, 4); + + assert(bits.GetRemaining() == 0); + status = AIS_OK; +} + } // namespace libais diff --git a/src/libais/ais_py.cpp b/src/libais/ais_py.cpp index a0fcce67..f1be0ce8 100644 --- a/src/libais/ais_py.cpp +++ b/src/libais/ais_py.cpp @@ -36,7 +36,8 @@ enum AIS_FI { AIS_FI_6_200_21_RIS_VTS_ETA = 21, AIS_FI_6_200_22_RIS_VTS_RTA = 22, AIS_FI_6_200_55_RIS_VTS_SAR = 55, - + AIS_FI_6_235_10_ATON_MONITORING_DATA = 10, + AIS_FI_8_1_0_TEXT = 0, AIS_FI_8_1_11_MET_HYDRO = 11, AIS_FI_8_1_13_FAIRWAY_CLOSED = 13, @@ -698,6 +699,30 @@ ais6_1_40_append_pydict(const char *nmea_payload, PyObject *dict, return AIS_OK; } +AIS_STATUS +ais6_235_10_append_pydict(const char *nmea_payload, PyObject *dict, + const size_t pad) { + assert(nmea_payload); + assert(dict); + assert(pad < 6); + Ais6_235_10 msg(nmea_payload, pad); + if (msg.had_error()) { + return msg.get_error(); + } + + DictSafeSetItem(dict, "ana_int", msg.ana_int); + DictSafeSetItem(dict, "ana_ext1", msg.ana_ext1); + DictSafeSetItem(dict, "ana_ext2", msg.ana_ext2); + DictSafeSetItem(dict, "racon", msg.racon); + DictSafeSetItem(dict, "light", msg.light); + DictSafeSetItem(dict, "health", msg.health); + DictSafeSetItem(dict, "stat_ext", msg.stat_ext); + DictSafeSetItem(dict, "off_pos", msg.off_pos); + DictSafeSetItem(dict, "spare2", msg.spare2); + + return AIS_OK; +} + PyObject* ais6_to_pydict(const char *nmea_payload, const size_t pad) { assert(nmea_payload); @@ -769,11 +794,19 @@ ais6_to_pydict(const char *nmea_payload, const size_t pad) { // TODO(schwehr): Raise an exception? DictSafeSetItem(dict, "not_parsed", true); } - break; - + case AIS_DAC_235_UNITED_KINGDOM_OF_GREAT_BRITAIN_AND_NORTHERN_IRELAND: // IMO. + switch (msg.fi) { + case AIS_FI_6_235_10_ATON_MONITORING_DATA: // IALA-A126. + status = ais6_235_10_append_pydict(nmea_payload, dict, pad); + break; default: // TODO(schwehr): Raise an exception? DictSafeSetItem(dict, "not_parsed", true); + } + break; + default: + // TODO(schwehr): Raise an exception? + DictSafeSetItem(dict, "not_parsed", true); } if (status != AIS_OK) { diff --git a/src/libais/decode_body.cpp b/src/libais/decode_body.cpp index 0e6a1c9d..ad7e4502 100644 --- a/src/libais/decode_body.cpp +++ b/src/libais/decode_body.cpp @@ -66,6 +66,13 @@ unique_ptr CreateAisMsg6(const string &body, const int fill_bits) { } // FI not handled. break; + case libais::AIS_DAC_235_UNITED_KINGDOM_OF_GREAT_BRITAIN_AND_NORTHERN_IRELAND: + switch (msg.fi) { + case 10: + return MakeUnique(body.c_str(), fill_bits); + } + // FI not handled. + break; } return nullptr; } From c8a0da4d6fdf332bdb4f3ec5263b796199d4b5a6 Mon Sep 17 00:00:00 2001 From: Pierre Garreau Date: Wed, 22 May 2019 14:41:40 +0200 Subject: [PATCH 2/6] better indentation :) --- src/libais/ais_py.cpp | 112 +++++++++++++++++++++--------------------- 1 file changed, 56 insertions(+), 56 deletions(-) diff --git a/src/libais/ais_py.cpp b/src/libais/ais_py.cpp index f1be0ce8..20518a54 100644 --- a/src/libais/ais_py.cpp +++ b/src/libais/ais_py.cpp @@ -37,7 +37,6 @@ enum AIS_FI { AIS_FI_6_200_22_RIS_VTS_RTA = 22, AIS_FI_6_200_55_RIS_VTS_SAR = 55, AIS_FI_6_235_10_ATON_MONITORING_DATA = 10, - AIS_FI_8_1_0_TEXT = 0, AIS_FI_8_1_11_MET_HYDRO = 11, AIS_FI_8_1_13_FAIRWAY_CLOSED = 13, @@ -747,66 +746,67 @@ ais6_to_pydict(const char *nmea_payload, const size_t pad) { AIS_STATUS status = AIS_UNINITIALIZED; switch (msg.dac) { - case AIS_DAC_1_INTERNATIONAL: // IMO. - switch (msg.fi) { - case AIS_FI_6_1_0_TEXT: // OLD ITU 1371-1. - status = ais6_1_0_append_pydict(nmea_payload, dict, pad); - break; - case AIS_FI_6_1_1_ACK: // OLD ITU 1371-1. - status = ais6_1_1_append_pydict(nmea_payload, dict, pad); - break; - case AIS_FI_6_1_2_FI_INTERROGATE: // OLD ITU 1371-1. - status = ais6_1_2_append_pydict(nmea_payload, dict, pad); - break; - case AIS_FI_6_1_3_CAPABILITY_INTERROGATE: // OLD ITU 1371-1. - status = ais6_1_3_append_pydict(nmea_payload, dict, pad); - break; - case AIS_FI_6_1_4_CAPABILITY_REPLY: // OLD ITU 1371-1. - status = ais6_1_4_append_pydict(nmea_payload, dict, pad); - break; - case AIS_FI_6_1_5_ACK: // ITU 1371-5. - status = ais6_1_5_append_pydict(nmea_payload, dict, pad); - break; - case AIS_FI_6_1_12_DANGEROUS_CARGO: // Not to be used after 1 Jan 2013. - status = ais6_1_12_append_pydict(nmea_payload, dict, pad); - break; - case AIS_FI_6_1_14_TIDAL_WINDOW: // Not to be used after 1 Jan 2013. - status = ais6_1_14_append_pydict(nmea_payload, dict, pad); - break; - case AIS_FI_6_1_18_ENTRY_TIME: - status = ais6_1_18_append_pydict(nmea_payload, dict, pad); - break; - case AIS_FI_6_1_20_BERTHING: - status = ais6_1_20_append_pydict(nmea_payload, dict, pad); - break; - case AIS_FI_6_1_25_DANGEROUS_CARGO: - status = ais6_1_25_append_pydict(nmea_payload, dict, pad); - break; - // TODO(schwehr): AIS_FI_6_1_28_ROUTE. - // TODO(schwehr): AIS_FI_6_1_30_TEXT. - case AIS_FI_6_1_32_TIDAL_WINDOW: // IMO Circ 289 - status = ais6_1_32_append_pydict(nmea_payload, dict, pad); + case AIS_DAC_1_INTERNATIONAL: // IMO. + switch (msg.fi) { + case AIS_FI_6_1_0_TEXT: // OLD ITU 1371-1. + status = ais6_1_0_append_pydict(nmea_payload, dict, pad); + break; + case AIS_FI_6_1_1_ACK: // OLD ITU 1371-1. + status = ais6_1_1_append_pydict(nmea_payload, dict, pad); + break; + case AIS_FI_6_1_2_FI_INTERROGATE: // OLD ITU 1371-1. + status = ais6_1_2_append_pydict(nmea_payload, dict, pad); + break; + case AIS_FI_6_1_3_CAPABILITY_INTERROGATE: // OLD ITU 1371-1. + status = ais6_1_3_append_pydict(nmea_payload, dict, pad); + break; + case AIS_FI_6_1_4_CAPABILITY_REPLY: // OLD ITU 1371-1. + status = ais6_1_4_append_pydict(nmea_payload, dict, pad); + break; + case AIS_FI_6_1_5_ACK: // ITU 1371-5. + status = ais6_1_5_append_pydict(nmea_payload, dict, pad); + break; + case AIS_FI_6_1_12_DANGEROUS_CARGO: // Not to be used after 1 Jan 2013. + status = ais6_1_12_append_pydict(nmea_payload, dict, pad); + break; + case AIS_FI_6_1_14_TIDAL_WINDOW: // Not to be used after 1 Jan 2013. + status = ais6_1_14_append_pydict(nmea_payload, dict, pad); + break; + case AIS_FI_6_1_18_ENTRY_TIME: + status = ais6_1_18_append_pydict(nmea_payload, dict, pad); + break; + case AIS_FI_6_1_20_BERTHING: + status = ais6_1_20_append_pydict(nmea_payload, dict, pad); + break; + case AIS_FI_6_1_25_DANGEROUS_CARGO: + status = ais6_1_25_append_pydict(nmea_payload, dict, pad); + break; + // TODO(schwehr): AIS_FI_6_1_28_ROUTE. + // TODO(schwehr): AIS_FI_6_1_30_TEXT. + case AIS_FI_6_1_32_TIDAL_WINDOW: // IMO Circ 289 + status = ais6_1_32_append_pydict(nmea_payload, dict, pad); + break; + case AIS_FI_6_1_40_PERSONS_ON_BOARD: // OLD ITU 1371-1. + status = ais6_1_40_append_pydict(nmea_payload, dict, pad); + break; + default: + // TODO(schwehr): Raise an exception? + DictSafeSetItem(dict, "not_parsed", true); + } break; - case AIS_FI_6_1_40_PERSONS_ON_BOARD: // OLD ITU 1371-1. - status = ais6_1_40_append_pydict(nmea_payload, dict, pad); + case AIS_DAC_235_UNITED_KINGDOM_OF_GREAT_BRITAIN_AND_NORTHERN_IRELAND: // IMO. + switch (msg.fi) { + case AIS_FI_6_235_10_ATON_MONITORING_DATA: // IALA-A126. + status = ais6_235_10_append_pydict(nmea_payload, dict, pad); + break; + default: + // TODO(schwehr): Raise an exception? + DictSafeSetItem(dict, "not_parsed", true); + } break; default: // TODO(schwehr): Raise an exception? DictSafeSetItem(dict, "not_parsed", true); - } - case AIS_DAC_235_UNITED_KINGDOM_OF_GREAT_BRITAIN_AND_NORTHERN_IRELAND: // IMO. - switch (msg.fi) { - case AIS_FI_6_235_10_ATON_MONITORING_DATA: // IALA-A126. - status = ais6_235_10_append_pydict(nmea_payload, dict, pad); - break; - default: - // TODO(schwehr): Raise an exception? - DictSafeSetItem(dict, "not_parsed", true); - } - break; - default: - // TODO(schwehr): Raise an exception? - DictSafeSetItem(dict, "not_parsed", true); } if (status != AIS_OK) { From 85d0054a7db1e1d20db074cd3abdc5d2dab9e87f Mon Sep 17 00:00:00 2001 From: Pierre Garreau Date: Wed, 22 May 2019 14:55:50 +0200 Subject: [PATCH 3/6] write test --- test/test_data.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/test/test_data.py b/test/test_data.py index 30f06a7a..59b03428 100644 --- a/test/test_data.py +++ b/test/test_data.py @@ -673,4 +673,25 @@ 'y': -2.5533333333333332} }, + { + 'nmea': [ '!AIVDM,1,1,4,B,6>jR0600V:C0>da4P106P00,2*02' ], + 'result': {'id': 6, + 'repeat_indicator': 0, + 'mmsi': 992509976, + 'seq': 0, + 'mmsi_dest': 2500912, + 'retransmit': True, + 'spare': 0, + 'dac': 235, + 'fi': 10, + 'ana_int': 13.7, + 'ana_ext1': 0.05, + 'ana_ext2': 0.05, + 'racon': 2, + 'light': 2, + 'health': False, + 'stat_ext': 0, + 'off_pos': False, + 'spare2': 0} + }, ] From 6f3b416bd52fd79092de092726bf35786bc7f63e Mon Sep 17 00:00:00 2001 From: Pierre Garreau Date: Wed, 22 May 2019 15:54:35 +0200 Subject: [PATCH 4/6] fix broken test from develop --- src/libais/ais.h | 6 +++--- src/libais/ais6.cpp | 10 +++++----- test/test_data.py | 18 +++++++++--------- test/testutils.py | 2 ++ 4 files changed, 19 insertions(+), 17 deletions(-) diff --git a/src/libais/ais.h b/src/libais/ais.h index 2cdd00c9..9b3bc20e 100644 --- a/src/libais/ais.h +++ b/src/libais/ais.h @@ -853,9 +853,9 @@ ostream& operator<< (ostream &o, const Ais6_1_40 &msg); // Number of persons on board. ITU 1371-1 class Ais6_235_10 : public Ais6 { public: - int ana_int; - int ana_ext1; - int ana_ext2; + float ana_int; + float ana_ext1; + float ana_ext2; int racon; int light; bool health; diff --git a/src/libais/ais6.cpp b/src/libais/ais6.cpp index bbe597e2..207c0c03 100644 --- a/src/libais/ais6.cpp +++ b/src/libais/ais6.cpp @@ -27,7 +27,7 @@ Ais6::Ais6(const char *nmea_payload, const size_t pad) bits.SeekTo(38); seq = bits.ToUnsignedInt(38, 2); mmsi_dest = bits.ToUnsignedInt(40, 30); - retransmit = !bits[70]; + retransmit = static_cast(bits[70]); spare = bits[71]; dac = bits.ToUnsignedInt(72, 10); fi = bits.ToUnsignedInt(82, 6); @@ -563,7 +563,7 @@ Ais6_1_40::Ais6_1_40(const char *nmea_payload, const size_t pad) // This message provides AtoN (Aid to navigation) monitoring data for the General Lighthouse Authorities (GLA) Ais6_235_10::Ais6_235_10(const char *nmea_payload, const size_t pad) - : Ais6(nmea_payload, pad), ana_int(0), ana_ext1(0), ana_ext2(0), racon(0), light(0), health(0), stat_ext(0), off_pos(0), spare2(0) { + : Ais6(nmea_payload, pad), ana_int(0.0), ana_ext1(0.0), ana_ext2(0.0), racon(0), light(0), health(0), stat_ext(0), off_pos(0), spare2(0) { assert(dac == 235); assert(fi == 10); @@ -580,9 +580,9 @@ Ais6_235_10::Ais6_235_10(const char *nmea_payload, const size_t pad) } bits.SeekTo(88); - ana_int = bits.ToUnsignedInt(88, 10); - ana_ext1 = bits.ToUnsignedInt(98, 10); - ana_ext2 = bits.ToUnsignedInt(108, 10); + ana_int = bits.ToUnsignedInt(88, 10) / 20.; + ana_ext1 = bits.ToUnsignedInt(98, 10) / 20.; + ana_ext2 = bits.ToUnsignedInt(108, 10) / 20.; racon = bits.ToUnsignedInt(118, 2); light = bits.ToUnsignedInt(120, 2); health = static_cast(bits[122]); diff --git a/test/test_data.py b/test/test_data.py index 59b03428..58ebba61 100644 --- a/test/test_data.py +++ b/test/test_data.py @@ -138,7 +138,7 @@ 'mmsi_dest': 538090218, 'msg_seq': 0, 'repeat_indicator': 0, - 'retransmit': False, + 'retransmit': True, 'seq': 2, 'spare': 0, 'spare2': 0, @@ -153,7 +153,7 @@ 'mmsi': 257050000, 'seq': 2, 'mmsi_dest': 257060000, - 'retransmit': True, + 'retransmit': False, 'spare': 0, 'dac': 1, 'fi': 1, @@ -168,7 +168,7 @@ 'mmsi': 352521000, 'seq': 0, 'mmsi_dest': 477535500, - 'retransmit': True, + 'retransmit': False, 'spare': 0, 'dac': 1, 'fi': 2, @@ -184,7 +184,7 @@ 'mmsi_dest': 205523890, 'repeat_indicator': 0, 'req_dac': 1, - 'retransmit': False, + 'retransmit': True, 'seq': 2, 'spare': 0, 'spare2': 0, @@ -211,7 +211,7 @@ 'mmsi': 205323000, 'mmsi_dest': 2053501, 'repeat_indicator': 0, - 'retransmit': True, + 'retransmit': False, 'seq': 0, 'spare': 0, 'spare2': 0, @@ -680,13 +680,13 @@ 'mmsi': 992509976, 'seq': 0, 'mmsi_dest': 2500912, - 'retransmit': True, + 'retransmit': False, 'spare': 0, 'dac': 235, 'fi': 10, - 'ana_int': 13.7, - 'ana_ext1': 0.05, - 'ana_ext2': 0.05, + 'ana_int': 13.699999809265137, + 'ana_ext1': 0.05000000074505806, + 'ana_ext2': 0.05000000074505806, 'racon': 2, 'light': 2, 'health': False, diff --git a/test/testutils.py b/test/testutils.py index d4f98e29..de13b25b 100644 --- a/test/testutils.py +++ b/test/testutils.py @@ -47,6 +47,8 @@ def DictDiff(a, b): def Compare(x, y): if x == y: return True + if x in [None, 'nan'] and y in [None, 'nan']: + return True x = TextToNumber(x) y = TextToNumber(y) if isinstance(x, six.string_types) and isinstance(y, six.string_types): From f18a673c05707550dd475d21c2e6272e216ff00b Mon Sep 17 00:00:00 2001 From: Pierre Garreau Date: Fri, 24 May 2019 10:54:08 +0200 Subject: [PATCH 5/6] PR --- src/libais/ais6.cpp | 2 +- src/libais/ais_py.cpp | 112 +++++++++++++++++++++--------------------- test/testutils.py | 2 - 3 files changed, 57 insertions(+), 59 deletions(-) diff --git a/src/libais/ais6.cpp b/src/libais/ais6.cpp index 207c0c03..f3d58081 100644 --- a/src/libais/ais6.cpp +++ b/src/libais/ais6.cpp @@ -27,7 +27,7 @@ Ais6::Ais6(const char *nmea_payload, const size_t pad) bits.SeekTo(38); seq = bits.ToUnsignedInt(38, 2); mmsi_dest = bits.ToUnsignedInt(40, 30); - retransmit = static_cast(bits[70]); + retransmit = bits[70]; spare = bits[71]; dac = bits.ToUnsignedInt(72, 10); fi = bits.ToUnsignedInt(82, 6); diff --git a/src/libais/ais_py.cpp b/src/libais/ais_py.cpp index 20518a54..c21db147 100644 --- a/src/libais/ais_py.cpp +++ b/src/libais/ais_py.cpp @@ -746,67 +746,67 @@ ais6_to_pydict(const char *nmea_payload, const size_t pad) { AIS_STATUS status = AIS_UNINITIALIZED; switch (msg.dac) { - case AIS_DAC_1_INTERNATIONAL: // IMO. - switch (msg.fi) { - case AIS_FI_6_1_0_TEXT: // OLD ITU 1371-1. - status = ais6_1_0_append_pydict(nmea_payload, dict, pad); - break; - case AIS_FI_6_1_1_ACK: // OLD ITU 1371-1. - status = ais6_1_1_append_pydict(nmea_payload, dict, pad); - break; - case AIS_FI_6_1_2_FI_INTERROGATE: // OLD ITU 1371-1. - status = ais6_1_2_append_pydict(nmea_payload, dict, pad); - break; - case AIS_FI_6_1_3_CAPABILITY_INTERROGATE: // OLD ITU 1371-1. - status = ais6_1_3_append_pydict(nmea_payload, dict, pad); - break; - case AIS_FI_6_1_4_CAPABILITY_REPLY: // OLD ITU 1371-1. - status = ais6_1_4_append_pydict(nmea_payload, dict, pad); - break; - case AIS_FI_6_1_5_ACK: // ITU 1371-5. - status = ais6_1_5_append_pydict(nmea_payload, dict, pad); - break; - case AIS_FI_6_1_12_DANGEROUS_CARGO: // Not to be used after 1 Jan 2013. - status = ais6_1_12_append_pydict(nmea_payload, dict, pad); - break; - case AIS_FI_6_1_14_TIDAL_WINDOW: // Not to be used after 1 Jan 2013. - status = ais6_1_14_append_pydict(nmea_payload, dict, pad); - break; - case AIS_FI_6_1_18_ENTRY_TIME: - status = ais6_1_18_append_pydict(nmea_payload, dict, pad); - break; - case AIS_FI_6_1_20_BERTHING: - status = ais6_1_20_append_pydict(nmea_payload, dict, pad); - break; - case AIS_FI_6_1_25_DANGEROUS_CARGO: - status = ais6_1_25_append_pydict(nmea_payload, dict, pad); - break; - // TODO(schwehr): AIS_FI_6_1_28_ROUTE. - // TODO(schwehr): AIS_FI_6_1_30_TEXT. - case AIS_FI_6_1_32_TIDAL_WINDOW: // IMO Circ 289 - status = ais6_1_32_append_pydict(nmea_payload, dict, pad); - break; - case AIS_FI_6_1_40_PERSONS_ON_BOARD: // OLD ITU 1371-1. - status = ais6_1_40_append_pydict(nmea_payload, dict, pad); - break; - default: - // TODO(schwehr): Raise an exception? - DictSafeSetItem(dict, "not_parsed", true); - } + case AIS_DAC_1_INTERNATIONAL: // IMO. + switch (msg.fi) { + case AIS_FI_6_1_0_TEXT: // OLD ITU 1371-1. + status = ais6_1_0_append_pydict(nmea_payload, dict, pad); + break; + case AIS_FI_6_1_1_ACK: // OLD ITU 1371-1. + status = ais6_1_1_append_pydict(nmea_payload, dict, pad); + break; + case AIS_FI_6_1_2_FI_INTERROGATE: // OLD ITU 1371-1. + status = ais6_1_2_append_pydict(nmea_payload, dict, pad); + break; + case AIS_FI_6_1_3_CAPABILITY_INTERROGATE: // OLD ITU 1371-1. + status = ais6_1_3_append_pydict(nmea_payload, dict, pad); + break; + case AIS_FI_6_1_4_CAPABILITY_REPLY: // OLD ITU 1371-1. + status = ais6_1_4_append_pydict(nmea_payload, dict, pad); + break; + case AIS_FI_6_1_5_ACK: // ITU 1371-5. + status = ais6_1_5_append_pydict(nmea_payload, dict, pad); + break; + case AIS_FI_6_1_12_DANGEROUS_CARGO: // Not to be used after 1 Jan 2013. + status = ais6_1_12_append_pydict(nmea_payload, dict, pad); + break; + case AIS_FI_6_1_14_TIDAL_WINDOW: // Not to be used after 1 Jan 2013. + status = ais6_1_14_append_pydict(nmea_payload, dict, pad); + break; + case AIS_FI_6_1_18_ENTRY_TIME: + status = ais6_1_18_append_pydict(nmea_payload, dict, pad); + break; + case AIS_FI_6_1_20_BERTHING: + status = ais6_1_20_append_pydict(nmea_payload, dict, pad); break; - case AIS_DAC_235_UNITED_KINGDOM_OF_GREAT_BRITAIN_AND_NORTHERN_IRELAND: // IMO. - switch (msg.fi) { - case AIS_FI_6_235_10_ATON_MONITORING_DATA: // IALA-A126. - status = ais6_235_10_append_pydict(nmea_payload, dict, pad); - break; - default: - // TODO(schwehr): Raise an exception? - DictSafeSetItem(dict, "not_parsed", true); - } + case AIS_FI_6_1_25_DANGEROUS_CARGO: + status = ais6_1_25_append_pydict(nmea_payload, dict, pad); + break; + // TODO(schwehr): AIS_FI_6_1_28_ROUTE. + // TODO(schwehr): AIS_FI_6_1_30_TEXT. + case AIS_FI_6_1_32_TIDAL_WINDOW: // IMO Circ 289 + status = ais6_1_32_append_pydict(nmea_payload, dict, pad); + break; + case AIS_FI_6_1_40_PERSONS_ON_BOARD: // OLD ITU 1371-1. + status = ais6_1_40_append_pydict(nmea_payload, dict, pad); break; default: // TODO(schwehr): Raise an exception? DictSafeSetItem(dict, "not_parsed", true); + } + break; + case AIS_DAC_235_UNITED_KINGDOM_OF_GREAT_BRITAIN_AND_NORTHERN_IRELAND: // IMO. + switch (msg.fi) { + case AIS_FI_6_235_10_ATON_MONITORING_DATA: // IALA-A126. + status = ais6_235_10_append_pydict(nmea_payload, dict, pad); + break; + default: + // TODO(schwehr): Raise an exception? + DictSafeSetItem(dict, "not_parsed", true); + } + break; + default: + // TODO(schwehr): Raise an exception? + DictSafeSetItem(dict, "not_parsed", true); } if (status != AIS_OK) { diff --git a/test/testutils.py b/test/testutils.py index de13b25b..d4f98e29 100644 --- a/test/testutils.py +++ b/test/testutils.py @@ -47,8 +47,6 @@ def DictDiff(a, b): def Compare(x, y): if x == y: return True - if x in [None, 'nan'] and y in [None, 'nan']: - return True x = TextToNumber(x) y = TextToNumber(y) if isinstance(x, six.string_types) and isinstance(y, six.string_types): From eaaa3a695ed1faf4641439fe4bfaff4eb108f192 Mon Sep 17 00:00:00 2001 From: Pierre Garreau Date: Tue, 28 May 2019 09:52:31 +0200 Subject: [PATCH 6/6] PR 2 round --- src/libais/ais6.cpp | 2 +- test/test_data.py | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/libais/ais6.cpp b/src/libais/ais6.cpp index f3d58081..672e5564 100644 --- a/src/libais/ais6.cpp +++ b/src/libais/ais6.cpp @@ -27,7 +27,7 @@ Ais6::Ais6(const char *nmea_payload, const size_t pad) bits.SeekTo(38); seq = bits.ToUnsignedInt(38, 2); mmsi_dest = bits.ToUnsignedInt(40, 30); - retransmit = bits[70]; + retransmit = !bits[70]; spare = bits[71]; dac = bits.ToUnsignedInt(72, 10); fi = bits.ToUnsignedInt(82, 6); diff --git a/test/test_data.py b/test/test_data.py index 58ebba61..9e0f2cf6 100644 --- a/test/test_data.py +++ b/test/test_data.py @@ -138,7 +138,7 @@ 'mmsi_dest': 538090218, 'msg_seq': 0, 'repeat_indicator': 0, - 'retransmit': True, + 'retransmit': False, 'seq': 2, 'spare': 0, 'spare2': 0, @@ -153,7 +153,7 @@ 'mmsi': 257050000, 'seq': 2, 'mmsi_dest': 257060000, - 'retransmit': False, + 'retransmit': True, 'spare': 0, 'dac': 1, 'fi': 1, @@ -168,7 +168,7 @@ 'mmsi': 352521000, 'seq': 0, 'mmsi_dest': 477535500, - 'retransmit': False, + 'retransmit': True, 'spare': 0, 'dac': 1, 'fi': 2, @@ -184,7 +184,7 @@ 'mmsi_dest': 205523890, 'repeat_indicator': 0, 'req_dac': 1, - 'retransmit': True, + 'retransmit': False, 'seq': 2, 'spare': 0, 'spare2': 0, @@ -211,7 +211,7 @@ 'mmsi': 205323000, 'mmsi_dest': 2053501, 'repeat_indicator': 0, - 'retransmit': False, + 'retransmit': True, 'seq': 0, 'spare': 0, 'spare2': 0, @@ -680,7 +680,7 @@ 'mmsi': 992509976, 'seq': 0, 'mmsi_dest': 2500912, - 'retransmit': False, + 'retransmit': True, 'spare': 0, 'dac': 235, 'fi': 10,