diff --git a/network_backend.py b/network_backend.py index 3509a23..81423d1 100644 --- a/network_backend.py +++ b/network_backend.py @@ -3,7 +3,8 @@ import selectors import time 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 a_backend import ABackend from nmea.GLL import Gll @@ -11,6 +12,8 @@ from nmea.GSA import Gsa from nmea.GSV import Gsv from nmea.GGA import Gga from nmea.RMC import Rmc +from ubx.ubx import UbxReceiver + class NetworkBackend(ABackend): def __init__(self, servers: list[dict]): @@ -98,7 +101,8 @@ if __name__ == "__main__": Gsv(grm, 'GP'), Gga(grm, 'GP'), Rmc(grm, 'GN'), - Gga(grm, 'GN') + Gga(grm, 'GN'), + UbxReceiver(grm, 0x0a, 0x36) ] # Topology # Receiver-0.0 \ @@ -110,15 +114,17 @@ if __name__ == "__main__": # Create transceiver transceiver = mc.create_xcvr(grm) - # Create Packetizer - packetizer = Packetizer() + # Create NMEA-Packetizer + nmea_packetizer = NmeaPacketizer() + ubx_packetizer = UbxPacketizer(sync_bytes=b'\xb5\x62') - # Register packetizer to transceiver - transceiver.register_recv(packetizer) + # Register NMEA-Packetizer to transceiver + transceiver.register_recv(nmea_packetizer) + transceiver.register_recv(ubx_packetizer) - # Register Receiver to packetizer + # Register Receiver to NMEA-Packetizer for rx in rx_list: - packetizer.register_recv(rx) + nmea_packetizer.register_recv(rx) # Connect all sources mc.connect() diff --git a/nmea/GGA.py b/nmea/GGA.py index 1132d11..aac8549 100644 --- a/nmea/GGA.py +++ b/nmea/GGA.py @@ -1,8 +1,8 @@ from msg_container import MsgContainer -from nmea.receiver import Nmea +from receiver.nmea_receiver import NmeaReceiver -class Gga(Nmea): +class Gga(NmeaReceiver): class Msg: def __init__(self): self.utc_time = None @@ -24,7 +24,7 @@ class Gga(Nmea): return f"{self.__dict__}" 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.data = Gga.Msg() diff --git a/nmea/GLL.py b/nmea/GLL.py index feb2234..29a12da 100644 --- a/nmea/GLL.py +++ b/nmea/GLL.py @@ -1,8 +1,8 @@ from msg_container import MsgContainer -from nmea.receiver import Nmea +from receiver.nmea_receiver import NmeaReceiver -class Gll(Nmea): +class Gll(NmeaReceiver): class Msg: def __init__(self): self.latitude = None @@ -18,7 +18,7 @@ class Gll(Nmea): return f"{self.__dict__}" 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.data = Gll.Msg() diff --git a/nmea/GSA.py b/nmea/GSA.py index 0bc75b8..783601d 100644 --- a/nmea/GSA.py +++ b/nmea/GSA.py @@ -1,8 +1,8 @@ from msg_container import MsgContainer -from nmea.receiver import Nmea +from receiver.nmea_receiver import NmeaReceiver -class Gsa(Nmea): +class Gsa(NmeaReceiver): class Msg: def __init__(self): self.mode = None @@ -18,7 +18,7 @@ class Gsa(Nmea): return f"{self.__dict__}" 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.data = Gsa.Msg() diff --git a/nmea/GSV.py b/nmea/GSV.py index bf42ed5..6b5e30f 100644 --- a/nmea/GSV.py +++ b/nmea/GSV.py @@ -1,8 +1,8 @@ from msg_container import MsgContainer -from nmea.receiver import Nmea +from receiver.nmea_receiver import NmeaReceiver -class Gsv(Nmea): +class Gsv(NmeaReceiver): class Msg: def __init__(self): self.number_of_msg = None @@ -19,7 +19,7 @@ class Gsv(Nmea): return f"{self.__dict__}" 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.data = Gsv.Msg() diff --git a/nmea/RMC.py b/nmea/RMC.py index 9800672..dcf09b8 100644 --- a/nmea/RMC.py +++ b/nmea/RMC.py @@ -1,8 +1,8 @@ from msg_container import MsgContainer -from nmea.receiver import Nmea +from receiver.nmea_receiver import NmeaReceiver -class Rmc(Nmea): +class Rmc(NmeaReceiver): class Msg: def __init__(self): pass @@ -11,7 +11,7 @@ class Rmc(Nmea): return f"{self.__dict__}" 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.data = Rmc.Msg() diff --git a/receiver/ascii_receiver.py b/receiver/ascii_receiver.py deleted file mode 100644 index 7ab6c30..0000000 --- a/receiver/ascii_receiver.py +++ /dev/null @@ -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}") - diff --git a/receiver/ascii_packetizer.py b/receiver/nmea_packetizer.py similarity index 94% rename from receiver/ascii_packetizer.py rename to receiver/nmea_packetizer.py index 91de594..16f59bb 100644 --- a/receiver/ascii_packetizer.py +++ b/receiver/nmea_packetizer.py @@ -3,7 +3,7 @@ from msg_sink import MsgSink from msg_source import MsgSource from struct import pack -class Packetizer(MsgSink, MsgSource): +class NmeaPacketizer(MsgSink, MsgSource): def __init__(self): MsgSink.__init__(self) MsgSource.__init__(self) diff --git a/receiver/nmea_receiver.py b/receiver/nmea_receiver.py index 3383383..791827b 100644 --- a/receiver/nmea_receiver.py +++ b/receiver/nmea_receiver.py @@ -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): diff --git a/receiver/ubx_packetizer.py b/receiver/ubx_packetizer.py index 91de594..7770313 100644 --- a/receiver/ubx_packetizer.py +++ b/receiver/ubx_packetizer.py @@ -3,29 +3,44 @@ from msg_sink import MsgSink from msg_source import MsgSource from struct import pack -class Packetizer(MsgSink, MsgSource): - def __init__(self): +class UbxPacketizer(MsgSink, MsgSource): + def __init__(self, sync_bytes: bytes): MsgSink.__init__(self) MsgSource.__init__(self) + self.sync_bytes = sync_bytes self.packet = b'' self.wait_sync = True - + self.latency = None def on_recv(self, msg: MsgContainer): name = msg.name data = msg.data - for n in range (len(data)): - d = data[n] - if d == 13 or d == 10: + w = len(self.sync_bytes) + self.latency = 0 + 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 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: - self.packet += pack('B', d) + if self.latency == 0: + self.packet += d + else: + self.latency -= 1 def is_msg(self, msg: MsgContainer): - return True \ No newline at end of file + 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)) diff --git a/ubx/ubx.py b/ubx/ubx.py index 62ae25f..1253d4b 100644 --- a/ubx/ubx.py +++ b/ubx/ubx.py @@ -1,5 +1,8 @@ import struct +from msg_container import MsgContainer +from msg_sink import MsgSink + def checksum(data: bytes) -> bytes: ck_a = 0 @@ -11,34 +14,65 @@ def checksum(data: bytes) -> bytes: return struct.pack("BB", ck_a, ck_b) def frame_create(_class: int, _id: int, _data: bytes) -> bytes: - hdr = b'\xb5\x62' - frame = struct.pack('B', _class) - frame += struct.pack('B', _id) - frame += struct.pack('