==> n-beacon.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 TPS = 15.0 # tau: 6.283185307179586476925286766559005768394338798750211641949889184615632812572417997256069650684234135964296173026564613294 # feig'b'm 4.669201609102990671853203820466201617258185577475768632745651343004134330211314737138689744023948013817165984855189815134 # pi: 3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067982148086513282306647 # e: 2.718281828459045235360287471352662497757247093699959574966967627724076630353547594571382178525166427427466391932003059921 # root 2: 1.414213562373095048801688724209698078569671875376948073176679737990732478462107038850387534327641572735013846230912297024 # phi: 1.618033988749894848204586834365638117720309179805762862135448622705260462818902449707207204189391137484754088075386891752 # gamma: 0.577215664901532860606512090082402431042159335939923598805767234884867726777664670936947063291746749514631447249807082480 # log10 2: 0.30102999566398119521373889472449302676818988146210854131042746112710818927442450948692725211818617204068447719143 NUMBERS = [ "6.283185307179586476925286766559005768394338798750211641949889184615632812572417997256069650684234135964296173026564613294", "4.669201609102990671853203820466201617258185577475768632745651343004134330211314737138689744023948013817165984855189815134", "3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067982148086513282306647", "2.718281828459045235360287471352662497757247093699959574966967627724076630353547594571382178525166427427466391932003059921", "1.414213562373095048801688724209698078569671875376948073176679737990732478462107038850387534327641572735013846230912297024", "1.618033988749894848204586834365638117720309179805762862135448622705260462818902449707207204189391137484754088075386891752", "0.577215664901532860606512090082402431042159335939923598805767234884867726777664670936947063291746749514631447249807082480", "0.30102999566398119521373889472449302676818988146210854131042746112710818927442450948692725211818617204068447719143", ] 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': "-----", '/': "-..-.", '.': ".-.-.-", ',': "--..--", '?': "..--..", '=': "-...-", '-': "-....-", '(': "-.--.-", ')': "-.--.-", ':': "---...", '"': ".-..-.", '\'': ".----.", } BEEPS = { '.': '#', '-': '###', ' ': '_', # for power levels: 'a': 'a', 'b': 'b', 'c': 'c', 'd': 'd', 'e': 'e', 'f': 'f', 'g': 'g', 'h': 'h', 'i': 'i', 'j': 'j', 'k': 'k', 'l': 'l', } LEVELS = dict( a='0.25', b='0.20', c='0.15', d='0.10', e='0.05', f='0.04', g='0.03', h='0.02', i='0.01', j='0.00', ) ShortNums = [] for n in NUMBERS: s = MORSE[n[0]] + ' ' for i in range(30): if not (i % 3): s += chr(ord('a')+i/3) + ' ' s += MORSE[n[2 + i]] + ' ' ShortNums.append(s) print ShortNums Signed = 'vvv de w6rek/b' o = '' for i in range(len(ShortNums)): print >> sys.stderr, i print >> sys.stderr, ShortNums[i] morse = ' '.join(MORSE[ch] for ch in (Signed + ' aaa ')) morse += ShortNums[i] morse += ' '.join(MORSE[ch] for ch in (' kkk')) print >>sys.stderr, repr(morse) beeps = '(a ' + ' '.join(BEEPS[ch] for ch in morse) + ')' print >> sys.stderr, "len(beeps) was %d" % len(beeps) beeps += int(60 * TPS - len(beeps)) * ':' print >> sys.stderr, 'BEEPS', beeps o += beeps print >> sys.stderr, len(beeps), len(o) print repr(o) led = gpiozero.LED(17) was = 0 print "pid %d" % os.getpid() sys.stdout.flush() while True: t = int(time.time() * TPS) while t == int(time.time() * TPS): pass k = (t + 1) % len(o) # index into o print >> sys.stderr, o[k], x = o[k] if x == '#': led.off() # Active low. if was: print "swr" sys.stdout.flush() was = 1 else: led.on() # Passive high. was = 0 y = LEVELS.get(x) if y: # Set power level print "p %s" % y sys.stdout.flush() elif x == '(': # Transmitter On print "on" sys.stdout.flush() elif x == ')': # Transmitter Off print "off" sys.stdout.flush() pass # NOT REACHED ==> n-run.sh <== #!/bin/bash set -x export PATH="/usr/local/bin:$PATH" while true do test -f stop && break taskset 8 python n-beacon.py | taskset 4 bash n-slave.sh sleep 60 done ==> n-slave.sh <== #!/bin/bash set -x UART=$(ls /dev/serial/by-id/usb-*_IC-7200_* | head -1) 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 18 rig L RFPOWER 0.01 while read cmd arg junk do case $cmd in pid) MASTER="$arg" ;; on) rig T 1 ;; off) rig T 0 ;; p) rig L RFPOWER "$arg" ;; swr) s=$(rig l SWR) echo SWR $s case $s in 1.[0123]* ) : ok ;; [123456789]* ) # Bad SWR date > stop kill $MASTER sleep 1 kill $MASTER exit ;; *) # Ignore communication errors. date -u "+Communcation Error: %Y-%m-%d %H:%M:%S Z" sleep 0.2 ;; esac ;; *) kill $MASTER sleep 1 kill $MASTER exit ;; esac done