From 2bdc23b76249be3f137e27ce1f15ec4ba139b91e Mon Sep 17 00:00:00 2001 From: Jens Ahrensfeld Date: Mon, 9 Mar 2026 20:00:43 +0100 Subject: [PATCH] message filter calls listener --- msg_montainer.py | 6 +++--- multi_client.py | 9 +++++++-- nmea.py | 21 ++++++++++++--------- 3 files changed, 22 insertions(+), 14 deletions(-) diff --git a/msg_montainer.py b/msg_montainer.py index c6e9428..4fe4561 100644 --- a/msg_montainer.py +++ b/msg_montainer.py @@ -2,12 +2,12 @@ class MsgContainer: def __init__(self, name: str, timestamp: float = 0, data: bytes = b''): - self.name : str= name self.timestamp : float = timestamp + self.name : str= name self.data: bytes = data def __str__(self): - return f"{self.name}: {self.timestamp}: {self.data}" + return f"{self.timestamp}:{self.name}:{self.data}" def __repr__(self): - return f"{self.name}: {self.timestamp}: {self.data}" + return f"{self.timestamp}:{self.name}:{self.data}" diff --git a/multi_client.py b/multi_client.py index 16841ba..34a207b 100644 --- a/multi_client.py +++ b/multi_client.py @@ -62,6 +62,11 @@ class MultiClient(MsgSource): finally: self.sel.close() +def GPGSV_callback(msg: MsgContainer): + print(f"GPGSV_callback: {msg}") + +def GNGLL_callback(msg: MsgContainer): + print(f"GNGLL_callback: {msg}") if __name__ == "__main__": server_list = [ @@ -75,8 +80,8 @@ if __name__ == "__main__": # NMEA multi source receiver receiver = NmeaReceiver() # receiver.filter_by_msg_type('.*') - receiver.filter_by_msg_type('^.?GPGSV.*') - receiver.filter_by_msg_type('^.?GNGLL.*') + receiver.register_msg('^.?GPGSV.*', GPGSV_callback) + receiver.register_msg('^.?GNGLL.*', GNGLL_callback) # Packetizer for "zed-x20p" packetizer_0 = Packetizer() diff --git a/nmea.py b/nmea.py index 99cf433..fced200 100644 --- a/nmea.py +++ b/nmea.py @@ -1,20 +1,23 @@ -from urllib.parse import to_bytes - from msg_montainer import MsgContainer from msg_sink import MsgSink +from typing import Callable import re class NmeaReceiver(MsgSink): def __init__(self): MsgSink.__init__(self) - self.filters_msg_type = [] - - def filter_by_msg_type(self, msg_type: str): - self.filters_msg_type.append(msg_type) + self.filters = [] def on_recv(self, msg: MsgContainer): data = msg.data.decode(encoding="utf-8") - for pattern in self.filters_msg_type: - if re.match(pattern, data): - print(f"{self}: on_receive: {msg}") + for filter in self.filters: + if re.match(filter['re'], data): + if filter['listener'] is not None: + filter['listener'](msg) + def register_msg(self, msg_type: str, listener: Callable): + self.filters.append({'re': msg_type, 'listener': listener}) + + + def _filter_by_msg_type(self, msg_type: str): + self.filters.append(msg_type)