Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 22 additions & 10 deletions src/buttons.py
Original file line number Diff line number Diff line change
@@ -1,17 +1,29 @@
from lib.button import Button
from machine import Pin


class ButtonsInterface:
def __init__(self, left_button_pin: int, right_button_pin: int):
self.__left_button = Button(left_button_pin, internal_pullup=True)
self.__right_button = Button(right_button_pin, internal_pullup=True)
self.__left_button = Pin(left_button_pin, Pin.IN, Pin.PULL_UP)
self.__right_button = Pin(right_button_pin, Pin.IN, Pin.PULL_UP)

def update(self) -> None:
self.__left_button.update()
self.__right_button.update()
self.__left_button.irq(trigger=Pin.IRQ_FALLING, handler=self.__set_left_button_pressed)
self.__right_button.irq(trigger=Pin.IRQ_FALLING, handler=self.__set_right_button_pressed)

def is_left_button_pressed(self) -> bool:
return self.__left_button.active
self.__left_button_pressed = False
self.__right_button_pressed = False

def is_right_button_pressed(self) -> bool:
return self.__right_button.active
def __set_left_button_pressed(self, pin):
self.__left_button_pressed = True

def __set_right_button_pressed(self, pin):
self.__right_button_pressed = True

def was_left_button_pressed(self):
return self.__left_button_pressed

def was_right_button_pressed(self):
return self.__right_button_pressed

def reset(self):
self.__left_button_pressed = False
self.__right_button_pressed = False
1 change: 1 addition & 0 deletions src/display.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ def __init__(self, index: int, data: bytearray):
class Symbols:
TICK = Symbol(0, bytearray([0x00, 0x00, 0x01, 0x02, 0x14, 0x08, 0x00, 0x00]))
CROSS = Symbol(1, bytearray([0x00, 0x00, 0x11, 0x0A, 0x04, 0x0A, 0x11, 0x00]))
NOTE = Symbol(2, bytearray([0x00, 0x0F, 0x09, 0x09, 0x19, 0x1B, 0x03, 0x00]))


class DisplayInterface:
Expand Down
39 changes: 0 additions & 39 deletions src/lib/button.py

This file was deleted.

53 changes: 39 additions & 14 deletions src/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,21 +8,29 @@
from rfid import RFIDInterface


class Track:
def __init__(self, id: str, name: str):
self.id = id
self.name = name


class App:
def __init__(self):
self.__display = DisplayInterface(sda_pin=0, scl_pin=1)
self.__api = ApiInterface()
self.__buttons = ButtonsInterface(left_button_pin=12, right_button_pin=13)
self.__buzzer = BuzzerInterface(pin=11)
self.__rfid = RFIDInterface(sda_pin=15, sck_pin=18, mosi_pin=19, miso_pin=16, rst_pin=14)
self.__last_rfid_successful_read_time = 0
self.__rfid_read_delay = 2

self.__music = {
4117885779: "3uMUdlo47oEes3kgL4T4EC",
4233351011: "5UW6yvwo3nVA609NgprdhK"
self.__tracks = {
4117885779: Track(id="3uMUdlo47oEes3kgL4T4EC", name="Nonstop"),
4233351011: Track(id="5UW6yvwo3nVA609NgprdhK", name="Supermarket")
}

def run(self) -> None:
self.__display.print_centered("Music Box", line=1)
self.__display.print_centered(f"{chr(Symbols.NOTE.index)} Music Box {chr(Symbols.NOTE.index)}", line=1)
self.__display.print_centered("Initializing...", line=2)

self.__connect_to_wifi()
Expand All @@ -31,24 +39,41 @@ def run(self) -> None:
self.__display_current_device()

while True:
self.__buttons.update()

if self.__buttons.is_left_button_pressed():
if self.__buttons.was_left_button_pressed():
self.__display.print("Loading...", line=2, clear_line=True)
current_device_data = self.__api.previous_device()
self.__change_device(current_device_data)
self.__buttons.reset()

if self.__buttons.is_right_button_pressed():
if self.__buttons.was_right_button_pressed():
self.__display.print("Loading...", line=2, clear_line=True)
current_device_data = self.__api.next_device()
self.__change_device(current_device_data)
self.__buttons.reset()

if time.time() - self.__last_rfid_successful_read_time > self.__rfid_read_delay:
card_id = self.__rfid.read_card_id()

if not card_id:
continue

self.__display.print("Reading card...", line=2, clear_line=True)

if card_id not in self.__tracks:
self.__display.print(f"{chr(Symbols.CROSS.index)} Unknown card", line=2, clear_line=True)
self.__buzzer.play_failure()
time.sleep(1)
self.__display_current_device()
continue

track = self.__tracks[card_id]
self.__api.play(track.id)
self.__display.print(f"{chr(Symbols.NOTE.index)} {track.name}", line=2, clear_line=True)
self.__buzzer.play_success()
time.sleep(1)
self.__display_current_device()

card_id = self.__rfid.read_card_id()
if card_id:
print(self.__music[card_id])
self.__api.play(self.__music[card_id])
print("Playing")
time.sleep(5)
self.__last_rfid_successful_read_time = time.time()

def __connect_to_wifi(self) -> None:
self.__display.print_centered("WiFi", line=2)
Expand Down
12 changes: 8 additions & 4 deletions src/rfid.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,11 @@ def __init__(self, sda_pin: int, sck_pin: int, mosi_pin: int, miso_pin: int, rst
def read_card_id(self):
self.__rfid.init()
(stat, tag_type) = self.__rfid.request(self.__rfid.REQIDL)
if stat == self.__rfid.OK:
(stat, uid) = self.__rfid.SelectTagSN()
if stat == self.__rfid.OK:
return int.from_bytes(bytes(uid), "little", False)
if stat != self.__rfid.OK:
return None

(stat, uid) = self.__rfid.SelectTagSN()
if stat != self.__rfid.OK:
return None

return int.from_bytes(bytes(uid), "little", False)