147 lines
6.1 KiB
Java
147 lines
6.1 KiB
Java
package de.hems.trafficsim;
|
|
|
|
import androidx.appcompat.app.AppCompatActivity;
|
|
|
|
import android.os.Bundle;
|
|
import android.view.View;
|
|
import android.widget.Button;
|
|
import android.widget.LinearLayout;
|
|
import android.widget.SeekBar;
|
|
import android.widget.TextView;
|
|
|
|
import java.util.Observable;
|
|
import java.util.Observer;
|
|
|
|
public class MainActivity extends AppCompatActivity implements Observer, SeekBar.OnSeekBarChangeListener {
|
|
public static final int defaultNoOfVehicles = 25;
|
|
public static final int defaultTrackLength = 100;
|
|
public static final float defaultBrakeProb = 0.3f;
|
|
public static final float defaultMaxVelocity = 5.0f;
|
|
protected Track track;
|
|
protected TimeRecordView trackView;
|
|
protected Worker worker;
|
|
protected LinearLayout viewStack;
|
|
|
|
@Override
|
|
protected void onCreate(Bundle savedInstanceState) {
|
|
super.onCreate(savedInstanceState);
|
|
setContentView(R.layout.activity_main);
|
|
this.track = new Track(defaultNoOfVehicles, defaultTrackLength, defaultBrakeProb, defaultMaxVelocity);
|
|
this.track.addObserver(this);
|
|
this.viewStack = (LinearLayout) findViewById(R.id.trackViewStack);
|
|
SeekBar trackLengthSeekBar = (SeekBar) findViewById(R.id.trackLengthSeekBar);
|
|
trackLengthSeekBar.setOnSeekBarChangeListener(this);
|
|
trackLengthSeekBar.setProgress(defaultTrackLength);
|
|
SeekBar maxVelocitySeekBar = (SeekBar) findViewById(R.id.maxVelocitySeekBar);
|
|
maxVelocitySeekBar.setOnSeekBarChangeListener(this);
|
|
maxVelocitySeekBar.setProgress((int)defaultMaxVelocity);
|
|
SeekBar noOfVehiclesSeekBar = (SeekBar) findViewById(R.id.noOfVehiclesSeekBar);
|
|
noOfVehiclesSeekBar.setOnSeekBarChangeListener(this);
|
|
noOfVehiclesSeekBar.setProgress(defaultNoOfVehicles);
|
|
SeekBar brakeProbabilitySeekBar = (SeekBar) findViewById(R.id.brakeProbabilitySeekBar);
|
|
brakeProbabilitySeekBar.setOnSeekBarChangeListener(this);
|
|
brakeProbabilitySeekBar.setProgress((int)(defaultBrakeProb*20));
|
|
}
|
|
|
|
@Override
|
|
public void update(Observable observable, Object o) {
|
|
final Track trackRef = this.track;
|
|
final LinearLayout viewStackRef = this.viewStack;
|
|
final MainActivity mainActivity = this;
|
|
final TextView lastAvgView = (TextView) findViewById(R.id.avgVeloLastView);
|
|
final TextView overallAvgView = (TextView) findViewById(R.id.avgVeloOverallView);
|
|
runOnUiThread(new Runnable() {
|
|
@Override
|
|
public void run() {
|
|
TimeRecordView newTrView = new TimeRecordView(mainActivity, trackRef);
|
|
if (viewStackRef.getChildCount() > 0)
|
|
viewStackRef.removeViewAt(0);
|
|
viewStackRef.addView(newTrView);
|
|
lastAvgView.setText(String.valueOf(trackRef.getLastAvg()));
|
|
overallAvgView.setText(String.valueOf(trackRef.getOverallAvg()));
|
|
}
|
|
});
|
|
}
|
|
|
|
public void onStepButtonClick(View view) {
|
|
this.track.timeElapse();
|
|
}
|
|
|
|
public void onPlayButtonClick(View view) {
|
|
Button playButton = (Button) findViewById(R.id.playButton);
|
|
playButton.setEnabled(false);
|
|
Button stepButton = (Button) findViewById(R.id.stepButton);
|
|
stepButton.setEnabled(false);
|
|
Button stopButton = (Button) findViewById(R.id.stopButton);
|
|
stopButton.setEnabled(true);
|
|
|
|
this.worker = new Worker(track);
|
|
this.worker.start();
|
|
}
|
|
|
|
public void onStopButtonClick(View view) {
|
|
Button playButton = (Button) findViewById(R.id.playButton);
|
|
playButton.setEnabled(true);
|
|
Button stepButton = (Button) findViewById(R.id.stepButton);
|
|
stepButton.setEnabled(true);
|
|
Button stopButton = (Button) findViewById(R.id.stopButton);
|
|
stopButton.setEnabled(false);
|
|
|
|
this.worker.setStop(true);
|
|
try {
|
|
this.worker.join();
|
|
} catch (InterruptedException ex) {
|
|
|
|
}
|
|
this.worker = null;
|
|
}
|
|
|
|
protected void updateTrack() {
|
|
int newTrackLength = ((SeekBar)(findViewById(R.id.trackLengthSeekBar))).getProgress();
|
|
SeekBar noOfVehiclesSeekBar = (SeekBar)(findViewById(R.id.noOfVehiclesSeekBar));
|
|
int newNoOfVehicles = noOfVehiclesSeekBar.getProgress();
|
|
if (newTrackLength < newNoOfVehicles) { // Dont allow values greater than track length!
|
|
newNoOfVehicles = (int) newTrackLength;
|
|
noOfVehiclesSeekBar.setProgress(newNoOfVehicles);
|
|
}
|
|
float newMaxVelocity = ((SeekBar) findViewById(R.id.maxVelocitySeekBar)).getProgress();
|
|
SeekBar brakeProbabilitySeekBar = (SeekBar) findViewById(R.id.brakeProbabilitySeekBar);
|
|
float newBrakeProb = (float)brakeProbabilitySeekBar.getProgress() / (float)brakeProbabilitySeekBar.getMax();
|
|
this.track = new Track(newNoOfVehicles, newTrackLength, newBrakeProb, newMaxVelocity);
|
|
this.track.addObserver(this);
|
|
if (this.worker != null) { // There was a simulation running already
|
|
this.worker.setStop(true);
|
|
try {
|
|
this.worker.join();
|
|
} catch (InterruptedException ex) {
|
|
}
|
|
this.worker = new Worker(track);
|
|
this.worker.start();
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
|
|
if (seekBar == (SeekBar)(findViewById(R.id.noOfVehiclesSeekBar))) {
|
|
this.updateTrack();
|
|
} else if (seekBar == (SeekBar)(findViewById(R.id.brakeProbabilitySeekBar))) {
|
|
float newBrakeProb = (float)seekBar.getProgress() / (float)seekBar.getMax();
|
|
System.out.println(newBrakeProb);
|
|
this.track.setBrakeProb(newBrakeProb);
|
|
} else if (seekBar == (SeekBar)(findViewById(R.id.maxVelocitySeekBar))) {
|
|
this.track.setMaxVelocity(seekBar.getProgress());
|
|
} else if (seekBar == (SeekBar)(findViewById(R.id.trackLengthSeekBar))) {
|
|
this.updateTrack();
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void onStartTrackingTouch(SeekBar seekBar) {
|
|
|
|
}
|
|
|
|
@Override
|
|
public void onStopTrackingTouch(SeekBar seekBar) {
|
|
|
|
}
|
|
} |