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
1.7 KiB
C++

// A - GNSS broacast -
// TODO(schwehr): only partially coded - need to finish
// http://www.itu.int/rec/R-REC-M.823/en
// http://www.iala-aism.org/iala/publications/documentspdf/doc_348_eng.pdf
// In 823, 30 bit words = 24 bits data followed by 6 parity bits.
// Parity bits are left out of the AIS payload?
#include "ais.h"
namespace libais {
Ais17::Ais17(const char *nmea_payload, const size_t pad)
: AisMsg(nmea_payload, pad), spare(0), spare2(0), gnss_type(0), z_cnt(0),
station(0), seq(0), health(0) {
if (!CheckStatus()) {
return;
}
if (num_bits != 80 && (num_bits < 120 || num_bits > 816)) {
status = AIS_ERR_BAD_BIT_COUNT;
return;
}
assert(message_id == 17);
bits.SeekTo(38);
spare = bits.ToUnsignedInt(38, 2);
position = bits.ToAisPoint(40, 35);
spare2 = bits.ToUnsignedInt(75, 5);
// Spec states that there might be no data.
if (num_bits == 80) {
gnss_type = -1;
station = -1;
z_cnt = -1;
seq = -1;
return;
}
gnss_type = bits.ToUnsignedInt(80, 6);
station = bits.ToUnsignedInt(86, 10);
z_cnt = bits.ToUnsignedInt(96, 13);
seq = bits.ToUnsignedInt(109, 3);
bits.SeekRelative(5);
health = bits.ToUnsignedInt(117, 3);
// TODO(schwehr): Implement parsing the payload.
// TODO(schwehr): Add assert(bits.GetRemaining() == 0);
status = AIS_OK; // TODO(schwehr): Not really okay yet.
}
#if 0
ostream& operator<< (ostream &o, const Ais17 &m) {
return o << "[" << m.message_id << "]: " << m.mmsi
<< " " << m.position << " t:"
<< m.gnss_type << ", z:" << m.z_cnt
<< ", d s:" << m.station << ", seq:"
<< m.seq << ", h:" << m.health;
}
#endif
} // namespace libais