-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathResidential_Controller.algo
110 lines (98 loc) · 4.29 KB
/
Residential_Controller.algo
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
DEFINE Column USING _numberFloors AND _numberOfElevators
status: Online
numberFloors: _numberFloors
numberOfElevators: _numberOfElevators
ElevatorList: EMPTY LIST
callButtonList: EMPTY LIST
SEQUENCE createElevatorList USING _numberOfElevators
FOR iterator FROM 1 TO _numberOfElevators
INIT newElevator TO INSTANTIATE Elevator WITH iterator
ADD newElevator TO ElevatorList
ENDFOR
ENDSEQUENCE
SEQUENCE createcallButtonList USING _numberFloors
FOR iterator FROM 1 TO _numberFloors
INIT newCallButton TO INSTANTIATE CallButon WITH None AND iterator
ADD newCallButton TO callButtonList
ENDFOR
ENDSEQUENCE
SEQUENCE requestElevator WITH _requestedFloor AND _requestedDirection
CALL findBestElevator WITH _requestedFloor AND _requestedDirection RETURNING bestElevator
CALL goToDestinationFloor OF bestElevator WITH _requestedFloor AND _requestedDirection
ENDSEQUENCE
SEQUENCE requestFloor WITH _requestedFloor
IF _requestedFloor IS GREATER THAN currentFloor
SET requestedDirection TO Down
ELSE
SET requestedDirection TO Up
ENDIF
CALL goToDestinationFloor OF elevator WITH _requestedFloor AND _requestedDirection
ENDSEQUENCE
SEQUENCE findBestElevator WITH _requestedFloor AND _requestedDirection RETURNING bestElevator
SET shortestDistance TO _numberFloors
SET bestElevator TO 0
FOR EACH elevator in ElevatorList
CALL calcDistanceToFloor OF elevator USING _requestedFloor RETURNING distance
IF directon IS EQUAL Down AND currentFloor IS GREATER THAN _requestedFloor THEN
CALL calcShortestDistance WITH _distance AND shortestDistance RETURNING bestElevator
ENDIF
IF directon IS EQUAL Up AND currentFloor IS LESS THAN _requestedFloor THEN
CALL calcShortestDistance WITH _distance AND shortestDistance RETURNING bestElevator
ENDIF
IF directon IS EQUAL None AND bestElevator IS EQUAL 0 THEN
CALL calcShortestDistance WITH _distance AND shortestDistance RETURNING bestElevator
ELSE
CALL calcShortestDistance WITH _distance AND shortestDistance RETURNING bestElevator
ENDIF
ENDFOR
RETURN bestElevator
ENDSEQUENCE
SEQUENCE calcShortestDistance WITH _distance AND shortestDistance RETURNING bestElevator
IF distance IS LESS OR EQUAL THAN shortestDistance
SET shortestDistance TO distance
SET bestElevator TO elevator
ENDIF
ENDSEQUENCE
ENDDEFINE
DEFINE Elevator USING _id
ID: _id
status: Online
directon: Nome
currentFloor: 1
doors: Closed
destinationList: EMPTY LIST
SEQUENCE calcDistanceToFloor USING _requestedFloor RETURNING distance
SET distance TO ABSOLUTE(_requestedFloor MINUS currentFloor)
RETURN distance
ENDSEQUENCE
SEQUENCE goToDestinationFloor WITH _requestedFloor AND _requestedDirection
ADD _requestedFloor TO destinationList
CALL moveElevatorToDestination
CALL openDoors WITH bestElevator // not implemented
WAIT 5 seconds
CALL closeDoors WITH bestElevator
ENDSEQUENCE
SEQUENCE moveElevatorToDestination
SET destination TO READ destinationList[1]
IF currentFloor IS GREATER THAN destination
SET direction TO Down
ELSE
SET direction TO Up
WHILE currentFloor IS NOT EQUAL destination
CALL moveElevator WITH direction
Call readCurrentFloor RETURNING currentFloor
ENDWHILE
REMOVE destination FROM destinationList
ROTATE destinationList LEFT
ENDSEQUENCE
ENDDEFINE
DEFINE callButton USING AND _direction AND _floor
direction: _direction
floor: _floor
ENDDEFINE
---------------------------------------------------------TESTING SECTION------------------------------------------------------------------
_numberFloors AND _numberOfElevators
INIT column1 TO INSTANTIATE Column WITH 10, 2
_requestedFloor AND _requestedDirection
CALL requestElevator WITH 8 AND Up
CALL requestFloor WITH 5