Skip to content
Snippets Groups Projects
alarm.py 1.64 KiB
Newer Older
SurajSSingh's avatar
SurajSSingh committed
from enum import Enum, auto
from datetime import time, datetime
from typing import Optional
SurajSSingh's avatar
SurajSSingh committed


class AlarmState(Enum):
    SET = auto(),
    RUNNING = auto(),
    PLAYING = auto(),
    SNOOZED = auto(),
    DEACTIVATED = auto(),


class BaseAlarmClock:
    _current_state: AlarmState
    _wake_time: datetime
    def __init__(self, wake_time: Optional[datetime] = None):
        self._wake_time = wake_time if wake_time else datetime.utcnow()
SurajSSingh's avatar
SurajSSingh committed
        self._current_state = AlarmState.DEACTIVATED

    @property
    def current_state(self):
        return self._current_state

    @property
    def wake_time(self):
        return self._wake_time

    def set_alarm(self, wake_time: datetime) -> datetime:
        # print(f"SETTING ALARM to: {wake_time}")
SurajSSingh's avatar
SurajSSingh committed
        self._current_state = AlarmState.SET
        self._wake_time = wake_time
        return self._wake_time

    def start_alarm(self) -> None:
        # print("STARTING ALARM")
SurajSSingh's avatar
SurajSSingh committed
        self._current_state = AlarmState.RUNNING

    def sound_alarm(self) -> None:
        # print("SOUNDING ALARM")
SurajSSingh's avatar
SurajSSingh committed
        self._current_state = AlarmState.PLAYING

    def snooze_alarm(self) -> None:
        # print("SNOOZING ALARM")
SurajSSingh's avatar
SurajSSingh committed
        self._current_state = AlarmState.SNOOZED

    def stop_alarm(self, deactivate: bool = True) -> None:
        # print("STOPPING ALARM")
        # if self._current_state is AlarmState.PLAYING:
        #     print("STOPPED PLAYING ALARM")
SurajSSingh's avatar
SurajSSingh committed
        self._current_state = AlarmState.DEACTIVATED if deactivate else AlarmState.SET

    def alarm_check_reached(self, current_time: datetime) -> bool:
SurajSSingh's avatar
SurajSSingh committed
        return current_time >= self._wake_time if self._current_state is AlarmState.RUNNING else False