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

65 lines
1.6 KiB
C++

// Msg 22 - F - Channel Management
#include "ais.h"
namespace libais {
Ais22::Ais22(const char *nmea_payload, const size_t pad)
: AisMsg(nmea_payload, pad), spare(0), chan_a(0), chan_b(0), txrx_mode(0),
power_low(false), pos_valid(false), dest_valid(false), dest_mmsi_1(0),
dest_mmsi_2(0), chan_a_bandwidth(0), chan_b_bandwidth(0), zone_size(0),
spare2(0) {
if (!CheckStatus()) {
return;
}
if (pad != 0 || num_chars != 28) {
status = AIS_ERR_BAD_BIT_COUNT;
return;
}
assert(message_id == 22);
spare = bits.SeekTo(38).ToUnsignedInt(38, 2);
chan_a = bits.ToUnsignedInt(40, 12);
chan_b = bits.ToUnsignedInt(52, 12);
txrx_mode = bits.ToUnsignedInt(64, 4);
power_low = bits[68];
// WARNING: OUT OF ORDER DECODE
bits.SeekTo(139);
bool addressed = bits[139];
bits.SeekTo(69);
if (!addressed) {
// geographic position
// TODO(schwehr): For all implementations in libais, set the valid flag
// after setting all of the data members.
pos_valid = true;
// TODO(schwehr): Confirm this is correct!
position1 = bits.ToAisPoint(69, 35);
position2 = bits.ToAisPoint(104, 35);
} else {
dest_valid = true;
dest_mmsi_1 = bits.ToUnsignedInt(69, 30);
// 5 spare bits
bits.SeekRelative(5);
dest_mmsi_2 = bits.ToUnsignedInt(104, 30);
// 5 spare bits
bits.SeekRelative(5);
}
// OUT OF ORDER: addressed is earlier before
bits.SeekRelative(1);
chan_a_bandwidth = bits[140];
chan_b_bandwidth = bits[141];
zone_size = bits.ToUnsignedInt(142, 3);
spare2 = bits.ToUnsignedInt(145, 23);
assert(bits.GetRemaining() == 0);
status = AIS_OK;
}
} // namespace libais