358 LOG_DATA(
"{}: [{}] tlm: {} {}",
nameId(), satId, std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
359 constexpr uint8_t TLM_PREAMBLE = 0b10001011;
360 if (
static_cast<uint8_t
>((sfrbx.
dwrd.at(w) >> 22) & 0b11111111) != TLM_PREAMBLE)
362 LOG_DATA(
"{}: [{}] Wrong telemetry word preamble. Ignoring SFRBX message.",
nameId(), satId);
373 LOG_DATA(
"{}: [{}] how: {} {}",
nameId(), satId, std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
374 auto subFrameId =
static_cast<uint8_t
>((sfrbx.
dwrd.at(w) >> 8) & 0b111);
377 if (subFrameId == 0 || subFrameId > 5)
379 LOG_ERROR(
"{}: [{}] The subFrameId has to be in the range [1..=5] but it is {}",
nameId(), satId, subFrameId);
385 auto finishSubFrame = [&]<
size_t N>(
const std::shared_ptr<SatNavData>& ephemeris,
size_t subFrameId, std::bitset<N>& subframesFound) {
386 if (1 <= subFrameId && subFrameId <= 3)
388 subframesFound.set(subFrameId - 1);
390 LOG_DATA(
"{}: [{}] subframesFound: {}",
nameId(), satId, subframesFound);
391 if (subframesFound.count() == 3)
393 LOG_DATA(
"{}: [{}] [{}] All subframes found. Updating gnnsNavInfo",
nameId(), satId, ephemeris->refTime.toYMDHMS(
GPST));
394 if (!
_gnssNavInfo.searchNavigationData(satId, ephemeris->refTime))
396 LOG_DEBUG(
"{}: Adding new ephemeris data [{}] [{}]",
nameId(), satId, ephemeris->refTime.toYMDHMS(
GPST));
418 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
419 [[maybe_unused]]
auto WN =
static_cast<uint16_t
>((sfrbx.
dwrd.at(w) >> 20) & 0b1111111111);
420 auto L2ChannelCodes =
static_cast<uint8_t
>((sfrbx.
dwrd.at(w) >> 18) & 0b11);
421 auto uraIndex =
static_cast<uint8_t
>((sfrbx.
dwrd.at(w) >> 14) & 0b1111);
422 auto svHealth =
static_cast<uint8_t
>((sfrbx.
dwrd.at(w) >> 8) & 0b111111);
423 auto IODC =
static_cast<uint16_t
>(((sfrbx.
dwrd.at(w) >> 6) & 0b11) << 8);
424 LOG_DATA(
"{}: [{}] WN {}, L2ChannelCodes {}, uraIndex {}, svHealth {}, IODC {}",
nameId(), satId, WN, L2ChannelCodes, uraIndex, svHealth, std::bitset<10>(IODC));
427 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
428 auto L2DataFlagPCode =
static_cast<uint8_t
>((sfrbx.
dwrd.at(w) >> 29) & 0b1);
429 LOG_DATA(
"{}: [{}] L2DataFlagPCode {}",
nameId(), satId, L2DataFlagPCode);
432 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
435 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
438 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
439 auto T_GD =
static_cast<int8_t
>((sfrbx.
dwrd.at(w) >> 6) & 0b11111111);
443 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
444 IODC |=
static_cast<uint16_t
>((sfrbx.
dwrd.at(w) >> 22) & 0b11111111);
445 auto toc =
static_cast<uint16_t
>((sfrbx.
dwrd.at(w) >> 6) & 0b1111111111111111);
446 LOG_DATA(
"{}: [{}] IODC {} ({}), toc {}",
nameId(), satId, IODC, std::bitset<10>(IODC), toc);
449 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
450 auto af2 =
static_cast<int8_t
>((sfrbx.
dwrd.at(w) >> 22) & 0b11111111);
451 auto af1 =
static_cast<int16_t
>((sfrbx.
dwrd.at(w) >> 6) & 0b1111111111111111);
455 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
459 InsTime insTimeToc(gpsWeekToW.gpsCycle, gpsWeekToW.gpsWeek, toc * std::pow(2, 4),
GPST);
462 auto ephemeris = std::dynamic_pointer_cast<GPSEphemeris>(ephemerisBuilder.navData);
463 ephemeris->toc = insTimeToc;
465 ephemeris->L2ChannelCodes = L2ChannelCodes;
467 ephemeris->svHealth = svHealth;
468 ephemeris->IODC = IODC;
469 ephemeris->L2DataFlagPCode = L2DataFlagPCode;
470 ephemeris->T_GD = T_GD * std::pow(2, -31);
471 ephemeris->refTime = ephemeris->toc;
473 af0 * std::pow(2, -31),
474 af1 * std::pow(2, -43),
475 af2 * std::pow(2, -55),
477 LOG_DATA(
"{}: [{}] svAccuracy [{} m], svHealth [{}], IODC [{}], tgd [{:.3e} s]",
nameId(), satId,
478 ephemeris->svAccuracy, ephemeris->svHealth, ephemeris->IODC, ephemeris->T_GD);
479 LOG_DATA(
"{}: [{}] toc [{}], a0 [{:.3e} s], a1 [{:.3e} s/s], a2 [{:.3e} s/s^2]",
nameId(), satId,
480 ephemeris->toc.toYMDHMS(
GPST), ephemeris->a[0], ephemeris->a[1], ephemeris->a[2]);
482 finishSubFrame(ephemeris, subFrameId, ephemerisBuilder.subframes);
484 else if (subFrameId == 2)
493 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
494 auto IODE =
static_cast<uint8_t
>((sfrbx.
dwrd.at(w) >> 22) & 0b11111111);
495 auto Crs =
static_cast<int16_t
>((sfrbx.
dwrd.at(w) >> 6) & 0b1111111111111111);
499 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
500 auto delta_n =
static_cast<int16_t
>((sfrbx.
dwrd.at(w) >> 14) & 0b1111111111111111);
501 auto M_0 =
static_cast<int32_t
>(((sfrbx.
dwrd.at(w) >> 6) & 0b11111111) << 24);
502 LOG_DATA(
"{}: [{}] delta_n {}, M_0 {}",
nameId(), satId, delta_n, std::bitset<32>(
static_cast<uint32_t
>(M_0)));
505 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
506 M_0 |=
static_cast<int32_t
>((sfrbx.
dwrd.at(w) >> 6) & 0b111111111111111111111111);
507 LOG_DATA(
"{}: [{}] M_0 {} ({})",
nameId(), satId, M_0, std::bitset<32>(
static_cast<uint32_t
>(M_0)));
510 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
511 auto Cuc =
static_cast<int16_t
>((sfrbx.
dwrd.at(w) >> 14) & 0b1111111111111111);
512 uint32_t e = ((sfrbx.
dwrd.at(w) >> 6) & 0b11111111) << 24;
513 LOG_DATA(
"{}: [{}] Cuc {}, e {}",
nameId(), satId, Cuc, std::bitset<32>(e));
516 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
517 e |= (sfrbx.
dwrd.at(w) >> 6) & 0b111111111111111111111111;
518 LOG_DATA(
"{}: [{}] e {} ({})",
nameId(), satId, e, std::bitset<32>(e));
521 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
522 auto Cus =
static_cast<int16_t
>((sfrbx.
dwrd.at(w) >> 14) & 0b1111111111111111);
523 uint32_t sqrt_A = ((sfrbx.
dwrd.at(w) >> 6) & 0b11111111) << 24;
524 LOG_DATA(
"{}: [{}] Cus {}, sqrt_A {}",
nameId(), satId, Cus, std::bitset<32>(sqrt_A));
527 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
528 sqrt_A |= (sfrbx.
dwrd.at(w) >> 6) & 0b111111111111111111111111;
529 LOG_DATA(
"{}: [{}] sqrt_A {} ({})",
nameId(), satId, sqrt_A, std::bitset<32>(sqrt_A));
532 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
533 auto toe =
static_cast<uint16_t
>((sfrbx.
dwrd.at(w) >> 14) & 0b1111111111111111);
534 auto fitInterval =
static_cast<bool>((sfrbx.
dwrd.at(w) >> 13) & 0b1);
535 [[maybe_unused]]
auto AODO =
static_cast<uint8_t
>((sfrbx.
dwrd.at(w) >> 8) & 0b11111);
536 LOG_DATA(
"{}: [{}] toe {}, fitInterval {}, AODO {}",
nameId(), satId, toe, fitInterval, AODO);
538 InsTime insTimeToe(gpsWeekToW.gpsCycle, gpsWeekToW.gpsWeek, toe * std::pow(2, 4),
GPST);
541 auto ephemeris = std::dynamic_pointer_cast<GPSEphemeris>(ephemerisBuilder.navData);
542 ephemeris->toe = insTimeToe;
544 ephemeris->IODE = IODE;
545 ephemeris->Crs = Crs * std::pow(2, -5);
548 ephemeris->Cuc = Cuc * std::pow(2, -29);
549 ephemeris->e = e * std::pow(2, -33);
550 ephemeris->Cus = Cus * std::pow(2, -29);
551 ephemeris->sqrt_A = sqrt_A * std::pow(2, -19);
552 ephemeris->toe =
InsTime(gpsWeekToW.gpsCycle, gpsWeekToW.gpsWeek, toe * std::pow(2, 4),
GPST);
553 ephemeris->fitInterval = fitInterval ? 8.0 : 4.0;
556 LOG_DATA(
"{}: [{}] IODE [{}], Crs [{:.3e} m], delta_n [{:.3e} rad/s], M_0 [{:.3e} rad], Cuc [{:.3e} rad]",
nameId(), satId,
557 ephemeris->IODE, ephemeris->Crs, ephemeris->delta_n, ephemeris->M_0, ephemeris->Cuc);
558 LOG_DATA(
"{}: [{}] e [{:.3e}], Cus [{:.3e} rad], sqrt_A [{:.3e} m^(1/2)], toe [{}], fitInterval [{:.1f}]",
nameId(), satId,
559 ephemeris->e, ephemeris->Cus, ephemeris->sqrt_A, ephemeris->toe.toGPSweekTow(
GPST), ephemeris->fitInterval);
561 finishSubFrame(ephemeris, subFrameId, ephemerisBuilder.subframes);
563 else if (subFrameId == 3)
572 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
573 auto Cic =
static_cast<int16_t
>((sfrbx.
dwrd.at(w) >> 14) & 0b1111111111111111);
574 auto Omega_0 =
static_cast<int32_t
>(((sfrbx.
dwrd.at(w) >> 6) & 0b11111111) << 24);
575 LOG_DATA(
"{}: [{}] Cic {}, Omega_0 {}",
nameId(), satId, Cic, std::bitset<32>(
static_cast<uint32_t
>(Omega_0)));
578 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
579 Omega_0 |=
static_cast<int32_t
>((sfrbx.
dwrd.at(w) >> 6) & 0b111111111111111111111111);
580 LOG_DATA(
"{}: [{}] Omega_0 {} ({})",
nameId(), satId, Omega_0, std::bitset<32>(
static_cast<uint32_t
>(Omega_0)));
583 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
584 auto Cis =
static_cast<int16_t
>((sfrbx.
dwrd.at(w) >> 14) & 0b1111111111111111);
585 auto i_0 =
static_cast<int32_t
>(((sfrbx.
dwrd.at(w) >> 6) & 0b11111111) << 24);
586 LOG_DATA(
"{}: [{}] Cis {}, i_0 {}",
nameId(), satId, Cis, std::bitset<32>(
static_cast<uint32_t
>(i_0)));
589 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
590 i_0 |=
static_cast<int32_t
>((sfrbx.
dwrd.at(w) >> 6) & 0b111111111111111111111111);
591 LOG_DATA(
"{}: [{}] i_0 {} ({})",
nameId(), satId, i_0, std::bitset<32>(
static_cast<uint32_t
>(i_0)));
594 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
595 auto Crc =
static_cast<int16_t
>((sfrbx.
dwrd.at(w) >> 14) & 0b1111111111111111);
596 auto omega =
static_cast<int32_t
>(((sfrbx.
dwrd.at(w) >> 6) & 0b11111111) << 24);
597 LOG_DATA(
"{}: [{}] Crc {}, omega {}",
nameId(), satId, Crc, std::bitset<32>(
static_cast<uint32_t
>(omega)));
600 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
601 omega |=
static_cast<int32_t
>((sfrbx.
dwrd.at(w) >> 6) & 0b111111111111111111111111);
602 LOG_DATA(
"{}: [{}] omega {} ({})",
nameId(), satId, omega, std::bitset<32>(
static_cast<uint32_t
>(omega)));
605 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
607 LOG_DATA(
"{}: [{}] Omega_dot {} ({})",
nameId(), satId, Omega_dot, std::bitset<32>(
static_cast<uint32_t
>(Omega_dot)));
610 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
611 auto IODE =
static_cast<uint8_t
>((sfrbx.
dwrd.at(w) >> 22) & 0b11111111);
613 LOG_DATA(
"{}: [{}] IODE {}, i_dot {} ({})",
nameId(), satId, IODE, i_dot, std::bitset<16>(
static_cast<uint16_t
>(i_dot)));
616 if (!ephemerisBuilder.has_value())
618 LOG_DATA(
"{}: [{}] Could not find Ephemeris builder for IODE {}",
nameId(), satId, IODE);
621 auto ephemeris = std::dynamic_pointer_cast<GPSEphemeris>(ephemerisBuilder->get().navData);
623 ephemeris->Cic = Cic * std::pow(2, -29);
625 ephemeris->Cis = Cis * std::pow(2, -29);
627 ephemeris->Crc = Crc * std::pow(2, -5);
630 ephemeris->IODE = IODE;
633 LOG_DATA(
"{}: [{}] Cic [{:.3e} rad], Omega_0 [{:.3e} rad], Cis [{:.3e} rad], i_0 [{:.3e} rad], Crc [{:.3e} m]",
nameId(), satId,
634 ephemeris->Cic, ephemeris->Omega_0, ephemeris->Cis, ephemeris->i_0, ephemeris->Crc);
635 LOG_DATA(
"{}: [{}] omega [{:.3e} rad], Omega_dot [{:.3e} rad/s], IODE [{}], i_dot [{:.3e} rad/s]",
nameId(), satId,
636 ephemeris->omega, ephemeris->Omega_dot, ephemeris->IODE, ephemeris->i_dot);
638 finishSubFrame(ephemeris, subFrameId, ephemerisBuilder->get().subframes);
640 else if (subFrameId == 4)
657 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
658 [[maybe_unused]]
auto dataId =
static_cast<uint8_t
>((sfrbx.
dwrd.at(w) >> 28) & 0b11);
659 auto svId =
static_cast<uint8_t
>((sfrbx.
dwrd.at(w) >> 22) & 0b111111);
660 LOG_DATA(
"{}: [{}] dataId {}, svId {}",
nameId(), satId, dataId, svId);
670 auto alpha0 =
static_cast<int8_t
>((sfrbx.
dwrd.at(w) >> 14) & 0b11111111);
671 auto alpha1 =
static_cast<int8_t
>((sfrbx.
dwrd.at(w) >> 6) & 0b11111111);
672 LOG_DATA(
"{}: [{}] alpha0 {}, alpha1 {}",
nameId(), satId, alpha0, alpha1);
675 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
676 auto alpha2 =
static_cast<int8_t
>((sfrbx.
dwrd.at(w) >> 22) & 0b11111111);
677 auto alpha3 =
static_cast<int8_t
>((sfrbx.
dwrd.at(w) >> 14) & 0b11111111);
678 auto beta0 =
static_cast<int8_t
>((sfrbx.
dwrd.at(w) >> 6) & 0b11111111);
679 LOG_DATA(
"{}: [{}] alpha2 {}, alpha3 {}, beta0 {}",
nameId(), satId, alpha2, alpha3, beta0);
682 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
683 auto beta1 =
static_cast<int8_t
>((sfrbx.
dwrd.at(w) >> 22) & 0b11111111);
684 auto beta2 =
static_cast<int8_t
>((sfrbx.
dwrd.at(w) >> 14) & 0b11111111);
685 auto beta3 =
static_cast<int8_t
>((sfrbx.
dwrd.at(w) >> 6) & 0b11111111);
686 LOG_DATA(
"{}: [{}] beta1 {}, beta2 {}, beta3 {}",
nameId(), satId, beta1, beta2, beta3);
689 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
694 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
695 auto A0 =
static_cast<int32_t
>(((sfrbx.
dwrd.at(w) >> 6) & 0b111111111111111111111111) << 8);
696 LOG_DATA(
"{}: [{}] A0 {}",
nameId(), satId, std::bitset<32>(
static_cast<uint32_t
>(A0)));
699 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
700 A0 |=
static_cast<int32_t
>((sfrbx.
dwrd.at(w) >> 22) & 0b11111111);
701 LOG_DATA(
"{}: [{}] A0 {} ({})",
nameId(), satId, A0, std::bitset<32>(
static_cast<uint32_t
>(A0)));
704 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
707 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
717 ephemerisBuilder.has_value())
719 auto ephemeris = std::dynamic_pointer_cast<GPSEphemeris>(ephemerisBuilder->get().navData);
720 LOG_DEBUG(
"{}: [{}] Received Ionospheric and Time system corrections [{}]",
nameId(), satId.
satSys, ephemeris->refTime.toYMDHMS(
GPST));
730 alpha0 * std::pow(2, -30) ,
731 alpha1 * std::pow(2, -27) ,
732 alpha2 * std::pow(2, -24) ,
733 alpha3 * std::pow(2, -24) ,
737 beta0 * std::pow(2, 11) ,
738 beta1 * std::pow(2, 14) ,
739 beta2 * std::pow(2, 16) ,
740 beta3 * std::pow(2, 16) ,
743 .a0 = A0 * std::pow(2, -30),
744 .a1 = A1 * std::pow(2, -50),
756 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
758 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
760 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
762 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
764 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
766 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
768 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
771 else if (subFrameId == 5)
782 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
784 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
786 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
788 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
790 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
792 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
794 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
796 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
830 auto even =
static_cast<uint8_t
>((sfrbx.
dwrd.at(w) >> 31) & 0b1);
831 auto pageTypeEven =
static_cast<uint8_t
>((sfrbx.
dwrd.at(w) >> 30) & 0b1);
832 auto odd =
static_cast<uint8_t
>((sfrbx.
dwrd.at(4) >> 31) & 0b1);
833 auto pageTypeOdd =
static_cast<uint8_t
>((sfrbx.
dwrd.at(4) >> 30) & 0b1);
834 auto wordType =
static_cast<uint8_t
>((sfrbx.
dwrd.at(w) >> 24) & 0b111111);
835 LOG_DATA(
"{}: [{}] wordType: {:2}, even {} ({} pageType), odd {} ({} pageType)",
nameId(), satId, wordType, even, pageTypeEven, odd, pageTypeOdd);
837 if (even != 0 || pageTypeEven == 1
838 || odd != 1 || pageTypeOdd == 1)
840 LOG_DATA(
"{}: [{}] Ignoring message, because one of the page types is alert page",
nameId(), satId);
846 auto finishWord = [&]<
size_t N>(
const std::shared_ptr<SatNavData>& ephemeris,
size_t wordType, std::bitset<N>& subframesFound) {
847 if (1 <= wordType && wordType <= 5)
849 subframesFound.set(wordType - 1);
851 LOG_DATA(
"{}: [{}] subframesFound: {}",
nameId(), satId, subframesFound);
852 if (subframesFound.count() == 5)
854 LOG_DATA(
"{}: [{}] [{}] All words found. Updating gnnsNavInfo",
nameId(), satId, ephemeris->refTime.toYMDHMS(
GPST));
855 if (!
_gnssNavInfo.searchNavigationData(satId, ephemeris->refTime))
857 LOG_DEBUG(
"{}: Adding new ephemeris data [{}] [{}]",
nameId(), satId, ephemeris->refTime.toYMDHMS(
GPST));
882 LOG_DATA(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
883 auto IODnav =
static_cast<uint16_t
>((sfrbx.
dwrd.at(w) >> 14) & 0b1111111111);
884 auto toe =
static_cast<uint16_t
>(sfrbx.
dwrd.at(w) & 0b11111111111111);
885 LOG_DATA(
"{}: [{}] IODnav {}, toe {}",
nameId(), satId, IODnav, toe);
888 LOG_DATA(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
889 auto M_0 =
static_cast<int32_t
>(sfrbx.
dwrd.at(w));
893 LOG_DATA(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
894 uint32_t e = sfrbx.
dwrd.at(w);
898 LOG_DATA(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
899 uint32_t sqrt_A = ((sfrbx.
dwrd.at(w) >> 14) & 0b111111111111111111) << 14;
900 LOG_DATA(
"{}: [{}] sqrt_A {}",
nameId(), satId, std::bitset<32>(sqrt_A));
903 LOG_DATA(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
904 sqrt_A |= (sfrbx.
dwrd.at(w) >> 16) & 0b11111111111111;
905 LOG_DATA(
"{}: [{}] sqrt_A {} ({})",
nameId(), satId, sqrt_A, std::bitset<32>(sqrt_A));
907 InsTime insTimeToe(gpsWeekToW.gpsCycle, gpsWeekToW.gpsWeek, toe * 60.0,
GST);
910 auto ephemeris = std::dynamic_pointer_cast<GalileoEphemeris>(ephemerisBuilder.navData);
911 ephemeris->toe = insTimeToe;
913 ephemeris->IODnav = IODnav;
915 ephemeris->e = e * std::pow(2.0, -33);
916 ephemeris->sqrt_A = sqrt_A * std::pow(2.0, -19);
918 LOG_DATA(
"{}: [{}] IODnav [{}], toe [{}], M_0 [{:.3e} rad], e [{:.3e}], sqrt_A [{:.3e} m^(1/2)]",
nameId(), satId,
919 ephemeris->IODnav, ephemeris->toe.toYMDHMS(
GPST), ephemeris->M_0, ephemeris->e, ephemeris->sqrt_A);
921 finishWord(ephemeris, wordType, ephemerisBuilder.subframes);
923 else if (wordType == 2)
935 LOG_DATA(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
936 auto IODnav =
static_cast<uint16_t
>((sfrbx.
dwrd.at(w) >> 14) & 0b1111111111);
937 auto Omega_0 =
static_cast<int32_t
>((sfrbx.
dwrd.at(w) & 0b11111111111111) << 18);
938 LOG_DATA(
"{}: [{}] IODnav {}, Omega_0 {}",
nameId(), satId, IODnav, std::bitset<32>(
static_cast<uint32_t
>(Omega_0)));
941 LOG_DATA(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
942 Omega_0 |=
static_cast<int32_t
>((sfrbx.
dwrd.at(w) >> 14) & 0b111111111111111111);
943 auto i_0 =
static_cast<int32_t
>((sfrbx.
dwrd.at(w) & 0b11111111111111) << 18);
944 LOG_DATA(
"{}: [{}] Omega_0 {} ({}), i_0 {}",
nameId(), satId, Omega_0, std::bitset<32>(
static_cast<uint32_t
>(Omega_0)), std::bitset<32>(
static_cast<uint32_t
>(i_0)));
947 LOG_DATA(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
948 i_0 |=
static_cast<int32_t
>((sfrbx.
dwrd.at(w) >> 14) & 0b111111111111111111);
949 auto omega =
static_cast<int32_t
>((sfrbx.
dwrd.at(w) & 0b11111111111111) << 18);
950 LOG_DATA(
"{}: [{}] i_0 {} ({}), omega {}",
nameId(), satId, i_0, std::bitset<32>(
static_cast<uint32_t
>(i_0)), std::bitset<32>(
static_cast<uint32_t
>(omega)));
953 LOG_DATA(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
954 omega |=
static_cast<int32_t
>((sfrbx.
dwrd.at(w) >> 14) & 0b111111111111111111);
955 LOG_DATA(
"{}: [{}] omega {} ({})",
nameId(), satId, omega, std::bitset<32>(
static_cast<uint32_t
>(omega)));
958 LOG_DATA(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
960 LOG_DATA(
"{}: [{}] i_dot {} ({})",
nameId(), satId, i_dot, std::bitset<16>(
static_cast<uint16_t
>(i_dot)));
963 if (!ephemerisBuilder.has_value())
965 LOG_DATA(
"{}: [{}] Could not find Ephemeris builder for IODnav {}",
nameId(), satId, IODnav);
968 auto ephemeris = std::dynamic_pointer_cast<GalileoEphemeris>(ephemerisBuilder->get().navData);
975 LOG_DATA(
"{}: [{}] IODnav [{}], Omega_0 [{} rad], i_0 [{:.3e} rad], omega [{:.3e} rad], i_dot [{:.3e} rad/s]",
nameId(), satId,
976 ephemeris->IODnav, ephemeris->Omega_0, ephemeris->i_0, ephemeris->omega, ephemeris->i_dot);
978 finishWord(ephemeris, wordType, ephemerisBuilder->get().subframes);
980 else if (wordType == 3)
992 LOG_DATA(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
993 auto IODnav =
static_cast<uint16_t
>((sfrbx.
dwrd.at(w) >> 14) & 0b1111111111);
994 auto Omega_dot =
static_cast<int32_t
>((sfrbx.
dwrd.at(w) & 0b11111111111111) << 10);
995 LOG_DATA(
"{}: [{}] IODnav {}, Omega_dot {}",
nameId(), satId, IODnav, std::bitset<32>(
static_cast<uint32_t
>(Omega_dot)));
998 LOG_DATA(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
999 Omega_dot |=
static_cast<int32_t
>((sfrbx.
dwrd.at(w) >> 22) & 0b1111111111);
1001 auto delta_n =
static_cast<int16_t
>((sfrbx.
dwrd.at(w) >> 6) & 0b1111111111111111);
1002 auto Cuc =
static_cast<int16_t
>((sfrbx.
dwrd.at(w) & 0b111111) << 10);
1003 LOG_DATA(
"{}: [{}] Omega_dot {} ({}), delta_n {}, Cuc {}",
nameId(), satId,
1004 Omega_dot, std::bitset<32>(
static_cast<uint32_t
>(Omega_dot)), delta_n, std::bitset<16>(
static_cast<uint16_t
>(Cuc)));
1007 LOG_DATA(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
1008 Cuc |=
static_cast<int16_t
>((sfrbx.
dwrd.at(w) >> 22) & 0b1111111111);
1009 auto Cus =
static_cast<int16_t
>((sfrbx.
dwrd.at(w) >> 6) & 0b1111111111111111);
1010 auto Crc =
static_cast<int16_t
>((sfrbx.
dwrd.at(w) & 0b111111) << 10);
1011 LOG_DATA(
"{}: [{}] Cuc {} ({}), Cus {}, Crc {}",
nameId(), satId, Cuc, std::bitset<16>(
static_cast<uint16_t
>(Cuc)), Cus, std::bitset<16>(
static_cast<uint16_t
>(Crc)));
1014 LOG_DATA(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
1015 Crc |=
static_cast<int16_t
>((sfrbx.
dwrd.at(w) >> 22) & 0b1111111111);
1016 auto Crs =
static_cast<int16_t
>(((sfrbx.
dwrd.at(w) >> 14) & 0b11111111) << 8);
1017 LOG_DATA(
"{}: [{}] Crc {} ({}), Crs {}",
nameId(), satId, Crc, std::bitset<16>(
static_cast<uint16_t
>(Crc)), std::bitset<16>(
static_cast<uint16_t
>(Crs)));
1020 LOG_DATA(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
1021 Crs |=
static_cast<int16_t
>((sfrbx.
dwrd.at(w) >> 22) & 0b11111111);
1022 auto SISA =
static_cast<uint8_t
>((sfrbx.
dwrd.at(w) >> 14) & 0b11111111);
1023 LOG_DATA(
"{}: [{}] Crs {} ({}), SISA {}",
nameId(), satId, Crs, std::bitset<16>(
static_cast<uint16_t
>(Crs)), SISA);
1026 if (!ephemerisBuilder.has_value())
1028 LOG_DATA(
"{}: [{}] Could not find Ephemeris builder for IODnav {}",
nameId(), satId, IODnav);
1031 auto ephemeris = std::dynamic_pointer_cast<GalileoEphemeris>(ephemerisBuilder->get().navData);
1033 ephemeris->Omega_dot =
semicircles2rad(Omega_dot * std::pow(2.0, -43));
1035 ephemeris->Cuc = Cuc * std::pow(2.0, -29);
1036 ephemeris->Cus = Cus * std::pow(2.0, -29);
1037 ephemeris->Crc = Crc * std::pow(2.0, -5);
1038 ephemeris->Crs = Crs * std::pow(2.0, -5);
1041 LOG_DATA(
"{}: [{}] IODnav [{}], Omega_dot [{} rad/s], delta_n [{:.3e} rad/s], Cuc [{:.3e} rad], Cus [{:.3e} rad/s], Crc [{:.3e} m], Crs [{:.3e} m], SISA [{:.3e} m]",
nameId(), satId,
1042 ephemeris->IODnav, ephemeris->Omega_dot, ephemeris->delta_n, ephemeris->Cuc, ephemeris->Cus, ephemeris->Crc, ephemeris->Crs, ephemeris->signalAccuracy);
1044 finishWord(ephemeris, wordType, ephemerisBuilder->get().subframes);
1046 else if (wordType == 4)
1059 LOG_DATA(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
1060 auto IODnav =
static_cast<uint16_t
>((sfrbx.
dwrd.at(w) >> 14) & 0b1111111111);
1061 [[maybe_unused]]
auto SVID =
static_cast<uint8_t
>((sfrbx.
dwrd.at(w) >> 8) & 0b111111);
1062 auto Cic =
static_cast<int16_t
>((sfrbx.
dwrd.at(w) & 0b11111111) << 8);
1063 LOG_DATA(
"{}: [{}] IODnav {}, SVID {}, Cic {}",
nameId(), satId, IODnav, SVID, std::bitset<16>(
static_cast<uint16_t
>(Cic)));
1066 LOG_DATA(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
1067 Cic |=
static_cast<int16_t
>((sfrbx.
dwrd.at(w) >> 24) & 0b11111111);
1068 auto Cis =
static_cast<int16_t
>((sfrbx.
dwrd.at(w) >> 8) & 0b1111111111111111);
1069 auto toc =
static_cast<uint16_t
>((sfrbx.
dwrd.at(w) & 0b11111111) << 6);
1070 LOG_DATA(
"{}: [{}] Cic {} ({}), Cis {}, toc {}",
nameId(), satId, Cic, std::bitset<16>(
static_cast<uint16_t
>(Cic)), Cis, std::bitset<16>(toc));
1073 LOG_DATA(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
1074 toc |=
static_cast<uint16_t
>((sfrbx.
dwrd.at(w) >> 26) & 0b111111);
1075 auto af0 =
static_cast<int32_t
>((sfrbx.
dwrd.at(w) & 0b11111111111111111111111111) << 5);
1076 LOG_DATA(
"{}: [{}] toc {} ({}), af0 {}",
nameId(), satId, toc, std::bitset<16>(toc), std::bitset<32>(
static_cast<uint32_t
>(af0)));
1079 LOG_DATA(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
1080 af0 |=
static_cast<int32_t
>((sfrbx.
dwrd.at(w) >> 27) & 0b11111);
1082 auto af1 =
static_cast<int32_t
>(((sfrbx.
dwrd.at(w) >> 14) & 0b1111111111111) << 8);
1083 LOG_DATA(
"{}: [{}] af0 {} ({}), af1 {}",
nameId(), satId, af0, std::bitset<32>(
static_cast<uint32_t
>(af0)), std::bitset<32>(
static_cast<uint32_t
>(af1)));
1086 LOG_DATA(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
1087 af1 |=
static_cast<int32_t
>((sfrbx.
dwrd.at(w) >> 22) & 0b11111111);
1090 LOG_DATA(
"{}: [{}] af1 {} ({}), af1 {}",
nameId(), satId, af1, std::bitset<32>(
static_cast<uint32_t
>(af1)), std::bitset<8>(
static_cast<uint8_t
>(af2)));
1093 if (!ephemerisBuilder.has_value())
1095 LOG_DATA(
"{}: [{}] Could not find Ephemeris builder for IODnav {}",
nameId(), satId, IODnav);
1098 auto ephemeris = std::dynamic_pointer_cast<GalileoEphemeris>(ephemerisBuilder->get().navData);
1100 InsTime insTimeToc(gpsWeekToW.gpsCycle, gpsWeekToW.gpsWeek, toc * 60.0,
GST);
1102 ephemeris->Cic = Cic * std::pow(2.0, -29);
1103 ephemeris->Cis = Cis * std::pow(2.0, -29);
1104 ephemeris->toc = insTimeToc;
1105 ephemeris->refTime = ephemeris->toc;
1107 af0 * std::pow(2, -34),
1108 af1 * std::pow(2, -46),
1109 af2 * std::pow(2, -59),
1112 LOG_DATA(
"{}: [{}] IODnav [{}], Cic [{:.3e} rad], Cis [{:.3e} rad]",
nameId(), satId, ephemeris->IODnav, ephemeris->Cic, ephemeris->Cis);
1113 LOG_DATA(
"{}: [{}] toc [{}], a0 [{:.3e} s], a1 [{:.3e} s/s], a2 [{:.3e} s/s^2]",
nameId(), satId,
1114 ephemeris->toc.toYMDHMS(
GPST), ephemeris->a[0], ephemeris->a[1], ephemeris->a[2]);
1116 finishWord(ephemeris, wordType, ephemerisBuilder->get().subframes);
1118 else if (wordType == 5)
1131 LOG_DATA(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
1132 auto ai0 =
static_cast<uint16_t
>((sfrbx.
dwrd.at(w) >> 13) & 0b11111111111);
1134 auto ai2 =
static_cast<int16_t
>((sfrbx.
dwrd.at(w) & 0b11) << 12);
1135 LOG_DATA(
"{}: [{}] ai0 {} ({}), ai1 {} ({}), ai2 {}",
nameId(), satId,
1136 ai0, std::bitset<16>(ai0), ai1, std::bitset<16>(
static_cast<uint16_t
>(ai1)), std::bitset<16>(
static_cast<uint16_t
>(ai2)));
1139 LOG_DATA(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
1140 ai2 |=
static_cast<int16_t
>((sfrbx.
dwrd.at(w) >> 20) & 0b111111111111);
1143 auto BGD_E1_E5b =
static_cast<int16_t
>((sfrbx.
dwrd.at(w) & 0b11111) << 5);
1144 LOG_DATA(
"{}: [{}] ai2 {} ({}), BGD_E1_E5a {}, BGD_E1_E5b {}",
nameId(), satId, ai2, std::bitset<16>(
static_cast<uint16_t
>(ai2)), BGD_E1_E5a, std::bitset<16>(
static_cast<uint16_t
>(BGD_E1_E5b)));
1147 LOG_DATA(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
1148 BGD_E1_E5b |=
static_cast<int16_t
>((sfrbx.
dwrd.at(w) >> 27) & 0b11111);
1150 auto E5b_HS =
static_cast<uint8_t
>((sfrbx.
dwrd.at(w) >> 25) & 0b11);
1151 auto E1b_HS =
static_cast<uint8_t
>((sfrbx.
dwrd.at(w) >> 23) & 0b11);
1152 auto E5b_DVS =
static_cast<uint8_t
>((sfrbx.
dwrd.at(w) >> 22) & 0b1);
1153 auto E1b_DVS =
static_cast<uint8_t
>((sfrbx.
dwrd.at(w) >> 21) & 0b1);
1154 [[maybe_unused]]
auto WN =
static_cast<uint16_t
>((sfrbx.
dwrd.at(w) >> 9) & 0b111111111111);
1155 [[maybe_unused]] uint32_t TOW = (sfrbx.
dwrd.at(w) & 0b111111111) << 11;
1156 LOG_DATA(
"{}: [{}] BGD_E1_E5b {} ({}), E5b_HS {}, E1b_HS {}, E5b_DVS {}, E1b_DVS {}, WN {}, TOW {}",
nameId(), satId,
1157 BGD_E1_E5b, std::bitset<16>(
static_cast<uint16_t
>(BGD_E1_E5b)), E5b_HS, E1b_HS, E5b_DVS, E1b_DVS, WN, std::bitset<32>(TOW));
1160 LOG_DATA(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
1161 TOW |= (sfrbx.
dwrd.at(w) >> 21) & 0b11111111111;
1162 LOG_DATA(
"{}: [{}] TOW {} ({})",
nameId(), satId, TOW, std::bitset<32>(TOW));
1165 LOG_DATA(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
1168 if (!ephemerisBuilder.has_value())
1170 LOG_DATA(
"{}: [{}] Could not find any ephemeris builder",
nameId(), satId);
1173 auto ephemeris = std::dynamic_pointer_cast<GalileoEphemeris>(ephemerisBuilder->get().navData);
1175 ephemeris->BGD_E1_E5a = BGD_E1_E5a * std::pow(2.0, -32);
1176 ephemeris->BGD_E1_E5b = BGD_E1_E5b * std::pow(2.0, -32);
1177 ephemeris->svHealth = {
1178 .E5a_DataValidityStatus = {},
1181 .E5a_SignalHealthStatus = {},
1185 ephemeris->dataSource[0] =
true;
1186 ephemeris->dataSource[9] =
true;
1203 ai0 * std::pow(2.0, -2) ,
1204 ai1 * std::pow(2.0, -8) ,
1205 ai2 * std::pow(2.0, -15) ,
1210 LOG_DATA(
"{}: [{}] BGD_E1_E5a [{:.3e} s], BGD_E1_E5b [{:.3e} rad]",
nameId(), satId, ephemeris->BGD_E1_E5a, ephemeris->BGD_E1_E5b);
1212 finishWord(ephemeris, wordType, ephemerisBuilder->get().subframes);
1214 else if (wordType == 6)
1226 LOG_DATA(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
1227 auto A0 =
static_cast<int32_t
>((sfrbx.
dwrd.at(w) & 0b111111111111111111111111) << 8);
1228 LOG_DATA(
"{}: [{}] A0 {}",
nameId(), satId, std::bitset<32>(
static_cast<uint32_t
>(A0)));
1231 LOG_DATA(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
1232 A0 |=
static_cast<int32_t
>((sfrbx.
dwrd.at(w) >> 24) & 0b11111111);
1234 LOG_DATA(
"{}: [{}] A0 {} ({}), A1 {} ({})",
nameId(), satId, A0, std::bitset<32>(
static_cast<uint32_t
>(A0)), A1, std::bitset<32>(
static_cast<uint32_t
>(A1)));
1237 LOG_DATA(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
1240 LOG_DATA(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
1243 LOG_DATA(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
1255 ephemerisBuilder.has_value())
1257 auto ephemeris = std::dynamic_pointer_cast<GalileoEphemeris>(ephemerisBuilder->get().navData);
1267 .a0 = A0 * std::pow(2, -30),
1268 .a1 = A1 * std::pow(2, -50),