==> beacon-bars.py <== # 30 seconds schedule (300 deciseconds) # First 15 seconds for ID. # Tone bars at 15, 17, 19, 21, & 23 seconds. import gpiozero import datetime, os, sys, time Ascii = 'vvv de w6rek/b' PowerSchedule = { 142: '0.25', 162: '0.10', 182: '0.05', 202: '0.02', 222: '0.00', 242: '0.25', 292: '0.25', } MORSE = { ' ': " ", 'a': ".-", 'b': "-...", 'c': "-.-.", 'd': "-..", 'e': ".", 'f': "..-.", 'g': "--.", 'h': "....", 'i': "..", 'j': ".---", 'k': "-.-", 'l': ".-..", 'm': "--", 'n': "-.", 'o': "---", 'p': ".--.", 'q': "--.-", 'r': ".-.", 's': "...", 't': "-", 'u': "..-", 'v': "...-", 'w': ".--", 'x': "-..-", 'y': "-.--", 'z': "--..", '1': ".----", '2': "..---", '3': "...--", '4': "....-", '5': ".....", '6': "-....", '7': "--...", '8': "---..", '9': "----.", '0': "-----", '/': "-..-.", '.': ".-.-.-", ',': "--..--", '?': "..--..", '=': "-...-", '-': "-....-", '(': "-.--.-", ')': "-.--.-", ':': "---...", '"': ".-..-.", '\'': ".----.", } Morse = ' '.join(MORSE[ch] for ch in Ascii) print >>sys.stderr, repr(Morse) BEEPS = { '.': 'X', '-': 'XXX', ' ': '_', } Output = ' '.join(BEEPS[ch] for ch in Morse) N = len(Output) print >>sys.stderr, N, repr(Output) Output = '%-150s' % Output Output += 'XXXXXXXXXX' Output += '~~~~~~~~~~' Output += 'XXXXXXXXXX' Output += '~~~~~~~~~~' Output += 'XXXXXXXXXX' Output += '~~~~~~~~~~' Output += 'XXXXXXXXXX' Output += '~~~~~~~~~~' Output += 'XXXXXXXXXX' Output += '~~~~~~~~~~' N = len(Output) print >>sys.stderr, N, repr(Output) RomanUnits = { 0: '', 1: 'i', 2: 'ii', 3: 'iii', 4: 'iv', 5: 'v', 6: 'vi', 7: 'vii', 8: 'viii', 9: 'ix', } RomanTens = { 0: '', 1: 'x', 2: 'xx', 3: 'xxx', 4: 'xl', 5: 'l', 6: 'lx', 7: 'lxx', 8: 'lxxx', 9: 'xc', } def Roman(n): t = int(n / 10) u = n % 10 rt = RomanTens[t] ru = RomanUnits[u] return '%s%s' % (rt, ru) def RomanTime(t): dt = datetime.datetime.fromtimestamp(t) h = dt.hour m = dt.minute return '%s . %s egeszsegere' % (Roman(h), Roman(m)) led = gpiozero.LED(17) was = 0 print "pid %d" % os.getpid() sys.stdout.flush() SPECIAL = 3000 TOOTS = [(SPECIAL - 10 - i*10) for i in range(4)] alternate = None while True: t = int(time.time() * 10.0) while t == int(time.time() * 10.0): pass k = (t + 1) % 300 # deciseconds, modulo 30 seconds. kk = (t + 1) % SPECIAL # deciseconds, modulo SPECIAL seconds. if kk == 0: alt_morse = ' '.join(MORSE[ch] for ch in RomanTime(time.time())) alternate = 'XXXXXXXXXX ' + ' '.join(BEEPS[ch] for ch in alt_morse) normal = False if kk < 300 and alternate: o = alternate else: o = Output alternate = None if k < len(o) and o[k] == 'X' or kk in TOOTS: led.off() # Active low. if was: print "swr" sys.stdout.flush() was = 1 else: led.on() # Passive high. was = 0 if not alternate: rfpower = PowerSchedule.get(k) if rfpower: print "power %s" % rfpower sys.stdout.flush() pass # NOT REACHED ==> beacon-slave.sh <== #!/bin/bash UART=$(echo /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_*) function rig() { /usr/local/bin/rigctl -m "361" -s 19200 -r $UART "$@" } trap 'rig T 0; sleep 0.3; rig T 0; exit' 0 1 2 3 rig T 0 rig F 28214300 rig M CW 250 rig L KEYSPD 12 rig L RFPOWER 0.01 while read cmd arg junk do case $cmd in pid) MASTER="$arg" ;; power) rig F 28214300 rig M CW 250 rig L RFPOWER "$arg" rig T 1 echo RFPOWER "$arg" date -u "+%Y-%m-%d %H:%M:%S Z" ;; swr) s=$(rig l SWR) echo SWR $s case $s in 1.[012]* ) : ok ;; '') # Ignore communication errors. date -u "+Communcation Error: %Y-%m-%d %H:%M:%S Z" sleep 0.2 ;; * ) date > stop kill $MASTER sleep 1 kill $MASTER exit ;; esac ;; *) kill $MASTER sleep 1 kill $MASTER exit ;; esac done ==> run.sh <== #!/bin/bash set -x export PATH="/usr/local/bin:$PATH" while true do test -f stop && break taskset 8 python beacon-bars.py | taskset 4 bash beacon-slave.sh sleep 60 done