diff --git a/credentials.txt b/credentials.txt new file mode 100644 index 0000000..ed3b07f --- /dev/null +++ b/credentials.txt @@ -0,0 +1 @@ +foo:bar \ No newline at end of file diff --git a/dummygpio.py b/dummygpio.py new file mode 100644 index 0000000..b9d2811 --- /dev/null +++ b/dummygpio.py @@ -0,0 +1,46 @@ +import time + +HIGH = True +LOW = False +IN = 0 +PUD_UP = None +DUMMY_FALLING_EDGE = "FALLING" +CHANGE_PIN_VALUE_AFTER = 8 # Transition to HIGH after 5 seconds +BCM = 0 +FALLING = None +pull_up_down = {PUD_UP: DUMMY_FALLING_EDGE} +state = HIGH +pin_last_change = {} + + +def setwarnings(value): + pass + + +def setmode(mode): + pass + + +def cleanup(): + pass + + +def setup(pin, direction, **kwargs): + pin_last_change[pin] = time.time() + + +def input(pin): + last_change = pin_last_change.get(pin, 0) + current = time.time() + + if current - last_change >= CHANGE_PIN_VALUE_AFTER: + pin_last_change[pin] = current + return HIGH + + return LOW + + +def add_event_detect(pin, edge, callback, **kwargs): + pin_last_change[pin] = time.time() + if edge == FALLING: + callback(pin) diff --git a/kukuc-clock.py b/kukuc-clock.py index b72d292..ba047b7 100644 --- a/kukuc-clock.py +++ b/kukuc-clock.py @@ -1,11 +1,18 @@ -import RPi.GPIO as GPIO +import signal +import sys import time from datetime import datetime import subprocess -import sys from slovak_datetime_formatter import get_datetime_as_slovak_sentence -BUTTON_TIMEOUT = 30 # pressing and holding the button longer then e.g. 2 seconds terminates playing +if len(sys.argv) > 1 and sys.argv[1] == "test": + import dummygpio as GPIO +else: + import RPi.GPIO as GPIO + +BUTTON_TIMEOUT = ( + 30 # pressing and holding the button longer then e.g. 2 seconds terminates playing +) PIN = 17 # listen to changes on this GPIO GPIO.setmode(GPIO.BCM) # use BCM pin layout GPIO.setwarnings(False) @@ -14,12 +21,14 @@ GPIO.setwarnings(False) def setup_pin(): GPIO.setup(PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP) + def terminate_playing(proc): print("Terminating playing...") proc.terminate() proc.wait(timeout=5) print("Terminated") + def play_presny_cas(): print("Playing presny_cas.wav") proc = subprocess.Popen(["aplay", "presny_cas.wav"]) @@ -27,20 +36,41 @@ def play_presny_cas(): print("GPIO went HIGH - terminating playing") terminate_playing(proc) + def play_beep(): print("Playing beep.wav") subprocess.call(["aplay", "beep.wav"]) + +def get_credentials(): + with open("credentials.txt") as f: + cred_line = f.readline().strip() + username, password = cred_line.split(":") + + return username, password + + def generate_presny_cas(): text = get_datetime_as_slovak_sentence(datetime.now()) - print(f"Generating presny_cas.wav for '{text}'") + print(f"Generating presny_cas.wav for '{text}' using a remote API call") + username, password = get_credentials() subprocess.call( [ - "curl", "--silent", "--get", "--data-urlencode", f"text={text}", "https://tts.virtonline.eu/api/tts", "--output", "presny_cas.wav", + "curl", + "--silent", + "-u", + f"{username}:{password}", + "--get", + "--data-urlencode", + f"text={text}", + "https://tts.virtonline.eu/api/tts", + "--output", + "presny_cas.wav", ] ) print("Generated presny_cas.wav") + def wait_for_button_release_or_timeout(pin, timeout): timeout_start = time.time() while time.time() < timeout_start + timeout: @@ -54,6 +84,15 @@ def handle_pin(pin): generate_presny_cas() play_presny_cas() + +def signal_handler(sig, frame): + print("Interrupt received, cleaning up!") + GPIO.cleanup() + sys.exit(0) + + +signal.signal(signal.SIGINT, signal_handler) + try: setup_pin() play_beep() @@ -62,8 +101,9 @@ try: print(f"Waiting for the GPIO {PIN} to go LOW...") while True: time.sleep(0.01) -except Exception: - print("Cought exception...") - sys.exit() + +except Exception as e: + print("Caught exception: ", e) + finally: GPIO.cleanup() diff --git a/presny_cas.wav b/presny_cas.wav index 1b87f41..1d416bf 100644 Binary files a/presny_cas.wav and b/presny_cas.wav differ