From 820687f59b3022ab77b4f5548267093ca1fbd108 Mon Sep 17 00:00:00 2001 From: Imbus <> Date: Thu, 26 Sep 2024 03:20:34 +0200 Subject: [PATCH] LiftState class --- lift/src/lift/LiftMonitor.java | 68 +++++++++++++++++----------------- lift/src/lift/LiftState.java | 55 +++++++++++++++++++++++++++ 2 files changed, 89 insertions(+), 34 deletions(-) create mode 100644 lift/src/lift/LiftState.java diff --git a/lift/src/lift/LiftMonitor.java b/lift/src/lift/LiftMonitor.java index 8bdf464..f8ad1e3 100644 --- a/lift/src/lift/LiftMonitor.java +++ b/lift/src/lift/LiftMonitor.java @@ -1,7 +1,5 @@ package lift; -import java.util.Arrays; - enum Direction { UP, DOWN, @@ -9,20 +7,12 @@ enum Direction { /** Lift monitor. Handles lift motion and various state. */ public class LiftMonitor { - /** the floor the lift is currently on */ - private int floor; /** Number of floors */ private int nfloors; - /** true if the lift is moving, false if standing still with doors open */ - private boolean moving; - /** Current direction of the lift */ - private Direction direction; /** number of passengers waiting to enter the lift at the various floors */ private PassengerQueue waitEntry; /** number of passengers (in lift) waiting to leave at the various floors */ private PassengerQueue waitExit; - /** number of passengers currently in the lift */ - private int load; /** view object passed from main */ private LiftView view; /** State (open/closed) of door on current floor */ @@ -31,20 +21,19 @@ public class LiftMonitor { private int passengersEntering; /** Counter of number of passengers currently exiting the elevator */ private int passengersExiting; + /** Lift state */ + private LiftState liftState; /** Create new LiftMonitor */ public LiftMonitor(LiftView v, int floors) { - floor = 0; nfloors = floors; - moving = true; - direction = Direction.UP; door = new Door(); waitEntry = new PassengerQueue(nfloors); waitExit = new PassengerQueue(nfloors); - load = 0; view = v; passengersEntering = 0; passengersExiting = 0; + liftState = new LiftState(0, Direction.UP); } /** Increases the number of waiting passengers on given floor */ @@ -55,9 +44,9 @@ public class LiftMonitor { /** Handles passengers waiting to enter arriving lift */ public synchronized void enterLift(int passengerFloor, - int passengerDestination) { - while (floor != passengerFloor || load == 4 || moving || - passengersEntering == 4) { + int passengerDestination) { + while (liftState.getFloor() != passengerFloor || liftState.getLoad() == 4 || + liftState.isMoving() || passengersEntering == 4) { try { wait(); } catch (InterruptedException e) { @@ -65,9 +54,10 @@ public class LiftMonitor { } } - waitEntry.dec(floor); + waitEntry.dec( + liftState.getFloor()); // In practice, passengerFloor == floor here waitExit.inc(passengerDestination); - load++; + liftState.incLoad(); passengersEntering++; notifyAll(); } @@ -80,7 +70,7 @@ public class LiftMonitor { /** Handles passengers waiting to exit lift */ public synchronized void exitLift(int passengerDestination) { - while (floor != passengerDestination) { + while (liftState.getFloor() != passengerDestination) { try { wait(); } catch (InterruptedException e) { @@ -88,7 +78,7 @@ public class LiftMonitor { } } waitExit.dec(passengerDestination); - load--; + liftState.decLoad(); passengersExiting++; notifyAll(); } @@ -114,13 +104,15 @@ public class LiftMonitor { } /** Stops the elevator to allow passengers to enter or exit */ - while (waitEntry.get(floor) > 0 && load != 4 || waitExit.get(floor) > 0 || - passengersEntering > 0 || passengersExiting > 0) { + while (waitEntry.get(liftState.getFloor()) > 0 && + liftState.getLoad() != 4 || + waitExit.get(liftState.getFloor()) > 0 || passengersEntering > 0 || + passengersExiting > 0) { if (!door.isOpen()) { - view.openDoors(floor); + view.openDoors(liftState.getFloor()); door.open(); } - moving = false; + liftState.setMoving(false); notifyAll(); try { wait(); @@ -129,13 +121,13 @@ public class LiftMonitor { } } - if (!moving) + if (!liftState.isMoving()) view.closeDoors(); if (door.isOpen()) door.close(); - moving = true; + liftState.setMoving(true); calculateDirection(); @@ -143,14 +135,16 @@ public class LiftMonitor { * Sends the elevators current position and next position to the LiftThread */ int[] movingPositions = new int[2]; - movingPositions[0] = floor; - movingPositions[1] = floor + (direction == Direction.UP ? 1 : -1); + movingPositions[0] = liftState.getFloor(); + movingPositions[1] = liftState.getFloor() + + (liftState.getDirection() == Direction.UP ? 1 : -1); return movingPositions; } /** Moves the elevator in the given direction */ public synchronized void incrementFloor() { - floor = floor + (direction == Direction.UP ? 1 : -1); + liftState.setFloor(liftState.getFloor() + + (liftState.getDirection() == Direction.UP ? 1 : -1)); } /** @@ -159,13 +153,19 @@ public class LiftMonitor { * to enter or exit on floors either above or below the elevator */ private void calculateDirection() { - boolean noPassengersAbove = (waitEntry.totalAbove(floor) == 0 && waitExit.totalAbove(floor) == 0); - boolean noPassengersBelow = (waitEntry.totalBelow(floor) == 0 && waitExit.totalBelow(floor) == 0); + int floor = liftState.getFloor(); + boolean noPassengersAbove = + (waitEntry.totalAbove(floor) == 0 && waitExit.totalAbove(floor) == 0); + boolean noPassengersBelow = + (waitEntry.totalBelow(floor) == 0 && waitExit.totalBelow(floor) == 0); if (floor == 0 || noPassengersBelow) { - direction = Direction.UP; // Always go up if at ground floor or no passengers below + liftState.setDirection( + Direction + .UP); // Always go up if at ground floor or no passengers below } else if (floor == nfloors - 1 || noPassengersAbove) { - direction = Direction.DOWN; // Always go down if at the top floor or no passengers above + liftState.setDirection(Direction.DOWN); // Always go down if at the top + // floor or no passengers above } } } diff --git a/lift/src/lift/LiftState.java b/lift/src/lift/LiftState.java new file mode 100644 index 0000000..680f1c7 --- /dev/null +++ b/lift/src/lift/LiftState.java @@ -0,0 +1,55 @@ +package lift; + +public class LiftState { + private int floor; + private Direction direction; + private boolean moving; + private int load; + + public LiftState(int initialFloor, Direction initialDirection) { + this.floor = initialFloor; + this.direction = initialDirection; + this.moving = true; + this.load = 0; + } + + public int getFloor() { + return floor; + } + + public void setFloor(int floor) { + this.floor = floor; + } + + public Direction getDirection() { + return direction; + } + + public void setDirection(Direction direction) { + this.direction = direction; + } + + public boolean isMoving() { + return moving; + } + + public void setMoving(boolean moving) { + this.moving = moving; + } + + public int getLoad() { + return load; + } + + public void setLoad(int load) { + this.load = load; + } + + public void incLoad() { + this.load++; + } + + public void decLoad() { + this.load--; + } +}