morseanalyser/main.py

244 lines
6.2 KiB
Python
Raw Normal View History

2022-07-17 09:28:47 +00:00
# morse code analyser
from PicoAirQuality import KitronikBME688, KitronikButton, KitronikDataLogger, \
KitronikOLED, KitronikRTC, KitronikZIPLEDs,\
KitronikBuzzer
import time
mindex=0
morse = []
oled = KitronikOLED()
rtc = KitronikRTC()
zipleds = KitronikZIPLEDs(3)
rtc.setDate(16, 7, 2022)
rtc.setTime(12, 10, 0)
rate = 50 # 20 wpm
#sec = 0
#f = open(logFileName, 'a')
#f.write("# Data Logging: Date, Time, Temperature, Pressure, Humidity, AirQuality, CO2\n")
beeper = KitronikBuzzer()
buttons = KitronikButton()
2022-07-17 09:28:47 +00:00
last_pv = 0
last_tt = 0
spurious = 0 # interrupts are often repeated for the low level
button_state = 0 # on==1 off==0
def header():
global rate, oled
s = "Morse rate " + str(rate) + " mS"
oled.displayText(s,1,0)
2022-07-17 09:28:47 +00:00
def ButtonA_f_IRQHandler(pin):
global rate, oled
rate += 10
if rate > 100:
rate = 40
oled.clear()
header()
print (" IRQ button A" + str(rate))
def ButtonB_f_IRQHandler(pin):
global last_pv, last_tt, spurious, mindex
pv = pin.value()
2022-07-17 09:28:47 +00:00
tt = time.ticks_ms()
#print("button B IRQ", tt, pv)
2022-07-17 09:28:47 +00:00
if last_pv == pv : # get get spurious 0 level ints
#print("two ints @ same level in a row",pv) # ignore
spurious += 1
else:
#b=buttonEvent(time.ticks_ms(),pv)
d = tt - last_tt
if pv:
#print(" duration of inter-m space ", d)
if d < rate*3:
print (" ")
else:
print (" ipi ")
mindex += 1;
beeper.playTone(600)
button_state = 1
else:
#print(" duration of press ", d)
if d > rate*3:
morse.append("-");
print ("DAH")
else:
morse.append(".");
print ("DIT")
beeper.stopTone()
button_state = 0
last_pv = pv
last_tt = tt
buttons.buttonB.irq(trigger=machine.Pin.IRQ_FALLING|machine.Pin.IRQ_RISING, \
handler=ButtonB_f_IRQHandler)
buttons.buttonA.irq(trigger=machine.Pin.IRQ_RISING, handler=ButtonA_f_IRQHandler)
charbuf = []
hpm=10
vpm=2
def printm(mchar):
global hpm, oled, vpm, charbuf
charbuf.append(mchar)
chcnt = 0
oled.clear()
header()
while len(charbuf) > (4*20):
charbuf.pop(0) # get rid of old morse
for i in range(2,6):
for j in range (0,20):
chcnt += 1
if len(charbuf) > chcnt:
oled.displayText(charbuf[chcnt], i, j*6)
else:
oled.displayText(' ', i, j*6)
oled.show()
print(mchar);
def decode_morse():
global morse
dm_a = [".","-"]
dm_b = ["-",".",".","."]
2022-07-17 10:52:01 +00:00
dm_c = ["-",".","-","."]
dm_d = ["-",".","."]
dm_e = ["."]
2022-07-17 10:52:01 +00:00
dm_f = [".",".","-","."]
dm_g = ["-","-","."]
dm_h = [".",".",".","."]
dm_i = [".","."]
2022-07-17 10:52:01 +00:00
dm_j = [".","-","-","-"]
dm_k = ["-",".","-"]
dm_l = [".","-",".","."]
dm_m = ["-","-"]
dm_n = ["-","."]
dm_o = ["-","-","-"]
dm_p = [".","-","-","."]
dm_q = ["-","-",".","-"]
dm_r = [".","-","."]
dm_s = [".",".","."]
dm_t = ["-"]
dm_u = [".",".","-"]
dm_v = [".",".",".","-"]
dm_w = [".","-","-"]
dm_x = ["-",".",".","-"]
dm_y = ["-",".","-","-"]
dm_z = ["-","-",".","."]
#
dm_0 = ["-","-","-","-","-"]
dm_1 = [".","-","-","-","-"]
dm_2 = [".",".","-","-","-"]
dm_3 = [".",".",".","-","-"]
dm_4 = [".",".",".",".","-"]
dm_5 = [".",".",".",".","."]
dm_6 = ["-",".",".",".","."]
dm_7 = ["-","-",".",".","."]
dm_8 = ["-","-","-",".","."]
dm_9 = ["-","-","-","-","."]
2022-07-17 10:52:01 +00:00
#
if morse == dm_a:
return ("A")
2022-07-17 10:52:01 +00:00
if morse == dm_b:
return ("B")
2022-07-17 10:52:01 +00:00
if morse == dm_c:
return ("C")
2022-07-17 10:52:01 +00:00
if morse == dm_d:
return ("D")
2022-07-17 10:52:01 +00:00
if morse == dm_e:
return ("E")
2022-07-17 10:52:01 +00:00
if morse == dm_f:
return ("F")
2022-07-17 10:52:01 +00:00
if morse == dm_g:
return ("G")
2022-07-17 10:52:01 +00:00
if morse == dm_h:
return ("H")
2022-07-17 10:52:01 +00:00
if morse == dm_i:
return ("I")
2022-07-17 10:52:01 +00:00
if morse == dm_j:
return ("J")
if morse == dm_k:
return ("K")
if morse == dm_l:
return ("L")
if morse == dm_m:
return ("M")
if morse == dm_n:
return ("N")
2022-07-17 10:52:01 +00:00
if morse == dm_o:
return ("O")
if morse == dm_p:
return ("P")
if morse == dm_q:
return ("Q")
if morse == dm_r:
return ("R")
if morse == dm_s:
return ("S")
if morse == dm_t:
return ("T")
if morse == dm_u:
return ("U")
if morse == dm_v:
return ("V")
if morse == dm_w:
return ("W")
if morse == dm_x:
return ("X")
if morse == dm_y:
return ("Y")
if morse == dm_z:
return ("Z")
if morse == dm_0:
return ("0")
if morse == dm_1:
return ("1")
if morse == dm_2:
return ("2")
if morse == dm_3:
return ("3")
if morse == dm_4:
return ("4")
if morse == dm_5:
return ("5")
if morse == dm_6:
return ("6")
if morse == dm_7:
return ("7")
if morse == dm_8:
return ("8")
if morse == dm_9:
return ("9")
return("?")
2022-07-17 17:31:56 +00:00
last_was_space = 0
last_sp = 0
2022-07-17 09:28:47 +00:00
def process_morse():
2022-07-17 17:31:56 +00:00
global last_tt, morse, last_was_space, last_sp
tt = time.ticks_ms()
if (button_state == 0):
if (tt - last_tt) > rate*6:
# morse chacter complete
if (len(morse) > 0):
#print(morse)
printm(decode_morse())
morse = []
last_was_space = 0
last_sp = last_tt
if (tt - last_sp) > rate*22 : # and last_not_space == 0:
if last_was_space == 0:
printm(" ");
last_was_space = 1 # dont keep repeating inter word spaces
last_sp = last_tt
2022-07-17 17:31:56 +00:00
2022-07-17 09:28:47 +00:00
while True:
process_morse()
2022-07-17 09:28:47 +00:00