61 lines
2.4 KiB
Python
61 lines
2.4 KiB
Python
from __future__ import annotations
|
|
|
|
from galileo_rx.navigation.inav_ephemeris_assembler import InavEphemerisAssembler
|
|
from galileo_rx.navigation.inav_word_parser import (
|
|
EphemerisClockWord4, EphemerisWord1, EphemerisWord2, EphemerisWord3,
|
|
IonosphereHealthTimeWord5, ParsedInavWord,
|
|
)
|
|
|
|
|
|
def _word(prn: int, kind: int, iod: int, timestamp: int) -> ParsedInavWord:
|
|
if kind == 1:
|
|
payload = EphemerisWord1(iod, 1, 60.0, 1, 0.1, 1, 0.01, 1, 5000.0)
|
|
elif kind == 2:
|
|
payload = EphemerisWord2(iod, 1, 0.2, 1, 0.3, 1, 0.4, 1, 0.01)
|
|
elif kind == 3:
|
|
payload = EphemerisWord3(iod, 1, 0.01, 1, 0.01, 1, 0.01, 1, 0.01, 1, 1.0, 1, 1.0, 10)
|
|
else:
|
|
payload = EphemerisClockWord4(iod, prn, 1, 0.01, 1, 0.01, 1, 60.0, 1, 0.1, 1, 0.01, 1, 0.001)
|
|
return ParsedInavWord(prn, kind, timestamp, iod, payload, [], True, True)
|
|
|
|
|
|
def _health(prn: int) -> ParsedInavWord:
|
|
payload = IonosphereHealthTimeWord5(0, 0.0, 0, 0.0, 0, 0.0, (False,) * 5, 0, 0.0, 0, 0.0, 0, 0, 0, 0, 10, 20)
|
|
return ParsedInavWord(prn, 5, 0, None, payload, [], True, True)
|
|
|
|
|
|
def test_assembler_rejects_mixed_iod_and_commits_atomically() -> None:
|
|
assembler = InavEphemerisAssembler(3)
|
|
assembler.update(_health(3))
|
|
for kind in (1, 2, 3):
|
|
assert assembler.update(_word(3, kind, 5, kind)) is None
|
|
assert assembler.update(_word(3, 4, 6, 4)) is None
|
|
assert assembler.current is None
|
|
complete = assembler.update(_word(3, 4, 5, 5))
|
|
assert complete is not None and complete.iod_nav == 5
|
|
assert complete.health_valid and complete.data_valid
|
|
assert assembler.missing_word_types() == set()
|
|
|
|
|
|
def test_previous_ephemeris_survives_incomplete_update() -> None:
|
|
assembler = InavEphemerisAssembler(3)
|
|
assembler.update(_health(3))
|
|
for kind in (1, 2, 3, 4):
|
|
assembler.update(_word(3, kind, 5, kind))
|
|
current = assembler.current
|
|
assembler.update(_word(3, 1, 6, 10))
|
|
assert assembler.current is current
|
|
|
|
|
|
def test_stale_partial_set_is_expired_without_replacing_valid_ephemeris() -> None:
|
|
assembler = InavEphemerisAssembler(3, max_partial_age_samples=10)
|
|
assembler.update(_health(3))
|
|
for kind in (1, 2, 3, 4):
|
|
assembler.update(_word(3, kind, 5, kind))
|
|
current = assembler.current
|
|
assembler.update(_word(3, 1, 6, 20))
|
|
assembler.update(_word(3, 2, 7, 40))
|
|
assert assembler.stale_partial_sets == 1
|
|
assert assembler.current is current
|
|
assert assembler.missing_word_types() == set()
|