mirror of
https://github.com/lumapu/ahoy.git
synced 2025-08-04 00:48:24 +02:00
add fonts with symbols to ahoy project and add WLAN RSSI bar to 84x48
This commit is contained in:
parent
f1bff0b824
commit
bf0f1181c6
26 changed files with 2292 additions and 60 deletions
|
@ -66,7 +66,7 @@ class Display {
|
|||
if (mMono != NULL)
|
||||
mMono->loop(mCfg->contrast);
|
||||
|
||||
if (mNewPayload || (((++mLoopCnt) % 30) == 0)) {
|
||||
if (mNewPayload || (((++mLoopCnt) % 10) == 0)) {
|
||||
mNewPayload = false;
|
||||
mLoopCnt = 0;
|
||||
DataScreen();
|
||||
|
@ -85,7 +85,8 @@ class Display {
|
|||
float totalYieldDay = 0;
|
||||
float totalYieldTotal = 0;
|
||||
|
||||
uint8_t isprod = 0;
|
||||
uint8_t nrprod = 0;
|
||||
uint8_t nrsleep = 0;
|
||||
|
||||
Inverter<> *iv;
|
||||
record_t<> *rec;
|
||||
|
@ -96,7 +97,9 @@ class Display {
|
|||
continue;
|
||||
|
||||
if (iv->isProducing())
|
||||
isprod++;
|
||||
nrprod++;
|
||||
else
|
||||
nrsleep++;
|
||||
|
||||
totalPower += iv->getChannelFieldValue(CH0, FLD_PAC, rec);
|
||||
totalYieldDay += iv->getChannelFieldValue(CH0, FLD_YD, rec);
|
||||
|
@ -104,13 +107,16 @@ class Display {
|
|||
}
|
||||
|
||||
// prepare display data
|
||||
mDisplayData.isProducing = isprod;
|
||||
mDisplayData.nrProducing = nrprod;
|
||||
mDisplayData.nrSleeping = nrsleep;
|
||||
mDisplayData.totalPower = totalPower;
|
||||
mDisplayData.totalYieldDay = totalYieldDay;
|
||||
mDisplayData.totalYieldTotal = totalYieldTotal;
|
||||
mDisplayData.RadioSymbol = mHmRadio->isChipConnected();
|
||||
mDisplayData.wifiRSSI = (WiFi.status() == WL_CONNECTED) ? WiFi.RSSI() : SCHAR_MIN;
|
||||
mDisplayData.WiFiSymbol = (WiFi.status() == WL_CONNECTED);
|
||||
mDisplayData.WifiSymbol = (WiFi.status() == WL_CONNECTED);
|
||||
mDisplayData.MQTTSymbol = mApp->getMqttIsConnected();
|
||||
mDisplayData.RadioRSSI = (0 < mDisplayData.nrProducing) ? 0 : SCHAR_MIN; // Workaround as NRF24 has no RSSI. Could be approximated by transmisson error heuristic in the future
|
||||
mDisplayData.WifiRSSI = (WiFi.status() == WL_CONNECTED) ? WiFi.RSSI() : SCHAR_MIN;
|
||||
mDisplayData.ipAddress = WiFi.localIP();
|
||||
time_t utc= mApp->getTimestamp();
|
||||
if (year(utc) > 2020)
|
||||
|
@ -123,7 +129,7 @@ class Display {
|
|||
}
|
||||
#if defined(ESP32)
|
||||
else if (mCfg->type == 10) {
|
||||
mEpaper.loop(totalPower, totalYieldDay, totalYieldTotal, isprod);
|
||||
mEpaper.loop(totalPower, totalYieldDay, totalYieldTotal, nrprod);
|
||||
mRefreshCycle++;
|
||||
}
|
||||
|
||||
|
|
|
@ -60,4 +60,70 @@ class DisplayMono {
|
|||
mDispWidth = mDisplay->getDisplayWidth();
|
||||
mDispHeight = mDisplay->getDisplayHeight();
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
/* adapted 5x8 Font for low-res displays with symbols
|
||||
Symbols:
|
||||
\x80 ... antenna
|
||||
\x81 ... WiFi
|
||||
\x82 ... suncurve
|
||||
\x83 ... sum/sigma
|
||||
\x84 ... antenna crossed
|
||||
\x85 ... WiFi crossed
|
||||
\x86 ... sun
|
||||
\x87 ... moon
|
||||
\x88 ... calendar/day
|
||||
\x89 ... MQTT */
|
||||
const uint8_t u8g2_font_5x8_symbols_ahoy[1052] U8G2_FONT_SECTION("u8g2_font_5x8_symbols_ahoy") =
|
||||
"j\0\3\2\4\4\3\4\5\10\10\0\377\6\377\6\0\1\61\2b\4\3 \5\0\304\11!\7a\306"
|
||||
"\212!\11\42\7\63\335\212\304\22#\16u\304\232R\222\14JePJI\2$\14u\304\252l\251m"
|
||||
"I\262E\0%\10S\315\212(\351\24&\13t\304\232(i\252\64%\1'\6\61\336\212\1(\7b"
|
||||
"\305\32\245))\11b\305\212(\251(\0*\13T\304\212(Q\206D\211\2+\12U\304\252\60\32\244"
|
||||
"\60\2,\7\63\275\32\245\4-\6\24\324\212!.\6\42\305\212!/\10d\304\272R[\6\60\14d"
|
||||
"\304\32%R\206DJ\24\0\61\10c\305\232Dj\31\62\13d\304\32%\312\22%\33\2\63\13d\304"
|
||||
"\212!\212D)Q\0\64\13d\304\252H\251\14Q\226\0\65\12d\304\212A\33\245D\1\66\13d\304"
|
||||
"\32%[\42)Q\0\67\13d\304\212!\213\262(\213\0\70\14d\304\32%J\224HJ\24\0\71\13"
|
||||
"d\304\32%\222\222-Q\0:\10R\305\212!\32\2;\10c\275\32\243R\2<\10c\305\252\244\224"
|
||||
"\25=\10\64\314\212!\34\2>\11c\305\212\254\224\224\0?\11c\305\232\246$M\0@\15\205\274*"
|
||||
")\222\226DI\244\252\2A\12d\304\32%\222\206I\12B\14d\304\212%\32\222H\32\22\0C\12"
|
||||
"d\304\32%\322J\211\2D\12d\304\212%r\32\22\0E\12d\304\212A[\262l\10F\12d\304"
|
||||
"\212A[\262\32\0G\13d\304\32%\322\222)Q\0H\12d\304\212H\32&S\0I\10c\305\212"
|
||||
"%j\31J\12d\304\232)\253\224\42\0K\13d\304\212HI\244\244S\0L\10d\304\212\254\333\20"
|
||||
"M\12d\304\212h\70D\246\0N\12d\304\212h\31\226I\12O\12d\304\32%rJ\24\0P\13"
|
||||
"d\304\212%\222\206$\313\0Q\12t\274\32%\222\26\307\0R\13d\304\212%\222\206$\222\2S\14"
|
||||
"d\304\32%J\302$J\24\0T\11e\304\212A\12;\1U\11d\304\212\310S\242\0V\12d\304"
|
||||
"\212\310)\221\24\0W\12d\304\212\310\64\34\242\0X\13d\304\212HJ$%\222\2Y\12e\304\212"
|
||||
"LKja\11Z\12d\304\212!\213\332\206\0[\10c\305\212!j\32\134\10d\304\212,l\13]"
|
||||
"\10c\305\212\251i\10^\6#\345\232\6_\6\24\274\212!`\6\42\345\212(a\11D\304\232!\222"
|
||||
"\222\1b\13d\304\212,[\42iH\0c\7C\305\232)\23d\12d\304\272\312\20I\311\0e\11"
|
||||
"D\304\32%\31\262\1f\12d\304\252Ji\312\42\0g\12T\274\32%J\266D\1h\12d\304\212"
|
||||
",[\42S\0i\10c\305\232P\252\14j\12s\275\252\64\212\224\12\0k\12d\304\212\254\64$\221"
|
||||
"\24l\10c\305\12\251\313\0m\12E\304\12\245EI\224\2n\10D\304\212%\62\5o\11D\304\32"
|
||||
"%\222\22\5p\12T\274\212%\32\222,\3q\11T\274\232!J\266\2r\11D\304\212$\261e\0"
|
||||
"s\10C\305\232![\0t\13d\304\232,\232\262$J\0u\10D\304\212\310\224\14v\10C\305\212"
|
||||
"\304R\1w\12E\304\212LI\224.\0x\11D\304\212(\221\224(y\13T\274\212HJ\206(Q"
|
||||
"\0z\11D\304\212!*\15\1{\12t\304*%L\304(\24|\6a\306\212\3}\13t\304\12\61"
|
||||
"\12\225\60\221\0~\10$\344\232DI\0\5\0\304\12\200\13u\274\212K\242T\266\260\4\201\14f"
|
||||
"D\233!\11#-\312!\11\202\15hD<\65\12\243,\214\302$\16\203\15w<\214C\22F\71\220"
|
||||
"\26\207A\204\16\205\274\212,)%Y\230%QR\13\205\17\206<\213\60\31\22\311\66D\245!\11\3"
|
||||
"\206\20\210<\254\342\20]\302(L\246C\30E\0\207\15wD\334X\25\267\341\20\15\21\0\210\16w"
|
||||
"<\214\203RQ\25I\212\324a\20\211\15f\304\213)\213\244,\222\222\245\0\0\0\0";
|
||||
|
||||
|
||||
const uint8_t u8g2_font_ncenB08_symbols8_ahoy[173] U8G2_FONT_SECTION("u8g2_font_ncenB08_symbols8_ahoy") =
|
||||
"\13\0\3\2\4\4\1\2\5\10\11\0\0\10\0\10\0\0\0\0\0\0\224A\14\207\305\70H\321\222H"
|
||||
"k\334\6B\20\230\305\32\262\60\211\244\266\60T\243\34\326\0C\20\210\305S\243\60\312\302(\214\302("
|
||||
"L\342\0D\16\210\315\70(i\224#\71\20W\207\3E\15\207\305xI\206\323\232nIS\1F\25"
|
||||
"\230\305H\206\244\230$C\22\15Y\242\204j\224\205I$\5G\17\210\305*\16\321%\214\302d:\204"
|
||||
"Q\4H\14w\307\215Uq\33\16\321\20\1I\21\227\305\311\222aP\245H\221\244H\212\324a\20J"
|
||||
"\5\0\275\0K\5\0\315\0\0\0\0";
|
||||
|
||||
const uint8_t u8g2_font_ncenB10_symbols10_ahoy[207] U8G2_FONT_SECTION("u8g2_font_ncenB10_symbols10_ahoy") =
|
||||
"\13\0\3\2\4\4\2\2\5\13\13\0\0\13\0\13\0\0\0\0\0\0\266A\15\267\212q\220\42\251\322"
|
||||
"\266\306\275\1B\20\230\236\65da\22Ima\250F\71\254\1C\23\272\272\251\3Q\32\366Q\212\243"
|
||||
"\70\212\243\70\311\221\0D\20\271\252\361\242F:\242#: {\36\16\1E\22\267\212\361\222\14I\242"
|
||||
"\14\332\232\216[RJ\232\12F\25\250\233\221\14I\61I\206$\252%J\250Fa\224%J\71G\30"
|
||||
"\273\312W\316r`T\262DJ\303\64L#%K\304\35\310\342,\3H\27\272\272\217\344P\16\351\210"
|
||||
"\16\354\300<\244C\70,\303 \16!\0I\24\271\252\241\34\336\1-\223\64-\323\62-\323\62\35x"
|
||||
"\10J\5\0\232\1K\5\0\232\1\0\0\0";
|
||||
|
||||
|
|
|
@ -52,7 +52,7 @@ class DisplayMono128X32 : public DisplayMono {
|
|||
if (3 != mType)
|
||||
mDisplay->setContrast(mLuminance);
|
||||
|
||||
if ((mDisplayData->totalPower > 0) && (mDisplayData->isProducing > 0)) {
|
||||
if ((mDisplayData->totalPower > 0) && (mDisplayData->nrProducing > 0)) {
|
||||
mTimeout = DISP_DEFAULT_TIMEOUT;
|
||||
mDisplay->setPowerSave(false);
|
||||
if (mDisplayData->totalPower > 999)
|
||||
|
@ -78,7 +78,7 @@ class DisplayMono128X32 : public DisplayMono {
|
|||
if (!(mExtra % 10) && (ip))
|
||||
printText(ip.toString().c_str(), 3);
|
||||
else if (!(mExtra % 5)) {
|
||||
snprintf(mFmtText, DISP_FMT_TEXT_LEN, "%d Inverter on", mDisplayData->isProducing);
|
||||
snprintf(mFmtText, DISP_FMT_TEXT_LEN, "%d Inverter on", mDisplayData->nrProducing);
|
||||
printText(mFmtText, 3);
|
||||
} else if (0 != mDisplayData->utcTs)
|
||||
printText(ah::getTimeStr(gTimezone.toLocal(mDisplayData->utcTs)).c_str(), 3);
|
||||
|
@ -106,13 +106,13 @@ class DisplayMono128X32 : public DisplayMono {
|
|||
inline void setFont(uint8_t line) {
|
||||
switch (line) {
|
||||
case 0:
|
||||
mDisplay->setFont(u8g2_font_9x15_tf);
|
||||
mDisplay->setFont(u8g2_font_9x15_tr);
|
||||
break;
|
||||
case 3:
|
||||
mDisplay->setFont(u8g2_font_tom_thumb_4x6_tf);
|
||||
mDisplay->setFont(u8g2_font_tom_thumb_4x6_tr);
|
||||
break;
|
||||
default:
|
||||
mDisplay->setFont(u8g2_font_tom_thumb_4x6_tf);
|
||||
mDisplay->setFont(u8g2_font_tom_thumb_4x6_tr);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -61,7 +61,7 @@ class DisplayMono128X64 : public DisplayMono {
|
|||
// set Contrast of the Display to raise the lifetime
|
||||
mDisplay->setContrast(mLuminance);
|
||||
|
||||
if ((mDisplayData->totalPower > 0) && (mDisplayData->isProducing > 0)) {
|
||||
if ((mDisplayData->totalPower > 0) && (mDisplayData->nrProducing > 0)) {
|
||||
mTimeout = DISP_DEFAULT_TIMEOUT;
|
||||
mDisplay->setPowerSave(false);
|
||||
|
||||
|
@ -88,7 +88,7 @@ class DisplayMono128X64 : public DisplayMono {
|
|||
if (!(mExtra % 10) && (ip))
|
||||
printText(ip.toString().c_str(), 3);
|
||||
else if (!(mExtra % 5)) {
|
||||
snprintf(mFmtText, DISP_FMT_TEXT_LEN, "%d Inverter on", mDisplayData->isProducing);
|
||||
snprintf(mFmtText, DISP_FMT_TEXT_LEN, "%d Inverter on", mDisplayData->nrProducing);
|
||||
printText(mFmtText, 3);
|
||||
} else if (0 != mDisplayData->utcTs)
|
||||
printText(ah::getDateTimeStr(gTimezone.toLocal(mDisplayData->utcTs)).c_str(), 3);
|
||||
|
@ -115,7 +115,7 @@ class DisplayMono128X64 : public DisplayMono {
|
|||
mDisplay->setFont(u8g2_font_ncenB14_tr);
|
||||
break;
|
||||
case 3:
|
||||
mDisplay->setFont(u8g2_font_5x8_tr);
|
||||
mDisplay->setFont(u8g2_font_5x8_symbols_ahoy);
|
||||
break;
|
||||
default:
|
||||
mDisplay->setFont(u8g2_font_ncenB10_tr);
|
||||
|
|
|
@ -52,7 +52,7 @@ class DisplayMono64X48 : public DisplayMono {
|
|||
// set Contrast of the Display to raise the lifetime
|
||||
mDisplay->setContrast(mLuminance);
|
||||
|
||||
if ((mDisplayData->totalPower > 0) && (mDisplayData->isProducing > 0)) {
|
||||
if ((mDisplayData->totalPower > 0) && (mDisplayData->nrProducing > 0)) {
|
||||
mTimeout = DISP_DEFAULT_TIMEOUT;
|
||||
mDisplay->setPowerSave(false);
|
||||
|
||||
|
@ -79,7 +79,7 @@ class DisplayMono64X48 : public DisplayMono {
|
|||
if (!(mExtra % 10) && (ip))
|
||||
printText(ip.toString().c_str(), 3);
|
||||
else if (!(mExtra % 5)) {
|
||||
snprintf(mFmtText, DISP_FMT_TEXT_LEN, "active Inv: %d", mDisplayData->isProducing);
|
||||
snprintf(mFmtText, DISP_FMT_TEXT_LEN, "active Inv: %d", mDisplayData->nrProducing);
|
||||
printText(mFmtText, 3);
|
||||
} else if (0 != mDisplayData->utcTs)
|
||||
printText(ah::getTimeStr(gTimezone.toLocal(mDisplayData->utcTs)).c_str(), 3);
|
||||
|
@ -102,11 +102,11 @@ class DisplayMono64X48 : public DisplayMono {
|
|||
inline void setFont(uint8_t line) {
|
||||
switch (line) {
|
||||
case 0:
|
||||
mDisplay->setFont(u8g2_font_fur11_tf);
|
||||
mDisplay->setFont(u8g2_font_fur11_tr);
|
||||
break;
|
||||
case 1:
|
||||
case 2:
|
||||
mDisplay->setFont(u8g2_font_6x10_tf);
|
||||
mDisplay->setFont(u8g2_font_6x10_tr);
|
||||
break;
|
||||
case 3:
|
||||
mDisplay->setFont(u8g2_font_4x6_tr);
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
|
||||
#pragma once
|
||||
#include "Display_Mono.h"
|
||||
#include "../../utils/dbg.h"
|
||||
|
||||
class DisplayMono84X48 : public DisplayMono {
|
||||
public:
|
||||
|
@ -27,9 +28,9 @@ class DisplayMono84X48 : public DisplayMono {
|
|||
u8g2_cb_t *rot = (u8g2_cb_t *)((rotation != 0x00) ? U8G2_R2 : U8G2_R0);
|
||||
monoInit(new U8G2_PCD8544_84X48_F_4W_SW_SPI(rot, clock, data, cs, dc, reset), type, displayData);
|
||||
calcLinePositions();
|
||||
printText("Ahoy!", l_Ahoy);
|
||||
printText("ahoydtu.de", l_Website);
|
||||
printText(mDisplayData->version, l_Version);
|
||||
printText("Ahoy!", l_Ahoy, 0xff);
|
||||
printText("ahoydtu.de", l_Website, 0xff);
|
||||
printText(mDisplayData->version, l_Version, 0xff);
|
||||
mDisplay->sendBuffer();
|
||||
}
|
||||
|
||||
|
@ -46,43 +47,87 @@ class DisplayMono84X48 : public DisplayMono {
|
|||
}
|
||||
|
||||
void disp(void) {
|
||||
// Test
|
||||
/*
|
||||
mDisplayData->nrSleeping = 10;
|
||||
mDisplayData->nrProducing = 10;
|
||||
mDisplayData->totalPower = 12345.67;
|
||||
mDisplayData->totalYieldDay = 12345.67;
|
||||
mDisplayData->totalYieldTotal = 1234;
|
||||
mDisplayData->utcTs += 1000000;
|
||||
*/
|
||||
|
||||
mDisplay->clearBuffer();
|
||||
|
||||
// set Contrast of the Display to raise the lifetime
|
||||
mDisplay->setContrast(mLuminance);
|
||||
|
||||
if ((mDisplayData->totalPower > 0) && (mDisplayData->isProducing > 0)) {
|
||||
// print total power
|
||||
if (mDisplayData->nrProducing > 0) {
|
||||
mTimeout = DISP_DEFAULT_TIMEOUT;
|
||||
mDisplay->setPowerSave(false);
|
||||
|
||||
if (mDisplayData->totalPower > 999)
|
||||
if (mDisplayData->totalPower > 9999)
|
||||
snprintf(mFmtText, DISP_FMT_TEXT_LEN, "%.2fkW", (mDisplayData->totalPower / 1000)); // forgo spacing between value and SI unit in favor of second position after decimal point
|
||||
else if (mDisplayData->totalPower > 999)
|
||||
snprintf(mFmtText, DISP_FMT_TEXT_LEN, "%.2f kW", (mDisplayData->totalPower / 1000));
|
||||
else
|
||||
snprintf(mFmtText, DISP_FMT_TEXT_LEN, "%.0f W", mDisplayData->totalPower);
|
||||
snprintf(mFmtText, DISP_FMT_TEXT_LEN, "%.1f W", mDisplayData->totalPower);
|
||||
|
||||
printText(mFmtText, l_TotalPower);
|
||||
printText(mFmtText, l_TotalPower, 0xff);
|
||||
} else {
|
||||
printText("offline", l_TotalPower);
|
||||
printText("offline", l_TotalPower, 0xff);
|
||||
// check if it's time to enter power saving mode
|
||||
if (mTimeout == 0)
|
||||
mDisplay->setPowerSave(mEnPowerSave);
|
||||
}
|
||||
|
||||
|
||||
snprintf(mFmtText, DISP_FMT_TEXT_LEN, "Today: %.0f Wh", mDisplayData->totalYieldDay);
|
||||
printText(mFmtText, l_YieldDay);
|
||||
|
||||
snprintf(mFmtText, DISP_FMT_TEXT_LEN, "Total: %.1f kWh", mDisplayData->totalYieldTotal);
|
||||
printText(mFmtText, l_YieldTotal);
|
||||
|
||||
// print Date and time
|
||||
if (0 != mDisplayData->utcTs)
|
||||
printText(ah::getDateTimeStrShort(gTimezone.toLocal(mDisplayData->utcTs)).c_str(), l_Time);
|
||||
printText(ah::getDateTimeStrShort(gTimezone.toLocal(mDisplayData->utcTs)).c_str(), l_Time, 0xff);
|
||||
|
||||
if (!(mExtra % 5) && (mDisplayData->ipAddress))
|
||||
// alternatively:
|
||||
// print ip address
|
||||
if (!(mExtra % 5) && (mDisplayData->ipAddress)) {
|
||||
snprintf(mFmtText, DISP_FMT_TEXT_LEN, "%s", (mDisplayData->ipAddress).toString().c_str());
|
||||
printText(mFmtText, l_Status, 0xff);
|
||||
}
|
||||
// print status of inverters
|
||||
else {
|
||||
if (0 == mDisplayData->nrSleeping)
|
||||
snprintf(mFmtText, DISP_FMT_TEXT_LEN, "\x86");
|
||||
else if (0 == mDisplayData->nrProducing)
|
||||
snprintf(mFmtText, DISP_FMT_TEXT_LEN, "\x87");
|
||||
else
|
||||
snprintf(mFmtText, DISP_FMT_TEXT_LEN, "%d\x86 %d\x87", mDisplayData->nrProducing, mDisplayData->nrSleeping);
|
||||
setLineFont(l_Status);
|
||||
printText(mFmtText, l_Status, (mDispWidth - mDisplay->getStrWidth(mFmtText)) / 2);
|
||||
}
|
||||
|
||||
// print yields
|
||||
printText("\x88", l_YieldDay, 11); // day symbol
|
||||
printText("\x83", l_YieldTotal, 11); // total symbol
|
||||
snprintf(mFmtText, DISP_FMT_TEXT_LEN, "%7.0f Wh", mDisplayData->totalYieldDay);
|
||||
printText(mFmtText, l_YieldDay, 18);
|
||||
snprintf(mFmtText, DISP_FMT_TEXT_LEN, "%7.1f kWh", mDisplayData->totalYieldTotal);
|
||||
printText(mFmtText, l_YieldTotal, 18);
|
||||
|
||||
// draw dynamic Nokia RSSI bars
|
||||
int rssi_bar_height = 7;
|
||||
for (int i=0; i<4;i++) {
|
||||
int radio_rssi_threshold = -60 - i*10; // radio rssi not yet tested in reality!
|
||||
int wifi_rssi_threshold = -60 - i*10;
|
||||
if (mDisplayData->RadioRSSI > radio_rssi_threshold)
|
||||
mDisplay->drawBox(0, 8+(rssi_bar_height+1)*i, 4-i,rssi_bar_height);
|
||||
if (mDisplayData->WifiRSSI > wifi_rssi_threshold)
|
||||
mDisplay->drawBox(mDispWidth-4+i, 8+(rssi_bar_height+1)*i, 4-i,rssi_bar_height);
|
||||
}
|
||||
|
||||
// draw dynamic antenna and WiFi symbols
|
||||
snprintf(mFmtText, DISP_FMT_TEXT_LEN, "%c", mDisplayData->RadioSymbol?'\x80':'\x84'); // NRF
|
||||
printText(mFmtText, l_RSSI);
|
||||
if (mDisplayData->MQTTSymbol)
|
||||
snprintf(mFmtText, DISP_FMT_TEXT_LEN, "\x89"); // MQTT
|
||||
else
|
||||
snprintf(mFmtText, DISP_FMT_TEXT_LEN, "Inv.On: %d", mDisplayData->isProducing);
|
||||
printText(mFmtText, l_Status);
|
||||
snprintf(mFmtText, DISP_FMT_TEXT_LEN, "%c", mDisplayData->WifiSymbol?'\x81':'\x85'); // Wifi connected
|
||||
printText(mFmtText, l_RSSI, mDispWidth - 6);
|
||||
|
||||
mDisplay->sendBuffer();
|
||||
|
||||
|
@ -90,7 +135,6 @@ class DisplayMono84X48 : public DisplayMono {
|
|||
}
|
||||
|
||||
private:
|
||||
uint16_t mDispWidth;
|
||||
enum _dispLine {
|
||||
// start page
|
||||
l_Website = 0,
|
||||
|
@ -102,6 +146,8 @@ class DisplayMono84X48 : public DisplayMono {
|
|||
l_TotalPower = 2,
|
||||
l_YieldDay = 3,
|
||||
l_YieldTotal = 4,
|
||||
// run page - rssi bar symbols
|
||||
l_RSSI = 4,
|
||||
// End
|
||||
l_MAX_LINES = 5,
|
||||
};
|
||||
|
@ -112,7 +158,7 @@ class DisplayMono84X48 : public DisplayMono {
|
|||
uint8_t asc, dsc;
|
||||
|
||||
do {
|
||||
setFont(i);
|
||||
setLineFont(i);
|
||||
asc = mDisplay->getAscent();
|
||||
yOff += asc;
|
||||
mLineYOffsets[i] = yOff;
|
||||
|
@ -124,19 +170,23 @@ class DisplayMono84X48 : public DisplayMono {
|
|||
} while(l_MAX_LINES>i);
|
||||
}
|
||||
|
||||
inline void setFont(uint8_t line) {
|
||||
inline void setLineFont(uint8_t line) {
|
||||
if ((line == l_TotalPower) || (line == l_Ahoy))
|
||||
mDisplay->setFont(u8g2_font_logisoso16_tr);
|
||||
else
|
||||
mDisplay->setFont(u8g2_font_5x8_tr);
|
||||
mDisplay->setFont(u8g2_font_5x8_symbols_ahoy);
|
||||
}
|
||||
|
||||
void printText(const char *text, uint8_t line) {
|
||||
void printText(const char *text, uint8_t line, uint8_t col=0) {
|
||||
uint8_t dispX;
|
||||
setFont(line);
|
||||
dispX = (mDispWidth - mDisplay->getStrWidth(text)) / 2; // center text
|
||||
dispX += (mEnScreenSaver) ? (mExtra % 7) : 0;
|
||||
|
||||
setLineFont(line);
|
||||
if (0xff == col)
|
||||
dispX = (mDispWidth - mDisplay->getStrWidth(text)) / 2; // center text
|
||||
else
|
||||
dispX = col;
|
||||
mDisplay->drawStr(dispX, mLineYOffsets[line], text);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -5,16 +5,18 @@
|
|||
|
||||
struct DisplayData {
|
||||
const char *version=nullptr;
|
||||
float totalPower=0.0f;
|
||||
float totalYieldDay=0.0f;
|
||||
float totalYieldTotal=0.0f;
|
||||
uint32_t utcTs=0;
|
||||
uint8_t isProducing=0;
|
||||
int8_t wifiRSSI=SCHAR_MIN;
|
||||
bool showRadioSymbol = false;
|
||||
bool WiFiSymbol = false;
|
||||
bool RadioSymbol = false;
|
||||
IPAddress ipAddress;
|
||||
float totalPower=0.0f; // indicate current power (W)
|
||||
float totalYieldDay=0.0f; // indicate day yield (W)
|
||||
float totalYieldTotal=0.0f; // indicate total yield (W)
|
||||
uint32_t utcTs=0; // indicate absolute timestamp (utc unix time). 0 = time is not synchonized
|
||||
uint8_t nrProducing=0; // indicate number of producing inverters
|
||||
uint8_t nrSleeping=0; // indicate number of sleeping inverters
|
||||
bool WifiSymbol = false; // indicate if WiFi is connected
|
||||
bool RadioSymbol = false; // indicate if radio module is connecting and working
|
||||
bool MQTTSymbol = false; // indicate if MQTT is connected
|
||||
int8_t WifiRSSI=SCHAR_MIN; // indicate RSSI value for WiFi
|
||||
int8_t RadioRSSI=SCHAR_MIN; // indicate RSSI value for radio
|
||||
IPAddress ipAddress; // indicate ip adress of ahoy
|
||||
};
|
||||
|
||||
#endif /*__DISPLAY_DATA__*/
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue