This commit is contained in:
Jeff Clement 2016-02-13 15:28:46 -07:00
parent e238d40bdd
commit 982d0fcf99
1 changed files with 21 additions and 25 deletions

View File

@ -23,6 +23,8 @@ typedef struct {
short pin;
// elapsed time for pin (0 means not finished)
unsigned int elapsedTime;
// placing
unsigned int place;
} Car;
// assume all cars are on sequential digital pins
@ -63,6 +65,7 @@ void setup()
void resetCars() {
for(short i=0; i<CAR_COUNT; i++) {
cars[i].elapsedTime = 0;
cars[i].place = 0;
}
}
@ -70,31 +73,15 @@ void displayTimers() {
short row = 0;
lcd.clear();
// keep track of cars that we've already printed a score for
bool seenCar[CAR_COUNT];
for (int i=0; i<CAR_COUNT; i++) {
seenCar[i] = false;
}
for(short place=0; place<min(CAR_COUNT, DISPLAY_LINES); place++) {
// find which is the fastest car that hasn't already been processed
short currentCar = -1;
for (short i=0; i<CAR_COUNT; i++) {
if (!seenCar[i] && cars[i].elapsedTime != 0 && (currentCar == -1 || cars[i].elapsedTime < cars[currentCar].elapsedTime)) {
currentCar = i;
for(unsigned short place=1; place<=min(CAR_COUNT, DISPLAY_LINES); place++) {
for (int i=0; i<CAR_COUNT; i++) {
if (cars[i].place == place) {
// only print the score if this car finished
lcd.setCursor(0,place-1);
sprintf(buffer, "%d%s: CAR%d @ %0.2fs", place, place==1?"st":(place==2?"nd":(place==3?"rd":"th")) , i+1, cars[i].elapsedTime/1000.0);
lcd.print(buffer);
}
}
// mark car as seen so we don't show the same car again
seenCar[currentCar] = true;
if (cars[currentCar].elapsedTime != 0) {
// only print the score if this car finished
lcd.setCursor(0,row++);
sprintf(buffer, "%d%s: CAR%d @ %0.2fs", place+1, place==0?"st":(place==1?"nd":(place==2?"rd":"th")) , currentCar+1, cars[currentCar].elapsedTime/1000.0);
lcd.print(buffer);
}
}
}
@ -106,7 +93,8 @@ unsigned long startTime; // start time in ms
#define STATE_RUNNING 2
#define STATE_DONE 3
short state = 0;
unsigned short state = 0;
unsigned short place = 0;
void loop()
{
@ -117,6 +105,7 @@ void loop()
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Ready...");
place = 0;
resetCars();
digitalWrite(PIN_LED, HIGH);
}
@ -137,8 +126,15 @@ void loop()
for(short i = 0; i<CAR_COUNT; i++) {
if (cars[i].elapsedTime == 0) {
if (digitalRead(cars[i].pin) == LOW) {
place++;
// car finished, record time
cars[i].elapsedTime = elapsedTime;
cars[i].place = place;
if (place < DISPLAY_LINES) {
lcd.setCursor(0,place-1);
sprintf(buffer, "%d%s: CAR%d @ %0.2fs", place, place==1?"st":(place==2?"nd":(place==3?"rd":"th")) , i+1, cars[i].elapsedTime/1000.0);
lcd.print(buffer);
}
} else {
allDone = false;
}
@ -148,7 +144,7 @@ void loop()
// stop race if all cars are done or MAX TIME exceeded
if (allDone || elapsedTime > MAX_TIME) {
state = STATE_DONE;
displayTimers();
//displayTimers();
}
}