diff options
author | Mark Powers <mark@marks.kitchen> | 2021-07-12 02:00:54 +0100 |
---|---|---|
committer | Mark Powers <mark@marks.kitchen> | 2021-07-12 02:00:54 +0100 |
commit | 1edb32ec29ca3c1bf4d1a53215ecb2544aa04a6e (patch) | |
tree | d770c0f3dd74dab11a5b13c54f37b14c81daa990 | |
parent | a981a50b0597498a9fc92249f93f940998455ca3 (diff) |
Refactor code to support phone hangup button
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | dial.py | 23 | ||||
-rw-r--r-- | events.py | 64 | ||||
-rw-r--r-- | hangup.py | 25 | ||||
-rwxr-xr-x | main.py | 26 | ||||
-rw-r--r-- | phone.py | 16 |
6 files changed, 119 insertions, 36 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0d20b64 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.pyc @@ -3,14 +3,17 @@ import time import RPi.GPIO as GPIO import threading +import events + BUTTON_GPIO = 25 REST_TIME = 0.3 # seconds DIAL_RESET_TIME = 5 # seconds class DialThread(threading.Thread): - def __init__(self, queue): + def __init__(self, queue, pressed): threading.Thread.__init__(self, args=(), kwargs=None) self.queue = queue + self.pressed = pressed self.daemon = True GPIO.setmode(GPIO.BCM) @@ -52,18 +55,9 @@ class DialManager: def _load_sequences(self): self.sequences = { - 0: "operator", - 1: { - 2: "test_multiple" - }, - 2: "weather", - 3: "horrorscope", - 4: "", - 5: "", - 6: "", - 7: "fortune", - 8: "", - 9: "" + 0: events.OperatorEvent(self), + 4: {1: {1: events.DirectoryEvent(self)}}, + 7: events.FortuneEvent(self), } print(self.sequences) @@ -90,3 +84,6 @@ class DialManager: return sequences[digit] return recursive_find(self.sequence, self.sequences) + def clear_sequence(self): + self.sequence = [] + diff --git a/events.py b/events.py new file mode 100644 index 0000000..77480b9 --- /dev/null +++ b/events.py @@ -0,0 +1,64 @@ +import subprocess +from datetime import datetime + +class Event(): + def __init__(self, dial_manager): + self.dial_manager = dial_manager + + def get_name(self): + return "generic event" + + def get_text(self): + return "event" + + def speak(self): + text = self.get_text() + print("speaking:", text) + subprocess.run(["espeak", text]) + +class FortuneEvent(Event): + def __init__(self, dial_manager): + super().__init__(dial_manager) + + def get_name(self): + return "fortune" + + def get_text(self): + res = subprocess.run(["fortune", "-s"], stdout=subprocess.PIPE) + return res.stdout.decode("utf-8") + +class DirectoryEvent(Event): + def __init__(self, dial_manager): + super().__init__(dial_manager) + + def get_name(self): + return "directory" + + def get_text(self): + def recursive_build(prefix, sequences): + sequence_list = [] + for key in sequences.keys(): + sequence = prefix+" "+str(key) + if isinstance(sequences[key], dict): + sequence_list += recursive_build(sequence, sequences[key]) + else: + sequence_list.append((sequence, sequences[key])) + return sequence_list + sequences = self.dial_manager.sequences + text = "" + for sequence, event in recursive_build("", sequences): + text += f"Dial {sequence} for {event.get_name()}. " + return text + + +class OperatorEvent(Event): + def __init__(self, dial_manager): + super().__init__(dial_manager) + + def get_name(self): + return "operator" + + def get_text(self): + now = datetime.now() + return f"Right now, it is {now.hour} {now.minute}. Dial 4 1 1 for directory." + diff --git a/hangup.py b/hangup.py new file mode 100644 index 0000000..2bfb1a7 --- /dev/null +++ b/hangup.py @@ -0,0 +1,25 @@ +import RPi.GPIO as GPIO +import threading +import time + +BUTTON_GPIO = 24 + +class HangUpThread(threading.Thread): + def __init__(self, phone_held, dial_manager): + threading.Thread.__init__(self, args=(), kwargs=None) + self.phone_held = phone_held + self.dial_manager = dial_manager + self.daemon = True + + GPIO.setmode(GPIO.BCM) + GPIO.setup(BUTTON_GPIO, GPIO.IN, pull_up_down=GPIO.PUD_UP) + + def run(self): + while True: + if not GPIO.input(BUTTON_GPIO): + self.phone_held.clear() + self.dial_manager.clear_sequence() + else: + self.phone_held.set() + time.sleep(0.1) + @@ -1,24 +1,36 @@ #!/usr/bin/env python3 from dial import DialManager, DialThread -from phone import PhoneManager +from hangup import HangUpThread from time import sleep from queue import Queue +from threading import Event if __name__ == "__main__": queue = Queue() - dial_thread = DialThread(queue) - print("starting thread") - dial_thread.start() + phone_held = Event() + + # start phone as on hook + phone_held.clear() + dial_thread = DialThread(queue, phone_held) + print("starting dial thread") + dial_thread.start() dial_manager = DialManager() - phone_manager = PhoneManager() + + hang_up_thread = HangUpThread(phone_held, dial_manager) + print("starting hang up thread") + hang_up_thread.start() print("main loop") while True: - dialed = queue.get(block=True) + phone_held.wait() + try: + dialed = queue.get(block=True, timeout=0.1) + except: + continue response = dial_manager.dial(dialed) if response is not None: - phone_manager.handle_event(response) + response.speak() diff --git a/phone.py b/phone.py deleted file mode 100644 index 59b9cfb..0000000 --- a/phone.py +++ /dev/null @@ -1,16 +0,0 @@ -import subprocess - -class PhoneManager: - def handle_event(self, event): - print("handling event", event) - if event == "fortune": - res = subprocess.run(["fortune"], stdout=subprocess.PIPE) - output = res.stdout.decode("utf-8") - self.speak(output) - else: - self.speak(event) - - - def speak(self, text): - print("speaking:", text) - subprocess.run(["espeak", text]) |