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.

223 lines
9.4KB

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