summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bin/source/hardware_driver.py68
-rw-r--r--bin/source/main.py183
2 files changed, 251 insertions, 0 deletions
diff --git a/bin/source/hardware_driver.py b/bin/source/hardware_driver.py
new file mode 100644
index 0000000..1afb219
--- /dev/null
+++ b/bin/source/hardware_driver.py
@@ -0,0 +1,68 @@
+from smbus2 import SMBus
+from time import sleep
+
+ALIGN_FUNC = {"left": "ljust", "right": "rjust", "center": "center"}
+CLEAR_DISPLAY = 0x01
+ENABLE_BIT = 0b00000100
+LINES = {1: 0x80, 2: 0xC0, 3: 0x94, 4: 0xD4}
+
+LCD_BACKLIGHT = 0x08
+LCD_NOBACKLIGHT = 0x00
+
+
+class LCD(object):
+
+ def __init__(self, address=0x27, bus=1, width=20, rows=4, backlight=True):
+ self.address = address
+ self.bus = SMBus(bus)
+ self.delay = 0.0005
+ self.rows = rows
+ self.width = width
+ self.backlight_status = backlight
+
+ self.write(0x33)
+ self.write(0x32)
+ self.write(0x06)
+ self.write(0x0C)
+ self.write(0x28)
+ self.write(CLEAR_DISPLAY)
+ sleep(self.delay)
+
+ def _write_byte(self, byte):
+ self.bus.write_byte(self.address, byte)
+ self.bus.write_byte(self.address, (byte | ENABLE_BIT))
+ sleep(self.delay)
+ self.bus.write_byte(self.address, (byte & ~ENABLE_BIT))
+ sleep(self.delay)
+
+ def write(self, byte, mode=0):
+ backlight_mode = LCD_BACKLIGHT if self.backlight_status else LCD_NOBACKLIGHT
+ self._write_byte(mode | (byte & 0xF0) | backlight_mode)
+ self._write_byte(mode | ((byte << 4) & 0xF0) | backlight_mode)
+
+ def text(self, text, line, align="left"):
+ self.write(LINES.get(line, LINES[1]))
+ text, other_lines = self.get_text_line(text)
+ text = getattr(text, ALIGN_FUNC.get(align, "ljust"))(self.width)
+ for char in text:
+ self.write(ord(char), mode=1)
+ if other_lines and line <= self.rows - 1:
+ self.text(other_lines, line + 1, align=align)
+
+ def backlight(self, turn_on=True):
+ self.backlight_status = turn_on
+ self.write(0)
+
+ def get_text_line(self, text):
+ line_break = self.width
+ if len(text) > self.width:
+ line_break = text[: self.width + 1].rfind(" ")
+ if line_break < 0:
+ line_break = self.width
+ return text[:line_break], text[line_break:].strip()
+
+ def clear(self):
+ self.write(CLEAR_DISPLAY)
+
+ def read(self):
+ self._read_i2c_block_data
diff --git a/bin/source/main.py b/bin/source/main.py
new file mode 100644
index 0000000..bf556ca
--- /dev/null
+++ b/bin/source/main.py
@@ -0,0 +1,183 @@
+import time
+import os
+import speech_recognition as speech
+import sounddevice
+import bin.hardware_driver as lcd
+from gpiozero import CPUTemperature
+
+ERROR_BAD_REQUEST = "400 Bad Request"
+ERROR_UNAUTHORIZED = "401 Unauthorized"
+ERROR_NOT_FOUND = "404 Not Found"
+SPEECH_NOT_RECOGNIZED = "404-1 Speech is not recognized"
+ERROR_TIMEOUT = "408 Request Timeout"
+
+lcd_instance = lcd.LCD()
+cpu_temp = CPUTemperature()
+recognizer = speech.Recognizer()
+microphone = speech.Microphone()
+
+
+# greeting that starts upon the boot of the device:
+# shows a hello line; shorter than 16 chars
+# and some small information on the second line
+def custom_greeting():
+ with open('quotes.txt', 'r') as file:
+ quotes = file.readlines()
+
+ # Strip newline characters and use the quotes
+ quotes = [quote.strip() for quote in quotes]
+
+ # Print the quotes
+ for quote in quotes:
+ print(quote)
+ first_line = ""
+ second_line = ""
+ count = 0
+ for i in quote:
+ if count < 16:
+ first_line += i
+ count += 1
+ else:
+ second_line += i
+ lcd.text(first_line,1)
+ lcd.text(secon_line,2)
+def pomodoro():
+ time = input("How long do you want to wait? : ")
+ print("Okay \nStarting Now...")
+ while time > 0:
+ time.sleep(1)
+ print(time + "Seconds")
+ lcd.text(time + " Seconds remaining...", 1)
+ time -= 1
+
+
+def weather():
+ pass
+
+
+# ram usage, internet speed,
+def system_readings():
+ lcd_instance.clear()
+ while True:
+ load = os.getloadavg()[0]
+ temperature = cpu_temp.temperature
+ lcd_instance.clear()
+ lcd_instance.text(f"CPU Load: {load}", 1)
+ lcd_instance.text(f"Temp: {temperature:.1f}C", 2)
+ time.sleep(5)
+
+
+def display_uptime():
+ lcd_instance.clear()
+ with open("/proc/uptime") as f:
+ uptime_seconds = float(f.readline().split()[0])
+ uptime_str = time.strftime("%H:%M:%S", time.gmtime(uptime_seconds))
+ lcd_instance.clear()
+ lcd_instance.text(f"Uptime: {uptime_str}", 1, "center")
+
+
+def recognize_speech():
+
+ lcd_instance.clear()
+ try:
+ with microphone as source:
+ recognizer.adjust_for_ambient_noise(source)
+ print("Listening...")
+ audio = recognizer.listen(source)
+ text = recognizer.recognize_google(audio)
+ lcd_instance.clear()
+ lcd_instance.text(text, 1)
+
+ print("Speech recognized:", text)
+ except speech.UnknownValueError:
+ lcd_instance.text(ERROR_BAD_REQUEST, 1)
+ print(ERROR_BAD_REQUEST)
+ except speech.RequestError:
+ lcd_instance.text(ERROR_UNAUTHORIZED, 1)
+ print(ERROR_UNAUTHORIZED)
+
+ return text
+
+
+def save_notes():
+ print("Type your notes (type 'stop' to exit):")
+ print("Type line=1 or line=2 to print something to a specific line")
+ while True:
+ line = 1
+ output = input(":")
+ output_length = len(output)
+ if output.lower() in ["stop", "break", "quit", "exit"]:
+ break
+ if output == "line=1":
+ line = 1
+ elif output == "line=2":
+ line = 2
+
+ if output_length < 16:
+ lcd_instance.text(output, line)
+ time.sleep(2)
+ else:
+ output_list = output.split("")
+ first_line = ""
+ second_line = ""
+ for i in output_list:
+ count = 0
+ if count > 16:
+ first_line += output_list[i]
+ count += 1
+ else:
+ second_line += output_list[i]
+ lcd.text(first_line,1)
+ lcd.text(secon_line,2)
+
+def command_center(commands):
+ # checking if we can reconize commands within the user speech
+ # requires ->
+ # converting the commands to human readable text
+ # no under scars
+ command = recognize_speech()
+ list = []
+ try:
+ for i in commands:
+ if i == command:
+ print("I think i found what you ment...")
+ command()
+ except:
+ print("ERROR 404 - COMMAND NOT RECOGNIZED")
+
+
+FEATURES = {
+ "READINGS": system_readings,
+ "UPTIME": display_uptime,
+ "SPEECH_TRANSCRIBER": recognize_speech,
+ "NOTES": save_notes,
+ "COMMAND CENTER": command_center,
+ }
+
+
+def main():
+ lcd_instance.clear()
+ os.system("cls" if os.name == "nt" else "clear")
+ print("FEATURES:", ", ".join(FEATURES.keys()))
+
+ while True:
+ user_input = input("Enter command: ").upper()
+ action = FEATURES.get(user_input)
+
+ if action:
+ action()
+ else:
+ lcd_instance.text(ERROR_NOT_FOUND, 1)
+ print(ERROR_NOT_FOUND)
+
+
+def destroy():
+ lcd_instance.clear()
+ os.system("cls" if os.name == "nt" else "clear")
+
+
+if __name__ == "__main__":
+ try:
+ main()
+ except KeyboardInterrupt:
+ destroy()