Files
arduino/src/AgStateMachine.cpp

502 lines
18 KiB
C++
Raw Normal View History

2024-04-03 21:26:04 +07:00
#include "AgStateMachine.h"
#define LED_FAST_BLINK_DELAY 250 /** ms */
#define LED_SLOW_BLINK_DELAY 1000 /** ms */
#define LED_SHORT_BLINK_DELAY 500 /** ms */
#define LED_LONG_BLINK_DELAY 2000 /** ms */
void AgStateMachine::ledBarSingleLedAnimation(uint8_t r, uint8_t g, uint8_t b) {
if (ledBarAnimationCount < 0) {
ledBarAnimationCount = 0;
2024-04-04 10:36:59 +07:00
ag->ledBar.setColor(r, g, b, ledBarAnimationCount);
2024-04-03 21:26:04 +07:00
} else {
ledBarAnimationCount++;
2024-04-04 10:36:59 +07:00
if (ledBarAnimationCount >= ag->ledBar.getNumberOfLeds()) {
2024-04-03 21:26:04 +07:00
ledBarAnimationCount = 0;
}
2024-04-04 10:36:59 +07:00
ag->ledBar.setColor(r, g, b, ledBarAnimationCount);
2024-04-03 21:26:04 +07:00
}
}
void AgStateMachine::ledStatusBlinkDelay(uint32_t ms) {
2024-04-04 10:36:59 +07:00
ag->statusLed.setOn();
2024-04-03 21:26:04 +07:00
delay(ms);
2024-04-04 10:36:59 +07:00
ag->statusLed.setOff();
2024-04-03 21:26:04 +07:00
delay(ms);
}
void AgStateMachine::sensorLedHandle(void) {
switch (config.getLedBarMode()) {
case LedBarMode::LedBarModeCO2:
co2LedHandle();
break;
case LedBarMode::LedBarModePm:
pm25LedHandle();
break;
default:
2024-04-04 10:36:59 +07:00
ag->ledBar.clear();
2024-04-03 21:26:04 +07:00
break;
}
}
void AgStateMachine::co2LedHandle(void) {
int co2Value = value.CO2;
if (co2Value <= 400) {
/** G; 1 */
2024-04-04 10:36:59 +07:00
ag->ledBar.setColor(0, 255, 0, ag->ledBar.getNumberOfLeds() - 1);
2024-04-03 21:26:04 +07:00
} else if (co2Value <= 700) {
/** GG; 2 */
2024-04-04 10:36:59 +07:00
ag->ledBar.setColor(0, 255, 0, ag->ledBar.getNumberOfLeds() - 1);
ag->ledBar.setColor(0, 255, 0, ag->ledBar.getNumberOfLeds() - 2);
2024-04-03 21:26:04 +07:00
} else if (co2Value <= 1000) {
/** YYY; 3 */
2024-04-04 10:36:59 +07:00
ag->ledBar.setColor(255, 255, 0, ag->ledBar.getNumberOfLeds() - 1);
ag->ledBar.setColor(255, 255, 0, ag->ledBar.getNumberOfLeds() - 2);
ag->ledBar.setColor(255, 255, 0, ag->ledBar.getNumberOfLeds() - 3);
2024-04-03 21:26:04 +07:00
} else if (co2Value <= 1333) {
/** YYYY; 4 */
2024-04-04 10:36:59 +07:00
ag->ledBar.setColor(255, 255, 0, ag->ledBar.getNumberOfLeds() - 1);
ag->ledBar.setColor(255, 255, 0, ag->ledBar.getNumberOfLeds() - 2);
ag->ledBar.setColor(255, 255, 0, ag->ledBar.getNumberOfLeds() - 3);
ag->ledBar.setColor(255, 255, 0, ag->ledBar.getNumberOfLeds() - 4);
2024-04-03 21:26:04 +07:00
} else if (co2Value <= 1666) {
/** YYYYY; 5 */
2024-04-04 10:36:59 +07:00
ag->ledBar.setColor(255, 255, 0, ag->ledBar.getNumberOfLeds() - 1);
ag->ledBar.setColor(255, 255, 0, ag->ledBar.getNumberOfLeds() - 2);
ag->ledBar.setColor(255, 255, 0, ag->ledBar.getNumberOfLeds() - 3);
ag->ledBar.setColor(255, 255, 0, ag->ledBar.getNumberOfLeds() - 4);
ag->ledBar.setColor(255, 255, 0, ag->ledBar.getNumberOfLeds() - 5);
2024-04-03 21:26:04 +07:00
} else if (co2Value <= 2000) {
/** RRRRRR; 6 */
2024-04-04 10:36:59 +07:00
ag->ledBar.setColor(255, 0, 0, ag->ledBar.getNumberOfLeds() - 1);
ag->ledBar.setColor(255, 0, 0, ag->ledBar.getNumberOfLeds() - 2);
ag->ledBar.setColor(255, 0, 0, ag->ledBar.getNumberOfLeds() - 3);
ag->ledBar.setColor(255, 0, 0, ag->ledBar.getNumberOfLeds() - 4);
ag->ledBar.setColor(255, 0, 0, ag->ledBar.getNumberOfLeds() - 5);
ag->ledBar.setColor(255, 0, 0, ag->ledBar.getNumberOfLeds() - 6);
2024-04-03 21:26:04 +07:00
} else if (co2Value <= 2666) {
/** RRRRRRR; 7 */
2024-04-04 10:36:59 +07:00
ag->ledBar.setColor(255, 0, 0, ag->ledBar.getNumberOfLeds() - 1);
ag->ledBar.setColor(255, 0, 0, ag->ledBar.getNumberOfLeds() - 2);
ag->ledBar.setColor(255, 0, 0, ag->ledBar.getNumberOfLeds() - 3);
ag->ledBar.setColor(255, 0, 0, ag->ledBar.getNumberOfLeds() - 4);
ag->ledBar.setColor(255, 0, 0, ag->ledBar.getNumberOfLeds() - 5);
ag->ledBar.setColor(255, 0, 0, ag->ledBar.getNumberOfLeds() - 6);
ag->ledBar.setColor(255, 0, 0, ag->ledBar.getNumberOfLeds() - 7);
2024-04-03 21:26:04 +07:00
} else if (co2Value <= 3333) {
/** RRRRRRRR; 8 */
2024-04-04 10:36:59 +07:00
ag->ledBar.setColor(255, 0, 0, ag->ledBar.getNumberOfLeds() - 1);
ag->ledBar.setColor(255, 0, 0, ag->ledBar.getNumberOfLeds() - 2);
ag->ledBar.setColor(255, 0, 0, ag->ledBar.getNumberOfLeds() - 3);
ag->ledBar.setColor(255, 0, 0, ag->ledBar.getNumberOfLeds() - 4);
ag->ledBar.setColor(255, 0, 0, ag->ledBar.getNumberOfLeds() - 5);
ag->ledBar.setColor(255, 0, 0, ag->ledBar.getNumberOfLeds() - 6);
ag->ledBar.setColor(255, 0, 0, ag->ledBar.getNumberOfLeds() - 7);
ag->ledBar.setColor(255, 0, 0, ag->ledBar.getNumberOfLeds() - 8);
2024-04-03 21:26:04 +07:00
} else if (co2Value <= 4000) {
/** RRRRRRRRR; 9 */
2024-04-04 10:36:59 +07:00
ag->ledBar.setColor(255, 0, 0, ag->ledBar.getNumberOfLeds() - 1);
ag->ledBar.setColor(255, 0, 0, ag->ledBar.getNumberOfLeds() - 2);
ag->ledBar.setColor(255, 0, 0, ag->ledBar.getNumberOfLeds() - 3);
ag->ledBar.setColor(255, 0, 0, ag->ledBar.getNumberOfLeds() - 4);
ag->ledBar.setColor(255, 0, 0, ag->ledBar.getNumberOfLeds() - 5);
ag->ledBar.setColor(255, 0, 0, ag->ledBar.getNumberOfLeds() - 6);
ag->ledBar.setColor(255, 0, 0, ag->ledBar.getNumberOfLeds() - 7);
ag->ledBar.setColor(255, 0, 0, ag->ledBar.getNumberOfLeds() - 8);
ag->ledBar.setColor(255, 0, 0, ag->ledBar.getNumberOfLeds() - 9);
2024-04-03 21:26:04 +07:00
} else { /** > 4000 */
/* PRPRPRPRP; 9 */
2024-04-04 10:36:59 +07:00
ag->ledBar.setColor(153, 153, 0, ag->ledBar.getNumberOfLeds() - 1);
ag->ledBar.setColor(255, 0, 0, ag->ledBar.getNumberOfLeds() - 2);
ag->ledBar.setColor(153, 153, 0, ag->ledBar.getNumberOfLeds() - 3);
ag->ledBar.setColor(255, 0, 0, ag->ledBar.getNumberOfLeds() - 4);
ag->ledBar.setColor(153, 153, 0, ag->ledBar.getNumberOfLeds() - 5);
ag->ledBar.setColor(255, 0, 0, ag->ledBar.getNumberOfLeds() - 6);
ag->ledBar.setColor(153, 153, 0, ag->ledBar.getNumberOfLeds() - 7);
ag->ledBar.setColor(255, 0, 0, ag->ledBar.getNumberOfLeds() - 8);
ag->ledBar.setColor(153, 153, 0, ag->ledBar.getNumberOfLeds() - 9);
2024-04-03 21:26:04 +07:00
}
}
void AgStateMachine::pm25LedHandle(void) {
int pm25Value = value.PM25;
if (pm25Value <= 5) {
/** G; 1 */
2024-04-04 10:36:59 +07:00
ag->ledBar.setColor(0, 255, 0, ag->ledBar.getNumberOfLeds() - 1);
2024-04-03 21:26:04 +07:00
} else if (pm25Value <= 10) {
/** GG; 2 */
2024-04-04 10:36:59 +07:00
ag->ledBar.setColor(0, 255, 0, ag->ledBar.getNumberOfLeds() - 1);
ag->ledBar.setColor(0, 255, 0, ag->ledBar.getNumberOfLeds() - 2);
2024-04-03 21:26:04 +07:00
} else if (pm25Value <= 20) {
/** YYY; 3 */
2024-04-04 10:36:59 +07:00
ag->ledBar.setColor(255, 255, 0, ag->ledBar.getNumberOfLeds() - 1);
ag->ledBar.setColor(255, 255, 0, ag->ledBar.getNumberOfLeds() - 2);
ag->ledBar.setColor(255, 255, 0, ag->ledBar.getNumberOfLeds() - 3);
2024-04-03 21:26:04 +07:00
} else if (pm25Value <= 35) {
/** YYYY; 4 */
2024-04-04 10:36:59 +07:00
ag->ledBar.setColor(255, 255, 0, ag->ledBar.getNumberOfLeds() - 1);
ag->ledBar.setColor(255, 255, 0, ag->ledBar.getNumberOfLeds() - 2);
ag->ledBar.setColor(255, 255, 0, ag->ledBar.getNumberOfLeds() - 3);
ag->ledBar.setColor(255, 255, 0, ag->ledBar.getNumberOfLeds() - 4);
2024-04-03 21:26:04 +07:00
} else if (pm25Value <= 45) {
/** YYYYY; 5 */
2024-04-04 10:36:59 +07:00
ag->ledBar.setColor(255, 255, 0, ag->ledBar.getNumberOfLeds() - 1);
ag->ledBar.setColor(255, 255, 0, ag->ledBar.getNumberOfLeds() - 2);
ag->ledBar.setColor(255, 255, 0, ag->ledBar.getNumberOfLeds() - 3);
ag->ledBar.setColor(255, 255, 0, ag->ledBar.getNumberOfLeds() - 4);
ag->ledBar.setColor(255, 255, 0, ag->ledBar.getNumberOfLeds() - 5);
2024-04-03 21:26:04 +07:00
} else if (pm25Value <= 55) {
/** RRRRRR; 6 */
2024-04-04 10:36:59 +07:00
ag->ledBar.setColor(255, 0, 0, ag->ledBar.getNumberOfLeds() - 1);
ag->ledBar.setColor(255, 0, 0, ag->ledBar.getNumberOfLeds() - 2);
ag->ledBar.setColor(255, 0, 0, ag->ledBar.getNumberOfLeds() - 3);
ag->ledBar.setColor(255, 0, 0, ag->ledBar.getNumberOfLeds() - 4);
ag->ledBar.setColor(255, 0, 0, ag->ledBar.getNumberOfLeds() - 5);
ag->ledBar.setColor(255, 0, 0, ag->ledBar.getNumberOfLeds() - 6);
2024-04-03 21:26:04 +07:00
} else if (pm25Value <= 65) {
/** RRRRRRR; 7 */
2024-04-04 10:36:59 +07:00
ag->ledBar.setColor(255, 0, 0, ag->ledBar.getNumberOfLeds() - 1);
ag->ledBar.setColor(255, 0, 0, ag->ledBar.getNumberOfLeds() - 2);
ag->ledBar.setColor(255, 0, 0, ag->ledBar.getNumberOfLeds() - 3);
ag->ledBar.setColor(255, 0, 0, ag->ledBar.getNumberOfLeds() - 4);
ag->ledBar.setColor(255, 0, 0, ag->ledBar.getNumberOfLeds() - 5);
ag->ledBar.setColor(255, 0, 0, ag->ledBar.getNumberOfLeds() - 6);
ag->ledBar.setColor(255, 0, 0, ag->ledBar.getNumberOfLeds() - 7);
2024-04-03 21:26:04 +07:00
} else if (pm25Value <= 150) {
/** RRRRRRRR; 8 */
2024-04-04 10:36:59 +07:00
ag->ledBar.setColor(255, 0, 0, ag->ledBar.getNumberOfLeds() - 1);
ag->ledBar.setColor(255, 0, 0, ag->ledBar.getNumberOfLeds() - 2);
ag->ledBar.setColor(255, 0, 0, ag->ledBar.getNumberOfLeds() - 3);
ag->ledBar.setColor(255, 0, 0, ag->ledBar.getNumberOfLeds() - 4);
ag->ledBar.setColor(255, 0, 0, ag->ledBar.getNumberOfLeds() - 5);
ag->ledBar.setColor(255, 0, 0, ag->ledBar.getNumberOfLeds() - 6);
ag->ledBar.setColor(255, 0, 0, ag->ledBar.getNumberOfLeds() - 7);
ag->ledBar.setColor(255, 0, 0, ag->ledBar.getNumberOfLeds() - 8);
2024-04-03 21:26:04 +07:00
} else if (pm25Value <= 250) {
/** RRRRRRRRR; 9 */
2024-04-04 10:36:59 +07:00
ag->ledBar.setColor(255, 0, 0, ag->ledBar.getNumberOfLeds() - 1);
ag->ledBar.setColor(255, 0, 0, ag->ledBar.getNumberOfLeds() - 2);
ag->ledBar.setColor(255, 0, 0, ag->ledBar.getNumberOfLeds() - 3);
ag->ledBar.setColor(255, 0, 0, ag->ledBar.getNumberOfLeds() - 4);
ag->ledBar.setColor(255, 0, 0, ag->ledBar.getNumberOfLeds() - 5);
ag->ledBar.setColor(255, 0, 0, ag->ledBar.getNumberOfLeds() - 6);
ag->ledBar.setColor(255, 0, 0, ag->ledBar.getNumberOfLeds() - 7);
ag->ledBar.setColor(255, 0, 0, ag->ledBar.getNumberOfLeds() - 8);
ag->ledBar.setColor(255, 0, 0, ag->ledBar.getNumberOfLeds() - 9);
2024-04-03 21:26:04 +07:00
} else { /** > 250 */
/* PRPRPRPRP; 9 */
2024-04-04 10:36:59 +07:00
ag->ledBar.setColor(153, 153, 0, ag->ledBar.getNumberOfLeds() - 1);
ag->ledBar.setColor(255, 0, 0, ag->ledBar.getNumberOfLeds() - 2);
ag->ledBar.setColor(153, 153, 0, ag->ledBar.getNumberOfLeds() - 3);
ag->ledBar.setColor(255, 0, 0, ag->ledBar.getNumberOfLeds() - 4);
ag->ledBar.setColor(153, 153, 0, ag->ledBar.getNumberOfLeds() - 5);
ag->ledBar.setColor(255, 0, 0, ag->ledBar.getNumberOfLeds() - 6);
ag->ledBar.setColor(153, 153, 0, ag->ledBar.getNumberOfLeds() - 7);
ag->ledBar.setColor(255, 0, 0, ag->ledBar.getNumberOfLeds() - 8);
ag->ledBar.setColor(153, 153, 0, ag->ledBar.getNumberOfLeds() - 9);
2024-04-03 21:26:04 +07:00
}
}
2024-04-04 10:36:59 +07:00
AgStateMachine::AgStateMachine(AgOledDisplay &disp, Stream &log, AgValue &value,
AgConfigure &config)
: PrintLog(log, "AgStateMachine"), disp(disp), value(value),
2024-04-03 21:26:04 +07:00
config(config) {}
AgStateMachine::~AgStateMachine() {}
void AgStateMachine::displayHandle(AgStateMachineState state) {
2024-04-04 10:36:59 +07:00
// Ignore handle if not ONE_INDOOR board
if (!ag->isOneIndoor()) {
return;
}
2024-04-03 21:26:04 +07:00
if (state > AgStateMachineNormal) {
logError("displayHandle: State invalid");
return;
}
dispState = state;
switch (state) {
case AgStateMachineWiFiManagerMode:
case AgStateMachineWiFiManagerPortalActive: {
if (wifiConnectCountDown >= 0) {
String line1 = String(wifiConnectCountDown) + "s to connect";
String line2 = "to WiFi hotspot:";
String line3 = "\"airgradient-";
2024-04-04 10:36:59 +07:00
String line4 = ag->deviceId() + "\"";
2024-04-03 21:26:04 +07:00
disp.setText(line1, line2, line3, line4);
wifiConnectCountDown--;
}
break;
}
case AgStateMachineWiFiManagerStaConnecting: {
disp.setText("Trying to", "connect to WiFi", "...");
break;
}
case AgStateMachineWiFiManagerStaConnected: {
disp.setText("WiFi connection", "successful", "");
break;
}
case AgStateMachineWiFiOkServerConnecting: {
disp.setText("Connecting to", "Server", "...");
break;
}
case AgStateMachineWiFiOkServerConnected: {
disp.setText("Server", "connection", "successful");
break;
}
case AgStateMachineWiFiManagerConnectFailed: {
disp.setText("WiFi not", "connected", "");
break;
}
case AgStateMachineWiFiOkServerConnectFailed: {
// displayShowText("Server not", "reachable", "");
break;
}
case AgStateMachineWiFiOkServerOkSensorConfigFailed: {
disp.setText("Monitor not", "setup on", "dashboard");
break;
}
case AgStateMachineWiFiLost: {
disp.showDashboard("WiFi N/A");
break;
}
case AgStateMachineServerLost: {
disp.showDashboard("Server N/A");
break;
}
case AgStateMachineSensorConfigFailed: {
uint32_t ms = (uint32_t)(millis() - addToDashboardTime);
if (ms >= 5000) {
addToDashboardTime = millis();
if (addToDashBoard) {
disp.showDashboard("Add to Dashboard");
} else {
2024-04-04 10:36:59 +07:00
disp.showDashboard(ag->deviceId().c_str());
2024-04-03 21:26:04 +07:00
}
addToDashBoard = !addToDashBoard;
}
break;
}
case AgStateMachineNormal: {
disp.showDashboard();
}
default:
break;
}
}
void AgStateMachine::displayHandle(void) { displayHandle(dispState); }
void AgStateMachine::displaySetAddToDashBoard(void) {
addToDashBoard = true;
addToDashboardTime = millis();
}
void AgStateMachine::displayClearAddToDashBoard(void) {
addToDashBoard = false;
}
void AgStateMachine::displayWiFiConnectCountDown(int count) {
wifiConnectCountDown = count;
}
void AgStateMachine::ledAnimationInit(void) { ledBarAnimationCount = -1; }
void AgStateMachine::ledHandle(AgStateMachineState state) {
if (state > AgStateMachineNormal) {
logError("ledHandle: state invalid");
return;
}
ledState = state;
2024-04-04 10:36:59 +07:00
if (ag->isOneIndoor()) {
ag->ledBar.clear(); // Set all LED OFF
2024-04-03 21:26:04 +07:00
}
switch (state) {
case AgStateMachineWiFiManagerMode: {
/** In WiFi Manager Mode */
/** Turn LED OFF */
/** Turn midle LED Color */
2024-04-04 10:36:59 +07:00
if (ag->isOneIndoor()) {
ag->ledBar.setColor(0, 0, 255, ag->ledBar.getNumberOfLeds() / 2);
2024-04-03 21:26:04 +07:00
} else {
2024-04-04 10:36:59 +07:00
ag->statusLed.setToggle();
2024-04-03 21:26:04 +07:00
}
break;
}
case AgStateMachineWiFiManagerPortalActive: {
/** WiFi Manager has connected to mobile phone */
2024-04-04 10:36:59 +07:00
if (ag->isOneIndoor()) {
ag->ledBar.setColor(0, 0, 255);
2024-04-03 21:26:04 +07:00
} else {
2024-04-04 10:36:59 +07:00
ag->statusLed.setOn();
2024-04-03 21:26:04 +07:00
}
break;
}
case AgStateMachineWiFiManagerStaConnecting: {
/** after SSID and PW entered and OK clicked, connection to WiFI network is
* attempted */
2024-04-04 10:36:59 +07:00
if (ag->isOneIndoor()) {
2024-04-03 21:26:04 +07:00
ledBarSingleLedAnimation(255, 255, 255);
} else {
2024-04-04 10:36:59 +07:00
ag->statusLed.setOff();
2024-04-03 21:26:04 +07:00
}
break;
}
case AgStateMachineWiFiManagerStaConnected: {
/** Connecting to WiFi worked */
2024-04-04 10:36:59 +07:00
if (ag->isOneIndoor()) {
ag->ledBar.setColor(255, 255, 255);
2024-04-03 21:26:04 +07:00
} else {
2024-04-04 10:36:59 +07:00
ag->statusLed.setOff();
2024-04-03 21:26:04 +07:00
}
break;
}
case AgStateMachineWiFiOkServerConnecting: {
/** once connected to WiFi an attempt to reach the server is performed */
2024-04-04 10:36:59 +07:00
if (ag->isOneIndoor()) {
2024-04-03 21:26:04 +07:00
ledBarSingleLedAnimation(0, 255, 0);
} else {
2024-04-04 10:36:59 +07:00
ag->statusLed.setOff();
2024-04-03 21:26:04 +07:00
}
break;
}
case AgStateMachineWiFiOkServerConnected: {
/** Server is reachable, all fine */
2024-04-04 10:36:59 +07:00
if (ag->isOneIndoor()) {
ag->ledBar.setColor(0, 255, 0);
2024-04-03 21:26:04 +07:00
} else {
2024-04-04 10:36:59 +07:00
ag->statusLed.setOff();
2024-04-03 21:26:04 +07:00
/** two time slow blink, then off */
for (int i = 0; i < 2; i++) {
ledStatusBlinkDelay(LED_SLOW_BLINK_DELAY);
}
2024-04-04 10:36:59 +07:00
ag->statusLed.setOff();
2024-04-03 21:26:04 +07:00
}
break;
}
case AgStateMachineWiFiManagerConnectFailed: {
/** Cannot connect to WiFi (e.g. wrong password, WPA Enterprise etc.) */
2024-04-04 10:36:59 +07:00
if (ag->isOneIndoor()) {
ag->ledBar.setColor(255, 0, 0);
2024-04-03 21:26:04 +07:00
} else {
2024-04-04 10:36:59 +07:00
ag->statusLed.setOff();
2024-04-03 21:26:04 +07:00
for (int j = 0; j < 3; j++) {
for (int i = 0; i < 3; i++) {
ledStatusBlinkDelay(LED_FAST_BLINK_DELAY);
}
delay(2000);
}
2024-04-04 10:36:59 +07:00
ag->statusLed.setOff();
2024-04-03 21:26:04 +07:00
}
break;
}
case AgStateMachineWiFiOkServerConnectFailed: {
/** Connected to WiFi but server not reachable, e.g. firewall block/
* whitelisting needed etc. */
2024-04-04 10:36:59 +07:00
if (ag->isOneIndoor()) {
ag->ledBar.setColor(233, 183, 54); /** orange */
2024-04-03 21:26:04 +07:00
} else {
2024-04-04 10:36:59 +07:00
ag->statusLed.setOff();
2024-04-03 21:26:04 +07:00
for (int j = 0; j < 3; j++) {
for (int i = 0; i < 4; i++) {
ledStatusBlinkDelay(LED_FAST_BLINK_DELAY);
}
delay(2000);
}
2024-04-04 10:36:59 +07:00
ag->statusLed.setOff();
2024-04-03 21:26:04 +07:00
}
break;
}
case AgStateMachineWiFiOkServerOkSensorConfigFailed: {
/** Server reachable but sensor not configured correctly */
2024-04-04 10:36:59 +07:00
if (ag->isOneIndoor()) {
ag->ledBar.setColor(139, 24, 248); /** violet */
2024-04-03 21:26:04 +07:00
} else {
2024-04-04 10:36:59 +07:00
ag->statusLed.setOff();
2024-04-03 21:26:04 +07:00
for (int j = 0; j < 3; j++) {
for (int i = 0; i < 5; i++) {
ledStatusBlinkDelay(LED_FAST_BLINK_DELAY);
}
delay(2000);
}
2024-04-04 10:36:59 +07:00
ag->statusLed.setOff();
2024-04-03 21:26:04 +07:00
}
break;
}
case AgStateMachineWiFiLost: {
/** Connection to WiFi network failed credentials incorrect encryption not
* supported etc. */
2024-04-04 10:36:59 +07:00
if (ag->isOneIndoor()) {
2024-04-03 21:26:04 +07:00
/** WIFI failed status LED color */
2024-04-04 10:36:59 +07:00
ag->ledBar.setColor(255, 0, 0, 0);
2024-04-03 21:26:04 +07:00
/** Show CO2 or PM color status */
// sensorLedColorHandler();
sensorLedHandle();
} else {
2024-04-04 10:36:59 +07:00
ag->statusLed.setOff();
2024-04-03 21:26:04 +07:00
}
break;
}
case AgStateMachineServerLost: {
/** Connected to WiFi network but the server cannot be reached through the
* internet, e.g. blocked by firewall */
2024-04-04 10:36:59 +07:00
if (ag->isOneIndoor()) {
ag->ledBar.setColor(233, 183, 54, 0);
2024-04-03 21:26:04 +07:00
/** Show CO2 or PM color status */
sensorLedHandle();
// sensorLedColorHandler();
} else {
2024-04-04 10:36:59 +07:00
ag->statusLed.setOff();
2024-04-03 21:26:04 +07:00
}
break;
}
case AgStateMachineSensorConfigFailed: {
/** Server is reachable but there is some configuration issue to be fixed on
* the server side */
2024-04-04 10:36:59 +07:00
if (ag->isOneIndoor()) {
ag->ledBar.setColor(139, 24, 248, 0);
2024-04-03 21:26:04 +07:00
/** Show CO2 or PM color status */
sensorLedHandle();
} else {
2024-04-04 10:36:59 +07:00
ag->statusLed.setOff();
2024-04-03 21:26:04 +07:00
}
break;
}
case AgStateMachineNormal: {
2024-04-04 10:36:59 +07:00
if (ag->isOneIndoor()) {
2024-04-03 21:26:04 +07:00
sensorLedHandle();
} else {
2024-04-04 10:36:59 +07:00
ag->statusLed.setOff();
2024-04-03 21:26:04 +07:00
}
break;
}
default:
break;
}
2024-04-04 10:36:59 +07:00
// Show LED bar color
if (ag->isOneIndoor()) {
ag->ledBar.show();
2024-04-03 21:26:04 +07:00
}
}
void AgStateMachine::ledHandle(void) { ledHandle(ledState); }
void AgStateMachine::setDisplayState(AgStateMachineState state) {
dispState = state;
}
AgStateMachineState AgStateMachine::getDisplayState(void) { return dispState; }
2024-04-04 10:36:59 +07:00
void AgStateMachine::setAirGradient(AirGradient *ag) { this->ag = ag; }
AgStateMachineState AgStateMachine::getLedState(void) { return ledState; }