mirror of
https://github.com/sunnypilot/sunnypilot.git
synced 2026-02-18 21:14:01 +08:00
181 lines
5.4 KiB
Python
181 lines
5.4 KiB
Python
"""
|
|
UBX protocol parser
|
|
"""
|
|
|
|
from enum import IntEnum
|
|
from typing import Annotated
|
|
|
|
from openpilot.system.ubloxd import binary_struct as bs
|
|
|
|
|
|
class GnssType(IntEnum):
|
|
gps = 0
|
|
sbas = 1
|
|
galileo = 2
|
|
beidou = 3
|
|
imes = 4
|
|
qzss = 5
|
|
glonass = 6
|
|
|
|
|
|
class Ubx(bs.BinaryStruct):
|
|
GnssType = GnssType
|
|
|
|
class RxmRawx(bs.BinaryStruct):
|
|
class Measurement(bs.BinaryStruct):
|
|
pr_mes: Annotated[float, bs.f64]
|
|
cp_mes: Annotated[float, bs.f64]
|
|
do_mes: Annotated[float, bs.f32]
|
|
gnss_id: Annotated[GnssType | int, bs.enum(bs.u8, GnssType)]
|
|
sv_id: Annotated[int, bs.u8]
|
|
reserved2: Annotated[bytes, bs.bytes_field(1)]
|
|
freq_id: Annotated[int, bs.u8]
|
|
lock_time: Annotated[int, bs.u16]
|
|
cno: Annotated[int, bs.u8]
|
|
pr_stdev: Annotated[int, bs.u8]
|
|
cp_stdev: Annotated[int, bs.u8]
|
|
do_stdev: Annotated[int, bs.u8]
|
|
trk_stat: Annotated[int, bs.u8]
|
|
reserved3: Annotated[bytes, bs.bytes_field(1)]
|
|
|
|
rcv_tow: Annotated[float, bs.f64]
|
|
week: Annotated[int, bs.u16]
|
|
leap_s: Annotated[int, bs.s8]
|
|
num_meas: Annotated[int, bs.u8]
|
|
rec_stat: Annotated[int, bs.u8]
|
|
reserved1: Annotated[bytes, bs.bytes_field(3)]
|
|
meas: Annotated[list[Measurement], bs.array(Measurement, count_field='num_meas')]
|
|
|
|
class RxmSfrbx(bs.BinaryStruct):
|
|
gnss_id: Annotated[GnssType | int, bs.enum(bs.u8, GnssType)]
|
|
sv_id: Annotated[int, bs.u8]
|
|
reserved1: Annotated[bytes, bs.bytes_field(1)]
|
|
freq_id: Annotated[int, bs.u8]
|
|
num_words: Annotated[int, bs.u8]
|
|
reserved2: Annotated[bytes, bs.bytes_field(1)]
|
|
version: Annotated[int, bs.u8]
|
|
reserved3: Annotated[bytes, bs.bytes_field(1)]
|
|
body: Annotated[list[int], bs.array(bs.u32, count_field='num_words')]
|
|
|
|
class NavSat(bs.BinaryStruct):
|
|
class Nav(bs.BinaryStruct):
|
|
gnss_id: Annotated[GnssType | int, bs.enum(bs.u8, GnssType)]
|
|
sv_id: Annotated[int, bs.u8]
|
|
cno: Annotated[int, bs.u8]
|
|
elev: Annotated[int, bs.s8]
|
|
azim: Annotated[int, bs.s16]
|
|
pr_res: Annotated[int, bs.s16]
|
|
flags: Annotated[int, bs.u32]
|
|
|
|
itow: Annotated[int, bs.u32]
|
|
version: Annotated[int, bs.u8]
|
|
num_svs: Annotated[int, bs.u8]
|
|
reserved: Annotated[bytes, bs.bytes_field(2)]
|
|
svs: Annotated[list[Nav], bs.array(Nav, count_field='num_svs')]
|
|
|
|
class NavPvt(bs.BinaryStruct):
|
|
i_tow: Annotated[int, bs.u32]
|
|
year: Annotated[int, bs.u16]
|
|
month: Annotated[int, bs.u8]
|
|
day: Annotated[int, bs.u8]
|
|
hour: Annotated[int, bs.u8]
|
|
min: Annotated[int, bs.u8]
|
|
sec: Annotated[int, bs.u8]
|
|
valid: Annotated[int, bs.u8]
|
|
t_acc: Annotated[int, bs.u32]
|
|
nano: Annotated[int, bs.s32]
|
|
fix_type: Annotated[int, bs.u8]
|
|
flags: Annotated[int, bs.u8]
|
|
flags2: Annotated[int, bs.u8]
|
|
num_sv: Annotated[int, bs.u8]
|
|
lon: Annotated[int, bs.s32]
|
|
lat: Annotated[int, bs.s32]
|
|
height: Annotated[int, bs.s32]
|
|
h_msl: Annotated[int, bs.s32]
|
|
h_acc: Annotated[int, bs.u32]
|
|
v_acc: Annotated[int, bs.u32]
|
|
vel_n: Annotated[int, bs.s32]
|
|
vel_e: Annotated[int, bs.s32]
|
|
vel_d: Annotated[int, bs.s32]
|
|
g_speed: Annotated[int, bs.s32]
|
|
head_mot: Annotated[int, bs.s32]
|
|
s_acc: Annotated[int, bs.s32]
|
|
head_acc: Annotated[int, bs.u32]
|
|
p_dop: Annotated[int, bs.u16]
|
|
flags3: Annotated[int, bs.u8]
|
|
reserved1: Annotated[bytes, bs.bytes_field(5)]
|
|
head_veh: Annotated[int, bs.s32]
|
|
mag_dec: Annotated[int, bs.s16]
|
|
mag_acc: Annotated[int, bs.u16]
|
|
|
|
class MonHw2(bs.BinaryStruct):
|
|
class ConfigSource(IntEnum):
|
|
flash = 102
|
|
otp = 111
|
|
config_pins = 112
|
|
rom = 113
|
|
|
|
ofs_i: Annotated[int, bs.s8]
|
|
mag_i: Annotated[int, bs.u8]
|
|
ofs_q: Annotated[int, bs.s8]
|
|
mag_q: Annotated[int, bs.u8]
|
|
cfg_source: Annotated[ConfigSource | int, bs.enum(bs.u8, ConfigSource)]
|
|
reserved1: Annotated[bytes, bs.bytes_field(3)]
|
|
low_lev_cfg: Annotated[int, bs.u32]
|
|
reserved2: Annotated[bytes, bs.bytes_field(8)]
|
|
post_status: Annotated[int, bs.u32]
|
|
reserved3: Annotated[bytes, bs.bytes_field(4)]
|
|
|
|
class MonHw(bs.BinaryStruct):
|
|
class AntennaStatus(IntEnum):
|
|
init = 0
|
|
dontknow = 1
|
|
ok = 2
|
|
short = 3
|
|
open = 4
|
|
|
|
class AntennaPower(IntEnum):
|
|
false = 0
|
|
true = 1
|
|
dontknow = 2
|
|
|
|
pin_sel: Annotated[int, bs.u32]
|
|
pin_bank: Annotated[int, bs.u32]
|
|
pin_dir: Annotated[int, bs.u32]
|
|
pin_val: Annotated[int, bs.u32]
|
|
noise_per_ms: Annotated[int, bs.u16]
|
|
agc_cnt: Annotated[int, bs.u16]
|
|
a_status: Annotated[AntennaStatus | int, bs.enum(bs.u8, AntennaStatus)]
|
|
a_power: Annotated[AntennaPower | int, bs.enum(bs.u8, AntennaPower)]
|
|
flags: Annotated[int, bs.u8]
|
|
reserved1: Annotated[bytes, bs.bytes_field(1)]
|
|
used_mask: Annotated[int, bs.u32]
|
|
vp: Annotated[bytes, bs.bytes_field(17)]
|
|
jam_ind: Annotated[int, bs.u8]
|
|
reserved2: Annotated[bytes, bs.bytes_field(2)]
|
|
pin_irq: Annotated[int, bs.u32]
|
|
pull_h: Annotated[int, bs.u32]
|
|
pull_l: Annotated[int, bs.u32]
|
|
|
|
magic: Annotated[bytes, bs.const(bs.bytes_field(2), b"\xb5\x62")]
|
|
msg_type: Annotated[int, bs.u16be]
|
|
length: Annotated[int, bs.u16]
|
|
body: Annotated[
|
|
object,
|
|
bs.substream(
|
|
'length',
|
|
bs.switch(
|
|
'msg_type',
|
|
{
|
|
0x0107: NavPvt,
|
|
0x0213: RxmSfrbx,
|
|
0x0215: RxmRawx,
|
|
0x0A09: MonHw,
|
|
0x0A0B: MonHw2,
|
|
0x0135: NavSat,
|
|
},
|
|
),
|
|
),
|
|
]
|
|
checksum: Annotated[int, bs.u16]
|