from time import *
from serial import *

def crc(bitfolge, polynom = '10011'):
    """
    zu der 'nachricht' und zu dem 'polynom' (Strings aus 0 und 1) wird
    die CRC-'Prüfsumme' berechnet (String aus 0 und 1)
    """
    lp = len(polynom)
    ln = len(bitfolge)
    for j in range(lp-1):
        bitfolge = bitfolge+'0'
    bitliste = list(bitfolge)
    schieberegister = bitliste[:lp]
    for i in range(ln):
        if schieberegister[0] == '1':
            for j in range(lp):
                if schieberegister[j] == polynom[j]:
                    schieberegister[j] = '0'
                else:
                    schieberegister[j] = '1'
        if i < ln-1:
            schieberegister = schieberegister[1:lp]+list(bitliste[lp+i])
    return ''.join(schieberegister[1:])

def empfangeByte(s, bitzeit):
    while s.getCTS() == False:
        sleep(bitzeit/10)
    sleep(bitzeit*1.5)

    bitfolge = "" 
    for i in range(20):
        if s.getCTS() == True:
            bitfolge = bitfolge + "1"
        else:
            bitfolge = bitfolge + "0"
        sleep(bitzeit)

    sender_bitfolge = bitfolge[:4]
    empfaenger_bitfolge = bitfolge[4:8]
    daten = bitfolge[8:16]    
    crc_empfangen = bitfolge[16:]
    crc_berechnet = crc(sender_bitfolge + empfaenger_bitfolge + daten)
    #print(sender_bitfolge, empfaenger_bitfolge, daten, crc_empfangen, 'CRC ber', crc_berechnet)

    sender = int(sender_bitfolge, 2)
    empfaenger = int(empfaenger_bitfolge,2)
    if crc_berechnet == crc_empfangen:
        return daten, sender, empfaenger
    else:
        return '00000000', 0, 0

def empfangeText(s, bitzeit, adresse):
    zeichen = ''
    while zeichen != '#':
        daten, sender, empfaenger = empfangeByte(s, bitzeit)
        if daten != '00000000' and adresse == empfaenger:
            zeichen = chr(int(daten, 2))
            if zeichen != '#':
                print(zeichen, 'Von', sender, 'An', empfaenger)

s = Serial('com1')
s.setRTS(0)
bitzeit = 1
eigeneAdresse = 2
empfangeText(s, bitzeit, eigeneAdresse)
