[temporary commit]

This commit is contained in:
Phat Nguyen
2024-04-04 10:36:59 +07:00
parent 027ffeaa92
commit dba385f5bb
7 changed files with 382 additions and 1061 deletions

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +1,4 @@
#include "AgOledDisplay.h"
// #include "Libraries/U8g2/src/U8g2lib.h"
#include <U8g2lib.h>
#define DISP() ((U8G2_SH1106_128X64_NONAME_F_HW_I2C *)(this->u8g2))
@ -36,9 +35,13 @@ void AgOledDisplay::showTempHum(void) {
}
}
AgOledDisplay::AgOledDisplay(AirGradient &ag, AgConfigure &config,
AgOledDisplay::AgOledDisplay(AgConfigure &config,
AgValue &value, Stream &log)
: PrintLog(log, "AgOledDisplay"), ag(ag), config(config), value(value) {}
: PrintLog(log, "AgOledDisplay"), config(config), value(value) {}
void AgOledDisplay::setAirGradient(AirGradient *ag) {
this->ag = ag;
}
AgOledDisplay::~AgOledDisplay() {}
@ -185,7 +188,7 @@ void AgOledDisplay::showDashboard(const char *status) {
DISP()->setFont(u8g2_font_t0_22b_tf);
if (config.isPmStandardInUSAQI()) {
if (value.PM25 >= 0) {
sprintf(strBuf, "%d", ag.pms5003.convertPm25ToUsAqi(value.PM25));
sprintf(strBuf, "%d", ag->pms5003.convertPm25ToUsAqi(value.PM25));
} else {
sprintf(strBuf, "%s", "-");
}

View File

@ -10,7 +10,7 @@
class AgOledDisplay : public PrintLog {
private:
AgConfigure &config;
AirGradient &ag;
AirGradient *ag;
bool isBegin = false;
void *u8g2 = NULL;
AgValue &value;
@ -18,10 +18,11 @@ private:
void showTempHum(void);
public:
AgOledDisplay(AirGradient &ag, AgConfigure &config, AgValue &value,
AgOledDisplay(AgConfigure &config, AgValue &value,
Stream &log);
~AgOledDisplay();
void setAirGradient(AirGradient *ag);
bool begin(void);
void end(void);
void setStatus(String &status);

View File

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

View File

@ -12,7 +12,7 @@ private:
// AgStateMachineState state;
AgStateMachineState ledState;
AgStateMachineState dispState;
AirGradient &ag;
AirGradient *ag;
AgOledDisplay &disp;
AgValue &value;
AgConfigure &config;
@ -29,9 +29,10 @@ private:
void pm25LedHandle(void);
public:
AgStateMachine(AirGradient &ag, AgOledDisplay &disp, Stream &log,
AgStateMachine(AgOledDisplay &disp, Stream &log,
AgValue &value, AgConfigure& config);
~AgStateMachine();
void setAirGradient(AirGradient* ag);
void displayHandle(AgStateMachineState state);
void displayHandle(void);
void displaySetAddToDashBoard(void);
@ -41,7 +42,6 @@ public:
void ledHandle(AgStateMachineState state);
void ledHandle(void);
void setDisplayState(AgStateMachineState state);
// AgStateMachineState getState(void);
AgStateMachineState getDisplayState(void);
};

View File

@ -1,5 +1,4 @@
#include "AgWiFiConnector.h"
// #include "Libraries/WiFiManager/WiFiManager.h"
#include <WiFiManager.h>
#define WIFI_CONNECT_COUNTDOWN_MAX 180
@ -7,16 +6,15 @@
#define WIFI() ((WiFiManager *)(this->wifi))
AgWiFiConnector::AgWiFiConnector(AirGradient &ag, AgOledDisplay &disp,
String ssid, Stream &log, AgStateMachine &sm)
: PrintLog(log, "AgWiFiConnector"), ag(ag), disp(disp), ssid(ssid), sm(sm) {
}
AgWiFiConnector::AgWiFiConnector(AgOledDisplay &disp, Stream &log,
AgStateMachine &sm)
: PrintLog(log, "AgWiFiConnector"), disp(disp), sm(sm) {}
AgWiFiConnector::~AgWiFiConnector() {}
void AgWiFiConnector::setHotspotSSID(String ssid) { this->ssid = ssid; }
void AgWiFiConnector::setAirGradient(AirGradient *ag) { this->ag = ag; }
bool AgWiFiConnector::connect(uint32_t timeout) {
bool AgWiFiConnector::connect(void) {
if (wifi == NULL) {
wifi = new WiFiManager();
if (wifi == NULL) {
@ -26,19 +24,21 @@ bool AgWiFiConnector::connect(uint32_t timeout) {
}
WIFI()->setConfigPortalBlocking(false);
WIFI()->setTimeout(timeout);
WIFI()->setTimeout(WIFI_CONNECT_COUNTDOWN_MAX);
WIFI()->setAPCallback([this](WiFiManager *obj) { _wifiApCallback(); });
WIFI()->setSaveConfigCallback([this]() { _wifiSaveConfig(); });
WIFI()->setSaveParamsCallback([this]() { _wifiSaveParamCallback(); });
if (ag.isOneIndoor()) {
if (ag->isOneIndoor()) {
disp.setText("Connecting to", "WiFi", "...");
} else {
logInfo("Connecting to WiFi...");
}
WIFI()->autoConnect(ssid.c_str(), WIFI_HOTSPOT_PASSWORD_DEFAULT);
// Task handle WiFi connection.
xTaskCreate(
[](void *obj) {
AgWiFiConnector *connector = (AgWiFiConnector *)obj;
@ -56,11 +56,12 @@ bool AgWiFiConnector::connect(uint32_t timeout) {
AgStateMachineState stateOld = sm.getDisplayState();
while (WIFI()->getConfigPortalActive()) {
/** LED and display animation */
/** LED animatoin and display update content */
if (WiFi.isConnected() == false) {
/** Display countdown */
uint32_t ms = (uint32_t)(millis() - dispPeriod);
if (ag.isOneIndoor()) {
uint32_t ms;
if (ag->isOneIndoor()) {
ms = (uint32_t)(millis() - dispPeriod);
if (ms >= 1000) {
dispPeriod = millis();
sm.displayHandle();
@ -85,36 +86,31 @@ bool AgWiFiConnector::connect(uint32_t timeout) {
clientConnectChanged = clientConnected;
if (clientConnectChanged) {
sm.ledHandle(AgStateMachineWiFiManagerPortalActive);
// ledSmHandler(AgStateMachineWiFiManagerPortalActive);
} else {
// ledCount = LED_BAR_COUNT_INIT_VALUE;
sm.ledAnimationInit();
// ledSmHandler(AgStateMachineWiFiManagerMode);
sm.ledHandle(AgStateMachineWiFiManagerMode);
if (ag.isOneIndoor()) {
// dispSmHandler(AgStateMachineWiFiManagerMode);
if (ag->isOneIndoor()) {
sm.displayHandle(AgStateMachineWiFiManagerMode);
}
}
}
}
delay(1); // avoid watchdog timer reset.
}
/** Show display wifi connect result failed */
if (WiFi.isConnected() == false) {
sm.ledHandle(AgStateMachineWiFiManagerConnectFailed);
// ledSmHandler(AgStateMachineWiFiManagerConnectFailed);
if (ag.isOneIndoor()) {
// dispSmHandler(AgStateMachineWiFiManagerConnectFailed);
if (ag->isOneIndoor()) {
sm.displayHandle(AgStateMachineWiFiManagerConnectFailed);
}
delay(6000);
} else {
wifiHasConfig = true;
hasConfig = true;
}
/** Update LED bar color */
appLedHandler();
return true;
}
bool AgWiFiConnector::wifiClientConnected(void) {
@ -123,18 +119,19 @@ bool AgWiFiConnector::wifiClientConnected(void) {
void AgWiFiConnector::_wifiApCallback(void) {
sm.displayWiFiConnectCountDown(WIFI_CONNECT_COUNTDOWN_MAX);
sm.ledAnimationInit();
sm.setDisplayState(AgStateMachineWiFiManagerMode);
sm.ledAnimationInit();
sm.ledHandle(AgStateMachineWiFiManagerMode);
}
void AgWiFiConnector::_wifiSaveConfig(void) {
sm.setDisplayState(AgStateMachineWiFiManagerStaConnected);
sm.ledHandle();
// sm.displayHandle();
sm.ledHandle(AgStateMachineWiFiManagerStaConnected);
}
void AgWiFiConnector::_wifiSaveParamCallback(void) {
sm.ledAnimationInit();
sm.ledHandle(AgStateMachineWiFiManagerStaConnecting);
sm.setDisplayState(AgStateMachineWiFiManagerStaConnecting);
}
@ -143,3 +140,27 @@ bool AgWiFiConnector::_wifiConfigPortalActive(void) {
}
void AgWiFiConnector::_wifiProcess() { WIFI()->process(); }
void AgWiFiConnector::handle(void) {
// Ignore if WiFi is not configured
if (hasConfig == false) {
return;
}
if (WiFi.isConnected()) {
lastRetry = millis();
return;
}
/** Retry connect WiFi each 10sec */
uint32_t ms = (uint32_t)(millis() - lastRetry);
if (ms >= 10000) {
lastRetry = millis();
WiFi.reconnect();
// Serial.printf("Re-Connect WiFi\r\n");
logInfo("Re-Connect WiFi");
}
}
bool AgWiFiConnector::isConnected(void) { return WiFi.isConnected(); }

View File

@ -2,33 +2,37 @@
#define _AG_WIFI_CONNECTOR_H_
#include "AgOledDisplay.h"
#include "AirGradient.h"
#include "AgStateMachine.h"
#include "AirGradient.h"
#include "Main/PrintLog.h"
#include <Arduino.h>
class AgWiFiConnector : public PrintLog {
private:
AirGradient &ag;
AirGradient *ag;
AgOledDisplay &disp;
AgStateMachine &sm;
String ssid;
void *wifi = NULL;
bool hasConfig;
uint32_t lastRetry;
bool wifiClientConnected(void);
public:
AgWiFiConnector(AirGradient &ag, AgOledDisplay &disp, String ssid,
Stream &log, AgStateMachine &sm);
AgWiFiConnector(AgOledDisplay &disp, Stream &log, AgStateMachine &sm);
~AgWiFiConnector();
void setHotspotSSID(String ssid);
bool connect(uint32_t timeout);
void setAirGradient(AirGradient *ag);
bool connect(void);
void handle(void);
void _wifiApCallback(void);
void _wifiSaveConfig(void);
void _wifiSaveParamCallback(void);
bool _wifiConfigPortalActive(void);
void _wifiProcess();
bool isConnected(void);
};
#endif /** _AG_WIFI_CONNECTOR_H_ */