Skip to content
Snippets Groups Projects
Commit 734b83a1 authored by Marko Mecina's avatar Marko Mecina
Browse files

minor updates in generic communications module

parent de1b92f2
No related branches found
No related tags found
No related merge requests found
...@@ -18,6 +18,7 @@ class Connector: ...@@ -18,6 +18,7 @@ class Connector:
""" """
RECV_NBYTES = 4096 RECV_NBYTES = 4096
_decoding_types = ('hex', 'ascii')
def __init__(self, host, port, is_server=False, response_to=2, recv_nbytes_min=0, save_to_file=None, msgdecoding='hex', resp_decoder=None): def __init__(self, host, port, is_server=False, response_to=2, recv_nbytes_min=0, save_to_file=None, msgdecoding='hex', resp_decoder=None):
...@@ -40,6 +41,17 @@ class Connector: ...@@ -40,6 +41,17 @@ class Connector:
self._startup(save_to_file) self._startup(save_to_file)
@property
def msgdecoding(self):
return self._msgdecoding
@msgdecoding.setter
def msgdecoding(self, typ):
if typ not in self._decoding_types:
print('WARNING: Invalid decoding format {}. Using hex. {}'.format(typ, self._decoding_types))
typ = 'hex'
self._msgdecoding = typ
def _startup(self, save_to): def _startup(self, save_to):
self.setup_port() self.setup_port()
...@@ -133,10 +145,8 @@ class Connector: ...@@ -133,10 +145,8 @@ class Connector:
if output: if output:
print('{:.3f}: SENT {} | RECV {}'.format(t, _msgdecoder(msg, self.msgdecoding), _msgdecoder(resp, self.msgdecoding))) print('{:.3f}: SENT {} | RECV {}'.format(t, _msgdecoder(msg, self.msgdecoding), _msgdecoder(resp, self.msgdecoding)))
if not rx: if rx:
return None return resp if self.resp_decoder is None else self.resp_decoder(resp)
return resp if self.resp_decoder is None else self.resp_decoder(resp)
else: else:
print('Not connected!') print('Not connected!')
...@@ -169,7 +179,7 @@ class Connector: ...@@ -169,7 +179,7 @@ class Connector:
self.conn.settimeout(seconds) self.conn.settimeout(seconds)
self._response_to = seconds self._response_to = seconds
def start_receiver(self, procfunc=None, outfile=None, ofmode='w'): def start_receiver(self, procfunc=None, outfile=None, ofmode='w', pkt_parser_func=None):
""" """
:param procfunc: :param procfunc:
...@@ -182,32 +192,30 @@ class Connector: ...@@ -182,32 +192,30 @@ class Connector:
return return
if self.receiver is None: if self.receiver is None:
self.receiver = Receiver([self.conn], procfunc=procfunc, outfile=outfile, ofmode=ofmode) self.receiver = Receiver([self.conn], procfunc=procfunc, outfile=outfile, ofmode=ofmode, pkt_parser_func=pkt_parser_func)
self.receiver.start() self.receiver.start()
else: else:
print('Receiver already initialised') print('Receiver already initialised')
def stop_receiver(self): def stop_receiver(self, clear=False):
if self.receiver is None: if self.receiver is None:
print('No receiver to stop') print('No receiver to stop')
return return
self.receiver.stop() self.receiver.stop()
self.receiver = None
if clear:
self.receiver = None
@property @property
def recvd_data(self): def recvd_data(self):
if self.receiver is None: if self.receiver is not None:
return return self.receiver.recvd_data_buf.queue
return self.receiver.recvd_data_buf.queue
@property @property
def proc_data(self): def proc_data(self):
if self.receiver is None: if self.receiver is not None:
return return self.receiver.proc_data
return self.receiver.proc_data
class Receiver: class Receiver:
...@@ -219,7 +227,7 @@ class Receiver: ...@@ -219,7 +227,7 @@ class Receiver:
SEL_TIMEOUT = 2 SEL_TIMEOUT = 2
RECV_BUF_SIZE = 1024**3 RECV_BUF_SIZE = 1024**3
def __init__(self, sockfds, procfunc=None, recv_buf_size=RECV_BUF_SIZE, outfile=None, ofmode='w'): def __init__(self, sockfds, procfunc=None, recv_buf_size=RECV_BUF_SIZE, outfile=None, ofmode='w', pkt_parser_func=None):
self.sockfds = sockfds self.sockfds = sockfds
self.recvd_data_buf = queue.Queue(recv_buf_size) self.recvd_data_buf = queue.Queue(recv_buf_size)
...@@ -227,6 +235,7 @@ class Receiver: ...@@ -227,6 +235,7 @@ class Receiver:
self._recv_thread = None self._recv_thread = None
self._proc_thread = None self._proc_thread = None
self.proc_data = [] self.proc_data = []
self._pkt_parser_func = pkt_parser_func
if outfile is not None: if outfile is not None:
self.proc_data_fd = open(outfile, ofmode) self.proc_data_fd = open(outfile, ofmode)
...@@ -266,8 +275,10 @@ class Receiver: ...@@ -266,8 +275,10 @@ class Receiver:
try: try:
rd, wr, er = select.select(self.sockfds, [], self.sockfds, self.SEL_TIMEOUT) rd, wr, er = select.select(self.sockfds, [], self.sockfds, self.SEL_TIMEOUT)
for sock in rd: for sock in rd:
self.recvd_data_buf.put((time.time(), sock.recv(self.RECV_BYTES))) if self._pkt_parser_func is not None:
# print(self.recvd_data.get()) self.recvd_data_buf.put((time.time(), self._pkt_parser_func(sock)))
else:
self.recvd_data_buf.put((time.time(), sock.recv(self.RECV_BYTES)))
for sock in er: for sock in er:
print('Error in {}'.format(sock.getpeername())) print('Error in {}'.format(sock.getpeername()))
...@@ -342,7 +353,7 @@ def hexify(bs, sep=''): ...@@ -342,7 +353,7 @@ def hexify(bs, sep=''):
if isinstance(sep, tuple): if isinstance(sep, tuple):
sep, grp = sep sep, grp = sep
else: else:
grp = 0 grp = 1
return bs.hex().upper() if sep == '' else bs.hex(sep, grp).upper() return bs.hex().upper() if sep == '' else bs.hex(sep, grp).upper()
...@@ -366,3 +377,15 @@ def proc_func_generic(data, ts=None): ...@@ -366,3 +377,15 @@ def proc_func_generic(data, ts=None):
ts = '{:.6f}'.format(ts) ts = '{:.6f}'.format(ts)
return [ts, str(data)] return [ts, str(data)]
def pkt_parser(sock, default_len=7):
headlen = 1
pkt = sock.recv(headlen)
if pkt == b'\x35':
plen = 40
while len(pkt) < plen:
pkt += sock.recv(plen - len(pkt))
return pkt
else:
return pkt + sock.recv(default_len - headlen)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment