1
0
mirror of https://github.com/peterantypas/maiana.git synced 2025-05-15 23:10:11 -07:00
2021-09-09 08:14:28 -07:00

67 lines
2.0 KiB
C++

// ? - Interrogation
#include "ais.h"
namespace libais {
Ais15::Ais15(const char *nmea_payload, const size_t pad)
: AisMsg(nmea_payload, pad), spare(0), mmsi_1(0), msg_1_1(0),
slot_offset_1_1(0), spare2(0), dest_msg_1_2(0), slot_offset_1_2(0),
spare3(0), mmsi_2(0), msg_2(0), slot_offset_2(0), spare4(0) {
if (!CheckStatus()) {
return;
}
// TODO(schwehr): verify the pad makes sense for each size
if (num_chars != 15 && num_chars != 18 && num_chars != 27) {
// 88-160 bits
status = AIS_ERR_BAD_BIT_COUNT;
return;
}
// 160 / 6 = 26.66
assert(message_id == 15);
bits.SeekTo(38);
spare = bits.ToUnsignedInt(38, 2);
mmsi_1 = bits.ToUnsignedInt(40, 30); // Destination ID 1
msg_1_1 = bits.ToUnsignedInt(70, 6);
slot_offset_1_1 = bits.ToUnsignedInt(76, 12);
// TODO(schwehr): set remaining fields to -1
if (num_chars <= 15) {
assert(bits.GetRemaining() == 0);
status = AIS_OK;
return;
}
spare2 = bits.ToUnsignedInt(88, 2);
dest_msg_1_2 = bits.ToUnsignedInt(90, 6);
// Failing test here. Getting bits [96..108], but num_bits is 104 (+4 pad).
// Context (http://catb.org/gpsd/AIVDM.html):
// "One station is interrogated for two message types, Length is 110 bits.
// There is a design error in the standard here; according to the <[ITU1371]>
// requirement for padding to 8 bits, this should have been 112 with a 4-bit
// trailing spare field, and decoders should be prepared to handle that length
// as well."
slot_offset_1_2 = bits.ToUnsignedInt(96, 12);
// TODO(schwehr): set remaining fields to -1
if (num_chars <= 18) {
// TODO(schwehr): Crashes: assert(bits.GetRemaining() == 0);
status = AIS_OK;
return;
}
spare3 = bits.ToUnsignedInt(108, 2);
mmsi_2 = bits.ToUnsignedInt(110, 30);
msg_2 = bits.ToUnsignedInt(140, 6);
slot_offset_2 = bits.ToUnsignedInt(146, 12);
spare4 = bits.ToUnsignedInt(158, 2);
assert(bits.GetRemaining() == 0);
status = AIS_OK;
}
} // namespace libais