Skip to content
Snippets Groups Projects
Commit ead9db2f authored by GUILLAUME Gwenael's avatar GUILLAUME Gwenael
Browse files

Update ControlCommand

parent 357cd6bd
No related branches found
No related tags found
No related merge requests found
Pipeline #18762 failed
package elevator;
public enum CCState {
STOP,
OPEN,
UP,
DOWN,
STOPNEXT,
EMERGENCY;
}
...@@ -6,11 +6,11 @@ public class ControlCommand implements IControlCommand{ ...@@ -6,11 +6,11 @@ public class ControlCommand implements IControlCommand{
private Schedule schedule; private Schedule schedule;
private IElevator elevator; private IElevator elevator;
private IPanel panel; private IPanel panel;
private int etage; private CCState state;
private int actual; private int actual;
private boolean up = true; private RequestState up = RequestState.GO;
private final int MAX_LEVEL; private final int MAX_LEVEL;
...@@ -21,6 +21,7 @@ public class ControlCommand implements IControlCommand{ ...@@ -21,6 +21,7 @@ public class ControlCommand implements IControlCommand{
this.panel = panel; this.panel = panel;
this.MAX_LEVEL = maxLevel; this.MAX_LEVEL = maxLevel;
this.actual = 0; this.actual = 0;
this.state = CCState.STOP;
} }
...@@ -47,46 +48,67 @@ public class ControlCommand implements IControlCommand{ ...@@ -47,46 +48,67 @@ public class ControlCommand implements IControlCommand{
if(elevator.getAndResetStageSensor()){ if(elevator.getAndResetStageSensor()){
actual++; actual++;
} }
if(elevator.getState() == State.ERROR){
this.state = CCState.EMERGENCY;
}
registerRequest(); registerRequest();
int request = schedule.nextLevel(this.actual, this.up); int request = schedule.nextLevel(this.actual, this.up);
switch (this.elevator.getState()){ switch (state) {
case STOP: case STOP -> {
if (request != -1) { if (request != -1) {
if (this.actual == request) { if (this.actual == request) {
elevator.openDoor(); elevator.openDoor();
this.state = CCState.OPEN;
} else if (this.actual < request) { } else if (this.actual < request) {
this.up = true; this.up = RequestState.UP;
this.state = CCState.UP;
elevator.up(); elevator.up();
if (request == this.actual + 1) { if (request == this.actual + 1) {
elevator.stopNext(); elevator.stopNext();
} }
} else { } else {
this.up = false; this.up = RequestState.DOWN;
this.state = CCState.DOWN;
elevator.down(); elevator.down();
if (request == this.actual - 1) { if (request == this.actual - 1) {
elevator.stopNext(); elevator.stopNext();
} }
} }
} else {
this.up = RequestState.GO;
}
} }
break; case UP -> {
case UP:
if (request == this.actual + 1) { if (request == this.actual + 1) {
elevator.stopNext(); this.state = CCState.STOPNEXT;
}
} }
break; case DOWN -> {
case DOWN:
if (request == this.actual - 1) { if (request == this.actual - 1) {
this.state = CCState.STOPNEXT;
}
}
case OPEN -> {
schedule.delRequest(this.getEtage());
if (elevator.getState() != State.OPEN) {
this.state = CCState.STOP;
}
}
case STOPNEXT -> {
if (request == this.actual) {
this.state = CCState.OPEN;
} else {
elevator.stopNext(); elevator.stopNext();
} }
break; }
case OPEN: case EMERGENCY -> {
break; System.out.println("Erreur systeme");
case RESET: if (this.panel.getAndResetInitButton()) {
break; this.state = CCState.STOP;
case ERROR: }
break; }
default: default -> throw new ExecptionStateUnknow();
throw new ExecptionStateUnknow();
} }
} }
} }
...@@ -13,19 +13,15 @@ public class Schedule { ...@@ -13,19 +13,15 @@ public class Schedule {
} }
public void delRequest(int level){ public void delRequest(int level){
for(Request r: requests){ requests.removeIf(r -> r.level == level);
if(r.level == level){
requests.remove(r);
}
}
} }
public int nextLevel(int level, boolean upside){ public int nextLevel(int level, RequestState upside){
return chooseRequest(level, upside)==null?chooseRequest(level, upside).level:-1; return chooseRequest(level, upside)!=null?chooseRequest(level, upside).level:-1;
} }
private Request chooseRequest(int level, boolean up){ private Request chooseRequest(int level, RequestState up){
Request out = choosePriority(level, up); Request out = choosePriority(level, up);
if(out == null){ if(out == null){
for(Request request: requests) { for(Request request: requests) {
...@@ -37,14 +33,14 @@ public class Schedule { ...@@ -37,14 +33,14 @@ public class Schedule {
return out; return out;
} }
private Request choosePriority(int level, boolean up){ private Request choosePriority(int level, RequestState up){
Request out = null; Request out = null;
for(Request request: requests){ for(Request request: requests){
if(((request.up == RequestState.GO && up) || request.up == RequestState.UP) && level <= request.level){ if((request.up == up && request.up == RequestState.UP) && level <= request.level){
if(out == null || request.level < out.level){ if(out == null || request.level < out.level){
out = request; out = request;
} }
} else if (((request.up == RequestState.GO && !up )|| request.up == RequestState.DOWN) && level >= request.level) { } else if (((request.up == up) && request.up == RequestState.DOWN) && level >= request.level) {
if(out == null || request.level > out.level){ if(out == null || request.level > out.level){
out = request; out = request;
} }
......
...@@ -9,43 +9,95 @@ import static org.junit.jupiter.api.Assertions.*; ...@@ -9,43 +9,95 @@ import static org.junit.jupiter.api.Assertions.*;
public class TestControlCommand { public class TestControlCommand {
@Test
public void testRegisterRequest() throws ExecptionStateUnknow {
PanelSimulator panel = new PanelSimulator(10); PanelSimulator panel = new PanelSimulator(10);
ElevatorSimulator elevator = new ElevatorSimulator(10, true); ElevatorSimulator elevator = new ElevatorSimulator(10, true);
Schedule schedule = new Schedule(); Schedule schedule = new Schedule();
ControlCommand controlCommand = new ControlCommand(schedule, elevator, panel, 10); ControlCommand controlCommand = new ControlCommand(schedule, elevator, panel, 10);
@Test
public void testUpRequest() throws ExecptionStateUnknow {
panel.pressDownButton(3); panel.pressDownButton(3);
controlCommand.checkAndProcess(); controlCommand.checkAndProcess();
assertEquals(schedule.nextLevel(0, true), 3); // On vérifie que la requete a bien été lu
assertEquals(schedule.nextLevel(0, RequestState.UP), 3);
assertFalse(panel.getAndResetDownButton(3));
while(elevator.getState() == State.STOP){
controlCommand.checkAndProcess(); controlCommand.checkAndProcess();
elevator.oneStep(); elevator.oneStep();
}
assertFalse(panel.getAndResetDownButton(3)); // Vérifie que l'élévateur monte bien
assertEquals(State.UP, elevator.getState()); assertEquals(State.UP, elevator.getState());
while (elevator.getState() != State.STOP) {
controlCommand.checkAndProcess();
elevator.oneStep();
}
panel.pressUpButton(9); // Vérifie que l'élévateur monte bien
controlCommand.registerRequest(); assertEquals(State.STOP, elevator.getState());
assertFalse(panel.getAndResetUpButton(9)); assertEquals(3, controlCommand.getEtage());
assertTrue(schedule.getRequests().contains(new Request(9,true))); // Vérifie qu'il n'existe plu de requete
assertEquals(-1, schedule.nextLevel(3, RequestState.GO));
} }
@Test
public void testDownRequest() throws ExecptionStateUnknow {
panel.pressDownButton(3);
controlCommand.checkAndProcess();
elevator.oneStep();
// On fait monter l'ascenseur au 3ème étage
while (elevator.getState() != State.STOP) {
controlCommand.checkAndProcess();
elevator.oneStep();
}
assertEquals(3, controlCommand.getEtage());
panel.pressDownButton(0);
controlCommand.checkAndProcess();
// On vérifie que la requete a bien été lu
assertEquals(0, schedule.nextLevel(3, RequestState.DOWN));
assertFalse(panel.getAndResetDownButton(3));
controlCommand.checkAndProcess();
elevator.oneStep();
// Vérifie que l'élévateur descend bien
assertEquals(State.DOWN, elevator.getState());
while (elevator.getState() != State.STOP) {
controlCommand.checkAndProcess();
elevator.oneStep();
}
// Vérifie que l'élévateur monte bien
assertEquals(State.STOP, elevator.getState());
assertEquals(3, controlCommand.getEtage());
// Vérifie qu'il n'existe plu de requete
assertEquals(-1, schedule.nextLevel(3, RequestState.GO));
}
@Test @Test
public void testCheckAndProcess() { public void testStageRequest() throws ExecptionStateUnknow {
PanelSimulator panel = new PanelSimulator(10); panel.pressUpButton(0);
ElevatorSimulator elevator = new ElevatorSimulator(10, true); controlCommand.checkAndProcess();
Schedule schedule = new Schedule(); // On vérifie que la requete a bien été lu
ControlCommand controlCommand = new ControlCommand(schedule, elevator, panel, 10); assertEquals(0, schedule.nextLevel(0, RequestState.UP));
assertFalse(panel.getAndResetDownButton(0));
// Vérifie que l'élévateur monte bien
assertEquals(OPEN, elevator.getState());
while (elevator.getState() != State.STOP) {
controlCommand.checkAndProcess();
elevator.oneStep();
}
panel.pressFloorButton(2); // Vérifie que l'élévateur monte bien
assertEquals(State.STOP, elevator.getState());
assertEquals(0, controlCommand.getEtage());
// Vérifie qu'il n'existe plu de requete
assertEquals(-1, schedule.nextLevel(3, RequestState.GO));
} }
} }
...@@ -35,7 +35,7 @@ public class TestSchedule { ...@@ -35,7 +35,7 @@ public class TestSchedule {
schedule.addRequest(new Request(6,true)); schedule.addRequest(new Request(6,true));
schedule.addRequest(new Request(5,true)); schedule.addRequest(new Request(5,true));
schedule.addRequest(new Request(7,true)); schedule.addRequest(new Request(7,true));
assertEquals(schedule.nextLevel(4, true), 5); assertEquals(schedule.nextLevel(4, RequestState.UP), 5);
} }
@Test @Test
...@@ -44,20 +44,20 @@ public class TestSchedule { ...@@ -44,20 +44,20 @@ public class TestSchedule {
schedule.addRequest(new Request(6,false)); schedule.addRequest(new Request(6,false));
schedule.addRequest(new Request(5,false)); schedule.addRequest(new Request(5,false));
schedule.addRequest(new Request(7,false)); schedule.addRequest(new Request(7,false));
assertEquals(schedule.nextLevel(8, true), 10); assertEquals(schedule.nextLevel(8, RequestState.UP), 10);
} }
@Test @Test
public void TestElevator(){ public void TestElevator(){
schedule.addRequest(new Request(5)); schedule.addRequest(new Request(5));
schedule.addRequest(new Request(3, true)); schedule.addRequest(new Request(3, true));
assertEquals(schedule.nextLevel(1, true), 3); assertEquals(schedule.nextLevel(1, RequestState.UP), 3);
} }
@Test @Test
public void TestElevatorRDC(){ public void TestElevatorRDC(){
schedule.addRequest(new Request(0)); schedule.addRequest(new Request(0));
assertEquals(schedule.nextLevel(3, true), 0); assertEquals(schedule.nextLevel(3, RequestState.UP), 0);
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment