Skip to content
Snippets Groups Projects
Commit 4bf5f61d authored by fxk8y's avatar fxk8y :spider:
Browse files

Adding callback register stuff…

parent d2c09e04
No related branches found
No related tags found
No related merge requests found
from __future__ import annotations
import struct import struct
from threading import Thread from threading import Thread
from inspect import signature
from socket import socket, AF_INET, SOCK_DGRAM from socket import socket, AF_INET, SOCK_DGRAM
...@@ -59,19 +62,51 @@ class Receiver: ...@@ -59,19 +62,51 @@ class Receiver:
self._socket = socket(AF_INET, SOCK_DGRAM) self._socket = socket(AF_INET, SOCK_DGRAM)
self._socket.bind((host, port)) self._socket.bind((host, port))
self._callbacks = set() self._callbacks = {}
t = Thread(target=self._recvLoop) t = Thread(target=self._recvLoop)
t.daemon = True t.daemon = True
t.start() t.start()
def addCallback(self, callback) -> Receiver:
"""Register a new callback
The callback may take 2 parameters, but must take at least 1.
If it takes more than one it will get the sender's address too.
Signature should look like:
`def callback(channels, address): pass`
where channels takes a list of floats and adress will be the senders address.
The address parameter may be ommitted."""
params = len(signature(callback).parameters)
if params < 1 or params:
raise AttributeError(f'callback must take at least param#[ 1 ], takes param#[ {params} ]')
else:
self._callbacks[callback] = params
return self
# TODO: write a decorator which copies se docstring from the other function
def __iadd__(self, callback) -> Receiver:
return self.addCallback(callback)
def removeCallback(self, callback) -> Receiver:
if callback in self._callbacks:
del self._callbacks[callback]
return self
# TODO: write a decorator which copies se docstring from the other function
def __isubb__(self, callback) -> Receiver:
return self.removeCallback(callback)
def _recvLoop(self): def _recvLoop(self):
header = DEFAULT.header header = DEFAULT.header
headerLen = len(header) headerLen = len(header)
while True: while True:
data = self._socket.recv(2048) data, addr = self._socket.recvfrom(2048)
if data.startswith(header): if data.startswith(header):
data = data[ headerLen : ] data = data[ headerLen : ]
...@@ -90,9 +125,12 @@ class Receiver: ...@@ -90,9 +125,12 @@ class Receiver:
if ch < 0.0: ch = 0.0 if ch < 0.0: ch = 0.0
channels += [ch] channels += [ch]
for callback in self._callbacks: for callback, params in self._callbacks.items():
try: try:
callback(channels) if params == 1:
callback(channels)
elif params == 2:
callback(channels, addr)
except: except:
# TODO: logging…? # TODO: logging…?
pass pass
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment