415 auto obs = std::make_shared<VectorNavBinaryOutput>(
_imuPos);
424 line.erase(line.begin(), std::ranges::find_if(line, [](
int ch) { return std::isgraph(ch); }));
434 std::stringstream lineStream(line);
437 auto extractCell = [&lineStream, &col]() {
438 if (lineStream.eof())
440 throw std::runtime_error(
"End of file");
443 if (std::string cell; std::getline(lineStream, cell,
','))
446 cell.erase(std::ranges::find_if(cell, [](
int ch) {
return std::iscntrl(ch); }), cell.end());
451 return std::string(
"");
453 auto extractRemoveTillDelimiter = [](std::string&
str,
const std::string& delimiter) {
455 if (
size_t pos =
str.find(delimiter);
456 pos != std::string::npos)
458 extract =
str.substr(0, pos);
459 str =
str.substr(pos + 1);
465 auto extractSingleValue = [&](
auto& field,
auto flag,
auto& out) {
466 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)>
467 || std::is_same_v<int8_t&,
decltype(out)> || std::is_same_v<int16_t&,
decltype(out)> || std::is_same_v<int32_t&,
decltype(out)>
468 || std::is_same_v<
float&,
decltype(out)> || std::is_same_v<
double&,
decltype(out)>
469 || std::is_same_v<std::string&,
decltype(out)>);
471 auto cell = extractCell();
472 LOG_DATA(
"{}: Extracting {}: {}",
nameId(), vn::protocol::uart::to_string(flag), cell);
474 if (cell.empty()) {
return; }
477 if constexpr (std::is_same_v<
bool&,
decltype(out)>
478 || std::is_same_v<uint8_t&,
decltype(out)>
479 || std::is_same_v<uint16_t&,
decltype(out)>
480 || std::is_same_v<uint32_t&,
decltype(out)>)
482 out =
static_cast<std::remove_reference_t<decltype(out)
>>(std::stoul(cell));
484 else if constexpr (std::is_same_v<uint64_t&,
decltype(out)>)
486 out =
static_cast<std::remove_reference_t<decltype(out)
>>(std::stoull(cell));
488 else if constexpr (std::is_same_v<int8_t&,
decltype(out)>
489 || std::is_same_v<int16_t&,
decltype(out)>
490 || std::is_same_v<int32_t&,
decltype(out)>)
492 out =
static_cast<std::remove_reference_t<decltype(out)
>>(std::stoi(cell));
494 else if constexpr (std::is_same_v<
float&,
decltype(out)>)
496 out =
static_cast<std::remove_reference_t<decltype(out)
>>(std::stof(cell));
498 else if constexpr (std::is_same_v<
double&,
decltype(out)>)
500 out =
static_cast<std::remove_reference_t<decltype(out)
>>(std::stod(cell));
502 else if constexpr (std::is_same_v<std::string&,
decltype(out)>)
508 auto extractValue = [&](
auto& field,
auto flag,
auto&... out) {
509 (extractSingleValue(field, flag, out), ...);
515 std::string gpsCycle = extractCell();
516 std::string gpsWeek = extractCell();
517 std::string gpsTow = extractCell();
518 if (!gpsCycle.empty() && !gpsWeek.empty() && !gpsTow.empty())
520 obs->insTime =
InsTime(std::stoi(gpsCycle), std::stoi(gpsWeek), std::stold(gpsTow));
534 if (!obs->timeOutputs) { obs->timeOutputs = std::make_shared<NAV::vendor::vectornav::TimeOutputs>(); }
536 if (column ==
"Time::TimeStartup [ns]")
538 extractValue(obs->timeOutputs->timeField, vn::protocol::uart::TimeGroup::TIMEGROUP_TIMESTARTUP, obs->timeOutputs->timeStartup);
541 if (column ==
"Time::TimeGps [ns]")
543 extractValue(obs->timeOutputs->timeField, vn::protocol::uart::TimeGroup::TIMEGROUP_TIMEGPS, obs->timeOutputs->timeGps);
546 if (column ==
"Time::GpsTow [ns]")
548 extractValue(obs->timeOutputs->timeField, vn::protocol::uart::TimeGroup::TIMEGROUP_GPSTOW, obs->timeOutputs->gpsTow);
551 if (column ==
"Time::GpsWeek")
553 extractValue(obs->timeOutputs->timeField, vn::protocol::uart::TimeGroup::TIMEGROUP_GPSWEEK, obs->timeOutputs->gpsWeek);
556 if (column ==
"Time::TimeSyncIn [ns]")
558 extractValue(obs->timeOutputs->timeField, vn::protocol::uart::TimeGroup::TIMEGROUP_TIMESYNCIN, obs->timeOutputs->timeSyncIn);
561 if (column ==
"Time::TimeGpsPps [ns]")
563 extractValue(obs->timeOutputs->timeField, vn::protocol::uart::TimeGroup::TIMEGROUP_TIMEGPSPPS, obs->timeOutputs->timePPS);
566 if (column ==
"Time::TimeUTC::year")
568 extractValue(obs->timeOutputs->timeField, vn::protocol::uart::TimeGroup::TIMEGROUP_TIMEUTC,
569 obs->timeOutputs->timeUtc.year, obs->timeOutputs->timeUtc.month, obs->timeOutputs->timeUtc.day,
570 obs->timeOutputs->timeUtc.hour, obs->timeOutputs->timeUtc.min, obs->timeOutputs->timeUtc.sec, obs->timeOutputs->timeUtc.ms);
573 if (column ==
"Time::SyncInCnt")
575 extractValue(obs->timeOutputs->timeField, vn::protocol::uart::TimeGroup::TIMEGROUP_SYNCINCNT, obs->timeOutputs->syncInCnt);
578 if (column ==
"Time::SyncOutCnt")
580 extractValue(obs->timeOutputs->timeField, vn::protocol::uart::TimeGroup::TIMEGROUP_SYNCOUTCNT, obs->timeOutputs->syncOutCnt);
583 if (column ==
"Time::TimeStatus::timeOk")
587 uint8_t utcTimeValid{};
588 extractValue(obs->timeOutputs->timeField, vn::protocol::uart::TimeGroup::TIMEGROUP_TIMESTATUS, timeOk, dateOk, utcTimeValid);
589 obs->timeOutputs->timeStatus =
static_cast<uint8_t
>(timeOk << 0U | dateOk << 1U | utcTimeValid << 2U);
596 if (!obs->imuOutputs) { obs->imuOutputs = std::make_shared<NAV::vendor::vectornav::ImuOutputs>(); }
598 if (column ==
"IMU::ImuStatus")
600 extractValue(obs->imuOutputs->imuField, vn::protocol::uart::ImuGroup::IMUGROUP_IMUSTATUS, obs->imuOutputs->imuStatus);
603 if (column.starts_with(
"IMU::UncompMag::X"))
605 extractValue(obs->imuOutputs->imuField, vn::protocol::uart::ImuGroup::IMUGROUP_UNCOMPMAG,
606 obs->imuOutputs->uncompMag.x(), obs->imuOutputs->uncompMag.y(), obs->imuOutputs->uncompMag.z());
609 if (column.starts_with(
"IMU::UncompAccel::X"))
611 extractValue(obs->imuOutputs->imuField, vn::protocol::uart::ImuGroup::IMUGROUP_UNCOMPACCEL,
612 obs->imuOutputs->uncompAccel.x(), obs->imuOutputs->uncompAccel.y(), obs->imuOutputs->uncompAccel.z());
615 if (column.starts_with(
"IMU::UncompGyro::X"))
617 extractValue(obs->imuOutputs->imuField, vn::protocol::uart::ImuGroup::IMUGROUP_UNCOMPGYRO,
618 obs->imuOutputs->uncompGyro.x(), obs->imuOutputs->uncompGyro.y(), obs->imuOutputs->uncompGyro.z());
621 if (column.starts_with(
"IMU::Temp"))
623 extractValue(obs->imuOutputs->imuField, vn::protocol::uart::ImuGroup::IMUGROUP_TEMP, obs->imuOutputs->temp);
626 if (column.starts_with(
"IMU::Pres"))
628 extractValue(obs->imuOutputs->imuField, vn::protocol::uart::ImuGroup::IMUGROUP_PRES, obs->imuOutputs->pres);
631 if (column.starts_with(
"IMU::DeltaTime"))
633 extractValue(obs->imuOutputs->imuField, vn::protocol::uart::ImuGroup::IMUGROUP_DELTATHETA,
634 obs->imuOutputs->deltaTime, obs->imuOutputs->deltaTheta.x(), obs->imuOutputs->deltaTheta.y(), obs->imuOutputs->deltaTheta.z());
637 if (column.starts_with(
"IMU::DeltaVel::X"))
639 extractValue(obs->imuOutputs->imuField, vn::protocol::uart::ImuGroup::IMUGROUP_DELTAVEL,
640 obs->imuOutputs->deltaV.x(), obs->imuOutputs->deltaV.y(), obs->imuOutputs->deltaV.z());
643 if (column.starts_with(
"IMU::Mag::X"))
645 extractValue(obs->imuOutputs->imuField, vn::protocol::uart::ImuGroup::IMUGROUP_MAG,
646 obs->imuOutputs->mag.x(), obs->imuOutputs->mag.y(), obs->imuOutputs->mag.z());
649 if (column.starts_with(
"IMU::Accel::X"))
651 extractValue(obs->imuOutputs->imuField, vn::protocol::uart::ImuGroup::IMUGROUP_ACCEL,
652 obs->imuOutputs->accel.x(), obs->imuOutputs->accel.y(), obs->imuOutputs->accel.z());
655 if (column.starts_with(
"IMU::AngularRate::X"))
657 extractValue(obs->imuOutputs->imuField, vn::protocol::uart::ImuGroup::IMUGROUP_ANGULARRATE,
658 obs->imuOutputs->angularRate.x(), obs->imuOutputs->angularRate.y(), obs->imuOutputs->angularRate.z());
665 if (!obs->gnss1Outputs) { obs->gnss1Outputs = std::make_shared<NAV::vendor::vectornav::GnssOutputs>(); }
667 if (column ==
"GNSS1::UTC::year")
669 extractValue(obs->gnss1Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_UTC,
670 obs->gnss1Outputs->timeUtc.year, obs->gnss1Outputs->timeUtc.month, obs->gnss1Outputs->timeUtc.day,
671 obs->gnss1Outputs->timeUtc.hour, obs->gnss1Outputs->timeUtc.min, obs->gnss1Outputs->timeUtc.sec, obs->gnss1Outputs->timeUtc.ms);
674 if (column ==
"GNSS1::Tow [ns]")
676 extractValue(obs->gnss1Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_TOW, obs->gnss1Outputs->tow);
679 if (column ==
"GNSS1::Week")
681 extractValue(obs->gnss1Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_WEEK, obs->gnss1Outputs->week);
684 if (column ==
"GNSS1::NumSats")
686 extractValue(obs->gnss1Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_NUMSATS, obs->gnss1Outputs->numSats);
689 if (column ==
"GNSS1::Fix")
691 extractValue(obs->gnss1Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_FIX, obs->gnss1Outputs->fix);
694 if (column ==
"GNSS1::PosLla::latitude [deg]")
696 extractValue(obs->gnss1Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_POSLLA,
697 obs->gnss1Outputs->posLla.x(), obs->gnss1Outputs->posLla.y(), obs->gnss1Outputs->posLla.z());
700 if (column ==
"GNSS1::PosEcef::X [m]")
702 extractValue(obs->gnss1Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_POSECEF,
703 obs->gnss1Outputs->posEcef.x(), obs->gnss1Outputs->posEcef.y(), obs->gnss1Outputs->posEcef.z());
706 if (column ==
"GNSS1::VelNed::N [m/s]")
708 extractValue(obs->gnss1Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_VELNED,
709 obs->gnss1Outputs->velNed.x(), obs->gnss1Outputs->velNed.y(), obs->gnss1Outputs->velNed.z());
712 if (column ==
"GNSS1::VelEcef::X [m/s]")
714 extractValue(obs->gnss1Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_VELECEF,
715 obs->gnss1Outputs->velEcef.x(), obs->gnss1Outputs->velEcef.y(), obs->gnss1Outputs->velEcef.z());
718 if (column ==
"GNSS1::PosU::N [m]")
720 extractValue(obs->gnss1Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_POSU,
721 obs->gnss1Outputs->posU.x(), obs->gnss1Outputs->posU.y(), obs->gnss1Outputs->posU.z());
724 if (column ==
"GNSS1::VelU [m/s]")
726 extractValue(obs->gnss1Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_VELU, obs->gnss1Outputs->velU);
729 if (column ==
"GNSS1::TimeU [s]")
731 extractValue(obs->gnss1Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_TIMEU, obs->gnss1Outputs->timeU);
734 if (column ==
"GNSS1::TimeInfo::Status::timeOk")
738 uint8_t utcTimeValid{};
739 extractValue(obs->gnss1Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_TIMEINFO, timeOk, dateOk, utcTimeValid, obs->gnss1Outputs->timeInfo.leapSeconds);
740 obs->gnss1Outputs->timeInfo.status =
static_cast<uint8_t
>(timeOk << 0U | dateOk << 1U | utcTimeValid << 2U);
743 if (column ==
"GNSS1::DOP::g")
745 extractValue(obs->gnss1Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_DOP,
746 obs->gnss1Outputs->dop.gDop, obs->gnss1Outputs->dop.pDop, obs->gnss1Outputs->dop.tDop, obs->gnss1Outputs->dop.vDop,
747 obs->gnss1Outputs->dop.hDop, obs->gnss1Outputs->dop.nDop, obs->gnss1Outputs->dop.eDop);
750 if (column ==
"GNSS1::SatInfo::NumSats")
752 extractValue(obs->gnss1Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_SATINFO, obs->gnss1Outputs->satInfo.numSats);
755 if (column ==
"GNSS1::SatInfo::Satellites")
757 std::string satellites;
758 extractValue(obs->gnss1Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_SATINFO, satellites);
760 for (
size_t i = 0; i < obs->gnss1Outputs->satInfo.numSats; i++)
762 satellites = satellites.substr(1);
763 auto sys =
static_cast<int8_t
>(std::stoi(extractRemoveTillDelimiter(satellites,
"|")));
764 auto svId =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
765 auto flagHealthy =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
766 auto flagAlmanac =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
767 auto flagEphemeris =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
768 auto flagDifferentialCorrection =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
769 auto flagUsedForNavigation =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
770 auto flagAzimuthElevationValid =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
771 auto flagUsedForRTK =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
772 auto flags =
static_cast<uint8_t
>(flagHealthy << 0U
774 | flagEphemeris << 2U
775 | flagDifferentialCorrection << 3U
776 | flagUsedForNavigation << 4U
777 | flagAzimuthElevationValid << 5U
778 | flagUsedForRTK << 6U);
779 auto cno =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
780 auto qi =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
781 auto el =
static_cast<int8_t
>(std::stoi(extractRemoveTillDelimiter(satellites,
"|")));
782 auto az =
static_cast<int16_t
>(std::stoi(extractRemoveTillDelimiter(satellites,
"]")));
783 obs->gnss1Outputs->satInfo.satellites.emplace_back(sys, svId, flags, cno, qi, el, az);
787 if (column.starts_with(
"GNSS1::SatInfo::") && column.ends_with(
" - flag Healthy"))
789 std::string columnText = column.substr(16);
790 SatId satId(extractRemoveTillDelimiter(columnText,
" -"));
794 bool flagEphemeris{};
795 bool flagDifferentialCorrection{};
796 bool flagUsedForNavigation{};
797 bool flagAzimuthElevationValid{};
798 bool flagUsedForRTK{};
799 auto cno = std::numeric_limits<uint8_t>::max();
803 extractValue(obs->gnss1Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_SATINFO,
804 flagHealthy, flagAlmanac, flagEphemeris, flagDifferentialCorrection,
805 flagUsedForNavigation, flagAzimuthElevationValid, flagUsedForRTK,
807 if (cno == std::numeric_limits<uint8_t>::max())
812 auto flags =
static_cast<uint8_t
>(flagHealthy << 0U
814 | flagEphemeris << 2U
815 | flagDifferentialCorrection << 3U
816 | flagUsedForNavigation << 4U
817 | flagAzimuthElevationValid << 5U
818 | flagUsedForRTK << 6U);
820 static_cast<uint8_t
>(satId.
satNum), flags, cno, qi, el, az);
823 if (column ==
"GNSS1::RawMeas::Tow [s]")
825 extractValue(obs->gnss1Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_RAWMEAS, obs->gnss1Outputs->raw.tow);
828 if (column ==
"GNSS1::RawMeas::Week")
830 extractValue(obs->gnss1Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_RAWMEAS, obs->gnss1Outputs->raw.week);
833 if (column ==
"GNSS1::RawMeas::NumSats")
835 extractValue(obs->gnss1Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_RAWMEAS, obs->gnss1Outputs->raw.numSats);
838 if (column ==
"GNSS1::RawMeas::Satellites")
840 std::string satellites;
841 extractValue(obs->gnss1Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_RAWMEAS, satellites);
843 for (
size_t i = 0; i < obs->gnss1Outputs->raw.numSats; i++)
845 satellites = satellites.substr(1);
846 auto sys =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
847 auto svId =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
848 auto freq =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
849 auto chan =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
850 auto slot =
static_cast<int8_t
>(std::stoi(extractRemoveTillDelimiter(satellites,
"|")));
851 auto cno =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
852 auto flagSearching =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
853 auto flagTracking =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
854 auto flagTimeValid =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
855 auto flagCodeLock =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
856 auto flagPhaseLock =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
857 auto flagPhaseHalfAmbiguity =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
858 auto flagPhaseHalfSub =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
859 auto flagPhaseSlip =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
860 auto flagPseudorangeSmoothed =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
861 auto flags =
static_cast<uint16_t
>(flagSearching << 0U
863 | flagTimeValid << 2U
865 | flagPhaseLock << 4U
866 | flagPhaseHalfAmbiguity << 5U
867 | flagPhaseHalfSub << 6U
868 | flagPhaseSlip << 7U
869 | flagPseudorangeSmoothed << 8U);
870 auto pr = std::stod(extractRemoveTillDelimiter(satellites,
"|"));
871 auto cp = std::stod(extractRemoveTillDelimiter(satellites,
"|"));
872 auto dp = std::stof(extractRemoveTillDelimiter(satellites,
"]"));
873 obs->gnss1Outputs->raw.satellites.emplace_back(sys, svId, freq, chan, slot, cno, flags, pr, cp, dp);
877 if (column.starts_with(
"GNSS1::RawMeas::") && column.ends_with(
" - freq"))
879 std::string columnText = column.substr(16);
880 auto identifier = extractRemoveTillDelimiter(columnText,
" - freq");
884 if (identifier.length() == 6)
892 SatId satId(identifier);
896 auto freq = std::numeric_limits<uint8_t>::max();
900 uint8_t flagSearching{};
901 uint8_t flagTracking{};
902 uint8_t flagTimeValid{};
903 uint8_t flagCodeLock{};
904 uint8_t flagPhaseLock{};
905 uint8_t flagPhaseHalfAmbiguity{};
906 uint8_t flagPhaseHalfSub{};
907 uint8_t flagPhaseSlip{};
908 uint8_t flagPseudorangeSmoothed{};
912 extractValue(obs->gnss1Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_RAWMEAS,
913 freq, chan, slot, cno,
914 flagSearching, flagTracking, flagTimeValid, flagCodeLock, flagPhaseLock,
915 flagPhaseHalfAmbiguity, flagPhaseHalfSub, flagPhaseSlip, flagPseudorangeSmoothed,
917 if (freq == std::numeric_limits<uint8_t>::max())
922 auto flags =
static_cast<uint16_t
>(flagSearching << 0U
924 | flagTimeValid << 2U
926 | flagPhaseLock << 4U
927 | flagPhaseHalfAmbiguity << 5U
928 | flagPhaseHalfSub << 6U
929 | flagPhaseSlip << 7U
930 | flagPseudorangeSmoothed << 8U);
932 static_cast<uint8_t
>(satNum), freq, chan, slot, cno, flags, pr, cp, dp);
933 if (obs->gnss1Outputs->raw.satellites.back().toCode() ==
Code::None)
936 obs->gnss1Outputs->raw.satellites.back().sys, obs->gnss1Outputs->raw.satellites.back().freq, obs->gnss1Outputs->raw.satellites.back().chan);
937 obs->gnss1Outputs->raw.satellites.pop_back();
939 if (identifier.length() == 6 &&
SatSigId(identifier) != obs->gnss1Outputs->raw.satellites.back().toSatSigId())
941 LOG_ERROR(
"{}: Line {}: Could not convert to valid SatSigId. Skipping item. (sys {}, freq {}, chan {} = [{}], column was [{}])",
nameId(),
_messageCount + 1,
942 obs->gnss1Outputs->raw.satellites.back().sys, obs->gnss1Outputs->raw.satellites.back().freq, obs->gnss1Outputs->raw.satellites.back().chan,
943 obs->gnss1Outputs->raw.satellites.back().toSatSigId(), identifier);
944 obs->gnss1Outputs->raw.satellites.pop_back();
952 if (!obs->attitudeOutputs) { obs->attitudeOutputs = std::make_shared<NAV::vendor::vectornav::AttitudeOutputs>(); }
954 if (column ==
"Att::VpeStatus::AttitudeQuality")
956 uint8_t attitudeQuality{};
957 uint8_t gyroSaturation{};
958 uint8_t gyroSaturationRecovery{};
959 uint8_t magDisturbance{};
960 uint8_t magSaturation{};
961 uint8_t accDisturbance{};
962 uint8_t accSaturation{};
963 uint8_t knownMagDisturbance{};
964 uint8_t knownAccelDisturbance{};
965 extractValue(obs->attitudeOutputs->attitudeField, vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_VPESTATUS,
966 attitudeQuality, gyroSaturation, gyroSaturationRecovery, magDisturbance, magSaturation, accDisturbance, accSaturation, knownMagDisturbance, knownAccelDisturbance);
967 obs->attitudeOutputs->vpeStatus =
static_cast<uint16_t
>(attitudeQuality << 0U
968 | gyroSaturation << 2U
969 | gyroSaturationRecovery << 3U
970 | magDisturbance << 4U
971 | magSaturation << 6U
972 | accDisturbance << 7U
973 | accSaturation << 9U
974 | knownMagDisturbance << 11U
975 | knownAccelDisturbance << 12U);
978 if (column ==
"Att::YawPitchRoll::Y [deg]")
980 extractValue(obs->attitudeOutputs->attitudeField, vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_YAWPITCHROLL,
981 obs->attitudeOutputs->ypr.x(), obs->attitudeOutputs->ypr.y(), obs->attitudeOutputs->ypr.z());
984 if (column ==
"Att::Quaternion::w")
986 extractValue(obs->attitudeOutputs->attitudeField, vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_QUATERNION,
987 obs->attitudeOutputs->qtn.w(), obs->attitudeOutputs->qtn.x(), obs->attitudeOutputs->qtn.y(), obs->attitudeOutputs->qtn.z());
990 if (column ==
"Att::DCM::0-0")
992 extractValue(obs->attitudeOutputs->attitudeField, vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_DCM,
993 obs->attitudeOutputs->dcm(0, 0), obs->attitudeOutputs->dcm(0, 1), obs->attitudeOutputs->dcm(0, 2),
994 obs->attitudeOutputs->dcm(1, 0), obs->attitudeOutputs->dcm(1, 1), obs->attitudeOutputs->dcm(1, 2),
995 obs->attitudeOutputs->dcm(2, 0), obs->attitudeOutputs->dcm(2, 1), obs->attitudeOutputs->dcm(2, 2));
998 if (column ==
"Att::MagNed::N [Gauss]")
1000 extractValue(obs->attitudeOutputs->attitudeField, vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_MAGNED,
1001 obs->attitudeOutputs->magNed.x(), obs->attitudeOutputs->magNed.y(), obs->attitudeOutputs->magNed.z());
1004 if (column ==
"Att::AccelNed::N [m/s^2]")
1006 extractValue(obs->attitudeOutputs->attitudeField, vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_ACCELNED,
1007 obs->attitudeOutputs->accelNed.x(), obs->attitudeOutputs->accelNed.y(), obs->attitudeOutputs->accelNed.z());
1010 if (column ==
"Att::LinearAccelBody::X [m/s^2]")
1012 extractValue(obs->attitudeOutputs->attitudeField, vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_LINEARACCELBODY,
1013 obs->attitudeOutputs->linearAccelBody.x(), obs->attitudeOutputs->linearAccelBody.y(), obs->attitudeOutputs->linearAccelBody.z());
1016 if (column ==
"Att::LinearAccelNed::N [m/s^2]")
1018 extractValue(obs->attitudeOutputs->attitudeField, vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_LINEARACCELNED,
1019 obs->attitudeOutputs->linearAccelNed.x(), obs->attitudeOutputs->linearAccelNed.y(), obs->attitudeOutputs->linearAccelNed.z());
1022 if (column ==
"Att::YprU::Y [deg]")
1024 extractValue(obs->attitudeOutputs->attitudeField, vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_YPRU,
1025 obs->attitudeOutputs->yprU.x(), obs->attitudeOutputs->yprU.y(), obs->attitudeOutputs->yprU.z());
1032 if (!obs->insOutputs) { obs->insOutputs = std::make_shared<NAV::vendor::vectornav::InsOutputs>(); }
1034 if (column ==
"INS::InsStatus::Mode")
1039 uint8_t errorMagPres{};
1040 uint8_t errorGnss{};
1041 uint8_t gpsHeadingIns{};
1042 uint8_t gpsCompass{};
1043 extractValue(obs->insOutputs->insField, vn::protocol::uart::InsGroup::INSGROUP_INSSTATUS,
1044 mode, gpsFix, errorImu, errorMagPres, errorGnss, gpsHeadingIns, gpsCompass);
1045 obs->insOutputs->insStatus.status() =
static_cast<uint16_t
>(mode << 0U | gpsFix << 2U
1046 | errorImu << 4U | errorMagPres << 5U | errorGnss << 6U
1047 | gpsHeadingIns << 8U | gpsCompass << 9U);
1050 if (column ==
"INS::PosLla::latitude [deg]")
1052 extractValue(obs->insOutputs->insField, vn::protocol::uart::InsGroup::INSGROUP_POSLLA,
1053 obs->insOutputs->posLla.x(), obs->insOutputs->posLla.y(), obs->insOutputs->posLla.z());
1056 if (column ==
"INS::PosEcef::X [m]")
1058 extractValue(obs->insOutputs->insField, vn::protocol::uart::InsGroup::INSGROUP_POSECEF,
1059 obs->insOutputs->posEcef.x(), obs->insOutputs->posEcef.y(), obs->insOutputs->posEcef.z());
1062 if (column ==
"INS::VelBody::X [m/s]")
1064 extractValue(obs->insOutputs->insField, vn::protocol::uart::InsGroup::INSGROUP_VELBODY,
1065 obs->insOutputs->velBody.x(), obs->insOutputs->velBody.y(), obs->insOutputs->velBody.z());
1068 if (column ==
"INS::VelNed::N [m/s]")
1070 extractValue(obs->insOutputs->insField, vn::protocol::uart::InsGroup::INSGROUP_VELNED,
1071 obs->insOutputs->velNed.x(), obs->insOutputs->velNed.y(), obs->insOutputs->velNed.z());
1074 if (column ==
"INS::VelEcef::X [m/s]")
1076 extractValue(obs->insOutputs->insField, vn::protocol::uart::InsGroup::INSGROUP_VELECEF,
1077 obs->insOutputs->velEcef.x(), obs->insOutputs->velEcef.y(), obs->insOutputs->velEcef.z());
1080 if (column ==
"INS::MagEcef::X [Gauss]")
1082 extractValue(obs->insOutputs->insField, vn::protocol::uart::InsGroup::INSGROUP_MAGECEF,
1083 obs->insOutputs->magEcef.x(), obs->insOutputs->magEcef.y(), obs->insOutputs->magEcef.z());
1086 if (column ==
"INS::AccelEcef::X [m/s^2]")
1088 extractValue(obs->insOutputs->insField, vn::protocol::uart::InsGroup::INSGROUP_ACCELECEF,
1089 obs->insOutputs->accelEcef.x(), obs->insOutputs->accelEcef.y(), obs->insOutputs->accelEcef.z());
1092 if (column ==
"INS::LinearAccelEcef::X [m/s^2]")
1094 extractValue(obs->insOutputs->insField, vn::protocol::uart::InsGroup::INSGROUP_LINEARACCELECEF,
1095 obs->insOutputs->linearAccelEcef.x(), obs->insOutputs->linearAccelEcef.y(), obs->insOutputs->linearAccelEcef.z());
1098 if (column ==
"INS::PosU [m]")
1100 extractValue(obs->insOutputs->insField, vn::protocol::uart::InsGroup::INSGROUP_POSU, obs->insOutputs->posU);
1103 if (column ==
"INS::VelU [m/s]")
1105 extractValue(obs->insOutputs->insField, vn::protocol::uart::InsGroup::INSGROUP_VELU, obs->insOutputs->velU);
1112 if (!obs->gnss2Outputs) { obs->gnss2Outputs = std::make_shared<NAV::vendor::vectornav::GnssOutputs>(); }
1114 if (column ==
"GNSS2::UTC::year")
1116 extractValue(obs->gnss2Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_UTC,
1117 obs->gnss2Outputs->timeUtc.year, obs->gnss2Outputs->timeUtc.month, obs->gnss2Outputs->timeUtc.day,
1118 obs->gnss2Outputs->timeUtc.hour, obs->gnss2Outputs->timeUtc.min, obs->gnss2Outputs->timeUtc.sec, obs->gnss2Outputs->timeUtc.ms);
1121 if (column ==
"GNSS2::Tow [ns]")
1123 extractValue(obs->gnss2Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_TOW, obs->gnss2Outputs->tow);
1126 if (column ==
"GNSS2::Week")
1128 extractValue(obs->gnss2Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_WEEK, obs->gnss2Outputs->week);
1131 if (column ==
"GNSS2::NumSats")
1133 extractValue(obs->gnss2Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_NUMSATS, obs->gnss2Outputs->numSats);
1136 if (column ==
"GNSS2::Fix")
1138 extractValue(obs->gnss2Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_FIX, obs->gnss2Outputs->fix);
1141 if (column ==
"GNSS2::PosLla::latitude [deg]")
1143 extractValue(obs->gnss2Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_POSLLA,
1144 obs->gnss2Outputs->posLla.x(), obs->gnss2Outputs->posLla.y(), obs->gnss2Outputs->posLla.z());
1147 if (column ==
"GNSS2::PosEcef::X [m]")
1149 extractValue(obs->gnss2Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_POSECEF,
1150 obs->gnss2Outputs->posEcef.x(), obs->gnss2Outputs->posEcef.y(), obs->gnss2Outputs->posEcef.z());
1153 if (column ==
"GNSS2::VelNed::N [m/s]")
1155 extractValue(obs->gnss2Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_VELNED,
1156 obs->gnss2Outputs->velNed.x(), obs->gnss2Outputs->velNed.y(), obs->gnss2Outputs->velNed.z());
1159 if (column ==
"GNSS2::VelEcef::X [m/s]")
1161 extractValue(obs->gnss2Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_VELECEF,
1162 obs->gnss2Outputs->velEcef.x(), obs->gnss2Outputs->velEcef.y(), obs->gnss2Outputs->velEcef.z());
1165 if (column ==
"GNSS2::PosU::N [m]")
1167 extractValue(obs->gnss2Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_POSU,
1168 obs->gnss2Outputs->posU.x(), obs->gnss2Outputs->posU.y(), obs->gnss2Outputs->posU.z());
1171 if (column ==
"GNSS2::VelU [m/s]")
1173 extractValue(obs->gnss2Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_VELU, obs->gnss2Outputs->velU);
1176 if (column ==
"GNSS2::TimeU [s]")
1178 extractValue(obs->gnss2Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_TIMEU, obs->gnss2Outputs->timeU);
1181 if (column ==
"GNSS2::TimeInfo::Status::timeOk")
1185 uint8_t utcTimeValid{};
1186 extractValue(obs->gnss2Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_TIMEINFO, timeOk, dateOk, utcTimeValid, obs->gnss2Outputs->timeInfo.leapSeconds);
1187 obs->gnss2Outputs->timeInfo.status =
static_cast<uint8_t
>(timeOk << 0U | dateOk << 1U | utcTimeValid << 2U);
1190 if (column ==
"GNSS2::DOP::g")
1192 extractValue(obs->gnss2Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_DOP,
1193 obs->gnss2Outputs->dop.gDop, obs->gnss2Outputs->dop.pDop, obs->gnss2Outputs->dop.tDop, obs->gnss2Outputs->dop.vDop,
1194 obs->gnss2Outputs->dop.hDop, obs->gnss2Outputs->dop.nDop, obs->gnss2Outputs->dop.eDop);
1197 if (column ==
"GNSS2::SatInfo::NumSats")
1199 extractValue(obs->gnss2Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_SATINFO, obs->gnss2Outputs->satInfo.numSats);
1202 if (column ==
"GNSS2::SatInfo::Satellites")
1204 std::string satellites;
1205 extractValue(obs->gnss2Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_SATINFO, satellites);
1207 for (
size_t i = 0; i < obs->gnss2Outputs->satInfo.numSats; i++)
1209 satellites = satellites.substr(1);
1210 auto sys =
static_cast<int8_t
>(std::stoi(extractRemoveTillDelimiter(satellites,
"|")));
1211 auto svId =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
1212 auto flagHealthy =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
1213 auto flagAlmanac =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
1214 auto flagEphemeris =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
1215 auto flagDifferentialCorrection =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
1216 auto flagUsedForNavigation =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
1217 auto flagAzimuthElevationValid =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
1218 auto flagUsedForRTK =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
1219 auto flags =
static_cast<uint8_t
>(flagHealthy << 0U
1221 | flagEphemeris << 2U
1222 | flagDifferentialCorrection << 3U
1223 | flagUsedForNavigation << 4U
1224 | flagAzimuthElevationValid << 5U
1225 | flagUsedForRTK << 6U);
1226 auto cno =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
1227 auto qi =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
1228 auto el =
static_cast<int8_t
>(std::stoi(extractRemoveTillDelimiter(satellites,
"|")));
1229 auto az =
static_cast<int16_t
>(std::stoi(extractRemoveTillDelimiter(satellites,
"]")));
1230 obs->gnss2Outputs->satInfo.satellites.emplace_back(sys, svId, flags, cno, qi, el, az);
1234 if (column.starts_with(
"GNSS2::SatInfo::") && column.ends_with(
" - flag Healthy"))
1236 std::string columnText = column.substr(16);
1237 SatId satId(extractRemoveTillDelimiter(columnText,
" -"));
1241 bool flagEphemeris{};
1242 bool flagDifferentialCorrection{};
1243 bool flagUsedForNavigation{};
1244 bool flagAzimuthElevationValid{};
1245 bool flagUsedForRTK{};
1246 auto cno = std::numeric_limits<uint8_t>::max();
1250 extractValue(obs->gnss2Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_SATINFO,
1251 flagHealthy, flagAlmanac, flagEphemeris, flagDifferentialCorrection,
1252 flagUsedForNavigation, flagAzimuthElevationValid, flagUsedForRTK,
1254 if (cno == std::numeric_limits<uint8_t>::max())
1259 auto flags =
static_cast<uint8_t
>(flagHealthy << 0U
1261 | flagEphemeris << 2U
1262 | flagDifferentialCorrection << 3U
1263 | flagUsedForNavigation << 4U
1264 | flagAzimuthElevationValid << 5U
1265 | flagUsedForRTK << 6U);
1267 static_cast<uint8_t
>(satId.
satNum), flags, cno, qi, el, az);
1270 if (column ==
"GNSS2::RawMeas::Tow [s]")
1272 extractValue(obs->gnss2Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_RAWMEAS, obs->gnss2Outputs->raw.tow);
1275 if (column ==
"GNSS2::RawMeas::Week")
1277 extractValue(obs->gnss2Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_RAWMEAS, obs->gnss2Outputs->raw.week);
1280 if (column ==
"GNSS2::RawMeas::NumSats")
1282 extractValue(obs->gnss2Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_RAWMEAS, obs->gnss2Outputs->raw.numSats);
1283 LOG_DATA(
"{}: GNSS2::NumSats: {}",
nameId(), obs->gnss2Outputs->raw.numSats);
1286 if (column ==
"GNSS2::RawMeas::Satellites")
1288 std::string satellites;
1289 extractValue(obs->gnss2Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_RAWMEAS, satellites);
1290 LOG_DATA(
"{}: numSats: {}",
nameId(), obs->gnss2Outputs->raw.numSats);
1293 for (
size_t i = 0; i < obs->gnss2Outputs->raw.numSats; i++)
1295 satellites = satellites.substr(1);
1296 auto sys =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
1297 auto svId =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
1298 auto freq =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
1299 auto chan =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
1300 auto slot =
static_cast<int8_t
>(std::stoi(extractRemoveTillDelimiter(satellites,
"|")));
1301 auto cno =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
1302 auto flagSearching =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
1303 auto flagTracking =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
1304 auto flagTimeValid =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
1305 auto flagCodeLock =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
1306 auto flagPhaseLock =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
1307 auto flagPhaseHalfAmbiguity =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
1308 auto flagPhaseHalfSub =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
1309 auto flagPhaseSlip =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
1310 auto flagPseudorangeSmoothed =
static_cast<uint8_t
>(std::stoul(extractRemoveTillDelimiter(satellites,
"|")));
1311 auto flags =
static_cast<uint16_t
>(flagSearching << 0U
1312 | flagTracking << 1U
1313 | flagTimeValid << 2U
1314 | flagCodeLock << 3U
1315 | flagPhaseLock << 4U
1316 | flagPhaseHalfAmbiguity << 5U
1317 | flagPhaseHalfSub << 6U
1318 | flagPhaseSlip << 7U
1319 | flagPseudorangeSmoothed << 8U);
1320 auto pr = std::stod(extractRemoveTillDelimiter(satellites,
"|"));
1321 auto cp = std::stod(extractRemoveTillDelimiter(satellites,
"|"));
1322 auto dp = std::stof(extractRemoveTillDelimiter(satellites,
"]"));
1323 obs->gnss2Outputs->raw.satellites.emplace_back(sys, svId, freq, chan, slot, cno, flags, pr, cp, dp);
1327 if (column.starts_with(
"GNSS2::RawMeas::") && column.ends_with(
" - freq"))
1329 std::string columnText = column.substr(16);
1330 auto identifier = extractRemoveTillDelimiter(columnText,
" - freq");
1334 if (identifier.length() == 6)
1338 satNum = satSigId.
satNum;
1342 SatId satId(identifier);
1346 auto freq = std::numeric_limits<uint8_t>::max();
1350 uint8_t flagSearching{};
1351 uint8_t flagTracking{};
1352 uint8_t flagTimeValid{};
1353 uint8_t flagCodeLock{};
1354 uint8_t flagPhaseLock{};
1355 uint8_t flagPhaseHalfAmbiguity{};
1356 uint8_t flagPhaseHalfSub{};
1357 uint8_t flagPhaseSlip{};
1358 uint8_t flagPseudorangeSmoothed{};
1362 extractValue(obs->gnss2Outputs->gnssField, vn::protocol::uart::GpsGroup::GPSGROUP_RAWMEAS,
1363 freq, chan, slot, cno,
1364 flagSearching, flagTracking, flagTimeValid, flagCodeLock, flagPhaseLock,
1365 flagPhaseHalfAmbiguity, flagPhaseHalfSub, flagPhaseSlip, flagPseudorangeSmoothed,
1367 if (freq == std::numeric_limits<uint8_t>::max())
1372 auto flags =
static_cast<uint16_t
>(flagSearching << 0U
1373 | flagTracking << 1U
1374 | flagTimeValid << 2U
1375 | flagCodeLock << 3U
1376 | flagPhaseLock << 4U
1377 | flagPhaseHalfAmbiguity << 5U
1378 | flagPhaseHalfSub << 6U
1379 | flagPhaseSlip << 7U
1380 | flagPseudorangeSmoothed << 8U);
1382 static_cast<uint8_t
>(satNum), freq, chan, slot, cno, flags, pr, cp, dp);
1383 if (obs->gnss2Outputs->raw.satellites.back().toCode() ==
Code::None)
1386 obs->gnss2Outputs->raw.satellites.back().sys, obs->gnss2Outputs->raw.satellites.back().freq, obs->gnss2Outputs->raw.satellites.back().chan);
1387 obs->gnss2Outputs->raw.satellites.pop_back();
1389 if (identifier.length() == 6 &&
SatSigId(identifier) != obs->gnss2Outputs->raw.satellites.back().toSatSigId())
1391 LOG_ERROR(
"{}: Line {}: Could not convert to valid SatSigId. Skipping item. (sys {}, freq {}, chan {} = [{}], column was [{}])",
nameId(),
_messageCount + 1,
1392 obs->gnss2Outputs->raw.satellites.back().sys, obs->gnss2Outputs->raw.satellites.back().freq, obs->gnss2Outputs->raw.satellites.back().chan,
1393 obs->gnss2Outputs->raw.satellites.back().toSatSigId(), identifier);
1394 obs->gnss2Outputs->raw.satellites.pop_back();
1402 if (obs->gnss1Outputs) { obs->gnss1Outputs->raw.numSats =
static_cast<uint8_t
>(obs->gnss1Outputs->raw.satellites.size()); }
1403 if (obs->gnss2Outputs) { obs->gnss2Outputs->raw.numSats =
static_cast<uint8_t
>(obs->gnss2Outputs->raw.satellites.size()); }
1405 catch (
const std::exception& e)
1413 auto readFromFilestream = [&,
this](
char* __s, std::streamsize __n) {
1417 throw std::runtime_error(
"End of file reached");
1425 int32_t gpsCycle = 0;
1426 int32_t gpsWeek = 0;
1428 readFromFilestream(
reinterpret_cast<char*
>(&gpsCycle),
sizeof(gpsCycle));
1429 readFromFilestream(
reinterpret_cast<char*
>(&gpsWeek),
sizeof(gpsWeek));
1430 readFromFilestream(
reinterpret_cast<char*
>(&tow),
sizeof(tow));
1431 if (gpsCycle || gpsWeek)
1433 obs->insTime =
InsTime(gpsCycle, gpsWeek, tow);
1439 if (!obs->timeOutputs)
1441 obs->timeOutputs = std::make_shared<NAV::vendor::vectornav::TimeOutputs>();
1445 if (obs->timeOutputs->timeField & vn::protocol::uart::TimeGroup::TIMEGROUP_TIMESTARTUP)
1447 read(
reinterpret_cast<char*
>(&obs->timeOutputs->timeStartup),
sizeof(obs->timeOutputs->timeStartup));
1449 if (obs->timeOutputs->timeField & vn::protocol::uart::TimeGroup::TIMEGROUP_TIMEGPS)
1451 read(
reinterpret_cast<char*
>(&obs->timeOutputs->timeGps),
sizeof(obs->timeOutputs->timeGps));
1453 if (obs->timeOutputs->timeField & vn::protocol::uart::TimeGroup::TIMEGROUP_GPSTOW)
1455 read(
reinterpret_cast<char*
>(&obs->timeOutputs->gpsTow),
sizeof(obs->timeOutputs->gpsTow));
1457 if (obs->timeOutputs->timeField & vn::protocol::uart::TimeGroup::TIMEGROUP_GPSWEEK)
1459 read(
reinterpret_cast<char*
>(&obs->timeOutputs->gpsWeek),
sizeof(obs->timeOutputs->gpsWeek));
1461 if (obs->timeOutputs->timeField & vn::protocol::uart::TimeGroup::TIMEGROUP_TIMESYNCIN)
1463 read(
reinterpret_cast<char*
>(&obs->timeOutputs->timeSyncIn),
sizeof(obs->timeOutputs->timeSyncIn));
1465 if (obs->timeOutputs->timeField & vn::protocol::uart::TimeGroup::TIMEGROUP_TIMEGPSPPS)
1467 read(
reinterpret_cast<char*
>(&obs->timeOutputs->timePPS),
sizeof(obs->timeOutputs->timePPS));
1469 if (obs->timeOutputs->timeField & vn::protocol::uart::TimeGroup::TIMEGROUP_TIMEUTC)
1471 read(
reinterpret_cast<char*
>(&obs->timeOutputs->timeUtc.year),
sizeof(obs->timeOutputs->timeUtc.year));
1472 read(
reinterpret_cast<char*
>(&obs->timeOutputs->timeUtc.month),
sizeof(obs->timeOutputs->timeUtc.month));
1473 read(
reinterpret_cast<char*
>(&obs->timeOutputs->timeUtc.day),
sizeof(obs->timeOutputs->timeUtc.day));
1474 read(
reinterpret_cast<char*
>(&obs->timeOutputs->timeUtc.hour),
sizeof(obs->timeOutputs->timeUtc.hour));
1475 read(
reinterpret_cast<char*
>(&obs->timeOutputs->timeUtc.min),
sizeof(obs->timeOutputs->timeUtc.min));
1476 read(
reinterpret_cast<char*
>(&obs->timeOutputs->timeUtc.sec),
sizeof(obs->timeOutputs->timeUtc.sec));
1477 read(
reinterpret_cast<char*
>(&obs->timeOutputs->timeUtc.ms),
sizeof(obs->timeOutputs->timeUtc.ms));
1479 if (obs->timeOutputs->timeField & vn::protocol::uart::TimeGroup::TIMEGROUP_SYNCINCNT)
1481 read(
reinterpret_cast<char*
>(&obs->timeOutputs->syncInCnt),
sizeof(obs->timeOutputs->syncInCnt));
1483 if (obs->timeOutputs->timeField & vn::protocol::uart::TimeGroup::TIMEGROUP_SYNCOUTCNT)
1485 read(
reinterpret_cast<char*
>(&obs->timeOutputs->syncOutCnt),
sizeof(obs->timeOutputs->syncOutCnt));
1487 if (obs->timeOutputs->timeField & vn::protocol::uart::TimeGroup::TIMEGROUP_TIMESTATUS)
1489 read(
reinterpret_cast<char*
>(&obs->timeOutputs->timeStatus.status()),
sizeof(obs->timeOutputs->timeStatus.status()));
1495 if (!obs->imuOutputs)
1497 obs->imuOutputs = std::make_shared<NAV::vendor::vectornav::ImuOutputs>();
1501 if (obs->imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_IMUSTATUS)
1503 read(
reinterpret_cast<char*
>(&obs->imuOutputs->imuStatus),
sizeof(obs->imuOutputs->imuStatus));
1505 if (obs->imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_UNCOMPMAG)
1507 read(
reinterpret_cast<char*
>(obs->imuOutputs->uncompMag.data()),
sizeof(obs->imuOutputs->uncompMag));
1509 if (obs->imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_UNCOMPACCEL)
1511 read(
reinterpret_cast<char*
>(obs->imuOutputs->uncompAccel.data()),
sizeof(obs->imuOutputs->uncompAccel));
1513 if (obs->imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_UNCOMPGYRO)
1515 read(
reinterpret_cast<char*
>(obs->imuOutputs->uncompGyro.data()),
sizeof(obs->imuOutputs->uncompGyro));
1517 if (obs->imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_TEMP)
1519 read(
reinterpret_cast<char*
>(&obs->imuOutputs->temp),
sizeof(obs->imuOutputs->temp));
1521 if (obs->imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_PRES)
1523 read(
reinterpret_cast<char*
>(&obs->imuOutputs->pres),
sizeof(obs->imuOutputs->pres));
1525 if (obs->imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_DELTATHETA)
1527 read(
reinterpret_cast<char*
>(&obs->imuOutputs->deltaTime),
sizeof(obs->imuOutputs->deltaTime));
1528 read(
reinterpret_cast<char*
>(obs->imuOutputs->deltaTheta.data()),
sizeof(obs->imuOutputs->deltaTheta));
1530 if (obs->imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_DELTAVEL)
1532 read(
reinterpret_cast<char*
>(obs->imuOutputs->deltaV.data()),
sizeof(obs->imuOutputs->deltaV));
1534 if (obs->imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_MAG)
1536 read(
reinterpret_cast<char*
>(obs->imuOutputs->mag.data()),
sizeof(obs->imuOutputs->mag));
1538 if (obs->imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_ACCEL)
1540 read(
reinterpret_cast<char*
>(obs->imuOutputs->accel.data()),
sizeof(obs->imuOutputs->accel));
1542 if (obs->imuOutputs->imuField & vn::protocol::uart::ImuGroup::IMUGROUP_ANGULARRATE)
1544 read(
reinterpret_cast<char*
>(obs->imuOutputs->angularRate.data()),
sizeof(obs->imuOutputs->angularRate));
1550 if (!obs->gnss1Outputs)
1552 obs->gnss1Outputs = std::make_shared<NAV::vendor::vectornav::GnssOutputs>();
1556 if (obs->gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_UTC)
1558 read(
reinterpret_cast<char*
>(&obs->gnss1Outputs->timeUtc.year),
sizeof(obs->gnss1Outputs->timeUtc.year));
1559 read(
reinterpret_cast<char*
>(&obs->gnss1Outputs->timeUtc.month),
sizeof(obs->gnss1Outputs->timeUtc.month));
1560 read(
reinterpret_cast<char*
>(&obs->gnss1Outputs->timeUtc.day),
sizeof(obs->gnss1Outputs->timeUtc.day));
1561 read(
reinterpret_cast<char*
>(&obs->gnss1Outputs->timeUtc.hour),
sizeof(obs->gnss1Outputs->timeUtc.hour));
1562 read(
reinterpret_cast<char*
>(&obs->gnss1Outputs->timeUtc.min),
sizeof(obs->gnss1Outputs->timeUtc.min));
1563 read(
reinterpret_cast<char*
>(&obs->gnss1Outputs->timeUtc.sec),
sizeof(obs->gnss1Outputs->timeUtc.sec));
1564 read(
reinterpret_cast<char*
>(&obs->gnss1Outputs->timeUtc.ms),
sizeof(obs->gnss1Outputs->timeUtc.ms));
1566 if (obs->gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_TOW)
1568 read(
reinterpret_cast<char*
>(&obs->gnss1Outputs->tow),
sizeof(obs->gnss1Outputs->tow));
1570 if (obs->gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_WEEK)
1572 read(
reinterpret_cast<char*
>(&obs->gnss1Outputs->week),
sizeof(obs->gnss1Outputs->week));
1574 if (obs->gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_NUMSATS)
1576 read(
reinterpret_cast<char*
>(&obs->gnss1Outputs->numSats),
sizeof(obs->gnss1Outputs->numSats));
1578 if (obs->gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_FIX)
1580 read(
reinterpret_cast<char*
>(&obs->gnss1Outputs->fix),
sizeof(obs->gnss1Outputs->fix));
1582 if (obs->gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_POSLLA)
1584 read(
reinterpret_cast<char*
>(obs->gnss1Outputs->posLla.data()),
sizeof(obs->gnss1Outputs->posLla));
1586 if (obs->gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_POSECEF)
1588 read(
reinterpret_cast<char*
>(obs->gnss1Outputs->posEcef.data()),
sizeof(obs->gnss1Outputs->posEcef));
1590 if (obs->gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_VELNED)
1592 read(
reinterpret_cast<char*
>(obs->gnss1Outputs->velNed.data()),
sizeof(obs->gnss1Outputs->velNed));
1594 if (obs->gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_VELECEF)
1596 read(
reinterpret_cast<char*
>(obs->gnss1Outputs->velEcef.data()),
sizeof(obs->gnss1Outputs->velEcef));
1598 if (obs->gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_POSU)
1600 read(
reinterpret_cast<char*
>(obs->gnss1Outputs->posU.data()),
sizeof(obs->gnss1Outputs->posU));
1602 if (obs->gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_VELU)
1604 read(
reinterpret_cast<char*
>(&obs->gnss1Outputs->velU),
sizeof(obs->gnss1Outputs->velU));
1606 if (obs->gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_TIMEU)
1608 read(
reinterpret_cast<char*
>(&obs->gnss1Outputs->timeU),
sizeof(obs->gnss1Outputs->timeU));
1610 if (obs->gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_TIMEINFO)
1612 read(
reinterpret_cast<char*
>(&obs->gnss1Outputs->timeInfo.status.status()),
sizeof(obs->gnss1Outputs->timeInfo.status.status()));
1613 read(
reinterpret_cast<char*
>(&obs->gnss1Outputs->timeInfo.leapSeconds),
sizeof(obs->gnss1Outputs->timeInfo.leapSeconds));
1615 if (obs->gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_DOP)
1617 read(
reinterpret_cast<char*
>(&obs->gnss1Outputs->dop.gDop),
sizeof(obs->gnss1Outputs->dop.gDop));
1618 read(
reinterpret_cast<char*
>(&obs->gnss1Outputs->dop.pDop),
sizeof(obs->gnss1Outputs->dop.pDop));
1619 read(
reinterpret_cast<char*
>(&obs->gnss1Outputs->dop.tDop),
sizeof(obs->gnss1Outputs->dop.tDop));
1620 read(
reinterpret_cast<char*
>(&obs->gnss1Outputs->dop.vDop),
sizeof(obs->gnss1Outputs->dop.vDop));
1621 read(
reinterpret_cast<char*
>(&obs->gnss1Outputs->dop.hDop),
sizeof(obs->gnss1Outputs->dop.hDop));
1622 read(
reinterpret_cast<char*
>(&obs->gnss1Outputs->dop.nDop),
sizeof(obs->gnss1Outputs->dop.nDop));
1623 read(
reinterpret_cast<char*
>(&obs->gnss1Outputs->dop.eDop),
sizeof(obs->gnss1Outputs->dop.eDop));
1625 if (obs->gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_SATINFO)
1627 read(
reinterpret_cast<char*
>(&obs->gnss1Outputs->satInfo.numSats),
sizeof(obs->gnss1Outputs->satInfo.numSats));
1628 obs->gnss1Outputs->satInfo.satellites.resize(obs->gnss1Outputs->satInfo.numSats);
1630 for (
auto& satellite : obs->gnss1Outputs->satInfo.satellites)
1632 read(
reinterpret_cast<char*
>(&satellite.sys),
sizeof(satellite.sys));
1633 read(
reinterpret_cast<char*
>(&satellite.svId),
sizeof(satellite.svId));
1634 read(
reinterpret_cast<char*
>(&satellite.flags),
sizeof(satellite.flags));
1635 read(
reinterpret_cast<char*
>(&satellite.cno),
sizeof(satellite.cno));
1636 read(
reinterpret_cast<char*
>(&satellite.qi),
sizeof(satellite.qi));
1637 read(
reinterpret_cast<char*
>(&satellite.el),
sizeof(satellite.el));
1638 read(
reinterpret_cast<char*
>(&satellite.az),
sizeof(satellite.az));
1641 if (obs->gnss1Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_RAWMEAS)
1643 read(
reinterpret_cast<char*
>(&obs->gnss1Outputs->raw.tow),
sizeof(obs->gnss1Outputs->raw.tow));
1644 read(
reinterpret_cast<char*
>(&obs->gnss1Outputs->raw.week),
sizeof(obs->gnss1Outputs->raw.week));
1645 read(
reinterpret_cast<char*
>(&obs->gnss1Outputs->raw.numSats),
sizeof(obs->gnss1Outputs->raw.numSats));
1646 obs->gnss1Outputs->raw.satellites.resize(obs->gnss1Outputs->raw.numSats);
1648 for (
auto& satellite : obs->gnss1Outputs->raw.satellites)
1650 read(
reinterpret_cast<char*
>(&satellite.sys),
sizeof(satellite.sys));
1651 read(
reinterpret_cast<char*
>(&satellite.svId),
sizeof(satellite.svId));
1652 read(
reinterpret_cast<char*
>(&satellite.freq),
sizeof(satellite.freq));
1653 read(
reinterpret_cast<char*
>(&satellite.chan),
sizeof(satellite.chan));
1654 read(
reinterpret_cast<char*
>(&satellite.slot),
sizeof(satellite.slot));
1655 read(
reinterpret_cast<char*
>(&satellite.cno),
sizeof(satellite.cno));
1656 read(
reinterpret_cast<char*
>(&satellite.flags),
sizeof(satellite.flags));
1657 read(
reinterpret_cast<char*
>(&satellite.pr),
sizeof(satellite.pr));
1658 read(
reinterpret_cast<char*
>(&satellite.cp),
sizeof(satellite.cp));
1659 read(
reinterpret_cast<char*
>(&satellite.dp),
sizeof(satellite.dp));
1666 if (!obs->attitudeOutputs)
1668 obs->attitudeOutputs = std::make_shared<NAV::vendor::vectornav::AttitudeOutputs>();
1672 if (obs->attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_VPESTATUS)
1674 read(
reinterpret_cast<char*
>(&obs->attitudeOutputs->vpeStatus.status()),
sizeof(obs->attitudeOutputs->vpeStatus.status()));
1676 if (obs->attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_YAWPITCHROLL)
1678 read(
reinterpret_cast<char*
>(obs->attitudeOutputs->ypr.data()),
sizeof(obs->attitudeOutputs->ypr));
1680 if (obs->attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_QUATERNION)
1682 read(
reinterpret_cast<char*
>(obs->attitudeOutputs->qtn.coeffs().data()),
sizeof(obs->attitudeOutputs->qtn));
1684 if (obs->attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_DCM)
1686 read(
reinterpret_cast<char*
>(obs->attitudeOutputs->dcm.data()),
sizeof(obs->attitudeOutputs->dcm));
1688 if (obs->attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_MAGNED)
1690 read(
reinterpret_cast<char*
>(obs->attitudeOutputs->magNed.data()),
sizeof(obs->attitudeOutputs->magNed));
1692 if (obs->attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_ACCELNED)
1694 read(
reinterpret_cast<char*
>(obs->attitudeOutputs->accelNed.data()),
sizeof(obs->attitudeOutputs->accelNed));
1696 if (obs->attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_LINEARACCELBODY)
1698 read(
reinterpret_cast<char*
>(obs->attitudeOutputs->linearAccelBody.data()),
sizeof(obs->attitudeOutputs->linearAccelBody));
1700 if (obs->attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_LINEARACCELNED)
1702 read(
reinterpret_cast<char*
>(obs->attitudeOutputs->linearAccelNed.data()),
sizeof(obs->attitudeOutputs->linearAccelNed));
1704 if (obs->attitudeOutputs->attitudeField & vn::protocol::uart::AttitudeGroup::ATTITUDEGROUP_YPRU)
1706 read(
reinterpret_cast<char*
>(obs->attitudeOutputs->yprU.data()),
sizeof(obs->attitudeOutputs->yprU));
1712 if (!obs->insOutputs)
1714 obs->insOutputs = std::make_shared<NAV::vendor::vectornav::InsOutputs>();
1718 if (obs->insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_INSSTATUS)
1720 read(
reinterpret_cast<char*
>(&obs->insOutputs->insStatus.status()),
sizeof(obs->insOutputs->insStatus.status()));
1722 if (obs->insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_POSLLA)
1724 read(
reinterpret_cast<char*
>(obs->insOutputs->posLla.data()),
sizeof(obs->insOutputs->posLla));
1726 if (obs->insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_POSECEF)
1728 read(
reinterpret_cast<char*
>(obs->insOutputs->posEcef.data()),
sizeof(obs->insOutputs->posEcef));
1730 if (obs->insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_VELBODY)
1732 read(
reinterpret_cast<char*
>(obs->insOutputs->velBody.data()),
sizeof(obs->insOutputs->velBody));
1734 if (obs->insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_VELNED)
1736 read(
reinterpret_cast<char*
>(obs->insOutputs->velNed.data()),
sizeof(obs->insOutputs->velNed));
1738 if (obs->insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_VELECEF)
1740 read(
reinterpret_cast<char*
>(obs->insOutputs->velEcef.data()),
sizeof(obs->insOutputs->velEcef));
1742 if (obs->insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_MAGECEF)
1744 read(
reinterpret_cast<char*
>(obs->insOutputs->magEcef.data()),
sizeof(obs->insOutputs->magEcef));
1746 if (obs->insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_ACCELECEF)
1748 read(
reinterpret_cast<char*
>(obs->insOutputs->accelEcef.data()),
sizeof(obs->insOutputs->accelEcef));
1750 if (obs->insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_LINEARACCELECEF)
1752 read(
reinterpret_cast<char*
>(obs->insOutputs->linearAccelEcef.data()),
sizeof(obs->insOutputs->linearAccelEcef));
1754 if (obs->insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_POSU)
1756 read(
reinterpret_cast<char*
>(&obs->insOutputs->posU),
sizeof(obs->insOutputs->posU));
1758 if (obs->insOutputs->insField & vn::protocol::uart::InsGroup::INSGROUP_VELU)
1760 read(
reinterpret_cast<char*
>(&obs->insOutputs->velU),
sizeof(obs->insOutputs->velU));
1766 if (!obs->gnss2Outputs)
1768 obs->gnss2Outputs = std::make_shared<NAV::vendor::vectornav::GnssOutputs>();
1772 if (obs->gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_UTC)
1774 read(
reinterpret_cast<char*
>(&obs->gnss2Outputs->timeUtc.year),
sizeof(obs->gnss2Outputs->timeUtc.year));
1775 read(
reinterpret_cast<char*
>(&obs->gnss2Outputs->timeUtc.month),
sizeof(obs->gnss2Outputs->timeUtc.month));
1776 read(
reinterpret_cast<char*
>(&obs->gnss2Outputs->timeUtc.day),
sizeof(obs->gnss2Outputs->timeUtc.day));
1777 read(
reinterpret_cast<char*
>(&obs->gnss2Outputs->timeUtc.hour),
sizeof(obs->gnss2Outputs->timeUtc.hour));
1778 read(
reinterpret_cast<char*
>(&obs->gnss2Outputs->timeUtc.min),
sizeof(obs->gnss2Outputs->timeUtc.min));
1779 read(
reinterpret_cast<char*
>(&obs->gnss2Outputs->timeUtc.sec),
sizeof(obs->gnss2Outputs->timeUtc.sec));
1780 read(
reinterpret_cast<char*
>(&obs->gnss2Outputs->timeUtc.ms),
sizeof(obs->gnss2Outputs->timeUtc.ms));
1782 if (obs->gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_TOW)
1784 read(
reinterpret_cast<char*
>(&obs->gnss2Outputs->tow),
sizeof(obs->gnss2Outputs->tow));
1786 if (obs->gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_WEEK)
1788 read(
reinterpret_cast<char*
>(&obs->gnss2Outputs->week),
sizeof(obs->gnss2Outputs->week));
1790 if (obs->gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_NUMSATS)
1792 read(
reinterpret_cast<char*
>(&obs->gnss2Outputs->numSats),
sizeof(obs->gnss2Outputs->numSats));
1794 if (obs->gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_FIX)
1796 read(
reinterpret_cast<char*
>(&obs->gnss2Outputs->fix),
sizeof(obs->gnss2Outputs->fix));
1798 if (obs->gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_POSLLA)
1800 read(
reinterpret_cast<char*
>(obs->gnss2Outputs->posLla.data()),
sizeof(obs->gnss2Outputs->posLla));
1802 if (obs->gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_POSECEF)
1804 read(
reinterpret_cast<char*
>(obs->gnss2Outputs->posEcef.data()),
sizeof(obs->gnss2Outputs->posEcef));
1806 if (obs->gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_VELNED)
1808 read(
reinterpret_cast<char*
>(obs->gnss2Outputs->velNed.data()),
sizeof(obs->gnss2Outputs->velNed));
1810 if (obs->gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_VELECEF)
1812 read(
reinterpret_cast<char*
>(obs->gnss2Outputs->velEcef.data()),
sizeof(obs->gnss2Outputs->velEcef));
1814 if (obs->gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_POSU)
1816 read(
reinterpret_cast<char*
>(obs->gnss2Outputs->posU.data()),
sizeof(obs->gnss2Outputs->posU));
1818 if (obs->gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_VELU)
1820 read(
reinterpret_cast<char*
>(&obs->gnss2Outputs->velU),
sizeof(obs->gnss2Outputs->velU));
1822 if (obs->gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_TIMEU)
1824 read(
reinterpret_cast<char*
>(&obs->gnss2Outputs->timeU),
sizeof(obs->gnss2Outputs->timeU));
1826 if (obs->gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_TIMEINFO)
1828 read(
reinterpret_cast<char*
>(&obs->gnss2Outputs->timeInfo.status.status()),
sizeof(obs->gnss2Outputs->timeInfo.status.status()));
1829 read(
reinterpret_cast<char*
>(&obs->gnss2Outputs->timeInfo.leapSeconds),
sizeof(obs->gnss2Outputs->timeInfo.leapSeconds));
1831 if (obs->gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_DOP)
1833 read(
reinterpret_cast<char*
>(&obs->gnss2Outputs->dop.gDop),
sizeof(obs->gnss2Outputs->dop.gDop));
1834 read(
reinterpret_cast<char*
>(&obs->gnss2Outputs->dop.pDop),
sizeof(obs->gnss2Outputs->dop.pDop));
1835 read(
reinterpret_cast<char*
>(&obs->gnss2Outputs->dop.tDop),
sizeof(obs->gnss2Outputs->dop.tDop));
1836 read(
reinterpret_cast<char*
>(&obs->gnss2Outputs->dop.vDop),
sizeof(obs->gnss2Outputs->dop.vDop));
1837 read(
reinterpret_cast<char*
>(&obs->gnss2Outputs->dop.hDop),
sizeof(obs->gnss2Outputs->dop.hDop));
1838 read(
reinterpret_cast<char*
>(&obs->gnss2Outputs->dop.nDop),
sizeof(obs->gnss2Outputs->dop.nDop));
1839 read(
reinterpret_cast<char*
>(&obs->gnss2Outputs->dop.eDop),
sizeof(obs->gnss2Outputs->dop.eDop));
1841 if (obs->gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_SATINFO)
1843 read(
reinterpret_cast<char*
>(&obs->gnss2Outputs->satInfo.numSats),
sizeof(obs->gnss2Outputs->satInfo.numSats));
1844 obs->gnss2Outputs->satInfo.satellites.resize(obs->gnss2Outputs->satInfo.numSats);
1846 for (
auto& satellite : obs->gnss2Outputs->satInfo.satellites)
1848 read(
reinterpret_cast<char*
>(&satellite.sys),
sizeof(satellite.sys));
1849 read(
reinterpret_cast<char*
>(&satellite.svId),
sizeof(satellite.svId));
1850 read(
reinterpret_cast<char*
>(&satellite.flags),
sizeof(satellite.flags));
1851 read(
reinterpret_cast<char*
>(&satellite.cno),
sizeof(satellite.cno));
1852 read(
reinterpret_cast<char*
>(&satellite.qi),
sizeof(satellite.qi));
1853 read(
reinterpret_cast<char*
>(&satellite.el),
sizeof(satellite.el));
1854 read(
reinterpret_cast<char*
>(&satellite.az),
sizeof(satellite.az));
1857 if (obs->gnss2Outputs->gnssField & vn::protocol::uart::GpsGroup::GPSGROUP_RAWMEAS)
1859 read(
reinterpret_cast<char*
>(&obs->gnss2Outputs->raw.tow),
sizeof(obs->gnss2Outputs->raw.tow));
1860 read(
reinterpret_cast<char*
>(&obs->gnss2Outputs->raw.week),
sizeof(obs->gnss2Outputs->raw.week));
1861 read(
reinterpret_cast<char*
>(&obs->gnss2Outputs->raw.numSats),
sizeof(obs->gnss2Outputs->raw.numSats));
1862 obs->gnss2Outputs->raw.satellites.resize(obs->gnss2Outputs->raw.numSats);
1864 for (
auto& satellite : obs->gnss2Outputs->raw.satellites)
1866 read(
reinterpret_cast<char*
>(&satellite.sys),
sizeof(satellite.sys));
1867 read(
reinterpret_cast<char*
>(&satellite.svId),
sizeof(satellite.svId));
1868 read(
reinterpret_cast<char*
>(&satellite.freq),
sizeof(satellite.freq));
1869 read(
reinterpret_cast<char*
>(&satellite.chan),
sizeof(satellite.chan));
1870 read(
reinterpret_cast<char*
>(&satellite.slot),
sizeof(satellite.slot));
1871 read(
reinterpret_cast<char*
>(&satellite.cno),
sizeof(satellite.cno));
1872 read(
reinterpret_cast<char*
>(&satellite.flags),
sizeof(satellite.flags));
1873 read(
reinterpret_cast<char*
>(&satellite.pr),
sizeof(satellite.pr));
1874 read(
reinterpret_cast<char*
>(&satellite.cp),
sizeof(satellite.cp));
1875 read(
reinterpret_cast<char*
>(&satellite.dp),
sizeof(satellite.dp));
1880 catch (
const std::exception& e)
1887 if (!obs->timeOutputs && !obs->imuOutputs && !obs->gnss1Outputs && !obs->attitudeOutputs && !obs->insOutputs && !obs->gnss2Outputs)
1892 if (obs->insTime.empty())