diff --git a/app/src/main/java/de/hems/trafficsim/MainActivity.java b/app/src/main/java/de/hems/trafficsim/MainActivity.java index ac433a3..840a39c 100644 --- a/app/src/main/java/de/hems/trafficsim/MainActivity.java +++ b/app/src/main/java/de/hems/trafficsim/MainActivity.java @@ -1,21 +1,22 @@ package de.hems.trafficsim; import androidx.appcompat.app.AppCompatActivity; -import androidx.constraintlayout.widget.ConstraintLayout; import android.os.Bundle; -import android.os.Looper; import android.view.View; import android.widget.Button; import android.widget.LinearLayout; +import android.widget.SeekBar; import android.widget.TextView; -import java.util.List; import java.util.Observable; import java.util.Observer; -public class MainActivity extends AppCompatActivity implements 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; @@ -25,19 +26,30 @@ public class MainActivity extends AppCompatActivity implements Observer { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); - this.track = new Track(25, 100); + 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 TimeRecordView viewRef = this.trackView; final LinearLayout viewStackRef = this.viewStack; - //final List newRecords = (List) o; 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() { @@ -45,10 +57,10 @@ public class MainActivity extends AppCompatActivity implements Observer { 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) { @@ -81,5 +93,55 @@ public class MainActivity extends AppCompatActivity implements Observer { } 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) { + } } \ No newline at end of file diff --git a/app/src/main/java/de/hems/trafficsim/TimeRecordView.java b/app/src/main/java/de/hems/trafficsim/TimeRecordView.java index 5997931..a8d7f74 100644 --- a/app/src/main/java/de/hems/trafficsim/TimeRecordView.java +++ b/app/src/main/java/de/hems/trafficsim/TimeRecordView.java @@ -72,6 +72,7 @@ public class TimeRecordView extends View { y += 10; } catch (ConcurrentModificationException ex) { System.out.println("Concurrent Exception occured, skipping record"); + y += 10; continue; } } diff --git a/app/src/main/java/de/hems/trafficsim/Track.java b/app/src/main/java/de/hems/trafficsim/Track.java index 4804ee0..8d8f062 100644 --- a/app/src/main/java/de/hems/trafficsim/Track.java +++ b/app/src/main/java/de/hems/trafficsim/Track.java @@ -7,47 +7,67 @@ import java.util.Observable; public class Track extends Observable { protected List vehicles; - - public List> getVtrList() { - return vtrList; - } - protected List> vtrList; protected float trackLength; protected float sumAvgMemory; + protected int historyLength; + protected float overallAvg; + protected float lastAvg; + protected int waitTime; + protected float maxVelocity; + protected float brakeProb; + public List> getVtrList() { + return vtrList; + } + public float getOverallAvg() { + return overallAvg; + } public float getLastAvg() { return lastAvg; } - - protected float lastAvg; - public List getVehicles() { return vehicles; } - public float getTrackLength() { return trackLength; } - public Track(int numberVehicles, float trackLength) { + public Track(int numberVehicles, float trackLength, float brakeProb, float maxVelocity) { this.trackLength = trackLength; + this.brakeProb = brakeProb; + this.maxVelocity = maxVelocity; this.vehicles = createVehiclesList(numberVehicles); this.vtrList = new LinkedList<>(); this.sumAvgMemory = 0; + this.overallAvg = 0; this.lastAvg = 0; + this.historyLength = 25; + } protected List createVehiclesList(int numberVehicles){ List result = new ArrayList<>(); for(int i=0;i 0) { - curVelocity = getCurVelocity() - 1; + if (r < brakeProb && curVelocity > 0) { + System.out.println("vehicle: "+brakeProb); + curVelocity = curVelocity - 1; } if (curVelocity > distanceForerunner) { curVelocity = distanceForerunner; } - } public void timeElapse() { diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 4567ba7..8981dd3 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -39,12 +39,13 @@ android:text="Track length" /> + android:max="250" + android:min="1" + android:progress="50" /> + android:max="20" + android:min="0" + android:progress="6" /> @@ -113,10 +116,9 @@ android:text="Average velocity (overall):" /> + android:layout_height="wrap_content" /> + android:layout_height="wrap_content" />