mirror of
https://github.com/lumapu/ahoy.git
synced 2025-05-22 21:36:11 +02:00
adapt 128x64 to symbolic layout
This commit is contained in:
parent
d3c0232e06
commit
120522582e
6 changed files with 180 additions and 57 deletions
|
@ -109,7 +109,6 @@ const uint8_t u8g2_font_5x8_symbols_ahoy[1052] U8G2_FONT_SECTION("u8g2_font_5x8_
|
|||
"\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("
|
||||
|
@ -118,12 +117,11 @@ const uint8_t u8g2_font_ncenB08_symbols8_ahoy[173] U8G2_FONT_SECTION("u8g2_font_
|
|||
"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"
|
||||
const uint8_t u8g2_font_ncenB10_symbols10_ahoy[220] 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\303A\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";
|
||||
|
||||
"\10J\22\210\232\61Hi\64Di\64DI\226$KeiK\5\0\232\1\0\0\0";
|
||||
|
|
|
@ -12,6 +12,7 @@ class DisplayMono128X64 : public DisplayMono {
|
|||
mEnPowerSave = true;
|
||||
mEnScreenSaver = true;
|
||||
mLuminance = 60;
|
||||
mExtra = 0;
|
||||
mDispY = 0;
|
||||
mTimeout = DISP_DEFAULT_TIMEOUT; // interval at which to power save (milliseconds)
|
||||
}
|
||||
|
@ -37,9 +38,10 @@ class DisplayMono128X64 : public DisplayMono {
|
|||
break;
|
||||
}
|
||||
calcLinePositions();
|
||||
printText("Ahoy!", 0, 35);
|
||||
printText("ahoydtu.de", 2, 20);
|
||||
printText(mDisplayData->version, 3, 46);
|
||||
|
||||
printText("Ahoy!", l_Ahoy, 0xff);
|
||||
printText("ahoydtu.de", l_Website, 0xff);
|
||||
printText(mDisplayData->version, l_Version, 0xff);
|
||||
mDisplay->sendBuffer();
|
||||
}
|
||||
|
||||
|
@ -56,42 +58,123 @@ class DisplayMono128X64 : public DisplayMono {
|
|||
}
|
||||
|
||||
void disp(void) {
|
||||
uint8_t pos, sun_pos, moon_pos;
|
||||
|
||||
// Test
|
||||
/*
|
||||
mDisplayData->isSleeping = 1;
|
||||
mDisplayData->isProducing = 0;
|
||||
mDisplayData->totalPower = 10000;
|
||||
mDisplayData->totalYieldDay = 4998;
|
||||
mDisplayData->totalYieldTotal = 5321;
|
||||
*/
|
||||
|
||||
mDisplay->clearBuffer();
|
||||
|
||||
|
||||
// set Contrast of the Display to raise the lifetime
|
||||
mDisplay->setContrast(mLuminance);
|
||||
|
||||
if ((mDisplayData->totalPower > 0) && (mDisplayData->nrProducing > 0)) {
|
||||
// print total power
|
||||
if (mDisplayData->nrProducing > 0) {
|
||||
mTimeout = DISP_DEFAULT_TIMEOUT;
|
||||
mDisplay->setPowerSave(false);
|
||||
|
||||
if (mDisplayData->totalPower > 999)
|
||||
snprintf(mFmtText, DISP_FMT_TEXT_LEN, "%2.2f kW", (mDisplayData->totalPower / 1000));
|
||||
snprintf(mFmtText, DISP_FMT_TEXT_LEN, "%.2f kW", (mDisplayData->totalPower / 1000));
|
||||
else
|
||||
snprintf(mFmtText, DISP_FMT_TEXT_LEN, "%3.0f W", mDisplayData->totalPower);
|
||||
|
||||
printText(mFmtText, 0);
|
||||
snprintf(mFmtText, DISP_FMT_TEXT_LEN, "%.0f W", mDisplayData->totalPower);
|
||||
printText(mFmtText, l_TotalPower, 0xff);
|
||||
} else {
|
||||
printText("offline", 0, 25);
|
||||
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: %4.0f Wh", mDisplayData->totalYieldDay);
|
||||
printText(mFmtText, 1);
|
||||
// print Date and time
|
||||
if (0 != mDisplayData->utcTs)
|
||||
printText(ah::getDateTimeStrShort(gTimezone.toLocal(mDisplayData->utcTs)).c_str(), l_Time, 0xff);
|
||||
|
||||
snprintf(mFmtText, DISP_FMT_TEXT_LEN, "total: %.1f kWh", mDisplayData->totalYieldTotal);
|
||||
printText(mFmtText, 2);
|
||||
// dynamic status bar, 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 {
|
||||
sun_pos = -1;
|
||||
moon_pos = -1;
|
||||
setLineFont(l_Status);
|
||||
if (0 == mDisplayData->nrSleeping + mDisplayData->nrProducing)
|
||||
snprintf(mFmtText, DISP_FMT_TEXT_LEN, "no inverter");
|
||||
else if (0 == mDisplayData->nrSleeping) {
|
||||
snprintf(mFmtText, DISP_FMT_TEXT_LEN, " ");
|
||||
sun_pos = 0;
|
||||
}
|
||||
else if (0 == mDisplayData->nrProducing) {
|
||||
snprintf(mFmtText, DISP_FMT_TEXT_LEN, " ");
|
||||
moon_pos = 0;
|
||||
}
|
||||
else {
|
||||
snprintf(mFmtText, DISP_FMT_TEXT_LEN, "%2d", mDisplayData->nrProducing);
|
||||
sun_pos = mDisplay->getStrWidth(mFmtText);
|
||||
snprintf(mFmtText+2, DISP_FMT_TEXT_LEN, " %2d", mDisplayData->nrSleeping);
|
||||
moon_pos = mDisplay->getStrWidth(mFmtText);
|
||||
snprintf(mFmtText+7, DISP_FMT_TEXT_LEN, " ");
|
||||
}
|
||||
printText(mFmtText, l_Status, 0xff);
|
||||
|
||||
IPAddress ip = WiFi.localIP();
|
||||
if (!(mExtra % 10) && (ip))
|
||||
printText(ip.toString().c_str(), 3);
|
||||
else if (!(mExtra % 5)) {
|
||||
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);
|
||||
pos = (mDispWidth - mDisplay->getStrWidth(mFmtText)) / 2;
|
||||
mDisplay->setFont(u8g2_font_ncenB08_symbols8_ahoy);
|
||||
if (sun_pos!=-1)
|
||||
mDisplay->drawStr(pos+sun_pos, mLineYOffsets[l_Status], "G"); // sun
|
||||
if (moon_pos!=-1)
|
||||
mDisplay->drawStr(pos+moon_pos, mLineYOffsets[l_Status], "H"); // moon
|
||||
}
|
||||
|
||||
// print yields
|
||||
snprintf(mFmtText, DISP_FMT_TEXT_LEN, "%7.0f Wh", mDisplayData->totalYieldDay);
|
||||
printText(mFmtText, l_YieldDay, 25);
|
||||
snprintf(mFmtText, DISP_FMT_TEXT_LEN, "%7.1f kWh", mDisplayData->totalYieldTotal);
|
||||
printText(mFmtText, l_YieldTotal, 25);
|
||||
mDisplay->setFont(u8g2_font_ncenB10_symbols10_ahoy);
|
||||
mDisplay->drawStr(11, mLineYOffsets[l_YieldDay], "I"); // day
|
||||
mDisplay->drawStr(11, mLineYOffsets[l_YieldTotal], "D"); // total
|
||||
|
||||
// draw dynamic RSSI bars
|
||||
int rssi_bar_height = 9;
|
||||
for (int i=0; i<4;i++) {
|
||||
int radio_rssi_threshold = -60 - i*10;
|
||||
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
|
||||
mDisplay->setFont(u8g2_font_ncenB10_symbols10_ahoy);
|
||||
char sym[]=" ";
|
||||
sym[0] = mDisplayData->RadioSymbol?'A':'E'; // NRF
|
||||
mDisplay->drawStr(0, mLineYOffsets[l_RSSI], sym);
|
||||
|
||||
if (mDisplayData->MQTTSymbol)
|
||||
sym[0] = 'J'; // MQTT
|
||||
else
|
||||
sym[0] = mDisplayData->WifiSymbol?'B':'F'; // Wifi
|
||||
mDisplay->drawStr(mDispWidth - mDisplay->getStrWidth(sym), mLineYOffsets[l_RSSI], sym);
|
||||
mDisplay->sendBuffer();
|
||||
|
||||
mExtra++;
|
||||
|
||||
/* // just for test
|
||||
mDisplay->drawPixel(0, 0);
|
||||
mDisplay->drawPixel(mDispWidth-1, 0);
|
||||
mDisplay->drawPixel(0, mDispHeight-1);
|
||||
mDisplay->drawPixel(mDispWidth-1, mDispHeight-1);
|
||||
*/
|
||||
|
||||
mDisplay->sendBuffer();
|
||||
|
||||
|
@ -100,32 +183,61 @@ class DisplayMono128X64 : public DisplayMono {
|
|||
}
|
||||
|
||||
private:
|
||||
enum _dispLine {
|
||||
// start page
|
||||
l_Website = 0,
|
||||
l_Ahoy = 2,
|
||||
l_Version = 4,
|
||||
// run page
|
||||
l_Time = 0,
|
||||
l_Status = 1,
|
||||
l_TotalPower = 2,
|
||||
l_YieldDay = 3,
|
||||
l_YieldTotal = 4,
|
||||
// run page - rssi bar symbols
|
||||
l_RSSI = 4,
|
||||
// End
|
||||
l_MAX_LINES = 5,
|
||||
};
|
||||
|
||||
void calcLinePositions() {
|
||||
uint8_t yOff = 0;
|
||||
for (uint8_t i = 0; i < 4; i++) {
|
||||
setFont(i);
|
||||
yOff += (mDisplay->getMaxCharHeight());
|
||||
uint8_t i = 0;
|
||||
uint8_t asc, dsc;
|
||||
|
||||
do {
|
||||
setLineFont(i);
|
||||
asc = mDisplay->getAscent();
|
||||
yOff += asc;
|
||||
mLineYOffsets[i] = yOff;
|
||||
}
|
||||
dsc = mDisplay->getDescent();
|
||||
yOff -= dsc;
|
||||
if (l_Time==i) // prevent time and status line to touch
|
||||
yOff+=1; // -> one pixels space
|
||||
i++;
|
||||
} while(l_MAX_LINES>i);
|
||||
}
|
||||
|
||||
inline void setFont(uint8_t line) {
|
||||
switch (line) {
|
||||
case 0:
|
||||
inline void setLineFont(uint8_t line) {
|
||||
if ((line == l_TotalPower) ||
|
||||
(line == l_Ahoy))
|
||||
mDisplay->setFont(u8g2_font_ncenB14_tr);
|
||||
break;
|
||||
case 3:
|
||||
mDisplay->setFont(u8g2_font_5x8_symbols_ahoy);
|
||||
break;
|
||||
default:
|
||||
else if ((line == l_YieldDay) ||
|
||||
(line == l_YieldTotal))
|
||||
// mDisplay->setFont(u8g2_font_5x8_symbols_ahoy);
|
||||
mDisplay->setFont(u8g2_font_ncenB10_tr);
|
||||
break;
|
||||
else
|
||||
mDisplay->setFont(u8g2_font_ncenB08_tr);
|
||||
}
|
||||
}
|
||||
void printText(const char *text, uint8_t line, uint8_t dispX = 5) {
|
||||
setFont(line);
|
||||
|
||||
dispX += (mEnScreenSaver) ? (mExtra % 7) : 0;
|
||||
void printText(const char *text, uint8_t line, uint8_t col=0) {
|
||||
uint8_t dispX;
|
||||
|
||||
setLineFont(line);
|
||||
if (0xff == col)
|
||||
dispX = (mDispWidth - mDisplay->getStrWidth(text)) / 2; // center text
|
||||
else
|
||||
dispX = col;
|
||||
mDisplay->drawStr(dispX, mLineYOffsets[line], text);
|
||||
}
|
||||
};
|
||||
|
|
|
@ -47,18 +47,22 @@ class DisplayMono84X48 : public DisplayMono {
|
|||
}
|
||||
|
||||
void disp(void) {
|
||||
// Test
|
||||
mDisplay->clearBuffer();
|
||||
|
||||
// Layout-Test
|
||||
/*
|
||||
mDisplayData->nrSleeping = 10;
|
||||
mDisplayData->nrProducing = 10;
|
||||
mDisplayData->nrSleeping = 0;
|
||||
mDisplayData->nrProducing = 1;
|
||||
mDisplayData->totalPower = 12345.67;
|
||||
mDisplayData->totalYieldDay = 12345.67;
|
||||
mDisplayData->totalYieldTotal = 1234;
|
||||
mDisplayData->utcTs += 1000000;
|
||||
mDisplay->drawPixel(0, 0);
|
||||
mDisplay->drawPixel(mDispWidth-1, 0);
|
||||
mDisplay->drawPixel(0, mDispHeight-1);
|
||||
mDisplay->drawPixel(mDispWidth-1, mDispHeight-1);
|
||||
*/
|
||||
|
||||
mDisplay->clearBuffer();
|
||||
|
||||
// print total power
|
||||
if (mDisplayData->nrProducing > 0) {
|
||||
mTimeout = DISP_DEFAULT_TIMEOUT;
|
||||
|
@ -91,14 +95,15 @@ class DisplayMono84X48 : public DisplayMono {
|
|||
}
|
||||
// print status of inverters
|
||||
else {
|
||||
if (0 == mDisplayData->nrSleeping)
|
||||
if (0 == mDisplayData->nrSleeping + mDisplayData->nrProducing)
|
||||
snprintf(mFmtText, DISP_FMT_TEXT_LEN, "no inverter");
|
||||
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);
|
||||
printText(mFmtText, l_Status, 0xff);
|
||||
}
|
||||
|
||||
// print yields
|
||||
|
|
|
@ -175,8 +175,16 @@ STARTCHAR 074
|
|||
ENCODING 74
|
||||
SWIDTH 648 0
|
||||
DWIDTH 9 0
|
||||
BBX 0 0 0 0
|
||||
BBX 8 8 0 0
|
||||
BITMAP
|
||||
F9
|
||||
04
|
||||
F2
|
||||
09
|
||||
E5
|
||||
15
|
||||
D5
|
||||
D5
|
||||
ENDCHAR
|
||||
STARTCHAR 075
|
||||
ENCODING 75
|
||||
|
|
|
@ -4,11 +4,11 @@
|
|||
Glyphs: 11/11
|
||||
BBX Build Mode: 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"
|
||||
const uint8_t u8g2_font_ncenB10_symbols10_ahoy[220] 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\303A\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";
|
||||
"\10J\22\210\232\61Hi\64Di\64DI\226$KeiK\5\0\232\1\0\0\0";
|
||||
|
|
Binary file not shown.
Loading…
Add table
Add a link
Reference in a new issue