message filter calls listener

This commit is contained in:
2026-03-09 20:00:43 +01:00
parent c6c1f26f32
commit 2bdc23b762
3 changed files with 22 additions and 14 deletions
+3 -3
View File
@@ -2,12 +2,12 @@
class MsgContainer: class MsgContainer:
def __init__(self, name: str, timestamp: float = 0, data: bytes = b''): def __init__(self, name: str, timestamp: float = 0, data: bytes = b''):
self.name : str= name
self.timestamp : float = timestamp self.timestamp : float = timestamp
self.name : str= name
self.data: bytes = data self.data: bytes = data
def __str__(self): def __str__(self):
return f"{self.name}: {self.timestamp}: {self.data}" return f"{self.timestamp}:{self.name}:{self.data}"
def __repr__(self): def __repr__(self):
return f"{self.name}: {self.timestamp}: {self.data}" return f"{self.timestamp}:{self.name}:{self.data}"
+7 -2
View File
@@ -62,6 +62,11 @@ class MultiClient(MsgSource):
finally: finally:
self.sel.close() 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__": if __name__ == "__main__":
server_list = [ server_list = [
@@ -75,8 +80,8 @@ if __name__ == "__main__":
# NMEA multi source receiver # NMEA multi source receiver
receiver = NmeaReceiver() receiver = NmeaReceiver()
# receiver.filter_by_msg_type('.*') # receiver.filter_by_msg_type('.*')
receiver.filter_by_msg_type('^.?GPGSV.*') receiver.register_msg('^.?GPGSV.*', GPGSV_callback)
receiver.filter_by_msg_type('^.?GNGLL.*') receiver.register_msg('^.?GNGLL.*', GNGLL_callback)
# Packetizer for "zed-x20p" # Packetizer for "zed-x20p"
packetizer_0 = Packetizer() packetizer_0 = Packetizer()
+12 -9
View File
@@ -1,20 +1,23 @@
from urllib.parse import to_bytes
from msg_montainer import MsgContainer from msg_montainer import MsgContainer
from msg_sink import MsgSink from msg_sink import MsgSink
from typing import Callable
import re import re
class NmeaReceiver(MsgSink): class NmeaReceiver(MsgSink):
def __init__(self): def __init__(self):
MsgSink.__init__(self) MsgSink.__init__(self)
self.filters_msg_type = [] self.filters = []
def filter_by_msg_type(self, msg_type: str):
self.filters_msg_type.append(msg_type)
def on_recv(self, msg: MsgContainer): def on_recv(self, msg: MsgContainer):
data = msg.data.decode(encoding="utf-8") data = msg.data.decode(encoding="utf-8")
for pattern in self.filters_msg_type: for filter in self.filters:
if re.match(pattern, data): if re.match(filter['re'], data):
print(f"{self}: on_receive: {msg}") 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)