Add history length constant
Optimize view update Add semaphore to TimeRecordList Add waiting timer to model update
This commit is contained in:
parent
457c9662c3
commit
05fe67bc12
@ -18,6 +18,7 @@ public class MainActivity extends AppCompatActivity implements Observer, SeekBar
|
|||||||
public static final float defaultBrakeProb = 0.3f;
|
public static final float defaultBrakeProb = 0.3f;
|
||||||
public static final float defaultMaxVelocity = 5.0f;
|
public static final float defaultMaxVelocity = 5.0f;
|
||||||
public static final int defaultDelay = 0;
|
public static final int defaultDelay = 0;
|
||||||
|
public static final int defaultHistoryLength = 50;
|
||||||
protected Track track;
|
protected Track track;
|
||||||
protected TimeRecordView trackView;
|
protected TimeRecordView trackView;
|
||||||
protected Worker worker;
|
protected Worker worker;
|
||||||
@ -28,9 +29,11 @@ public class MainActivity extends AppCompatActivity implements Observer, SeekBar
|
|||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
setContentView(R.layout.activity_main);
|
setContentView(R.layout.activity_main);
|
||||||
this.track = new Track(defaultNoOfVehicles, defaultTrackLength, defaultBrakeProb,
|
this.track = new Track(defaultNoOfVehicles, defaultTrackLength, defaultBrakeProb,
|
||||||
defaultMaxVelocity, defaultDelay);
|
defaultMaxVelocity, defaultDelay, defaultHistoryLength);
|
||||||
this.track.addObserver(this);
|
this.track.addObserver(this);
|
||||||
this.viewStack = (LinearLayout) findViewById(R.id.trackViewStack);
|
this.viewStack = (LinearLayout) findViewById(R.id.trackViewStack);
|
||||||
|
this.trackView = new TimeRecordView(this, track, defaultHistoryLength);
|
||||||
|
viewStack.addView(this.trackView);
|
||||||
|
|
||||||
SeekBar trackLengthSeekBar = (SeekBar) findViewById(R.id.trackLengthSeekBar);
|
SeekBar trackLengthSeekBar = (SeekBar) findViewById(R.id.trackLengthSeekBar);
|
||||||
trackLengthSeekBar.setOnSeekBarChangeListener(this);
|
trackLengthSeekBar.setOnSeekBarChangeListener(this);
|
||||||
@ -73,18 +76,22 @@ public class MainActivity extends AppCompatActivity implements Observer, SeekBar
|
|||||||
final TextView overallAvgView = (TextView) findViewById(R.id.avgVeloOverallView);
|
final TextView overallAvgView = (TextView) findViewById(R.id.avgVeloOverallView);
|
||||||
final TextView delayedAvgView = (TextView) findViewById(R.id.delayedAvgTextView);
|
final TextView delayedAvgView = (TextView) findViewById(R.id.delayedAvgTextView);
|
||||||
final TextView stepsView = (TextView) findViewById(R.id.stepsTextView);
|
final TextView stepsView = (TextView) findViewById(R.id.stepsTextView);
|
||||||
|
final TimeRecordView view = this.trackView;
|
||||||
runOnUiThread(new Runnable() {
|
runOnUiThread(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
TimeRecordView newTrView = new TimeRecordView(mainActivity, trackRef);
|
|
||||||
if (viewStackRef.getChildCount() > 0)
|
//TimeRecordView newTrView = new TimeRecordView(mainActivity, trackRef);
|
||||||
viewStackRef.removeViewAt(0);
|
trackView.invalidate();
|
||||||
viewStackRef.addView(newTrView);
|
//if (viewStackRef.getChildCount() > 0)
|
||||||
|
// viewStackRef.removeViewAt(0);
|
||||||
|
//viewStackRef.addView(newTrView);
|
||||||
lastAvgView.setText(String.valueOf(round(trackRef.getLastAvg(), 2)));
|
lastAvgView.setText(String.valueOf(round(trackRef.getLastAvg(), 2)));
|
||||||
overallAvgView.setText(String.valueOf(round(trackRef.getOverallAvg(), 2)));
|
overallAvgView.setText(String.valueOf(round(trackRef.getOverallAvg(), 2)));
|
||||||
stepsView.setText(String.valueOf(trackRef.getVtrList().size()));
|
stepsView.setText(String.valueOf(trackRef.getSteps()));
|
||||||
delayedAvgView.setText(String.valueOf(round(trackRef.getDelayedAvg(), 2)));
|
delayedAvgView.setText(String.valueOf(round(trackRef.getDelayedAvg(), 2)));
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -172,7 +179,8 @@ public class MainActivity extends AppCompatActivity implements Observer, SeekBar
|
|||||||
|
|
||||||
int newDelay = ((SeekBar)(findViewById(R.id.simDelaySeekBar))).getProgress();
|
int newDelay = ((SeekBar)(findViewById(R.id.simDelaySeekBar))).getProgress();
|
||||||
|
|
||||||
this.track = new Track(newNoOfVehicles, newTrackLength, newBrakeProb, newMaxVelocity, newDelay);
|
this.track = new Track(newNoOfVehicles, newTrackLength, newBrakeProb, newMaxVelocity, newDelay, defaultHistoryLength);
|
||||||
|
this.trackView.setTrack(this.track);
|
||||||
this.track.addObserver(this);
|
this.track.addObserver(this);
|
||||||
if (this.worker != null) { // There was a simulation running already
|
if (this.worker != null) { // There was a simulation running already
|
||||||
this.stopWorker();
|
this.stopWorker();
|
||||||
|
@ -14,11 +14,13 @@ public class TimeRecordView extends View {
|
|||||||
protected Track track;
|
protected Track track;
|
||||||
protected int pixelPerVehicle;
|
protected int pixelPerVehicle;
|
||||||
protected float tooShortPerTrackLength;
|
protected float tooShortPerTrackLength;
|
||||||
|
protected int historyLength;
|
||||||
|
|
||||||
public TimeRecordView(Context context, Track track) {
|
public TimeRecordView(Context context, Track track, int historyLength) {
|
||||||
super(context);
|
super(context);
|
||||||
this.track = track;
|
this.track = track;
|
||||||
this.paint = new Paint();
|
this.paint = new Paint();
|
||||||
|
this.historyLength = historyLength;
|
||||||
paint.setColor(Color.BLACK);
|
paint.setColor(Color.BLACK);
|
||||||
paint.setStyle(Paint.Style.FILL_AND_STROKE);
|
paint.setStyle(Paint.Style.FILL_AND_STROKE);
|
||||||
this.setBackgroundColor(Color.BLACK);
|
this.setBackgroundColor(Color.BLACK);
|
||||||
@ -26,6 +28,10 @@ public class TimeRecordView extends View {
|
|||||||
this.tooShortPerTrackLength = (this.getWidth() - this.pixelPerVehicle*this.track.getTrackLength())/this.track.getTrackLength();
|
this.tooShortPerTrackLength = (this.getWidth() - this.pixelPerVehicle*this.track.getTrackLength())/this.track.getTrackLength();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setTrack(Track track) {
|
||||||
|
this.track = track;
|
||||||
|
}
|
||||||
|
|
||||||
protected int getColor(float curVelocity, float maxVelocity) {
|
protected int getColor(float curVelocity, float maxVelocity) {
|
||||||
float perc = curVelocity / maxVelocity;
|
float perc = curVelocity / maxVelocity;
|
||||||
perc = 1 - perc;
|
perc = 1 - perc;
|
||||||
@ -60,18 +66,25 @@ public class TimeRecordView extends View {
|
|||||||
protected void onDraw(Canvas canvas) {
|
protected void onDraw(Canvas canvas) {
|
||||||
int y = 0;
|
int y = 0;
|
||||||
List<List<VehicleTimeRecord>> stepList = this.track.getVtrList();
|
List<List<VehicleTimeRecord>> stepList = this.track.getVtrList();
|
||||||
for (int curStepIdx = stepList.size()-1; curStepIdx >= stepList.size()-1-50 && curStepIdx >= 0; curStepIdx--) {
|
for (int curStepIdx = this.historyLength-1;
|
||||||
|
curStepIdx >= 0 && stepList.size() >= curStepIdx;
|
||||||
|
curStepIdx--) {
|
||||||
try {
|
try {
|
||||||
|
try {
|
||||||
|
track.getListSemaphore().acquire();
|
||||||
|
} catch (InterruptedException ex) { return; }
|
||||||
List<VehicleTimeRecord> step = stepList.get(curStepIdx);
|
List<VehicleTimeRecord> step = stepList.get(curStepIdx);
|
||||||
int i = 0;
|
int i = 0;
|
||||||
for (VehicleTimeRecord r : step) {
|
for (VehicleTimeRecord r : step) {
|
||||||
int left = (int) (this.pixelPerVehicle * r.getPosition());
|
int left = (int) (this.pixelPerVehicle * r.getPosition());
|
||||||
int compensate = Math.round(r.getPosition()*this.tooShortPerTrackLength);
|
int compensate = Math.round(r.getPosition()*this.tooShortPerTrackLength);
|
||||||
this.paint.setColor(getColor(r.getVelocity(), r.getMaxVelocity()));
|
this.paint.setColor(getColor(r.getVelocity(), r.getMaxVelocity()));
|
||||||
canvas.drawRect(left+compensate, y, left + this.pixelPerVehicle - 1+compensate,
|
canvas.drawRect(left+compensate, y,
|
||||||
|
left + this.pixelPerVehicle - 1+compensate,
|
||||||
y + 10, this.paint);
|
y + 10, this.paint);
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
track.getListSemaphore().release();
|
||||||
y += 10;
|
y += 10;
|
||||||
} catch (ConcurrentModificationException ex) {
|
} catch (ConcurrentModificationException ex) {
|
||||||
System.out.println("Concurrent Exception occured, skipping record");
|
System.out.println("Concurrent Exception occured, skipping record");
|
||||||
|
@ -4,6 +4,8 @@ import java.util.ArrayList;
|
|||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Observable;
|
import java.util.Observable;
|
||||||
|
import java.util.concurrent.Semaphore;
|
||||||
|
import java.util.concurrent.locks.LockSupport;
|
||||||
|
|
||||||
public class Track extends Observable {
|
public class Track extends Observable {
|
||||||
protected List<Vehicle> vehicles;
|
protected List<Vehicle> vehicles;
|
||||||
@ -18,6 +20,8 @@ public class Track extends Observable {
|
|||||||
protected int waitTime;
|
protected int waitTime;
|
||||||
protected float maxVelocity;
|
protected float maxVelocity;
|
||||||
protected float brakeProb;
|
protected float brakeProb;
|
||||||
|
protected long steps;
|
||||||
|
protected Semaphore listSemaphore;
|
||||||
|
|
||||||
public List<List<VehicleTimeRecord>> getVtrList() { return vtrList; }
|
public List<List<VehicleTimeRecord>> getVtrList() { return vtrList; }
|
||||||
public float getOverallAvg() {
|
public float getOverallAvg() {
|
||||||
@ -33,8 +37,10 @@ public class Track extends Observable {
|
|||||||
public float getTrackLength() {
|
public float getTrackLength() {
|
||||||
return trackLength;
|
return trackLength;
|
||||||
}
|
}
|
||||||
|
public long getSteps() { return steps; }
|
||||||
|
public Semaphore getListSemaphore() { return listSemaphore; }
|
||||||
|
|
||||||
public Track(int numberVehicles, float trackLength, float brakeProb, float maxVelocity, int waitTime) {
|
public Track(int numberVehicles, float trackLength, float brakeProb, float maxVelocity, int waitTime, int historyLength) {
|
||||||
this.trackLength = trackLength;
|
this.trackLength = trackLength;
|
||||||
this.brakeProb = brakeProb;
|
this.brakeProb = brakeProb;
|
||||||
this.maxVelocity = maxVelocity;
|
this.maxVelocity = maxVelocity;
|
||||||
@ -45,8 +51,10 @@ public class Track extends Observable {
|
|||||||
this.overallAvg = 0;
|
this.overallAvg = 0;
|
||||||
this.delayedAvg = 0;
|
this.delayedAvg = 0;
|
||||||
this.lastAvg = 0;
|
this.lastAvg = 0;
|
||||||
this.historyLength = 25;
|
this.historyLength = historyLength;
|
||||||
this.waitTime = waitTime;
|
this.waitTime = waitTime;
|
||||||
|
this.steps = 0;
|
||||||
|
this.listSemaphore = new Semaphore(1);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -90,17 +98,28 @@ public class Track extends Observable {
|
|||||||
}
|
}
|
||||||
v.updateVelocity(distanceForerunner);
|
v.updateVelocity(distanceForerunner);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
this.listSemaphore.acquire();
|
||||||
|
} catch (InterruptedException ex) {return;}
|
||||||
List <VehicleTimeRecord> records = new ArrayList<>(vehicles.size());
|
List <VehicleTimeRecord> records = new ArrayList<>(vehicles.size());
|
||||||
this.vtrList.add(records);
|
this.vtrList.add(records);
|
||||||
|
if (this.vtrList.size() > this.historyLength) {
|
||||||
|
this.vtrList.remove(0);
|
||||||
|
}
|
||||||
for(Vehicle v: vehicles){
|
for(Vehicle v: vehicles){
|
||||||
v.timeElapse();
|
v.timeElapse();
|
||||||
VehicleTimeRecord vtr = new VehicleTimeRecord(v.id, v.position, v.curVelocity, v.maxVelocity);
|
VehicleTimeRecord vtr = new VehicleTimeRecord(v.id, v.position, v.curVelocity, v.maxVelocity);
|
||||||
records.add(vtr);
|
records.add(vtr);
|
||||||
}
|
}
|
||||||
|
steps++;
|
||||||
|
this.listSemaphore.release();
|
||||||
|
|
||||||
update_avg();
|
update_avg();
|
||||||
this.setChanged();
|
this.setChanged();
|
||||||
this.notifyObservers();
|
this.notifyObservers();
|
||||||
this.clearChanged();
|
this.clearChanged();
|
||||||
|
LockSupport.parkNanos(1);
|
||||||
try {
|
try {
|
||||||
Thread.sleep(waitTime);
|
Thread.sleep(waitTime);
|
||||||
} catch (InterruptedException ex) { }
|
} catch (InterruptedException ex) { }
|
||||||
@ -116,12 +135,12 @@ public class Track extends Observable {
|
|||||||
|
|
||||||
protected void update_avg(){
|
protected void update_avg(){
|
||||||
lastAvg = avg_step(vtrList.size()-1);
|
lastAvg = avg_step(vtrList.size()-1);
|
||||||
if (this.vtrList.size() > 10) {
|
if (this.steps > 10) {
|
||||||
sumDelAvgMemory += lastAvg;
|
sumDelAvgMemory += lastAvg;
|
||||||
delayedAvg = sumDelAvgMemory / (vtrList.size() - 10);
|
delayedAvg = sumDelAvgMemory / (this.steps - 10);
|
||||||
}
|
}
|
||||||
sumAvgMemory += lastAvg;
|
sumAvgMemory += lastAvg;
|
||||||
overallAvg = sumAvgMemory / vtrList.size();
|
overallAvg = sumAvgMemory / this.steps;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -46,7 +46,6 @@ public class Vehicle {
|
|||||||
curVelocity = curVelocity + 1;
|
curVelocity = curVelocity + 1;
|
||||||
}
|
}
|
||||||
if (r < brakeProb && curVelocity > 0) {
|
if (r < brakeProb && curVelocity > 0) {
|
||||||
System.out.println("vehicle: "+brakeProb);
|
|
||||||
curVelocity = curVelocity - 1;
|
curVelocity = curVelocity - 1;
|
||||||
}
|
}
|
||||||
if (curVelocity > distanceForerunner) {
|
if (curVelocity > distanceForerunner) {
|
||||||
|
Loading…
Reference in New Issue
Block a user