mirror of
https://github.com/peterantypas/maiana.git
synced 2025-05-15 23:10:11 -07:00
67 lines
2.0 KiB
C++
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
|