/** * Given an elevator request, this algorithm attempts to assign the request to a specific * elevator. This algorithm differs in that it will try to assign the request to an IDLE elevator * first. If there is no IDLE elevator, it will try to find an ACTIVE elevator to take the * request. If there is neither an IDLE or ACTIVE elevator to take the request, it gets added to * the pending requests lists. This algorithm's attempt at better elevator efficiency exists in * getting all elevators to participate as fast as possible, instead of having only a few * elevators do all the work and slowly making IDLE elevators join the workload * * @throws IllegalArgumentException if EController is given bad parameters */ public void processCallBoxRequest(ERequest request) throws IllegalArgumentException { short dest = request.getFloorNum(); boolean direction = request.getDirection(); // checks if there's already an elevator headed to that floor for (short i = 0; i < EController.getInstance().myElevators.size(); i++) { if (EController.getInstance().myElevators.get(i).isInDestinations(dest)) { if (EController.getInstance().myElevators.get(i).isCurrentDirectionUp() == direction) { // return since there's already an elevator on its way return; } } } // checks if there's an IDLE elevator that can take the request for (short i = 0; i < EController.getInstance().myElevators.size(); i++) { if (EController.getInstance().myElevators.get(i).getState() == 0 && EController.getInstance().myElevators.get(i).takeRequest(dest, direction)) { EController.getInstance().myElevators.get(i).addDestination(dest); return; } } /* If there's not already an elevator on the way to this destination floor, * and there's no IDLE elevator available, then check if there's an available * ACTIVE elevator that can take the request. */ for (short i = 0; i < EController.getInstance().myElevators.size(); i++) { if (EController.getInstance().myElevators.get(i).takeRequest(dest, direction) && (EController.getInstance().myElevators.get(i).getState() == 2 || EController.getInstance().myElevators.get(i).getState() == 3)) { EController.getInstance().myElevators.get(i).addDestination(dest); return; } } // if none of the elevators could accept the request, add it to the pending list EController.getInstance().pendingRequests.add(request); }
@Test public void test() { ERequest e = new ERequest((short) 5, true); assertTrue(e.getDirection()); assertEquals(e.getFloorNum(), (short) 5); }