360 LOG_DATA(
"{}: [{}] tlm: {} {}",
nameId(), satId, std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
361 constexpr uint8_t TLM_PREAMBLE = 0b10001011;
362 if (
static_cast<uint8_t
>((sfrbx.
dwrd.at(w) >> 22) & 0b11111111) != TLM_PREAMBLE)
364 LOG_DATA(
"{}: [{}] Wrong telemetry word preamble. Ignoring SFRBX message.",
nameId(), satId);
375 LOG_DATA(
"{}: [{}] how: {} {}",
nameId(), satId, std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
376 auto subFrameId =
static_cast<uint8_t
>((sfrbx.
dwrd.at(w) >> 8) & 0b111);
379 if (subFrameId == 0 || subFrameId > 5)
381 LOG_ERROR(
"{}: [{}] The subFrameId has to be in the range [1..=5] but it is {}",
nameId(), satId, subFrameId);
387 auto finishSubFrame = [&]<
size_t N>(
const std::shared_ptr<SatNavData>& ephemeris,
size_t subFrameId, std::bitset<N>& subframesFound) {
388 if (1 <= subFrameId && subFrameId <= 3)
390 subframesFound.set(subFrameId - 1);
392 LOG_DATA(
"{}: [{}] subframesFound: {}",
nameId(), satId, subframesFound);
393 if (subframesFound.count() == 3)
395 LOG_DATA(
"{}: [{}] [{}] All subframes found. Updating gnnsNavInfo",
nameId(), satId, ephemeris->refTime.toYMDHMS(
GPST));
396 if (!
_gnssNavInfo.searchNavigationData(satId, ephemeris->refTime))
398 LOG_DEBUG(
"{}: Adding new ephemeris data [{}] [{}]",
nameId(), satId, ephemeris->refTime.toYMDHMS(
GPST));
420 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
421 [[maybe_unused]]
auto WN =
static_cast<uint16_t
>((sfrbx.
dwrd.at(w) >> 20) & 0b1111111111);
422 auto L2ChannelCodes =
static_cast<uint8_t
>((sfrbx.
dwrd.at(w) >> 18) & 0b11);
423 auto uraIndex =
static_cast<uint8_t
>((sfrbx.
dwrd.at(w) >> 14) & 0b1111);
424 auto svHealth =
static_cast<uint8_t
>((sfrbx.
dwrd.at(w) >> 8) & 0b111111);
425 auto IODC =
static_cast<uint16_t
>(((sfrbx.
dwrd.at(w) >> 6) & 0b11) << 8);
426 LOG_DATA(
"{}: [{}] WN {}, L2ChannelCodes {}, uraIndex {}, svHealth {}, IODC {}",
nameId(), satId, WN, L2ChannelCodes, uraIndex, svHealth, std::bitset<10>(IODC));
429 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
430 auto L2DataFlagPCode =
static_cast<uint8_t
>((sfrbx.
dwrd.at(w) >> 29) & 0b1);
431 LOG_DATA(
"{}: [{}] L2DataFlagPCode {}",
nameId(), satId, L2DataFlagPCode);
434 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
437 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
440 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
441 auto T_GD =
static_cast<int8_t
>((sfrbx.
dwrd.at(w) >> 6) & 0b11111111);
445 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
446 IODC |=
static_cast<uint16_t
>((sfrbx.
dwrd.at(w) >> 22) & 0b11111111);
447 auto toc =
static_cast<uint16_t
>((sfrbx.
dwrd.at(w) >> 6) & 0b1111111111111111);
448 LOG_DATA(
"{}: [{}] IODC {} ({}), toc {}",
nameId(), satId, IODC, std::bitset<10>(IODC), toc);
451 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
452 auto af2 =
static_cast<int8_t
>((sfrbx.
dwrd.at(w) >> 22) & 0b11111111);
453 auto af1 =
static_cast<int16_t
>((sfrbx.
dwrd.at(w) >> 6) & 0b1111111111111111);
457 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
461 InsTime insTimeToc(gpsWeekToW.gpsCycle, gpsWeekToW.gpsWeek, toc * std::pow(2, 4),
GPST);
464 auto ephemeris = std::dynamic_pointer_cast<GPSEphemeris>(ephemerisBuilder.navData);
465 ephemeris->toc = insTimeToc;
467 ephemeris->L2ChannelCodes = L2ChannelCodes;
469 ephemeris->svHealth = svHealth;
470 ephemeris->IODC = IODC;
471 ephemeris->L2DataFlagPCode = L2DataFlagPCode;
472 ephemeris->T_GD = T_GD * std::pow(2, -31);
473 ephemeris->refTime = ephemeris->toc;
475 af0 * std::pow(2, -31),
476 af1 * std::pow(2, -43),
477 af2 * std::pow(2, -55),
479 LOG_DATA(
"{}: [{}] svAccuracy [{} m], svHealth [{}], IODC [{}], tgd [{:.3e} s]",
nameId(), satId,
480 ephemeris->svAccuracy, ephemeris->svHealth, ephemeris->IODC, ephemeris->T_GD);
481 LOG_DATA(
"{}: [{}] toc [{}], a0 [{:.3e} s], a1 [{:.3e} s/s], a2 [{:.3e} s/s^2]",
nameId(), satId,
482 ephemeris->toc.toYMDHMS(
GPST), ephemeris->a[0], ephemeris->a[1], ephemeris->a[2]);
484 finishSubFrame(ephemeris, subFrameId, ephemerisBuilder.subframes);
486 else if (subFrameId == 2)
495 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
496 auto IODE =
static_cast<uint8_t
>((sfrbx.
dwrd.at(w) >> 22) & 0b11111111);
497 auto Crs =
static_cast<int16_t
>((sfrbx.
dwrd.at(w) >> 6) & 0b1111111111111111);
501 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
502 auto delta_n =
static_cast<int16_t
>((sfrbx.
dwrd.at(w) >> 14) & 0b1111111111111111);
503 auto M_0 =
static_cast<int32_t
>(((sfrbx.
dwrd.at(w) >> 6) & 0b11111111) << 24);
504 LOG_DATA(
"{}: [{}] delta_n {}, M_0 {}",
nameId(), satId, delta_n, std::bitset<32>(
static_cast<uint32_t
>(M_0)));
507 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
508 M_0 |=
static_cast<int32_t
>((sfrbx.
dwrd.at(w) >> 6) & 0b111111111111111111111111);
509 LOG_DATA(
"{}: [{}] M_0 {} ({})",
nameId(), satId, M_0, std::bitset<32>(
static_cast<uint32_t
>(M_0)));
512 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
513 auto Cuc =
static_cast<int16_t
>((sfrbx.
dwrd.at(w) >> 14) & 0b1111111111111111);
514 uint32_t e = ((sfrbx.
dwrd.at(w) >> 6) & 0b11111111) << 24;
515 LOG_DATA(
"{}: [{}] Cuc {}, e {}",
nameId(), satId, Cuc, std::bitset<32>(e));
518 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
519 e |= (sfrbx.
dwrd.at(w) >> 6) & 0b111111111111111111111111;
520 LOG_DATA(
"{}: [{}] e {} ({})",
nameId(), satId, e, std::bitset<32>(e));
523 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
524 auto Cus =
static_cast<int16_t
>((sfrbx.
dwrd.at(w) >> 14) & 0b1111111111111111);
525 uint32_t sqrt_A = ((sfrbx.
dwrd.at(w) >> 6) & 0b11111111) << 24;
526 LOG_DATA(
"{}: [{}] Cus {}, sqrt_A {}",
nameId(), satId, Cus, std::bitset<32>(sqrt_A));
529 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
530 sqrt_A |= (sfrbx.
dwrd.at(w) >> 6) & 0b111111111111111111111111;
531 LOG_DATA(
"{}: [{}] sqrt_A {} ({})",
nameId(), satId, sqrt_A, std::bitset<32>(sqrt_A));
534 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
535 auto toe =
static_cast<uint16_t
>((sfrbx.
dwrd.at(w) >> 14) & 0b1111111111111111);
536 auto fitInterval =
static_cast<bool>((sfrbx.
dwrd.at(w) >> 13) & 0b1);
537 [[maybe_unused]]
auto AODO =
static_cast<uint8_t
>((sfrbx.
dwrd.at(w) >> 8) & 0b11111);
538 LOG_DATA(
"{}: [{}] toe {}, fitInterval {}, AODO {}",
nameId(), satId, toe, fitInterval, AODO);
540 InsTime insTimeToe(gpsWeekToW.gpsCycle, gpsWeekToW.gpsWeek, toe * std::pow(2, 4),
GPST);
543 auto ephemeris = std::dynamic_pointer_cast<GPSEphemeris>(ephemerisBuilder.navData);
544 ephemeris->toe = insTimeToe;
546 ephemeris->IODE = IODE;
547 ephemeris->Crs = Crs * std::pow(2, -5);
550 ephemeris->Cuc = Cuc * std::pow(2, -29);
551 ephemeris->e = e * std::pow(2, -33);
552 ephemeris->Cus = Cus * std::pow(2, -29);
553 ephemeris->sqrt_A = sqrt_A * std::pow(2, -19);
554 ephemeris->toe =
InsTime(gpsWeekToW.gpsCycle, gpsWeekToW.gpsWeek, toe * std::pow(2, 4),
GPST);
555 ephemeris->fitInterval = fitInterval ? 8.0 : 4.0;
558 LOG_DATA(
"{}: [{}] IODE [{}], Crs [{:.3e} m], delta_n [{:.3e} rad/s], M_0 [{:.3e} rad], Cuc [{:.3e} rad]",
nameId(), satId,
559 ephemeris->IODE, ephemeris->Crs, ephemeris->delta_n, ephemeris->M_0, ephemeris->Cuc);
560 LOG_DATA(
"{}: [{}] e [{:.3e}], Cus [{:.3e} rad], sqrt_A [{:.3e} m^(1/2)], toe [{}], fitInterval [{:.1f}]",
nameId(), satId,
561 ephemeris->e, ephemeris->Cus, ephemeris->sqrt_A, ephemeris->toe.toGPSweekTow(
GPST), ephemeris->fitInterval);
563 finishSubFrame(ephemeris, subFrameId, ephemerisBuilder.subframes);
565 else if (subFrameId == 3)
574 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
575 auto Cic =
static_cast<int16_t
>((sfrbx.
dwrd.at(w) >> 14) & 0b1111111111111111);
576 auto Omega_0 =
static_cast<int32_t
>(((sfrbx.
dwrd.at(w) >> 6) & 0b11111111) << 24);
577 LOG_DATA(
"{}: [{}] Cic {}, Omega_0 {}",
nameId(), satId, Cic, std::bitset<32>(
static_cast<uint32_t
>(Omega_0)));
580 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
581 Omega_0 |=
static_cast<int32_t
>((sfrbx.
dwrd.at(w) >> 6) & 0b111111111111111111111111);
582 LOG_DATA(
"{}: [{}] Omega_0 {} ({})",
nameId(), satId, Omega_0, std::bitset<32>(
static_cast<uint32_t
>(Omega_0)));
585 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
586 auto Cis =
static_cast<int16_t
>((sfrbx.
dwrd.at(w) >> 14) & 0b1111111111111111);
587 auto i_0 =
static_cast<int32_t
>(((sfrbx.
dwrd.at(w) >> 6) & 0b11111111) << 24);
588 LOG_DATA(
"{}: [{}] Cis {}, i_0 {}",
nameId(), satId, Cis, std::bitset<32>(
static_cast<uint32_t
>(i_0)));
591 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
592 i_0 |=
static_cast<int32_t
>((sfrbx.
dwrd.at(w) >> 6) & 0b111111111111111111111111);
593 LOG_DATA(
"{}: [{}] i_0 {} ({})",
nameId(), satId, i_0, std::bitset<32>(
static_cast<uint32_t
>(i_0)));
596 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
597 auto Crc =
static_cast<int16_t
>((sfrbx.
dwrd.at(w) >> 14) & 0b1111111111111111);
598 auto omega =
static_cast<int32_t
>(((sfrbx.
dwrd.at(w) >> 6) & 0b11111111) << 24);
599 LOG_DATA(
"{}: [{}] Crc {}, omega {}",
nameId(), satId, Crc, std::bitset<32>(
static_cast<uint32_t
>(omega)));
602 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
603 omega |=
static_cast<int32_t
>((sfrbx.
dwrd.at(w) >> 6) & 0b111111111111111111111111);
604 LOG_DATA(
"{}: [{}] omega {} ({})",
nameId(), satId, omega, std::bitset<32>(
static_cast<uint32_t
>(omega)));
607 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
609 LOG_DATA(
"{}: [{}] Omega_dot {} ({})",
nameId(), satId, Omega_dot, std::bitset<32>(
static_cast<uint32_t
>(Omega_dot)));
612 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
613 auto IODE =
static_cast<uint8_t
>((sfrbx.
dwrd.at(w) >> 22) & 0b11111111);
615 LOG_DATA(
"{}: [{}] IODE {}, i_dot {} ({})",
nameId(), satId, IODE, i_dot, std::bitset<16>(
static_cast<uint16_t
>(i_dot)));
618 if (!ephemerisBuilder.has_value())
620 LOG_DATA(
"{}: [{}] Could not find Ephemeris builder for IODE {}",
nameId(), satId, IODE);
623 auto ephemeris = std::dynamic_pointer_cast<GPSEphemeris>(ephemerisBuilder->get().navData);
625 ephemeris->Cic = Cic * std::pow(2, -29);
627 ephemeris->Cis = Cis * std::pow(2, -29);
629 ephemeris->Crc = Crc * std::pow(2, -5);
632 ephemeris->IODE = IODE;
635 LOG_DATA(
"{}: [{}] Cic [{:.3e} rad], Omega_0 [{:.3e} rad], Cis [{:.3e} rad], i_0 [{:.3e} rad], Crc [{:.3e} m]",
nameId(), satId,
636 ephemeris->Cic, ephemeris->Omega_0, ephemeris->Cis, ephemeris->i_0, ephemeris->Crc);
637 LOG_DATA(
"{}: [{}] omega [{:.3e} rad], Omega_dot [{:.3e} rad/s], IODE [{}], i_dot [{:.3e} rad/s]",
nameId(), satId,
638 ephemeris->omega, ephemeris->Omega_dot, ephemeris->IODE, ephemeris->i_dot);
640 finishSubFrame(ephemeris, subFrameId, ephemerisBuilder->get().subframes);
642 else if (subFrameId == 4)
659 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
660 [[maybe_unused]]
auto dataId =
static_cast<uint8_t
>((sfrbx.
dwrd.at(w) >> 28) & 0b11);
661 auto svId =
static_cast<uint8_t
>((sfrbx.
dwrd.at(w) >> 22) & 0b111111);
662 LOG_DATA(
"{}: [{}] dataId {}, svId {}",
nameId(), satId, dataId, svId);
672 auto alpha0 =
static_cast<int8_t
>((sfrbx.
dwrd.at(w) >> 14) & 0b11111111);
673 auto alpha1 =
static_cast<int8_t
>((sfrbx.
dwrd.at(w) >> 6) & 0b11111111);
674 LOG_DATA(
"{}: [{}] alpha0 {}, alpha1 {}",
nameId(), satId, alpha0, alpha1);
677 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
678 auto alpha2 =
static_cast<int8_t
>((sfrbx.
dwrd.at(w) >> 22) & 0b11111111);
679 auto alpha3 =
static_cast<int8_t
>((sfrbx.
dwrd.at(w) >> 14) & 0b11111111);
680 auto beta0 =
static_cast<int8_t
>((sfrbx.
dwrd.at(w) >> 6) & 0b11111111);
681 LOG_DATA(
"{}: [{}] alpha2 {}, alpha3 {}, beta0 {}",
nameId(), satId, alpha2, alpha3, beta0);
684 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
685 auto beta1 =
static_cast<int8_t
>((sfrbx.
dwrd.at(w) >> 22) & 0b11111111);
686 auto beta2 =
static_cast<int8_t
>((sfrbx.
dwrd.at(w) >> 14) & 0b11111111);
687 auto beta3 =
static_cast<int8_t
>((sfrbx.
dwrd.at(w) >> 6) & 0b11111111);
688 LOG_DATA(
"{}: [{}] beta1 {}, beta2 {}, beta3 {}",
nameId(), satId, beta1, beta2, beta3);
691 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
696 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
697 auto A0 =
static_cast<int32_t
>(((sfrbx.
dwrd.at(w) >> 6) & 0b111111111111111111111111) << 8);
698 LOG_DATA(
"{}: [{}] A0 {}",
nameId(), satId, std::bitset<32>(
static_cast<uint32_t
>(A0)));
701 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
702 A0 |=
static_cast<int32_t
>((sfrbx.
dwrd.at(w) >> 22) & 0b11111111);
703 LOG_DATA(
"{}: [{}] A0 {} ({})",
nameId(), satId, A0, std::bitset<32>(
static_cast<uint32_t
>(A0)));
706 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
709 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
719 ephemerisBuilder.has_value())
721 auto ephemeris = std::dynamic_pointer_cast<GPSEphemeris>(ephemerisBuilder->get().navData);
722 LOG_DEBUG(
"{}: [{}] Received Ionospheric and Time system corrections [{}]",
nameId(), satId.
satSys, ephemeris->refTime.toYMDHMS(
GPST));
732 alpha0 * std::pow(2, -30) ,
733 alpha1 * std::pow(2, -27) ,
734 alpha2 * std::pow(2, -24) ,
735 alpha3 * std::pow(2, -24) ,
739 beta0 * std::pow(2, 11) ,
740 beta1 * std::pow(2, 14) ,
741 beta2 * std::pow(2, 16) ,
742 beta3 * std::pow(2, 16) ,
745 .a0 = A0 * std::pow(2, -30),
746 .a1 = A1 * std::pow(2, -50),
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)));
770 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
773 else if (subFrameId == 5)
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)));
798 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
832 auto even =
static_cast<uint8_t
>((sfrbx.
dwrd.at(w) >> 31) & 0b1);
833 auto pageTypeEven =
static_cast<uint8_t
>((sfrbx.
dwrd.at(w) >> 30) & 0b1);
834 auto odd =
static_cast<uint8_t
>((sfrbx.
dwrd.at(4) >> 31) & 0b1);
835 auto pageTypeOdd =
static_cast<uint8_t
>((sfrbx.
dwrd.at(4) >> 30) & 0b1);
836 auto wordType =
static_cast<uint8_t
>((sfrbx.
dwrd.at(w) >> 24) & 0b111111);
837 LOG_DATA(
"{}: [{}] wordType: {:2}, even {} ({} pageType), odd {} ({} pageType)",
nameId(), satId, wordType, even, pageTypeEven, odd, pageTypeOdd);
839 if (even != 0 || pageTypeEven == 1
840 || odd != 1 || pageTypeOdd == 1)
842 LOG_DATA(
"{}: [{}] Ignoring message, because one of the page types is alert page",
nameId(), satId);
848 auto finishWord = [&]<
size_t N>(
const std::shared_ptr<SatNavData>& ephemeris,
size_t wordType, std::bitset<N>& subframesFound) {
849 if (1 <= wordType && wordType <= 5)
851 subframesFound.set(wordType - 1);
853 LOG_DATA(
"{}: [{}] subframesFound: {}",
nameId(), satId, subframesFound);
854 if (subframesFound.count() == 5)
856 LOG_DATA(
"{}: [{}] [{}] All words found. Updating gnnsNavInfo",
nameId(), satId, ephemeris->refTime.toYMDHMS(
GPST));
857 if (!
_gnssNavInfo.searchNavigationData(satId, ephemeris->refTime))
859 LOG_DEBUG(
"{}: Adding new ephemeris data [{}] [{}]",
nameId(), satId, ephemeris->refTime.toYMDHMS(
GPST));
884 LOG_DATA(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
885 auto IODnav =
static_cast<uint16_t
>((sfrbx.
dwrd.at(w) >> 14) & 0b1111111111);
886 auto toe =
static_cast<uint16_t
>(sfrbx.
dwrd.at(w) & 0b11111111111111);
887 LOG_DATA(
"{}: [{}] IODnav {}, toe {}",
nameId(), satId, IODnav, toe);
890 LOG_DATA(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
891 auto M_0 =
static_cast<int32_t
>(sfrbx.
dwrd.at(w));
895 LOG_DATA(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
896 uint32_t e = sfrbx.
dwrd.at(w);
900 LOG_DATA(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
901 uint32_t sqrt_A = ((sfrbx.
dwrd.at(w) >> 14) & 0b111111111111111111) << 14;
902 LOG_DATA(
"{}: [{}] sqrt_A {}",
nameId(), satId, std::bitset<32>(sqrt_A));
905 LOG_DATA(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
906 sqrt_A |= (sfrbx.
dwrd.at(w) >> 16) & 0b11111111111111;
907 LOG_DATA(
"{}: [{}] sqrt_A {} ({})",
nameId(), satId, sqrt_A, std::bitset<32>(sqrt_A));
909 InsTime insTimeToe(gpsWeekToW.gpsCycle, gpsWeekToW.gpsWeek, toe * 60.0,
GST);
912 auto ephemeris = std::dynamic_pointer_cast<GalileoEphemeris>(ephemerisBuilder.navData);
913 ephemeris->toe = insTimeToe;
915 ephemeris->IODnav = IODnav;
917 ephemeris->e = e * std::pow(2.0, -33);
918 ephemeris->sqrt_A = sqrt_A * std::pow(2.0, -19);
920 LOG_DATA(
"{}: [{}] IODnav [{}], toe [{}], M_0 [{:.3e} rad], e [{:.3e}], sqrt_A [{:.3e} m^(1/2)]",
nameId(), satId,
921 ephemeris->IODnav, ephemeris->toe.toYMDHMS(
GPST), ephemeris->M_0, ephemeris->e, ephemeris->sqrt_A);
923 finishWord(ephemeris, wordType, ephemerisBuilder.subframes);
925 else if (wordType == 2)
937 LOG_DATA(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
938 auto IODnav =
static_cast<uint16_t
>((sfrbx.
dwrd.at(w) >> 14) & 0b1111111111);
939 auto Omega_0 =
static_cast<int32_t
>((sfrbx.
dwrd.at(w) & 0b11111111111111) << 18);
940 LOG_DATA(
"{}: [{}] IODnav {}, Omega_0 {}",
nameId(), satId, IODnav, std::bitset<32>(
static_cast<uint32_t
>(Omega_0)));
943 LOG_DATA(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
944 Omega_0 |=
static_cast<int32_t
>((sfrbx.
dwrd.at(w) >> 14) & 0b111111111111111111);
945 auto i_0 =
static_cast<int32_t
>((sfrbx.
dwrd.at(w) & 0b11111111111111) << 18);
946 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)));
949 LOG_DATA(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
950 i_0 |=
static_cast<int32_t
>((sfrbx.
dwrd.at(w) >> 14) & 0b111111111111111111);
951 auto omega =
static_cast<int32_t
>((sfrbx.
dwrd.at(w) & 0b11111111111111) << 18);
952 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)));
955 LOG_DATA(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
956 omega |=
static_cast<int32_t
>((sfrbx.
dwrd.at(w) >> 14) & 0b111111111111111111);
957 LOG_DATA(
"{}: [{}] omega {} ({})",
nameId(), satId, omega, std::bitset<32>(
static_cast<uint32_t
>(omega)));
960 LOG_DATA(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
962 LOG_DATA(
"{}: [{}] i_dot {} ({})",
nameId(), satId, i_dot, std::bitset<16>(
static_cast<uint16_t
>(i_dot)));
965 if (!ephemerisBuilder.has_value())
967 LOG_DATA(
"{}: [{}] Could not find Ephemeris builder for IODnav {}",
nameId(), satId, IODnav);
970 auto ephemeris = std::dynamic_pointer_cast<GalileoEphemeris>(ephemerisBuilder->get().navData);
977 LOG_DATA(
"{}: [{}] IODnav [{}], Omega_0 [{} rad], i_0 [{:.3e} rad], omega [{:.3e} rad], i_dot [{:.3e} rad/s]",
nameId(), satId,
978 ephemeris->IODnav, ephemeris->Omega_0, ephemeris->i_0, ephemeris->omega, ephemeris->i_dot);
980 finishWord(ephemeris, wordType, ephemerisBuilder->get().subframes);
982 else if (wordType == 3)
994 LOG_DATA(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
995 auto IODnav =
static_cast<uint16_t
>((sfrbx.
dwrd.at(w) >> 14) & 0b1111111111);
996 auto Omega_dot =
static_cast<int32_t
>((sfrbx.
dwrd.at(w) & 0b11111111111111) << 10);
997 LOG_DATA(
"{}: [{}] IODnav {}, Omega_dot {}",
nameId(), satId, IODnav, std::bitset<32>(
static_cast<uint32_t
>(Omega_dot)));
1000 LOG_DATA(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
1001 Omega_dot |=
static_cast<int32_t
>((sfrbx.
dwrd.at(w) >> 22) & 0b1111111111);
1003 auto delta_n =
static_cast<int16_t
>((sfrbx.
dwrd.at(w) >> 6) & 0b1111111111111111);
1004 auto Cuc =
static_cast<int16_t
>((sfrbx.
dwrd.at(w) & 0b111111) << 10);
1005 LOG_DATA(
"{}: [{}] Omega_dot {} ({}), delta_n {}, Cuc {}",
nameId(), satId,
1006 Omega_dot, std::bitset<32>(
static_cast<uint32_t
>(Omega_dot)), delta_n, std::bitset<16>(
static_cast<uint16_t
>(Cuc)));
1009 LOG_DATA(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
1010 Cuc |=
static_cast<int16_t
>((sfrbx.
dwrd.at(w) >> 22) & 0b1111111111);
1011 auto Cus =
static_cast<int16_t
>((sfrbx.
dwrd.at(w) >> 6) & 0b1111111111111111);
1012 auto Crc =
static_cast<int16_t
>((sfrbx.
dwrd.at(w) & 0b111111) << 10);
1013 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)));
1016 LOG_DATA(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
1017 Crc |=
static_cast<int16_t
>((sfrbx.
dwrd.at(w) >> 22) & 0b1111111111);
1018 auto Crs =
static_cast<int16_t
>(((sfrbx.
dwrd.at(w) >> 14) & 0b11111111) << 8);
1019 LOG_DATA(
"{}: [{}] Crc {} ({}), Crs {}",
nameId(), satId, Crc, std::bitset<16>(
static_cast<uint16_t
>(Crc)), std::bitset<16>(
static_cast<uint16_t
>(Crs)));
1022 LOG_DATA(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
1023 Crs |=
static_cast<int16_t
>((sfrbx.
dwrd.at(w) >> 22) & 0b11111111);
1024 auto SISA =
static_cast<uint8_t
>((sfrbx.
dwrd.at(w) >> 14) & 0b11111111);
1025 LOG_DATA(
"{}: [{}] Crs {} ({}), SISA {}",
nameId(), satId, Crs, std::bitset<16>(
static_cast<uint16_t
>(Crs)), SISA);
1028 if (!ephemerisBuilder.has_value())
1030 LOG_DATA(
"{}: [{}] Could not find Ephemeris builder for IODnav {}",
nameId(), satId, IODnav);
1033 auto ephemeris = std::dynamic_pointer_cast<GalileoEphemeris>(ephemerisBuilder->get().navData);
1035 ephemeris->Omega_dot =
semicircles2rad(Omega_dot * std::pow(2.0, -43));
1037 ephemeris->Cuc = Cuc * std::pow(2.0, -29);
1038 ephemeris->Cus = Cus * std::pow(2.0, -29);
1039 ephemeris->Crc = Crc * std::pow(2.0, -5);
1040 ephemeris->Crs = Crs * std::pow(2.0, -5);
1043 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,
1044 ephemeris->IODnav, ephemeris->Omega_dot, ephemeris->delta_n, ephemeris->Cuc, ephemeris->Cus, ephemeris->Crc, ephemeris->Crs, ephemeris->signalAccuracy);
1046 finishWord(ephemeris, wordType, ephemerisBuilder->get().subframes);
1048 else if (wordType == 4)
1061 LOG_DATA(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
1062 auto IODnav =
static_cast<uint16_t
>((sfrbx.
dwrd.at(w) >> 14) & 0b1111111111);
1063 [[maybe_unused]]
auto SVID =
static_cast<uint8_t
>((sfrbx.
dwrd.at(w) >> 8) & 0b111111);
1064 auto Cic =
static_cast<int16_t
>((sfrbx.
dwrd.at(w) & 0b11111111) << 8);
1065 LOG_DATA(
"{}: [{}] IODnav {}, SVID {}, Cic {}",
nameId(), satId, IODnav, SVID, std::bitset<16>(
static_cast<uint16_t
>(Cic)));
1068 LOG_DATA(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
1069 Cic |=
static_cast<int16_t
>((sfrbx.
dwrd.at(w) >> 24) & 0b11111111);
1070 auto Cis =
static_cast<int16_t
>((sfrbx.
dwrd.at(w) >> 8) & 0b1111111111111111);
1071 auto toc =
static_cast<uint16_t
>((sfrbx.
dwrd.at(w) & 0b11111111) << 6);
1072 LOG_DATA(
"{}: [{}] Cic {} ({}), Cis {}, toc {}",
nameId(), satId, Cic, std::bitset<16>(
static_cast<uint16_t
>(Cic)), Cis, std::bitset<16>(toc));
1075 LOG_DATA(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
1076 toc |=
static_cast<uint16_t
>((sfrbx.
dwrd.at(w) >> 26) & 0b111111);
1077 auto af0 =
static_cast<int32_t
>((sfrbx.
dwrd.at(w) & 0b11111111111111111111111111) << 5);
1078 LOG_DATA(
"{}: [{}] toc {} ({}), af0 {}",
nameId(), satId, toc, std::bitset<16>(toc), std::bitset<32>(
static_cast<uint32_t
>(af0)));
1081 LOG_DATA(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
1082 af0 |=
static_cast<int32_t
>((sfrbx.
dwrd.at(w) >> 27) & 0b11111);
1084 auto af1 =
static_cast<int32_t
>(((sfrbx.
dwrd.at(w) >> 14) & 0b1111111111111) << 8);
1085 LOG_DATA(
"{}: [{}] af0 {} ({}), af1 {}",
nameId(), satId, af0, std::bitset<32>(
static_cast<uint32_t
>(af0)), std::bitset<32>(
static_cast<uint32_t
>(af1)));
1088 LOG_DATA(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
1089 af1 |=
static_cast<int32_t
>((sfrbx.
dwrd.at(w) >> 22) & 0b11111111);
1092 LOG_DATA(
"{}: [{}] af1 {} ({}), af1 {}",
nameId(), satId, af1, std::bitset<32>(
static_cast<uint32_t
>(af1)), std::bitset<8>(
static_cast<uint8_t
>(af2)));
1095 if (!ephemerisBuilder.has_value())
1097 LOG_DATA(
"{}: [{}] Could not find Ephemeris builder for IODnav {}",
nameId(), satId, IODnav);
1100 auto ephemeris = std::dynamic_pointer_cast<GalileoEphemeris>(ephemerisBuilder->get().navData);
1102 InsTime insTimeToc(gpsWeekToW.gpsCycle, gpsWeekToW.gpsWeek, toc * 60.0,
GST);
1104 ephemeris->Cic = Cic * std::pow(2.0, -29);
1105 ephemeris->Cis = Cis * std::pow(2.0, -29);
1106 ephemeris->toc = insTimeToc;
1107 ephemeris->refTime = ephemeris->toc;
1109 af0 * std::pow(2, -34),
1110 af1 * std::pow(2, -46),
1111 af2 * std::pow(2, -59),
1114 LOG_DATA(
"{}: [{}] IODnav [{}], Cic [{:.3e} rad], Cis [{:.3e} rad]",
nameId(), satId, ephemeris->IODnav, ephemeris->Cic, ephemeris->Cis);
1115 LOG_DATA(
"{}: [{}] toc [{}], a0 [{:.3e} s], a1 [{:.3e} s/s], a2 [{:.3e} s/s^2]",
nameId(), satId,
1116 ephemeris->toc.toYMDHMS(
GPST), ephemeris->a[0], ephemeris->a[1], ephemeris->a[2]);
1118 finishWord(ephemeris, wordType, ephemerisBuilder->get().subframes);
1120 else if (wordType == 5)
1133 LOG_DATA(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
1134 auto ai0 =
static_cast<uint16_t
>((sfrbx.
dwrd.at(w) >> 13) & 0b11111111111);
1136 auto ai2 =
static_cast<int16_t
>((sfrbx.
dwrd.at(w) & 0b11) << 12);
1137 LOG_DATA(
"{}: [{}] ai0 {} ({}), ai1 {} ({}), ai2 {}",
nameId(), satId,
1138 ai0, std::bitset<16>(ai0), ai1, std::bitset<16>(
static_cast<uint16_t
>(ai1)), std::bitset<16>(
static_cast<uint16_t
>(ai2)));
1141 LOG_DATA(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
1142 ai2 |=
static_cast<int16_t
>((sfrbx.
dwrd.at(w) >> 20) & 0b111111111111);
1145 auto BGD_E1_E5b =
static_cast<int16_t
>((sfrbx.
dwrd.at(w) & 0b11111) << 5);
1146 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)));
1149 LOG_DATA(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
1150 BGD_E1_E5b |=
static_cast<int16_t
>((sfrbx.
dwrd.at(w) >> 27) & 0b11111);
1152 auto E5b_HS =
static_cast<uint8_t
>((sfrbx.
dwrd.at(w) >> 25) & 0b11);
1153 auto E1b_HS =
static_cast<uint8_t
>((sfrbx.
dwrd.at(w) >> 23) & 0b11);
1154 auto E5b_DVS =
static_cast<uint8_t
>((sfrbx.
dwrd.at(w) >> 22) & 0b1);
1155 auto E1b_DVS =
static_cast<uint8_t
>((sfrbx.
dwrd.at(w) >> 21) & 0b1);
1156 [[maybe_unused]]
auto WN =
static_cast<uint16_t
>((sfrbx.
dwrd.at(w) >> 9) & 0b111111111111);
1157 [[maybe_unused]] uint32_t TOW = (sfrbx.
dwrd.at(w) & 0b111111111) << 11;
1158 LOG_DATA(
"{}: [{}] BGD_E1_E5b {} ({}), E5b_HS {}, E1b_HS {}, E5b_DVS {}, E1b_DVS {}, WN {}, TOW {}",
nameId(), satId,
1159 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));
1162 LOG_DATA(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
1163 TOW |= (sfrbx.
dwrd.at(w) >> 21) & 0b11111111111;
1164 LOG_DATA(
"{}: [{}] TOW {} ({})",
nameId(), satId, TOW, std::bitset<32>(TOW));
1167 LOG_DATA(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
1170 if (!ephemerisBuilder.has_value())
1172 LOG_DATA(
"{}: [{}] Could not find any ephemeris builder",
nameId(), satId);
1175 auto ephemeris = std::dynamic_pointer_cast<GalileoEphemeris>(ephemerisBuilder->get().navData);
1177 ephemeris->BGD_E1_E5a = BGD_E1_E5a * std::pow(2.0, -32);
1178 ephemeris->BGD_E1_E5b = BGD_E1_E5b * std::pow(2.0, -32);
1179 ephemeris->svHealth = {
1180 .E5a_DataValidityStatus = {},
1183 .E5a_SignalHealthStatus = {},
1187 ephemeris->dataSource[0] =
true;
1188 ephemeris->dataSource[9] =
true;
1205 ai0 * std::pow(2.0, -2) ,
1206 ai1 * std::pow(2.0, -8) ,
1207 ai2 * std::pow(2.0, -15) ,
1212 LOG_DATA(
"{}: [{}] BGD_E1_E5a [{:.3e} s], BGD_E1_E5b [{:.3e} rad]",
nameId(), satId, ephemeris->BGD_E1_E5a, ephemeris->BGD_E1_E5b);
1214 finishWord(ephemeris, wordType, ephemerisBuilder->get().subframes);
1216 else if (wordType == 6)
1228 LOG_DATA(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
1229 auto A0 =
static_cast<int32_t
>((sfrbx.
dwrd.at(w) & 0b111111111111111111111111) << 8);
1230 LOG_DATA(
"{}: [{}] A0 {}",
nameId(), satId, std::bitset<32>(
static_cast<uint32_t
>(A0)));
1233 LOG_DATA(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
1234 A0 |=
static_cast<int32_t
>((sfrbx.
dwrd.at(w) >> 24) & 0b11111111);
1236 LOG_DATA(
"{}: [{}] A0 {} ({}), A1 {} ({})",
nameId(), satId, A0, std::bitset<32>(
static_cast<uint32_t
>(A0)), A1, std::bitset<32>(
static_cast<uint32_t
>(A1)));
1239 LOG_DATA(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
1242 LOG_DATA(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
1245 LOG_DATA(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
1257 ephemerisBuilder.has_value())
1259 auto ephemeris = std::dynamic_pointer_cast<GalileoEphemeris>(ephemerisBuilder->get().navData);
1269 .a0 = A0 * std::pow(2, -30),
1270 .a1 = A1 * std::pow(2, -50),