// TODO: pad Ais8_366_22::Ais8_366_22(const char *nmea_payload) { assert(nmea_payload); assert(strlen(nmea_payload) >= 28); init(); const int num_bits = (strlen(nmea_payload) * 6); if (208 <= num_bits && num_bits >= 1020) { status = AIS_ERR_BAD_BIT_COUNT; return; } std::bitset<MAX_BITS> bs; status = aivdm_to_bits(bs, nmea_payload); if (had_error()) return; if (!decode_header8(bs)) return; link_id = ubits(bs,56,10); notice_type = ubits(bs,66,7); month = ubits(bs,73,4); day = ubits(bs,77,5); utc_hour = ubits(bs,82,5); utc_minute = ubits(bs,87,6); duration_minutes = ubits(bs,93,18); const int num_sub_areas = int( floor( (num_bits - 111)/90.) ); for (int sub_area_idx=0; sub_area_idx < num_sub_areas; sub_area_idx++) { Ais8_366_22_SubArea *sub_area = ais8_366_22_subarea_factory(bs, 111+90*sub_area_idx); if (sub_area) { sub_areas.push_back(sub_area); } else { std::cout << "ERROR: bad sub area " << sub_area_idx << std::endl; } } }
Ais8_366_22::Ais8_366_22(const char *nmea_payload, const size_t pad) : Ais8(nmea_payload, pad), link_id(0), notice_type(0), month(0), day(0), utc_hour(0), utc_minute(0), duration_minutes(0) { assert(dac == 366); assert(fi == 22); if (num_bits <= 208 || num_bits >= 1020) { 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; } link_id = bs.ToUnsignedInt(56, 10); notice_type = bs.ToUnsignedInt(66, 7); month = bs.ToUnsignedInt(73, 4); day = bs.ToUnsignedInt(77, 5); utc_hour = bs.ToUnsignedInt(82, 5); utc_minute = bs.ToUnsignedInt(87, 6); duration_minutes = bs.ToUnsignedInt(93, 18); const int num_sub_areas = static_cast<int>(floor((num_bits - 111)/90.)); for (int area_idx = 0; area_idx < num_sub_areas; area_idx++) { Ais8_366_22_SubArea *area = ais8_366_22_subarea_factory(bs, 111 + 90*area_idx); if (area) { sub_areas.push_back(area); } else { status = AIS_ERR_BAD_SUB_SUB_MSG; return; } } assert(bs.GetRemaining() == 0); status = AIS_OK; }
Ais8_366_22::Ais8_366_22(const char *nmea_payload, const size_t pad) : Ais8(nmea_payload, pad) { if (status != AIS_UNINITIALIZED) return; assert(dac == 366); assert(fi == 22); const int num_bits = (strlen(nmea_payload) * 6) - pad; if (num_bits <= 208 || num_bits >= 1020) { status = AIS_ERR_BAD_BIT_COUNT; return; } bitset<MAX_BITS> bs; const AIS_STATUS r = aivdm_to_bits(bs, nmea_payload); if (r != AIS_OK) { status = r; return; } link_id = ubits(bs, 56, 10); notice_type = ubits(bs, 66, 7); month = ubits(bs, 73, 4); day = ubits(bs, 77, 5); utc_hour = ubits(bs, 82, 5); utc_minute = ubits(bs, 87, 6); duration_minutes = ubits(bs, 93, 18); const int num_sub_areas = static_cast<int>(floor((num_bits - 111)/90.)); for (int area_idx = 0; area_idx < num_sub_areas; area_idx++) { Ais8_366_22_SubArea *area = ais8_366_22_subarea_factory(bs, 111 + 90*area_idx); if (area) sub_areas.push_back(area); else status = AIS_ERR_BAD_SUB_SUB_MSG; } }