-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathswitchStateMachine.py
More file actions
97 lines (72 loc) · 2.37 KB
/
switchStateMachine.py
File metadata and controls
97 lines (72 loc) · 2.37 KB
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
from state import State
import threading
class Unknown(State):
def on_event(self, event):
if event == 'off':
return Off()
elif event == 'on':
return On()
return self
class On(State):
def __on_entry__(self):
pass
def on_event(self, event):
if event == 'off':
return Off()
elif event == 'brightness_move_up':
return HoldIncrement()
elif event == 'brightness_move_down':
return HoldDecrement()
return self
class Off(State):
def __on_entry__(self):
sendOffCommand()
def on_event(self, event):
if event == 'on':
sendApiCommand('PL=1')
return On()
elif event == 'brightness_move_up':
sendApiCommand('PL=1&A=1')
return HoldIncrement()
return self
class DeIncrement(State):
def __on_entry__(self):
self.do_run = True
self.n_runs = 0
self.thread = threading.Thread(target=self.thread_inc)
self.thread.start()
def on_event(self, event):
if event == 'brightness_stop':
self.do_run = False
self.thread.join()
return On()
return self
def thread_inc(self):
if self.do_run and self.n_runs < 30:
threading.Timer(0.15, self.thread_inc).start()
sendIncrementCommand(self.inc_multiplier * min(self.n_runs + 1, 5))
self.n_runs += 1
class HoldIncrement(DeIncrement):
def __on_entry__(self):
self.inc_multiplier = 2
DeIncrement.__on_entry__(self)
class HoldDecrement(DeIncrement):
def __on_entry__(self):
self.inc_multiplier = -2
DeIncrement.__on_entry__(self)
class SwitchStateMachine(object):
def __init__(self):
# Start with a default state.
self.state = Unknown()
def on_event(self, event):
# The next state will be the result of the on_event function.
self.state = self.state.on_event(event)
if __name__ == "__main__":
import time
from mockCmd import *
eventList = ['off', 'on', '', '', 'brightness_move_up', '', '', 'brightness_stop', 'off', 'off', 'off', 'on',
'brightness_move_down', '', 'brightness_stop', 'on', 'off', 'on', 'giberish']
sm = SwitchStateMachine()
for ev in eventList:
sm.on_event(ev)
time.sleep(0.5)