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

83 lines
2.1 KiB
C++

// AIS message 4 or 11
#include "ais.h"
namespace libais {
Ais4_11::Ais4_11(const char *nmea_payload, const size_t pad)
: AisMsg(nmea_payload, pad), year(0), month(0), day(0), hour(0), minute(0),
second(0), position_accuracy(0), fix_type(0),
transmission_ctl(0), spare(0), raim(false), sync_state(0),
slot_timeout(0), received_stations_valid(false), received_stations(0),
slot_number_valid(false), slot_number(0), utc_valid(false), utc_hour(0),
utc_min(0), utc_spare(0), slot_offset_valid(false), slot_offset(0) {
if (!CheckStatus()) {
return;
}
if (pad != 0 || num_chars != 28) {
status = AIS_ERR_BAD_BIT_COUNT;
return;
}
assert(message_id == 4 || message_id == 11);
bits.SeekTo(38);
year = bits.ToUnsignedInt(38, 14);
month = bits.ToUnsignedInt(52, 4);
day = bits.ToUnsignedInt(56, 5);
hour = bits.ToUnsignedInt(61, 5);
minute = bits.ToUnsignedInt(66, 6);
second = bits.ToUnsignedInt(72, 6);
position_accuracy = bits[78];
position = bits.ToAisPoint(79, 55);
fix_type = bits.ToUnsignedInt(134, 4);
transmission_ctl = bits[138];
spare = bits.ToUnsignedInt(139, 9);
raim = bits[148];
// SOTDMA commstate
sync_state = bits.ToUnsignedInt(149, 2);
slot_timeout = bits.ToUnsignedInt(151, 3);
switch (slot_timeout) {
case 0:
slot_offset = bits.ToUnsignedInt(154, 14);
slot_offset_valid = true;
break;
case 1:
utc_hour = bits.ToUnsignedInt(154, 5);
utc_min = bits.ToUnsignedInt(159, 7);
utc_spare = bits.ToUnsignedInt(166, 2);
utc_valid = true;
break;
case 2: // FALLTHROUGH
case 4: // FALLTHROUGH
case 6:
slot_number = bits.ToUnsignedInt(154, 14);
slot_number_valid = true;
break;
case 3: // FALLTHROUGH
case 5: // FALLTHROUGH
case 7:
received_stations = bits.ToUnsignedInt(154, 14);
received_stations_valid = true;
break;
default:
assert(false);
}
assert(bits.GetRemaining() == 0);
status = AIS_OK;
}
#if 0
ostream& operator<< (ostream &o, const Ais4_11 &msg) {
return o << msg.message_id << ": " << msg.mmsi;
}
#endif
} // namespace libais