# morse code analyser from PicoAirQuality import KitronikBME688, KitronikButton, KitronikDataLogger, \ KitronikOLED, KitronikRTC, KitronikZIPLEDs,\ KitronikBuzzer import time from array import array #from datetime import datetime logFileName = "atmosphere_log.txt" bme688 = KitronikBME688() oled = KitronikOLED() rtc = KitronikRTC() zipleds = KitronikZIPLEDs(3) # Python u arse hole sec = Integer() rtc.setDate(16, 7, 2022) rtc.setTime(12, 10, 0) bme688.setupGasSensor() bme688.calcBaselines() sec = 0 #f = open(logFileName, 'a') #f.write("# Data Logging: Date, Time, Temperature, Pressure, Humidity, AirQuality, CO2\n") beeper = KitronikBuzzer() buttons = KitronikButton() mmaxindex = 20 mbuf = [] # array/list(buttonEvent) this should be global by default RIGGHT???? mindex = 0 # head new button events mindex_t = 0 # tail unprocessed button events mcount = 0 old_m_count = 0 last_pv = 0 # make this array size 20. A morse char of 5 dots|dashes # would take up 10 slots max. # class buttonEvent: #mstimestamp = 0 #pinstate = 0 def __init__(self, mststamp, pinst): buttonEvent.mstimestamp = mststamp buttonEvent.pinstate = pinst #def str(self): #return "mstimestamp:",str(mstimestamp), "pinst ",str(pinstate) # this pythin list is doing my head in, why cant they just ahve arrays like normal langauages # for i in range (0,30): b = buttonEvent(0,0) print (" inserting a dummy entry into the stupid list object ", i) mbuf.insert(i,b) print (" how can it xcomplaIN NOW THE LIST IS FULL OF OBJECTS ",) #def ButtonB_r_IRQHandler(pin): # global buttonB # buttonB = 2*60 # print("button B pressed", buttonB) def ButtonB_f_IRQHandler(pin): #now = time.now() global buttonB, last_pv global mbuf, mindex, mcount, mmaxindex pv = pin.value() tt = time.ticks_ms() buttonB = 2*60 # maKES leds LIGHT IN AIRq print("button B IRQ", tt, pv) if last_pv == pv : # get get spurious 0 level ints print("two ints @ same level in a row",pv) # ignore else: b=buttonEvent(time.ticks_ms(),pv) # no no no!!! mbuf.insert(mindex,b) mbuf[mindex] = b # why cant i do this arrrgghhhnhhh all I want is a fucking array print ("b", str(b.mstimestamp), str(b.pinstate)) # arghhh why is it not storing thsi print ("mbuf inserting ",str( time.ticks_ms()), str(pv), "@", str(mindex), mbuf) b3 = mbuf[mindex] # shit bag that should store it print ("did shit bag python actually put this in the list??", b3.pinstate, b3) # it would appear the shitbag python did store this mcount += 1 mindex += 1 mindex = mindex % mmaxindex if pv: beeper.playTone(600) else: beeper.stopTone() last_pv = pv # FALLING DOES NOT WORK AND IRQ_LOW_LEVEL not recognised buttons.buttonB.irq(trigger=machine.Pin.IRQ_FALLING|machine.Pin.IRQ_RISING, handler=ButtonB_f_IRQHandler) #buttons.buttonB.irq(trigger=machine.Pin.IRQ_RISING, handler=ButtonB_r_IRQHandler) def process_morse2(): # ok the mbuf is driving me bonkers. keeps going local or something global mbuf for i in range (0,mmaxindex-1): be = mbuf[i] print ("be ", i, be.mstimestamp, be.pinstate ) def process_morse(): #global mbuf # : why python WHY: why muck everyone about with local fucking copies your sxdjhklazsedfbokhjlfvbegrhjk global mbuf, mindex, mindex_t, mcount, mmaxindex, oled, old_m_count #for i in range (0,mmaxindex-1): #be = mbuf[i] #print ("be ", be.timestampms, be.pinstate ) oled.clear() oled.displayText(rtc.readDateString(), 1, 25) oled.displayText(rtc.readTimeString(), 2, 33) oled.displayText(str(mcount), 4, 33) # process the list if (mcount - old_m_count) >= 2: print("(mcount - old_m_count) >= 2", mbuf, " mindex_t ", mindex_t) b1 = mbuf[(mindex_t)%mmaxindex] b2 = mbuf[(mindex_t+1)%mmaxindex] # ok shitbag python why is the pinstate in that object now zero you turd #print("b1 index", str((mindex_t+mmaxindex)%mmaxindex), "b1 ps", str(b1.pinstate)) #print("b2 index", str((mindex_t+mmaxindex+1)%mmaxindex), "b2 ps ", str(b2.pinstate)) print("b1", b1, b1.pinstate, "@ mbuf[", str((mindex_t+mmaxindex)%mmaxindex), "]") print("b2", b2, b2.pinstate, "@ mbuf[", str((mindex_t+1)%mmaxindex), "]") print(" b1 ts ps ", b1.mstimestamp, b1.pinstate, "b2 ts ps", b2.mstimestamp, b2.pinstate) if b1.pinstate == 1 and b2.pinstate == 0: print(" high to low pinstate valid press", b1.pinstate, b2.pinstate) # press and release found duration = b2.mstimestamp - b1.mstimestamp if duration < 300: oled.displayText('dit '+str(duration), 5, 33) else: oled.displayText('dah '+str(duration), 5, 33) mindex_t += 2; mindex_t = mindex_t % mmaxindex mcount -= 2 else: print(" undefined pinstate order", b1.pinstate, b2.pinstate) mindex_t += 1 # that one made no sense so move up mindex_t = mindex_t % mmaxindex mcount -= 1 oled.displayText('BAH ', 5, 33) old_m_count = mcount oled.show() while True: # maybe a function can have a global ref, yeah maybe the main cont. another wanky aspect ogf pythion #process_morse() process_morse2() time.sleep(1.0)