add readbytes method to AsynConn

+ flush_recv now also clears _rxbuffer

Change-Id: I33c7ea1a9a1d8b663e5cd3bd81cf7ad43448e0fa
Reviewed-on: https://forge.frm2.tum.de/review/c/sine2020/secop/playground/+/23548
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Enrico Faulhaber <enrico.faulhaber@frm2.tum.de>
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
This commit is contained in:
zolliker 2020-07-28 14:23:33 +02:00
parent aa4c8f1f04
commit 2eb0aeba0d

View File

@ -125,6 +125,28 @@ class AsynConn:
return None
self._rxbuffer += data
def readbytes(self, nbytes, timeout=None):
"""read one line
return either <nbytes> bytes or None if not enough data available within 1 sec (self.timeout)
if a non-zero timeout is given, a timeout error is raised instead of returning None
the timeout effectively used will not be lower than self.timeout (1 sec)
"""
if timeout:
end = time.time() + timeout
while len(self._rxbuffer) < nbytes:
data = self.recv()
if not data:
if timeout:
if time.time() < end:
continue
raise TimeoutError('timeout in readbytes (%g sec)' % timeout)
return None
self._rxbuffer += data
line = self._rxbuffer[:nbytes]
self._rxbuffer = self._rxbuffer[nbytes:]
return line
def writeline(self, line):
self.send(line + self.end_of_line)
@ -154,9 +176,10 @@ class AsynTcp(AsynConn):
def flush_recv(self):
"""flush recv buffer"""
data = []
data = [self._rxbuffer]
while select.select([self.connection], [], [], 0)[0]:
data.append(self.recv())
self._rxbuffer = b''
return b''.join(data)
def recv(self):
@ -244,7 +267,9 @@ class AsynSerial(AsynConn):
self.connection.write(data)
def flush_recv(self):
return self.connection.read(self.connection.in_waiting)
result = self._rxbuffer + self.connection.read(self.connection.in_waiting)
self._rxbuffer = b''
return result
def recv(self):
"""return bytes received within 1 sec"""