Exemplo n.º 1
0
// 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;
        }
    }

}
Exemplo n.º 2
0
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;
}
Exemplo n.º 3
0
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;
  }
}