refactored

This commit is contained in:
2026-03-16 11:06:18 +01:00
parent 50d70ccce0
commit 34e56c6291
11 changed files with 131 additions and 78 deletions
+14 -8
View File
@@ -3,7 +3,8 @@ import selectors
import time import time
from msg_container import MsgContainer from msg_container import MsgContainer
from packetizer import Packetizer from receiver.nmea_packetizer import NmeaPacketizer
from receiver.ubx_packetizer import UbxPacketizer
from transceiver import Transceiver from transceiver import Transceiver
from a_backend import ABackend from a_backend import ABackend
from nmea.GLL import Gll from nmea.GLL import Gll
@@ -11,6 +12,8 @@ from nmea.GSA import Gsa
from nmea.GSV import Gsv from nmea.GSV import Gsv
from nmea.GGA import Gga from nmea.GGA import Gga
from nmea.RMC import Rmc from nmea.RMC import Rmc
from ubx.ubx import UbxReceiver
class NetworkBackend(ABackend): class NetworkBackend(ABackend):
def __init__(self, servers: list[dict]): def __init__(self, servers: list[dict]):
@@ -98,7 +101,8 @@ if __name__ == "__main__":
Gsv(grm, 'GP'), Gsv(grm, 'GP'),
Gga(grm, 'GP'), Gga(grm, 'GP'),
Rmc(grm, 'GN'), Rmc(grm, 'GN'),
Gga(grm, 'GN') Gga(grm, 'GN'),
UbxReceiver(grm, 0x0a, 0x36)
] ]
# Topology # Topology
# Receiver-0.0 \ # Receiver-0.0 \
@@ -110,15 +114,17 @@ if __name__ == "__main__":
# Create transceiver # Create transceiver
transceiver = mc.create_xcvr(grm) transceiver = mc.create_xcvr(grm)
# Create Packetizer # Create NMEA-Packetizer
packetizer = Packetizer() nmea_packetizer = NmeaPacketizer()
ubx_packetizer = UbxPacketizer(sync_bytes=b'\xb5\x62')
# Register packetizer to transceiver # Register NMEA-Packetizer to transceiver
transceiver.register_recv(packetizer) transceiver.register_recv(nmea_packetizer)
transceiver.register_recv(ubx_packetizer)
# Register Receiver to packetizer # Register Receiver to NMEA-Packetizer
for rx in rx_list: for rx in rx_list:
packetizer.register_recv(rx) nmea_packetizer.register_recv(rx)
# Connect all sources # Connect all sources
mc.connect() mc.connect()
+3 -3
View File
@@ -1,8 +1,8 @@
from msg_container import MsgContainer from msg_container import MsgContainer
from nmea.receiver import Nmea from receiver.nmea_receiver import NmeaReceiver
class Gga(Nmea): class Gga(NmeaReceiver):
class Msg: class Msg:
def __init__(self): def __init__(self):
self.utc_time = None self.utc_time = None
@@ -24,7 +24,7 @@ class Gga(Nmea):
return f"{self.__dict__}" return f"{self.__dict__}"
def __init__(self, name: str, tid: str): def __init__(self, name: str, tid: str):
Nmea.__init__(self, name, tid=tid, msg_type="GGA") NmeaReceiver.__init__(self, name, tid=tid, msg_type="GGA")
self.msg = None self.msg = None
self.data = Gga.Msg() self.data = Gga.Msg()
+3 -3
View File
@@ -1,8 +1,8 @@
from msg_container import MsgContainer from msg_container import MsgContainer
from nmea.receiver import Nmea from receiver.nmea_receiver import NmeaReceiver
class Gll(Nmea): class Gll(NmeaReceiver):
class Msg: class Msg:
def __init__(self): def __init__(self):
self.latitude = None self.latitude = None
@@ -18,7 +18,7 @@ class Gll(Nmea):
return f"{self.__dict__}" return f"{self.__dict__}"
def __init__(self, name: str, tid: str): def __init__(self, name: str, tid: str):
Nmea.__init__(self, name, tid=tid, msg_type="GLL") NmeaReceiver.__init__(self, name, tid=tid, msg_type="GLL")
self.msg = None self.msg = None
self.data = Gll.Msg() self.data = Gll.Msg()
+3 -3
View File
@@ -1,8 +1,8 @@
from msg_container import MsgContainer from msg_container import MsgContainer
from nmea.receiver import Nmea from receiver.nmea_receiver import NmeaReceiver
class Gsa(Nmea): class Gsa(NmeaReceiver):
class Msg: class Msg:
def __init__(self): def __init__(self):
self.mode = None self.mode = None
@@ -18,7 +18,7 @@ class Gsa(Nmea):
return f"{self.__dict__}" return f"{self.__dict__}"
def __init__(self, name: str, tid: str): def __init__(self, name: str, tid: str):
Nmea.__init__(self, name, tid=tid, msg_type="GSA") NmeaReceiver.__init__(self, name, tid=tid, msg_type="GSA")
self.msg = None self.msg = None
self.data = Gsa.Msg() self.data = Gsa.Msg()
+3 -3
View File
@@ -1,8 +1,8 @@
from msg_container import MsgContainer from msg_container import MsgContainer
from nmea.receiver import Nmea from receiver.nmea_receiver import NmeaReceiver
class Gsv(Nmea): class Gsv(NmeaReceiver):
class Msg: class Msg:
def __init__(self): def __init__(self):
self.number_of_msg = None self.number_of_msg = None
@@ -19,7 +19,7 @@ class Gsv(Nmea):
return f"{self.__dict__}" return f"{self.__dict__}"
def __init__(self, name: str, tid: str): def __init__(self, name: str, tid: str):
Nmea.__init__(self, name, tid=tid, msg_type="GSV") NmeaReceiver.__init__(self, name, tid=tid, msg_type="GSV")
self.msg = None self.msg = None
self.data = Gsv.Msg() self.data = Gsv.Msg()
+3 -3
View File
@@ -1,8 +1,8 @@
from msg_container import MsgContainer from msg_container import MsgContainer
from nmea.receiver import Nmea from receiver.nmea_receiver import NmeaReceiver
class Rmc(Nmea): class Rmc(NmeaReceiver):
class Msg: class Msg:
def __init__(self): def __init__(self):
pass pass
@@ -11,7 +11,7 @@ class Rmc(Nmea):
return f"{self.__dict__}" return f"{self.__dict__}"
def __init__(self, name: str, tid: str): def __init__(self, name: str, tid: str):
Nmea.__init__(self, name, tid=tid, msg_type="RMC") NmeaReceiver.__init__(self, name, tid=tid, msg_type="RMC")
self.msg = None self.msg = None
self.data = Rmc.Msg() self.data = Rmc.Msg()
-21
View File
@@ -1,21 +0,0 @@
from msg_container import MsgContainer
from msg_sink import MsgSink
import re
class AsciiReceiver(MsgSink):
def __init__(self, name: str, filter: str):
super().__init__()
self.name = name
self.filter = filter
def is_msg(self, msg: MsgContainer):
res = False
try:
res = re.match(bytes(self.filter, encoding="utf-8"), msg.data) is not None
except UnicodeDecodeError:
pass
return res
def on_recv(self, msg: MsgContainer):
print(f"{self.name}: {msg}")
@@ -3,7 +3,7 @@ from msg_sink import MsgSink
from msg_source import MsgSource from msg_source import MsgSource
from struct import pack from struct import pack
class Packetizer(MsgSink, MsgSource): class NmeaPacketizer(MsgSink, MsgSource):
def __init__(self): def __init__(self):
MsgSink.__init__(self) MsgSink.__init__(self)
MsgSource.__init__(self) MsgSource.__init__(self)
+20 -1
View File
@@ -1,4 +1,23 @@
from receiver.ascii_receiver import AsciiReceiver from msg_container import MsgContainer
from msg_sink import MsgSink
import re
class AsciiReceiver(MsgSink):
def __init__(self, name: str, filter: str):
super().__init__()
self.name = name
self.filter = filter
def is_msg(self, msg: MsgContainer):
res = False
try:
res = re.match(bytes(self.filter, encoding="utf-8"), msg.data) is not None
except UnicodeDecodeError:
pass
return res
def on_recv(self, msg: MsgContainer):
print(f"{self.name}: {msg}")
class NmeaReceiver(AsciiReceiver): class NmeaReceiver(AsciiReceiver):
+26 -11
View File
@@ -3,29 +3,44 @@ from msg_sink import MsgSink
from msg_source import MsgSource from msg_source import MsgSource
from struct import pack from struct import pack
class Packetizer(MsgSink, MsgSource): class UbxPacketizer(MsgSink, MsgSource):
def __init__(self): def __init__(self, sync_bytes: bytes):
MsgSink.__init__(self) MsgSink.__init__(self)
MsgSource.__init__(self) MsgSource.__init__(self)
self.sync_bytes = sync_bytes
self.packet = b'' self.packet = b''
self.wait_sync = True self.wait_sync = True
self.latency = None
def on_recv(self, msg: MsgContainer): def on_recv(self, msg: MsgContainer):
name = msg.name name = msg.name
data = msg.data data = msg.data
for n in range (len(data)): w = len(self.sync_bytes)
d = data[n] self.latency = 0
if d == 13 or d == 10: for n in range (0, len(data)):
d = data[n:n+w]
if d == self.sync_bytes:
self.latency = w-1
print("UBX-sync")
timestamp = msg.timestamp timestamp = msg.timestamp
self.wait_sync = False self.wait_sync = False
if len(self.packet) > 0:
self.call_sinks(MsgContainer(name, timestamp, self.packet))
self.wait_sync = True
self.packet = b''
elif not self.wait_sync: elif not self.wait_sync:
self.packet += pack('B', d) if self.latency == 0:
self.packet += d
else:
self.latency -= 1
def is_msg(self, msg: MsgContainer): def is_msg(self, msg: MsgContainer):
return True return True
if __name__ == "__main__":
_sync = b'JA'
_data = b'31'
pkt = UbxPacketizer(sync_bytes=_sync)
frame1 = _sync + b'31' + _sync + b'31'
pkt.on_recv(MsgContainer('test', 31101970.0208, frame1))
frame2 = _sync + b'3' + _sync + b'10'
pkt.on_recv(MsgContainer('test', 31101970.0208, frame2))
+45 -11
View File
@@ -1,5 +1,8 @@
import struct import struct
from msg_container import MsgContainer
from msg_sink import MsgSink
def checksum(data: bytes) -> bytes: def checksum(data: bytes) -> bytes:
ck_a = 0 ck_a = 0
@@ -11,34 +14,65 @@ def checksum(data: bytes) -> bytes:
return struct.pack("BB", ck_a, ck_b) return struct.pack("BB", ck_a, ck_b)
def frame_create(_class: int, _id: int, _data: bytes) -> bytes: def frame_create(_class: int, _id: int, _data: bytes) -> bytes:
hdr = b'\xb5\x62' _sync = b'\xb5\x62'
frame = struct.pack('B', _class) _hdr = struct.pack('B', _class)
frame += struct.pack('B', _id) _hdr += struct.pack('B', _id)
frame += struct.pack('<H', len(_data)) _hdr += struct.pack('<H', len(_data))
frame += _data _check = checksum(_hdr + _data)
check = checksum(frame)
return hdr + frame + check return _sync + _hdr + _data + _check
def frame_parse(frame: bytes): def frame_parse(frame: bytes):
_class = 0
_id = 0
_data = None
while True:
hdr = frame[0:2] hdr = frame[0:2]
if hdr != b'\xb5\x62': if hdr != b'\xb5\x62':
return None break
_class = struct.unpack('B', frame[2:3])[0] _class = struct.unpack('B', frame[2:3])[0]
_id = struct.unpack('B', frame[3:4])[0] _id = struct.unpack('B', frame[3:4])[0]
_length = struct.unpack('<H', frame[4:6])[0] _length = struct.unpack('<H', frame[4:6])[0]
if (6+_length+2) != len(frame): if (6+_length+2) != len(frame):
return None break
_data = frame[6:-2]
_check_soll = frame[-2:] _check_soll = frame[-2:]
_check_ist = checksum(frame[2:-2]) _check_ist = checksum(frame[2:-2])
if _check_soll != _check_ist: if _check_soll != _check_ist:
return None break
_data = frame[6:-2]
break
return _data, _class, _id return _data, _class, _id
class UbxReceiver(MsgSink):
def __init__(self, name: str, mid: int, mclass: int):
MsgSink.__init__(self)
self.name = name
self.mid = mid
self.mclass = mclass
def on_recv(self, msg: MsgContainer):
data, mclass, mid = frame_parse(msg.data)
print(f"{mclass}:{mid}:{data}")
def is_msg(self, msg: MsgContainer):
data, mclass, mid = frame_parse(msg.data)
if data is None:
return False
if mclass != self.mclass:
return False
if mid != self.mid:
return False
return True
if __name__ == "__main__": if __name__ == "__main__":
result = frame_create(1, 2, b'Hallo') result = frame_create(1, 2, b'Hallo')
print(result) print(result)