413 auto obs = std::make_shared<VectorNavBinaryOutput>(
_imuPos);
422 line.erase(line.begin(), std::ranges::find_if(line, [](
int ch) { return std::isgraph(ch); }));
432 std::stringstream lineStream(line);
435 auto extractCell = [&lineStream, &col]() {
436 if (lineStream.eof())
438 throw std::runtime_error(
"End of file");
441 if (std::string cell; std::getline(lineStream, cell,
','))
444 cell.erase(std::ranges::find_if(cell, [](
int ch) {
return std::iscntrl(ch); }), cell.end());
449 return std::string(
"");
451 auto extractRemoveTillDelimiter = [](std::string&
str,
const std::string& delimiter) {
453 if (
size_t pos =
str.find(delimiter);
454 pos != std::string::npos)
456 extract =
str.substr(0, pos);
457 str =
str.substr(pos + 1);
463 auto extractSingleValue = [&](
auto& field,
auto flag,
auto& out) {
464 static_assert(std::is_same_v<
bool&,
decltype(out)> || 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)>
465 || std::is_same_v<int8_t&,
decltype(out)> || std::is_same_v<int16_t&,
decltype(out)> || std::is_same_v<int32_t&,
decltype(out)>
466 || std::is_same_v<
float&,
decltype(out)> || std::is_same_v<
double&,
decltype(out)>
467 || std::is_same_v<std::string&,
decltype(out)>);
469 auto cell = extractCell();
470 LOG_DATA(
"{}: Extracting {}: {}",
nameId(), vn::protocol::uart::to_string(flag), cell);
472 if (cell.empty()) {
return; }
475 if constexpr (std::is_same_v<
bool&,
decltype(out)>
476 || std::is_same_v<uint8_t&,
decltype(out)>
477 || std::is_same_v<uint16_t&,
decltype(out)>
478 || std::is_same_v<uint32_t&,
decltype(out)>)
480 out =
static_cast<std::remove_reference_t<decltype(out)
>>(std::stoul(cell));
482 else if constexpr (std::is_same_v<uint64_t&,
decltype(out)>)
484 out =
static_cast<std::remove_reference_t<decltype(out)
>>(std::stoull(cell));
486 else if constexpr (std::is_same_v<int8_t&,
decltype(out)>
487 || std::is_same_v<int16_t&,
decltype(out)>
488 || std::is_same_v<int32_t&,
decltype(out)>)
490 out =
static_cast<std::remove_reference_t<decltype(out)
>>(std::stoi(cell));
492 else if constexpr (std::is_same_v<
float&,
decltype(out)>)
494 out =
static_cast<std::remove_reference_t<decltype(out)
>>(std::stof(cell));
496 else if constexpr (std::is_same_v<
double&,
decltype(out)>)
498 out =
static_cast<std::remove_reference_t<decltype(out)
>>(std::stod(cell));
500 else if constexpr (std::is_same_v<std::string&,
decltype(out)>)
506 auto extractValue = [&](
auto& field,
auto flag,
auto&... out) {
507 (extractSingleValue(field, flag, out), ...);
513 std::string gpsCycle = extractCell();
514 std::string gpsWeek = extractCell();
515 std::string gpsTow = extractCell();
516 if (!gpsCycle.empty() && !gpsWeek.empty() && !gpsTow.empty())
518 obs->insTime =
InsTime(std::stoi(gpsCycle), std::stoi(gpsWeek), std::stold(gpsTow));
532 if (!obs->timeOutputs) { obs->timeOutputs = std::make_shared<NAV::vendor::vectornav::TimeOutputs>(); }
534 if (column ==
"Time::TimeStartup [ns]")
536 extractValue(obs->timeOutputs->timeField, vn::protocol::uart::TimeGroup::TIMEGROUP_TIMESTARTUP, obs->timeOutputs->timeStartup);
539 if (column ==
"Time::TimeGps [ns]")
541 extractValue(obs->timeOutputs->timeField, vn::protocol::uart::TimeGroup::TIMEGROUP_TIMEGPS, obs->timeOutputs->timeGps);
544 if (column ==
"Time::GpsTow [ns]")
546 extractValue(obs->timeOutputs->timeField, vn::protocol::uart::TimeGroup::TIMEGROUP_GPSTOW, obs->timeOutputs->gpsTow);
549 if (column ==
"Time::GpsWeek")
551 extractValue(obs->timeOutputs->timeField, vn::protocol::uart::TimeGroup::TIMEGROUP_GPSWEEK, obs->timeOutputs->gpsWeek);
554 if (column ==
"Time::TimeSyncIn [ns]")
556 extractValue(obs->timeOutputs->timeField, vn::protocol::uart::TimeGroup::TIMEGROUP_TIMESYNCIN, obs->timeOutputs->timeSyncIn);
559 if (column ==
"Time::TimeGpsPps [ns]")
561 extractValue(obs->timeOutputs->timeField, vn::protocol::uart::TimeGroup::TIMEGROUP_TIMEGPSPPS, obs->timeOutputs->timePPS);
564 if (column ==
"Time::TimeUTC::year")
566 extractValue(obs->timeOutputs->timeField, vn::protocol::uart::TimeGroup::TIMEGROUP_TIMEUTC,
567 obs->timeOutputs->timeUtc.year, obs->timeOutputs->timeUtc.month, obs->timeOutputs->timeUtc.day,
568 obs->timeOutputs->timeUtc.hour, obs->timeOutputs->timeUtc.min, obs->timeOutputs->timeUtc.sec, obs->timeOutputs->timeUtc.ms);
571 if (column ==
"Time::SyncInCnt")
573 extractValue(obs->timeOutputs->timeField, vn::protocol::uart::TimeGroup::TIMEGROUP_SYNCINCNT, obs->timeOutputs->syncInCnt);
576 if (column ==
"Time::SyncOutCnt")
578 extractValue(obs->timeOutputs->timeField, vn::protocol::uart::TimeGroup::TIMEGROUP_SYNCOUTCNT, obs->timeOutputs->syncOutCnt);
581 if (column ==
"Time::TimeStatus::timeOk")
585 uint8_t utcTimeValid{};
586 extractValue(obs->timeOutputs->timeField, vn::protocol::uart::TimeGroup::TIMEGROUP_TIMESTATUS, timeOk, dateOk, utcTimeValid);
587 obs->timeOutputs->timeStatus =
static_cast<uint8_t
>(timeOk << 0U | dateOk << 1U | utcTimeValid << 2U);
594 if (!obs->imuOutputs) { obs->imuOutputs = std::make_shared<NAV::vendor::vectornav::ImuOutputs>(); }
596 if (column ==
"IMU::ImuStatus")
598 extractValue(obs->imuOutputs->imuField, vn::protocol::uart::ImuGroup::IMUGROUP_IMUSTATUS, obs->imuOutputs->imuStatus);
601 if (column.starts_with(
"IMU::UncompMag::X"))
603 extractValue(obs->imuOutputs->imuField, vn::protocol::uart::ImuGroup::IMUGROUP_UNCOMPMAG,
604 obs->imuOutputs->uncompMag.x(), obs->imuOutputs->uncompMag.y(), obs->imuOutputs->uncompMag.z());
607 if (column.starts_with(
"IMU::UncompAccel::X"))
609 extractValue(obs->imuOutputs->imuField, vn::protocol::uart::ImuGroup::IMUGROUP_UNCOMPACCEL,
610 obs->imuOutputs->uncompAccel.x(), obs->imuOutputs->uncompAccel.y(), obs->imuOutputs->uncompAccel.z());
613 if (column.starts_with(
"IMU::UncompGyro::X"))
615 extractValue(obs->imuOutputs->imuField, vn::protocol::uart::ImuGroup::IMUGROUP_UNCOMPGYRO,
616 obs->imuOutputs->uncompGyro.x(), obs->imuOutputs->uncompGyro.y(), obs->imuOutputs->uncompGyro.z());
619 if (column.starts_with(
"IMU::Temp"))
621 extractValue(obs->imuOutputs->imuField, vn::protocol::uart::ImuGroup::IMUGROUP_TEMP, obs->imuOutputs->temp);
624 if (column.starts_with(
"IMU::Pres"))
626 extractValue(obs->imuOutputs->imuField, vn::protocol::uart::ImuGroup::IMUGROUP_PRES, obs->imuOutputs->pres);
629 if (column.starts_with(
"IMU::DeltaTime"))
631 extractValue(obs->imuOutputs->imuField, vn::protocol::uart::ImuGroup::IMUGROUP_DELTATHETA,
632 obs->imuOutputs->deltaTime, obs->imuOutputs->deltaTheta.x(), obs->imuOutputs->deltaTheta.y(), obs->imuOutputs->deltaTheta.z());
635 if (column.starts_with(
"IMU::DeltaVel::X"))
637 extractValue(obs->imuOutputs->imuField, vn::protocol::uart::ImuGroup::IMUGROUP_DELTAVEL,
638 obs->imuOutputs->deltaV.x(), obs->imuOutputs->deltaV.y(), obs->imuOutputs->deltaV.z());
641 if (column.starts_with(
"IMU::Mag::X"))
643 extractValue(obs->imuOutputs->imuField, vn::protocol::uart::ImuGroup::IMUGROUP_MAG,
644 obs->imuOutputs->mag.x(), obs->imuOutputs->mag.y(), obs->imuOutputs->mag.z());
647 if (column.starts_with(
"IMU::Accel::X"))
649 extractValue(obs->imuOutputs->imuField, vn::protocol::uart::ImuGroup::IMUGROUP_ACCEL,
650 obs->imuOutputs->accel.x(), obs->imuOutputs->accel.y(), obs->imuOutputs->accel.z());
653 if (column.starts_with(
"IMU::AngularRate::X"))
655 extractValue(obs->imuOutputs->imuField, vn::protocol::uart::ImuGroup::IMUGROUP_ANGULARRATE,
656 obs->imuOutputs->angularRate.x(), obs->imuOutputs->angularRate.y(), obs->imuOutputs->angularRate.z());
663 if (!obs->gnss1Outputs) { obs->gnss1Outputs = std::make_shared<NAV::vendor::vectornav::GnssOutputs>(); }
665 if (column ==
"GNSS1::UTC::year")
667 extractValue(obs->gnss1Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_UTC,
668 obs->gnss1Outputs->timeUtc.year, obs->gnss1Outputs->timeUtc.month, obs->gnss1Outputs->timeUtc.day,
669 obs->gnss1Outputs->timeUtc.hour, obs->gnss1Outputs->timeUtc.min, obs->gnss1Outputs->timeUtc.sec, obs->gnss1Outputs->timeUtc.ms);
672 if (column ==
"GNSS1::Tow [ns]")
674 extractValue(obs->gnss1Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_TOW, obs->gnss1Outputs->tow);
677 if (column ==
"GNSS1::Week")
679 extractValue(obs->gnss1Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_WEEK, obs->gnss1Outputs->week);
682 if (column ==
"GNSS1::NumSats")
684 extractValue(obs->gnss1Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_NUMSATS, obs->gnss1Outputs->numSats);
687 if (column ==
"GNSS1::Fix")
689 extractValue(obs->gnss1Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_FIX, obs->gnss1Outputs->fix);
692 if (column ==
"GNSS1::PosLla::latitude [deg]")
694 extractValue(obs->gnss1Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_POSLLA,
695 obs->gnss1Outputs->posLla.x(), obs->gnss1Outputs->posLla.y(), obs->gnss1Outputs->posLla.z());
698 if (column ==
"GNSS1::PosEcef::X [m]")
700 extractValue(obs->gnss1Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_POSECEF,
701 obs->gnss1Outputs->posEcef.x(), obs->gnss1Outputs->posEcef.y(), obs->gnss1Outputs->posEcef.z());
704 if (column ==
"GNSS1::VelNed::N [m/s]")
706 extractValue(obs->gnss1Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_VELNED,
707 obs->gnss1Outputs->velNed.x(), obs->gnss1Outputs->velNed.y(), obs->gnss1Outputs->velNed.z());
710 if (column ==
"GNSS1::VelEcef::X [m/s]")
712 extractValue(obs->gnss1Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_VELECEF,
713 obs->gnss1Outputs->velEcef.x(), obs->gnss1Outputs->velEcef.y(), obs->gnss1Outputs->velEcef.z());
716 if (column ==
"GNSS1::PosU::N [m]")
718 extractValue(obs->gnss1Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_POSU,
719 obs->gnss1Outputs->posU.x(), obs->gnss1Outputs->posU.y(), obs->gnss1Outputs->posU.z());
722 if (column ==
"GNSS1::VelU [m/s]")
724 extractValue(obs->gnss1Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_VELU, obs->gnss1Outputs->velU);
727 if (column ==
"GNSS1::TimeU [s]")
729 extractValue(obs->gnss1Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_TIMEU, obs->gnss1Outputs->timeU);
732 if (column ==
"GNSS1::TimeInfo::Status::timeOk")
736 uint8_t utcTimeValid{};
737 extractValue(obs->gnss1Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_TIMEINFO, timeOk, dateOk, utcTimeValid, obs->gnss1Outputs->timeInfo.leapSeconds);
738 obs->gnss1Outputs->timeInfo.status =
static_cast<uint8_t
>(timeOk << 0U | dateOk << 1U | utcTimeValid << 2U);
741 if (column ==
"GNSS1::DOP::g")
743 extractValue(obs->gnss1Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_DOP,
744 obs->gnss1Outputs->dop.gDop, obs->gnss1Outputs->dop.pDop, obs->gnss1Outputs->dop.tDop, obs->gnss1Outputs->dop.vDop,
745 obs->gnss1Outputs->dop.hDop, obs->gnss1Outputs->dop.nDop, obs->gnss1Outputs->dop.eDop);
748 if (column ==
"GNSS1::SatInfo::NumSats")
750 extractValue(obs->gnss1Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_SATINFO, obs->gnss1Outputs->satInfo.numSats);
753 if (column ==
"GNSS1::SatInfo::Satellites")
755 std::string satellites;
756 extractValue(obs->gnss1Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_SATINFO, satellites);
758 for (
size_t i = 0; i < obs->gnss1Outputs->satInfo.numSats; i++)
760 satellites = satellites.substr(1);
761 auto sys =
static_cast<int8_t
>(std::stoi(extractRemoveTillDelimiter(satellites,
"|")));
762 auto svId =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
763 auto flagHealthy =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
764 auto flagAlmanac =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
765 auto flagEphemeris =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
766 auto flagDifferentialCorrection =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
767 auto flagUsedForNavigation =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
768 auto flagAzimuthElevationValid =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
769 auto flagUsedForRTK =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
770 auto flags =
static_cast<uint8_t
>(flagHealthy << 0U
772 | flagEphemeris << 2U
773 | flagDifferentialCorrection << 3U
774 | flagUsedForNavigation << 4U
775 | flagAzimuthElevationValid << 5U
776 | flagUsedForRTK << 6U);
777 auto cno =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
778 auto qi =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
779 auto el =
static_cast<int8_t
>(std::stoi(extractRemoveTillDelimiter(satellites,
"|")));
780 auto az =
static_cast<int16_t
>(std::stoi(extractRemoveTillDelimiter(satellites,
"]")));
781 obs->gnss1Outputs->satInfo.satellites.emplace_back(sys, svId, flags, cno, qi, el, az);
785 if (column.starts_with(
"GNSS1::SatInfo::") && column.ends_with(
" - flag Healthy"))
787 std::string columnText = column.substr(16);
788 SatId satId(extractRemoveTillDelimiter(columnText,
" -"));
792 bool flagEphemeris{};
793 bool flagDifferentialCorrection{};
794 bool flagUsedForNavigation{};
795 bool flagAzimuthElevationValid{};
796 bool flagUsedForRTK{};
797 auto cno = std::numeric_limits<uint8_t>::max();
801 extractValue(obs->gnss1Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_SATINFO,
802 flagHealthy, flagAlmanac, flagEphemeris, flagDifferentialCorrection,
803 flagUsedForNavigation, flagAzimuthElevationValid, flagUsedForRTK,
805 if (cno == std::numeric_limits<uint8_t>::max())
810 auto flags =
static_cast<uint8_t
>(flagHealthy << 0U
812 | flagEphemeris << 2U
813 | flagDifferentialCorrection << 3U
814 | flagUsedForNavigation << 4U
815 | flagAzimuthElevationValid << 5U
816 | flagUsedForRTK << 6U);
818 static_cast<uint8_t
>(satId.
satNum), flags, cno, qi, el, az);
821 if (column ==
"GNSS1::RawMeas::Tow [s]")
823 extractValue(obs->gnss1Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_RAWMEAS, obs->gnss1Outputs->raw.tow);
826 if (column ==
"GNSS1::RawMeas::Week")
828 extractValue(obs->gnss1Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_RAWMEAS, obs->gnss1Outputs->raw.week);
831 if (column ==
"GNSS1::RawMeas::NumSats")
833 extractValue(obs->gnss1Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_RAWMEAS, obs->gnss1Outputs->raw.numSats);
836 if (column ==
"GNSS1::RawMeas::Satellites")
838 std::string satellites;
839 extractValue(obs->gnss1Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_RAWMEAS, satellites);
841 for (
size_t i = 0; i < obs->gnss1Outputs->raw.numSats; i++)
843 satellites = satellites.substr(1);
844 auto sys =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
845 auto svId =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
846 auto freq =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
847 auto chan =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
848 auto slot =
static_cast<int8_t
>(std::stoi(extractRemoveTillDelimiter(satellites,
"|")));
849 auto cno =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
850 auto flagSearching =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
851 auto flagTracking =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
852 auto flagTimeValid =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
853 auto flagCodeLock =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
854 auto flagPhaseLock =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
855 auto flagPhaseHalfAmbiguity =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
856 auto flagPhaseHalfSub =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
857 auto flagPhaseSlip =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
858 auto flagPseudorangeSmoothed =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
859 auto flags =
static_cast<uint16_t
>(flagSearching << 0U
861 | flagTimeValid << 2U
863 | flagPhaseLock << 4U
864 | flagPhaseHalfAmbiguity << 5U
865 | flagPhaseHalfSub << 6U
866 | flagPhaseSlip << 7U
867 | flagPseudorangeSmoothed << 8U);
868 auto pr = std::stod(extractRemoveTillDelimiter(satellites,
"|"));
869 auto cp = std::stod(extractRemoveTillDelimiter(satellites,
"|"));
870 auto dp = std::stof(extractRemoveTillDelimiter(satellites,
"]"));
871 obs->gnss1Outputs->raw.satellites.emplace_back(sys, svId, freq, chan, slot, cno, flags, pr, cp, dp);
875 if (column.starts_with(
"GNSS1::RawMeas::") && column.ends_with(
" - freq"))
877 std::string columnText = column.substr(16);
878 auto identifier = extractRemoveTillDelimiter(columnText,
" - freq");
882 if (identifier.length() == 6)
890 SatId satId(identifier);
894 auto freq = std::numeric_limits<uint8_t>::max();
898 uint8_t flagSearching{};
899 uint8_t flagTracking{};
900 uint8_t flagTimeValid{};
901 uint8_t flagCodeLock{};
902 uint8_t flagPhaseLock{};
903 uint8_t flagPhaseHalfAmbiguity{};
904 uint8_t flagPhaseHalfSub{};
905 uint8_t flagPhaseSlip{};
906 uint8_t flagPseudorangeSmoothed{};
910 extractValue(obs->gnss1Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_RAWMEAS,
911 freq, chan, slot, cno,
912 flagSearching, flagTracking, flagTimeValid, flagCodeLock, flagPhaseLock,
913 flagPhaseHalfAmbiguity, flagPhaseHalfSub, flagPhaseSlip, flagPseudorangeSmoothed,
915 if (freq == std::numeric_limits<uint8_t>::max())
920 auto flags =
static_cast<uint16_t
>(flagSearching << 0U
922 | flagTimeValid << 2U
924 | flagPhaseLock << 4U
925 | flagPhaseHalfAmbiguity << 5U
926 | flagPhaseHalfSub << 6U
927 | flagPhaseSlip << 7U
928 | flagPseudorangeSmoothed << 8U);
930 static_cast<uint8_t
>(satNum), freq, chan, slot, cno, flags, pr, cp, dp);
931 if (obs->gnss1Outputs->raw.satellites.back().toCode() ==
Code::None)
934 obs->gnss1Outputs->raw.satellites.back().sys, obs->gnss1Outputs->raw.satellites.back().freq, obs->gnss1Outputs->raw.satellites.back().chan);
935 obs->gnss1Outputs->raw.satellites.pop_back();
937 if (identifier.length() == 6 &&
SatSigId(identifier) != obs->gnss1Outputs->raw.satellites.back().toSatSigId())
939 LOG_ERROR(
"{}: Line {}: Could not convert to valid SatSigId. Skipping item. (sys {}, freq {}, chan {} = [{}], column was [{}])",
nameId(),
_messageCount + 1,
940 obs->gnss1Outputs->raw.satellites.back().sys, obs->gnss1Outputs->raw.satellites.back().freq, obs->gnss1Outputs->raw.satellites.back().chan,
941 obs->gnss1Outputs->raw.satellites.back().toSatSigId(), identifier);
942 obs->gnss1Outputs->raw.satellites.pop_back();
950 if (!obs->attitudeOutputs) { obs->attitudeOutputs = std::make_shared<NAV::vendor::vectornav::AttitudeOutputs>(); }
952 if (column ==
"Att::VpeStatus::AttitudeQuality")
954 uint8_t attitudeQuality{};
955 uint8_t gyroSaturation{};
956 uint8_t gyroSaturationRecovery{};
957 uint8_t magDisturbance{};
958 uint8_t magSaturation{};
959 uint8_t accDisturbance{};
960 uint8_t accSaturation{};
961 uint8_t knownMagDisturbance{};
962 uint8_t knownAccelDisturbance{};
963 extractValue(obs->attitudeOutputs->attitudeField, vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_VPESTATUS,
964 attitudeQuality, gyroSaturation, gyroSaturationRecovery, magDisturbance, magSaturation, accDisturbance, accSaturation, knownMagDisturbance, knownAccelDisturbance);
965 obs->attitudeOutputs->vpeStatus =
static_cast<uint16_t
>(attitudeQuality << 0U
966 | gyroSaturation << 2U
967 | gyroSaturationRecovery << 3U
968 | magDisturbance << 4U
969 | magSaturation << 6U
970 | accDisturbance << 7U
971 | accSaturation << 9U
972 | knownMagDisturbance << 11U
973 | knownAccelDisturbance << 12U);
976 if (column ==
"Att::YawPitchRoll::Y [deg]")
978 extractValue(obs->attitudeOutputs->attitudeField, vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_YAWPITCHROLL,
979 obs->attitudeOutputs->ypr.x(), obs->attitudeOutputs->ypr.y(), obs->attitudeOutputs->ypr.z());
982 if (column ==
"Att::Quaternion::w")
984 extractValue(obs->attitudeOutputs->attitudeField, vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_QUATERNION,
985 obs->attitudeOutputs->qtn.w(), obs->attitudeOutputs->qtn.x(), obs->attitudeOutputs->qtn.y(), obs->attitudeOutputs->qtn.z());
988 if (column ==
"Att::DCM::0-0")
990 extractValue(obs->attitudeOutputs->attitudeField, vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_DCM,
991 obs->attitudeOutputs->dcm(0, 0), obs->attitudeOutputs->dcm(0, 1), obs->attitudeOutputs->dcm(0, 2),
992 obs->attitudeOutputs->dcm(1, 0), obs->attitudeOutputs->dcm(1, 1), obs->attitudeOutputs->dcm(1, 2),
993 obs->attitudeOutputs->dcm(2, 0), obs->attitudeOutputs->dcm(2, 1), obs->attitudeOutputs->dcm(2, 2));
996 if (column ==
"Att::MagNed::N [Gauss]")
998 extractValue(obs->attitudeOutputs->attitudeField, vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_MAGNED,
999 obs->attitudeOutputs->magNed.x(), obs->attitudeOutputs->magNed.y(), obs->attitudeOutputs->magNed.z());
1002 if (column ==
"Att::AccelNed::N [m/s^2]")
1004 extractValue(obs->attitudeOutputs->attitudeField, vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_ACCELNED,
1005 obs->attitudeOutputs->accelNed.x(), obs->attitudeOutputs->accelNed.y(), obs->attitudeOutputs->accelNed.z());
1008 if (column ==
"Att::LinearAccelBody::X [m/s^2]")
1010 extractValue(obs->attitudeOutputs->attitudeField, vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_LINEARACCELBODY,
1011 obs->attitudeOutputs->linearAccelBody.x(), obs->attitudeOutputs->linearAccelBody.y(), obs->attitudeOutputs->linearAccelBody.z());
1014 if (column ==
"Att::LinearAccelNed::N [m/s^2]")
1016 extractValue(obs->attitudeOutputs->attitudeField, vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_LINEARACCELNED,
1017 obs->attitudeOutputs->linearAccelNed.x(), obs->attitudeOutputs->linearAccelNed.y(), obs->attitudeOutputs->linearAccelNed.z());
1020 if (column ==
"Att::YprU::Y [deg]")
1022 extractValue(obs->attitudeOutputs->attitudeField, vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_YPRU,
1023 obs->attitudeOutputs->yprU.x(), obs->attitudeOutputs->yprU.y(), obs->attitudeOutputs->yprU.z());
1030 if (!obs->insOutputs) { obs->insOutputs = std::make_shared<NAV::vendor::vectornav::InsOutputs>(); }
1032 if (column ==
"INS::InsStatus::Mode")
1037 uint8_t errorMagPres{};
1038 uint8_t errorGnss{};
1039 uint8_t gpsHeadingIns{};
1040 uint8_t gpsCompass{};
1041 extractValue(obs->insOutputs->insField, vn::protocol::uart::InsGroup::INSGROUP_INSSTATUS,
1042 mode, gpsFix, errorImu, errorMagPres, errorGnss, gpsHeadingIns, gpsCompass);
1043 obs->insOutputs->insStatus.status() =
static_cast<uint16_t
>(mode << 0U | gpsFix << 2U
1044 | errorImu << 4U | errorMagPres << 5U | errorGnss << 6U
1045 | gpsHeadingIns << 8U | gpsCompass << 9U);
1048 if (column ==
"INS::PosLla::latitude [deg]")
1050 extractValue(obs->insOutputs->insField, vn::protocol::uart::InsGroup::INSGROUP_POSLLA,
1051 obs->insOutputs->posLla.x(), obs->insOutputs->posLla.y(), obs->insOutputs->posLla.z());
1054 if (column ==
"INS::PosEcef::X [m]")
1056 extractValue(obs->insOutputs->insField, vn::protocol::uart::InsGroup::INSGROUP_POSECEF,
1057 obs->insOutputs->posEcef.x(), obs->insOutputs->posEcef.y(), obs->insOutputs->posEcef.z());
1060 if (column ==
"INS::VelBody::X [m/s]")
1062 extractValue(obs->insOutputs->insField, vn::protocol::uart::InsGroup::INSGROUP_VELBODY,
1063 obs->insOutputs->velBody.x(), obs->insOutputs->velBody.y(), obs->insOutputs->velBody.z());
1066 if (column ==
"INS::VelNed::N [m/s]")
1068 extractValue(obs->insOutputs->insField, vn::protocol::uart::InsGroup::INSGROUP_VELNED,
1069 obs->insOutputs->velNed.x(), obs->insOutputs->velNed.y(), obs->insOutputs->velNed.z());
1072 if (column ==
"INS::VelEcef::X [m/s]")
1074 extractValue(obs->insOutputs->insField, vn::protocol::uart::InsGroup::INSGROUP_VELECEF,
1075 obs->insOutputs->velEcef.x(), obs->insOutputs->velEcef.y(), obs->insOutputs->velEcef.z());
1078 if (column ==
"INS::MagEcef::X [Gauss]")
1080 extractValue(obs->insOutputs->insField, vn::protocol::uart::InsGroup::INSGROUP_MAGECEF,
1081 obs->insOutputs->magEcef.x(), obs->insOutputs->magEcef.y(), obs->insOutputs->magEcef.z());
1084 if (column ==
"INS::AccelEcef::X [m/s^2]")
1086 extractValue(obs->insOutputs->insField, vn::protocol::uart::InsGroup::INSGROUP_ACCELECEF,
1087 obs->insOutputs->accelEcef.x(), obs->insOutputs->accelEcef.y(), obs->insOutputs->accelEcef.z());
1090 if (column ==
"INS::LinearAccelEcef::X [m/s^2]")
1092 extractValue(obs->insOutputs->insField, vn::protocol::uart::InsGroup::INSGROUP_LINEARACCELECEF,
1093 obs->insOutputs->linearAccelEcef.x(), obs->insOutputs->linearAccelEcef.y(), obs->insOutputs->linearAccelEcef.z());
1096 if (column ==
"INS::PosU [m]")
1098 extractValue(obs->insOutputs->insField, vn::protocol::uart::InsGroup::INSGROUP_POSU, obs->insOutputs->posU);
1101 if (column ==
"INS::VelU [m/s]")
1103 extractValue(obs->insOutputs->insField, vn::protocol::uart::InsGroup::INSGROUP_VELU, obs->insOutputs->velU);
1110 if (!obs->gnss2Outputs) { obs->gnss2Outputs = std::make_shared<NAV::vendor::vectornav::GnssOutputs>(); }
1112 if (column ==
"GNSS2::UTC::year")
1114 extractValue(obs->gnss2Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_UTC,
1115 obs->gnss2Outputs->timeUtc.year, obs->gnss2Outputs->timeUtc.month, obs->gnss2Outputs->timeUtc.day,
1116 obs->gnss2Outputs->timeUtc.hour, obs->gnss2Outputs->timeUtc.min, obs->gnss2Outputs->timeUtc.sec, obs->gnss2Outputs->timeUtc.ms);
1119 if (column ==
"GNSS2::Tow [ns]")
1121 extractValue(obs->gnss2Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_TOW, obs->gnss2Outputs->tow);
1124 if (column ==
"GNSS2::Week")
1126 extractValue(obs->gnss2Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_WEEK, obs->gnss2Outputs->week);
1129 if (column ==
"GNSS2::NumSats")
1131 extractValue(obs->gnss2Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_NUMSATS, obs->gnss2Outputs->numSats);
1134 if (column ==
"GNSS2::Fix")
1136 extractValue(obs->gnss2Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_FIX, obs->gnss2Outputs->fix);
1139 if (column ==
"GNSS2::PosLla::latitude [deg]")
1141 extractValue(obs->gnss2Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_POSLLA,
1142 obs->gnss2Outputs->posLla.x(), obs->gnss2Outputs->posLla.y(), obs->gnss2Outputs->posLla.z());
1145 if (column ==
"GNSS2::PosEcef::X [m]")
1147 extractValue(obs->gnss2Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_POSECEF,
1148 obs->gnss2Outputs->posEcef.x(), obs->gnss2Outputs->posEcef.y(), obs->gnss2Outputs->posEcef.z());
1151 if (column ==
"GNSS2::VelNed::N [m/s]")
1153 extractValue(obs->gnss2Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_VELNED,
1154 obs->gnss2Outputs->velNed.x(), obs->gnss2Outputs->velNed.y(), obs->gnss2Outputs->velNed.z());
1157 if (column ==
"GNSS2::VelEcef::X [m/s]")
1159 extractValue(obs->gnss2Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_VELECEF,
1160 obs->gnss2Outputs->velEcef.x(), obs->gnss2Outputs->velEcef.y(), obs->gnss2Outputs->velEcef.z());
1163 if (column ==
"GNSS2::PosU::N [m]")
1165 extractValue(obs->gnss2Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_POSU,
1166 obs->gnss2Outputs->posU.x(), obs->gnss2Outputs->posU.y(), obs->gnss2Outputs->posU.z());
1169 if (column ==
"GNSS2::VelU [m/s]")
1171 extractValue(obs->gnss2Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_VELU, obs->gnss2Outputs->velU);
1174 if (column ==
"GNSS2::TimeU [s]")
1176 extractValue(obs->gnss2Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_TIMEU, obs->gnss2Outputs->timeU);
1179 if (column ==
"GNSS2::TimeInfo::Status::timeOk")
1183 uint8_t utcTimeValid{};
1184 extractValue(obs->gnss2Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_TIMEINFO, timeOk, dateOk, utcTimeValid, obs->gnss2Outputs->timeInfo.leapSeconds);
1185 obs->gnss2Outputs->timeInfo.status =
static_cast<uint8_t
>(timeOk << 0U | dateOk << 1U | utcTimeValid << 2U);
1188 if (column ==
"GNSS2::DOP::g")
1190 extractValue(obs->gnss2Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_DOP,
1191 obs->gnss2Outputs->dop.gDop, obs->gnss2Outputs->dop.pDop, obs->gnss2Outputs->dop.tDop, obs->gnss2Outputs->dop.vDop,
1192 obs->gnss2Outputs->dop.hDop, obs->gnss2Outputs->dop.nDop, obs->gnss2Outputs->dop.eDop);
1195 if (column ==
"GNSS2::SatInfo::NumSats")
1197 extractValue(obs->gnss2Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_SATINFO, obs->gnss2Outputs->satInfo.numSats);
1200 if (column ==
"GNSS2::SatInfo::Satellites")
1202 std::string satellites;
1203 extractValue(obs->gnss2Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_SATINFO, satellites);
1205 for (
size_t i = 0; i < obs->gnss2Outputs->satInfo.numSats; i++)
1207 satellites = satellites.substr(1);
1208 auto sys =
static_cast<int8_t
>(std::stoi(extractRemoveTillDelimiter(satellites,
"|")));
1209 auto svId =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
1210 auto flagHealthy =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
1211 auto flagAlmanac =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
1212 auto flagEphemeris =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
1213 auto flagDifferentialCorrection =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
1214 auto flagUsedForNavigation =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
1215 auto flagAzimuthElevationValid =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
1216 auto flagUsedForRTK =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
1217 auto flags =
static_cast<uint8_t
>(flagHealthy << 0U
1219 | flagEphemeris << 2U
1220 | flagDifferentialCorrection << 3U
1221 | flagUsedForNavigation << 4U
1222 | flagAzimuthElevationValid << 5U
1223 | flagUsedForRTK << 6U);
1224 auto cno =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
1225 auto qi =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
1226 auto el =
static_cast<int8_t
>(std::stoi(extractRemoveTillDelimiter(satellites,
"|")));
1227 auto az =
static_cast<int16_t
>(std::stoi(extractRemoveTillDelimiter(satellites,
"]")));
1228 obs->gnss2Outputs->satInfo.satellites.emplace_back(sys, svId, flags, cno, qi, el, az);
1232 if (column.starts_with(
"GNSS2::SatInfo::") && column.ends_with(
" - flag Healthy"))
1234 std::string columnText = column.substr(16);
1235 SatId satId(extractRemoveTillDelimiter(columnText,
" -"));
1239 bool flagEphemeris{};
1240 bool flagDifferentialCorrection{};
1241 bool flagUsedForNavigation{};
1242 bool flagAzimuthElevationValid{};
1243 bool flagUsedForRTK{};
1244 auto cno = std::numeric_limits<uint8_t>::max();
1248 extractValue(obs->gnss2Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_SATINFO,
1249 flagHealthy, flagAlmanac, flagEphemeris, flagDifferentialCorrection,
1250 flagUsedForNavigation, flagAzimuthElevationValid, flagUsedForRTK,
1252 if (cno == std::numeric_limits<uint8_t>::max())
1257 auto flags =
static_cast<uint8_t
>(flagHealthy << 0U
1259 | flagEphemeris << 2U
1260 | flagDifferentialCorrection << 3U
1261 | flagUsedForNavigation << 4U
1262 | flagAzimuthElevationValid << 5U
1263 | flagUsedForRTK << 6U);
1265 static_cast<uint8_t
>(satId.
satNum), flags, cno, qi, el, az);
1268 if (column ==
"GNSS2::RawMeas::Tow [s]")
1270 extractValue(obs->gnss2Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_RAWMEAS, obs->gnss2Outputs->raw.tow);
1273 if (column ==
"GNSS2::RawMeas::Week")
1275 extractValue(obs->gnss2Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_RAWMEAS, obs->gnss2Outputs->raw.week);
1278 if (column ==
"GNSS2::RawMeas::NumSats")
1280 extractValue(obs->gnss2Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_RAWMEAS, obs->gnss2Outputs->raw.numSats);
1281 LOG_DATA(
"{}: GNSS2::NumSats: {}",
nameId(), obs->gnss2Outputs->raw.numSats);
1284 if (column ==
"GNSS2::RawMeas::Satellites")
1286 std::string satellites;
1287 extractValue(obs->gnss2Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_RAWMEAS, satellites);
1288 LOG_DATA(
"{}: numSats: {}",
nameId(), obs->gnss2Outputs->raw.numSats);
1291 for (
size_t i = 0; i < obs->gnss2Outputs->raw.numSats; i++)
1293 satellites = satellites.substr(1);
1294 auto sys =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
1295 auto svId =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
1296 auto freq =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
1297 auto chan =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
1298 auto slot =
static_cast<int8_t
>(std::stoi(extractRemoveTillDelimiter(satellites,
"|")));
1299 auto cno =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
1300 auto flagSearching =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
1301 auto flagTracking =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
1302 auto flagTimeValid =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
1303 auto flagCodeLock =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
1304 auto flagPhaseLock =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
1305 auto flagPhaseHalfAmbiguity =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
1306 auto flagPhaseHalfSub =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
1307 auto flagPhaseSlip =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
1308 auto flagPseudorangeSmoothed =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
1309 auto flags =
static_cast<uint16_t
>(flagSearching << 0U
1310 | flagTracking << 1U
1311 | flagTimeValid << 2U
1312 | flagCodeLock << 3U
1313 | flagPhaseLock << 4U
1314 | flagPhaseHalfAmbiguity << 5U
1315 | flagPhaseHalfSub << 6U
1316 | flagPhaseSlip << 7U
1317 | flagPseudorangeSmoothed << 8U);
1318 auto pr = std::stod(extractRemoveTillDelimiter(satellites,
"|"));
1319 auto cp = std::stod(extractRemoveTillDelimiter(satellites,
"|"));
1320 auto dp = std::stof(extractRemoveTillDelimiter(satellites,
"]"));
1321 obs->gnss2Outputs->raw.satellites.emplace_back(sys, svId, freq, chan, slot, cno, flags, pr, cp, dp);
1325 if (column.starts_with(
"GNSS2::RawMeas::") && column.ends_with(
" - freq"))
1327 std::string columnText = column.substr(16);
1328 auto identifier = extractRemoveTillDelimiter(columnText,
" - freq");
1332 if (identifier.length() == 6)
1336 satNum = satSigId.
satNum;
1340 SatId satId(identifier);
1344 auto freq = std::numeric_limits<uint8_t>::max();
1348 uint8_t flagSearching{};
1349 uint8_t flagTracking{};
1350 uint8_t flagTimeValid{};
1351 uint8_t flagCodeLock{};
1352 uint8_t flagPhaseLock{};
1353 uint8_t flagPhaseHalfAmbiguity{};
1354 uint8_t flagPhaseHalfSub{};
1355 uint8_t flagPhaseSlip{};
1356 uint8_t flagPseudorangeSmoothed{};
1360 extractValue(obs->gnss2Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_RAWMEAS,
1361 freq, chan, slot, cno,
1362 flagSearching, flagTracking, flagTimeValid, flagCodeLock, flagPhaseLock,
1363 flagPhaseHalfAmbiguity, flagPhaseHalfSub, flagPhaseSlip, flagPseudorangeSmoothed,
1365 if (freq == std::numeric_limits<uint8_t>::max())
1370 auto flags =
static_cast<uint16_t
>(flagSearching << 0U
1371 | flagTracking << 1U
1372 | flagTimeValid << 2U
1373 | flagCodeLock << 3U
1374 | flagPhaseLock << 4U
1375 | flagPhaseHalfAmbiguity << 5U
1376 | flagPhaseHalfSub << 6U
1377 | flagPhaseSlip << 7U
1378 | flagPseudorangeSmoothed << 8U);
1380 static_cast<uint8_t
>(satNum), freq, chan, slot, cno, flags, pr, cp, dp);
1381 if (obs->gnss2Outputs->raw.satellites.back().toCode() ==
Code::None)
1384 obs->gnss2Outputs->raw.satellites.back().sys, obs->gnss2Outputs->raw.satellites.back().freq, obs->gnss2Outputs->raw.satellites.back().chan);
1385 obs->gnss2Outputs->raw.satellites.pop_back();
1387 if (identifier.length() == 6 &&
SatSigId(identifier) != obs->gnss2Outputs->raw.satellites.back().toSatSigId())
1389 LOG_ERROR(
"{}: Line {}: Could not convert to valid SatSigId. Skipping item. (sys {}, freq {}, chan {} = [{}], column was [{}])",
nameId(),
_messageCount + 1,
1390 obs->gnss2Outputs->raw.satellites.back().sys, obs->gnss2Outputs->raw.satellites.back().freq, obs->gnss2Outputs->raw.satellites.back().chan,
1391 obs->gnss2Outputs->raw.satellites.back().toSatSigId(), identifier);
1392 obs->gnss2Outputs->raw.satellites.pop_back();
1400 if (obs->gnss1Outputs) { obs->gnss1Outputs->raw.numSats =
static_cast<uint8_t
>(obs->gnss1Outputs->raw.satellites.size()); }
1401 if (obs->gnss2Outputs) { obs->gnss2Outputs->raw.numSats =
static_cast<uint8_t
>(obs->gnss2Outputs->raw.satellites.size()); }
1403 catch (
const std::exception& e)
1411 auto readFromFilestream = [&,
this](
char* __s, std::streamsize __n) {
1415 throw std::runtime_error(
"End of file reached");
1423 int32_t gpsCycle = 0;
1424 int32_t gpsWeek = 0;
1426 readFromFilestream(
reinterpret_cast<char*
>(&gpsCycle),
sizeof(gpsCycle));
1427 readFromFilestream(
reinterpret_cast<char*
>(&gpsWeek),
sizeof(gpsWeek));
1428 readFromFilestream(
reinterpret_cast<char*
>(&tow),
sizeof(tow));
1429 if (gpsCycle || gpsWeek)
1431 obs->insTime =
InsTime(gpsCycle, gpsWeek, tow);
1437 if (!obs->timeOutputs)
1439 obs->timeOutputs = std::make_shared<NAV::vendor::vectornav::TimeOutputs>();
1443 if (obs->timeOutputs->timeField & vn::protocol::uart::TimeGroup::TIMEGROUP_TIMESTARTUP)
1445 read(
reinterpret_cast<char*
>(&obs->timeOutputs->timeStartup),
sizeof(obs->timeOutputs->timeStartup));
1447 if (obs->timeOutputs->timeField & vn::protocol::uart::TimeGroup::TIMEGROUP_TIMEGPS)
1449 read(
reinterpret_cast<char*
>(&obs->timeOutputs->timeGps),
sizeof(obs->timeOutputs->timeGps));
1451 if (obs->timeOutputs->timeField & vn::protocol::uart::TimeGroup::TIMEGROUP_GPSTOW)
1453 read(
reinterpret_cast<char*
>(&obs->timeOutputs->gpsTow),
sizeof(obs->timeOutputs->gpsTow));
1455 if (obs->timeOutputs->timeField & vn::protocol::uart::TimeGroup::TIMEGROUP_GPSWEEK)
1457 read(
reinterpret_cast<char*
>(&obs->timeOutputs->gpsWeek),
sizeof(obs->timeOutputs->gpsWeek));
1459 if (obs->timeOutputs->timeField & vn::protocol::uart::TimeGroup::TIMEGROUP_TIMESYNCIN)
1461 read(
reinterpret_cast<char*
>(&obs->timeOutputs->timeSyncIn),
sizeof(obs->timeOutputs->timeSyncIn));
1463 if (obs->timeOutputs->timeField & vn::protocol::uart::TimeGroup::TIMEGROUP_TIMEGPSPPS)
1465 read(
reinterpret_cast<char*
>(&obs->timeOutputs->timePPS),
sizeof(obs->timeOutputs->timePPS));
1467 if (obs->timeOutputs->timeField & vn::protocol::uart::TimeGroup::TIMEGROUP_TIMEUTC)
1469 read(
reinterpret_cast<char*
>(&obs->timeOutputs->timeUtc.year),
sizeof(obs->timeOutputs->timeUtc.year));
1470 read(
reinterpret_cast<char*
>(&obs->timeOutputs->timeUtc.month),
sizeof(obs->timeOutputs->timeUtc.month));
1471 read(
reinterpret_cast<char*
>(&obs->timeOutputs->timeUtc.day),
sizeof(obs->timeOutputs->timeUtc.day));
1472 read(
reinterpret_cast<char*
>(&obs->timeOutputs->timeUtc.hour),
sizeof(obs->timeOutputs->timeUtc.hour));
1473 read(
reinterpret_cast<char*
>(&obs->timeOutputs->timeUtc.min),
sizeof(obs->timeOutputs->timeUtc.min));
1474 read(
reinterpret_cast<char*
>(&obs->timeOutputs->timeUtc.sec),
sizeof(obs->timeOutputs->timeUtc.sec));
1475 read(
reinterpret_cast<char*
>(&obs->timeOutputs->timeUtc.ms),
sizeof(obs->timeOutputs->timeUtc.ms));
1477 if (obs->timeOutputs->timeField & vn::protocol::uart::TimeGroup::TIMEGROUP_SYNCINCNT)
1479 read(
reinterpret_cast<char*
>(&obs->timeOutputs->syncInCnt),
sizeof(obs->timeOutputs->syncInCnt));
1481 if (obs->timeOutputs->timeField & vn::protocol::uart::TimeGroup::TIMEGROUP_SYNCOUTCNT)
1483 read(
reinterpret_cast<char*
>(&obs->timeOutputs->syncOutCnt),
sizeof(obs->timeOutputs->syncOutCnt));
1485 if (obs->timeOutputs->timeField & vn::protocol::uart::TimeGroup::TIMEGROUP_TIMESTATUS)
1487 read(
reinterpret_cast<char*
>(&obs->timeOutputs->timeStatus.status()),
sizeof(obs->timeOutputs->timeStatus.status()));
1493 if (!obs->imuOutputs)
1495 obs->imuOutputs = std::make_shared<NAV::vendor::vectornav::ImuOutputs>();
1499 if (obs->imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_IMUSTATUS)
1501 read(
reinterpret_cast<char*
>(&obs->imuOutputs->imuStatus),
sizeof(obs->imuOutputs->imuStatus));
1503 if (obs->imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_UNCOMPMAG)
1505 read(
reinterpret_cast<char*
>(obs->imuOutputs->uncompMag.data()),
sizeof(obs->imuOutputs->uncompMag));
1507 if (obs->imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_UNCOMPACCEL)
1509 read(
reinterpret_cast<char*
>(obs->imuOutputs->uncompAccel.data()),
sizeof(obs->imuOutputs->uncompAccel));
1511 if (obs->imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_UNCOMPGYRO)
1513 read(
reinterpret_cast<char*
>(obs->imuOutputs->uncompGyro.data()),
sizeof(obs->imuOutputs->uncompGyro));
1515 if (obs->imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_TEMP)
1517 read(
reinterpret_cast<char*
>(&obs->imuOutputs->temp),
sizeof(obs->imuOutputs->temp));
1519 if (obs->imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_PRES)
1521 read(
reinterpret_cast<char*
>(&obs->imuOutputs->pres),
sizeof(obs->imuOutputs->pres));
1523 if (obs->imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_DELTATHETA)
1525 read(
reinterpret_cast<char*
>(&obs->imuOutputs->deltaTime),
sizeof(obs->imuOutputs->deltaTime));
1526 read(
reinterpret_cast<char*
>(obs->imuOutputs->deltaTheta.data()),
sizeof(obs->imuOutputs->deltaTheta));
1528 if (obs->imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_DELTAVEL)
1530 read(
reinterpret_cast<char*
>(obs->imuOutputs->deltaV.data()),
sizeof(obs->imuOutputs->deltaV));
1532 if (obs->imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_MAG)
1534 read(
reinterpret_cast<char*
>(obs->imuOutputs->mag.data()),
sizeof(obs->imuOutputs->mag));
1536 if (obs->imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_ACCEL)
1538 read(
reinterpret_cast<char*
>(obs->imuOutputs->accel.data()),
sizeof(obs->imuOutputs->accel));
1540 if (obs->imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_ANGULARRATE)
1542 read(
reinterpret_cast<char*
>(obs->imuOutputs->angularRate.data()),
sizeof(obs->imuOutputs->angularRate));
1548 if (!obs->gnss1Outputs)
1550 obs->gnss1Outputs = std::make_shared<NAV::vendor::vectornav::GnssOutputs>();
1554 if (obs->gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_UTC)
1556 read(
reinterpret_cast<char*
>(&obs->gnss1Outputs->timeUtc.year),
sizeof(obs->gnss1Outputs->timeUtc.year));
1557 read(
reinterpret_cast<char*
>(&obs->gnss1Outputs->timeUtc.month),
sizeof(obs->gnss1Outputs->timeUtc.month));
1558 read(
reinterpret_cast<char*
>(&obs->gnss1Outputs->timeUtc.day),
sizeof(obs->gnss1Outputs->timeUtc.day));
1559 read(
reinterpret_cast<char*
>(&obs->gnss1Outputs->timeUtc.hour),
sizeof(obs->gnss1Outputs->timeUtc.hour));
1560 read(
reinterpret_cast<char*
>(&obs->gnss1Outputs->timeUtc.min),
sizeof(obs->gnss1Outputs->timeUtc.min));
1561 read(
reinterpret_cast<char*
>(&obs->gnss1Outputs->timeUtc.sec),
sizeof(obs->gnss1Outputs->timeUtc.sec));
1562 read(
reinterpret_cast<char*
>(&obs->gnss1Outputs->timeUtc.ms),
sizeof(obs->gnss1Outputs->timeUtc.ms));
1564 if (obs->gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_TOW)
1566 read(
reinterpret_cast<char*
>(&obs->gnss1Outputs->tow),
sizeof(obs->gnss1Outputs->tow));
1568 if (obs->gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_WEEK)
1570 read(
reinterpret_cast<char*
>(&obs->gnss1Outputs->week),
sizeof(obs->gnss1Outputs->week));
1572 if (obs->gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_NUMSATS)
1574 read(
reinterpret_cast<char*
>(&obs->gnss1Outputs->numSats),
sizeof(obs->gnss1Outputs->numSats));
1576 if (obs->gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_FIX)
1578 read(
reinterpret_cast<char*
>(&obs->gnss1Outputs->fix),
sizeof(obs->gnss1Outputs->fix));
1580 if (obs->gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_POSLLA)
1582 read(
reinterpret_cast<char*
>(obs->gnss1Outputs->posLla.data()),
sizeof(obs->gnss1Outputs->posLla));
1584 if (obs->gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_POSECEF)
1586 read(
reinterpret_cast<char*
>(obs->gnss1Outputs->posEcef.data()),
sizeof(obs->gnss1Outputs->posEcef));
1588 if (obs->gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_VELNED)
1590 read(
reinterpret_cast<char*
>(obs->gnss1Outputs->velNed.data()),
sizeof(obs->gnss1Outputs->velNed));
1592 if (obs->gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_VELECEF)
1594 read(
reinterpret_cast<char*
>(obs->gnss1Outputs->velEcef.data()),
sizeof(obs->gnss1Outputs->velEcef));
1596 if (obs->gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_POSU)
1598 read(
reinterpret_cast<char*
>(obs->gnss1Outputs->posU.data()),
sizeof(obs->gnss1Outputs->posU));
1600 if (obs->gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_VELU)
1602 read(
reinterpret_cast<char*
>(&obs->gnss1Outputs->velU),
sizeof(obs->gnss1Outputs->velU));
1604 if (obs->gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_TIMEU)
1606 read(
reinterpret_cast<char*
>(&obs->gnss1Outputs->timeU),
sizeof(obs->gnss1Outputs->timeU));
1608 if (obs->gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_TIMEINFO)
1610 read(
reinterpret_cast<char*
>(&obs->gnss1Outputs->timeInfo.status.status()),
sizeof(obs->gnss1Outputs->timeInfo.status.status()));
1611 read(
reinterpret_cast<char*
>(&obs->gnss1Outputs->timeInfo.leapSeconds),
sizeof(obs->gnss1Outputs->timeInfo.leapSeconds));
1613 if (obs->gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_DOP)
1615 read(
reinterpret_cast<char*
>(&obs->gnss1Outputs->dop.gDop),
sizeof(obs->gnss1Outputs->dop.gDop));
1616 read(
reinterpret_cast<char*
>(&obs->gnss1Outputs->dop.pDop),
sizeof(obs->gnss1Outputs->dop.pDop));
1617 read(
reinterpret_cast<char*
>(&obs->gnss1Outputs->dop.tDop),
sizeof(obs->gnss1Outputs->dop.tDop));
1618 read(
reinterpret_cast<char*
>(&obs->gnss1Outputs->dop.vDop),
sizeof(obs->gnss1Outputs->dop.vDop));
1619 read(
reinterpret_cast<char*
>(&obs->gnss1Outputs->dop.hDop),
sizeof(obs->gnss1Outputs->dop.hDop));
1620 read(
reinterpret_cast<char*
>(&obs->gnss1Outputs->dop.nDop),
sizeof(obs->gnss1Outputs->dop.nDop));
1621 read(
reinterpret_cast<char*
>(&obs->gnss1Outputs->dop.eDop),
sizeof(obs->gnss1Outputs->dop.eDop));
1623 if (obs->gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_SATINFO)
1625 read(
reinterpret_cast<char*
>(&obs->gnss1Outputs->satInfo.numSats),
sizeof(obs->gnss1Outputs->satInfo.numSats));
1626 obs->gnss1Outputs->satInfo.satellites.resize(obs->gnss1Outputs->satInfo.numSats);
1628 for (
auto& satellite : obs->gnss1Outputs->satInfo.satellites)
1630 read(
reinterpret_cast<char*
>(&satellite.sys),
sizeof(satellite.sys));
1631 read(
reinterpret_cast<char*
>(&satellite.svId),
sizeof(satellite.svId));
1632 read(
reinterpret_cast<char*
>(&satellite.flags),
sizeof(satellite.flags));
1633 read(
reinterpret_cast<char*
>(&satellite.cno),
sizeof(satellite.cno));
1634 read(
reinterpret_cast<char*
>(&satellite.qi),
sizeof(satellite.qi));
1635 read(
reinterpret_cast<char*
>(&satellite.el),
sizeof(satellite.el));
1636 read(
reinterpret_cast<char*
>(&satellite.az),
sizeof(satellite.az));
1639 if (obs->gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_RAWMEAS)
1641 read(
reinterpret_cast<char*
>(&obs->gnss1Outputs->raw.tow),
sizeof(obs->gnss1Outputs->raw.tow));
1642 read(
reinterpret_cast<char*
>(&obs->gnss1Outputs->raw.week),
sizeof(obs->gnss1Outputs->raw.week));
1643 read(
reinterpret_cast<char*
>(&obs->gnss1Outputs->raw.numSats),
sizeof(obs->gnss1Outputs->raw.numSats));
1644 obs->gnss1Outputs->raw.satellites.resize(obs->gnss1Outputs->raw.numSats);
1646 for (
auto& satellite : obs->gnss1Outputs->raw.satellites)
1648 read(
reinterpret_cast<char*
>(&satellite.sys),
sizeof(satellite.sys));
1649 read(
reinterpret_cast<char*
>(&satellite.svId),
sizeof(satellite.svId));
1650 read(
reinterpret_cast<char*
>(&satellite.freq),
sizeof(satellite.freq));
1651 read(
reinterpret_cast<char*
>(&satellite.chan),
sizeof(satellite.chan));
1652 read(
reinterpret_cast<char*
>(&satellite.slot),
sizeof(satellite.slot));
1653 read(
reinterpret_cast<char*
>(&satellite.cno),
sizeof(satellite.cno));
1654 read(
reinterpret_cast<char*
>(&satellite.flags),
sizeof(satellite.flags));
1655 read(
reinterpret_cast<char*
>(&satellite.pr),
sizeof(satellite.pr));
1656 read(
reinterpret_cast<char*
>(&satellite.cp),
sizeof(satellite.cp));
1657 read(
reinterpret_cast<char*
>(&satellite.dp),
sizeof(satellite.dp));
1664 if (!obs->attitudeOutputs)
1666 obs->attitudeOutputs = std::make_shared<NAV::vendor::vectornav::AttitudeOutputs>();
1670 if (obs->attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_VPESTATUS)
1672 read(
reinterpret_cast<char*
>(&obs->attitudeOutputs->vpeStatus.status()),
sizeof(obs->attitudeOutputs->vpeStatus.status()));
1674 if (obs->attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_YAWPITCHROLL)
1676 read(
reinterpret_cast<char*
>(obs->attitudeOutputs->ypr.data()),
sizeof(obs->attitudeOutputs->ypr));
1678 if (obs->attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_QUATERNION)
1680 read(
reinterpret_cast<char*
>(obs->attitudeOutputs->qtn.coeffs().data()),
sizeof(obs->attitudeOutputs->qtn));
1682 if (obs->attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_DCM)
1684 read(
reinterpret_cast<char*
>(obs->attitudeOutputs->dcm.data()),
sizeof(obs->attitudeOutputs->dcm));
1686 if (obs->attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_MAGNED)
1688 read(
reinterpret_cast<char*
>(obs->attitudeOutputs->magNed.data()),
sizeof(obs->attitudeOutputs->magNed));
1690 if (obs->attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_ACCELNED)
1692 read(
reinterpret_cast<char*
>(obs->attitudeOutputs->accelNed.data()),
sizeof(obs->attitudeOutputs->accelNed));
1694 if (obs->attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_LINEARACCELBODY)
1696 read(
reinterpret_cast<char*
>(obs->attitudeOutputs->linearAccelBody.data()),
sizeof(obs->attitudeOutputs->linearAccelBody));
1698 if (obs->attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_LINEARACCELNED)
1700 read(
reinterpret_cast<char*
>(obs->attitudeOutputs->linearAccelNed.data()),
sizeof(obs->attitudeOutputs->linearAccelNed));
1702 if (obs->attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_YPRU)
1704 read(
reinterpret_cast<char*
>(obs->attitudeOutputs->yprU.data()),
sizeof(obs->attitudeOutputs->yprU));
1710 if (!obs->insOutputs)
1712 obs->insOutputs = std::make_shared<NAV::vendor::vectornav::InsOutputs>();
1716 if (obs->insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_INSSTATUS)
1718 read(
reinterpret_cast<char*
>(&obs->insOutputs->insStatus.status()),
sizeof(obs->insOutputs->insStatus.status()));
1720 if (obs->insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_POSLLA)
1722 read(
reinterpret_cast<char*
>(obs->insOutputs->posLla.data()),
sizeof(obs->insOutputs->posLla));
1724 if (obs->insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_POSECEF)
1726 read(
reinterpret_cast<char*
>(obs->insOutputs->posEcef.data()),
sizeof(obs->insOutputs->posEcef));
1728 if (obs->insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_VELBODY)
1730 read(
reinterpret_cast<char*
>(obs->insOutputs->velBody.data()),
sizeof(obs->insOutputs->velBody));
1732 if (obs->insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_VELNED)
1734 read(
reinterpret_cast<char*
>(obs->insOutputs->velNed.data()),
sizeof(obs->insOutputs->velNed));
1736 if (obs->insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_VELECEF)
1738 read(
reinterpret_cast<char*
>(obs->insOutputs->velEcef.data()),
sizeof(obs->insOutputs->velEcef));
1740 if (obs->insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_MAGECEF)
1742 read(
reinterpret_cast<char*
>(obs->insOutputs->magEcef.data()),
sizeof(obs->insOutputs->magEcef));
1744 if (obs->insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_ACCELECEF)
1746 read(
reinterpret_cast<char*
>(obs->insOutputs->accelEcef.data()),
sizeof(obs->insOutputs->accelEcef));
1748 if (obs->insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_LINEARACCELECEF)
1750 read(
reinterpret_cast<char*
>(obs->insOutputs->linearAccelEcef.data()),
sizeof(obs->insOutputs->linearAccelEcef));
1752 if (obs->insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_POSU)
1754 read(
reinterpret_cast<char*
>(&obs->insOutputs->posU),
sizeof(obs->insOutputs->posU));
1756 if (obs->insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_VELU)
1758 read(
reinterpret_cast<char*
>(&obs->insOutputs->velU),
sizeof(obs->insOutputs->velU));
1764 if (!obs->gnss2Outputs)
1766 obs->gnss2Outputs = std::make_shared<NAV::vendor::vectornav::GnssOutputs>();
1770 if (obs->gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_UTC)
1772 read(
reinterpret_cast<char*
>(&obs->gnss2Outputs->timeUtc.year),
sizeof(obs->gnss2Outputs->timeUtc.year));
1773 read(
reinterpret_cast<char*
>(&obs->gnss2Outputs->timeUtc.month),
sizeof(obs->gnss2Outputs->timeUtc.month));
1774 read(
reinterpret_cast<char*
>(&obs->gnss2Outputs->timeUtc.day),
sizeof(obs->gnss2Outputs->timeUtc.day));
1775 read(
reinterpret_cast<char*
>(&obs->gnss2Outputs->timeUtc.hour),
sizeof(obs->gnss2Outputs->timeUtc.hour));
1776 read(
reinterpret_cast<char*
>(&obs->gnss2Outputs->timeUtc.min),
sizeof(obs->gnss2Outputs->timeUtc.min));
1777 read(
reinterpret_cast<char*
>(&obs->gnss2Outputs->timeUtc.sec),
sizeof(obs->gnss2Outputs->timeUtc.sec));
1778 read(
reinterpret_cast<char*
>(&obs->gnss2Outputs->timeUtc.ms),
sizeof(obs->gnss2Outputs->timeUtc.ms));
1780 if (obs->gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_TOW)
1782 read(
reinterpret_cast<char*
>(&obs->gnss2Outputs->tow),
sizeof(obs->gnss2Outputs->tow));
1784 if (obs->gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_WEEK)
1786 read(
reinterpret_cast<char*
>(&obs->gnss2Outputs->week),
sizeof(obs->gnss2Outputs->week));
1788 if (obs->gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_NUMSATS)
1790 read(
reinterpret_cast<char*
>(&obs->gnss2Outputs->numSats),
sizeof(obs->gnss2Outputs->numSats));
1792 if (obs->gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_FIX)
1794 read(
reinterpret_cast<char*
>(&obs->gnss2Outputs->fix),
sizeof(obs->gnss2Outputs->fix));
1796 if (obs->gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_POSLLA)
1798 read(
reinterpret_cast<char*
>(obs->gnss2Outputs->posLla.data()),
sizeof(obs->gnss2Outputs->posLla));
1800 if (obs->gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_POSECEF)
1802 read(
reinterpret_cast<char*
>(obs->gnss2Outputs->posEcef.data()),
sizeof(obs->gnss2Outputs->posEcef));
1804 if (obs->gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_VELNED)
1806 read(
reinterpret_cast<char*
>(obs->gnss2Outputs->velNed.data()),
sizeof(obs->gnss2Outputs->velNed));
1808 if (obs->gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_VELECEF)
1810 read(
reinterpret_cast<char*
>(obs->gnss2Outputs->velEcef.data()),
sizeof(obs->gnss2Outputs->velEcef));
1812 if (obs->gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_POSU)
1814 read(
reinterpret_cast<char*
>(obs->gnss2Outputs->posU.data()),
sizeof(obs->gnss2Outputs->posU));
1816 if (obs->gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_VELU)
1818 read(
reinterpret_cast<char*
>(&obs->gnss2Outputs->velU),
sizeof(obs->gnss2Outputs->velU));
1820 if (obs->gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_TIMEU)
1822 read(
reinterpret_cast<char*
>(&obs->gnss2Outputs->timeU),
sizeof(obs->gnss2Outputs->timeU));
1824 if (obs->gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_TIMEINFO)
1826 read(
reinterpret_cast<char*
>(&obs->gnss2Outputs->timeInfo.status.status()),
sizeof(obs->gnss2Outputs->timeInfo.status.status()));
1827 read(
reinterpret_cast<char*
>(&obs->gnss2Outputs->timeInfo.leapSeconds),
sizeof(obs->gnss2Outputs->timeInfo.leapSeconds));
1829 if (obs->gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_DOP)
1831 read(
reinterpret_cast<char*
>(&obs->gnss2Outputs->dop.gDop),
sizeof(obs->gnss2Outputs->dop.gDop));
1832 read(
reinterpret_cast<char*
>(&obs->gnss2Outputs->dop.pDop),
sizeof(obs->gnss2Outputs->dop.pDop));
1833 read(
reinterpret_cast<char*
>(&obs->gnss2Outputs->dop.tDop),
sizeof(obs->gnss2Outputs->dop.tDop));
1834 read(
reinterpret_cast<char*
>(&obs->gnss2Outputs->dop.vDop),
sizeof(obs->gnss2Outputs->dop.vDop));
1835 read(
reinterpret_cast<char*
>(&obs->gnss2Outputs->dop.hDop),
sizeof(obs->gnss2Outputs->dop.hDop));
1836 read(
reinterpret_cast<char*
>(&obs->gnss2Outputs->dop.nDop),
sizeof(obs->gnss2Outputs->dop.nDop));
1837 read(
reinterpret_cast<char*
>(&obs->gnss2Outputs->dop.eDop),
sizeof(obs->gnss2Outputs->dop.eDop));
1839 if (obs->gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_SATINFO)
1841 read(
reinterpret_cast<char*
>(&obs->gnss2Outputs->satInfo.numSats),
sizeof(obs->gnss2Outputs->satInfo.numSats));
1842 obs->gnss2Outputs->satInfo.satellites.resize(obs->gnss2Outputs->satInfo.numSats);
1844 for (
auto& satellite : obs->gnss2Outputs->satInfo.satellites)
1846 read(
reinterpret_cast<char*
>(&satellite.sys),
sizeof(satellite.sys));
1847 read(
reinterpret_cast<char*
>(&satellite.svId),
sizeof(satellite.svId));
1848 read(
reinterpret_cast<char*
>(&satellite.flags),
sizeof(satellite.flags));
1849 read(
reinterpret_cast<char*
>(&satellite.cno),
sizeof(satellite.cno));
1850 read(
reinterpret_cast<char*
>(&satellite.qi),
sizeof(satellite.qi));
1851 read(
reinterpret_cast<char*
>(&satellite.el),
sizeof(satellite.el));
1852 read(
reinterpret_cast<char*
>(&satellite.az),
sizeof(satellite.az));
1855 if (obs->gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_RAWMEAS)
1857 read(
reinterpret_cast<char*
>(&obs->gnss2Outputs->raw.tow),
sizeof(obs->gnss2Outputs->raw.tow));
1858 read(
reinterpret_cast<char*
>(&obs->gnss2Outputs->raw.week),
sizeof(obs->gnss2Outputs->raw.week));
1859 read(
reinterpret_cast<char*
>(&obs->gnss2Outputs->raw.numSats),
sizeof(obs->gnss2Outputs->raw.numSats));
1860 obs->gnss2Outputs->raw.satellites.resize(obs->gnss2Outputs->raw.numSats);
1862 for (
auto& satellite : obs->gnss2Outputs->raw.satellites)
1864 read(
reinterpret_cast<char*
>(&satellite.sys),
sizeof(satellite.sys));
1865 read(
reinterpret_cast<char*
>(&satellite.svId),
sizeof(satellite.svId));
1866 read(
reinterpret_cast<char*
>(&satellite.freq),
sizeof(satellite.freq));
1867 read(
reinterpret_cast<char*
>(&satellite.chan),
sizeof(satellite.chan));
1868 read(
reinterpret_cast<char*
>(&satellite.slot),
sizeof(satellite.slot));
1869 read(
reinterpret_cast<char*
>(&satellite.cno),
sizeof(satellite.cno));
1870 read(
reinterpret_cast<char*
>(&satellite.flags),
sizeof(satellite.flags));
1871 read(
reinterpret_cast<char*
>(&satellite.pr),
sizeof(satellite.pr));
1872 read(
reinterpret_cast<char*
>(&satellite.cp),
sizeof(satellite.cp));
1873 read(
reinterpret_cast<char*
>(&satellite.dp),
sizeof(satellite.dp));
1878 catch (
const std::exception& e)
1885 if (!obs->timeOutputs && !obs->imuOutputs && !obs->gnss1Outputs && !obs->attitudeOutputs && !obs->insOutputs && !obs->gnss2Outputs)
1890 if (obs->insTime.empty())