11 logging
.error('This program needs urwid')
17 logging
.error('This program needs pySerial')
20 class FuzzyAlarmClock
:
22 def __init__(self
,device
):
24 self
.serial
= serial
.Serial(device
,9600,timeout
=5)
25 except serial
.serialutil
.SerialException
:
26 logging
.warning('No such serial device {device}; mocking'.format(
29 self
.serial
= io
.StringIO()
34 def set_time_to_now(self
):
35 now
= 's'+datetime
.datetime
.now().strftime("%y%m%d%u%H%M%S")
36 self
.serial
.write(now
)
38 def read_alarms(self
,n
):
40 self
.serial
.flushInput()
41 self
.serial
.write('p')
43 data
.append(self
.serial
.readline())
45 data
[i
] = data
[i
].split(' ')[2:-1]
48 days
.append(bool(int(data
[i
][0]) & 2**j
))
49 days
= days
[7:8] + days
[:7]
50 data
[i
] = days
+data
[i
][1:]
53 def set_alarm(self
,alarm
,values
):
56 for i
,bit
in enumerate(values
[1:8] + values
[0:1]):
59 for val
in values
[8:]:
63 class ModEdit(urwid
.IntEdit
):
65 def __init__(self
,mod
,caption
="",default
=None,offset
=0):
69 super(ModEdit
,self
).__init
__(caption
,default
)
71 def insert_text(self
,text
):
72 super(ModEdit
,self
).insert_text(text
)
73 self
.set_edit_text(str((self
.value() - self
.offset
)% self
.mod
+self
.offset
))
78 def __init__(self
,aid
,fac
):
79 self
.w_aid
= urwid
.Text(str(aid
))
80 self
.w_repeat
= urwid
.CheckBox("")
81 self
.w_mon
= urwid
.CheckBox("")
82 self
.w_tue
= urwid
.CheckBox("")
83 self
.w_wed
= urwid
.CheckBox("")
84 self
.w_thu
= urwid
.CheckBox("")
85 self
.w_fri
= urwid
.CheckBox("")
86 self
.w_sat
= urwid
.CheckBox("")
87 self
.w_sun
= urwid
.CheckBox("")
88 self
.w_month
= ModEdit(12,offset
=1)
89 self
.w_day
= ModEdit(31,offset
=1)
90 self
.w_hour
= ModEdit(24,default
=0)
91 self
.w_minute
= ModEdit(60,default
=0)
93 self
.widgets
= urwid
.Columns([self
.w_aid
,
109 def set_values(self
,values
):
110 self
.w_repeat
.set_state(values
[0])
111 self
.w_mon
.set_state(values
[1])
112 self
.w_tue
.set_state(values
[2])
113 self
.w_wed
.set_state(values
[3])
114 self
.w_thu
.set_state(values
[4])
115 self
.w_fri
.set_state(values
[5])
116 self
.w_sat
.set_state(values
[6])
117 self
.w_sun
.set_state(values
[7])
118 self
.w_month
.set_edit_text(values
[8])
119 self
.w_day
.set_edit_text(values
[9])
120 self
.w_hour
.set_edit_text(values
[10])
121 self
.w_minute
.set_edit_text(values
[11])
123 def get_values(self
):
125 self
.w_repeat
.get_state(),
126 self
.w_mon
.get_state(),
127 self
.w_tue
.get_state(),
128 self
.w_wed
.get_state(),
129 self
.w_thu
.get_state(),
130 self
.w_fri
.get_state(),
131 self
.w_sat
.get_state(),
132 self
.w_sun
.get_state(),
133 self
.w_month
.value(),
136 self
.w_minute
.value(),
142 def __init__(self
,fac
):
147 self
.frame
= self
.build_ui()
148 self
.loop
= urwid
.MainLoop(self
.frame
,self
.palette
,unhandled_input
=self
.read_commands
)
152 ('header', 'light gray', 'dark blue'),
153 ('footer', 'dark cyan', 'black')
157 for i
in range(self
.alarm_number
):
158 self
.alarms
.append(Alarm(i
,self
.fac
))
160 alarm_headers
= urwid
.Columns([
175 self
.main_body
= urwid
.ListBox([alarm_headers
]+[al
.widgets
for al
in self
.alarms
])
177 footer
= urwid
.Text('a, b, c')
178 footer_map
= urwid
.AttrMap(footer
,'footer')
180 header
= urwid
.Text('q: Quit r: Read s: Set n: time=Now ?:Help')
181 header_map
= urwid
.AttrMap(header
,'header')
183 ui
= urwid
.Frame(self
.main_body
,footer
=footer_map
,header
=header_map
)
186 def read_commands(self
,cmd
):
187 {'n': self
.fac
.set_time_to_now
,
188 'r': self
.read_alarms
,
189 's': self
.set_alarms
,
190 '?': self
.print_help
,
192 }.get(cmd
,self
.do_nothing
)()
194 def do_nothing(self
):
197 def read_alarms(self
):
198 alarms
= self
.fac
.read_alarms(self
.alarm_number
)
200 for i
, al
in enumerate(alarms
):
201 self
.alarms
[i
].set_values(al
)
203 def set_alarms(self
):
204 for i
,alarm
in enumerate(self
.alarms
):
205 self
.fac
.set_alarm(i
,alarm
.get_values())
207 def print_help(self
):
211 raise urwid
.ExitMainLoop()
218 fac
= FuzzyAlarmClock('/dev/ttyUSB0')
222 if __name__
== '__main__': main()