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

69 lines
1.7 KiB
C++

// Msg 21 - ATON status - 'E'
#include "ais.h"
namespace libais {
Ais21::Ais21(const char *nmea_payload, const size_t pad)
: AisMsg(nmea_payload, pad), aton_type(0), position_accuracy(0), dim_a(0),
dim_b(0), dim_c(0), dim_d(0), fix_type(0), timestamp(0), off_pos(false),
aton_status(0), raim(false), virtual_aton(false), assigned_mode(false),
spare(0), spare2(0) {
assert(message_id == 21);
// TODO(schwehr): make this more careful than 272-360
if (num_bits != 268 && (num_bits < 272 || num_bits > 360)) {
status = AIS_ERR_BAD_BIT_COUNT;
return;
}
AisBitset bs;
const AIS_STATUS r = bs.ParseNmeaPayload(nmea_payload, pad);
if (r != AIS_OK) {
status = r;
return;
}
bs.SeekTo(38);
aton_type = bs.ToUnsignedInt(38, 5);
name = bs.ToString(43, 120);
position_accuracy = bs[163];
position = bs.ToAisPoint(164, 55);
dim_a = bs.ToUnsignedInt(219, 9);
dim_b = bs.ToUnsignedInt(228, 9);
dim_c = bs.ToUnsignedInt(237, 6);
dim_d = bs.ToUnsignedInt(243, 6);
fix_type = bs.ToUnsignedInt(249, 4);
timestamp = bs.ToUnsignedInt(253, 6);
off_pos = bs[259];
aton_status = bs.ToUnsignedInt(260, 8);
if (num_bits == 268) {
// Non-standard small message.
assert(bs.GetRemaining() == 0);
status = AIS_OK;
return;
}
raim = bs[268];
virtual_aton = bs[269];
assigned_mode = bs[270];
spare = bs[271];
const size_t extra_chars = bs.GetRemaining() / 6;
const size_t extra_bits = bs.GetRemaining() % 6;
if (extra_chars > 0) {
name += bs.ToString(272, extra_chars * 6);
}
if (extra_bits > 0) {
spare2 = bs.ToUnsignedInt(272 + extra_chars * 6, extra_bits);
} else {
spare2 = 0;
}
assert(bs.GetRemaining() == 0);
status = AIS_OK;
}
} // namespace libais