-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcontroller.py
More file actions
38 lines (31 loc) · 1.18 KB
/
controller.py
File metadata and controls
38 lines (31 loc) · 1.18 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
from threading import Timer, Lock
from elevator import Elevator
from datetime import datetime as dt
class Controller:
def __init__(self, elevator=Elevator(10)):
self.elevator = elevator
self.state = ''
self.elevator.subscribe(self.set_state)
self.lock_command = Lock()
self.lock_act = Lock()
def call(self, floor, datetime):
seconds = (datetime - dt.now()).total_seconds()
Timer(seconds, self.command, [self.elevator.call, floor]).start()
def select(self, floor, datetime):
seconds = (datetime-dt.now()).total_seconds()
Timer(seconds, self.command, [self.elevator.select, floor]).start()
def command(self, fct, arg):
# Lock to avoid concurrency issue
with self.lock_command:
fct(arg)
# Allow to select and call, while elevator is moving, to make it more efficient
with self.lock_act:
self.elevator.act()
def set_state(self, action):
self.state = \
{
'up': 'moving_up',
'down': 'moving_down',
'open': 'door_opened',
'close': 'door_closed',
}[action.lower()]