122 lines
2.3 KiB
Python
122 lines
2.3 KiB
Python
|
#!/usr/bin/env python2.7
|
||
|
|
||
|
from raspyrfm import *
|
||
|
import sys
|
||
|
import time
|
||
|
from argparse import ArgumentParser
|
||
|
|
||
|
parser = ArgumentParser()
|
||
|
parser.add_argument("-t", "--timebase", type=int, help=u"timebase in \u03bcs")
|
||
|
parser.add_argument("-r", "--repeats", type=int, help=u"number of repetitions")
|
||
|
parser.add_argument("code", nargs='*', help="code, e. g. '000000000FFF', 'A 1 2 on' or '10111100011101011111111110001110'")
|
||
|
args = parser.parse_args()
|
||
|
|
||
|
txdata = None
|
||
|
if len(args.code) > 0:
|
||
|
txdata = None
|
||
|
for proto in protos:
|
||
|
data = proto.Encode(args.code)
|
||
|
if data:
|
||
|
txdata = data
|
||
|
break
|
||
|
|
||
|
if txdata is None:
|
||
|
print("invalid code!")
|
||
|
exit()
|
||
|
|
||
|
rfm = RaspyRFM(1, RFM69)
|
||
|
rfm.set_params(
|
||
|
Freq = 868.35, #MHz
|
||
|
Datarate = 20.0, #kbit/s
|
||
|
Bandwidth = 200, #kHz
|
||
|
SyncPattern = [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07],
|
||
|
RssiThresh = -105, #dBm
|
||
|
ModulationType = rfm69.OOK,
|
||
|
OokThreshType = 1, #peak thresh
|
||
|
OokPeakThreshDec = 3,
|
||
|
)
|
||
|
|
||
|
if txdata:
|
||
|
rfm.SetParams(
|
||
|
SyncPattern = [],
|
||
|
Datarate = 5.0
|
||
|
)
|
||
|
rep = (args.repeats if args.repeats else txdata[1])
|
||
|
rfm.SendPacket(txdata[0] * rep)
|
||
|
print("Code sent!")
|
||
|
exit()
|
||
|
|
||
|
def Decode(pulses):
|
||
|
if len(pulses) != 118:
|
||
|
return;
|
||
|
|
||
|
b = ""
|
||
|
for p in pulses:
|
||
|
if (p>=6) and (p<=10):
|
||
|
b += "s"
|
||
|
elif (p > 10) and (p<15):
|
||
|
b += "l"
|
||
|
else:
|
||
|
b += '?'
|
||
|
s = ""
|
||
|
while len(b) > 0:
|
||
|
if b[:2] == 'ss':
|
||
|
s += '0'
|
||
|
elif b[:2] == 'll':
|
||
|
s += '1'
|
||
|
else:
|
||
|
s += '?'
|
||
|
b = b[2:]
|
||
|
print(s)
|
||
|
print("SYNC " + s[1:13] + " HC1 " + s[13:22] + " HC2 " + s[22:31] +
|
||
|
" ADR " + s[31:40])
|
||
|
return
|
||
|
for i in range(len(pulses)):
|
||
|
pulses[i] *= 50
|
||
|
|
||
|
dec = None
|
||
|
for proto in protos:
|
||
|
dec = proto.Decode(pulses)
|
||
|
if dec:
|
||
|
print(dec)
|
||
|
|
||
|
if not dec:
|
||
|
print("Len " + str(len(pulses)) + ": " + str(pulses))
|
||
|
|
||
|
while True:
|
||
|
data = rfm.receive_packet(400)
|
||
|
s = ""
|
||
|
|
||
|
pulsecount = 3
|
||
|
glitchcount = 0
|
||
|
bit = True
|
||
|
pulses = []
|
||
|
|
||
|
for d in data[0]:
|
||
|
s += format(d, '08b')
|
||
|
mask = 0x80
|
||
|
while mask > 0:
|
||
|
newbit = (d & mask) > 0
|
||
|
|
||
|
if glitchcount > 0:
|
||
|
glitchcount += 1
|
||
|
if newbit == bit:
|
||
|
pulsecount += glitchcount
|
||
|
glitchcount = 0
|
||
|
else:
|
||
|
if glitchcount == 3:
|
||
|
pulses.append(pulsecount)
|
||
|
if pulsecount > 50:
|
||
|
Decode(pulses)
|
||
|
pulses = []
|
||
|
bit = newbit
|
||
|
pulsecount = 3
|
||
|
glitchcount = 0
|
||
|
else:
|
||
|
if newbit == bit:
|
||
|
pulsecount += 1
|
||
|
else:
|
||
|
glitchcount = 1
|
||
|
|
||
|
mask >>= 1
|