Add alarm_settings object

This commit is contained in:
Admar Schoonen 2023-01-05 22:02:22 +01:00
parent 0caf080d6a
commit 59133f275d
1 changed files with 84 additions and 52 deletions

136
clock.py
View File

@ -55,27 +55,36 @@ def play_sound(source):
print("beep beep!")
playsound(source)
class MyClockWidget(FloatLayout):
class AlarmSettings():
set_alarm_mode = False
alarm_time = datetime.datetime(2022, 12, 10, 7, 30, 0, 0)
alarm_activated = False
grabbed = ""
face_numbers = []
set_alarm_timeout_counter = 0
alarm_modified = False
seconds_to_next_alarm = 0
led_color = [0, 0, 0]
# sound_source = "https://icecast.omroep.nl/radio1-bb-mp3"
sound_source = "Woodpecker Chirps - QuickSounds.com.mp3"
seconds_to_sunrise = 30 * 60
class MyClockWidget(FloatLayout):
grabbed = ""
face_numbers = []
# if not grabbed, set_alarm_timeout_counter is incremented at every update call (ie: 60 Hz);
# this is used to blink the hands at 1 Hz when setting the alarm and releasing the hand
set_alarm_timeout_counter = 0
seconds_to_next_alarm = 0
led_color = [0, 0, 0]
def draw_face(self):
"""
Add number labels when added in widget hierarchy
"""
if self.set_alarm_mode:
time = self.alarm_time
alarm_settings = App.get_running_app().alarm_settings
if alarm_settings.set_alarm_mode:
time = alarm_settings.alarm_time
else:
time = datetime.datetime.now()
@ -96,8 +105,10 @@ class MyClockWidget(FloatLayout):
self.ids["face"].add_widget(self.face_numbers[i - 1])
def update_face(self):
if self.set_alarm_mode:
time = self.alarm_time
alarm_settings = App.get_running_app().alarm_settings
if alarm_settings.set_alarm_mode:
time = alarm_settings.alarm_time
else:
time = datetime.datetime.now()
@ -127,7 +138,10 @@ class MyClockWidget(FloatLayout):
def update_set_alarm_button(self):
set_alarm_button = self.ids["set_alarm_button"]
if self.set_alarm_mode or self.alarm_activated:
app = App.get_running_app()
alarm_settings = app.alarm_settings
if alarm_settings.set_alarm_mode or alarm_settings.alarm_activated:
source = 'alarm_on.png'
rgb = [0.9, 0.0, 0.0]
else:
@ -141,8 +155,10 @@ class MyClockWidget(FloatLayout):
Rectangle(size=set_alarm_button.size, pos=set_alarm_button.pos, source=source)
def sun_rise(self):
alarm_settings = App.get_running_app().alarm_settings
# to do: calculate brightness and color according to sun rise instead of linear increment
intensity = math.floor((1.0 - self.seconds_to_next_alarm / self.seconds_to_sunrise) * 256.0)
intensity = math.floor((1.0 - self.seconds_to_next_alarm / alarm_settings.seconds_to_sunrise) * 256.0)
if intensity < 0:
intensity = 0
@ -154,33 +170,38 @@ class MyClockWidget(FloatLayout):
self.led_color = led_color
def check_sun_rise(self):
if self.alarm_activated == False:
alarm_settings = App.get_running_app().alarm_settings
if alarm_settings.alarm_activated == False:
return
if self.seconds_to_next_alarm < self.seconds_to_sunrise:
if self.seconds_to_next_alarm < alarm_settings.seconds_to_sunrise:
self.sun_rise()
def check_play_sound(self):
global sound_process
alarm_settings = App.get_running_app().alarm_settings
if self.alarm_activated == False:
if alarm_settings.alarm_activated == False:
return
if self.seconds_to_next_alarm < 0.1 and sound_process is None:
sound_process = Process(target=play_sound, args=(self.sound_source,))
sound_process = Process(target=play_sound, args=(alarm_settings.sound_source,))
sound_process.start()
def calc_seconds_to_next_alarm(self):
if self.alarm_activated == False:
alarm_settings = App.get_running_app().alarm_settings
if alarm_settings.alarm_activated == False:
return
# Make sure alarm_time is in the future but not more than 24 h from now
now = datetime.datetime.now()
d = self.alarm_time - now
self.alarm_time -= datetime.timedelta(days=d.days)
d = alarm_settings.alarm_time - now
alarm_settings.alarm_time -= datetime.timedelta(days=d.days)
# Calculate number of seconds until next alarm
d = self.alarm_time - now
d = alarm_settings.alarm_time - now
self.seconds_to_next_alarm = d.days * 24 * 3600 + d.seconds + d.microseconds / 1000000.0
def check_alarm(self):
@ -193,8 +214,9 @@ class MyClockWidget(FloatLayout):
"""
Redraw clock hands
"""
if self.set_alarm_mode:
time = self.alarm_time
alarm_settings = App.get_running_app().alarm_settings
if alarm_settings.set_alarm_mode:
time = alarm_settings.alarm_time
else:
time = datetime.datetime.now()
@ -208,10 +230,9 @@ class MyClockWidget(FloatLayout):
hands.canvas.clear()
with hands.canvas:
if self.set_alarm_mode:
# if not grabbed, set_alarm_timeout_counter is incremented at every update call (ie: 60 Hz);
# this is used to blink the hands at 1 Hz when setting the alarm and releasing the hand
if self.grabbed != "" or self.set_alarm_timeout_counter < 1 * 60 or self.set_alarm_timeout_counter % 60 <= 30 or self.alarm_modified == False:
if alarm_settings.set_alarm_mode:
if self.grabbed != "" or self.set_alarm_timeout_counter < 1 * 60 or \
self.set_alarm_timeout_counter % 60 <= 30 or alarm_settings.alarm_modified == False:
Color(0.9, 0.0, 0.0)
Line(points=[hands.center_x, hands.center_y, hours_hand.x, hours_hand.y], width=3, cap="round")
Color(0.8, 0.0, 0.0)
@ -221,12 +242,12 @@ class MyClockWidget(FloatLayout):
self.set_alarm_timeout_counter += 1
if self.set_alarm_timeout_counter >= 4 * 60 + 30:
self.set_alarm_mode = False
alarm_settings.set_alarm_mode = False
self.set_alarm_timeout_counter = 0
if self.alarm_modified:
self.alarm_activated = True
self.alarm_modified = False
if alarm_settings.alarm_modified:
alarm_settings.alarm_activated = True
alarm_settings.alarm_modified = False
else:
Color(0.9, 0.9, 0.9)
Line(points=[hands.center_x, hands.center_y, hours_hand.x, hours_hand.y], width=3, cap="round")
@ -236,28 +257,32 @@ class MyClockWidget(FloatLayout):
Line(points=[hands.center_x, hands.center_y, seconds_hand.x, seconds_hand.y], width=1, cap="round")
def on_alarm_button_pressed(self):
self.alarm_modified = False
alarm_settings = App.get_running_app().alarm_settings
alarm_settings.alarm_modified = False
self.set_alarm_timeout_counter = 0
if self.set_alarm_mode:
self.set_alarm_mode = False
self.alarm_activated = False
if alarm_settings.set_alarm_mode:
alarm_settings.set_alarm_mode = False
alarm_settings.alarm_activated = False
else:
self.set_alarm_mode = True
self.alarm_activated = True
alarm_settings.set_alarm_mode = True
alarm_settings.alarm_activated = True
def on_touch_up(self, touch):
self.grabbed = ""
if self.set_alarm_mode and (self.grabbed == "hour" or self.grabbed == "minute"):
alarm_settings = App.get_running_app().alarm_settings
if alarm_settings.set_alarm_mode and (self.grabbed == "hour" or self.grabbed == "minute"):
self.set_alarm_timeout_counter = 0
def on_touch_move(self, touch):
alarm_settings = App.get_running_app().alarm_settings
self.alarm_set_timeout = 0
x = touch.pos[0] - self.size[0]/2
y = touch.pos[1] - self.size[1]/2
angle = math.atan2(y, x) / math.pi; # angle is between -1 and 1
if self.grabbed == "minute":
self.alarm_modified = True
alarm_settings.alarm_modified = True
self.set_alarm_timeout_counter = 0
minute = round(-angle * 30 + 15)
if minute < 0:
@ -266,10 +291,10 @@ class MyClockWidget(FloatLayout):
minute = 59
# hour correction
hour = self.alarm_time.hour
if self.alarm_time.minute >= 55 and minute <= 5:
hour = alarm_settings.alarm_time.hour
if alarm_settings.alarm_time.minute >= 55 and minute <= 5:
hour += 1
elif self.alarm_time.minute <= 5 and minute >= 55:
elif alarm_settings.alarm_time.minute <= 5 and minute >= 55:
hour -= 1
if hour == 24:
@ -277,10 +302,11 @@ class MyClockWidget(FloatLayout):
elif hour == -1:
hour = 23
self.alarm_time = datetime.datetime(self.alarm_time.year, self.alarm_time.month, self.alarm_time.day, \
hour, minute, self.alarm_time.second, 0)
alarm_settings.alarm_time = datetime.datetime(alarm_settings.alarm_time.year, \
alarm_settings.alarm_time.month, alarm_settings.alarm_time.day, \
hour, minute, alarm_settings.alarm_time.second, 0)
elif self.grabbed == "hour":
self.alarm_modified = True
alarm_settings.alarm_modified = True
self.set_alarm_timeout_counter = 0
hour = round(-angle * 6 + 3)
if hour < 0:
@ -288,38 +314,42 @@ class MyClockWidget(FloatLayout):
if hour == 12:
hour = 0
if self.alarm_time.hour >= 12:
if alarm_settings.alarm_time.hour >= 12:
hour += 12
# AM / PM correction
if self.alarm_time.hour == 11 and hour == 0:
if alarm_settings.alarm_time.hour == 11 and hour == 0:
hour = 12
elif self.alarm_time.hour == 23 and hour == 12:
elif alarm_settings.alarm_time.hour == 23 and hour == 12:
hour = 0
elif self.alarm_time.hour == 0 and hour == 11:
elif alarm_settings.alarm_time.hour == 0 and hour == 11:
hour = 23
elif self.alarm_time.hour == 12 and hour == 23:
elif alarm_settings.alarm_time.hour == 12 and hour == 23:
hour = 11
# AM / PM boundary
self.alarm_time = datetime.datetime(self.alarm_time.year, self.alarm_time.month, self.alarm_time.day, \
hour, self.alarm_time.minute, self.alarm_time.second, 0)
alarm_settings.alarm_time = datetime.datetime(alarm_settings.alarm_time.year, \
alarm_settings.alarm_time.month, alarm_settings.alarm_time.day, \
hour, alarm_settings.alarm_time.minute, alarm_settings.alarm_time.second, 0)
def on_touch_down(self, touch):
global sound_process
time = self.alarm_time
alarm_settings = App.get_running_app().alarm_settings
time = alarm_settings.alarm_time
hands = self.ids["hands"]
minutes_hand = self.position_on_clock(time.minute/60+time.second/3600, length=0.40*hands.size[0])
hours_hand = self.position_on_clock(time.hour/12 + time.minute/720, length=0.35*hands.size[0])
self.grabbed = ""
app = App.get_running_app()
alarm_settings = app.alarm_settings
if (0.85 <= touch.spos[0] <= 0.95) and (0.05 <= touch.spos[1] <= 0.15):
self.on_alarm_button_pressed()
elif sound_process is not None:
kill_sound_process()
elif self.set_alarm_mode:
elif alarm_settings.set_alarm_mode:
self.set_alarm_timeout_counter = 0
if (minutes_hand.x - 0.1 * self.size[0] <= touch.pos[0] <= minutes_hand.x + 0.1 * self.size[0]) and \
(minutes_hand.y - 0.1 * self.size[1] <= touch.pos[1] <= minutes_hand.y + 0.1 * self.size[1]):
@ -329,6 +359,8 @@ class MyClockWidget(FloatLayout):
self.grabbed = "hour"
class MyApp(App):
alarm_settings = AlarmSettings()
def build(self):
clock_widget = MyClockWidget()
# update initially, just after construction of the widget is complete