diff --git a/pico-dashboard/hardware/buzzer.py b/pico-dashboard/hardware/buzzer.py index e69de29..936c227 100644 --- a/pico-dashboard/hardware/buzzer.py +++ b/pico-dashboard/hardware/buzzer.py @@ -0,0 +1,26 @@ +class Buzzer: + def __init__(self, pin=None): + self.pin = pin + self.enabled = False + self.pattern = None + + def on(self): + self.enabled = True + if self.pin: + self.pin.value(1) + + def off(self): + self.enabled = False + self.pattern = None + if self.pin: + self.pin.value(0) + + def set_pattern(self, pattern): + self.pattern = pattern + self.enabled = pattern is not None + + def update_from_alarm_view(self, alarm_view): + if alarm_view.should_buzz(): + self.set_pattern("critical") + else: + self.off() diff --git a/tests/test_pico_core.py b/tests/test_pico_core.py index 72d4195..26b1ea4 100644 --- a/tests/test_pico_core.py +++ b/tests/test_pico_core.py @@ -628,3 +628,43 @@ def test_alarm_view_model_sensor_failure(): assert alarm["severity"] == "warning" assert alarm["title"] == "Sensor Failure" assert alarm["detail"] == "Outside" + + +class FakePin: + def __init__(self): + self.values = [] + + def value(self, value): + self.values.append(value) + + +def test_buzzer_on_off(): + from hardware.buzzer import Buzzer + + pin = FakePin() + buzzer = Buzzer(pin) + + buzzer.on() + assert buzzer.enabled is True + assert pin.values[-1] == 1 + + buzzer.off() + assert buzzer.enabled is False + assert pin.values[-1] == 0 + + +def test_buzzer_updates_from_alarm_view(): + from hardware.buzzer import Buzzer + from ui.alarm_view_model import AlarmViewModel + + buzzer = Buzzer() + + buzzer.update_from_alarm_view(AlarmViewModel(["fridge_zone_1_high"])) + + assert buzzer.enabled is True + assert buzzer.pattern == "critical" + + buzzer.update_from_alarm_view(AlarmViewModel([])) + + assert buzzer.enabled is False + assert buzzer.pattern is None