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.

227 lines
9.9KB

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