diff --git a/display b/display new file mode 100755 index 0000000..11249d6 Binary files /dev/null and b/display differ diff --git a/main.py b/main.py index 41b0f9c..1a18354 100644 --- a/main.py +++ b/main.py @@ -3,13 +3,10 @@ import pigpio import time import datetime import asyncio -import os -from itertools import cycle from RPi import GPIO -from time import sleep from itertools import cycle -from rotary import main_loop as rotary + bands = { "80m":[3.5, 4], @@ -22,27 +19,78 @@ bands = { # Setup for encoder band = cycle(bands) -CURRENT_BAND = None -step = 0.025 +CURRENT_BAND:str = None + +def next_band(): + global CURRENT_BAND + CURRENT_BAND = next(band) + FREQUENCY = bands[CURRENT_BAND][0] + print(FREQUENCY) + print(CURRENT_BAND) + + return FREQUENCY + +def prev_band(): + global CURRENT_BAND + CURRENT_BAND = list(bands.keys())[list(bands.keys()).index(CURRENT_BAND)-1] + print(CURRENT_BAND) + FREQUENCY = bands[CURRENT_BAND][0] + 1 + return FREQUENCY + +FREQUENCY = next_band() clk=17 dt=27 sw=22 - GPIO.setmode(GPIO.BCM) GPIO.setup(clk, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) -GPIO.setup(dt, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) -GPIO.setup(sw, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) -counter = 0 + clkLastState = GPIO.input(clk) + +async def rotary(clk=clk, dt=dt, sw=sw, step=0.025): + GPIO.setmode(GPIO.BCM) + + GPIO.setup(clk, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) + GPIO.setup(dt, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) + GPIO.setup(sw, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) + + global FREQUENCY, clkLastState + + try: + while True: + clkState = GPIO.input(clk) + dtState = GPIO.input(dt) + swState = GPIO.input(sw) + if swState == GPIO.HIGH: + print("yeet") + if clkState != clkLastState: + if FREQUENCY > bands[CURRENT_BAND][1]: + FREQUENCY = next_band() + print(FREQUENCY) + if FREQUENCY < bands[CURRENT_BAND][0]: + FREQUENCY = prev_band() + print(FREQUENCY) + if dtState != clkState: + FREQUENCY += step + else: + FREQUENCY -= step + # print(round(FREQUENCY, 3)) + clkLastState = clkState + await asyncio.sleep(.01) + except KeyboardInterrupt: + print("\nBye") + finally: + print("AAAAA") + GPIO.cleanup() + + # 1. Hook up the screen and buttons # * the screen should show the frequency we're at # * read the buttons # 2. Encoder [x] # * Change frequency in the scope of a given band PTT_IS_ON:bool = False -FREQUENCY:float = float(430) modulations = cycle(["./modulations/ssb.sh", "./modulations/fmrds.sh"]) @@ -51,7 +99,6 @@ pi = pigpio.pi() # button pin pi.set_mode(10, pigpio.INPUT) # modulation change pin(change this) -pi.set_mode(11) async def run_command(*args): process = await asyncio.create_subprocess_exec(*args, stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE) @@ -66,24 +113,27 @@ async def button_press(gpio:int, level): PTT_IS_ON = True if(pi.read(gpio)==0): PTT_IS_ON = False - await asyncio.sleep(.5) - + await asyncio.sleep(.01) # async def frequency(gpio): # # TODO write this function after hooking up the encoder -async def main(freq:float): +async def main(): # TODO change after figuring out the logic task_created = False - - asyncio.create_task(rotary) + asyncio.create_task(rotary()) print("Ready") + cached_frequency = FREQUENCY + while True: - await button_press(gpio, level) + if FREQUENCY != cached_frequency: + cached_frequency = FREQUENCY + asyncio.create_task(run_command("./display", str(format(round(FREQUENCY,3), "7f")))) + await button_press(10, pigpio.EITHER_EDGE) if (PTT_IS_ON and not task_created): - asyncio.create_task(run_command(MODULATION, str(freq))) + asyncio.create_task(run_command(next(modulations), str(FREQUENCY))) task_created = True elif (task_created and not PTT_IS_ON): await asyncio.sleep(1) @@ -94,6 +144,6 @@ async def main(freq:float): if __name__ == "__main__": try: - asyncio.run(main("", 430)) + asyncio.run(main()) except KeyboardInterrupt: print("\n") diff --git a/rotary.py b/rotary.py index f55a4f0..4f4496c 100644 --- a/rotary.py +++ b/rotary.py @@ -1,42 +1,64 @@ -def next_band(): - global CURRENT_BAND - CURRENT_BAND = next(band) - counter = bands[CURRENT_BAND][0] - print(counter) - print(CURRENT_BAND) +from functools import wraps, partial +from RPi import GPIO +from time import sleep +from itertools import cycle - return counter +clkLastState = GPIO.input(clk) +counter = next_band() + + +bands = { + "80m":[3.5, 4], + "40m":[7, 7.3], + "20m":[14, 14.35], + "10m":[28, 29.7], + "2m":[144,146], + "70cm":[430,440] +} + +# Setup for encoder +band = cycle(bands) +CURRENT_BAND = None +step = 0.025 + + +def next_band(): + global CURRENT_BAND + CURRENT_BAND = next(band) + counter = bands[CURRENT_BAND][0] + print(counter) + print(CURRENT_BAND) + + return counter def prev_band(): - global CURRENT_BAND - CURRENT_BAND = list(bands.keys())[list(bands.keys()).index(CURRENT_BAND)-1] - print(CURRENT_BAND) - counter = bands[CURRENT_BAND][0] + 1 - return counter + global CURRENT_BAND + CURRENT_BAND = list(bands.keys())[list(bands.keys()).index(CURRENT_BAND)-1] + print(CURRENT_BAND) + counter = bands[CURRENT_BAND][0] + 1 + return counter -def main_loop(): +async def main_loop(clk, dt, sw): try: - counter = next_band() - while True: - clkState = GPIO.input(clk) - dtState = GPIO.input(dt) - swState = GPIO.input(sw) - if swState == GPIO.HIGH: - print("yeet") - if clkState != clkLastState: - if counter > bands[CURRENT_BAND][1]: - counter = next_band() - if counter < bands[CURRENT_BAND][0]: - counter = prev_band() - if dtState != clkState: - counter += step - else: - counter -= step - print(round(counter, 3)) - clkLastState = clkState - sleep(0.01) + clkState = GPIO.input(clk) + dtState = GPIO.input(dt) + swState = GPIO.input(sw) + if swState == GPIO.HIGH: + print("yeet") + if clkState != clkLastState: + if counter > bands[CURRENT_BAND][1]: + counter = next_band() + if counter < bands[CURRENT_BAND][0]: + counter = prev_band() + if dtState != clkState: + counter += step + else: + counter -= step + # print(round(counter, 3)) + clkLastState = clkState + sleep(0.01) except KeyboardInterrupt: - print("\nBye") + print("\nBye") finally: - print("AAAAA") - GPIO.cleanup() + print("AAAAA") + GPIO.cleanup()