From 670c4db7a437a43a261d08ffb2e7a21948a716a8 Mon Sep 17 00:00:00 2001 From: Jens Ahrensfeld Date: Sun, 29 Mar 2026 15:37:18 +0200 Subject: [PATCH] refactored --- a_backend.py | 4 ++-- a_transceiver.py | 8 +------- network_backend.py | 17 +++++++++-------- transceiver.py | 7 +++++++ ubx/listener.py | 12 +++++------- ubx/messages/msg.py | 3 +++ ubx/messages/nav.py | 6 ++++++ ubx/messages/rxm.py | 3 +++ ubx/query.py | 14 ++++++++++---- 9 files changed, 46 insertions(+), 28 deletions(-) diff --git a/a_backend.py b/a_backend.py index 7514617..18d82cc 100644 --- a/a_backend.py +++ b/a_backend.py @@ -1,6 +1,6 @@ from abc import ABC - +from a_transceiver import ATransceiver class ABackend(ABC): - def send(self, name: str, data: bytes): + def send(self, xcr: ATransceiver, data: bytes): pass diff --git a/a_transceiver.py b/a_transceiver.py index b13cae6..8351283 100644 --- a/a_transceiver.py +++ b/a_transceiver.py @@ -1,4 +1,3 @@ -from a_backend import ABackend from msg.listener import MsgListener @@ -6,14 +5,9 @@ class ATransceiver(MsgListener): def __init__(self, name: str): MsgListener.__init__(self) self.name = name - self.backend = None def on_recv(self, msg): pass - def on_register(self, backend: ABackend): - self.backend = backend - def send(self, data: bytes): - self.backend.send(self.name, data) - + pass diff --git a/network_backend.py b/network_backend.py index 51f0d3b..bcec83a 100644 --- a/network_backend.py +++ b/network_backend.py @@ -6,7 +6,8 @@ from threading import Thread from queue import Queue from msg.container import MsgContainer -from transceiver import Transceiver +from transceiver import Transceiver, ATransceiver + from a_backend import ABackend from nmea.packetizer import NmeaPacketizer @@ -25,8 +26,8 @@ class NetworkBackend(ABackend): self.thread = Thread(target=self.event_loop) self.loop_enable = True - def send(self, name: str, data: bytes): - sock = self.find_by_name(name) + def send(self, xcvr: ATransceiver, data: bytes): + sock = self.find_by_name(xcvr.name) sock['queue'].put(data) if sock is not None: self.sel.modify(sock['sock'], selectors.EVENT_READ + selectors.EVENT_WRITE, None) @@ -141,12 +142,12 @@ if __name__ == "__main__": Gga(grm, 'GN'), ] ubx_rx_list = [ - UbxListener(Sig(), 0x01, 0x43), - UbxListener(Sat(), 0x01, 0x35), - UbxListener(RawX(), 0x02, 0x15), + UbxListener(Sig()), + UbxListener(Sat()), + UbxListener(RawX()), - UbxListener(UbxMsg(), 0x05, 0x01), - UbxListener(UbxMsg(), 0x05, 0x00), + UbxListener(UbxMsg(0x05, 0x01)), + UbxListener(UbxMsg(0x05, 0x00)), ] # Topology diff --git a/transceiver.py b/transceiver.py index 4464643..4300ab2 100644 --- a/transceiver.py +++ b/transceiver.py @@ -1,14 +1,21 @@ from a_transceiver import ATransceiver from msg.container import MsgContainer from msg.talker import MsgTalker +from a_backend import ABackend class Transceiver(ATransceiver, MsgTalker): def __init__(self, name: str): ATransceiver.__init__(self, name) MsgTalker.__init__(self) + self.backend = None def on_recv(self, msg: MsgContainer): msg.transceiver = self self.call_listener(msg) + def on_register(self, backend: ABackend): + self.backend = backend + + def send(self, data: bytes): + self.backend.send(self, data) diff --git a/ubx/listener.py b/ubx/listener.py index 1a47045..8ebbf21 100644 --- a/ubx/listener.py +++ b/ubx/listener.py @@ -4,22 +4,20 @@ from ubx.ubx import frame_parse, frame_parse_hdr from ubx.messages.msg import UbxMsg class UbxListener(MsgListener): - def __init__(self, parser: UbxMsg, mclass: int|None = None, mid: int|None = None): + def __init__(self, msg: UbxMsg): MsgListener.__init__(self) - self.parser = parser - self.mclass = mclass - self.mid = mid + self.msg = msg def on_recv(self, msg: MsgContainer): data, hdr = frame_parse(msg.data) - msg_parsed = self.parser.from_bytes(data) + msg_parsed = self.msg.from_bytes(data) print(f"{msg.source.name}:{hdr.mclass}:{hdr.mid}:data({len(data)}):{msg_parsed}") def is_msg(self, msg: MsgContainer): hdr = frame_parse_hdr(msg.data) if hdr is not None: - if self.mclass is not None and self.mid is not None: - return self.mclass == hdr.mclass and self.mid == hdr.mid + if self.msg.mclass is not None and self.msg.mid is not None: + return self.msg.mclass == hdr.mclass and self.msg.mid == hdr.mid else: return True return False diff --git a/ubx/messages/msg.py b/ubx/messages/msg.py index b80b788..cbda63c 100644 --- a/ubx/messages/msg.py +++ b/ubx/messages/msg.py @@ -1,6 +1,9 @@ class UbxMsg: + def __init__(self, mclass: int, mid: int): + self.mclass = mclass + self.mid = mid @classmethod def from_bytes(cls, data: bytes): diff --git a/ubx/messages/nav.py b/ubx/messages/nav.py index 6a9555f..96b5bd4 100644 --- a/ubx/messages/nav.py +++ b/ubx/messages/nav.py @@ -2,6 +2,9 @@ import struct from ubx.messages.msg import UbxMsg class Sig(UbxMsg): + def __init__(self): + UbxMsg.__init__(self, 0x01, 0x43) + class Group1: @classmethod def from_bytes(cls, data: bytes): @@ -39,6 +42,9 @@ class Sig(UbxMsg): return obj.__dict__ class Sat(UbxMsg): + def __init__(self): + UbxMsg.__init__(self, 0x01, 0x35) + class Group1: @classmethod def from_bytes(cls, data: bytes): diff --git a/ubx/messages/rxm.py b/ubx/messages/rxm.py index 1d90644..781468d 100644 --- a/ubx/messages/rxm.py +++ b/ubx/messages/rxm.py @@ -2,6 +2,9 @@ import struct from ubx.messages.msg import UbxMsg class RawX(UbxMsg): + def __init__(self): + UbxMsg.__init__(self, 0x02, 0x15) + class Group1: @classmethod def from_bytes(cls, data: bytes): diff --git a/ubx/query.py b/ubx/query.py index 53d6a42..c96600b 100644 --- a/ubx/query.py +++ b/ubx/query.py @@ -6,21 +6,27 @@ from ubx.listener import UbxListener from threading import BoundedSemaphore class UbxQuery(UbxListener): - def __init__(self, transceiver: Transceiver, parser: UbxMsg, mclass: int|None = None, mid: int|None = None): - UbxListener.__init__(self, parser, mclass, mid) + def __init__(self, transceiver: Transceiver, msg: UbxMsg): + UbxListener.__init__(self, msg) self.transceiver = transceiver self.sema = BoundedSemaphore() - self.msg = UbxMsg() def on_recv(self, msg: MsgContainer): if self.is_msg(msg): data, hdr = frame_parse(msg.data) - msg_parsed = self.parser.from_bytes(data) + msg_parsed = self.msg.from_bytes(data) self.msg = msg_parsed self.sema.release() + def poll(self): + frame = frame_create(self.msg.mclass, self.msg.mid, b'') + self.transceiver.send(frame) + self.sema.acquire() + print(self.msg) + def query(self, data: bytes): frame = frame_create(0x01, 0x35, b'') self.transceiver.send(frame) self.sema.acquire() print(self.msg) +