407 auto obs = std::make_shared<VectorNavBinaryOutput>(
_imuPos);
415 line.erase(line.begin(), std::ranges::find_if(line, [](
int ch) { return std::isgraph(ch); }));
424 std::stringstream lineStream(line);
427 auto extractCell = [&lineStream]() {
428 if (lineStream.eof())
430 throw std::runtime_error(
"End of file");
432 if (std::string cell; std::getline(lineStream, cell,
','))
435 cell.erase(std::ranges::find_if(cell, [](
int ch) {
return std::iscntrl(ch); }), cell.end());
440 return std::string(
"");
442 auto extractRemoveTillDelimiter = [](std::string&
str,
const std::string& delimiter) {
444 if (
size_t pos =
str.find(delimiter);
445 pos != std::string::npos)
447 extract =
str.substr(0, pos);
448 str =
str.substr(pos + 1);
454 auto extractSingleValue = [&](
auto& field,
auto flag,
auto& out) {
455 static_assert(std::is_same_v<uint8_t&,
decltype(out)> || std::is_same_v<uint16_t&,
decltype(out)> || std::is_same_v<uint32_t&,
decltype(out)> || std::is_same_v<uint64_t&,
decltype(out)>
456 || std::is_same_v<int8_t&,
decltype(out)> || std::is_same_v<int16_t&,
decltype(out)> || std::is_same_v<int32_t&,
decltype(out)>
457 || std::is_same_v<
float&,
decltype(out)> || std::is_same_v<
double&,
decltype(out)>
458 || std::is_same_v<std::string&,
decltype(out)>);
461 auto cell = extractCell();
469 if constexpr (std::is_same_v<uint8_t&,
decltype(out)>
470 || std::is_same_v<uint16_t&,
decltype(out)>
471 || std::is_same_v<uint32_t&,
decltype(out)>)
473 out =
static_cast<std::remove_reference_t<decltype(out)
>>(std::stoul(cell));
475 else if constexpr (std::is_same_v<uint64_t&,
decltype(out)>)
477 out =
static_cast<std::remove_reference_t<decltype(out)
>>(std::stoull(cell));
479 else if constexpr (std::is_same_v<int8_t&,
decltype(out)>
480 || std::is_same_v<int16_t&,
decltype(out)>
481 || std::is_same_v<int32_t&,
decltype(out)>)
483 out =
static_cast<std::remove_reference_t<decltype(out)
>>(std::stoi(cell));
485 else if constexpr (std::is_same_v<
float&,
decltype(out)>)
487 out =
static_cast<std::remove_reference_t<decltype(out)
>>(std::stof(cell));
489 else if constexpr (std::is_same_v<
double&,
decltype(out)>)
491 out =
static_cast<std::remove_reference_t<decltype(out)
>>(std::stod(cell));
493 else if constexpr (std::is_same_v<std::string&,
decltype(out)>)
500 auto extractValue = [&](
auto& field,
auto flag,
auto&... out) {
503 (extractSingleValue(field, flag, out), ...);
510 std::string gpsCycle = extractCell();
511 std::string gpsWeek = extractCell();
512 std::string gpsTow = extractCell();
513 if (!gpsCycle.empty() && !gpsWeek.empty() && !gpsTow.empty())
515 obs->insTime =
InsTime(std::stoi(gpsCycle), std::stoi(gpsWeek), std::stold(gpsTow));
521 if (!obs->timeOutputs)
523 obs->timeOutputs = std::make_shared<NAV::vendor::vectornav::TimeOutputs>();
527 extractValue(obs->timeOutputs->timeField, vn::protocol::uart::TimeGroup::TIMEGROUP_TIMESTARTUP, obs->timeOutputs->timeStartup);
528 extractValue(obs->timeOutputs->timeField, vn::protocol::uart::TimeGroup::TIMEGROUP_TIMEGPS, obs->timeOutputs->timeGps);
529 extractValue(obs->timeOutputs->timeField, vn::protocol::uart::TimeGroup::TIMEGROUP_GPSTOW, obs->timeOutputs->gpsTow);
530 extractValue(obs->timeOutputs->timeField, vn::protocol::uart::TimeGroup::TIMEGROUP_GPSWEEK, obs->timeOutputs->gpsWeek);
531 extractValue(obs->timeOutputs->timeField, vn::protocol::uart::TimeGroup::TIMEGROUP_TIMESYNCIN, obs->timeOutputs->timeSyncIn);
532 extractValue(obs->timeOutputs->timeField, vn::protocol::uart::TimeGroup::TIMEGROUP_TIMEGPSPPS, obs->timeOutputs->timePPS);
533 extractValue(obs->timeOutputs->timeField, vn::protocol::uart::TimeGroup::TIMEGROUP_TIMEUTC,
534 obs->timeOutputs->timeUtc.year, obs->timeOutputs->timeUtc.month, obs->timeOutputs->timeUtc.day,
535 obs->timeOutputs->timeUtc.hour, obs->timeOutputs->timeUtc.min, obs->timeOutputs->timeUtc.sec, obs->timeOutputs->timeUtc.ms);
536 extractValue(obs->timeOutputs->timeField, vn::protocol::uart::TimeGroup::TIMEGROUP_SYNCINCNT, obs->timeOutputs->syncInCnt);
537 extractValue(obs->timeOutputs->timeField, vn::protocol::uart::TimeGroup::TIMEGROUP_SYNCOUTCNT, obs->timeOutputs->syncOutCnt);
540 uint8_t utcTimeValid{};
541 extractValue(obs->timeOutputs->timeField, vn::protocol::uart::TimeGroup::TIMEGROUP_TIMESTATUS, timeOk, dateOk, utcTimeValid);
542 if (obs->timeOutputs->timeField & vn::protocol::uart::TimeGroup::TIMEGROUP_TIMESTATUS)
544 obs->timeOutputs->timeStatus =
static_cast<uint8_t
>(timeOk << 0U | dateOk << 1U | utcTimeValid << 2U);
547 if (obs->timeOutputs->timeField == vn::protocol::uart::TimeGroup::TIMEGROUP_NONE) { obs->timeOutputs.reset(); }
552 if (!obs->imuOutputs)
554 obs->imuOutputs = std::make_shared<NAV::vendor::vectornav::ImuOutputs>();
558 extractValue(obs->imuOutputs->imuField, vn::protocol::uart::ImuGroup::IMUGROUP_IMUSTATUS, obs->imuOutputs->imuStatus);
559 extractValue(obs->imuOutputs->imuField, vn::protocol::uart::ImuGroup::IMUGROUP_UNCOMPMAG,
560 obs->imuOutputs->uncompMag.x(), obs->imuOutputs->uncompMag.y(), obs->imuOutputs->uncompMag.z());
561 extractValue(obs->imuOutputs->imuField, vn::protocol::uart::ImuGroup::IMUGROUP_UNCOMPACCEL,
562 obs->imuOutputs->uncompAccel.x(), obs->imuOutputs->uncompAccel.y(), obs->imuOutputs->uncompAccel.z());
563 extractValue(obs->imuOutputs->imuField, vn::protocol::uart::ImuGroup::IMUGROUP_UNCOMPGYRO,
564 obs->imuOutputs->uncompGyro.x(), obs->imuOutputs->uncompGyro.y(), obs->imuOutputs->uncompGyro.z());
565 extractValue(obs->imuOutputs->imuField, vn::protocol::uart::ImuGroup::IMUGROUP_TEMP, obs->imuOutputs->temp);
566 extractValue(obs->imuOutputs->imuField, vn::protocol::uart::ImuGroup::IMUGROUP_PRES, obs->imuOutputs->pres);
567 extractValue(obs->imuOutputs->imuField, vn::protocol::uart::ImuGroup::IMUGROUP_DELTATHETA,
568 obs->imuOutputs->deltaTime, obs->imuOutputs->deltaTheta.x(), obs->imuOutputs->deltaTheta.y(), obs->imuOutputs->deltaTheta.z());
569 extractValue(obs->imuOutputs->imuField, vn::protocol::uart::ImuGroup::IMUGROUP_DELTAVEL,
570 obs->imuOutputs->deltaV.x(), obs->imuOutputs->deltaV.y(), obs->imuOutputs->deltaV.z());
571 extractValue(obs->imuOutputs->imuField, vn::protocol::uart::ImuGroup::IMUGROUP_MAG,
572 obs->imuOutputs->mag.x(), obs->imuOutputs->mag.y(), obs->imuOutputs->mag.z());
573 extractValue(obs->imuOutputs->imuField, vn::protocol::uart::ImuGroup::IMUGROUP_ACCEL,
574 obs->imuOutputs->accel.x(), obs->imuOutputs->accel.y(), obs->imuOutputs->accel.z());
575 extractValue(obs->imuOutputs->imuField, vn::protocol::uart::ImuGroup::IMUGROUP_ANGULARRATE,
576 obs->imuOutputs->angularRate.x(), obs->imuOutputs->angularRate.y(), obs->imuOutputs->angularRate.z());
578 if (obs->imuOutputs->imuField == vn::protocol::uart::ImuGroup::IMUGROUP_NONE) { obs->imuOutputs.reset(); }
583 if (!obs->gnss1Outputs)
585 obs->gnss1Outputs = std::make_shared<NAV::vendor::vectornav::GnssOutputs>();
589 extractValue(obs->gnss1Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_UTC,
590 obs->gnss1Outputs->timeUtc.year, obs->gnss1Outputs->timeUtc.month, obs->gnss1Outputs->timeUtc.day,
591 obs->gnss1Outputs->timeUtc.hour, obs->gnss1Outputs->timeUtc.min, obs->gnss1Outputs->timeUtc.sec, obs->gnss1Outputs->timeUtc.ms);
592 extractValue(obs->gnss1Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_TOW, obs->gnss1Outputs->tow);
593 extractValue(obs->gnss1Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_WEEK, obs->gnss1Outputs->week);
594 extractValue(obs->gnss1Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_NUMSATS, obs->gnss1Outputs->numSats);
595 extractValue(obs->gnss1Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_FIX, obs->gnss1Outputs->fix);
596 extractValue(obs->gnss1Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_POSLLA,
597 obs->gnss1Outputs->posLla.x(), obs->gnss1Outputs->posLla.y(), obs->gnss1Outputs->posLla.z());
598 extractValue(obs->gnss1Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_POSECEF,
599 obs->gnss1Outputs->posEcef.x(), obs->gnss1Outputs->posEcef.y(), obs->gnss1Outputs->posEcef.z());
600 extractValue(obs->gnss1Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_VELNED,
601 obs->gnss1Outputs->velNed.x(), obs->gnss1Outputs->velNed.y(), obs->gnss1Outputs->velNed.z());
602 extractValue(obs->gnss1Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_VELECEF,
603 obs->gnss1Outputs->velEcef.x(), obs->gnss1Outputs->velEcef.y(), obs->gnss1Outputs->velEcef.z());
604 extractValue(obs->gnss1Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_POSU,
605 obs->gnss1Outputs->posU.x(), obs->gnss1Outputs->posU.y(), obs->gnss1Outputs->posU.z());
606 extractValue(obs->gnss1Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_VELU, obs->gnss1Outputs->velU);
607 extractValue(obs->gnss1Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_TIMEU, obs->gnss1Outputs->timeU);
611 uint8_t utcTimeValid{};
612 int8_t leapSeconds{};
613 extractValue(obs->gnss1Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_TIMEINFO, timeOk, dateOk, utcTimeValid, leapSeconds);
614 if (obs->gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_TIMEINFO)
616 obs->gnss1Outputs->timeInfo.status =
static_cast<uint8_t
>(timeOk << 0U | dateOk << 1U | utcTimeValid << 2U);
617 obs->gnss1Outputs->timeInfo.leapSeconds = leapSeconds;
619 extractValue(obs->gnss1Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_DOP,
620 obs->gnss1Outputs->dop.gDop, obs->gnss1Outputs->dop.pDop, obs->gnss1Outputs->dop.tDop, obs->gnss1Outputs->dop.vDop,
621 obs->gnss1Outputs->dop.hDop, obs->gnss1Outputs->dop.nDop, obs->gnss1Outputs->dop.eDop);
623 std::string satellites;
624 bool flag = obs->gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_SATINFO;
625 extractValue(obs->gnss1Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_SATINFO,
626 obs->gnss1Outputs->satInfo.numSats, satellites);
627 if (obs->gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_SATINFO)
629 for (
size_t i = 0; i < obs->gnss1Outputs->satInfo.numSats; i++)
631 satellites = satellites.substr(1);
632 auto sys =
static_cast<int8_t
>(std::stoi(extractRemoveTillDelimiter(satellites,
"|")));
633 auto svId =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
634 auto flagHealthy =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
635 auto flagAlmanac =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
636 auto flagEphemeris =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
637 auto flagDifferentialCorrection =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
638 auto flagUsedForNavigation =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
639 auto flagAzimuthElevationValid =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
640 auto flagUsedForRTK =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
641 auto flags =
static_cast<uint8_t
>(flagHealthy << 0U
643 | flagEphemeris << 2U
644 | flagDifferentialCorrection << 3U
645 | flagUsedForNavigation << 4U
646 | flagAzimuthElevationValid << 5U
647 | flagUsedForRTK << 6U);
648 auto cno =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
649 auto qi =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
650 auto el =
static_cast<int8_t
>(std::stoi(extractRemoveTillDelimiter(satellites,
"|")));
651 auto az =
static_cast<int16_t
>(std::stoi(extractRemoveTillDelimiter(satellites,
"]")));
652 obs->gnss1Outputs->satInfo.satellites.emplace_back(sys, svId, flags, cno, qi, el, az);
655 if (flag && satellites.empty() && !(obs->gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_SATINFO))
657 obs->gnss1Outputs->gnssField |= vn::protocol::uart::GpsGroup::GPSGROUP_SATINFO;
661 flag = obs->gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_RAWMEAS;
662 extractValue(obs->gnss1Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_RAWMEAS,
663 obs->gnss1Outputs->raw.tow, obs->gnss1Outputs->raw.week, obs->gnss1Outputs->raw.numSats, satellites);
664 if (obs->gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_RAWMEAS)
666 for (
size_t i = 0; i < obs->gnss1Outputs->raw.numSats; i++)
668 satellites = satellites.substr(1);
669 auto sys =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
670 auto svId =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
671 auto freq =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
672 auto chan =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
673 auto slot =
static_cast<int8_t
>(std::stoi(extractRemoveTillDelimiter(satellites,
"|")));
674 auto cno =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
675 auto flagSearching =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
676 auto flagTracking =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
677 auto flagTimeValid =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
678 auto flagCodeLock =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
679 auto flagPhaseLock =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
680 auto flagPhaseHalfAmbiguity =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
681 auto flagPhaseHalfSub =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
682 auto flagPhaseSlip =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
683 auto flagPseudorangeSmoothed =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
684 auto flags =
static_cast<uint16_t
>(flagSearching << 0U
686 | flagTimeValid << 2U
688 | flagPhaseLock << 4U
689 | flagPhaseHalfAmbiguity << 5U
690 | flagPhaseHalfSub << 6U
691 | flagPhaseSlip << 7U
692 | flagPseudorangeSmoothed << 8U);
693 auto pr = std::stod(extractRemoveTillDelimiter(satellites,
"|"));
694 auto cp = std::stod(extractRemoveTillDelimiter(satellites,
"|"));
695 auto dp = std::stof(extractRemoveTillDelimiter(satellites,
"]"));
696 obs->gnss1Outputs->raw.satellites.emplace_back(sys, svId, freq, chan, slot, cno, flags, pr, cp, dp);
699 if (flag && satellites.empty() && !(obs->gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_RAWMEAS))
701 obs->gnss1Outputs->gnssField |= vn::protocol::uart::GpsGroup::GPSGROUP_RAWMEAS;
704 if (obs->gnss1Outputs->gnssField == vn::protocol::uart::GpsGroup::GPSGROUP_NONE) { obs->gnss1Outputs.reset(); }
709 if (!obs->attitudeOutputs)
711 obs->attitudeOutputs = std::make_shared<NAV::vendor::vectornav::AttitudeOutputs>();
715 uint16_t vpeStatus{};
716 extractValue(obs->attitudeOutputs->attitudeField, vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_VPESTATUS, vpeStatus);
717 obs->attitudeOutputs->vpeStatus = vpeStatus;
718 extractValue(obs->attitudeOutputs->attitudeField, vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_YAWPITCHROLL,
719 obs->attitudeOutputs->ypr.x(), obs->attitudeOutputs->ypr.y(), obs->attitudeOutputs->ypr.z());
720 extractValue(obs->attitudeOutputs->attitudeField, vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_QUATERNION,
721 obs->attitudeOutputs->qtn.w(), obs->attitudeOutputs->qtn.x(), obs->attitudeOutputs->qtn.y(), obs->attitudeOutputs->qtn.z());
722 extractValue(obs->attitudeOutputs->attitudeField, vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_DCM,
723 obs->attitudeOutputs->dcm(0, 0), obs->attitudeOutputs->dcm(0, 1), obs->attitudeOutputs->dcm(0, 2),
724 obs->attitudeOutputs->dcm(1, 0), obs->attitudeOutputs->dcm(1, 1), obs->attitudeOutputs->dcm(1, 2),
725 obs->attitudeOutputs->dcm(2, 0), obs->attitudeOutputs->dcm(2, 1), obs->attitudeOutputs->dcm(2, 2));
726 extractValue(obs->attitudeOutputs->attitudeField, vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_MAGNED,
727 obs->attitudeOutputs->magNed.x(), obs->attitudeOutputs->magNed.y(), obs->attitudeOutputs->magNed.z());
728 extractValue(obs->attitudeOutputs->attitudeField, vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_ACCELNED,
729 obs->attitudeOutputs->accelNed.x(), obs->attitudeOutputs->accelNed.y(), obs->attitudeOutputs->accelNed.z());
730 extractValue(obs->attitudeOutputs->attitudeField, vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_LINEARACCELBODY,
731 obs->attitudeOutputs->linearAccelBody.x(), obs->attitudeOutputs->linearAccelBody.y(), obs->attitudeOutputs->linearAccelBody.z());
732 extractValue(obs->attitudeOutputs->attitudeField, vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_LINEARACCELNED,
733 obs->attitudeOutputs->linearAccelNed.x(), obs->attitudeOutputs->linearAccelNed.y(), obs->attitudeOutputs->linearAccelNed.z());
734 extractValue(obs->attitudeOutputs->attitudeField, vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_YPRU,
735 obs->attitudeOutputs->yprU.x(), obs->attitudeOutputs->yprU.y(), obs->attitudeOutputs->yprU.z());
737 if (obs->attitudeOutputs->attitudeField == vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_NONE) { obs->attitudeOutputs.reset(); }
742 if (!obs->insOutputs)
744 obs->insOutputs = std::make_shared<NAV::vendor::vectornav::InsOutputs>();
751 uint8_t errorMagPres{};
753 uint8_t gpsHeadingIns{};
754 uint8_t gpsCompass{};
755 extractValue(obs->insOutputs->insField, vn::protocol::uart::InsGroup::INSGROUP_INSSTATUS,
756 mode, gpsFix, errorImu, errorMagPres, errorGnss, gpsHeadingIns, gpsCompass);
757 if (obs->insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_INSSTATUS)
759 obs->insOutputs->insStatus.status() =
static_cast<uint16_t
>(mode << 0U | gpsFix << 2U
760 | errorImu << 4U | errorMagPres << 5U | errorGnss << 6U
761 | gpsHeadingIns << 8U | gpsCompass << 9U);
763 extractValue(obs->insOutputs->insField, vn::protocol::uart::InsGroup::INSGROUP_POSLLA,
764 obs->insOutputs->posLla.x(), obs->insOutputs->posLla.y(), obs->insOutputs->posLla.z());
765 extractValue(obs->insOutputs->insField, vn::protocol::uart::InsGroup::INSGROUP_POSECEF,
766 obs->insOutputs->posEcef.x(), obs->insOutputs->posEcef.y(), obs->insOutputs->posEcef.z());
767 extractValue(obs->insOutputs->insField, vn::protocol::uart::InsGroup::INSGROUP_VELBODY,
768 obs->insOutputs->velBody.x(), obs->insOutputs->velBody.y(), obs->insOutputs->velBody.z());
769 extractValue(obs->insOutputs->insField, vn::protocol::uart::InsGroup::INSGROUP_VELNED,
770 obs->insOutputs->velNed.x(), obs->insOutputs->velNed.y(), obs->insOutputs->velNed.z());
771 extractValue(obs->insOutputs->insField, vn::protocol::uart::InsGroup::INSGROUP_VELECEF,
772 obs->insOutputs->velEcef.x(), obs->insOutputs->velEcef.y(), obs->insOutputs->velEcef.z());
773 extractValue(obs->insOutputs->insField, vn::protocol::uart::InsGroup::INSGROUP_MAGECEF,
774 obs->insOutputs->magEcef.x(), obs->insOutputs->magEcef.y(), obs->insOutputs->magEcef.z());
775 extractValue(obs->insOutputs->insField, vn::protocol::uart::InsGroup::INSGROUP_ACCELECEF,
776 obs->insOutputs->accelEcef.x(), obs->insOutputs->accelEcef.y(), obs->insOutputs->accelEcef.z());
777 extractValue(obs->insOutputs->insField, vn::protocol::uart::InsGroup::INSGROUP_LINEARACCELECEF,
778 obs->insOutputs->linearAccelEcef.x(), obs->insOutputs->linearAccelEcef.y(), obs->insOutputs->linearAccelEcef.z());
779 extractValue(obs->insOutputs->insField, vn::protocol::uart::InsGroup::INSGROUP_POSU, obs->insOutputs->posU);
780 extractValue(obs->insOutputs->insField, vn::protocol::uart::InsGroup::INSGROUP_VELU, obs->insOutputs->velU);
782 if (obs->insOutputs->insField == vn::protocol::uart::InsGroup::INSGROUP_NONE) { obs->insOutputs.reset(); }
787 if (!obs->gnss2Outputs)
789 obs->gnss2Outputs = std::make_shared<NAV::vendor::vectornav::GnssOutputs>();
793 extractValue(obs->gnss2Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_UTC,
794 obs->gnss2Outputs->timeUtc.year, obs->gnss2Outputs->timeUtc.month, obs->gnss2Outputs->timeUtc.day,
795 obs->gnss2Outputs->timeUtc.hour, obs->gnss2Outputs->timeUtc.min, obs->gnss2Outputs->timeUtc.sec, obs->gnss2Outputs->timeUtc.ms);
796 extractValue(obs->gnss2Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_TOW, obs->gnss2Outputs->tow);
797 extractValue(obs->gnss2Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_WEEK, obs->gnss2Outputs->week);
798 extractValue(obs->gnss2Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_NUMSATS, obs->gnss2Outputs->numSats);
799 extractValue(obs->gnss2Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_FIX, obs->gnss2Outputs->fix);
800 extractValue(obs->gnss2Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_POSLLA,
801 obs->gnss2Outputs->posLla.x(), obs->gnss2Outputs->posLla.y(), obs->gnss2Outputs->posLla.z());
802 extractValue(obs->gnss2Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_POSECEF,
803 obs->gnss2Outputs->posEcef.x(), obs->gnss2Outputs->posEcef.y(), obs->gnss2Outputs->posEcef.z());
804 extractValue(obs->gnss2Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_VELNED,
805 obs->gnss2Outputs->velNed.x(), obs->gnss2Outputs->velNed.y(), obs->gnss2Outputs->velNed.z());
806 extractValue(obs->gnss2Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_VELECEF,
807 obs->gnss2Outputs->velEcef.x(), obs->gnss2Outputs->velEcef.y(), obs->gnss2Outputs->velEcef.z());
808 extractValue(obs->gnss2Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_POSU,
809 obs->gnss2Outputs->posU.x(), obs->gnss2Outputs->posU.y(), obs->gnss2Outputs->posU.z());
810 extractValue(obs->gnss2Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_VELU, obs->gnss2Outputs->velU);
811 extractValue(obs->gnss2Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_TIMEU, obs->gnss2Outputs->timeU);
815 uint8_t utcTimeValid{};
816 int8_t leapSeconds{};
817 extractValue(obs->gnss2Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_TIMEINFO, timeOk, dateOk, utcTimeValid, leapSeconds);
818 if (obs->gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_TIMEINFO)
820 obs->gnss2Outputs->timeInfo.status =
static_cast<uint8_t
>(timeOk << 0U | dateOk << 1U | utcTimeValid << 2U);
821 obs->gnss2Outputs->timeInfo.leapSeconds = leapSeconds;
823 extractValue(obs->gnss2Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_DOP,
824 obs->gnss2Outputs->dop.gDop, obs->gnss2Outputs->dop.pDop, obs->gnss2Outputs->dop.tDop, obs->gnss2Outputs->dop.vDop,
825 obs->gnss2Outputs->dop.hDop, obs->gnss2Outputs->dop.nDop, obs->gnss2Outputs->dop.eDop);
827 std::string satellites;
828 bool flag = obs->gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_SATINFO;
829 extractValue(obs->gnss2Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_SATINFO,
830 obs->gnss2Outputs->satInfo.numSats, satellites);
831 if (obs->gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_SATINFO)
833 for (
size_t i = 0; i < obs->gnss2Outputs->satInfo.numSats; i++)
835 satellites = satellites.substr(1);
836 auto sys =
static_cast<int8_t
>(std::stoi(extractRemoveTillDelimiter(satellites,
"|")));
837 auto svId =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
838 auto flagHealthy =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
839 auto flagAlmanac =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
840 auto flagEphemeris =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
841 auto flagDifferentialCorrection =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
842 auto flagUsedForNavigation =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
843 auto flagAzimuthElevationValid =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
844 auto flagUsedForRTK =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
845 auto flags =
static_cast<uint8_t
>(flagHealthy << 0U
847 | flagEphemeris << 2U
848 | flagDifferentialCorrection << 3U
849 | flagUsedForNavigation << 4U
850 | flagAzimuthElevationValid << 5U
851 | flagUsedForRTK << 6U);
852 auto cno =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
853 auto qi =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
854 auto el =
static_cast<int8_t
>(std::stoi(extractRemoveTillDelimiter(satellites,
"|")));
855 auto az =
static_cast<int16_t
>(std::stoi(extractRemoveTillDelimiter(satellites,
"]")));
856 obs->gnss2Outputs->satInfo.satellites.emplace_back(sys, svId, flags, cno, qi, el, az);
859 if (flag && satellites.empty() && !(obs->gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_SATINFO))
861 obs->gnss2Outputs->gnssField |= vn::protocol::uart::GpsGroup::GPSGROUP_SATINFO;
865 flag = obs->gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_RAWMEAS;
866 extractValue(obs->gnss2Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_RAWMEAS,
867 obs->gnss2Outputs->raw.tow, obs->gnss2Outputs->raw.week, obs->gnss2Outputs->raw.numSats, satellites);
868 if (obs->gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_RAWMEAS)
870 for (
size_t i = 0; i < obs->gnss2Outputs->raw.numSats; i++)
872 satellites = satellites.substr(1);
873 auto sys =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
874 auto svId =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
875 auto freq =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
876 auto chan =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
877 auto slot =
static_cast<int8_t
>(std::stoi(extractRemoveTillDelimiter(satellites,
"|")));
878 auto cno =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
879 auto flagSearching =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
880 auto flagTracking =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
881 auto flagTimeValid =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
882 auto flagCodeLock =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
883 auto flagPhaseLock =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
884 auto flagPhaseHalfAmbiguity =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
885 auto flagPhaseHalfSub =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
886 auto flagPhaseSlip =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
887 auto flagPseudorangeSmoothed =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
888 auto flags =
static_cast<uint16_t
>(flagSearching << 0U
890 | flagTimeValid << 2U
892 | flagPhaseLock << 4U
893 | flagPhaseHalfAmbiguity << 5U
894 | flagPhaseHalfSub << 6U
895 | flagPhaseSlip << 7U
896 | flagPseudorangeSmoothed << 8U);
897 auto pr = std::stod(extractRemoveTillDelimiter(satellites,
"|"));
898 auto cp = std::stod(extractRemoveTillDelimiter(satellites,
"|"));
899 auto dp = std::stof(extractRemoveTillDelimiter(satellites,
"]"));
900 obs->gnss2Outputs->raw.satellites.emplace_back(sys, svId, freq, chan, slot, cno, flags, pr, cp, dp);
903 if (flag && satellites.empty() && !(obs->gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_RAWMEAS))
905 obs->gnss2Outputs->gnssField |= vn::protocol::uart::GpsGroup::GPSGROUP_RAWMEAS;
908 if (obs->gnss2Outputs->gnssField == vn::protocol::uart::GpsGroup::GPSGROUP_NONE) { obs->gnss2Outputs.reset(); }
911 catch (
const std::exception& e)
919 auto readFromFilestream = [&,
this](
char* __s, std::streamsize __n) {
923 throw std::runtime_error(
"End of file reached");
929 int32_t gpsCycle = 0;
932 readFromFilestream(
reinterpret_cast<char*
>(&gpsCycle),
sizeof(gpsCycle));
933 readFromFilestream(
reinterpret_cast<char*
>(&gpsWeek),
sizeof(gpsWeek));
934 readFromFilestream(
reinterpret_cast<char*
>(&tow),
sizeof(tow));
935 if (gpsCycle || gpsWeek)
937 obs->insTime =
InsTime(gpsCycle, gpsWeek, tow);
943 if (!obs->timeOutputs)
945 obs->timeOutputs = std::make_shared<NAV::vendor::vectornav::TimeOutputs>();
949 if (obs->timeOutputs->timeField & vn::protocol::uart::TimeGroup::TIMEGROUP_TIMESTARTUP)
951 read(
reinterpret_cast<char*
>(&obs->timeOutputs->timeStartup),
sizeof(obs->timeOutputs->timeStartup));
953 if (obs->timeOutputs->timeField & vn::protocol::uart::TimeGroup::TIMEGROUP_TIMEGPS)
955 read(
reinterpret_cast<char*
>(&obs->timeOutputs->timeGps),
sizeof(obs->timeOutputs->timeGps));
957 if (obs->timeOutputs->timeField & vn::protocol::uart::TimeGroup::TIMEGROUP_GPSTOW)
959 read(
reinterpret_cast<char*
>(&obs->timeOutputs->gpsTow),
sizeof(obs->timeOutputs->gpsTow));
961 if (obs->timeOutputs->timeField & vn::protocol::uart::TimeGroup::TIMEGROUP_GPSWEEK)
963 read(
reinterpret_cast<char*
>(&obs->timeOutputs->gpsWeek),
sizeof(obs->timeOutputs->gpsWeek));
965 if (obs->timeOutputs->timeField & vn::protocol::uart::TimeGroup::TIMEGROUP_TIMESYNCIN)
967 read(
reinterpret_cast<char*
>(&obs->timeOutputs->timeSyncIn),
sizeof(obs->timeOutputs->timeSyncIn));
969 if (obs->timeOutputs->timeField & vn::protocol::uart::TimeGroup::TIMEGROUP_TIMEGPSPPS)
971 read(
reinterpret_cast<char*
>(&obs->timeOutputs->timePPS),
sizeof(obs->timeOutputs->timePPS));
973 if (obs->timeOutputs->timeField & vn::protocol::uart::TimeGroup::TIMEGROUP_TIMEUTC)
975 read(
reinterpret_cast<char*
>(&obs->timeOutputs->timeUtc.year),
sizeof(obs->timeOutputs->timeUtc.year));
976 read(
reinterpret_cast<char*
>(&obs->timeOutputs->timeUtc.month),
sizeof(obs->timeOutputs->timeUtc.month));
977 read(
reinterpret_cast<char*
>(&obs->timeOutputs->timeUtc.day),
sizeof(obs->timeOutputs->timeUtc.day));
978 read(
reinterpret_cast<char*
>(&obs->timeOutputs->timeUtc.hour),
sizeof(obs->timeOutputs->timeUtc.hour));
979 read(
reinterpret_cast<char*
>(&obs->timeOutputs->timeUtc.min),
sizeof(obs->timeOutputs->timeUtc.min));
980 read(
reinterpret_cast<char*
>(&obs->timeOutputs->timeUtc.sec),
sizeof(obs->timeOutputs->timeUtc.sec));
981 read(
reinterpret_cast<char*
>(&obs->timeOutputs->timeUtc.ms),
sizeof(obs->timeOutputs->timeUtc.ms));
983 if (obs->timeOutputs->timeField & vn::protocol::uart::TimeGroup::TIMEGROUP_SYNCINCNT)
985 read(
reinterpret_cast<char*
>(&obs->timeOutputs->syncInCnt),
sizeof(obs->timeOutputs->syncInCnt));
987 if (obs->timeOutputs->timeField & vn::protocol::uart::TimeGroup::TIMEGROUP_SYNCOUTCNT)
989 read(
reinterpret_cast<char*
>(&obs->timeOutputs->syncOutCnt),
sizeof(obs->timeOutputs->syncOutCnt));
991 if (obs->timeOutputs->timeField & vn::protocol::uart::TimeGroup::TIMEGROUP_TIMESTATUS)
993 read(
reinterpret_cast<char*
>(&obs->timeOutputs->timeStatus.status()),
sizeof(obs->timeOutputs->timeStatus.status()));
999 if (!obs->imuOutputs)
1001 obs->imuOutputs = std::make_shared<NAV::vendor::vectornav::ImuOutputs>();
1005 if (obs->imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_IMUSTATUS)
1007 read(
reinterpret_cast<char*
>(&obs->imuOutputs->imuStatus),
sizeof(obs->imuOutputs->imuStatus));
1009 if (obs->imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_UNCOMPMAG)
1011 read(
reinterpret_cast<char*
>(obs->imuOutputs->uncompMag.data()),
sizeof(obs->imuOutputs->uncompMag));
1013 if (obs->imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_UNCOMPACCEL)
1015 read(
reinterpret_cast<char*
>(obs->imuOutputs->uncompAccel.data()),
sizeof(obs->imuOutputs->uncompAccel));
1017 if (obs->imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_UNCOMPGYRO)
1019 read(
reinterpret_cast<char*
>(obs->imuOutputs->uncompGyro.data()),
sizeof(obs->imuOutputs->uncompGyro));
1021 if (obs->imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_TEMP)
1023 read(
reinterpret_cast<char*
>(&obs->imuOutputs->temp),
sizeof(obs->imuOutputs->temp));
1025 if (obs->imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_PRES)
1027 read(
reinterpret_cast<char*
>(&obs->imuOutputs->pres),
sizeof(obs->imuOutputs->pres));
1029 if (obs->imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_DELTATHETA)
1031 read(
reinterpret_cast<char*
>(&obs->imuOutputs->deltaTime),
sizeof(obs->imuOutputs->deltaTime));
1032 read(
reinterpret_cast<char*
>(obs->imuOutputs->deltaTheta.data()),
sizeof(obs->imuOutputs->deltaTheta));
1034 if (obs->imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_DELTAVEL)
1036 read(
reinterpret_cast<char*
>(obs->imuOutputs->deltaV.data()),
sizeof(obs->imuOutputs->deltaV));
1038 if (obs->imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_MAG)
1040 read(
reinterpret_cast<char*
>(obs->imuOutputs->mag.data()),
sizeof(obs->imuOutputs->mag));
1042 if (obs->imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_ACCEL)
1044 read(
reinterpret_cast<char*
>(obs->imuOutputs->accel.data()),
sizeof(obs->imuOutputs->accel));
1046 if (obs->imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_ANGULARRATE)
1048 read(
reinterpret_cast<char*
>(obs->imuOutputs->angularRate.data()),
sizeof(obs->imuOutputs->angularRate));
1054 if (!obs->gnss1Outputs)
1056 obs->gnss1Outputs = std::make_shared<NAV::vendor::vectornav::GnssOutputs>();
1060 if (obs->gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_UTC)
1062 read(
reinterpret_cast<char*
>(&obs->gnss1Outputs->timeUtc.year),
sizeof(obs->gnss1Outputs->timeUtc.year));
1063 read(
reinterpret_cast<char*
>(&obs->gnss1Outputs->timeUtc.month),
sizeof(obs->gnss1Outputs->timeUtc.month));
1064 read(
reinterpret_cast<char*
>(&obs->gnss1Outputs->timeUtc.day),
sizeof(obs->gnss1Outputs->timeUtc.day));
1065 read(
reinterpret_cast<char*
>(&obs->gnss1Outputs->timeUtc.hour),
sizeof(obs->gnss1Outputs->timeUtc.hour));
1066 read(
reinterpret_cast<char*
>(&obs->gnss1Outputs->timeUtc.min),
sizeof(obs->gnss1Outputs->timeUtc.min));
1067 read(
reinterpret_cast<char*
>(&obs->gnss1Outputs->timeUtc.sec),
sizeof(obs->gnss1Outputs->timeUtc.sec));
1068 read(
reinterpret_cast<char*
>(&obs->gnss1Outputs->timeUtc.ms),
sizeof(obs->gnss1Outputs->timeUtc.ms));
1070 if (obs->gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_TOW)
1072 read(
reinterpret_cast<char*
>(&obs->gnss1Outputs->tow),
sizeof(obs->gnss1Outputs->tow));
1074 if (obs->gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_WEEK)
1076 read(
reinterpret_cast<char*
>(&obs->gnss1Outputs->week),
sizeof(obs->gnss1Outputs->week));
1078 if (obs->gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_NUMSATS)
1080 read(
reinterpret_cast<char*
>(&obs->gnss1Outputs->numSats),
sizeof(obs->gnss1Outputs->numSats));
1082 if (obs->gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_FIX)
1084 read(
reinterpret_cast<char*
>(&obs->gnss1Outputs->fix),
sizeof(obs->gnss1Outputs->fix));
1086 if (obs->gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_POSLLA)
1088 read(
reinterpret_cast<char*
>(obs->gnss1Outputs->posLla.data()),
sizeof(obs->gnss1Outputs->posLla));
1090 if (obs->gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_POSECEF)
1092 read(
reinterpret_cast<char*
>(obs->gnss1Outputs->posEcef.data()),
sizeof(obs->gnss1Outputs->posEcef));
1094 if (obs->gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_VELNED)
1096 read(
reinterpret_cast<char*
>(obs->gnss1Outputs->velNed.data()),
sizeof(obs->gnss1Outputs->velNed));
1098 if (obs->gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_VELECEF)
1100 read(
reinterpret_cast<char*
>(obs->gnss1Outputs->velEcef.data()),
sizeof(obs->gnss1Outputs->velEcef));
1102 if (obs->gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_POSU)
1104 read(
reinterpret_cast<char*
>(obs->gnss1Outputs->posU.data()),
sizeof(obs->gnss1Outputs->posU));
1106 if (obs->gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_VELU)
1108 read(
reinterpret_cast<char*
>(&obs->gnss1Outputs->velU),
sizeof(obs->gnss1Outputs->velU));
1110 if (obs->gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_TIMEU)
1112 read(
reinterpret_cast<char*
>(&obs->gnss1Outputs->timeU),
sizeof(obs->gnss1Outputs->timeU));
1114 if (obs->gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_TIMEINFO)
1116 read(
reinterpret_cast<char*
>(&obs->gnss1Outputs->timeInfo.status.status()),
sizeof(obs->gnss1Outputs->timeInfo.status.status()));
1117 read(
reinterpret_cast<char*
>(&obs->gnss1Outputs->timeInfo.leapSeconds),
sizeof(obs->gnss1Outputs->timeInfo.leapSeconds));
1119 if (obs->gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_DOP)
1121 read(
reinterpret_cast<char*
>(&obs->gnss1Outputs->dop.gDop),
sizeof(obs->gnss1Outputs->dop.gDop));
1122 read(
reinterpret_cast<char*
>(&obs->gnss1Outputs->dop.pDop),
sizeof(obs->gnss1Outputs->dop.pDop));
1123 read(
reinterpret_cast<char*
>(&obs->gnss1Outputs->dop.tDop),
sizeof(obs->gnss1Outputs->dop.tDop));
1124 read(
reinterpret_cast<char*
>(&obs->gnss1Outputs->dop.vDop),
sizeof(obs->gnss1Outputs->dop.vDop));
1125 read(
reinterpret_cast<char*
>(&obs->gnss1Outputs->dop.hDop),
sizeof(obs->gnss1Outputs->dop.hDop));
1126 read(
reinterpret_cast<char*
>(&obs->gnss1Outputs->dop.nDop),
sizeof(obs->gnss1Outputs->dop.nDop));
1127 read(
reinterpret_cast<char*
>(&obs->gnss1Outputs->dop.eDop),
sizeof(obs->gnss1Outputs->dop.eDop));
1129 if (obs->gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_SATINFO)
1131 read(
reinterpret_cast<char*
>(&obs->gnss1Outputs->satInfo.numSats),
sizeof(obs->gnss1Outputs->satInfo.numSats));
1132 obs->gnss1Outputs->satInfo.satellites.resize(obs->gnss1Outputs->satInfo.numSats);
1134 for (
auto& satellite : obs->gnss1Outputs->satInfo.satellites)
1136 read(
reinterpret_cast<char*
>(&satellite.sys),
sizeof(satellite.sys));
1137 read(
reinterpret_cast<char*
>(&satellite.svId),
sizeof(satellite.svId));
1138 read(
reinterpret_cast<char*
>(&satellite.flags),
sizeof(satellite.flags));
1139 read(
reinterpret_cast<char*
>(&satellite.cno),
sizeof(satellite.cno));
1140 read(
reinterpret_cast<char*
>(&satellite.qi),
sizeof(satellite.qi));
1141 read(
reinterpret_cast<char*
>(&satellite.el),
sizeof(satellite.el));
1142 read(
reinterpret_cast<char*
>(&satellite.az),
sizeof(satellite.az));
1145 if (obs->gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_RAWMEAS)
1147 read(
reinterpret_cast<char*
>(&obs->gnss1Outputs->raw.tow),
sizeof(obs->gnss1Outputs->raw.tow));
1148 read(
reinterpret_cast<char*
>(&obs->gnss1Outputs->raw.week),
sizeof(obs->gnss1Outputs->raw.week));
1149 read(
reinterpret_cast<char*
>(&obs->gnss1Outputs->raw.numSats),
sizeof(obs->gnss1Outputs->raw.numSats));
1150 obs->gnss1Outputs->raw.satellites.resize(obs->gnss1Outputs->raw.numSats);
1152 for (
auto& satellite : obs->gnss1Outputs->raw.satellites)
1154 read(
reinterpret_cast<char*
>(&satellite.sys),
sizeof(satellite.sys));
1155 read(
reinterpret_cast<char*
>(&satellite.svId),
sizeof(satellite.svId));
1156 read(
reinterpret_cast<char*
>(&satellite.freq),
sizeof(satellite.freq));
1157 read(
reinterpret_cast<char*
>(&satellite.chan),
sizeof(satellite.chan));
1158 read(
reinterpret_cast<char*
>(&satellite.slot),
sizeof(satellite.slot));
1159 read(
reinterpret_cast<char*
>(&satellite.cno),
sizeof(satellite.cno));
1160 read(
reinterpret_cast<char*
>(&satellite.flags),
sizeof(satellite.flags));
1161 read(
reinterpret_cast<char*
>(&satellite.pr),
sizeof(satellite.pr));
1162 read(
reinterpret_cast<char*
>(&satellite.cp),
sizeof(satellite.cp));
1163 read(
reinterpret_cast<char*
>(&satellite.dp),
sizeof(satellite.dp));
1170 if (!obs->attitudeOutputs)
1172 obs->attitudeOutputs = std::make_shared<NAV::vendor::vectornav::AttitudeOutputs>();
1176 if (obs->attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_VPESTATUS)
1178 read(
reinterpret_cast<char*
>(&obs->attitudeOutputs->vpeStatus.status()),
sizeof(obs->attitudeOutputs->vpeStatus.status()));
1180 if (obs->attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_YAWPITCHROLL)
1182 read(
reinterpret_cast<char*
>(obs->attitudeOutputs->ypr.data()),
sizeof(obs->attitudeOutputs->ypr));
1184 if (obs->attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_QUATERNION)
1186 read(
reinterpret_cast<char*
>(obs->attitudeOutputs->qtn.coeffs().data()),
sizeof(obs->attitudeOutputs->qtn));
1188 if (obs->attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_DCM)
1190 read(
reinterpret_cast<char*
>(obs->attitudeOutputs->dcm.data()),
sizeof(obs->attitudeOutputs->dcm));
1192 if (obs->attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_MAGNED)
1194 read(
reinterpret_cast<char*
>(obs->attitudeOutputs->magNed.data()),
sizeof(obs->attitudeOutputs->magNed));
1196 if (obs->attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_ACCELNED)
1198 read(
reinterpret_cast<char*
>(obs->attitudeOutputs->accelNed.data()),
sizeof(obs->attitudeOutputs->accelNed));
1200 if (obs->attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_LINEARACCELBODY)
1202 read(
reinterpret_cast<char*
>(obs->attitudeOutputs->linearAccelBody.data()),
sizeof(obs->attitudeOutputs->linearAccelBody));
1204 if (obs->attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_LINEARACCELNED)
1206 read(
reinterpret_cast<char*
>(obs->attitudeOutputs->linearAccelNed.data()),
sizeof(obs->attitudeOutputs->linearAccelNed));
1208 if (obs->attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_YPRU)
1210 read(
reinterpret_cast<char*
>(obs->attitudeOutputs->yprU.data()),
sizeof(obs->attitudeOutputs->yprU));
1216 if (!obs->insOutputs)
1218 obs->insOutputs = std::make_shared<NAV::vendor::vectornav::InsOutputs>();
1222 if (obs->insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_INSSTATUS)
1224 read(
reinterpret_cast<char*
>(&obs->insOutputs->insStatus.status()),
sizeof(obs->insOutputs->insStatus.status()));
1226 if (obs->insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_POSLLA)
1228 read(
reinterpret_cast<char*
>(obs->insOutputs->posLla.data()),
sizeof(obs->insOutputs->posLla));
1230 if (obs->insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_POSECEF)
1232 read(
reinterpret_cast<char*
>(obs->insOutputs->posEcef.data()),
sizeof(obs->insOutputs->posEcef));
1234 if (obs->insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_VELBODY)
1236 read(
reinterpret_cast<char*
>(obs->insOutputs->velBody.data()),
sizeof(obs->insOutputs->velBody));
1238 if (obs->insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_VELNED)
1240 read(
reinterpret_cast<char*
>(obs->insOutputs->velNed.data()),
sizeof(obs->insOutputs->velNed));
1242 if (obs->insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_VELECEF)
1244 read(
reinterpret_cast<char*
>(obs->insOutputs->velEcef.data()),
sizeof(obs->insOutputs->velEcef));
1246 if (obs->insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_MAGECEF)
1248 read(
reinterpret_cast<char*
>(obs->insOutputs->magEcef.data()),
sizeof(obs->insOutputs->magEcef));
1250 if (obs->insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_ACCELECEF)
1252 read(
reinterpret_cast<char*
>(obs->insOutputs->accelEcef.data()),
sizeof(obs->insOutputs->accelEcef));
1254 if (obs->insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_LINEARACCELECEF)
1256 read(
reinterpret_cast<char*
>(obs->insOutputs->linearAccelEcef.data()),
sizeof(obs->insOutputs->linearAccelEcef));
1258 if (obs->insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_POSU)
1260 read(
reinterpret_cast<char*
>(&obs->insOutputs->posU),
sizeof(obs->insOutputs->posU));
1262 if (obs->insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_VELU)
1264 read(
reinterpret_cast<char*
>(&obs->insOutputs->velU),
sizeof(obs->insOutputs->velU));
1270 if (!obs->gnss2Outputs)
1272 obs->gnss2Outputs = std::make_shared<NAV::vendor::vectornav::GnssOutputs>();
1276 if (obs->gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_UTC)
1278 read(
reinterpret_cast<char*
>(&obs->gnss2Outputs->timeUtc.year),
sizeof(obs->gnss2Outputs->timeUtc.year));
1279 read(
reinterpret_cast<char*
>(&obs->gnss2Outputs->timeUtc.month),
sizeof(obs->gnss2Outputs->timeUtc.month));
1280 read(
reinterpret_cast<char*
>(&obs->gnss2Outputs->timeUtc.day),
sizeof(obs->gnss2Outputs->timeUtc.day));
1281 read(
reinterpret_cast<char*
>(&obs->gnss2Outputs->timeUtc.hour),
sizeof(obs->gnss2Outputs->timeUtc.hour));
1282 read(
reinterpret_cast<char*
>(&obs->gnss2Outputs->timeUtc.min),
sizeof(obs->gnss2Outputs->timeUtc.min));
1283 read(
reinterpret_cast<char*
>(&obs->gnss2Outputs->timeUtc.sec),
sizeof(obs->gnss2Outputs->timeUtc.sec));
1284 read(
reinterpret_cast<char*
>(&obs->gnss2Outputs->timeUtc.ms),
sizeof(obs->gnss2Outputs->timeUtc.ms));
1286 if (obs->gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_TOW)
1288 read(
reinterpret_cast<char*
>(&obs->gnss2Outputs->tow),
sizeof(obs->gnss2Outputs->tow));
1290 if (obs->gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_WEEK)
1292 read(
reinterpret_cast<char*
>(&obs->gnss2Outputs->week),
sizeof(obs->gnss2Outputs->week));
1294 if (obs->gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_NUMSATS)
1296 read(
reinterpret_cast<char*
>(&obs->gnss2Outputs->numSats),
sizeof(obs->gnss2Outputs->numSats));
1298 if (obs->gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_FIX)
1300 read(
reinterpret_cast<char*
>(&obs->gnss2Outputs->fix),
sizeof(obs->gnss2Outputs->fix));
1302 if (obs->gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_POSLLA)
1304 read(
reinterpret_cast<char*
>(obs->gnss2Outputs->posLla.data()),
sizeof(obs->gnss2Outputs->posLla));
1306 if (obs->gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_POSECEF)
1308 read(
reinterpret_cast<char*
>(obs->gnss2Outputs->posEcef.data()),
sizeof(obs->gnss2Outputs->posEcef));
1310 if (obs->gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_VELNED)
1312 read(
reinterpret_cast<char*
>(obs->gnss2Outputs->velNed.data()),
sizeof(obs->gnss2Outputs->velNed));
1314 if (obs->gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_VELECEF)
1316 read(
reinterpret_cast<char*
>(obs->gnss2Outputs->velEcef.data()),
sizeof(obs->gnss2Outputs->velEcef));
1318 if (obs->gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_POSU)
1320 read(
reinterpret_cast<char*
>(obs->gnss2Outputs->posU.data()),
sizeof(obs->gnss2Outputs->posU));
1322 if (obs->gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_VELU)
1324 read(
reinterpret_cast<char*
>(&obs->gnss2Outputs->velU),
sizeof(obs->gnss2Outputs->velU));
1326 if (obs->gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_TIMEU)
1328 read(
reinterpret_cast<char*
>(&obs->gnss2Outputs->timeU),
sizeof(obs->gnss2Outputs->timeU));
1330 if (obs->gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_TIMEINFO)
1332 read(
reinterpret_cast<char*
>(&obs->gnss2Outputs->timeInfo.status.status()),
sizeof(obs->gnss2Outputs->timeInfo.status.status()));
1333 read(
reinterpret_cast<char*
>(&obs->gnss2Outputs->timeInfo.leapSeconds),
sizeof(obs->gnss2Outputs->timeInfo.leapSeconds));
1335 if (obs->gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_DOP)
1337 read(
reinterpret_cast<char*
>(&obs->gnss2Outputs->dop.gDop),
sizeof(obs->gnss2Outputs->dop.gDop));
1338 read(
reinterpret_cast<char*
>(&obs->gnss2Outputs->dop.pDop),
sizeof(obs->gnss2Outputs->dop.pDop));
1339 read(
reinterpret_cast<char*
>(&obs->gnss2Outputs->dop.tDop),
sizeof(obs->gnss2Outputs->dop.tDop));
1340 read(
reinterpret_cast<char*
>(&obs->gnss2Outputs->dop.vDop),
sizeof(obs->gnss2Outputs->dop.vDop));
1341 read(
reinterpret_cast<char*
>(&obs->gnss2Outputs->dop.hDop),
sizeof(obs->gnss2Outputs->dop.hDop));
1342 read(
reinterpret_cast<char*
>(&obs->gnss2Outputs->dop.nDop),
sizeof(obs->gnss2Outputs->dop.nDop));
1343 read(
reinterpret_cast<char*
>(&obs->gnss2Outputs->dop.eDop),
sizeof(obs->gnss2Outputs->dop.eDop));
1345 if (obs->gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_SATINFO)
1347 read(
reinterpret_cast<char*
>(&obs->gnss2Outputs->satInfo.numSats),
sizeof(obs->gnss2Outputs->satInfo.numSats));
1348 obs->gnss2Outputs->satInfo.satellites.resize(obs->gnss2Outputs->satInfo.numSats);
1350 for (
auto& satellite : obs->gnss2Outputs->satInfo.satellites)
1352 read(
reinterpret_cast<char*
>(&satellite.sys),
sizeof(satellite.sys));
1353 read(
reinterpret_cast<char*
>(&satellite.svId),
sizeof(satellite.svId));
1354 read(
reinterpret_cast<char*
>(&satellite.flags),
sizeof(satellite.flags));
1355 read(
reinterpret_cast<char*
>(&satellite.cno),
sizeof(satellite.cno));
1356 read(
reinterpret_cast<char*
>(&satellite.qi),
sizeof(satellite.qi));
1357 read(
reinterpret_cast<char*
>(&satellite.el),
sizeof(satellite.el));
1358 read(
reinterpret_cast<char*
>(&satellite.az),
sizeof(satellite.az));
1361 if (obs->gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_RAWMEAS)
1363 read(
reinterpret_cast<char*
>(&obs->gnss2Outputs->raw.tow),
sizeof(obs->gnss2Outputs->raw.tow));
1364 read(
reinterpret_cast<char*
>(&obs->gnss2Outputs->raw.week),
sizeof(obs->gnss2Outputs->raw.week));
1365 read(
reinterpret_cast<char*
>(&obs->gnss2Outputs->raw.numSats),
sizeof(obs->gnss2Outputs->raw.numSats));
1366 obs->gnss2Outputs->raw.satellites.resize(obs->gnss2Outputs->raw.numSats);
1368 for (
auto& satellite : obs->gnss2Outputs->raw.satellites)
1370 read(
reinterpret_cast<char*
>(&satellite.sys),
sizeof(satellite.sys));
1371 read(
reinterpret_cast<char*
>(&satellite.svId),
sizeof(satellite.svId));
1372 read(
reinterpret_cast<char*
>(&satellite.freq),
sizeof(satellite.freq));
1373 read(
reinterpret_cast<char*
>(&satellite.chan),
sizeof(satellite.chan));
1374 read(
reinterpret_cast<char*
>(&satellite.slot),
sizeof(satellite.slot));
1375 read(
reinterpret_cast<char*
>(&satellite.cno),
sizeof(satellite.cno));
1376 read(
reinterpret_cast<char*
>(&satellite.flags),
sizeof(satellite.flags));
1377 read(
reinterpret_cast<char*
>(&satellite.pr),
sizeof(satellite.pr));
1378 read(
reinterpret_cast<char*
>(&satellite.cp),
sizeof(satellite.cp));
1379 read(
reinterpret_cast<char*
>(&satellite.dp),
sizeof(satellite.dp));
1384 catch (
const std::exception& e)
1391 if (!obs->timeOutputs && !obs->imuOutputs && !obs->gnss1Outputs && !obs->attitudeOutputs && !obs->insOutputs && !obs->gnss2Outputs)