62 lines
1.6 KiB
Python
62 lines
1.6 KiB
Python
'''
|
|
|
|
Momentan nur Idee
|
|
|
|
Verarbeiten von Frames
|
|
|
|
Nur Empfang von Paketen / Frames
|
|
- single
|
|
- fast
|
|
- transport
|
|
|
|
fast packets können parallel von mehreren Quellen verarbeitet werden
|
|
|
|
'''
|
|
|
|
import math
|
|
|
|
class FpReceiver():
|
|
|
|
def __init__(self):
|
|
self.sc0 = {}
|
|
self.nf = {}
|
|
self.frame = {}
|
|
self.wip = []
|
|
|
|
def receive(self, data, source)
|
|
'''
|
|
Liefert True wenn Paket komplett empfangen wurde
|
|
'''
|
|
sc = (data[0] & 0xf0) >> 5
|
|
fc = data[0] & 0x1f
|
|
if not source in self.wip:
|
|
# Erster Frame
|
|
if fc != 0:
|
|
# unbekannte Herkunft und kein Startframe
|
|
continue
|
|
self.sc0[source] = sc
|
|
datalen = data[1]
|
|
self.nf[source] = math.ceil((datalen - 6) / 7) + 1 # Anzahl Frames
|
|
self.frame[source] = {fc : data[2:]} # Ersten Frame merken
|
|
else:
|
|
# Folgeframes
|
|
if (sc == self.sc0[source]):
|
|
# TODO prüfe ob der Framecounter fc schon vorgekommen ist
|
|
if not fc in self.frame[source]:
|
|
self.frame[source][fc] = data[1:8]
|
|
else:
|
|
# TODO Fehler im Fast-Packet: doppelter fc!
|
|
raise('Frame error: duplicate fc')
|
|
if len(self.frame[source]) == self.nf[source]:
|
|
self.wip.remove(source)
|
|
return True
|
|
return False
|
|
|
|
def getPacket(self, source)
|
|
# TODO Frames in der richtigen reihenfolge zusammensetzen
|
|
packet = bytearray()
|
|
for frame in sorted(self.frame.items()):
|
|
print(frame)
|
|
#packet.extend()
|
|
return packet
|