You've already forked AirQUserDemo
mirror of
https://github.com/m5stack/AirQUserDemo.git
synced 2026-05-20 11:05:29 -07:00
f954c75072
2. Modify the time zone. for example, set the GMT+8(Beijing time) time zone to GMT-8 time zone. esp-sntp uses this time zone to obtain Beijing time. Signed-off-by: lbuque <lbuque@163.com>
867 lines
28 KiB
C++
867 lines
28 KiB
C++
#include "MainAppView.hpp"
|
|
|
|
|
|
|
|
StatusView::StatusView(LGFX_Device *lcd, M5Canvas *canvas) {
|
|
_lcd = lcd;
|
|
_canvas = canvas;
|
|
}
|
|
|
|
|
|
StatusView::~StatusView() {}
|
|
|
|
|
|
void StatusView::begin() {
|
|
|
|
_canvas->createSprite(_lcd->width(), _lcd->height());
|
|
_canvas->setBaseColor(TFT_BLACK);
|
|
_canvas->setTextColor(TFT_BLACK, TFT_WHITE);
|
|
_canvas->fillSprite(TFT_WHITE);
|
|
initLOGO();
|
|
initTime();
|
|
initSCD40();
|
|
initPower();
|
|
initSEN55();
|
|
initStatus();
|
|
}
|
|
|
|
|
|
void StatusView::initTime()
|
|
{
|
|
int32_t tempX = 0;
|
|
int32_t tempY = 0;
|
|
int32_t tempW = 0;
|
|
int32_t tempH = 0;
|
|
|
|
tempW = 97;
|
|
tempH = 50;
|
|
|
|
log_d("Time tempW: %d px", tempW);
|
|
log_d("Time tempH: %d px", tempH);
|
|
|
|
// button div
|
|
tempX = _timeBaseCursorX;
|
|
tempY = _timeBaseCursorY;
|
|
_canvas->drawRect(tempX, tempY, tempW, tempH, TFT_BLACK);
|
|
// Padding: 2px
|
|
|
|
// time
|
|
tempX = _timeBaseCursorX + tempW / 2;
|
|
tempY = _timeBaseCursorY + _border + _padding;
|
|
_canvas->drawCenterString("00:00", tempX, tempY, _timeTimeFont);
|
|
_timeCanvasX = _timeBaseCursorX + _border + _padding;
|
|
_timeCanvasY = tempY;
|
|
|
|
// date
|
|
tempY = tempY + _canvas->fontHeight(_timeTimeFont);
|
|
_canvas->drawCenterString("2023-04-25", tempX, tempY, _timeDateFont);
|
|
_dateCanvasX = _timeBaseCursorX + _border + _padding;
|
|
_dateCanvasY = tempY;
|
|
|
|
_timeCanvas = new M5Canvas(_canvas);
|
|
_timeCanvas->createSprite(tempW - _border - _padding - _border - _padding, _timeCanvas->fontHeight(_timeTimeFont));
|
|
_timeCanvas->setBaseColor(TFT_WHITE);
|
|
_timeCanvas->setTextColor(TFT_BLACK, TFT_WHITE);
|
|
|
|
_dateCanvas = new M5Canvas(_canvas);
|
|
_dateCanvas->createSprite(tempW - _border - _padding - _border - _padding, _timeCanvas->fontHeight(_timeDateFont));
|
|
_dateCanvas->setBaseColor(TFT_WHITE);
|
|
_dateCanvas->setTextColor(TFT_BLACK, TFT_WHITE);
|
|
}
|
|
|
|
void StatusView::initStatus() {
|
|
int32_t tempX = 0;
|
|
int32_t tempY = 0;
|
|
int32_t tempW = 0;
|
|
int32_t tempH = 0;
|
|
|
|
tempX = _statusBaseCursorX;
|
|
tempY = _statusBaseCursorY;
|
|
|
|
tempW = 97;
|
|
tempH = 52;
|
|
|
|
_canvas->drawRect(tempX, tempY, tempW, tempH, TFT_BLACK);
|
|
_canvas->drawFastHLine(tempX + 2, tempY + tempH / 2, 93, TFT_BLACK);
|
|
|
|
tempY = (
|
|
_statusBaseCursorY
|
|
+ _border
|
|
+ _padding
|
|
+ (
|
|
tempH / 2
|
|
- _canvas->fontHeight(_statusTitleFont)
|
|
- _padding
|
|
- _padding
|
|
) / 2
|
|
);
|
|
_canvas->drawCenterString("WiFi", tempX + tempW / 2, tempY, _statusTitleFont);
|
|
tempY = (
|
|
_statusBaseCursorY
|
|
+ tempH / 2
|
|
+ _border
|
|
+ _padding
|
|
+ (
|
|
tempH / 2
|
|
- _canvas->fontHeight(_statusMsgFont)
|
|
- _padding
|
|
- _padding
|
|
) / 2
|
|
);
|
|
_canvas->drawCenterString("......", tempX + tempW / 2, tempY, _statusMsgFont);
|
|
|
|
_stautsTitleCanvas = new M5Canvas(_canvas);
|
|
_statusTitleCanvasX = _statusBaseCursorX + _border + _padding;
|
|
_statusTitleCanvasY = (
|
|
_statusBaseCursorY
|
|
+ _border
|
|
+ _padding
|
|
+ (
|
|
tempH / 2
|
|
- _canvas->fontHeight(_statusTitleFont)
|
|
- _padding
|
|
- _padding
|
|
) / 2
|
|
);
|
|
_stautsTitleCanvas->createSprite(
|
|
tempW - _border - _padding - _border - _padding,
|
|
_stautsTitleCanvas->fontHeight(_statusTitleFont)
|
|
);
|
|
_stautsTitleCanvas->setBaseColor(TFT_WHITE);
|
|
_stautsTitleCanvas->setTextColor(TFT_BLACK, TFT_WHITE);
|
|
|
|
_stautsTitleCanvas1 = new M5Canvas(_lcd);
|
|
_stautsTitleCanvas1->createSprite(
|
|
tempW - _border - _padding - _border - _padding,
|
|
_stautsTitleCanvas1->fontHeight(_statusTitleFont)
|
|
);
|
|
_stautsTitleCanvas1->setBaseColor(TFT_WHITE);
|
|
_stautsTitleCanvas1->setTextColor(TFT_BLACK, TFT_WHITE);
|
|
|
|
_stautsMsgCanvas = new M5Canvas(_canvas);
|
|
_statusMsgCanvasX = _statusBaseCursorX + _border + _padding;
|
|
_statusMsgCanvasY = (
|
|
_statusBaseCursorY
|
|
+ tempH / 2
|
|
+ _border
|
|
+ _padding
|
|
+ (
|
|
tempH / 2
|
|
- _canvas->fontHeight(_statusMsgFont)
|
|
- _padding
|
|
- _padding
|
|
) / 2
|
|
);
|
|
_stautsMsgCanvas->createSprite(
|
|
tempW - _border - _padding - _border - _padding,
|
|
_stautsMsgCanvas->fontHeight(_statusMsgFont)
|
|
);
|
|
_stautsMsgCanvas->setBaseColor(TFT_WHITE);
|
|
_stautsMsgCanvas->setTextColor(TFT_BLACK, TFT_WHITE);
|
|
|
|
_stautsMsgCanvas1 = new M5Canvas(_lcd);
|
|
_stautsMsgCanvas1->createSprite(
|
|
tempW - _border - _padding - _border - _padding,
|
|
_stautsMsgCanvas1->fontHeight(_statusMsgFont)
|
|
);
|
|
_stautsMsgCanvas1->setBaseColor(TFT_WHITE);
|
|
_stautsMsgCanvas1->setTextColor(TFT_BLACK, TFT_WHITE);
|
|
}
|
|
|
|
|
|
void StatusView::initSCD40()
|
|
{
|
|
int32_t tempX = 0;
|
|
int32_t tempY = 0;
|
|
int32_t tempW = 0;
|
|
int32_t tempH = 0;
|
|
|
|
tempW = 97;
|
|
|
|
tempH = _border
|
|
+ _padding
|
|
+ _canvas->fontHeight(_scd40TitleFont)
|
|
+ _padding
|
|
+ _canvas->fontHeight(_scd40OptionFont)
|
|
+ _padding
|
|
+ _canvas->fontHeight(_scd40OptionFont)
|
|
+ _padding
|
|
+ _canvas->fontHeight(_scd40OptionFont)
|
|
+ _padding
|
|
+ _border;
|
|
|
|
log_d("SCD width: %d px", tempW);
|
|
log_d("SCD height: %d px", tempH);
|
|
|
|
// button div
|
|
tempX = _scd40BaseCursorX;
|
|
tempY = _scd40BaseCursorY;
|
|
_canvas->drawRect(tempX, tempY, tempW, tempH, TFT_BLACK);
|
|
// Padding: 2px
|
|
tempX = tempX + _border + _padding;
|
|
tempY = tempY + _border + _padding;
|
|
_canvas->fillRect(tempX, tempY, 5, _canvas->fontHeight(_scd40TitleFont), TFT_BLACK);
|
|
// 5px
|
|
tempX = tempX + 5 + 2;
|
|
_canvas->drawString("SCD40", tempX, tempY, _scd40TitleFont);
|
|
|
|
// Co2
|
|
tempX = _scd40BaseCursorX + _border + _padding;
|
|
tempY = tempY + _canvas->fontHeight(_scd40TitleFont) + _padding;
|
|
_canvas->drawString("Co2", tempX, tempY, _scd40OptionFont);
|
|
|
|
tempX = _scd40BaseCursorX + tempW - 2;
|
|
_canvas->drawRightString("n/a", tempX, tempY, _scd40OptionFont);
|
|
_co2CanvasX = tempX - _canvas->textWidth("00000", _scd40OptionFont);
|
|
_co2CanvasY = tempY;
|
|
|
|
// Temperature
|
|
tempX = _scd40BaseCursorX + _border + _padding;
|
|
tempY = tempY + _canvas->fontHeight(_scd40OptionFont) + _padding;
|
|
_canvas->drawString("Temp", tempX, tempY, _scd40OptionFont);
|
|
|
|
tempX = _scd40BaseCursorX + tempW - 2;
|
|
_canvas->drawRightString("n/a", tempX, tempY, _scd40OptionFont);
|
|
_tempCanvasX = tempX - _canvas->textWidth("00000", _scd40OptionFont);
|
|
_tempCanvasY = tempY;
|
|
|
|
// Humidity
|
|
tempX = _scd40BaseCursorX + _border + _padding;
|
|
tempY= tempY + _canvas->fontHeight(_scd40OptionFont) + _padding;
|
|
_canvas->drawString("RH", tempX, tempY, _scd40OptionFont);
|
|
|
|
tempX = _scd40BaseCursorX + tempW - 2;
|
|
_canvas->drawRightString("n/a", tempX, tempY, _scd40OptionFont);
|
|
_humiCanvasX = tempX - _canvas->textWidth("00000", _scd40OptionFont);
|
|
_humiCanvasY = tempY;
|
|
|
|
_co2Canvas = new M5Canvas(_canvas);
|
|
_co2Canvas->createSprite(
|
|
_co2Canvas->textWidth("00000", _scd40OptionFont),
|
|
_co2Canvas->fontHeight(_scd40OptionFont)
|
|
);
|
|
_co2Canvas->setBaseColor(TFT_WHITE);
|
|
_co2Canvas->setTextColor(TFT_BLACK, TFT_WHITE);
|
|
|
|
_tempCanvas = new M5Canvas(_canvas);
|
|
_tempCanvas->createSprite(
|
|
_tempCanvas->textWidth("00000", _scd40OptionFont),
|
|
_tempCanvas->fontHeight(_scd40OptionFont)
|
|
);
|
|
_tempCanvas->setBaseColor(TFT_WHITE);
|
|
_tempCanvas->setTextColor(TFT_BLACK, TFT_WHITE);
|
|
|
|
_humiCanvas = new M5Canvas(_canvas);
|
|
_humiCanvas->createSprite(
|
|
_humiCanvas->textWidth("00000", _scd40OptionFont),
|
|
_humiCanvas->fontHeight(_scd40OptionFont)
|
|
);
|
|
_humiCanvas->setBaseColor(TFT_WHITE);
|
|
_humiCanvas->setTextColor(TFT_BLACK, TFT_WHITE);
|
|
|
|
}
|
|
|
|
|
|
void StatusView::initPower()
|
|
{
|
|
int32_t tempX = 0;
|
|
int32_t tempY = 0;
|
|
int32_t tempW = 0;
|
|
int32_t tempH = 0;
|
|
|
|
tempW = 97;
|
|
|
|
tempH = _border
|
|
+ _padding
|
|
+ _canvas->fontHeight(_powerTitleFont)
|
|
+ _padding
|
|
+ _canvas->fontHeight(_poweroptionFont)
|
|
+ _padding
|
|
+ _border;
|
|
|
|
log_d("Power Width: %d px", tempW);
|
|
log_d("Power Height: %d px", tempH);
|
|
|
|
// button div
|
|
tempX = _powerBaseCursorX;
|
|
tempY = _powerBaseCursorY;
|
|
_canvas->drawRect(tempX, tempY, tempW, tempH, TFT_BLACK);
|
|
// Padding: 2px
|
|
tempX = tempX + _border + _padding;
|
|
tempY = tempY + _border + _padding;
|
|
tempY += 2;
|
|
|
|
// BAT
|
|
_canvas->drawString("BAT: 0.0V", tempX, tempY, _poweroptionFont);
|
|
_voltageCanvasX = tempX;
|
|
_voltageCanvasY = tempY;
|
|
|
|
// Countdown
|
|
tempY = tempY + _canvas->fontHeight(_powerTitleFont);
|
|
_canvas->drawString("Time: 60S", tempX, tempY, _poweroptionFont);
|
|
_chartCanvasX = tempX;
|
|
_chartCanvasY = tempY;
|
|
|
|
log_d("cd x: %d", _chartCanvasX);
|
|
log_d("cd y: %d", _chartCanvasY);
|
|
|
|
_voltageCanvas = new M5Canvas(_canvas);
|
|
_voltageCanvas->createSprite(tempW - _border - _padding - _padding - _border, _canvas->fontHeight(_poweroptionFont));
|
|
_voltageCanvas->setBaseColor(TFT_WHITE);
|
|
_voltageCanvas->setTextColor(TFT_BLACK, TFT_WHITE);
|
|
|
|
_chartCanvas = new M5Canvas(_canvas);
|
|
_chartCanvas->createSprite(tempW - _border - _padding - _padding - _border, _canvas->fontHeight(_poweroptionFont));
|
|
_chartCanvas->setBaseColor(TFT_WHITE);
|
|
_chartCanvas->setTextColor(TFT_BLACK, TFT_WHITE);
|
|
|
|
_chartCanvas1 = new M5Canvas(_lcd);
|
|
_chartCanvas1->createSprite(tempW - _border - _padding - _padding - _border - _chartCanvas1->textWidth("Time:", _poweroptionFont), _canvas->fontHeight(_poweroptionFont));
|
|
_chartCanvas1->setBaseColor(TFT_WHITE);
|
|
_chartCanvas1->setTextColor(TFT_BLACK, TFT_WHITE);
|
|
}
|
|
|
|
|
|
void StatusView::initLOGO()
|
|
{
|
|
_nicknameCanvasX = 2;
|
|
_nicknameCanvasY = 2 + 50 + 2 + 69 + 2 + 39 + 2;
|
|
|
|
_nicknameCanvas = new M5Canvas(_canvas);
|
|
_nicknameCanvas->createSprite(97, 32);
|
|
_nicknameCanvas->setBaseColor(TFT_BLACK);
|
|
_nicknameCanvas->setTextColor(TFT_WHITE, TFT_BLACK);
|
|
|
|
_nicknameCanvas->clear();
|
|
int32_t cursorX = 97 / 2;
|
|
int32_t cursorY = (32 - _nicknameCanvas->fontHeight(&fonts::efontCN_14)) / 2;
|
|
_nicknameCanvas->drawCenterString("AirQ", cursorX, cursorY, &fonts::efontCN_14);
|
|
_updateImpl(_nicknameCanvas, _nicknameCanvasX, _nicknameCanvasY);
|
|
|
|
_nicknameCanvas1 = new M5Canvas(_lcd);
|
|
_nicknameCanvas1->createSprite(97, 32);
|
|
_nicknameCanvas1->setBaseColor(TFT_BLACK);
|
|
_nicknameCanvas1->setTextColor(TFT_WHITE, TFT_BLACK);
|
|
_nicknameCanvas1->clear();
|
|
cursorX = 97 / 2;
|
|
cursorY = (32 - _nicknameCanvas1->fontHeight(&fonts::efontCN_14)) / 2;
|
|
_nicknameCanvas1->drawCenterString("AirQ", cursorX, cursorY, &fonts::efontCN_14);
|
|
}
|
|
|
|
|
|
void StatusView::initSEN55()
|
|
{
|
|
int32_t tempX = 0;
|
|
int32_t tempY = 0;
|
|
int32_t tempW = 0;
|
|
int32_t tempH = 0;
|
|
|
|
tempW = 97;
|
|
|
|
tempH = _border
|
|
+ _padding
|
|
+ _canvas->fontHeight(_sen55TitleFont)
|
|
+ _padding
|
|
+ _canvas->fontHeight(_sen55OptionFont)
|
|
+ _padding
|
|
+ _canvas->fontHeight(_sen55OptionFont)
|
|
+ _padding
|
|
+ _canvas->fontHeight(_sen55OptionFont)
|
|
+ _padding
|
|
+ _canvas->fontHeight(_sen55OptionFont)
|
|
+ _padding
|
|
+ _canvas->fontHeight(_sen55OptionFont)
|
|
+ _padding
|
|
+ _canvas->fontHeight(_sen55OptionFont)
|
|
+ _padding
|
|
+ _canvas->fontHeight(_sen55OptionFont)
|
|
+ _padding
|
|
+ _canvas->fontHeight(_sen55OptionFont)
|
|
+ _padding
|
|
+ _border;
|
|
|
|
log_d("SEN width: %d px", tempW);
|
|
log_d("SEN height: %d px", tempH);
|
|
|
|
// button div
|
|
tempX = _sen55BaseCursorX;
|
|
tempY = _sen55BaseCursorY;
|
|
_canvas->drawRect(tempX, tempY, tempW, tempH, TFT_BLACK);
|
|
// Padding: 2px
|
|
tempX = tempX + _border + _padding;
|
|
tempY = tempY + _border + _padding;
|
|
_canvas->fillRect(tempX, tempY, 5, _canvas->fontHeight(_sen55TitleFont), TFT_BLACK);
|
|
// 5px
|
|
tempX = tempX + 5 + 2;
|
|
_canvas->drawString("SEN55", tempX, tempY, _sen55TitleFont);
|
|
|
|
// PM1.0
|
|
tempX = _sen55BaseCursorX + _border + _padding;
|
|
tempY = tempY + _canvas->fontHeight(_sen55TitleFont) + _padding;
|
|
_canvas->drawString("PM1.0", tempX, tempY, _sen55OptionFont);
|
|
|
|
tempX = _sen55BaseCursorX + tempW - 2;
|
|
_canvas->drawRightString("n/a", tempX, tempY, _sen55OptionFont);
|
|
_pm1p0CanvasX = tempX - _canvas->textWidth("00000", _sen55OptionFont);
|
|
_pm1p0CanvasY = tempY;
|
|
|
|
// PM2.5
|
|
tempX = _sen55BaseCursorX + _border + _padding;
|
|
tempY = tempY + _canvas->fontHeight(_sen55OptionFont) + _padding;
|
|
_canvas->drawString("PM2.5", tempX, tempY, _sen55OptionFont);
|
|
|
|
tempX = _sen55BaseCursorX + tempW - 2;
|
|
_canvas->drawRightString("n/a", tempX, tempY, _sen55OptionFont);
|
|
_pm2p5CanvasX = tempX - _canvas->textWidth("00000", _sen55OptionFont);
|
|
_pm2p5CanvasY = tempY;
|
|
|
|
// PM4.0
|
|
tempX = _sen55BaseCursorX + _border + _padding;
|
|
tempY = tempY + _canvas->fontHeight(_sen55OptionFont) + _padding;
|
|
_canvas->drawString("PM4.0", tempX, tempY, _sen55OptionFont);
|
|
|
|
tempX = _sen55BaseCursorX + tempW - 2;
|
|
_canvas->drawRightString("n/a", tempX, tempY, _sen55OptionFont);
|
|
_pm4p0CanvasX = tempX - _canvas->textWidth("00000", _sen55OptionFont);
|
|
_pm4p0CanvasY = tempY;
|
|
|
|
// PM10.0
|
|
tempX = _sen55BaseCursorX + _border + _padding;
|
|
tempY = tempY + _canvas->fontHeight(_sen55OptionFont) + _padding;
|
|
_canvas->drawString("PM10", tempX, tempY, _sen55OptionFont);
|
|
|
|
tempX = _sen55BaseCursorX + tempW - 2;
|
|
_canvas->drawRightString("n/a", tempX, tempY, _sen55OptionFont);
|
|
_pm10p0CanvasX = tempX - _canvas->textWidth("00000", _sen55OptionFont);
|
|
_pm10p0CanvasY = tempY;
|
|
|
|
// Temperature
|
|
tempX = _sen55BaseCursorX + _border + _padding;
|
|
tempY = tempY + _canvas->fontHeight(_sen55OptionFont) + _padding;
|
|
_canvas->drawString("Temp", tempX, tempY, _sen55OptionFont);
|
|
|
|
tempX = _sen55BaseCursorX + tempW - 2;
|
|
_canvas->drawRightString("n/a", tempX, tempY, _sen55OptionFont);
|
|
_sen55TempCanvasX = tempX - _canvas->textWidth("00000", _sen55OptionFont);
|
|
_sen55TempCanvasY = tempY;
|
|
|
|
// Humidity
|
|
tempX = _sen55BaseCursorX + _border + _padding;
|
|
tempY = tempY + _canvas->fontHeight(_sen55OptionFont) + _padding;
|
|
_canvas->drawString("RH", tempX, tempY, _sen55OptionFont);
|
|
|
|
tempX = _sen55BaseCursorX + tempW - 2;
|
|
_canvas->drawRightString("n/a", tempX, tempY, _sen55OptionFont);
|
|
_sen55HumiCanvasX = tempX - _canvas->textWidth("00000", _sen55OptionFont);
|
|
_sen55HumiCanvasY = tempY;
|
|
|
|
// voc
|
|
tempX = _sen55BaseCursorX + _border + _padding;
|
|
tempY = tempY + _canvas->fontHeight(_sen55OptionFont) + _padding;
|
|
_canvas->drawString("VOC", tempX, tempY, _sen55OptionFont);
|
|
|
|
tempX = _sen55BaseCursorX + tempW - 2;
|
|
_canvas->drawRightString("n/a", tempX, tempY, _sen55OptionFont);
|
|
_vocCanvasX = tempX - _canvas->textWidth("000000", _sen55OptionFont);
|
|
_vocCanvasY = tempY;
|
|
|
|
// nox
|
|
tempX = _sen55BaseCursorX + _border + _padding;
|
|
tempY = tempY + _canvas->fontHeight(_sen55OptionFont) + _padding;
|
|
_canvas->drawString("NOX", tempX, tempY, _sen55OptionFont);
|
|
|
|
tempX = _sen55BaseCursorX + tempW - 2;
|
|
_canvas->drawRightString("560.00", tempX, tempY, _sen55OptionFont);
|
|
_noxCanvasX = tempX - _canvas->textWidth("000000", _sen55OptionFont);
|
|
_noxCanvasY = tempY;
|
|
|
|
_pm1p0Canvas = new M5Canvas(_canvas);
|
|
_pm1p0Canvas->createSprite(
|
|
_pm1p0Canvas->textWidth("00000", _sen55OptionFont),
|
|
_pm1p0Canvas->fontHeight(_sen55OptionFont)
|
|
);
|
|
_pm1p0Canvas->setBaseColor(TFT_WHITE);
|
|
_pm1p0Canvas->setTextColor(TFT_BLACK, TFT_WHITE);
|
|
|
|
_pm2p5Canvas = new M5Canvas(_canvas);
|
|
_pm2p5Canvas->createSprite(
|
|
_pm2p5Canvas->textWidth("00000", _sen55OptionFont),
|
|
_pm2p5Canvas->fontHeight(_sen55OptionFont)
|
|
);
|
|
_pm2p5Canvas->setBaseColor(TFT_WHITE);
|
|
_pm2p5Canvas->setTextColor(TFT_BLACK, TFT_WHITE);
|
|
|
|
_pm4p0Canvas = new M5Canvas(_canvas);
|
|
_pm4p0Canvas->createSprite(
|
|
_pm4p0Canvas->textWidth("00000", _sen55OptionFont),
|
|
_pm4p0Canvas->fontHeight(_sen55OptionFont)
|
|
);
|
|
_pm4p0Canvas->setBaseColor(TFT_WHITE);
|
|
_pm4p0Canvas->setTextColor(TFT_BLACK, TFT_WHITE);
|
|
|
|
_pm10p0Canvas = new M5Canvas(_canvas);
|
|
_pm10p0Canvas->createSprite(
|
|
_pm10p0Canvas->textWidth("00000", _sen55OptionFont),
|
|
_pm10p0Canvas->fontHeight(_sen55OptionFont)
|
|
);
|
|
_pm10p0Canvas->setBaseColor(TFT_WHITE);
|
|
_pm10p0Canvas->setTextColor(TFT_BLACK, TFT_WHITE);
|
|
|
|
_sen55TempCanvas = new M5Canvas(_canvas);
|
|
_sen55TempCanvas->createSprite(
|
|
_sen55TempCanvas->textWidth("00000", _sen55OptionFont),
|
|
_sen55TempCanvas->fontHeight(_sen55OptionFont)
|
|
);
|
|
_sen55TempCanvas->setBaseColor(TFT_WHITE);
|
|
_sen55TempCanvas->setTextColor(TFT_BLACK, TFT_WHITE);
|
|
|
|
_sen55HumiCanvas = new M5Canvas(_canvas);
|
|
_sen55HumiCanvas->createSprite(
|
|
_sen55HumiCanvas->textWidth("00000", _sen55OptionFont),
|
|
_sen55HumiCanvas->fontHeight(_sen55OptionFont)
|
|
);
|
|
_sen55HumiCanvas->setBaseColor(TFT_WHITE);
|
|
_sen55HumiCanvas->setTextColor(TFT_BLACK, TFT_WHITE);
|
|
|
|
_vocCanvas = new M5Canvas(_canvas);
|
|
_vocCanvas->createSprite(
|
|
_vocCanvas->textWidth("000000", _sen55OptionFont),
|
|
_vocCanvas->fontHeight(_sen55OptionFont)
|
|
);
|
|
_vocCanvas->setBaseColor(TFT_WHITE);
|
|
_vocCanvas->setTextColor(TFT_BLACK, TFT_WHITE);
|
|
|
|
_noxCanvas = new M5Canvas(_canvas);
|
|
_noxCanvas->createSprite(
|
|
_noxCanvas->textWidth("000000", _sen55OptionFont),
|
|
_noxCanvas->fontHeight(_sen55OptionFont)
|
|
);
|
|
_noxCanvas->setBaseColor(TFT_WHITE);
|
|
_noxCanvas->setTextColor(TFT_BLACK, TFT_WHITE);
|
|
}
|
|
|
|
|
|
void StatusView::updateTime(const char *time, const char *date)
|
|
{
|
|
_timeCanvas->clear(TFT_WHITE);
|
|
_dateCanvas->clear(TFT_WHITE);
|
|
_timeCanvas->drawCenterString(time, _timeCanvas->width() / 2, 0, _timeTimeFont);
|
|
_dateCanvas->drawCenterString(date, _dateCanvas->width() / 2, 0, _timeDateFont);
|
|
|
|
_updateImpl(_timeCanvas, _timeCanvasX, _timeCanvasY);
|
|
_updateImpl(_dateCanvas, _dateCanvasX, _dateCanvasY);
|
|
}
|
|
|
|
|
|
void StatusView::updateSCD40(uint16_t co2, float temperature, float humidity)
|
|
{
|
|
char str[8] = { 0 };
|
|
|
|
_co2Canvas->clear(TFT_WHITE);
|
|
_tempCanvas->clear(TFT_WHITE);
|
|
_humiCanvas->clear(TFT_WHITE);
|
|
|
|
sprintf(str, "%d", co2);
|
|
_co2Canvas->drawRightString(str, _humiCanvas->width(), 0, _scd40OptionFont);
|
|
_updateImpl(_co2Canvas, _co2CanvasX, _co2CanvasY);
|
|
|
|
memset(str, 0, sizeof(str));
|
|
sprintf(str, "%.2f", temperature);
|
|
_tempCanvas->drawRightString(str, _humiCanvas->width(), 0, _scd40OptionFont);
|
|
_updateImpl(_tempCanvas, _tempCanvasX, _tempCanvasY);
|
|
|
|
memset(str, 0, sizeof(str));
|
|
sprintf(str, "%.2f", humidity);
|
|
_humiCanvas->drawRightString(str, _humiCanvas->width(), 0, _scd40OptionFont);
|
|
_updateImpl(_humiCanvas, _humiCanvasX, _humiCanvasY);
|
|
}
|
|
|
|
|
|
void StatusView::updatePower(uint32_t voltage)
|
|
{
|
|
static uint32_t lastVoltage = 0;
|
|
|
|
if (lastVoltage == voltage) {
|
|
return ;
|
|
}
|
|
|
|
char str[13] = { 0 };
|
|
|
|
_voltageCanvas->clear(TFT_WHITE);
|
|
|
|
float v = (((float)voltage / 1000) * 2);
|
|
v = v > 4.2 ? 4.2 : v;
|
|
|
|
sprintf(str, "BAT:%.2fV", v);
|
|
_voltageCanvas->drawString(str, 0, 0, _poweroptionFont);
|
|
|
|
_updateImpl(_voltageCanvas, _voltageCanvasX, _voltageCanvasY);
|
|
|
|
lastVoltage = voltage;
|
|
}
|
|
|
|
|
|
void StatusView::updateCountdown(uint32_t seconds) {
|
|
String msg;
|
|
int remainingSeconds = 0;
|
|
uint32_t h = 0;
|
|
uint32_t m = 0;
|
|
uint32_t s = 0;
|
|
|
|
h = seconds / 3600;
|
|
remainingSeconds = seconds % 3600;
|
|
m = remainingSeconds / 60;
|
|
s = remainingSeconds % 60;
|
|
msg = "Time:";
|
|
if (h != 0) {
|
|
msg += String(h) + "h";
|
|
}
|
|
if (h != 0 || m != 0 || (h != 0 && s != 0)) {
|
|
msg += String(m) + "m";
|
|
}
|
|
if (s != 0) {
|
|
msg += String(s) + "s";
|
|
}
|
|
|
|
_chartCanvas->clear(TFT_WHITE);
|
|
_chartCanvas->drawString(msg.c_str(), 0, 0, _poweroptionFont);
|
|
_updateImpl(_chartCanvas, _chartCanvasX, _chartCanvasY);
|
|
}
|
|
|
|
|
|
void StatusView::displayCountdown(uint32_t seconds) {
|
|
String msg;
|
|
int remainingSeconds = 0;
|
|
uint32_t h = 0;
|
|
uint32_t m = 0;
|
|
uint32_t s = 0;
|
|
|
|
h = seconds / 3600;
|
|
remainingSeconds = seconds % 3600;
|
|
m = remainingSeconds / 60;
|
|
s = remainingSeconds % 60;
|
|
|
|
if (h != 0) {
|
|
msg += String(h) + "h";
|
|
}
|
|
if (h != 0 || m != 0 || (h != 0 && s != 0)) {
|
|
msg += String(m) + "m";
|
|
}
|
|
if (s != 0) {
|
|
msg += String(s) + "s";
|
|
}
|
|
|
|
_chartCanvas1->clear(TFT_WHITE);
|
|
_chartCanvas1->drawString(msg.c_str(), 0, 0, _poweroptionFont);
|
|
_lcd->fillRect(_chartCanvasX + _chartCanvas1->textWidth("Time:", _poweroptionFont), _chartCanvasY, _chartCanvas1->width(), _chartCanvas1->height(), TFT_WHITE);
|
|
_chartCanvas1->pushSprite(_chartCanvasX + _chartCanvas1->textWidth("Time:", _poweroptionFont), _chartCanvasY);
|
|
_lcd->waitDisplay();
|
|
|
|
updateCountdown(seconds);
|
|
}
|
|
|
|
|
|
void StatusView::updateSEN55(
|
|
float massConcentrationPm1p0,
|
|
float massConcentrationPm2p5,
|
|
float massConcentrationPm4p0,
|
|
float massConcentrationPm10p0,
|
|
float ambientHumidity,
|
|
float ambientTemperature,
|
|
float vocIndex,
|
|
float noxIndex
|
|
) {
|
|
char str[8] = { 0 };
|
|
|
|
_pm1p0Canvas->clear(TFT_WHITE);
|
|
_pm2p5Canvas->clear(TFT_WHITE);
|
|
_pm4p0Canvas->clear(TFT_WHITE);
|
|
_pm10p0Canvas->clear(TFT_WHITE);
|
|
_sen55TempCanvas->clear(TFT_WHITE);
|
|
_sen55HumiCanvas->clear(TFT_WHITE);
|
|
_vocCanvas->clear(TFT_WHITE);
|
|
_noxCanvas->clear(TFT_WHITE);
|
|
|
|
|
|
sprintf(str, "%.2f", massConcentrationPm1p0);
|
|
_pm1p0Canvas->drawRightString(str, _pm1p0Canvas->width(), 0, _sen55OptionFont);
|
|
_pm1p0Canvas->pushSprite(_pm1p0CanvasX, _pm1p0CanvasY);
|
|
|
|
memset(str, 0, sizeof(str));
|
|
sprintf(str, "%.2f", massConcentrationPm2p5);
|
|
_pm2p5Canvas->drawRightString(str, _pm2p5Canvas->width(), 0, _sen55OptionFont);
|
|
_pm2p5Canvas->pushSprite(_pm2p5CanvasX, _pm2p5CanvasY);
|
|
|
|
memset(str, 0, sizeof(str));
|
|
sprintf(str, "%.2f", massConcentrationPm4p0);
|
|
_pm4p0Canvas->drawRightString(str, _pm4p0Canvas->width(), 0, _sen55OptionFont);
|
|
_pm4p0Canvas->pushSprite(_pm4p0CanvasX, _pm4p0CanvasY);
|
|
|
|
memset(str, 0, sizeof(str));
|
|
sprintf(str, "%.2f", massConcentrationPm10p0);
|
|
_pm10p0Canvas->drawRightString(str, _pm10p0Canvas->width(), 0, _sen55OptionFont);
|
|
_pm10p0Canvas->pushSprite(_pm10p0CanvasX, _pm10p0CanvasY);
|
|
|
|
memset(str, 0, sizeof(str));
|
|
sprintf(str, "%.2f", ambientTemperature);
|
|
_sen55TempCanvas->drawRightString(str, _sen55TempCanvas->width(), 0, _sen55OptionFont);
|
|
_sen55TempCanvas->pushSprite(_sen55TempCanvasX, _sen55TempCanvasY);
|
|
|
|
memset(str, 0, sizeof(str));
|
|
sprintf(str, "%.2f", ambientHumidity);
|
|
_sen55HumiCanvas->drawRightString(str, _sen55HumiCanvas->width(), 0, _sen55OptionFont);
|
|
_sen55HumiCanvas->pushSprite(_sen55HumiCanvasX, _sen55HumiCanvasY);
|
|
|
|
memset(str, 0, sizeof(str));
|
|
sprintf(str, "%.2f", vocIndex);
|
|
_vocCanvas->drawRightString(str, _vocCanvas->width(), 0, _sen55OptionFont);
|
|
_vocCanvas->pushSprite(_vocCanvasX, _vocCanvasY);
|
|
|
|
memset(str, 0, sizeof(str));
|
|
sprintf(str, "%.2f", noxIndex);
|
|
_noxCanvas->drawRightString(str, _noxCanvas->width(), 0, _sen55OptionFont);
|
|
_noxCanvas->pushSprite(_noxCanvasX, _noxCanvasY);
|
|
}
|
|
|
|
|
|
void StatusView::displayNetworkStatus(const char *title, const char *msg) {
|
|
_stautsTitleCanvas1->clear(TFT_WHITE);
|
|
_stautsMsgCanvas1->clear(TFT_WHITE);
|
|
_stautsTitleCanvas1->drawCenterString(title, _stautsTitleCanvas1->width() / 2, 0, _statusTitleFont);
|
|
_stautsMsgCanvas1->drawCenterString(msg, _stautsMsgCanvas1->width() / 2, 0, _statusMsgFont);
|
|
|
|
_updateImpl(_stautsTitleCanvas1, _statusTitleCanvasX, _statusTitleCanvasY);
|
|
_updateImpl(_stautsMsgCanvas1, _statusMsgCanvasX, _statusMsgCanvasY);
|
|
updateNetworkStatus(title, msg);
|
|
}
|
|
|
|
|
|
void StatusView::updateNetworkStatus(const char *title, const char *msg) {
|
|
_stautsTitleCanvas->clear(TFT_WHITE);
|
|
_stautsMsgCanvas->clear(TFT_WHITE);
|
|
_stautsTitleCanvas->drawCenterString(title, _stautsTitleCanvas->width() / 2, 0, _statusTitleFont);
|
|
_stautsMsgCanvas->drawCenterString(msg, _stautsMsgCanvas->width() / 2, 0, _statusMsgFont);
|
|
|
|
_updateImpl(_stautsTitleCanvas, _statusTitleCanvasX, _statusTitleCanvasY);
|
|
_updateImpl(_stautsMsgCanvas, _statusMsgCanvasX, _statusMsgCanvasY);
|
|
}
|
|
|
|
|
|
void StatusView::displayNickname(String &nickname) {
|
|
|
|
const lgfx::IFont* fontTable[] = {&fonts::efontCN_16, &fonts::efontCN_14, &fonts::efontCN_12, &fonts::efontCN_10};
|
|
size_t i = 0;
|
|
|
|
for (i = 0; i < 4; i++) {
|
|
if (_nicknameCanvas1->textWidth(nickname, fontTable[i]) > 95) {
|
|
continue;
|
|
} else {
|
|
break;
|
|
}
|
|
}
|
|
|
|
log_d("%d", i);
|
|
if (i >= 4) {
|
|
splitLongString(nickname, 95, fontTable[3]);
|
|
i = 3;
|
|
}
|
|
|
|
log_d("%s", nickname.c_str());
|
|
_nicknameCanvas1->clear();
|
|
int32_t cursorX = 97 / 2;
|
|
int32_t cursorY = (32 - _canvas->fontHeight(fontTable[i])) / 2;
|
|
log_d("%s", nickname.c_str());
|
|
_nicknameCanvas1->drawCenterString(nickname, cursorX, cursorY, fontTable[i]);
|
|
|
|
_updateImpl(_nicknameCanvas1, _nicknameCanvasX, _nicknameCanvasY);
|
|
updateNickname(nickname);
|
|
}
|
|
|
|
|
|
void StatusView::updateNickname(String &nickname) {
|
|
const lgfx::IFont* fontTable[] = {&fonts::efontCN_16, &fonts::efontCN_14, &fonts::efontCN_12, &fonts::efontCN_10};
|
|
size_t i = 0;
|
|
|
|
for (i = 0; i < 4; i++) {
|
|
if (_nicknameCanvas->textWidth(nickname, fontTable[i]) > 95) {
|
|
continue;
|
|
} else {
|
|
break;
|
|
}
|
|
}
|
|
|
|
log_d("%d", i);
|
|
if (i >= 4) {
|
|
splitLongString(nickname, 95, fontTable[3]);
|
|
i = 3;
|
|
}
|
|
|
|
log_d("%s", nickname.c_str());
|
|
_nicknameCanvas->clear();
|
|
int32_t cursorX = 97 / 2;
|
|
int32_t cursorY = (32 - _nicknameCanvas->fontHeight(fontTable[i])) / 2;
|
|
log_d("%s", nickname.c_str());
|
|
_nicknameCanvas->drawCenterString(nickname, cursorX, cursorY, fontTable[i]);
|
|
|
|
_updateImpl(_nicknameCanvas, _nicknameCanvasX, _nicknameCanvasY);
|
|
|
|
}
|
|
|
|
|
|
void StatusView::load() {
|
|
_lcd->clear();
|
|
_lcd->waitDisplay();
|
|
_lcd->clear(TFT_BLACK);
|
|
_lcd->waitDisplay();
|
|
_lcd->clear(TFT_WHITE);
|
|
_lcd->waitDisplay();
|
|
_updateImpl(_canvas, 0, 0);
|
|
_lcd->waitDisplay();
|
|
}
|
|
|
|
|
|
void StatusView::disappear() {
|
|
_lcd->clear();
|
|
}
|
|
|
|
|
|
void StatusView::_updateImpl(M5Canvas *canvas, int32_t x, int32_t y)
|
|
{
|
|
canvas->pushSprite(x, y);
|
|
}
|
|
|
|
|
|
void StatusView::splitLongString(String &text, int32_t maxWidth, const lgfx::IFont* font) {
|
|
int32_t w = _lcd->textWidth(text, font);
|
|
int32_t start = 1;
|
|
int32_t end = 0;
|
|
if (w < maxWidth) {
|
|
return ;
|
|
}
|
|
|
|
w = _lcd->textWidth("...", font);
|
|
for (;;) {
|
|
int32_t ww = _lcd->textWidth(text.substring(0, end), font);
|
|
ww = _lcd->textWidth(text.substring(0, end), font);
|
|
if (ww > (maxWidth / 2 - w)) {
|
|
end -= 1;
|
|
break;
|
|
}
|
|
end += 1;
|
|
}
|
|
|
|
start = end;
|
|
|
|
for (;;) {
|
|
int32_t ww = _lcd->textWidth(text.substring(start, -1), font);
|
|
if (ww < (maxWidth / 2 - w)) {
|
|
start += 1;
|
|
break;
|
|
}
|
|
start += 1;
|
|
}
|
|
|
|
text = text.substring(0, end) + "..." + text.substring(start);
|
|
log_d("%s", text.c_str());
|
|
}
|