/*
This file is part of JOP, the Java Optimized Processor
see <http://www.jopdesign.com/>
Copyright (C) 2010, Wolfgang Puffitsch <wpuffits@mail.tuwien.ac.at>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package cruiser.model;
import cruiser.common.*;
public class TrackGenerator extends Thread {
private int generatorStep = 0;
private CarModel car;
public TrackGenerator(CarModel car) {
this.car = car;
}
public void run() {
for (;;) {
long startTime = System.currentTimeMillis();
double currentTime = car.timestep*CarModel.TIME_SCALE;
GeneratorItem currentItem = generatorList[generatorStep];
// check whether we should send a new message
if (Double.compare(currentTime, currentItem.time) >= 0) {
car.setIncline(currentItem.incline);
car.setTargetSpeed(currentItem.targetSpeed);
WireMessage msg = new WireTargetSpeedMessage(WireMessage.Type.TARGET_SPEED,
(short)(currentItem.targetSpeed/3.6*100),
(short)(currentItem.targetDistance*10));
System.out.print(msg.toString());
generatorStep++;
}
// run until all items are consumed
if (generatorStep >= generatorList.length) {
break;
}
long elapsedTime = System.currentTimeMillis() - startTime;
try {
if (elapsedTime < CarModel.TIME_SCALE*1000) {
sleep((int)(CarModel.TIME_SCALE*1000-elapsedTime));
}
} catch (InterruptedException exc) {
// ignore
}
}
}
private class GeneratorItem {
final double time; // seconds
final double targetSpeed; // km/h
final double targetDistance; // meters
final double incline;
GeneratorItem(double time, double targetSpeed, double targetDistance, double incline) {
this.time = time;
this.targetSpeed = targetSpeed;
this.targetDistance = targetDistance;
this.incline = incline;
}
}
private final GeneratorItem [] generatorList = {
new GeneratorItem(0.0, 100.0, 100.0, 0.0),
new GeneratorItem(10.0, 50.0, 150.0, 0.05),
new GeneratorItem(20.0, 25.0, 100.0, -0.15),
new GeneratorItem(30.0, 100.0, 0.0, 0.01),
new GeneratorItem(40.0, 0.0, 100.0, -0.15),
new GeneratorItem(60.0, 150.0, 500.0, 0.25),
new GeneratorItem(70.0, 150.0, 500.0, 0.0),
new GeneratorItem(90.0, 0.0, 85.0, 0.0),
new GeneratorItem(100.0, 5.0, 5.0, 0.30),
new GeneratorItem(130.0, 5.0, 5.0, -0.30),
new GeneratorItem(160.0, 5.0, 5.0, 0.00)
};
}