You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

215 lines
9.1KB

  1. package de.hems.trafficsim;
  2. import androidx.appcompat.app.AppCompatActivity;
  3. import android.os.Bundle;
  4. import android.view.View;
  5. import android.widget.Button;
  6. import android.widget.LinearLayout;
  7. import android.widget.SeekBar;
  8. import android.widget.TextView;
  9. import java.util.Observable;
  10. import java.util.Observer;
  11. public class MainActivity extends AppCompatActivity implements Observer, SeekBar.OnSeekBarChangeListener {
  12. public static final int defaultNoOfVehicles = 25;
  13. public static final int defaultTrackLength = 100;
  14. public static final float defaultBrakeProb = 0.3f;
  15. public static final float defaultMaxVelocity = 5.0f;
  16. public static final int defaultDelay = 0;
  17. protected Track track;
  18. protected TimeRecordView trackView;
  19. protected Worker worker;
  20. protected LinearLayout viewStack;
  21. @Override
  22. protected void onCreate(Bundle savedInstanceState) {
  23. super.onCreate(savedInstanceState);
  24. setContentView(R.layout.activity_main);
  25. this.track = new Track(defaultNoOfVehicles, defaultTrackLength, defaultBrakeProb,
  26. defaultMaxVelocity, defaultDelay);
  27. this.track.addObserver(this);
  28. this.viewStack = (LinearLayout) findViewById(R.id.trackViewStack);
  29. SeekBar trackLengthSeekBar = (SeekBar) findViewById(R.id.trackLengthSeekBar);
  30. trackLengthSeekBar.setOnSeekBarChangeListener(this);
  31. trackLengthSeekBar.setProgress(defaultTrackLength);
  32. ((TextView)(findViewById(R.id.trackLengthTextView))).setText(String.valueOf(defaultTrackLength));
  33. SeekBar maxVelocitySeekBar = (SeekBar) findViewById(R.id.maxVelocitySeekBar);
  34. maxVelocitySeekBar.setOnSeekBarChangeListener(this);
  35. maxVelocitySeekBar.setProgress((int)defaultMaxVelocity);
  36. ((TextView)(findViewById(R.id.maxVeloTextView))).setText(String.valueOf((int)defaultMaxVelocity));
  37. SeekBar noOfVehiclesSeekBar = (SeekBar) findViewById(R.id.noOfVehiclesSeekBar);
  38. noOfVehiclesSeekBar.setOnSeekBarChangeListener(this);
  39. noOfVehiclesSeekBar.setProgress(defaultNoOfVehicles);
  40. ((TextView)(findViewById(R.id.noOfVehiclesTextView))).setText(String.valueOf(defaultNoOfVehicles));
  41. SeekBar brakeProbabilitySeekBar = (SeekBar) findViewById(R.id.brakeProbabilitySeekBar);
  42. brakeProbabilitySeekBar.setOnSeekBarChangeListener(this);
  43. brakeProbabilitySeekBar.setProgress((int)(defaultBrakeProb*20));
  44. ((TextView)(findViewById(R.id.brakeProbTextView))).setText(String.valueOf(defaultBrakeProb));
  45. SeekBar delaySeekBar = (SeekBar)(findViewById(R.id.simDelaySeekBar));
  46. delaySeekBar.setOnSeekBarChangeListener(this);
  47. delaySeekBar.setProgress(defaultDelay);
  48. this.update(this.track, null);
  49. }
  50. public static float round(float number, int digits) {
  51. float div = (float) Math.pow(10.0f, digits);
  52. return Math.round(number*div)/div;
  53. }
  54. @Override
  55. public void update(Observable observable, Object o) {
  56. final Track trackRef = this.track;
  57. final LinearLayout viewStackRef = this.viewStack;
  58. final MainActivity mainActivity = this;
  59. final TextView lastAvgView = (TextView) findViewById(R.id.avgVeloLastView);
  60. final TextView overallAvgView = (TextView) findViewById(R.id.avgVeloOverallView);
  61. final TextView delayedAvgView = (TextView) findViewById(R.id.delayedAvgTextView);
  62. final TextView stepsView = (TextView) findViewById(R.id.stepsTextView);
  63. runOnUiThread(new Runnable() {
  64. @Override
  65. public void run() {
  66. TimeRecordView newTrView = new TimeRecordView(mainActivity, trackRef);
  67. if (viewStackRef.getChildCount() > 0)
  68. viewStackRef.removeViewAt(0);
  69. viewStackRef.addView(newTrView);
  70. lastAvgView.setText(String.valueOf(round(trackRef.getLastAvg(), 2)));
  71. overallAvgView.setText(String.valueOf(round(trackRef.getOverallAvg(), 2)));
  72. stepsView.setText(String.valueOf(trackRef.getVtrList().size()));
  73. delayedAvgView.setText(String.valueOf(round(trackRef.getDelayedAvg(), 2)));
  74. }
  75. });
  76. }
  77. public void onStepButtonClick(View view) {
  78. this.track.timeElapse();
  79. }
  80. public void onPlayButtonClick(View view) {
  81. Button playButton = (Button) findViewById(R.id.playButton);
  82. playButton.setEnabled(false);
  83. Button stepButton = (Button) findViewById(R.id.stepButton);
  84. stepButton.setEnabled(false);
  85. Button stopButton = (Button) findViewById(R.id.stopButton);
  86. stopButton.setEnabled(true);
  87. Button clearButton = (Button) findViewById(R.id.clearButton);
  88. clearButton.setEnabled(false);
  89. this.worker = new Worker(track);
  90. this.worker.start();
  91. }
  92. public void onStopButtonClick(View view) {
  93. Button playButton = (Button) findViewById(R.id.playButton);
  94. playButton.setEnabled(true);
  95. Button stepButton = (Button) findViewById(R.id.stepButton);
  96. stepButton.setEnabled(true);
  97. Button stopButton = (Button) findViewById(R.id.stopButton);
  98. stopButton.setEnabled(false);
  99. Button clearButton = (Button) findViewById(R.id.clearButton);
  100. clearButton.setEnabled(true);
  101. this.worker.setStop(true);
  102. try {
  103. this.worker.join();
  104. } catch (InterruptedException ex) {
  105. }
  106. this.worker = null;
  107. }
  108. protected void stopWorker() {
  109. this.worker.setStop(true);
  110. try {
  111. this.worker.join();
  112. } catch (InterruptedException ex) {
  113. }
  114. this.worker = null;
  115. }
  116. public void onClearButtonClick(View view) {
  117. this.track.deleteObserver(this);
  118. if (this.worker != null) { // There was a simulation running
  119. this.stopWorker();
  120. }
  121. Button playButton = (Button) findViewById(R.id.playButton);
  122. playButton.setEnabled(true);
  123. Button stepButton = (Button) findViewById(R.id.stepButton);
  124. stepButton.setEnabled(true);
  125. Button stopButton = (Button) findViewById(R.id.stopButton);
  126. stopButton.setEnabled(false);
  127. this.updateTrack();
  128. this.update(this.track, null);
  129. }
  130. protected void updateTrack() {
  131. int newTrackLength = ((SeekBar)(findViewById(R.id.trackLengthSeekBar))).getProgress();
  132. SeekBar noOfVehiclesSeekBar = (SeekBar)(findViewById(R.id.noOfVehiclesSeekBar));
  133. int newNoOfVehicles = noOfVehiclesSeekBar.getProgress();
  134. if (newTrackLength < newNoOfVehicles) { // Dont allow values greater than track length!
  135. newNoOfVehicles = (int) newTrackLength;
  136. noOfVehiclesSeekBar.setProgress(newNoOfVehicles);
  137. }
  138. TextView noOfVehiclesTextView = (TextView)(findViewById(R.id.noOfVehiclesTextView));
  139. noOfVehiclesTextView.setText(String.valueOf(newNoOfVehicles));
  140. TextView trackLengthTextView = (TextView)(findViewById(R.id.trackLengthTextView));
  141. trackLengthTextView.setText(String.valueOf(newTrackLength));
  142. float newMaxVelocity = ((SeekBar) findViewById(R.id.maxVelocitySeekBar)).getProgress();
  143. SeekBar brakeProbabilitySeekBar = (SeekBar) findViewById(R.id.brakeProbabilitySeekBar);
  144. float newBrakeProb = (float)brakeProbabilitySeekBar.getProgress() / (float)brakeProbabilitySeekBar.getMax();
  145. int newDelay = ((SeekBar)(findViewById(R.id.simDelaySeekBar))).getProgress();
  146. this.track = new Track(newNoOfVehicles, newTrackLength, newBrakeProb, newMaxVelocity, newDelay);
  147. this.track.addObserver(this);
  148. if (this.worker != null) { // There was a simulation running already
  149. this.stopWorker();
  150. this.worker = new Worker(track);
  151. this.worker.start();
  152. }
  153. }
  154. @Override
  155. public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
  156. if (seekBar == (SeekBar)(findViewById(R.id.noOfVehiclesSeekBar))) {
  157. this.updateTrack();
  158. } else if (seekBar == (SeekBar)(findViewById(R.id.brakeProbabilitySeekBar))) {
  159. float newBrakeProb = (float)seekBar.getProgress() / (float)seekBar.getMax();
  160. this.track.setBrakeProb(newBrakeProb);
  161. TextView newBrakeProbTextView = (TextView)(findViewById(R.id.brakeProbTextView));
  162. newBrakeProbTextView.setText(String.valueOf((newBrakeProb)));
  163. } else if (seekBar == (SeekBar)(findViewById(R.id.maxVelocitySeekBar))) {
  164. this.track.setMaxVelocity(seekBar.getProgress());
  165. TextView tv = (TextView)(findViewById(R.id.maxVeloTextView));
  166. tv.setText(String.valueOf(progress));
  167. } else if (seekBar == (SeekBar)(findViewById(R.id.trackLengthSeekBar))) {
  168. this.updateTrack();
  169. } else if (seekBar == (SeekBar)(findViewById(R.id.simDelaySeekBar))) {
  170. TextView tv = (TextView)(findViewById(R.id.simDelayTextView));
  171. tv.setText(String.valueOf(seekBar.getProgress()));
  172. this.track.setWaitTime(seekBar.getProgress());
  173. }
  174. }
  175. @Override
  176. public void onStartTrackingTouch(SeekBar seekBar) {
  177. }
  178. @Override
  179. public void onStopTrackingTouch(SeekBar seekBar) {
  180. }
  181. }