package OO14route66; import com.camilstaps.route66.Crossing; import java.util.ArrayList; import java.util.Observable; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.JFrame; /** * OO1route66 initial class * @author Pieter Koopman * * The class model holds all cars in the simulation */ public class Model extends Observable { private final Car [] cars; public static final int DIRECTIONS = 4, NUMBEROFCARS = 5 * DIRECTIONS; // total number of cars in system private final ArrayList views; private final Crossing crossing = new Crossing(this, Direction.North); /** * Constructor: create all cars */ public Model() { views = new ArrayList<>(); cars = new Car [NUMBEROFCARS]; for (int c = 0; c < NUMBEROFCARS; c += 1) { cars[c] = new Car(c, this); } } /** * add the view to this model. It will be repainted upon an update * @param view */ public void addView(JFrame view) { views.add(view); } public Car[] getCars() { return cars; } /** * get a car from the model * @param i numbers of required car * @return the car itself (not a copy) */ public Car getCar(int i) { return cars[i]; } /** * repaint all views */ public synchronized void update() { for (JFrame view: views) { view.repaint(); } notifyAll(); } /** * Check if a location is safe for a car to go to. This should always be * checked by a driver before actually driving. * @param car * @param requested_location * @return */ public synchronized boolean isSafeLocation(Car car, int requested_location) { Car that_car = cars[car.getNumber() < DIRECTIONS ? car.getNumber() + NUMBEROFCARS - DIRECTIONS : car.getNumber() - DIRECTIONS]; boolean ok; System.err.println("Car " + car.getNumber() + " requests safety."); do { ok = !(that_car.getLocation() > requested_location && that_car.getLocation() < requested_location + Car.CARLENGTH + Car.MINCARSPACE); // if (!ok && that_car.getDriver().getWaitingToCross()) { // crossing.doRequest(); // } if (car.isInFrontOfCrossing() && !crossing.isAllowed(car.getDirection())) { System.err.println("Requesting switch for car " + car.getNumber()); ok = false; //if (!car.getDriver().getWaitingToCross()) { //car.getDriver().setWaitingToCross(true); ok = crossing.doRequest(); //car.getDriver().setWaitingToCross(!ok); //} } if (!ok) { System.err.println("Car " + car.getNumber() + " waiting."); try { wait(); } catch (InterruptedException ex) { } System.err.println("Car " + car.getNumber() + " acquired lock."); } } while (!ok); System.err.println("Car " + car.getNumber() + " has safe location."); return ok; } public synchronized boolean isNoCarsOnCrossing() { boolean ok = false; while (!ok) { ok = true; for (Car car : cars) { if (car.isOnCrossing()) { System.err.println("Car " + car.getNumber() + " is on crossing."); ok = false; } } if (!ok) { System.err.println("Checking crossing waiting"); try { wait(); } catch (InterruptedException ex) { } System.err.println("Checking crossing"); } } return true; } }