8
8
9
9
10
10
class WorkerState (enum .Enum ):
11
- START = 0x0000
12
- LISTEN_TO_CLIENT = 0x0001
13
- LISTEN_TO_SERIAL = 0x0002
11
+ STARTUP = 0x00
12
+ RESTART = 0x01
13
+ SHUTDOWN = 0x02
14
+ LISTEN_TO_SOURCES = 0x03
15
+ LISTEN_TO_CLIENT = 0x04
16
+ LISTEN_TO_SERIAL = 0x05
14
17
15
18
16
19
class Worker (threading .Thread ):
17
20
logger = config .get_logger ("worker" )
18
21
19
22
def __init__ (self , config : config .Config ) -> None :
20
- super ().__init__ ()
23
+ super ().__init__ (daemon = True )
21
24
22
25
self .config = config
23
- self .protocols = protocols .SupportedProtocolFactory ()
26
+ self .protocols = protocols .get_enabled_protocols (self .config )
27
+ self .comm_port = serial .Serial (self .config .serial_port , self .config .baud_rate )
24
28
25
29
def run (self ) -> None :
26
30
if not itc .IS_WORKER_RUNNING .is_set ():
27
31
raise exceptions .WaveshareException ("Event 'IS_WORKER_RUNNING' is not set." )
28
32
29
- # TODO: initialize serial object and SIM868
30
- self .comm_port = serial .Serial (self .config .serial_port , self .config .baud_rate )
31
- self .comm_port .open ()
32
-
33
33
WORKER_STATE_MAPPING : typing .Dict [
34
- WorkerState , typing .Callable [..., typing .Any ]
34
+ WorkerState , typing .Callable [..., typing .Union [ WorkerState , None ] ]
35
35
] = {
36
- WorkerState .START : self .on_start ,
36
+ WorkerState .STARTUP : self .on_startup ,
37
+ WorkerState .RESTART : self .on_restart ,
38
+ WorkerState .SHUTDOWN : self .on_shutdown ,
39
+ WorkerState .LISTEN_TO_SOURCES : self .on_listen_to_sources ,
37
40
WorkerState .LISTEN_TO_CLIENT : self .on_listen_to_client ,
38
41
WorkerState .LISTEN_TO_SERIAL : self .on_listen_to_serial ,
39
42
}
40
43
41
- curr_state : typing .Optional [WorkerState ] = WorkerState .START
44
+ curr_state : typing .Optional [WorkerState ] = WorkerState .STARTUP
42
45
next_state : typing .Optional [WorkerState ] = None
43
46
44
47
while itc .IS_WORKER_RUNNING .is_set ():
@@ -48,24 +51,39 @@ def run(self) -> None:
48
51
next_state = WORKER_STATE_MAPPING [curr_state ]()
49
52
curr_state = next_state
50
53
51
- def on_start (self ) -> WorkerState :
54
+ def on_startup (self ) -> WorkerState :
55
+ self .comm_port .open ()
52
56
# TODO: initialize all enabled protocols
57
+ return WorkerState .LISTEN_TO_SOURCES
53
58
59
+ def on_restart (self ) -> WorkerState :
60
+ pass
61
+
62
+ def on_shutdown (self ) -> None :
63
+ pass
64
+
65
+ def on_listen_to_sources (self ) -> WorkerState :
54
66
with itc .ACQUIRE_CLIENT_TX_DATA :
55
- if itc . CLIENT_TX_Q . qsize () > 0 :
67
+ if self . is_client_data_available () :
56
68
self .logger .debug ("Client TX data available!" )
57
69
return WorkerState .LISTEN_TO_CLIENT
58
70
59
71
with itc .ACQUIRE_SERIAL_RX_DATA :
60
- if itc . SERIAL_RX_Q . qsize () > 0 :
72
+ if self . is_serial_data_available () :
61
73
self .logger .debug ("Serial RX data available!" )
62
74
return WorkerState .LISTEN_TO_SERIAL
63
75
64
- self .logger .debug ("No data available :(" )
65
- return WorkerState .START
76
+ self .logger .debug ("No data available :( Rechecking sources..." )
77
+ return WorkerState .LISTEN_TO_SOURCES
78
+
79
+ def is_client_data_available (self ) -> bool :
80
+ return itc .CLIENT_TX_Q .qsize () > 0
66
81
67
82
def on_listen_to_client (self ) -> WorkerState :
68
- return WorkerState .START
83
+ return WorkerState .LISTEN_TO_SOURCES
84
+
85
+ def is_serial_data_available (self ) -> bool :
86
+ return itc .SERIAL_RX_Q .qsize () > 0
69
87
70
88
def on_listen_to_serial (self ) -> WorkerState :
71
- return WorkerState .START
89
+ return WorkerState .LISTEN_TO_SOURCES
0 commit comments