-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathAlarmClock.py
235 lines (191 loc) · 6.83 KB
/
AlarmClock.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
from Clock import Clock
from datetime import timedelta, datetime
from threading import Thread
from time import sleep
class AlarmClock(Clock):
# default hardcoded option settings
_hrInc = 1 # hours
_minInc = 5 # minutes
_sleepTime = 2 # seconds
_snoozeTime = timedelta(minutes=5)
_snoozeAvailFor = timedelta(minutes=20)
# standard API functions
def __init__(self, action, snooze=None, off=None, *args):
# save arguments
self._action = action
self._off = off
self._snooze = snooze
# initialize status variables
self._enabled = False
self._sounding = False
self.lastSounded = datetime(1987, 11, 30, 0, 0)
# initialize alarm time
self.setTime()
def __repr__(self, *args):
return 'Alarm Set For ' + self.getTime()
# functions that manipulate the set time as a whole
def getTime(self, *args):
return self._setTime.strftime('%I:%M %p')
def setTime(self, time=None, hour=0, minute=0, *args):
if time is None:
hour = int(float(hour))
minute = int(float(minute))
time = datetime(1987, 11, 30, hour, minute)
self._setTime = time
# functions that manipulate the set hour
def getHour(self, *args):
return self._setTime.strftime('%I')
def setHour(self, val, *args):
val = int(float(val))
self._setTime = self._setTime.replace(hour=val)
return self.getHour()
def incHour(self, amount=None, *args):
if amount is None or amount is '':
inc_hours = self._hrInc
off_hours = int(self.getHour()) % inc_hours
self.incHour(amount=inc_hours - off_hours)
else:
amount = int(float(amount))
self._setTime += timedelta(hours=amount)
return self.getHour()
def decHour(self, amount=None, *args):
if amount is None or amount is '':
inc_hours = self._hrInc
off_hours = int(self.getHour()) % inc_hours
if off_hours == 0:
self.decHour(amount=inc_hours)
else:
self.decHour(amount=off_hours)
else:
amount = int(float(amount))
self._setTime -= timedelta(hours=amount)
return self.getHour()
# functions that manipulate the set minute
def getMinute(self, *args):
return self._setTime.strftime('%M')
def setMinute(self, val, *args):
val = int(float(val))
self._setTime = self._setTime.replace(minute=val)
return self.getMinute()
def incMinute(self, amount=None, *args):
if amount is None or amount is '':
inc_minutes = self._minInc
off_minutes = int(self.getMinute()) % inc_minutes
self.incMinute(amount=inc_minutes - off_minutes)
else:
amount = int(float(amount))
self._setTime += timedelta(minutes=amount)
return self.getMinute()
def decMinute(self, amount=None, *args):
if amount is None or amount is '':
inc_minutes = self._minInc
off_minutes = int(self.getMinute()) % inc_minutes
if off_minutes == 0:
self.decMinute(amount=inc_minutes)
else:
self.decMinute(amount=off_minutes)
else:
amount = int(float(amount))
self._setTime -= timedelta(minutes=amount)
return self.getMinute()
# functions that manipulate AM/PM
def getAmPm(self, *args):
return self._setTime.strftime('%p')
def setAmPm(self, val, *args):
if val.upper() in ['AM', 'PM']:
if val.upper() != self._setTime.strftime('%p'):
self.incHour(12)
return self.getAmPm()
def incAmPm(self, *args):
self.incHour(12)
return self.getAmPm()
def decAmPm(self, *args):
return self.incAmPm()
# alarm enabling and disabling
def enable(self, *args):
if not self._enabled:
self._enabled = True
Thread(target=self.__worker__).start()
def disable(self, *args):
self._enabled = False
def enabled(self, *args):
return self._enabled
# functions that manipulate the snooze feature
def snoozeAvailable(self, *args):
out = self._snooze is not None
out = out and \
(datetime.now() - self.lastSounded) < self._snoozeAvailFor
return out
def snooze(self, *args):
if self._snooze is not None:
if self.snoozeAvailable():
self._snooze()
self.setTime(self.nowPlus(self._snoozeTime))
self.enable()
else:
raise SnoozeNotAvailable()
else:
raise SnoozeNotSetup()
# functions that handle the alarm action itself
def alert(self, *args):
self._enabled = False
self.lastSounded = datetime.now()
self._action()
if self._off is not None:
self._sounding = True
def off(self, *args):
if self._off is not None:
if self._sounding:
self._off()
self._sounding = False
else:
raise AlarmNotSounding()
else:
raise AlarmOffNotSetup()
def sounding(self, *args):
return self._sounding
# private functions, not called directly
def __worker__(self, *args):
# wait to go off
while self._enabled and (self.now() != self.getTime()):
sleep(self._sleepTime)
if self._enabled:
# go off
self.alert()
# http interface to this class
http = {'time': {'hour':
{'get': getHour, 'set': setHour,
'inc': incHour, 'dec': decHour},
'minute':
{'get': getMinute, 'set': setMinute,
'inc': incMinute, 'dec': decMinute},
'ampm':
{'get': getAmPm, 'set': setAmPm,
'inc': incAmPm, 'dec': decAmPm},
'get': getTime},
'status': {'get': enabled, 'enabled': enabled,
'sounding': sounding, 'snoozeavail': snoozeAvailable},
'cmd': {'get': str, 'enable': enable, 'disable': disable,
'snooze': snooze, 'off': off},
'get': getTime}
# Dummy functions for a test alarm
def __dummyAction__():
print 'GOING OFF'
def __dummySnooze__():
print 'SNOOZE SET'
def __dummyOff__():
print 'ALARM TURNED OFF'
def __test__():
a = AlarmClock(action=__dummyAction__,
snooze=__dummySnooze__,
off=__dummyOff__)
return a
# Custom Exceptions
class SnoozeNotSetup(Exception):
pass
class SnoozeNotAvailable(Exception):
pass
class AlarmOffNotSetup(Exception):
pass
class AlarmNotSounding(Exception):
pass