-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMainClass.java
More file actions
167 lines (156 loc) · 6.42 KB
/
MainClass.java
File metadata and controls
167 lines (156 loc) · 6.42 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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
import java.util.TreeSet;
public class MainClass {
static TreeSet<Request> currentJobs = new TreeSet<>();
static TreeSet<Request> upPendingJobs = new TreeSet<>();
static TreeSet<Request> downPendingJobs = new TreeSet<>();
static Elevator elevator = new Elevator();
public static void main(String [] args) {
elevator.state = State.IDLE;
ExternalRequest er1 = new ExternalRequest(Direction.UP, 0);
InternalRequest ir1 = new InternalRequest(5);
ExternalRequest er2 = new ExternalRequest(Direction.UP, 2);
InternalRequest ir2 = new InternalRequest(4);
ExternalRequest er4 = new ExternalRequest(Direction.UP, 4);
InternalRequest ir4 = new InternalRequest(9);
ExternalRequest er3 = new ExternalRequest(Direction.DOWN, 3);
InternalRequest ir3 = new InternalRequest(0);
ExternalRequest er5 = new ExternalRequest(Direction.DOWN, 3);
InternalRequest ir5 = new InternalRequest(1);
Request request1 = new Request(er1, ir1);
Request request2 = new Request(er2, ir2);
Request request3 = new Request(er3, ir3);
Request request4 = new Request(er4, ir4);
Request request5 = new Request(er5, ir5);
addNewJob(request1);
addNewJob(request2);
addNewJob(request3);
addNewJob(request4);
addNewJob(request5);
startElevator();
}
public static void startElevator() {
System.out.println("Elevator Started");
while(true) {
if(checkIfJobPresent()) {
if(elevator.direction == Direction.UP) {
serveUpJob(currentJobs.pollFirst());
if(currentJobs.isEmpty()) {
addPendingDownJobsToCurrentJobs();
}
} else {
serveDownJob(currentJobs.pollLast());
if(currentJobs.isEmpty()) {
addPendingUpJobsToCurrentJobs();
}
}
}
}
}
private static void addPendingDownJobsToCurrentJobs() {
if(!downPendingJobs.isEmpty()) {
currentJobs = downPendingJobs;
elevator.direction = Direction.DOWN;
}
}
private static void addPendingUpJobsToCurrentJobs() {
if(!upPendingJobs.isEmpty()) {
currentJobs = upPendingJobs;
elevator.direction = Direction.UP;
}
}
private static boolean checkIfJobPresent() {
if(currentJobs.isEmpty()) {
return false;
} else {
return true;
}
}
public static void addNewJob(Request newRequest) {
if(elevator.state == State.IDLE) {
elevator.state = State.MOVING;
elevator.direction = newRequest.externalRequest.directionToGo;
currentJobs.add(newRequest);
} else {
if(elevator.direction != newRequest.externalRequest.directionToGo) {
addToPendingJobs(newRequest);
} else {
if(elevator.direction == Direction.UP
&& elevator.currentFloor > newRequest.internalRequest.destinationFloor) {
addToPendingJobs(newRequest);
} else if(elevator.direction == Direction.DOWN
&& elevator.currentFloor < newRequest.internalRequest.destinationFloor) {
addToPendingJobs(newRequest);
} else {
currentJobs.add(newRequest);
}
}
}
}
private static void addToPendingJobs(Request newRequest) {
if(newRequest.externalRequest.directionToGo == Direction.UP) {
System.out.println("Added to Pending up Job");
upPendingJobs.add(newRequest);
} else {
System.out.println("Added to Pending down Job");
downPendingJobs.add(newRequest);
}
}
static void moveElevatorUpToRequestedFloor(Request request) {
for(int i = elevator.currentFloor + 1; i <= request.externalRequest.sourceFloor; i++) {
System.out.println("Elevator reached Floor - " + i);
elevator.currentFloor = i;
}
}
static void serveUpJob(Request request) {
moveElevatorUpToRequestedFloor(request);
System.out.println("Opening Doors Floor - " + elevator.currentFloor);
for(int i = elevator.currentFloor + 1; i <= request.internalRequest.destinationFloor; i++) {
elevator.currentFloor = i ;
System.out.println("Elevator reached Floor - " + i);
if(checkIfNewRequestCanbeServed(request)) {
break;
}
}
}
static void moveElevatorDownToRequestedFloor(Request request) {
for(int i = elevator.currentFloor - 1; i >= request.externalRequest.sourceFloor; i--) {
System.out.println("Elevator reached Floor - " + i);
elevator.currentFloor = i;
}
}
static void serveDownJob(Request request) {
moveElevatorDownToRequestedFloor(request);
System.out.println("Opening Doors Floor - " + elevator.currentFloor);
for(int i = elevator.currentFloor - 1; i >= request.internalRequest.destinationFloor; i--) {
elevator.currentFloor = i ;
System.out.println("Elevator reached Floor - " + i);
if(checkIfNewRequestCanbeServed(request)) {
break;
}
}
}
private static boolean checkIfNewRequestCanbeServed(Request currRequest) {
if(!currentJobs.isEmpty()) {
if (elevator.direction == Direction.UP) {
Request newRequest = currentJobs.pollFirst();
if (currRequest.internalRequest.destinationFloor > newRequest.internalRequest.destinationFloor) {
currentJobs.add(newRequest);
currentJobs.add(currRequest);
return true;
} else {
currentJobs.add(newRequest);
}
} else {
Request newRequest = currentJobs.pollLast();
if (currRequest.internalRequest.destinationFloor < newRequest.internalRequest.destinationFloor) {
currentJobs.add(newRequest);
currentJobs.add(currRequest);
return true;
} else {
currentJobs.add(newRequest);
}
}
}
return false;
}
}