// PART OF THE MACHINE SIMULATION. DO NOT CHANGE.
package nachos.machine;
/**
* A set of controls that can be used by a rider controller. Each rider uses a
* distinct <tt>RiderControls</tt> object.
*/
public interface RiderControls {
/**
* Return the number of floors in the elevator bank. If <i>n</i> is the
* number of floors in the bank, then the floors are numbered <i>0</i>
* (the ground floor) through <i>n - 1</i> (the top floor).
*
* @return the number of floors in the bank.
*/
public int getNumFloors();
/**
* Return the number of elevators in the elevator bank. If <i>n</i> is the
* number of elevators in the bank, then the elevators are numbered
* <i>0</i> through <i>n - 1</i>.
*
* @return the numbe rof elevators in the bank.
*/
public int getNumElevators();
/**
* Set the rider's interrupt handler. This handler will be called when the
* rider observes an event.
*
* @param handler the rider's interrupt handler.
*/
public void setInterruptHandler(Runnable handler);
/**
* Return the current location of the rider. If the rider is in motion,
* the returned value will be within one of the exact location.
*
* @return the floor the rider is on.
*/
public int getFloor();
/**
* Return an array specifying the sequence of floors at which this rider
* has successfully exited an elevator. This array naturally does not
* count the floor the rider started on, nor does it count floors where
* the rider is in the elevator and does not exit.
*
* @return an array specifying the floors this rider has visited.
*/
public int[] getFloors();
/**
* Return the indicated direction of the specified elevator, set by
* <tt>ElevatorControls.setDirectionDisplay()</tt>.
*
* @param elevator the elevator to check the direction of.
* @return the displayed direction for the elevator.
*
* @see nachos.machine.ElevatorControls#setDirectionDisplay
*/
public int getDirectionDisplay(int elevator);
/**
* Press a direction button. If <tt>up</tt> is <tt>true</tt>, invoke
* <tt>pressUpButton()</tt>; otherwise, invoke <tt>pressDownButton()</tt>.
*
* @param up <tt>true</tt> to press the up button, <tt>false</tt> to
* press the down button.
* @return the return value of <tt>pressUpButton()</tt> or of
* <tt>pressDownButton()</tt>.
*/
public boolean pressDirectionButton(boolean up);
/**
* Press the up button. The rider must not be on the top floor and must not
* be inside an elevator. If an elevator is on the same floor as this
* rider, has the doors open, and says it is going up, does nothing and
* returns <tt>false</tt>.
*
* @return <tt>true</tt> if the button event was sent to the elevator
* controller.
*/
public boolean pressUpButton();
/**
* Press the down button. The rider must not be on the bottom floor and
* must not be inside an elevator. If an elevator is on the same floor as
* as this rider, has the doors open, and says it is going down, does
* nothing and returns <tt>false</tt>.
*
* @return <tt>true</tt> if the button event was sent to the elevator
* controller.
*/
public boolean pressDownButton();
/**
* Enter an elevator. A rider cannot enter an elevator if its doors are not
* open at the same floor, or if the elevator is full. The rider must not
* already be in an elevator.
*
* @param elevator the elevator to enter.
* @return <tt>true</tt> if the rider successfully entered the elevator.
*/
public boolean enterElevator(int elevator);
/**
* Press a floor button. The rider must be inside an elevator. If the
* elevator already has its doors open on <tt>floor</tt>, does nothing and
* returns <tt>false</tt>.
*
* @param floor the button to press.
* @return <tt>true</tt> if the button event was sent to the elevator
* controller.
*/
public boolean pressFloorButton(int floor);
/**
* Exit the elevator. A rider cannot exit the elevator if its doors are not
* open on the requested floor. The rider must already be in an elevator.
*
* @param floor the floor to exit on.
* @return <tt>true</tt> if the rider successfully got off the elevator.
*/
public boolean exitElevator(int floor);
/**
* Call when the rider is finished.
*/
public void finish();
/**
* Return the next event in the event queue. Note that there may be
* multiple events pending when a rider interrupt occurs, so this
* method should be called repeatedly until it returns <tt>null</tt>.
*
* @return the next event, or <tt>null</tt> if no further events are
* currently pending.
*/
public RiderEvent getNextEvent();
}