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.

166 lines
7.0KB

  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. protected Track track;
  17. protected TimeRecordView trackView;
  18. protected Worker worker;
  19. protected LinearLayout viewStack;
  20. @Override
  21. protected void onCreate(Bundle savedInstanceState) {
  22. super.onCreate(savedInstanceState);
  23. setContentView(R.layout.activity_main);
  24. this.track = new Track(defaultNoOfVehicles, defaultTrackLength, defaultBrakeProb, defaultMaxVelocity);
  25. this.track.addObserver(this);
  26. this.viewStack = (LinearLayout) findViewById(R.id.trackViewStack);
  27. SeekBar trackLengthSeekBar = (SeekBar) findViewById(R.id.trackLengthSeekBar);
  28. trackLengthSeekBar.setOnSeekBarChangeListener(this);
  29. trackLengthSeekBar.setProgress(defaultTrackLength);
  30. ((TextView)(findViewById(R.id.trackLengthTextView))).setText(String.valueOf(defaultTrackLength));
  31. SeekBar maxVelocitySeekBar = (SeekBar) findViewById(R.id.maxVelocitySeekBar);
  32. maxVelocitySeekBar.setOnSeekBarChangeListener(this);
  33. maxVelocitySeekBar.setProgress((int)defaultMaxVelocity);
  34. ((TextView)(findViewById(R.id.maxVeloTextView))).setText(String.valueOf((int)defaultMaxVelocity));
  35. SeekBar noOfVehiclesSeekBar = (SeekBar) findViewById(R.id.noOfVehiclesSeekBar);
  36. noOfVehiclesSeekBar.setOnSeekBarChangeListener(this);
  37. noOfVehiclesSeekBar.setProgress(defaultNoOfVehicles);
  38. ((TextView)(findViewById(R.id.noOfVehiclesTextView))).setText(String.valueOf(defaultNoOfVehicles));
  39. SeekBar brakeProbabilitySeekBar = (SeekBar) findViewById(R.id.brakeProbabilitySeekBar);
  40. brakeProbabilitySeekBar.setOnSeekBarChangeListener(this);
  41. brakeProbabilitySeekBar.setProgress((int)(defaultBrakeProb*20));
  42. ((TextView)(findViewById(R.id.brakeProbTextView))).setText(String.valueOf(defaultBrakeProb));
  43. }
  44. @Override
  45. public void update(Observable observable, Object o) {
  46. final Track trackRef = this.track;
  47. final LinearLayout viewStackRef = this.viewStack;
  48. final MainActivity mainActivity = this;
  49. final TextView lastAvgView = (TextView) findViewById(R.id.avgVeloLastView);
  50. final TextView overallAvgView = (TextView) findViewById(R.id.avgVeloOverallView);
  51. runOnUiThread(new Runnable() {
  52. @Override
  53. public void run() {
  54. TimeRecordView newTrView = new TimeRecordView(mainActivity, trackRef);
  55. if (viewStackRef.getChildCount() > 0)
  56. viewStackRef.removeViewAt(0);
  57. viewStackRef.addView(newTrView);
  58. lastAvgView.setText(String.valueOf(trackRef.getLastAvg()));
  59. overallAvgView.setText(String.valueOf(trackRef.getOverallAvg()));
  60. }
  61. });
  62. }
  63. public void onStepButtonClick(View view) {
  64. this.track.timeElapse();
  65. }
  66. public void onPlayButtonClick(View view) {
  67. Button playButton = (Button) findViewById(R.id.playButton);
  68. playButton.setEnabled(false);
  69. Button stepButton = (Button) findViewById(R.id.stepButton);
  70. stepButton.setEnabled(false);
  71. Button stopButton = (Button) findViewById(R.id.stopButton);
  72. stopButton.setEnabled(true);
  73. this.worker = new Worker(track);
  74. this.worker.start();
  75. }
  76. public void onStopButtonClick(View view) {
  77. Button playButton = (Button) findViewById(R.id.playButton);
  78. playButton.setEnabled(true);
  79. Button stepButton = (Button) findViewById(R.id.stepButton);
  80. stepButton.setEnabled(true);
  81. Button stopButton = (Button) findViewById(R.id.stopButton);
  82. stopButton.setEnabled(false);
  83. this.worker.setStop(true);
  84. try {
  85. this.worker.join();
  86. } catch (InterruptedException ex) {
  87. }
  88. this.worker = null;
  89. }
  90. protected void updateTrack() {
  91. int newTrackLength = ((SeekBar)(findViewById(R.id.trackLengthSeekBar))).getProgress();
  92. SeekBar noOfVehiclesSeekBar = (SeekBar)(findViewById(R.id.noOfVehiclesSeekBar));
  93. int newNoOfVehicles = noOfVehiclesSeekBar.getProgress();
  94. if (newTrackLength < newNoOfVehicles) { // Dont allow values greater than track length!
  95. newNoOfVehicles = (int) newTrackLength;
  96. noOfVehiclesSeekBar.setProgress(newNoOfVehicles);
  97. }
  98. TextView noOfVehiclesTextView = (TextView)(findViewById(R.id.noOfVehiclesTextView));
  99. noOfVehiclesTextView.setText(String.valueOf(newNoOfVehicles));
  100. TextView trackLengthTextView = (TextView)(findViewById(R.id.trackLengthTextView));
  101. trackLengthTextView.setText(String.valueOf(newTrackLength));
  102. float newMaxVelocity = ((SeekBar) findViewById(R.id.maxVelocitySeekBar)).getProgress();
  103. SeekBar brakeProbabilitySeekBar = (SeekBar) findViewById(R.id.brakeProbabilitySeekBar);
  104. float newBrakeProb = (float)brakeProbabilitySeekBar.getProgress() / (float)brakeProbabilitySeekBar.getMax();
  105. this.track = new Track(newNoOfVehicles, newTrackLength, newBrakeProb, newMaxVelocity);
  106. this.track.addObserver(this);
  107. if (this.worker != null) { // There was a simulation running already
  108. this.worker.setStop(true);
  109. try {
  110. this.worker.join();
  111. } catch (InterruptedException ex) {
  112. }
  113. this.worker = new Worker(track);
  114. this.worker.start();
  115. }
  116. }
  117. @Override
  118. public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
  119. if (seekBar == (SeekBar)(findViewById(R.id.noOfVehiclesSeekBar))) {
  120. this.updateTrack();
  121. } else if (seekBar == (SeekBar)(findViewById(R.id.brakeProbabilitySeekBar))) {
  122. float newBrakeProb = (float)seekBar.getProgress() / (float)seekBar.getMax();
  123. this.track.setBrakeProb(newBrakeProb);
  124. TextView newBrakeProbTextView = (TextView)(findViewById(R.id.brakeProbTextView));
  125. newBrakeProbTextView.setText(String.valueOf((newBrakeProb)));
  126. } else if (seekBar == (SeekBar)(findViewById(R.id.maxVelocitySeekBar))) {
  127. this.track.setMaxVelocity(seekBar.getProgress());
  128. TextView tv = (TextView)(findViewById(R.id.maxVeloTextView));
  129. tv.setText(String.valueOf(progress));
  130. } else if (seekBar == (SeekBar)(findViewById(R.id.trackLengthSeekBar))) {
  131. this.updateTrack();
  132. }
  133. }
  134. @Override
  135. public void onStartTrackingTouch(SeekBar seekBar) {
  136. }
  137. @Override
  138. public void onStopTrackingTouch(SeekBar seekBar) {
  139. }
  140. }