added nmea msg parsing

This commit is contained in:
2026-03-15 16:12:39 +01:00
parent 7ce91a34dc
commit 4ead04ebeb
3 changed files with 95 additions and 10 deletions
+11 -10
View File
@@ -7,6 +7,8 @@ from packetizer import Packetizer
from transceiver import Transceiver
from a_backend import ABackend
from nmea.GLL import Gll
from nmea.GSA import Gsa
from nmea.GSV import Gsv
class NetworkBackend(ABackend):
def __init__(self, servers: list[dict]):
@@ -98,17 +100,16 @@ if __name__ == "__main__":
xcvr_1.register_recv(packetizer_0)
xcvr_2.register_recv(packetizer_1)
# rx_1 = MsgReceiver('Rx1', '^.?GPGSV.*')
# rx_2 = MsgReceiver('Rx2', '^.?GNGLL.*')
# rx_3 = Gga('Rx3', 'GP')
rx_4 = Gll('Rx4', '--')
rx_list = [
Gll('Rx', '--'),
Gsa('Rx', '--'),
Gsv('Rx', '--')
]
# Register all Rx to all sources
# packetizer_0.register_recv(rx_1)
# packetizer_0.register_recv(rx_2)
# packetizer_1.register_recv(rx_1)
# packetizer_1.register_recv(rx_2)
packetizer_0.register_recv(rx_4)
packetizer_1.register_recv(rx_4)
for rx in rx_list:
packetizer_0.register_recv(rx)
packetizer_1.register_recv(rx)
# Connect all sources
mc.connect()
+36
View File
@@ -0,0 +1,36 @@
from msg_container import MsgContainer
from nmea.receiver import Nmea
class Gsa(Nmea):
class Msg:
def __init__(self):
self.mode = None
self.fix_type = None
self.sat_id = None
self.p_dop = None
self.h_dop = None
self.v_dop = None
self.checksum = None
def __repr__(self):
return f"mode: {self.mode}, fix_type: {self.mode}, sat_id: {self.sat_id}, p-dop: {self.p_dop:.3f}, h-dop: {self.h_dop:.3f}, v-dop: {self.v_dop:.3f}"
def __init__(self, name: str, tid: str):
Nmea.__init__(self, name, tid=tid, msg_type="GSA")
self.msg = None
self.data = Gsa.Msg()
def on_recv(self, msg: MsgContainer):
data = msg.data.decode(encoding="utf-8")
data_list = data.split(',')
self.msg = data_list[0]
self.data.mode = data_list[1]
self.data.fix_type = data_list[2]
self.data.sat_id = data_list[3:15]
self.data.p_dop = float(data_list[15])
self.data.h_dop = float(data_list[16])
self.data.v_dop = float(data_list[17])
self.data.checksum = data_list[18]
print(self.data)
+48
View File
@@ -0,0 +1,48 @@
from msg_container import MsgContainer
from nmea.receiver import Nmea
class Gsv(Nmea):
class Msg:
def __init__(self):
self.number_of_msg = None
self.seq_number = None
self.sat_vis = None
self.sat_id = []
self.elevation = []
self.azimuth = []
self.snr = []
self.checksum = None
def __repr__(self):
return f"sat_vis: {self.sat_vis}, sat_id: {self.sat_id}, elevation: {self.elevation}, azimuth: {self.azimuth}, snr: {self.snr}"
def __init__(self, name: str, tid: str):
Nmea.__init__(self, name, tid=tid, msg_type="GSV")
self.msg = None
self.data = Gsv.Msg()
def on_recv(self, msg: MsgContainer):
msg_data = msg.data.decode(encoding="utf-8")
data_list = msg_data.split(',')
self.msg = data_list[0]
data = self.data
data.number_of_msg = data_list[1]
data.seq_number = data_list[2]
data.sat_vis = data_list[3]
data_set_size = 4
num_sats_in_msg = int(len(data_list[3:-2])/4)
for n in range(num_sats_in_msg):
data.sat_id.append(data_list[data_set_size*n+4])
data.elevation.append(data_list[data_set_size*n+5])
data.azimuth.append(data_list[data_set_size*n+6])
data.snr.append(data_list[data_set_size*n+7])
data.checksum = data_list[data_set_size*(num_sats_in_msg-1)+8]
if self.data.number_of_msg == self.data.seq_number:
print(data)
self.data = Gsv.Msg()