From 77bd02f0edc5046a2eac2af0be86ff68ffbeb4ee Mon Sep 17 00:00:00 2001 From: LongHairedHacker Date: Sun, 28 Jun 2015 14:05:05 +0200 Subject: [PATCH] Added preamble to frames --- software/python/collsiontest1.py | 34 ++++++++++++++++++++++ software/python/collsiontest2.py | 20 +++++++++++++ software/python/requirements.txt | 3 ++ software/python/sss7bus.py | 48 ++++++++++++++++++++++---------- 4 files changed, 91 insertions(+), 14 deletions(-) create mode 100644 software/python/collsiontest1.py create mode 100644 software/python/collsiontest2.py create mode 100644 software/python/requirements.txt diff --git a/software/python/collsiontest1.py b/software/python/collsiontest1.py new file mode 100644 index 0000000..fde7925 --- /dev/null +++ b/software/python/collsiontest1.py @@ -0,0 +1,34 @@ +#!/usr/bin/env python2 + +import random +import time + +from sss7bus import SSS7Bus + + +bus = SSS7Bus('/dev/ttyUSB0') + +framecount = 0 +lost = 0 + +while True: + bus.send_message("Hello World!") + + more = True + while more: + msg = bus.read_message() + print msg + print framecount + frame = int(msg.split(':')[1]) + delta = frame - framecount + if delta > 1 and framecount <> 0: + lost += delta + + framecount = frame + + if frame % 100 == 0 and frame > 0: + print "Lost Frames: %d %d %f" % (frame, lost, 100.0 * lost / frame) + + more = bus.has_message() + + time.sleep((500.0 + random.randint(0,500)) / 1000.0) diff --git a/software/python/collsiontest2.py b/software/python/collsiontest2.py new file mode 100644 index 0000000..c44b523 --- /dev/null +++ b/software/python/collsiontest2.py @@ -0,0 +1,20 @@ +#!/usr/bin/env python2 + +import random +import time + +from sss7bus import SSS7Bus + + +bus = SSS7Bus('/dev/ttyUSB1') + +counter = 0 + +while True: + bus.send_message("Timestamp:%d:%d" % (counter, time.time())) + while bus.has_message(): + bus.read_message() + + counter += 1 + + time.sleep((500.0 + random.randint(0,500)) / 1000.0) diff --git a/software/python/requirements.txt b/software/python/requirements.txt new file mode 100644 index 0000000..909c976 --- /dev/null +++ b/software/python/requirements.txt @@ -0,0 +1,3 @@ +crcmod==1.7 +pyserial==2.7 +wheel==0.24.0 diff --git a/software/python/sss7bus.py b/software/python/sss7bus.py index 4877482..a7197c0 100644 --- a/software/python/sss7bus.py +++ b/software/python/sss7bus.py @@ -7,13 +7,15 @@ from crcmod.predefined import PredefinedCrc # Timings in bit times -TIMEOUT = 24 -CLEARCHANNEL = 48 +TIMEOUT = 48 +CLEARCHANNEL = 2 * TIMEOUT class SSS7Bus(object): def __init__(self, port, baudrate=9600): + random.seed() + self._bit_time = 1.0 / baudrate self._serial = serial.Serial(port, baudrate, timeout=self._bit_time * TIMEOUT) @@ -35,15 +37,15 @@ class SSS7Bus(object): 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)) + self._debug("Checking if bus is idle for %f seconds" % (self._serial.timeout)) - length_byte = self._serial.read(1) - if len(length_byte) == 0: + first_byte = self._serial.read(1) + if len(first_byte) == 0: self._debug("Bus seems idle") return True self._debug("Bus is not idle, reading frames") - self._read_frame_rest(length_byte) + self._read_frame_rest(first_byte) return False @@ -52,15 +54,34 @@ class SSS7Bus(object): 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: - self._debug("Timeout reading frame length") + first_byte = self._serial.read(1) + if len(first_byte) == 0: + self._debug("Timeout reading first byte") return False - return self._read_frame_rest(length_byte) + return self._read_frame_rest(first_byte) - def _read_frame_rest(self, length_byte): + def _read_frame_rest(self, first_byte): + if ord(first_byte) <> 0xAA: + self._debug("Wrong first byte: %s" % hex(ord(first_byte))) + return False + + second_byte = self._serial.read(1) + if len(second_byte) == 0: + self._debug("Timeout reading second byte") + return False + + if ord(second_byte) <> 0xFE: + self._debug("Wrong second byte") + return False + + + length_byte = self._serial.read(1) + if len(length_byte) == 0: + self._debug("Timeout reading length byte") + return False + length = ord(length_byte) - 1 # we read the size length byte already self._serial.timeout = timeout=self._bit_time * TIMEOUT @@ -103,7 +124,6 @@ class SSS7Bus(object): for byte in frame: result = self._send_byte(byte) if not result: - self._serial.flushInput() self._debug("Sending frame failed with collision") return False @@ -119,12 +139,12 @@ class SSS7Bus(object): crc16.update(msg) msg_crc = crc16.digest() - frame = chr(len(msg) + 3) + msg + msg_crc + frame = chr(0xAA) + chr(0xFE) + chr(len(msg) + 3) + msg + msg_crc result = self._send_frame(frame) while not result: - backoff = 8 * self._bit_time * (priority + random.randint(1,5)) + backoff = TIMEOUT * self._bit_time * (4 + priority + random.randint(1,5)) self._debug("Collision occured backing off %f" % backoff) time.sleep(backoff) result = self._send_frame(frame)