268 LOG_DATA(
"{}: [{}] tlm: {} {}",
nameId(), satId, std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
269 constexpr uint8_t TLM_PREAMBLE = 0b10001011;
270 if (
static_cast<uint8_t
>((sfrbx.
dwrd.at(w) >> 22) & 0b11111111) != TLM_PREAMBLE)
272 LOG_DEBUG(
"{}: [{}] Wrong telemetry word preamble. Ignoring SFRBX message.",
nameId(), satId);
283 LOG_DATA(
"{}: [{}] how: {} {}",
nameId(), satId, std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
284 auto subFrameId =
static_cast<uint8_t
>((sfrbx.
dwrd.at(w) >> 8) & 0b111);
287 if (subFrameId == 0 || subFrameId > 5)
289 LOG_ERROR(
"{}: [{}] The subFrameId has to be in the range [1..=5] but it is {}",
nameId(), satId, subFrameId);
295 auto finishSubFrame = [&]<
size_t N>(
const std::shared_ptr<SatNavData>& ephemeris,
size_t subFrameId, std::bitset<N>& subframesFound) {
296 if (1 <= subFrameId && subFrameId <= 3)
298 subframesFound.set(subFrameId - 1);
300 LOG_DATA(
"{}: [{}] subframesFound: {}",
nameId(), satId, subframesFound);
301 if (subframesFound.count() == 3)
303 LOG_DATA(
"{}: [{}] [{}] All subframes found. Updating gnnsNavInfo",
nameId(), satId, ephemeris->refTime.toYMDHMS(
GPST));
324 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
325 [[maybe_unused]]
auto WN =
static_cast<uint16_t
>((sfrbx.
dwrd.at(w) >> 20) & 0b1111111111);
326 auto L2ChannelCodes =
static_cast<uint8_t
>((sfrbx.
dwrd.at(w) >> 18) & 0b11);
327 auto uraIndex =
static_cast<uint8_t
>((sfrbx.
dwrd.at(w) >> 14) & 0b1111);
328 auto svHealth =
static_cast<uint8_t
>((sfrbx.
dwrd.at(w) >> 8) & 0b111111);
329 auto IODC =
static_cast<uint16_t
>(((sfrbx.
dwrd.at(w) >> 6) & 0b11) << 8);
330 LOG_DATA(
"{}: [{}] WN {}, L2ChannelCodes {}, uraIndex {}, svHealth {}, IODC {}",
nameId(), satId, WN, L2ChannelCodes, uraIndex, svHealth, std::bitset<10>(IODC));
333 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
334 auto L2DataFlagPCode =
static_cast<uint8_t
>((sfrbx.
dwrd.at(w) >> 29) & 0b1);
335 LOG_DATA(
"{}: [{}] L2DataFlagPCode {}",
nameId(), satId, L2DataFlagPCode);
338 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
341 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
344 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
345 auto T_GD =
static_cast<int8_t
>((sfrbx.
dwrd.at(w) >> 6) & 0b11111111);
349 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
350 IODC |=
static_cast<uint16_t
>((sfrbx.
dwrd.at(w) >> 22) & 0b11111111);
351 auto toc =
static_cast<uint16_t
>((sfrbx.
dwrd.at(w) >> 6) & 0b1111111111111111);
352 LOG_DATA(
"{}: [{}] IODC {} ({}), toc {}",
nameId(), satId, IODC, std::bitset<10>(IODC), toc);
355 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
356 auto af2 =
static_cast<int8_t
>((sfrbx.
dwrd.at(w) >> 22) & 0b11111111);
357 auto af1 =
static_cast<int16_t
>((sfrbx.
dwrd.at(w) >> 6) & 0b1111111111111111);
361 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
365 InsTime insTimeToc(gpsWeekToW.gpsCycle, gpsWeekToW.gpsWeek, toc * std::pow(2, 4),
GPST);
368 auto ephemeris = std::dynamic_pointer_cast<GPSEphemeris>(ephemerisBuilder.navData);
369 ephemeris->toc = insTimeToc;
371 ephemeris->L2ChannelCodes = L2ChannelCodes;
373 ephemeris->svHealth = svHealth;
374 ephemeris->IODC = IODC;
375 ephemeris->L2DataFlagPCode = L2DataFlagPCode;
376 ephemeris->T_GD = T_GD * std::pow(2, -31);
377 ephemeris->refTime = ephemeris->toc;
379 af0 * std::pow(2, -31),
380 af1 * std::pow(2, -43),
381 af2 * std::pow(2, -55),
383 LOG_DATA(
"{}: [{}] svAccuracy [{} m], svHealth [{}], IODC [{}], tgd [{:.3e} s]",
nameId(), satId,
384 ephemeris->svAccuracy, ephemeris->svHealth, ephemeris->IODC, ephemeris->T_GD);
385 LOG_DATA(
"{}: [{}] toc [{}], a0 [{:.3e} s], a1 [{:.3e} s/s], a2 [{:.3e} s/s^2]",
nameId(), satId,
386 ephemeris->toc.toYMDHMS(
GPST), ephemeris->a[0], ephemeris->a[1], ephemeris->a[2]);
388 finishSubFrame(ephemeris, subFrameId, ephemerisBuilder.subframes);
390 else if (subFrameId == 2)
399 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
400 auto IODE =
static_cast<uint8_t
>((sfrbx.
dwrd.at(w) >> 22) & 0b11111111);
401 auto Crs =
static_cast<int16_t
>((sfrbx.
dwrd.at(w) >> 6) & 0b1111111111111111);
405 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
406 auto delta_n =
static_cast<int16_t
>((sfrbx.
dwrd.at(w) >> 14) & 0b1111111111111111);
407 auto M_0 =
static_cast<int32_t
>(((sfrbx.
dwrd.at(w) >> 6) & 0b11111111) << 24);
408 LOG_DATA(
"{}: [{}] delta_n {}, M_0 {}",
nameId(), satId, delta_n, std::bitset<32>(
static_cast<uint32_t
>(M_0)));
411 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
412 M_0 |=
static_cast<int32_t
>((sfrbx.
dwrd.at(w) >> 6) & 0b111111111111111111111111);
413 LOG_DATA(
"{}: [{}] M_0 {} ({})",
nameId(), satId, M_0, std::bitset<32>(
static_cast<uint32_t
>(M_0)));
416 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
417 auto Cuc =
static_cast<int16_t
>((sfrbx.
dwrd.at(w) >> 14) & 0b1111111111111111);
418 uint32_t e = ((sfrbx.
dwrd.at(w) >> 6) & 0b11111111) << 24;
419 LOG_DATA(
"{}: [{}] Cuc {}, e {}",
nameId(), satId, Cuc, std::bitset<32>(e));
422 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
423 e |= (sfrbx.
dwrd.at(w) >> 6) & 0b111111111111111111111111;
424 LOG_DATA(
"{}: [{}] e {} ({})",
nameId(), satId, e, std::bitset<32>(e));
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 Cus =
static_cast<int16_t
>((sfrbx.
dwrd.at(w) >> 14) & 0b1111111111111111);
429 uint32_t sqrt_A = ((sfrbx.
dwrd.at(w) >> 6) & 0b11111111) << 24;
430 LOG_DATA(
"{}: [{}] Cus {}, sqrt_A {}",
nameId(), satId, Cus, std::bitset<32>(sqrt_A));
433 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
434 sqrt_A |= (sfrbx.
dwrd.at(w) >> 6) & 0b111111111111111111111111;
435 LOG_DATA(
"{}: [{}] sqrt_A {} ({})",
nameId(), satId, sqrt_A, std::bitset<32>(sqrt_A));
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 toe =
static_cast<uint16_t
>((sfrbx.
dwrd.at(w) >> 14) & 0b1111111111111111);
440 auto fitInterval =
static_cast<bool>((sfrbx.
dwrd.at(w) >> 13) & 0b1);
441 [[maybe_unused]]
auto AODO =
static_cast<uint8_t
>((sfrbx.
dwrd.at(w) >> 8) & 0b11111);
442 LOG_DATA(
"{}: [{}] toe {}, fitInterval {}, AODO {}",
nameId(), satId, toe, fitInterval, AODO);
444 InsTime insTimeToe(gpsWeekToW.gpsCycle, gpsWeekToW.gpsWeek, toe * std::pow(2, 4),
GPST);
447 auto ephemeris = std::dynamic_pointer_cast<GPSEphemeris>(ephemerisBuilder.navData);
448 ephemeris->toe = insTimeToe;
450 ephemeris->IODE = IODE;
451 ephemeris->Crs = Crs * std::pow(2, -5);
454 ephemeris->Cuc = Cuc * std::pow(2, -29);
455 ephemeris->e = e * std::pow(2, -33);
456 ephemeris->Cus = Cus * std::pow(2, -29);
457 ephemeris->sqrt_A = sqrt_A * std::pow(2, -19);
458 ephemeris->toe =
InsTime(gpsWeekToW.gpsCycle, gpsWeekToW.gpsWeek, toe * std::pow(2, 4),
GPST);
459 ephemeris->fitInterval = fitInterval ? 8.0 : 4.0;
462 LOG_DATA(
"{}: [{}] IODE [{}], Crs [{:.3e} m], delta_n [{:.3e} rad/s], M_0 [{:.3e} rad], Cuc [{:.3e} rad]",
nameId(), satId,
463 ephemeris->IODE, ephemeris->Crs, ephemeris->delta_n, ephemeris->M_0, ephemeris->Cuc);
464 LOG_DATA(
"{}: [{}] e [{:.3e}], Cus [{:.3e} rad], sqrt_A [{:.3e} m^(1/2)], toe [{}], fitInterval [{:.1f}]",
nameId(), satId,
465 ephemeris->e, ephemeris->Cus, ephemeris->sqrt_A, ephemeris->toe.toGPSweekTow(
GPST), ephemeris->fitInterval);
467 finishSubFrame(ephemeris, subFrameId, ephemerisBuilder.subframes);
469 else if (subFrameId == 3)
478 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
479 auto Cic =
static_cast<int16_t
>((sfrbx.
dwrd.at(w) >> 14) & 0b1111111111111111);
480 auto Omega_0 =
static_cast<int32_t
>(((sfrbx.
dwrd.at(w) >> 6) & 0b11111111) << 24);
481 LOG_DATA(
"{}: [{}] Cic {}, Omega_0 {}",
nameId(), satId, Cic, std::bitset<32>(
static_cast<uint32_t
>(Omega_0)));
484 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
485 Omega_0 |=
static_cast<int32_t
>((sfrbx.
dwrd.at(w) >> 6) & 0b111111111111111111111111);
486 LOG_DATA(
"{}: [{}] Omega_0 {} ({})",
nameId(), satId, Omega_0, std::bitset<32>(
static_cast<uint32_t
>(Omega_0)));
489 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
490 auto Cis =
static_cast<int16_t
>((sfrbx.
dwrd.at(w) >> 14) & 0b1111111111111111);
491 auto i_0 =
static_cast<int32_t
>(((sfrbx.
dwrd.at(w) >> 6) & 0b11111111) << 24);
492 LOG_DATA(
"{}: [{}] Cis {}, i_0 {}",
nameId(), satId, Cis, std::bitset<32>(
static_cast<uint32_t
>(i_0)));
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 i_0 |=
static_cast<int32_t
>((sfrbx.
dwrd.at(w) >> 6) & 0b111111111111111111111111);
497 LOG_DATA(
"{}: [{}] i_0 {} ({})",
nameId(), satId, i_0, std::bitset<32>(
static_cast<uint32_t
>(i_0)));
500 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
501 auto Crc =
static_cast<int16_t
>((sfrbx.
dwrd.at(w) >> 14) & 0b1111111111111111);
502 auto omega =
static_cast<int32_t
>(((sfrbx.
dwrd.at(w) >> 6) & 0b11111111) << 24);
503 LOG_DATA(
"{}: [{}] Crc {}, omega {}",
nameId(), satId, Crc, std::bitset<32>(
static_cast<uint32_t
>(omega)));
506 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
507 omega |=
static_cast<int32_t
>((sfrbx.
dwrd.at(w) >> 6) & 0b111111111111111111111111);
508 LOG_DATA(
"{}: [{}] omega {} ({})",
nameId(), satId, omega, std::bitset<32>(
static_cast<uint32_t
>(omega)));
511 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
513 LOG_DATA(
"{}: [{}] Omega_dot {} ({})",
nameId(), satId, Omega_dot, std::bitset<32>(
static_cast<uint32_t
>(Omega_dot)));
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 auto IODE =
static_cast<uint8_t
>((sfrbx.
dwrd.at(w) >> 22) & 0b11111111);
519 LOG_DATA(
"{}: [{}] IODE {}, i_dot {} ({})",
nameId(), satId, IODE, i_dot, std::bitset<16>(
static_cast<uint16_t
>(i_dot)));
522 if (!ephemerisBuilder.has_value())
524 LOG_WARN(
"{}: [{}] Could not find Ephemeris builder for IODE {}",
nameId(), satId, IODE);
527 auto ephemeris = std::dynamic_pointer_cast<GPSEphemeris>(ephemerisBuilder->get().navData);
529 ephemeris->Cic = Cic * std::pow(2, -29);
531 ephemeris->Cis = Cis * std::pow(2, -29);
533 ephemeris->Crc = Crc * std::pow(2, -5);
536 ephemeris->IODE = IODE;
539 LOG_DATA(
"{}: [{}] Cic [{:.3e} rad], Omega_0 [{:.3e} rad], Cis [{:.3e} rad], i_0 [{:.3e} rad], Crc [{:.3e} m]",
nameId(), satId,
540 ephemeris->Cic, ephemeris->Omega_0, ephemeris->Cis, ephemeris->i_0, ephemeris->Crc);
541 LOG_DATA(
"{}: [{}] omega [{:.3e} rad], Omega_dot [{:.3e} rad/s], IODE [{}], i_dot [{:.3e} rad/s]",
nameId(), satId,
542 ephemeris->omega, ephemeris->Omega_dot, ephemeris->IODE, ephemeris->i_dot);
544 finishSubFrame(ephemeris, subFrameId, ephemerisBuilder->get().subframes);
546 else if (subFrameId == 4)
562 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
563 [[maybe_unused]]
auto dataId =
static_cast<uint8_t
>((sfrbx.
dwrd.at(w) >> 28) & 0b11);
564 auto svId =
static_cast<uint8_t
>((sfrbx.
dwrd.at(w) >> 22) & 0b111111);
565 LOG_DATA(
"{}: [{}] dataId {}, svId {}",
nameId(), satId, dataId, svId);
575 auto alpha0 =
static_cast<int8_t
>((sfrbx.
dwrd.at(w) >> 14) & 0b11111111);
576 auto alpha1 =
static_cast<int8_t
>((sfrbx.
dwrd.at(w) >> 6) & 0b11111111);
577 LOG_DATA(
"{}: [{}] alpha0 {}, alpha1 {}",
nameId(), satId, alpha0, alpha1);
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 auto alpha2 =
static_cast<int8_t
>((sfrbx.
dwrd.at(w) >> 22) & 0b11111111);
582 auto alpha3 =
static_cast<int8_t
>((sfrbx.
dwrd.at(w) >> 14) & 0b11111111);
583 auto beta0 =
static_cast<int8_t
>((sfrbx.
dwrd.at(w) >> 6) & 0b11111111);
584 LOG_DATA(
"{}: [{}] alpha2 {}, alpha3 {}, beta0 {}",
nameId(), satId, alpha2, alpha3, beta0);
587 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
588 auto beta1 =
static_cast<int8_t
>((sfrbx.
dwrd.at(w) >> 22) & 0b11111111);
589 auto beta2 =
static_cast<int8_t
>((sfrbx.
dwrd.at(w) >> 14) & 0b11111111);
590 auto beta3 =
static_cast<int8_t
>((sfrbx.
dwrd.at(w) >> 6) & 0b11111111);
591 LOG_DATA(
"{}: [{}] beta1 {}, beta2 {}, beta3 {}",
nameId(), satId, beta1, beta2, beta3);
594 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
599 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
600 auto A0 =
static_cast<int32_t
>(((sfrbx.
dwrd.at(w) >> 6) & 0b111111111111111111111111) << 8);
601 LOG_DATA(
"{}: [{}] A0 {}",
nameId(), satId, std::bitset<32>(
static_cast<uint32_t
>(A0)));
604 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
605 A0 |=
static_cast<int32_t
>((sfrbx.
dwrd.at(w) >> 22) & 0b11111111);
606 LOG_DATA(
"{}: [{}] A0 {} ({})",
nameId(), satId, A0, std::bitset<32>(
static_cast<uint32_t
>(A0)));
609 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
612 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
622 alpha0 * std::pow(2, -30) ,
623 alpha1 * std::pow(2, -27) ,
624 alpha2 * std::pow(2, -24) ,
625 alpha3 * std::pow(2, -24) ,
629 beta0 * std::pow(2, 11) ,
630 beta1 * std::pow(2, 14) ,
631 beta2 * std::pow(2, 16) ,
632 beta3 * std::pow(2, 16) ,
635 .a0 = A0 * std::pow(2, -30),
636 .a1 = A1 * std::pow(2, -50),
648 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
650 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
652 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
654 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
656 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
658 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
660 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
663 else if (subFrameId == 5)
674 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
676 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
678 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
680 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
682 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
684 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
686 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
688 LOG_DATA(
"{}: [{}] word {:2}: {} {}",
nameId(), satId, w + 1 , std::bitset<2>(sfrbx.
dwrd.at(w) >> 30), std::bitset<30>(sfrbx.
dwrd.at(w)));
722 auto even =
static_cast<uint8_t
>((sfrbx.
dwrd.at(w) >> 31) & 0b1);
723 auto pageTypeEven =
static_cast<uint8_t
>((sfrbx.
dwrd.at(w) >> 30) & 0b1);
724 auto odd =
static_cast<uint8_t
>((sfrbx.
dwrd.at(4) >> 31) & 0b1);
725 auto pageTypeOdd =
static_cast<uint8_t
>((sfrbx.
dwrd.at(4) >> 30) & 0b1);
726 auto wordType =
static_cast<uint8_t
>((sfrbx.
dwrd.at(w) >> 24) & 0b111111);
727 LOG_DEBUG(
"{}: [{}] wordType: {:2}, even {} ({} pageType), odd {} ({} pageType)",
nameId(), satId, wordType, even, pageTypeEven, odd, pageTypeOdd);
729 if (even != 0 || pageTypeEven == 1
730 || odd != 1 || pageTypeOdd == 1)
732 LOG_DEBUG(
"{}: [{}] Ignoring message, because one of the page types is alert page",
nameId(), satId);
738 auto finishWord = [&]<
size_t N>(
const std::shared_ptr<SatNavData>& ephemeris,
size_t wordType, std::bitset<N>& subframesFound) {
739 if (1 <= wordType && wordType <= 5)
741 subframesFound.set(wordType - 1);
743 LOG_DATA(
"{}: [{}] subframesFound: {}",
nameId(), satId, subframesFound);
744 if (subframesFound.count() == 5)
746 LOG_DATA(
"{}: [{}] [{}] All words found. Updating gnnsNavInfo",
nameId(), satId, ephemeris->refTime.toYMDHMS(
GPST));
770 LOG_DEBUG(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
771 auto IODnav =
static_cast<uint16_t
>((sfrbx.
dwrd.at(w) >> 14) & 0b1111111111);
772 auto toe =
static_cast<uint16_t
>(sfrbx.
dwrd.at(w) & 0b11111111111111);
776 LOG_DEBUG(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
777 auto M_0 =
static_cast<int32_t
>(sfrbx.
dwrd.at(w));
781 LOG_DEBUG(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
782 uint32_t e = sfrbx.
dwrd.at(w);
786 LOG_DEBUG(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
787 uint32_t sqrt_A = ((sfrbx.
dwrd.at(w) >> 14) & 0b111111111111111111) << 14;
788 LOG_DEBUG(
"{}: [{}] sqrt_A {}",
nameId(), satId, std::bitset<32>(sqrt_A));
791 LOG_DEBUG(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
792 sqrt_A |= (sfrbx.
dwrd.at(w) >> 16) & 0b11111111111111;
793 LOG_DEBUG(
"{}: [{}] sqrt_A {} ({})",
nameId(), satId, sqrt_A, std::bitset<32>(sqrt_A));
795 InsTime insTimeToe(gpsWeekToW.gpsCycle, gpsWeekToW.gpsWeek, toe * 60.0,
GST);
798 auto ephemeris = std::dynamic_pointer_cast<GalileoEphemeris>(ephemerisBuilder.navData);
799 ephemeris->toe = insTimeToe;
801 ephemeris->IODnav = IODnav;
803 ephemeris->e = e * std::pow(2.0, -33);
804 ephemeris->sqrt_A = sqrt_A * std::pow(2.0, -19);
806 LOG_DEBUG(
"{}: [{}] IODnav [{}], toe [{}], M_0 [{:.3e} rad], e [{:.3e}], sqrt_A [{:.3e} m^(1/2)]",
nameId(), satId,
807 ephemeris->IODnav, ephemeris->toe.toYMDHMS(
GPST), ephemeris->M_0, ephemeris->e, ephemeris->sqrt_A);
809 finishWord(ephemeris, wordType, ephemerisBuilder.subframes);
811 else if (wordType == 2)
823 LOG_DEBUG(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
824 auto IODnav =
static_cast<uint16_t
>((sfrbx.
dwrd.at(w) >> 14) & 0b1111111111);
825 auto Omega_0 =
static_cast<int32_t
>((sfrbx.
dwrd.at(w) & 0b11111111111111) << 18);
826 LOG_DEBUG(
"{}: [{}] IODnav {}, Omega_0 {}",
nameId(), satId, IODnav, std::bitset<32>(
static_cast<uint32_t
>(Omega_0)));
829 LOG_DEBUG(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
830 Omega_0 |=
static_cast<int32_t
>((sfrbx.
dwrd.at(w) >> 14) & 0b111111111111111111);
831 auto i_0 =
static_cast<int32_t
>((sfrbx.
dwrd.at(w) & 0b11111111111111) << 18);
832 LOG_DEBUG(
"{}: [{}] 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)));
835 LOG_DEBUG(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
836 i_0 |=
static_cast<int32_t
>((sfrbx.
dwrd.at(w) >> 14) & 0b111111111111111111);
837 auto omega =
static_cast<int32_t
>((sfrbx.
dwrd.at(w) & 0b11111111111111) << 18);
838 LOG_DEBUG(
"{}: [{}] i_0 {} ({}), omega {}",
nameId(), satId, i_0, std::bitset<32>(
static_cast<uint32_t
>(i_0)), std::bitset<32>(
static_cast<uint32_t
>(omega)));
841 LOG_DEBUG(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
842 omega |=
static_cast<int32_t
>((sfrbx.
dwrd.at(w) >> 14) & 0b111111111111111111);
843 LOG_DEBUG(
"{}: [{}] omega {} ({})",
nameId(), satId, omega, std::bitset<32>(
static_cast<uint32_t
>(omega)));
846 LOG_DEBUG(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
848 LOG_DEBUG(
"{}: [{}] i_dot {} ({})",
nameId(), satId, i_dot, std::bitset<16>(
static_cast<uint16_t
>(i_dot)));
851 if (!ephemerisBuilder.has_value())
853 LOG_WARN(
"{}: [{}] Could not find Ephemeris builder for IODnav {}",
nameId(), satId, IODnav);
856 auto ephemeris = std::dynamic_pointer_cast<GalileoEphemeris>(ephemerisBuilder->get().navData);
863 LOG_DEBUG(
"{}: [{}] IODnav [{}], Omega_0 [{} rad], i_0 [{:.3e} rad], omega [{:.3e} rad], i_dot [{:.3e} rad/s]",
nameId(), satId,
864 ephemeris->IODnav, ephemeris->Omega_0, ephemeris->i_0, ephemeris->omega, ephemeris->i_dot);
866 finishWord(ephemeris, wordType, ephemerisBuilder->get().subframes);
868 else if (wordType == 3)
880 LOG_DEBUG(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
881 auto IODnav =
static_cast<uint16_t
>((sfrbx.
dwrd.at(w) >> 14) & 0b1111111111);
882 auto Omega_dot =
static_cast<int32_t
>((sfrbx.
dwrd.at(w) & 0b11111111111111) << 10);
883 LOG_DEBUG(
"{}: [{}] IODnav {}, Omega_dot {}",
nameId(), satId, IODnav, std::bitset<32>(
static_cast<uint32_t
>(Omega_dot)));
886 LOG_DEBUG(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
887 Omega_dot |=
static_cast<int32_t
>((sfrbx.
dwrd.at(w) >> 22) & 0b1111111111);
889 auto delta_n =
static_cast<int16_t
>((sfrbx.
dwrd.at(w) >> 6) & 0b1111111111111111);
890 auto Cuc =
static_cast<int16_t
>((sfrbx.
dwrd.at(w) & 0b111111) << 10);
891 LOG_DEBUG(
"{}: [{}] Omega_dot {} ({}), delta_n {}, Cuc {}",
nameId(), satId,
892 Omega_dot, std::bitset<32>(
static_cast<uint32_t
>(Omega_dot)), delta_n, std::bitset<16>(
static_cast<uint16_t
>(Cuc)));
895 LOG_DEBUG(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
896 Cuc |=
static_cast<int16_t
>((sfrbx.
dwrd.at(w) >> 22) & 0b1111111111);
897 auto Cus =
static_cast<int16_t
>((sfrbx.
dwrd.at(w) >> 6) & 0b1111111111111111);
898 auto Crc =
static_cast<int16_t
>((sfrbx.
dwrd.at(w) & 0b111111) << 10);
899 LOG_DEBUG(
"{}: [{}] Cuc {} ({}), Cus {}, Crc {}",
nameId(), satId, Cuc, std::bitset<16>(
static_cast<uint16_t
>(Cuc)), Cus, std::bitset<16>(
static_cast<uint16_t
>(Crc)));
902 LOG_DEBUG(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
903 Crc |=
static_cast<int16_t
>((sfrbx.
dwrd.at(w) >> 22) & 0b1111111111);
904 auto Crs =
static_cast<int16_t
>(((sfrbx.
dwrd.at(w) >> 14) & 0b11111111) << 8);
905 LOG_DEBUG(
"{}: [{}] Crc {} ({}), Crs {}",
nameId(), satId, Crc, std::bitset<16>(
static_cast<uint16_t
>(Crc)), std::bitset<16>(
static_cast<uint16_t
>(Crs)));
908 LOG_DEBUG(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
909 Crs |=
static_cast<int16_t
>((sfrbx.
dwrd.at(w) >> 22) & 0b11111111);
910 auto SISA =
static_cast<uint8_t
>((sfrbx.
dwrd.at(w) >> 14) & 0b11111111);
911 LOG_DEBUG(
"{}: [{}] Crs {} ({}), SISA {}",
nameId(), satId, Crs, std::bitset<16>(
static_cast<uint16_t
>(Crs)), SISA);
914 if (!ephemerisBuilder.has_value())
916 LOG_WARN(
"{}: [{}] Could not find Ephemeris builder for IODnav {}",
nameId(), satId, IODnav);
919 auto ephemeris = std::dynamic_pointer_cast<GalileoEphemeris>(ephemerisBuilder->get().navData);
921 ephemeris->Omega_dot =
semicircles2rad(Omega_dot * std::pow(2.0, -43));
923 ephemeris->Cuc = Cuc * std::pow(2.0, -29);
924 ephemeris->Cus = Cus * std::pow(2.0, -29);
925 ephemeris->Crc = Crc * std::pow(2.0, -5);
926 ephemeris->Crs = Crs * std::pow(2.0, -5);
929 LOG_DEBUG(
"{}: [{}] 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,
930 ephemeris->IODnav, ephemeris->Omega_dot, ephemeris->delta_n, ephemeris->Cuc, ephemeris->Cus, ephemeris->Crc, ephemeris->Crs, ephemeris->signalAccuracy);
932 finishWord(ephemeris, wordType, ephemerisBuilder->get().subframes);
934 else if (wordType == 4)
947 LOG_DEBUG(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
948 auto IODnav =
static_cast<uint16_t
>((sfrbx.
dwrd.at(w) >> 14) & 0b1111111111);
949 [[maybe_unused]]
auto SVID =
static_cast<uint8_t
>((sfrbx.
dwrd.at(w) >> 8) & 0b111111);
950 auto Cic =
static_cast<int16_t
>((sfrbx.
dwrd.at(w) & 0b11111111) << 8);
951 LOG_DEBUG(
"{}: [{}] IODnav {}, SVID {}, Cic {}",
nameId(), satId, IODnav, SVID, std::bitset<16>(
static_cast<uint16_t
>(Cic)));
954 LOG_DEBUG(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
955 Cic |=
static_cast<int16_t
>((sfrbx.
dwrd.at(w) >> 24) & 0b11111111);
956 auto Cis =
static_cast<int16_t
>((sfrbx.
dwrd.at(w) >> 8) & 0b1111111111111111);
957 auto toc =
static_cast<uint16_t
>((sfrbx.
dwrd.at(w) & 0b11111111) << 6);
958 LOG_DEBUG(
"{}: [{}] Cic {} ({}), Cis {}, toc {}",
nameId(), satId, Cic, std::bitset<16>(
static_cast<uint16_t
>(Cic)), Cis, std::bitset<16>(toc));
961 LOG_DEBUG(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
962 toc |=
static_cast<uint16_t
>((sfrbx.
dwrd.at(w) >> 26) & 0b111111);
963 auto af0 =
static_cast<int32_t
>((sfrbx.
dwrd.at(w) & 0b11111111111111111111111111) << 5);
964 LOG_DEBUG(
"{}: [{}] toc {} ({}), af0 {}",
nameId(), satId, toc, std::bitset<16>(toc), std::bitset<32>(
static_cast<uint32_t
>(af0)));
967 LOG_DEBUG(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
968 af0 |=
static_cast<int32_t
>((sfrbx.
dwrd.at(w) >> 27) & 0b11111);
970 auto af1 =
static_cast<int32_t
>(((sfrbx.
dwrd.at(w) >> 14) & 0b1111111111111) << 8);
971 LOG_DEBUG(
"{}: [{}] af0 {} ({}), af1 {}",
nameId(), satId, af0, std::bitset<32>(
static_cast<uint32_t
>(af0)), std::bitset<32>(
static_cast<uint32_t
>(af1)));
974 LOG_DEBUG(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
975 af1 |=
static_cast<int32_t
>((sfrbx.
dwrd.at(w) >> 22) & 0b11111111);
978 LOG_DEBUG(
"{}: [{}] af1 {} ({}), af1 {}",
nameId(), satId, af1, std::bitset<32>(
static_cast<uint32_t
>(af1)), std::bitset<8>(
static_cast<uint8_t
>(af2)));
981 if (!ephemerisBuilder.has_value())
983 LOG_WARN(
"{}: [{}] Could not find Ephemeris builder for IODnav {}",
nameId(), satId, IODnav);
986 auto ephemeris = std::dynamic_pointer_cast<GalileoEphemeris>(ephemerisBuilder->get().navData);
988 InsTime insTimeToc(gpsWeekToW.gpsCycle, gpsWeekToW.gpsWeek, toc * 60.0,
GST);
990 ephemeris->Cic = Cic * std::pow(2.0, -29);
991 ephemeris->Cis = Cis * std::pow(2.0, -29);
992 ephemeris->toc = insTimeToc;
993 ephemeris->refTime = ephemeris->toc;
995 af0 * std::pow(2, -34),
996 af1 * std::pow(2, -46),
997 af2 * std::pow(2, -59),
1000 LOG_DEBUG(
"{}: [{}] IODnav [{}], Cic [{:.3e} rad], Cis [{:.3e} rad]",
nameId(), satId, ephemeris->IODnav, ephemeris->Cic, ephemeris->Cis);
1001 LOG_DEBUG(
"{}: [{}] toc [{}], a0 [{:.3e} s], a1 [{:.3e} s/s], a2 [{:.3e} s/s^2]",
nameId(), satId,
1002 ephemeris->toc.toYMDHMS(
GPST), ephemeris->a[0], ephemeris->a[1], ephemeris->a[2]);
1004 finishWord(ephemeris, wordType, ephemerisBuilder->get().subframes);
1006 else if (wordType == 5)
1019 LOG_DEBUG(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
1020 auto ai0 =
static_cast<uint16_t
>((sfrbx.
dwrd.at(w) >> 13) & 0b11111111111);
1022 auto ai2 =
static_cast<int16_t
>((sfrbx.
dwrd.at(w) & 0b11) << 12);
1023 LOG_DEBUG(
"{}: [{}] ai0 {} ({}), ai1 {} ({}), ai2 {}",
nameId(), satId,
1024 ai0, std::bitset<16>(ai0), ai1, std::bitset<16>(
static_cast<uint16_t
>(ai1)), std::bitset<16>(
static_cast<uint16_t
>(ai2)));
1027 LOG_DEBUG(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
1028 ai2 |=
static_cast<int16_t
>((sfrbx.
dwrd.at(w) >> 20) & 0b111111111111);
1031 auto BGD_E1_E5b =
static_cast<int16_t
>((sfrbx.
dwrd.at(w) & 0b11111) << 5);
1032 LOG_DEBUG(
"{}: [{}] 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)));
1035 LOG_DEBUG(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
1036 BGD_E1_E5b |=
static_cast<int16_t
>((sfrbx.
dwrd.at(w) >> 27) & 0b11111);
1038 auto E5b_HS =
static_cast<uint8_t
>((sfrbx.
dwrd.at(w) >> 25) & 0b11);
1039 auto E1b_HS =
static_cast<uint8_t
>((sfrbx.
dwrd.at(w) >> 23) & 0b11);
1040 auto E5b_DVS =
static_cast<uint8_t
>((sfrbx.
dwrd.at(w) >> 22) & 0b1);
1041 auto E1b_DVS =
static_cast<uint8_t
>((sfrbx.
dwrd.at(w) >> 21) & 0b1);
1042 [[maybe_unused]]
auto WN =
static_cast<uint16_t
>((sfrbx.
dwrd.at(w) >> 9) & 0b111111111111);
1043 [[maybe_unused]] uint32_t TOW = (sfrbx.
dwrd.at(w) & 0b111111111) << 11;
1044 LOG_DEBUG(
"{}: [{}] BGD_E1_E5b {} ({}), E5b_HS {}, E1b_HS {}, E5b_DVS {}, E1b_DVS {}, WN {}, TOW {}",
nameId(), satId,
1045 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));
1048 LOG_DEBUG(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
1049 TOW |= (sfrbx.
dwrd.at(w) >> 21) & 0b11111111111;
1050 LOG_DEBUG(
"{}: [{}] TOW {} ({})",
nameId(), satId, TOW, std::bitset<32>(TOW));
1053 LOG_DEBUG(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
1056 if (!ephemerisBuilder.has_value())
1058 LOG_WARN(
"{}: [{}] Could not find any ephemeris builder",
nameId(), satId);
1061 auto ephemeris = std::dynamic_pointer_cast<GalileoEphemeris>(ephemerisBuilder->get().navData);
1063 ephemeris->BGD_E1_E5a = BGD_E1_E5a * std::pow(2.0, -32);
1064 ephemeris->BGD_E1_E5b = BGD_E1_E5b * std::pow(2.0, -32);
1065 ephemeris->svHealth = {
1066 .E5a_DataValidityStatus = {},
1069 .E5a_SignalHealthStatus = {},
1073 ephemeris->dataSource[0] =
true;
1074 ephemeris->dataSource[9] =
true;
1085 ai0 * std::pow(2.0, -2) ,
1086 ai1 * std::pow(2.0, -8) ,
1087 ai2 * std::pow(2.0, -15) ,
1092 LOG_DEBUG(
"{}: [{}] BGD_E1_E5a [{:.3e} s], BGD_E1_E5b [{:.3e} rad]",
nameId(), satId, ephemeris->BGD_E1_E5a, ephemeris->BGD_E1_E5b);
1094 finishWord(ephemeris, wordType, ephemerisBuilder->get().subframes);
1096 else if (wordType == 6)
1108 LOG_DEBUG(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
1109 auto A0 =
static_cast<int32_t
>((sfrbx.
dwrd.at(w) & 0b111111111111111111111111) << 8);
1110 LOG_DEBUG(
"{}: [{}] A0 {}",
nameId(), satId, std::bitset<32>(
static_cast<uint32_t
>(A0)));
1113 LOG_DEBUG(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
1114 A0 |=
static_cast<int32_t
>((sfrbx.
dwrd.at(w) >> 24) & 0b11111111);
1116 LOG_DEBUG(
"{}: [{}] A0 {} ({}), A1 {} ({})",
nameId(), satId, A0, std::bitset<32>(
static_cast<uint32_t
>(A0)), A1, std::bitset<32>(
static_cast<uint32_t
>(A1)));
1119 LOG_DEBUG(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
1122 LOG_DEBUG(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
1125 LOG_DEBUG(
"{}: [{}] word {:2}: {}",
nameId(), satId, w + 1 , std::bitset<32>(sfrbx.
dwrd.at(w)));
1134 .a0 = A0 * std::pow(2, -30),
1135 .a1 = A1 * std::pow(2, -50),