Cleaned up control flow

This commit is contained in:
Sebastian 2015-06-26 20:06:56 +02:00
parent 699424ed7c
commit bf59b55ef6
1 changed files with 64 additions and 58 deletions

View File

@ -12,11 +12,6 @@ CLEARCHANNEL = 48
class SSS7Bus(object):
ERR_SUCCESS = 0
ERR_TIMEOUT_ON_LENGTH = -1
ERR_TIMEOUT_ON_PAYLOAD = -2
ERR_CRC_ERRROR = -3
def __init__(self, port, baudrate=9600):
self._bit_time = 1.0 / baudrate
@ -30,25 +25,42 @@ class SSS7Bus(object):
print "[SSS7Bus] %s" % msg
def _read_frame(self, clear_channel=False):
if clear_channel :
def _flush_input_buffer(self):
while self._serial.inWaiting() > 0:
self._debug("Flushing input buffer")
self._read_frame()
def _can_send(self):
self._flush_input_buffer()
self._serial.timeout = self._bit_time * CLEARCHANNEL
self._debug("Checking if bus is idle for %f seconds" % (self._bit_time * CLEARCHANNEL))
else:
length_byte = self._serial.read(1)
if len(length_byte) == 0:
self._debug("Bus seems idle")
return True
self._debug("Bus is not idle, reading frames")
self._read_frame_rest(length_byte)
return False
def _read_frame(self):
self._debug("Trying to read a frame from the bus")
self._serial.timeout = timeout=self._bit_time * TIMEOUT
length_byte = self._serial.read(1)
if len(length_byte) == 0:
if clear_channel:
self._debug("Bus was idle")
else:
self._debug("Timeout reading frame length")
return self.ERR_TIMEOUT_ON_LENGTH
return False
if clear_channel:
self._debug("Bus was not idle, trying to read frame")
return self._read_frame_rest(length_byte)
def _read_frame_rest(self, length_byte):
length = ord(length_byte) - 1 # we read the size length byte already
self._serial.timeout = timeout=self._bit_time * TIMEOUT
@ -59,7 +71,7 @@ class SSS7Bus(object):
# if read returns less then length, no new byte has been received for timeout seconds
if len(data) != length:
self._debug("Timeout reading frame payload")
return self.ERR_TIMEOUT_ON_PAYLOAD
return False
crc = data[-2:]
payload = data[:-2]
@ -70,23 +82,14 @@ class SSS7Bus(object):
if real_crc != crc:
self._debug("Wrong crc for frame payload")
return self.ERR_CRC_ERRROR
return True
self._debug("Sucessfully read rest of frame")
self._buffer.insert(0,data)
return self.ERR_SUCCESS
return True
def _flush_input_buffer(self):
while self._serial.inWaiting() > 0:
self._debug("Flushing input buffer")
self._read_frame()
def _can_send(self):
self._flush_input_buffer()
return self._read_frame(True) == self.ERR_TIMEOUT_ON_LENGTH
def _send_byte(self, byte):
self._serial.write(byte)
@ -108,6 +111,9 @@ class SSS7Bus(object):
def send_message(self, msg, priority=5):
if len(msg) > 253:
raise ValueError("Message length can not exceed 253 byte")
crc16 = PredefinedCrc('crc16')
crc16.update(msg)
msg_crc = crc16.digest()