From 9cad2f20f1e0d975c53b1de2b71e664ba4df0720 Mon Sep 17 00:00:00 2001 From: "Loch Christian (uib05376)" Date: Wed, 11 Nov 2020 20:53:03 +0100 Subject: [PATCH] Implement delayed average, add delay SeekBar, add clear button --- .../java/de/hems/trafficsim/MainActivity.java | 67 +++++++++-- .../main/java/de/hems/trafficsim/Track.java | 21 +++- app/src/main/res/layout/activity_main.xml | 110 +++++++++++++++++- 3 files changed, 181 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/de/hems/trafficsim/MainActivity.java b/app/src/main/java/de/hems/trafficsim/MainActivity.java index d347f50..5d1c2d6 100644 --- a/app/src/main/java/de/hems/trafficsim/MainActivity.java +++ b/app/src/main/java/de/hems/trafficsim/MainActivity.java @@ -17,6 +17,7 @@ public class MainActivity extends AppCompatActivity implements Observer, SeekBar public static final int defaultTrackLength = 100; public static final float defaultBrakeProb = 0.3f; public static final float defaultMaxVelocity = 5.0f; + public static final int defaultDelay = 0; protected Track track; protected TimeRecordView trackView; protected Worker worker; @@ -26,7 +27,8 @@ public class MainActivity extends AppCompatActivity implements Observer, SeekBar protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); - this.track = new Track(defaultNoOfVehicles, defaultTrackLength, defaultBrakeProb, defaultMaxVelocity); + this.track = new Track(defaultNoOfVehicles, defaultTrackLength, defaultBrakeProb, + defaultMaxVelocity, defaultDelay); this.track.addObserver(this); this.viewStack = (LinearLayout) findViewById(R.id.trackViewStack); @@ -49,6 +51,17 @@ public class MainActivity extends AppCompatActivity implements Observer, SeekBar brakeProbabilitySeekBar.setOnSeekBarChangeListener(this); brakeProbabilitySeekBar.setProgress((int)(defaultBrakeProb*20)); ((TextView)(findViewById(R.id.brakeProbTextView))).setText(String.valueOf(defaultBrakeProb)); + + SeekBar delaySeekBar = (SeekBar)(findViewById(R.id.simDelaySeekBar)); + delaySeekBar.setOnSeekBarChangeListener(this); + delaySeekBar.setProgress(defaultDelay); + + this.update(this.track, null); + } + + public static float round(float number, int digits) { + float div = (float) Math.pow(10.0f, digits); + return Math.round(number*div)/div; } @Override @@ -58,6 +71,8 @@ public class MainActivity extends AppCompatActivity implements Observer, SeekBar final MainActivity mainActivity = this; final TextView lastAvgView = (TextView) findViewById(R.id.avgVeloLastView); final TextView overallAvgView = (TextView) findViewById(R.id.avgVeloOverallView); + final TextView delayedAvgView = (TextView) findViewById(R.id.delayedAvgTextView); + final TextView stepsView = (TextView) findViewById(R.id.stepsTextView); runOnUiThread(new Runnable() { @Override public void run() { @@ -65,8 +80,11 @@ public class MainActivity extends AppCompatActivity implements Observer, SeekBar if (viewStackRef.getChildCount() > 0) viewStackRef.removeViewAt(0); viewStackRef.addView(newTrView); - lastAvgView.setText(String.valueOf(trackRef.getLastAvg())); - overallAvgView.setText(String.valueOf(trackRef.getOverallAvg())); + lastAvgView.setText(String.valueOf(round(trackRef.getLastAvg(), 2))); + overallAvgView.setText(String.valueOf(round(trackRef.getOverallAvg(), 2))); + stepsView.setText(String.valueOf(trackRef.getVtrList().size())); + delayedAvgView.setText(String.valueOf(round(trackRef.getDelayedAvg(), 2))); + } }); } @@ -82,6 +100,8 @@ public class MainActivity extends AppCompatActivity implements Observer, SeekBar stepButton.setEnabled(false); Button stopButton = (Button) findViewById(R.id.stopButton); stopButton.setEnabled(true); + Button clearButton = (Button) findViewById(R.id.clearButton); + clearButton.setEnabled(false); this.worker = new Worker(track); this.worker.start(); @@ -94,6 +114,8 @@ public class MainActivity extends AppCompatActivity implements Observer, SeekBar stepButton.setEnabled(true); Button stopButton = (Button) findViewById(R.id.stopButton); stopButton.setEnabled(false); + Button clearButton = (Button) findViewById(R.id.clearButton); + clearButton.setEnabled(true); this.worker.setStop(true); try { @@ -104,6 +126,31 @@ public class MainActivity extends AppCompatActivity implements Observer, SeekBar this.worker = null; } + protected void stopWorker() { + this.worker.setStop(true); + try { + this.worker.join(); + } catch (InterruptedException ex) { + } + this.worker = null; + } + + public void onClearButtonClick(View view) { + this.track.deleteObserver(this); + if (this.worker != null) { // There was a simulation running + this.stopWorker(); + } + 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.updateTrack(); + this.update(this.track, null); + + } + protected void updateTrack() { int newTrackLength = ((SeekBar)(findViewById(R.id.trackLengthSeekBar))).getProgress(); SeekBar noOfVehiclesSeekBar = (SeekBar)(findViewById(R.id.noOfVehiclesSeekBar)); @@ -123,14 +170,12 @@ public class MainActivity extends AppCompatActivity implements Observer, SeekBar SeekBar brakeProbabilitySeekBar = (SeekBar) findViewById(R.id.brakeProbabilitySeekBar); float newBrakeProb = (float)brakeProbabilitySeekBar.getProgress() / (float)brakeProbabilitySeekBar.getMax(); - this.track = new Track(newNoOfVehicles, newTrackLength, newBrakeProb, newMaxVelocity); + int newDelay = ((SeekBar)(findViewById(R.id.simDelaySeekBar))).getProgress(); + + this.track = new Track(newNoOfVehicles, newTrackLength, newBrakeProb, newMaxVelocity, newDelay); 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.stopWorker(); this.worker = new Worker(track); this.worker.start(); } @@ -151,6 +196,10 @@ public class MainActivity extends AppCompatActivity implements Observer, SeekBar tv.setText(String.valueOf(progress)); } else if (seekBar == (SeekBar)(findViewById(R.id.trackLengthSeekBar))) { this.updateTrack(); + } else if (seekBar == (SeekBar)(findViewById(R.id.simDelaySeekBar))) { + TextView tv = (TextView)(findViewById(R.id.simDelayTextView)); + tv.setText(String.valueOf(seekBar.getProgress())); + this.track.setWaitTime(seekBar.getProgress()); } } diff --git a/app/src/main/java/de/hems/trafficsim/Track.java b/app/src/main/java/de/hems/trafficsim/Track.java index 8d8f062..a010dd1 100644 --- a/app/src/main/java/de/hems/trafficsim/Track.java +++ b/app/src/main/java/de/hems/trafficsim/Track.java @@ -10,22 +10,23 @@ public class Track extends Observable { protected List> vtrList; protected float trackLength; protected float sumAvgMemory; + protected float sumDelAvgMemory; protected int historyLength; protected float overallAvg; + protected float delayedAvg; protected float lastAvg; protected int waitTime; protected float maxVelocity; protected float brakeProb; - public List> getVtrList() { - return vtrList; - } + public List> getVtrList() { return vtrList; } public float getOverallAvg() { return overallAvg; } public float getLastAvg() { return lastAvg; } + public float getDelayedAvg() { return delayedAvg; } public List getVehicles() { return vehicles; } @@ -33,16 +34,19 @@ public class Track extends Observable { return trackLength; } - public Track(int numberVehicles, float trackLength, float brakeProb, float maxVelocity) { + public Track(int numberVehicles, float trackLength, float brakeProb, float maxVelocity, int waitTime) { this.trackLength = trackLength; this.brakeProb = brakeProb; this.maxVelocity = maxVelocity; this.vehicles = createVehiclesList(numberVehicles); this.vtrList = new LinkedList<>(); this.sumAvgMemory = 0; + this.sumDelAvgMemory = 0; this.overallAvg = 0; + this.delayedAvg = 0; this.lastAvg = 0; this.historyLength = 25; + this.waitTime = waitTime; } @@ -56,6 +60,10 @@ public class Track extends Observable { return result; } + public void setWaitTime(int waitTime) { + this.waitTime = waitTime; + } + public void setBrakeProb(float brakeProb) { for (Vehicle v : this.vehicles) { v.setBrakeProb(brakeProb); @@ -108,8 +116,13 @@ public class Track extends Observable { protected void update_avg(){ lastAvg = avg_step(vtrList.size()-1); + if (this.vtrList.size() > 10) { + sumDelAvgMemory += lastAvg; + delayedAvg = sumDelAvgMemory / (vtrList.size() - 10); + } sumAvgMemory += lastAvg; overallAvg = sumAvgMemory / vtrList.size(); + } public float avg_span(int start, int end){ diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 3a6bcb0..80e2bd8 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -159,6 +159,29 @@ android:paddingTop="8dp" android:paddingBottom="8dp"> + + + + + + + + + @@ -169,10 +192,17 @@ android:layout_height="wrap_content" android:text="Average velocity (overall):" /> + + + android:layout_height="wrap_content" + android:text="0.0" /> + + + android:layout_height="wrap_content" + android:text="0.0" /> + + + + + + + + + @@ -209,14 +269,47 @@ + + + + + + + + + +