blob: ee9da42ef15f7262ef63b1c3af5303e312bba062 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
|
package OO14route66;
import java.util.ArrayList;
import java.util.Observable;
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<JFrame> views;
//private final Crossing crossing = new Crossing(this, Direction.North);
private Direction allowed;
private boolean crossingWaiting = false;
private long lastCrossingChange = 0;
private static final int MIN_CROSS_TIME = 1000;
/**
* 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 = !(that_car.getLocation() > requested_location &&
that_car.getLocation() < requested_location + Car.CARLENGTH + Car.MINCARSPACE);
if (car.isInFrontOfCrossing() && !isCrossingAllowed(car.getDirection())) {
ok = doCrossingRequest();
}
if (!ok) {
try {
wait();
} catch (InterruptedException ex) {
}
}
return ok;
}
public synchronized boolean isCarsOnCrossing() {
for (Car car : cars) {
if (car.isOnCrossing()) {
return true;
}
}
return false;
}
public synchronized void doSwitchCrossing() {
crossingWaiting = true;
while (isCarsOnCrossing()) {
try {
wait();
} catch (InterruptedException ex) {
}
}
System.err.println("Switching");
if (allowed == Direction.East || allowed == Direction.West) {
allowed = Direction.North;
} else {
allowed = Direction.East;
}
System.err.println("Switched to " + allowed);
crossingWaiting = false;
lastCrossingChange = System.currentTimeMillis();
}
public synchronized boolean isCrossingAllowed(Direction direction) {
return !crossingWaiting && (direction == allowed || Direction.opposite(direction) == allowed);
}
public synchronized boolean doCrossingRequest() {
if (crossingWaiting || System.currentTimeMillis() - lastCrossingChange < MIN_CROSS_TIME) {
return false;
}
doSwitchCrossing();
return true;
}
}
|