From ca1a82a9ee7defcd89bf600cee5732c96e4ed993 Mon Sep 17 00:00:00 2001 From: "Loch Christian (uib05376)" Date: Mon, 26 Oct 2020 21:17:40 +0100 Subject: [PATCH 1/2] Implement TrackView --- .../java/de/hems/trafficsim/MainActivity.java | 13 +++-- .../main/java/de/hems/trafficsim/Track.java | 12 +++-- .../java/de/hems/trafficsim/TrackView.java | 51 +++++++++++++++++++ .../main/java/de/hems/trafficsim/Vehicle.java | 4 ++ app/src/main/res/layout/activity_main.xml | 1 + 5 files changed, 73 insertions(+), 8 deletions(-) create mode 100644 app/src/main/java/de/hems/trafficsim/TrackView.java diff --git a/app/src/main/java/de/hems/trafficsim/MainActivity.java b/app/src/main/java/de/hems/trafficsim/MainActivity.java index caf7537..f185b30 100644 --- a/app/src/main/java/de/hems/trafficsim/MainActivity.java +++ b/app/src/main/java/de/hems/trafficsim/MainActivity.java @@ -1,6 +1,7 @@ package de.hems.trafficsim; import androidx.appcompat.app.AppCompatActivity; +import androidx.constraintlayout.widget.ConstraintLayout; import android.os.Bundle; import android.view.View; @@ -12,14 +13,17 @@ import java.util.Observer; public class MainActivity extends AppCompatActivity implements Observer { protected Track track; + protected TrackView trackView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); - this.track = new Track(20); + this.track = new Track(20, 50); + this.trackView = new TrackView(this, this.track); this.track.addObserver(this); - + ConstraintLayout layout = (ConstraintLayout) findViewById(R.id.constr_layout); + layout.addView(this.trackView); } @Override @@ -35,11 +39,12 @@ public class MainActivity extends AppCompatActivity implements Observer { TextView view = (TextView) findViewById(R.id.debugTextView); view.setText(s); view.invalidate(); + this.trackView.invalidate(); } public void onStepButtonClick (View view) { - for (int j = 0; j < 3000; j++) { + //for (int j = 0; j < 3000; j++) { this.track.timeElapse(50); - } + //} } } \ No newline at end of file diff --git a/app/src/main/java/de/hems/trafficsim/Track.java b/app/src/main/java/de/hems/trafficsim/Track.java index 0255ebf..3b16013 100644 --- a/app/src/main/java/de/hems/trafficsim/Track.java +++ b/app/src/main/java/de/hems/trafficsim/Track.java @@ -6,15 +6,19 @@ import java.util.Observable; public class Track extends Observable { protected List vehicles; - + protected float trackLength; public List getVehicles() { - return vehicles; } - public Track(int numberVehicles) { + public float getTrackLength() { + return trackLength; + } + + public Track(int numberVehicles, float trackLength) { this.vehicles = createVehiclesList(numberVehicles); + this.trackLength = trackLength; } protected List createVehiclesList(int numberVehicles){ @@ -37,7 +41,7 @@ public class Track extends Observable { Vehicle forerunner = vehicles.get(forerunnerIndex); float distanceForerunner = forerunner.getPosition() - v.getPosition() - 1; if(distanceForerunner < 0.0){ - distanceForerunner += 50; + distanceForerunner += this.trackLength; } v.updateVelocity(distanceForerunner); } diff --git a/app/src/main/java/de/hems/trafficsim/TrackView.java b/app/src/main/java/de/hems/trafficsim/TrackView.java new file mode 100644 index 0000000..20aee09 --- /dev/null +++ b/app/src/main/java/de/hems/trafficsim/TrackView.java @@ -0,0 +1,51 @@ +package de.hems.trafficsim; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.view.View; +import android.view.ViewGroup; + +public class TrackView extends View { + protected Paint paint; + protected Track track; + protected int pixelPerVehicle; + + public TrackView(Context context, Track track) { + super(context); + this.track = track; + this.paint = new Paint(); + paint.setColor(Color.BLACK); + paint.setStyle(Paint.Style.FILL_AND_STROKE); + } + + protected int getColor(float curVelocity, float maxVelocity) { + float perc = curVelocity / maxVelocity; + if (perc <= 0.5) { + int red = ((int) (2*perc*0xFF)) << 16; + int green = ((int)0xFF) << 8; + int blue = 0; + return 0xff000000 | red | green | blue; + } else { + int red = ((int)(0xFF)) << 16; + int green = ((int)(0xFF-0xFF*(perc-0.5)*2)) << 8; + int blue = 0; + return 0xff000000 | red | green | blue; + } + } + + @Override + protected void onDraw(Canvas canvas) { + this.pixelPerVehicle = (int) (this.getWidth() / this.track.getTrackLength()); + //super.onDraw(canvas); + int i = 0; + for (Vehicle v : this.track.getVehicles()) { + int left = (int) (this.pixelPerVehicle * v.getPosition()); + this.paint.setColor(getColor(v.getCurVelocity(), v.getMaxVelocity())); + canvas.drawRect(left, 0, left + this.pixelPerVehicle - 1, + 20, this.paint); + i++; + } + } +} diff --git a/app/src/main/java/de/hems/trafficsim/Vehicle.java b/app/src/main/java/de/hems/trafficsim/Vehicle.java index 5e2792d..e80c750 100644 --- a/app/src/main/java/de/hems/trafficsim/Vehicle.java +++ b/app/src/main/java/de/hems/trafficsim/Vehicle.java @@ -27,6 +27,10 @@ public class Vehicle { return curVelocity; } + public float getMaxVelocity() { + return maxVelocity; + } + public void updateVelocity(float distanceForerunner) { Random random = new Random(); diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 5d5c8ca..02df76f 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -2,6 +2,7 @@ From bffcddf6e2c55fbcb71b880720dc0464410ed8e4 Mon Sep 17 00:00:00 2001 From: "Loch Christian (uib05376)" Date: Thu, 29 Oct 2020 11:53:35 +0100 Subject: [PATCH 2/2] Add Start-Stop-Buttons, implement Threading --- .../java/de/hems/trafficsim/MainActivity.java | 66 +++++++++++++++---- .../main/java/de/hems/trafficsim/Track.java | 5 +- .../main/java/de/hems/trafficsim/Vehicle.java | 6 +- .../main/java/de/hems/trafficsim/Worker.java | 22 +++++++ app/src/main/res/layout/activity_main.xml | 27 +++++++- 5 files changed, 107 insertions(+), 19 deletions(-) create mode 100644 app/src/main/java/de/hems/trafficsim/Worker.java diff --git a/app/src/main/java/de/hems/trafficsim/MainActivity.java b/app/src/main/java/de/hems/trafficsim/MainActivity.java index f185b30..e2581c5 100644 --- a/app/src/main/java/de/hems/trafficsim/MainActivity.java +++ b/app/src/main/java/de/hems/trafficsim/MainActivity.java @@ -5,6 +5,7 @@ import androidx.constraintlayout.widget.ConstraintLayout; import android.os.Bundle; import android.view.View; +import android.widget.Button; import android.widget.TextView; import java.util.Observable; @@ -14,12 +15,13 @@ public class MainActivity extends AppCompatActivity implements Observer { protected Track track; protected TrackView trackView; + protected Worker worker; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); - this.track = new Track(20, 50); + this.track = new Track(25, 100); this.trackView = new TrackView(this, this.track); this.track.addObserver(this); ConstraintLayout layout = (ConstraintLayout) findViewById(R.id.constr_layout); @@ -28,23 +30,59 @@ public class MainActivity extends AppCompatActivity implements Observer { @Override public void update(Observable observable, Object o) { - String s = ""; - for (Vehicle v: this.track.getVehicles()){ - s+= "Vehicle " + v.id + " | " - + "Pos = " + v.getPosition() + " | " - + "Vel = " + v.getCurVelocity()+ " | " - + "\n"; - ; - } - TextView view = (TextView) findViewById(R.id.debugTextView); - view.setText(s); - view.invalidate(); - this.trackView.invalidate(); + final Track trackRef = this.track; + final TrackView viewRef = this.trackView; + runOnUiThread(new Runnable() { + @Override + public void run() { + String s = ""; + for (Vehicle v: trackRef.getVehicles()){ + s+= "Vehicle " + v.id + " | " + + "Pos = " + v.getPosition() + " | " + + "Vel = " + v.getCurVelocity()+ " | " + + "\n"; + ; + } + TextView view = (TextView) findViewById(R.id.debugTextView); + view.setText(s); + view.invalidate(); + viewRef.invalidate(); + } + }); + } - public void onStepButtonClick (View view) { + public void onStepButtonClick(View view) { //for (int j = 0; j < 3000; j++) { this.track.timeElapse(50); //} } + + public void onPlayButtonClick(View view) { + Button playButton = (Button) findViewById(R.id.playButton); + playButton.setEnabled(false); + Button stepButton = (Button) findViewById(R.id.stepButton); + stepButton.setEnabled(false); + Button stopButton = (Button) findViewById(R.id.stopButton); + stopButton.setEnabled(true); + + this.worker = new Worker(track); + this.worker.start(); + } + + public void onStopButtonClick(View view) { + 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.worker.setStop(true); + try { + this.worker.join(); + } catch (InterruptedException ex) { + + } + } } \ No newline at end of file diff --git a/app/src/main/java/de/hems/trafficsim/Track.java b/app/src/main/java/de/hems/trafficsim/Track.java index 3b16013..db6a655 100644 --- a/app/src/main/java/de/hems/trafficsim/Track.java +++ b/app/src/main/java/de/hems/trafficsim/Track.java @@ -17,14 +17,15 @@ public class Track extends Observable { } public Track(int numberVehicles, float trackLength) { - this.vehicles = createVehiclesList(numberVehicles); this.trackLength = trackLength; + this.vehicles = createVehiclesList(numberVehicles); + } protected List createVehiclesList(int numberVehicles){ List result = new ArrayList<>(); for(int i=0;i +