26 lines
1.0 KiB
Python
26 lines
1.0 KiB
Python
from __future__ import annotations
|
|
|
|
from galileo_rx.navigation.inav_page_decoder import InavPage
|
|
from galileo_rx.navigation.inav_word_parser import EphemerisClockWord4, InavWordParser
|
|
|
|
|
|
def _put(bits: list[int], start: int, width: int, value: int) -> None:
|
|
if value < 0:
|
|
value += 1 << width
|
|
for index in range(width):
|
|
bits[start + index] = (value >> (width - 1 - index)) & 1
|
|
|
|
|
|
def test_word4_signed_scaling_and_units() -> None:
|
|
bits = [0] * 128
|
|
for start, width, value in [(0, 6, 4), (6, 10, 77), (16, 6, 12), (22, 16, -3), (38, 16, 5), (54, 14, 9000), (68, 31, -100), (99, 21, 200), (120, 6, -2)]:
|
|
_put(bits, start, width, value)
|
|
page = InavPage(12, 0, 100, [], [], 4, True, True, True, False, 0.0, 0, bits, 200)
|
|
parsed = InavWordParser().parse(page)
|
|
assert parsed.iod_nav == 77
|
|
assert isinstance(parsed.payload, EphemerisClockWord4)
|
|
assert parsed.payload.svid == 12
|
|
assert parsed.payload.cic_raw == -3
|
|
assert parsed.payload.toc_s == 540000.0
|
|
assert parsed.payload.clock_bias_s == -100 * 2.0**-34
|