|
|
|
@ -36,7 +36,7 @@ enum buttonStates { |
|
|
|
|
NUM_BUTTONSTATES |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
enum screenStates { |
|
|
|
|
enum machineStates { |
|
|
|
|
BOOT_UP, |
|
|
|
|
PRESSURE, |
|
|
|
|
SET_POINT, |
|
|
|
@ -71,7 +71,7 @@ enum buttonStates upButton = OPEN; |
|
|
|
|
enum buttonStates enterButton = OPEN; |
|
|
|
|
enum buttonStates downButton = OPEN; |
|
|
|
|
|
|
|
|
|
enum screenStates screenState = BOOT_UP; |
|
|
|
|
enum machineStates machineState = BOOT_UP; |
|
|
|
|
double pressureValue = 0.0; |
|
|
|
|
int pressureSetPoint = 0; |
|
|
|
|
double initialPressure = 0.0; |
|
|
|
@ -108,9 +108,9 @@ void setup() |
|
|
|
|
|
|
|
|
|
#ifdef SIMULATE |
|
|
|
|
initSimulation(); |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
#else |
|
|
|
|
initHardware(); |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
resamplePressure(pressureValue); |
|
|
|
|
} |
|
|
|
@ -118,7 +118,7 @@ void setup() |
|
|
|
|
void loop() { |
|
|
|
|
measurePressure(pressureValue); |
|
|
|
|
pollButtons(); |
|
|
|
|
runUI(); |
|
|
|
|
runStateMachine(); |
|
|
|
|
logData(); |
|
|
|
|
|
|
|
|
|
#ifdef SIMULATE |
|
|
|
@ -130,7 +130,9 @@ void logData() { |
|
|
|
|
static unsigned long lastLogTime = millis(); |
|
|
|
|
|
|
|
|
|
if (millis() > lastLogTime + 100) { |
|
|
|
|
Serial.print("pressure: "); |
|
|
|
|
Serial.print("millis: "); |
|
|
|
|
Serial.print(millis()); |
|
|
|
|
Serial.print(", pressure: "); |
|
|
|
|
Serial.print(pressureValue); |
|
|
|
|
#ifdef SIMULATE |
|
|
|
|
Serial.print(", simulated: "); |
|
|
|
@ -143,15 +145,15 @@ void logData() { |
|
|
|
|
Serial.print(", setpoint: "); |
|
|
|
|
Serial.print(pressureSetPoint); |
|
|
|
|
Serial.print(", state: "); |
|
|
|
|
Serial.print(stateLabels[screenState]); |
|
|
|
|
Serial.print(stateLabels[machineState]); |
|
|
|
|
Serial.println(""); |
|
|
|
|
|
|
|
|
|
lastLogTime = millis(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void runUI() { |
|
|
|
|
static enum screenStates nextState = BOOT_UP; |
|
|
|
|
void runStateMachine() { |
|
|
|
|
static enum machineStates nextState = BOOT_UP; |
|
|
|
|
|
|
|
|
|
static unsigned long timer = millis(); |
|
|
|
|
|
|
|
|
@ -165,10 +167,10 @@ void runUI() { |
|
|
|
|
|
|
|
|
|
oled.clearDisplay(); |
|
|
|
|
|
|
|
|
|
switch (screenState) { |
|
|
|
|
switch (machineState) { |
|
|
|
|
case BOOT_UP: |
|
|
|
|
if (millis() >= timer + 2000) { |
|
|
|
|
screenState = PRESSURE; |
|
|
|
|
machineState = PRESSURE; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
oled.setCursor(0,0); |
|
|
|
@ -184,25 +186,25 @@ void runUI() { |
|
|
|
|
|
|
|
|
|
case PRESSURE: |
|
|
|
|
if (enterButton == PRESSED) { |
|
|
|
|
screenState = SAY_HOLD; |
|
|
|
|
machineState = SAY_HOLD; |
|
|
|
|
nextState = PRESSURE; |
|
|
|
|
timer = millis(); |
|
|
|
|
} else if (enterButton == HELD) { |
|
|
|
|
; // settings?
|
|
|
|
|
} else if (upButton == PRESSED) { |
|
|
|
|
screenState = SET_POINT; |
|
|
|
|
machineState = SET_POINT; |
|
|
|
|
pressureSetPoint = debouncedPressureValue+1; |
|
|
|
|
timer = millis(); |
|
|
|
|
} else if (downButton == PRESSED) { |
|
|
|
|
screenState = SET_POINT; |
|
|
|
|
machineState = SET_POINT; |
|
|
|
|
pressureSetPoint = debouncedPressureValue-1; |
|
|
|
|
timer = millis(); |
|
|
|
|
} else if (upButton == HELD) { |
|
|
|
|
screenState = SET_POINT; |
|
|
|
|
machineState = SET_POINT; |
|
|
|
|
pressureSetPoint = debouncedPressureValue+1; |
|
|
|
|
timer = millis(); |
|
|
|
|
} else if (downButton == HELD) { |
|
|
|
|
screenState = SET_POINT; |
|
|
|
|
machineState = SET_POINT; |
|
|
|
|
pressureSetPoint = debouncedPressureValue-1; |
|
|
|
|
timer = millis(); |
|
|
|
|
} |
|
|
|
@ -217,12 +219,12 @@ void runUI() { |
|
|
|
|
|
|
|
|
|
case SET_POINT: |
|
|
|
|
if (enterButton == PRESSED) { |
|
|
|
|
screenState = SAY_HOLD; |
|
|
|
|
machineState = SAY_HOLD; |
|
|
|
|
nextState = SET_POINT; |
|
|
|
|
timer = millis(); |
|
|
|
|
} else if (enterButton == HELD) { |
|
|
|
|
timer = millis(); |
|
|
|
|
screenState = INIT_RUN; |
|
|
|
|
machineState = INIT_RUN; |
|
|
|
|
} else if (upButton == PRESSED) { |
|
|
|
|
timer = millis(); |
|
|
|
|
pressureSetPoint++; |
|
|
|
@ -238,7 +240,7 @@ void runUI() { |
|
|
|
|
pressureSetPoint--; |
|
|
|
|
delay(75); |
|
|
|
|
} else if (millis() >= timer + TIMEOUT_TIME) { |
|
|
|
|
screenState = SAY_TIMEOUT; |
|
|
|
|
machineState = SAY_TIMEOUT; |
|
|
|
|
nextState = PRESSURE; |
|
|
|
|
timer = millis(); |
|
|
|
|
} |
|
|
|
@ -258,7 +260,7 @@ void runUI() { |
|
|
|
|
initialPressure = pressureValue; |
|
|
|
|
startTime = millis(); |
|
|
|
|
timer = millis(); |
|
|
|
|
screenState = BEGIN_RUN; |
|
|
|
|
machineState = BEGIN_RUN; |
|
|
|
|
|
|
|
|
|
oled.setCursor(0,0); |
|
|
|
|
oled.setTextSize(1); |
|
|
|
@ -276,7 +278,7 @@ void runUI() { |
|
|
|
|
isInflating = false; |
|
|
|
|
} else { |
|
|
|
|
setSoleniod(SOLENOID_STOP); |
|
|
|
|
screenState = SAY_DONE; |
|
|
|
|
machineState = SAY_DONE; |
|
|
|
|
nextState = PRESSURE; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -288,7 +290,7 @@ void runUI() { |
|
|
|
|
if (millis() >= timer + 5000) { |
|
|
|
|
//runningPressure = pressureValue;
|
|
|
|
|
setSoleniod(SOLENOID_STOP); |
|
|
|
|
screenState = MEASURING; |
|
|
|
|
machineState = MEASURING; |
|
|
|
|
timer = millis(); |
|
|
|
|
stopTime = millis(); |
|
|
|
|
} |
|
|
|
@ -296,6 +298,12 @@ void runUI() { |
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
case MEASURING: |
|
|
|
|
if (millis() < timer + 500) { |
|
|
|
|
// wait for solenoids to settle before averaging
|
|
|
|
|
resamplePressure(pressureValue); |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (millis() >= timer + 3000) { |
|
|
|
|
sampledPressure = pressureValue; |
|
|
|
|
|
|
|
|
@ -316,24 +324,19 @@ void runUI() { |
|
|
|
|
initialPressure = sampledPressure; |
|
|
|
|
|
|
|
|
|
if (isInflating && (int) sampledPressure >= pressureSetPoint) { |
|
|
|
|
screenState = SAY_DONE; |
|
|
|
|
machineState = SAY_DONE; |
|
|
|
|
nextState = PRESSURE; |
|
|
|
|
} else if (isDeflating && (int) sampledPressure <= pressureSetPoint) { |
|
|
|
|
screenState = SAY_DONE; |
|
|
|
|
machineState = SAY_DONE; |
|
|
|
|
nextState = PRESSURE; |
|
|
|
|
} else { |
|
|
|
|
screenState = RUNNING; |
|
|
|
|
machineState = RUNNING; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
timer = millis(); |
|
|
|
|
startTime = millis(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (millis() < timer + 500) { |
|
|
|
|
// wait for solenoids to settle before averaging
|
|
|
|
|
resamplePressure(pressureValue); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
setSoleniod(SOLENOID_STOP); |
|
|
|
|
|
|
|
|
|
oled.setCursor(0,0); |
|
|
|
@ -348,27 +351,27 @@ void runUI() { |
|
|
|
|
case RUNNING: |
|
|
|
|
if (enterButton == PRESSED) { |
|
|
|
|
setSoleniod(SOLENOID_STOP); |
|
|
|
|
screenState = SAY_CANCEL; |
|
|
|
|
machineState = SAY_CANCEL; |
|
|
|
|
nextState = PRESSURE; |
|
|
|
|
timer = millis(); |
|
|
|
|
} else if (upButton == PRESSED) { |
|
|
|
|
setSoleniod(SOLENOID_STOP); |
|
|
|
|
screenState = SAY_CANCEL; |
|
|
|
|
machineState = SAY_CANCEL; |
|
|
|
|
nextState = PRESSURE; |
|
|
|
|
timer = millis(); |
|
|
|
|
} else if (downButton == PRESSED) { |
|
|
|
|
setSoleniod(SOLENOID_STOP); |
|
|
|
|
screenState = SAY_CANCEL; |
|
|
|
|
machineState = SAY_CANCEL; |
|
|
|
|
nextState = PRESSURE; |
|
|
|
|
timer = millis(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (isInflating && millis() >= timer + 20000) { |
|
|
|
|
screenState = MEASURING; |
|
|
|
|
machineState = MEASURING; |
|
|
|
|
timer = millis(); |
|
|
|
|
stopTime = millis(); |
|
|
|
|
} else if (isDeflating && millis() >= timer + 10000) { |
|
|
|
|
screenState = MEASURING; |
|
|
|
|
machineState = MEASURING; |
|
|
|
|
timer = millis(); |
|
|
|
|
stopTime = millis(); |
|
|
|
|
} |
|
|
|
@ -403,7 +406,7 @@ void runUI() { |
|
|
|
|
|
|
|
|
|
case SAY_DONE: |
|
|
|
|
if (millis() >= timer + 3000) { |
|
|
|
|
screenState = nextState; |
|
|
|
|
machineState = nextState; |
|
|
|
|
timer = millis(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -417,7 +420,7 @@ void runUI() { |
|
|
|
|
|
|
|
|
|
case SAY_CANCEL: |
|
|
|
|
if (millis() >= timer + 1000) { |
|
|
|
|
screenState = nextState; |
|
|
|
|
machineState = nextState; |
|
|
|
|
timer = millis(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -431,7 +434,7 @@ void runUI() { |
|
|
|
|
|
|
|
|
|
case SAY_HOLD: |
|
|
|
|
if (millis() >= timer + 500) { |
|
|
|
|
screenState = nextState; |
|
|
|
|
machineState = nextState; |
|
|
|
|
timer = millis(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -445,7 +448,7 @@ void runUI() { |
|
|
|
|
|
|
|
|
|
case SAY_TIMEOUT: |
|
|
|
|
if (millis() >= timer + 1000) { |
|
|
|
|
screenState = nextState; |
|
|
|
|
machineState = nextState; |
|
|
|
|
timer = millis(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|