Browse Source

add fonts with symbols to ahoy project and add WLAN RSSI bar to 84x48

pull/1136/head
Wusaweki 1 year ago
parent
commit
bf0f1181c6
  1. 22
      README.md
  2. BIN
      pics/PXL_20230824_204200660.jpg
  3. BIN
      pics/PXL_20230901_061927908.jpg
  4. 20
      src/plugins/Display/Display.h
  5. 68
      src/plugins/Display/Display_Mono.h
  6. 10
      src/plugins/Display/Display_Mono_128X32.h
  7. 6
      src/plugins/Display/Display_Mono_128X64.h
  8. 8
      src/plugins/Display/Display_Mono_64X48.h
  9. 110
      src/plugins/Display/Display_Mono_84X48.h
  10. 22
      src/plugins/Display/Display_data.h
  11. BIN
      tools/fonts/Fony/Fony.exe
  12. 117
      tools/fonts/Fony/bugreport.txt
  13. 187
      tools/fonts/Fony/changes.txt
  14. BIN
      tools/fonts/bdfconv/bdfconv_2_22.exe
  15. 6
      tools/fonts/fontconv.bat
  16. 11
      tools/fonts/u8g2 font-sources.txt
  17. 1328
      tools/fonts/u8g2_font_5x8_symbols_ahoy.bdf
  18. 40
      tools/fonts/u8g2_font_5x8_symbols_ahoy.c_
  19. BIN
      tools/fonts/u8g2_font_5x8_symbols_ahoy.fon
  20. 166
      tools/fonts/u8g2_font_ncenB08_symbols8_ahoy.bdf
  21. 13
      tools/fonts/u8g2_font_ncenB08_symbols8_ahoy.c_
  22. BIN
      tools/fonts/u8g2_font_ncenB08_symbols8_ahoy.fon
  23. 188
      tools/fonts/u8g2_font_ncenB10_symbols10_ahoy.bdf
  24. 14
      tools/fonts/u8g2_font_ncenB10_symbols10_ahoy.c_
  25. BIN
      tools/fonts/u8g2_font_ncenB10_symbols10_ahoy.fon
  26. 16
      tools/fonts/used_fonts.txt

22
README.md

@ -22,6 +22,28 @@ This work is licensed under a
This repository offers hardware and software solutions for communicating with Hoymiles inverters via radio. With our system, you can easily obtain real-time values such as power, current, and daily energy. Additionally, you can set parameters like the power limit of your inverter to achieve zero export. You can access these functionalities through our user-friendly web interface, MQTT, or JSON. Whether you're monitoring your solar panel system's performance or fine-tuning its settings, our solutions make it easy to achieve your goals. This repository offers hardware and software solutions for communicating with Hoymiles inverters via radio. With our system, you can easily obtain real-time values such as power, current, and daily energy. Additionally, you can set parameters like the power limit of your inverter to achieve zero export. You can access these functionalities through our user-friendly web interface, MQTT, or JSON. Whether you're monitoring your solar panel system's performance or fine-tuning its settings, our solutions make it easy to achieve your goals.
This fork aims to improve the display layouts of several low-res displays, starting with the Nokia5110.
Current status of progress:
- improved layout with additional fixed headline for day of week, date and time, and centered text (already merged in lumapu >=0.7.34)
- improved 5x8 pixel font (some glyphes like dot and zero were deformed) and enhanced by ahoy specific symbols
- added sun and moon symbols with values that show number of producing and sleeping inverters (working)
- added calender and sigma symbols for YieldDay and YieldTotal
- added symbol for WiFi and MQTT that indicates WiFi and MQTT connection status (working)
- added RSSI bar for WiFi (working)
- added symbol für NRF24 that indicates if radio board is connected (working)
- added RSSI bar for NRF24 (basically working but currently only fed by inverter status due to missing RSSI value of NRF24. This should be improved in the future by using transition package heuristics)
![alt text](https://github.com/You69Man/ahoy/blob/feature/fancy_nokia/pics/PXL_20230824_204200660.jpg?raw=true)
There is also already a working implementation for OLED 128x64, with a bit of a higher font and symbol resolution.
The reason why this is not published at the moment is that OLEDs tend to quickly burn-in. Moving the screen content is no option for this layout because the layout is very well optimized and so pixels would quickly move off-screen. The only option would be to limit the on-time of the display by a means to activate it, e.g. a button or a sensor. This however would require a free GPIO pin, which are already rare on EPS8266... Other Ideas welcome!
![alt text](https://github.com/You69Man/ahoy/blob/feature/fancy_nokia/pics/PXL_20230901_061927908.jpg?raw=true)
Table of approaches: Table of approaches:
| Board | MI | HM | HMS/HMT | comment | HowTo start | | Board | MI | HM | HMS/HMT | comment | HowTo start |

BIN
pics/PXL_20230824_204200660.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

BIN
pics/PXL_20230901_061927908.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

20
src/plugins/Display/Display.h

@ -66,7 +66,7 @@ class Display {
if (mMono != NULL) if (mMono != NULL)
mMono->loop(mCfg->contrast); mMono->loop(mCfg->contrast);
if (mNewPayload || (((++mLoopCnt) % 30) == 0)) { if (mNewPayload || (((++mLoopCnt) % 10) == 0)) {
mNewPayload = false; mNewPayload = false;
mLoopCnt = 0; mLoopCnt = 0;
DataScreen(); DataScreen();
@ -85,7 +85,8 @@ class Display {
float totalYieldDay = 0; float totalYieldDay = 0;
float totalYieldTotal = 0; float totalYieldTotal = 0;
uint8_t isprod = 0; uint8_t nrprod = 0;
uint8_t nrsleep = 0;
Inverter<> *iv; Inverter<> *iv;
record_t<> *rec; record_t<> *rec;
@ -96,7 +97,9 @@ class Display {
continue; continue;
if (iv->isProducing()) if (iv->isProducing())
isprod++; nrprod++;
else
nrsleep++;
totalPower += iv->getChannelFieldValue(CH0, FLD_PAC, rec); totalPower += iv->getChannelFieldValue(CH0, FLD_PAC, rec);
totalYieldDay += iv->getChannelFieldValue(CH0, FLD_YD, rec); totalYieldDay += iv->getChannelFieldValue(CH0, FLD_YD, rec);
@ -104,13 +107,16 @@ class Display {
} }
// prepare display data // prepare display data
mDisplayData.isProducing = isprod; mDisplayData.nrProducing = nrprod;
mDisplayData.nrSleeping = nrsleep;
mDisplayData.totalPower = totalPower; mDisplayData.totalPower = totalPower;
mDisplayData.totalYieldDay = totalYieldDay; mDisplayData.totalYieldDay = totalYieldDay;
mDisplayData.totalYieldTotal = totalYieldTotal; mDisplayData.totalYieldTotal = totalYieldTotal;
mDisplayData.RadioSymbol = mHmRadio->isChipConnected(); 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(); mDisplayData.ipAddress = WiFi.localIP();
time_t utc= mApp->getTimestamp(); time_t utc= mApp->getTimestamp();
if (year(utc) > 2020) if (year(utc) > 2020)
@ -123,7 +129,7 @@ class Display {
} }
#if defined(ESP32) #if defined(ESP32)
else if (mCfg->type == 10) { else if (mCfg->type == 10) {
mEpaper.loop(totalPower, totalYieldDay, totalYieldTotal, isprod); mEpaper.loop(totalPower, totalYieldDay, totalYieldTotal, nrprod);
mRefreshCycle++; mRefreshCycle++;
} }

68
src/plugins/Display/Display_Mono.h

@ -60,4 +60,70 @@ class DisplayMono {
mDispWidth = mDisplay->getDisplayWidth(); mDispWidth = mDisplay->getDisplayWidth();
mDispHeight = mDisplay->getDisplayHeight(); 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";

10
src/plugins/Display/Display_Mono_128X32.h

@ -52,7 +52,7 @@ class DisplayMono128X32 : public DisplayMono {
if (3 != mType) if (3 != mType)
mDisplay->setContrast(mLuminance); mDisplay->setContrast(mLuminance);
if ((mDisplayData->totalPower > 0) && (mDisplayData->isProducing > 0)) { if ((mDisplayData->totalPower > 0) && (mDisplayData->nrProducing > 0)) {
mTimeout = DISP_DEFAULT_TIMEOUT; mTimeout = DISP_DEFAULT_TIMEOUT;
mDisplay->setPowerSave(false); mDisplay->setPowerSave(false);
if (mDisplayData->totalPower > 999) if (mDisplayData->totalPower > 999)
@ -78,7 +78,7 @@ class DisplayMono128X32 : public DisplayMono {
if (!(mExtra % 10) && (ip)) if (!(mExtra % 10) && (ip))
printText(ip.toString().c_str(), 3); printText(ip.toString().c_str(), 3);
else if (!(mExtra % 5)) { 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); printText(mFmtText, 3);
} else if (0 != mDisplayData->utcTs) } else if (0 != mDisplayData->utcTs)
printText(ah::getTimeStr(gTimezone.toLocal(mDisplayData->utcTs)).c_str(), 3); printText(ah::getTimeStr(gTimezone.toLocal(mDisplayData->utcTs)).c_str(), 3);
@ -106,13 +106,13 @@ class DisplayMono128X32 : public DisplayMono {
inline void setFont(uint8_t line) { inline void setFont(uint8_t line) {
switch (line) { switch (line) {
case 0: case 0:
mDisplay->setFont(u8g2_font_9x15_tf); mDisplay->setFont(u8g2_font_9x15_tr);
break; break;
case 3: case 3:
mDisplay->setFont(u8g2_font_tom_thumb_4x6_tf); mDisplay->setFont(u8g2_font_tom_thumb_4x6_tr);
break; break;
default: default:
mDisplay->setFont(u8g2_font_tom_thumb_4x6_tf); mDisplay->setFont(u8g2_font_tom_thumb_4x6_tr);
break; break;
} }
} }

6
src/plugins/Display/Display_Mono_128X64.h

@ -61,7 +61,7 @@ class DisplayMono128X64 : public DisplayMono {
// set Contrast of the Display to raise the lifetime // set Contrast of the Display to raise the lifetime
mDisplay->setContrast(mLuminance); mDisplay->setContrast(mLuminance);
if ((mDisplayData->totalPower > 0) && (mDisplayData->isProducing > 0)) { if ((mDisplayData->totalPower > 0) && (mDisplayData->nrProducing > 0)) {
mTimeout = DISP_DEFAULT_TIMEOUT; mTimeout = DISP_DEFAULT_TIMEOUT;
mDisplay->setPowerSave(false); mDisplay->setPowerSave(false);
@ -88,7 +88,7 @@ class DisplayMono128X64 : public DisplayMono {
if (!(mExtra % 10) && (ip)) if (!(mExtra % 10) && (ip))
printText(ip.toString().c_str(), 3); printText(ip.toString().c_str(), 3);
else if (!(mExtra % 5)) { 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); printText(mFmtText, 3);
} else if (0 != mDisplayData->utcTs) } else if (0 != mDisplayData->utcTs)
printText(ah::getDateTimeStr(gTimezone.toLocal(mDisplayData->utcTs)).c_str(), 3); printText(ah::getDateTimeStr(gTimezone.toLocal(mDisplayData->utcTs)).c_str(), 3);
@ -115,7 +115,7 @@ class DisplayMono128X64 : public DisplayMono {
mDisplay->setFont(u8g2_font_ncenB14_tr); mDisplay->setFont(u8g2_font_ncenB14_tr);
break; break;
case 3: case 3:
mDisplay->setFont(u8g2_font_5x8_tr); mDisplay->setFont(u8g2_font_5x8_symbols_ahoy);
break; break;
default: default:
mDisplay->setFont(u8g2_font_ncenB10_tr); mDisplay->setFont(u8g2_font_ncenB10_tr);

8
src/plugins/Display/Display_Mono_64X48.h

@ -52,7 +52,7 @@ class DisplayMono64X48 : public DisplayMono {
// set Contrast of the Display to raise the lifetime // set Contrast of the Display to raise the lifetime
mDisplay->setContrast(mLuminance); mDisplay->setContrast(mLuminance);
if ((mDisplayData->totalPower > 0) && (mDisplayData->isProducing > 0)) { if ((mDisplayData->totalPower > 0) && (mDisplayData->nrProducing > 0)) {
mTimeout = DISP_DEFAULT_TIMEOUT; mTimeout = DISP_DEFAULT_TIMEOUT;
mDisplay->setPowerSave(false); mDisplay->setPowerSave(false);
@ -79,7 +79,7 @@ class DisplayMono64X48 : public DisplayMono {
if (!(mExtra % 10) && (ip)) if (!(mExtra % 10) && (ip))
printText(ip.toString().c_str(), 3); printText(ip.toString().c_str(), 3);
else if (!(mExtra % 5)) { 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); printText(mFmtText, 3);
} else if (0 != mDisplayData->utcTs) } else if (0 != mDisplayData->utcTs)
printText(ah::getTimeStr(gTimezone.toLocal(mDisplayData->utcTs)).c_str(), 3); printText(ah::getTimeStr(gTimezone.toLocal(mDisplayData->utcTs)).c_str(), 3);
@ -102,11 +102,11 @@ class DisplayMono64X48 : public DisplayMono {
inline void setFont(uint8_t line) { inline void setFont(uint8_t line) {
switch (line) { switch (line) {
case 0: case 0:
mDisplay->setFont(u8g2_font_fur11_tf); mDisplay->setFont(u8g2_font_fur11_tr);
break; break;
case 1: case 1:
case 2: case 2:
mDisplay->setFont(u8g2_font_6x10_tf); mDisplay->setFont(u8g2_font_6x10_tr);
break; break;
case 3: case 3:
mDisplay->setFont(u8g2_font_4x6_tr); mDisplay->setFont(u8g2_font_4x6_tr);

110
src/plugins/Display/Display_Mono_84X48.h

@ -5,6 +5,7 @@
#pragma once #pragma once
#include "Display_Mono.h" #include "Display_Mono.h"
#include "../../utils/dbg.h"
class DisplayMono84X48 : public DisplayMono { class DisplayMono84X48 : public DisplayMono {
public: public:
@ -27,9 +28,9 @@ class DisplayMono84X48 : public DisplayMono {
u8g2_cb_t *rot = (u8g2_cb_t *)((rotation != 0x00) ? U8G2_R2 : U8G2_R0); 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); monoInit(new U8G2_PCD8544_84X48_F_4W_SW_SPI(rot, clock, data, cs, dc, reset), type, displayData);
calcLinePositions(); calcLinePositions();
printText("Ahoy!", l_Ahoy); printText("Ahoy!", l_Ahoy, 0xff);
printText("ahoydtu.de", l_Website); printText("ahoydtu.de", l_Website, 0xff);
printText(mDisplayData->version, l_Version); printText(mDisplayData->version, l_Version, 0xff);
mDisplay->sendBuffer(); mDisplay->sendBuffer();
} }
@ -46,43 +47,87 @@ class DisplayMono84X48 : public DisplayMono {
} }
void disp(void) { void disp(void) {
mDisplay->clearBuffer(); // Test
/*
mDisplayData->nrSleeping = 10;
mDisplayData->nrProducing = 10;
mDisplayData->totalPower = 12345.67;
mDisplayData->totalYieldDay = 12345.67;
mDisplayData->totalYieldTotal = 1234;
mDisplayData->utcTs += 1000000;
*/
// set Contrast of the Display to raise the lifetime mDisplay->clearBuffer();
mDisplay->setContrast(mLuminance);
if ((mDisplayData->totalPower > 0) && (mDisplayData->isProducing > 0)) { // print total power
if (mDisplayData->nrProducing > 0) {
mTimeout = DISP_DEFAULT_TIMEOUT; mTimeout = DISP_DEFAULT_TIMEOUT;
mDisplay->setPowerSave(false); 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)); snprintf(mFmtText, DISP_FMT_TEXT_LEN, "%.2f kW", (mDisplayData->totalPower / 1000));
else 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 { } else {
printText("offline", l_TotalPower); printText("offline", l_TotalPower, 0xff);
// check if it's time to enter power saving mode // check if it's time to enter power saving mode
if (mTimeout == 0) if (mTimeout == 0)
mDisplay->setPowerSave(mEnPowerSave); mDisplay->setPowerSave(mEnPowerSave);
} }
// print Date and time
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);
if (0 != mDisplayData->utcTs) 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()); 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 else
snprintf(mFmtText, DISP_FMT_TEXT_LEN, "Inv.On: %d", mDisplayData->isProducing); snprintf(mFmtText, DISP_FMT_TEXT_LEN, "%c", mDisplayData->WifiSymbol?'\x81':'\x85'); // Wifi connected
printText(mFmtText, l_Status); printText(mFmtText, l_RSSI, mDispWidth - 6);
mDisplay->sendBuffer(); mDisplay->sendBuffer();
@ -90,7 +135,6 @@ class DisplayMono84X48 : public DisplayMono {
} }
private: private:
uint16_t mDispWidth;
enum _dispLine { enum _dispLine {
// start page // start page
l_Website = 0, l_Website = 0,
@ -102,6 +146,8 @@ class DisplayMono84X48 : public DisplayMono {
l_TotalPower = 2, l_TotalPower = 2,
l_YieldDay = 3, l_YieldDay = 3,
l_YieldTotal = 4, l_YieldTotal = 4,
// run page - rssi bar symbols
l_RSSI = 4,
// End // End
l_MAX_LINES = 5, l_MAX_LINES = 5,
}; };
@ -112,7 +158,7 @@ class DisplayMono84X48 : public DisplayMono {
uint8_t asc, dsc; uint8_t asc, dsc;
do { do {
setFont(i); setLineFont(i);
asc = mDisplay->getAscent(); asc = mDisplay->getAscent();
yOff += asc; yOff += asc;
mLineYOffsets[i] = yOff; mLineYOffsets[i] = yOff;
@ -124,19 +170,23 @@ class DisplayMono84X48 : public DisplayMono {
} while(l_MAX_LINES>i); } while(l_MAX_LINES>i);
} }
inline void setFont(uint8_t line) { inline void setLineFont(uint8_t line) {
if ((line == l_TotalPower) || (line == l_Ahoy)) if ((line == l_TotalPower) || (line == l_Ahoy))
mDisplay->setFont(u8g2_font_logisoso16_tr); mDisplay->setFont(u8g2_font_logisoso16_tr);
else 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; uint8_t dispX;
setFont(line);
dispX = (mDispWidth - mDisplay->getStrWidth(text)) / 2; // center text setLineFont(line);
dispX += (mEnScreenSaver) ? (mExtra % 7) : 0; if (0xff == col)
dispX = (mDispWidth - mDisplay->getStrWidth(text)) / 2; // center text
else
dispX = col;
mDisplay->drawStr(dispX, mLineYOffsets[line], text); mDisplay->drawStr(dispX, mLineYOffsets[line], text);
} }
}; };

22
src/plugins/Display/Display_data.h

@ -5,16 +5,18 @@
struct DisplayData { struct DisplayData {
const char *version=nullptr; const char *version=nullptr;
float totalPower=0.0f; float totalPower=0.0f; // indicate current power (W)
float totalYieldDay=0.0f; float totalYieldDay=0.0f; // indicate day yield (W)
float totalYieldTotal=0.0f; float totalYieldTotal=0.0f; // indicate total yield (W)
uint32_t utcTs=0; uint32_t utcTs=0; // indicate absolute timestamp (utc unix time). 0 = time is not synchonized
uint8_t isProducing=0; uint8_t nrProducing=0; // indicate number of producing inverters
int8_t wifiRSSI=SCHAR_MIN; uint8_t nrSleeping=0; // indicate number of sleeping inverters
bool showRadioSymbol = false; bool WifiSymbol = false; // indicate if WiFi is connected
bool WiFiSymbol = false; bool RadioSymbol = false; // indicate if radio module is connecting and working
bool RadioSymbol = false; bool MQTTSymbol = false; // indicate if MQTT is connected
IPAddress ipAddress; 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__*/ #endif /*__DISPLAY_DATA__*/

BIN
tools/fonts/Fony/Fony.exe

Binary file not shown.

117
tools/fonts/Fony/bugreport.txt

@ -0,0 +1,117 @@
date/time : 2023-08-16, 18:26:15, 482ms
computer name : ADAM
user name : Mandi
registered owner : Mandi
operating system : Windows NT New x64 build 9200
system language : German
system up time : 5 days 11 hours
program up time : 53 seconds
processors : 4x Intel(R) Core(TM) i5-6500 CPU @ 3.20GHz
physical memory : 2590/8076 MB (free/total)
free disk space : (C:) 8,68 GB
display mode : 1920x1080, 32 bit
process id : $2594
allocated memory : 89,69 MB
executable : Fony.exe
exec. date/time : 2013-07-26 14:53
version : 1.4.4.0
compiled with : Delphi 2010
madExcept version : 3.0l
Fony.exe.mad : $00027f1c, $5ec042fa, $52ce3375
callstack crc : $995e12b8, $c17583ff, $c17583ff
count : 3
exception number : 1
exception class : EStringListError
exception message : List index out of bounds (22851).
main thread ($47fc):
0048fd79 +01d Fony.exe segment%32 public%3422
00699a7c +190 Fony.exe segment%226 public%14304
004983d3 +00f Fony.exe segment%32 public%3750
00527ae5 +031 Fony.exe segment%66 public%6729
00528830 +050 Fony.exe segment%66 public%6787
00498297 +013 Fony.exe segment%32 public%3739
0056db61 +085 Fony.exe segment%83 public%8192
00580ea9 +015 Fony.exe segment%85 public%8649
0056da66 +0b2 Fony.exe segment%83 public%8190
00498a80 +014 Fony.exe segment%32 public%3772
771d5bfb +00b user32.dll DispatchMessageW
0053b85d +11d Fony.exe segment%67 public%7204
0053b8a2 +00a Fony.exe segment%67 public%7206
0053bbcd +0c9 Fony.exe segment%67 public%7211
006a9d16 +136 Fony.exe segment%349 public%14518
754100c7 +017 KERNEL32.DLL BaseThreadInitThunk
thread $15f8:
76288e83 +93 KERNELBASE.dll WaitForSingleObjectEx
76288c62 +92 KERNELBASE.dll GetOverlappedResult
754100c7 +17 KERNEL32.DLL BaseThreadInitThunk
thread $2fc0:
754100c7 +17 KERNEL32.DLL BaseThreadInitThunk
thread $3d8:
754100c7 +17 KERNEL32.DLL BaseThreadInitThunk
thread $49fc:
76292fed +fd KERNELBASE.dll WaitForMultipleObjectsEx
0045f435 +0d Fony.exe segment%23 public%2294
0045f49f +37 Fony.exe segment%23 public%2295
754100c7 +17 KERNEL32.DLL BaseThreadInitThunk
>> created by main thread ($47fc) at:
76670ef1 +00 combase.dll
thread $3628:
754100c7 +17 KERNEL32.DLL BaseThreadInitThunk
thread $2ad8:
754100c7 +17 KERNEL32.DLL BaseThreadInitThunk
thread $130c:
0045f435 +0d Fony.exe segment%23 public%2294
0045f49f +37 Fony.exe segment%23 public%2295
754100c7 +17 KERNEL32.DLL BaseThreadInitThunk
>> created by main thread ($47fc) at:
76670ef1 +00 combase.dll
thread $2ef8:
771dc517 +47 user32.dll MsgWaitForMultipleObjectsEx
0045f435 +0d Fony.exe segment%23 public%2294
0045f49f +37 Fony.exe segment%23 public%2295
754100c7 +17 KERNEL32.DLL BaseThreadInitThunk
>> created by thread $2fc0 at:
7647c623 +00 shcore.dll
thread $2888:
754100c7 +17 KERNEL32.DLL BaseThreadInitThunk
thread $342c:
754100c7 +17 KERNEL32.DLL BaseThreadInitThunk
thread $313c:
754100c7 +17 KERNEL32.DLL BaseThreadInitThunk
thread $2cb4:
754100c7 +17 KERNEL32.DLL BaseThreadInitThunk
thread $940:
754100c7 +17 KERNEL32.DLL BaseThreadInitThunk
thread $2824:
762b28cd +3d KERNELBASE.dll ConnectNamedPipe
754100c7 +17 KERNEL32.DLL BaseThreadInitThunk
thread $1f7c:
754100c7 +17 KERNEL32.DLL BaseThreadInitThunk
thread $f90:
754100c7 +17 KERNEL32.DLL BaseThreadInitThunk
thread $588:
76292fed +fd KERNELBASE.dll WaitForMultipleObjectsEx
0045f435 +0d Fony.exe segment%23 public%2294
0045f49f +37 Fony.exe segment%23 public%2295
754100c7 +17 KERNEL32.DLL BaseThreadInitThunk
>> created by thread $130c at:
76670ef1 +00 combase.dll

187
tools/fonts/Fony/changes.txt

@ -0,0 +1,187 @@
Latest changes:
-----------------------------------------------------------------------------
1.4.7 (2013-07-26)
* Fixed pasting glyph images from clipboard (glyphs were stretched).
* Added setting to change the default contents of the font preview box.
* Added button to the font preview box to revert to the default contents.
* The text contents of the font preview box is now remembered.
-----------------------------------------------------------------------------
1.4.6 (2012-12-02)
* Fixed Amiga bitmap font import.
-----------------------------------------------------------------------------
1.4.5 (2012-01-31)
* TTF Import now sports a progress bar, improved baseline detection and
improved import speed.
-----------------------------------------------------------------------------
1.4.4 (2012-01-27)
* Fixed BDF export, which was broken due to compiler upgrade.
* Updated version resource.
-----------------------------------------------------------------------------
1.4.3 (2011-11-18)
* Fixed a bug introduced in 1.4.1.0a where font file handling did not work
correctly in some locales, rendering Fony unusable.
* Corrected tabbing order in confirmation dialogs.
-----------------------------------------------------------------------------
1.4.2 (2011-09-27)
* Font Properties shows the point size of the font.
* Got rid of "undo storage not initialized" errors.
* Updated Russian and Finnish translations. (Thanks aleks)
* GUI maintenance, fixed web URLs to point to the new site at hukka.ncn.fi.
-----------------------------------------------------------------------------
1.4.1.0b (2010-04-13)
* Fixed the drawing tools broken in previous release.
* Small UI fixes.
* Quick fix for language translations.
WARNINGS:
* Undo/redo might have some bugs left.
* There may be some unknown bugs introduced due to compiler upgrade.
-----------------------------------------------------------------------------
1.4.1.0a (2010-04-11)
* Multi-level undo/redo.
* Fixed binary data export.
* Small performance/overall improvements.
* Internal changes.
* Upgraded to Delphi 2010.
-----------------------------------------------------------------------------
test 2009-11-05
* Raw binary data export.
* Fixed Bitmap Font Writer import, which had mysteriously ceased working
at some point, plus added ability to import 'invalid' BFW fonts.
* Possibly some tweaks and fixes, I'm not sure.
-----------------------------------------------------------------------------
1.4.0.2 (2009-05-29)
BUG FIXES:
* Pasting a small glyph into a larger one works properly now.
* Fony won't modify glyph sizes when pasting if the font is monospaced now.
* "Reset glyph" didn't reset the value in the glyph width edit box.
* Fixed wrapping in font preview box.
-----------------------------------------------------------------------------
1.4.0.1 (2009-05-17)
IMPROVEMENTS:
* Back to a more sensible version scheme.
* Preview window settings are now saved.
* Japanese and Russian translations updated.
BUG FIXES:
* Arrow keys in font preview memo would also browse glyphs.
-----------------------------------------------------------------------------
1.4.0 beta (2009-05-07)
IMPROVEMENTS:
* User interface revamp - now most things are dockable toolbars.
(Customizable, too - see View->Customize Toolbars.)
* Glyph selector has a context menu now.
BUG FIXES:
* "Open Installed Font" didn't display FNT files.
* Some Unicode strings were not being displayed properly in status bar.
* Saving to Windows' Fonts folder didn't install the font properly.
* "View->Square Pixels" setting wasn't saved.
* "Left mouse toggles pixel" was broken with previous update.
-----------------------------------------------------------------------------
1.4.0 alpha:
2009-04-26:
* Finally found and fixed the tiny (and stupid) but fatal bug which caused
Fony to calculate invalid offsets for the FON header, causing havoc with
large font files.
* BDF Export dialog with the option to export glyphs without trimming off
padding from glyph edges, to get around faulty bounding box calculations
of some programs.
* BDF Import asks whether to preserve or crop glyphs with invalid width.
* Exporting a bitmap in Bitmap Font Writer format ignored range settings.
* Importing a TTF font made buttons in confirmation dialogs use said font.
* "Install font" should now install font permanently (on XP and below).
* Glyph ranges can now also be selected with the middle mouse button.
* Made the brush alpha-blended for a nicer look.
* Small improvements, nicer easter egg(?)
2009-02-13:
* Made it possible to select a range of glyphs by depressing Shift while
clicking on the glyph list bar. Effects such as Invert, Mirror, Boldify
now apply to the range of glyphs selected, if applicable. If no range is
selected, they apply to either the current glyph or the whole font,
depending on whether Shift is pressed.
Works with copy/paste too, but not much error checking yet.
2009-01-13:
* test/Fony.exe: Opening the Properties dialog for a font with multiple
VarFileInfo (or any other) blocks no longer results in a crash.
2009-01-05:
* test/Fony.exe: Improvements to BDF importing
2008-10-22:
* Line tool now too supports larger than 1 pixel brushes.
* Custom mouse cursors for the editor window. Hope they don't suck too much?
* "Boldify font" could set font width wrong on monospaced fonts.
* There was no way to convert a monospaced font to a variable pitch one
without accepting the "Crop Width" dialog.
* Fixed a graphical glitch with the brush after resizing glyph/font.
* Added links to Fony website and forum on the Help menu.
2008-10-18:
* Finally implemented brushes bigger than 1px! (Not for the Line tool, yet.)
* Brush follows mouse. (Will be made optional later.)
* Custom bitmap importer: you can now import by either text color or
background color (anything in chosen color is text vs. anything in
chosen color is background).
* Fixed behaviour of Escape button in question/confirmation dialogs (it
triggered Yes/OK instead of Cancel).
2008-10-17:
* "Boldify font" feature (remember to set font properties after using it)
* Further improved custom bitmap importer: pan the image by holding down
the middle mouse button; right-click to pick text color; displays glyph
bounds; made the dialog resizable and non-modal so you can modify the
glyphs while working; selection height was off by one pixel; zooming
centers in on selection; bounds checking.
2008-10-16:
* Custom bitmap import; grab glyphs from any image with some text written in
a fixed-width font. (Create or load a fixed-width font before importing
and set its size to the size of the font in the image. Should be simple to
understand. Threshold is for use when all pixels of the text are not the
same exact color; good for JPEGs and such. Arrow keys fine tune position.)
2008-05-27:
* View menu is now functional.
* Fixed tab order in some dialogs.
2008-05-23:
* Oops, changes to Module name and Description strings were ignored.
-----------------------------------------------------------------------------
Changes since 1.3.6: (2008-05-22)
ADDITIONS:
* Preliminary support for Version resources in FON.
* Install/uninstall font.
* Proper font cropping (Edit -> Crop Width).
* Drag'n'drop support.
* "Use old method to save Win3.x FNT files" for possibly(?) better
compatibility. (Win2.x format is always saved using this method.)
IMPROVEMENTS:
* Hugely improved FNT/FON output; Windows 9x and Softy shouldn't choke on
Fony-generated fonts anymore.
* Moved glyph selector from editor window to main window.
* Uses proper dialog font on Windows 9x.
* Other user interface and cosmetics enhancements.
BUG FIXES:
* Only first font resource was saved in FON.
* After a "Save As" to FNT, subsequent saves still saved as FON.
* Font charset combobox always defaulted to "Other:".
--------------------------------------------------------------------------EOF

BIN
tools/fonts/bdfconv/bdfconv_2_22.exe

Binary file not shown.

6
tools/fonts/fontconv.bat

@ -0,0 +1,6 @@
.\bdfconv\bdfconv_2_22.exe -v -f 1 -m "32-137" u8g2_font_5x8_symbols_ahoy.bdf -o u8g2_font_5x8_symbols_ahoy.c_ -n u8g2_font_5x8_symbols_ahoy
.\bdfconv\bdfconv_2_22.exe -v -f 1 -m "65-75" u8g2_font_ncenB10_symbols10_ahoy.bdf -o u8g2_font_ncenB10_symbols10_ahoy.c_ -n u8g2_font_ncenB10_symbols10_ahoy
.\bdfconv\bdfconv_2_22.exe -v -f 1 -m "65-75" u8g2_font_ncenB08_symbols8_ahoy.bdf -o u8g2_font_ncenB08_symbols8_ahoy.c_ -n u8g2_font_ncenB08_symbols8_ahoy
pause

11
tools/fonts/u8g2 font-sources.txt

@ -0,0 +1,11 @@
Useful sources to edit u8g2 fonts:
bdf font files for u8g2 font library:
https://github.com/olikraus/u8g2/tree/master/tools/font/bdf
Tool to edit bdf files:
https://github.com/olikraus/u8g2/tree/master/tools/font/fony
Tool to convert bdf font files to u8g2 source code:
https://github.com/olikraus/u8g2/tree/master/tools/font/bdfconv

1328
tools/fonts/u8g2_font_5x8_symbols_ahoy.bdf

File diff suppressed because it is too large

40
tools/fonts/u8g2_font_5x8_symbols_ahoy.c_

@ -0,0 +1,40 @@
/*
Fontname: u8g2_font_5x8_symbols_ahoy
Copyright: Public domain font. Share and enjoy.
Glyphs: 106/106
BBX Build Mode: 0
*/
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";

BIN
tools/fonts/u8g2_font_5x8_symbols_ahoy.fon

Binary file not shown.

166
tools/fonts/u8g2_font_ncenB08_symbols8_ahoy.bdf

@ -0,0 +1,166 @@
STARTFONT 2.1
COMMENT Exported by Fony v1.4.7
FONT u8g2_font_ncenB08_symbols8_ahoy
SIZE 12 100 100
FONTBOUNDINGBOX 9 11 0 -2
STARTPROPERTIES 6
COPYRIGHT ""
RESOLUTION_X 100
RESOLUTION_Y 100
FONT_ASCENT 10
FONT_DESCENT 2
DEFAULT_CHAR 0
ENDPROPERTIES
CHARS 11
STARTCHAR 065
ENCODING 65
SWIDTH 576 0
DWIDTH 8 0
BBX 7 8 0 0
BITMAP
FE
92
D6
38
10
10
10
10
ENDCHAR
STARTCHAR 066
ENCODING 66
SWIDTH 648 0
DWIDTH 9 0
BBX 8 9 1 0
BITMAP
3C
42
99
24
42
18
24
00
18
ENDCHAR
STARTCHAR 067
ENCODING 67
SWIDTH 576 0
DWIDTH 8 0
BBX 8 8 0 0
BITMAP
18
24
24
42
42
42
42
81
ENDCHAR
STARTCHAR 068
ENCODING 68
SWIDTH 648 0
DWIDTH 9 0
BBX 8 8 0 0
BITMAP
FF
41
20
10
10
20
41
FF
ENDCHAR
STARTCHAR 069
ENCODING 69
SWIDTH 576 0
DWIDTH 8 0
BBX 7 8 0 0
BITMAP
FE
D6
FE
38
10
38
54
92
ENDCHAR
STARTCHAR 070
ENCODING 70
SWIDTH 648 0
DWIDTH 9 0
BBX 8 9 1 0
BITMAP
BD
42
BD
3C
5A
18
24
42
99
ENDCHAR
STARTCHAR 071
ENCODING 71
SWIDTH 648 0
DWIDTH 9 0
BBX 8 8 0 0
BITMAP
24
3C
E7
42
42
E7
3C
24
ENDCHAR
STARTCHAR 072
ENCODING 72
SWIDTH 576 0
DWIDTH 8 0
BBX 7 7 0 1
BITMAP
04
06
06
0E
1E
FC
78
ENDCHAR
STARTCHAR 073
ENCODING 73
SWIDTH 576 0
DWIDTH 8 0
BBX 7 9 0 0
BITMAP
44
FE
82
92
B2
92
92
82
FE
ENDCHAR
STARTCHAR 074
ENCODING 74
SWIDTH 504 0
DWIDTH 7 0
BBX 0 0 0 0
BITMAP
ENDCHAR
STARTCHAR 075
ENCODING 75
SWIDTH 648 0
DWIDTH 9 0
BBX 0 0 0 0
BITMAP
ENDCHAR
ENDFONT

13
tools/fonts/u8g2_font_ncenB08_symbols8_ahoy.c_

@ -0,0 +1,13 @@
/*
Fontname: u8g2_font_ncenB08_symbols8_ahoy
Copyright:
Glyphs: 11/11
BBX Build Mode: 0
*/
const uint8_t u8g2_font_ncenB08_symbols8_ahoy[173] U8G2_FONT_SECTION("u8g2_font_ncenB08_symbols8_ahoy") =
"\13\0\3\2\4\4\2\2\5\11\11\0\0\10\0\10\0\0\0\0\0\0\224A\14\207\212q\220\242%\221"
"\326\270\15B\20\230\233\65da\22Ima\250F\71\254\1C\20\210\212\247Fa\224\205Q\30\205Q"
"\230\304\1D\16\210\232qP\322(Gr \256\16\7E\15\207\212\361\222\14\247\65\335\222\246\2F\25"
"\230\233\221\14I\61I\206$\32\262D\11\325(\13\223H\12G\17\210\232U\34\242K\30\205\311t\10"
"\243\10H\14w\216\33\253\342\66\34\242!\2I\21\227\212\223%\303\240J\221\42I\221\24\251\303 J"
"\5\0z\1K\5\0\232\1\0\0\0";

BIN
tools/fonts/u8g2_font_ncenB08_symbols8_ahoy.fon

Binary file not shown.

188
tools/fonts/u8g2_font_ncenB10_symbols10_ahoy.bdf

@ -0,0 +1,188 @@
STARTFONT 2.1
COMMENT Exported by Fony v1.4.7
FONT u8g2_font_symbols10_ahoy
SIZE 16 100 100
FONTBOUNDINGBOX 12 15 0 -3
STARTPROPERTIES 6
COPYRIGHT ""
RESOLUTION_X 100
RESOLUTION_Y 100
FONT_ASCENT 13
FONT_DESCENT 3
DEFAULT_CHAR 0
ENDPROPERTIES
CHARS 11
STARTCHAR 065
ENCODING 65
SWIDTH 576 0
DWIDTH 8 0
BBX 7 11 0 0
BITMAP
FE
92
92
54
38
10
10
10
10
10
10
ENDCHAR
STARTCHAR 066
ENCODING 66
SWIDTH 648 0
DWIDTH 9 0
BBX 8 9 0 1
BITMAP
3C
42
99
24
42
18
24
00
18
ENDCHAR
STARTCHAR 067
ENCODING 67
SWIDTH 792 0
DWIDTH 11 0
BBX 10 11 0 0
BITMAP
0C00
1200
2100
2100
2100
2180
4080
4080
4080
4080
8040
ENDCHAR
STARTCHAR 068
ENCODING 68
SWIDTH 720 0
DWIDTH 10 0
BBX 9 11 0 0
BITMAP
FF80
6080
3000
1800
0C00
0C00
1800
3000
6000
C080
FF80
ENDCHAR
STARTCHAR 069
ENCODING 69
SWIDTH 576 0
DWIDTH 8 0
BBX 7 11 0 0
BITMAP
FE
D6
D6
7C
38
10
38
38
54
54
92
ENDCHAR
STARTCHAR 070
ENCODING 70
SWIDTH 648 0
DWIDTH 9 0
BBX 8 10 1 0
BITMAP
BD
42
BD
24
5A
18
24
24
5A
81
ENDCHAR
STARTCHAR 071
ENCODING 71
SWIDTH 864 0
DWIDTH 12 0
BBX 11 11 0 0
BITMAP
1100
1100
0E00
D160
2080
2080
2080
D160
0E00
1100
1100
ENDCHAR
STARTCHAR 072
ENCODING 72
SWIDTH 792 0
DWIDTH 11 0
BBX 10 11 0 0
BITMAP
0080
0080
00C0
00C0
01C0
01C0
03C0
0780
1F80
FF00
3C00
ENDCHAR
STARTCHAR 073
ENCODING 73
SWIDTH 720 0
DWIDTH 10 0
BBX 9 11 0 0
BITMAP
DD80
FF80
8080
8880
9880
8880
8880
8880
8880
8080
FF80
ENDCHAR
STARTCHAR 074
ENCODING 74
SWIDTH 648 0
DWIDTH 9 0
BBX 0 0 0 0
BITMAP
ENDCHAR
STARTCHAR 075
ENCODING 75
SWIDTH 648 0
DWIDTH 9 0
BBX 0 0 0 0
BITMAP
ENDCHAR
ENDFONT

14
tools/fonts/u8g2_font_ncenB10_symbols10_ahoy.c_

@ -0,0 +1,14 @@
/*
Fontname: u8g2_font_symbols10_ahoy
Copyright:
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"
"\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";

BIN
tools/fonts/u8g2_font_ncenB10_symbols10_ahoy.fon

Binary file not shown.

16
tools/fonts/used_fonts.txt

@ -0,0 +1,16 @@
Display_Mono_64x48:
u8g2_font_fur11_tr
u8g2_font_6x10_tf
u8g2_font_4x6_tr
Display_Mono_128x32:
u8g2_font_9x15_tr
u8g2_font_tom_thumb_4x6_tr
Display_Mono_84x48:
u8g2_font_5x8_symbols_ahoy
u8g2_font_logisoso16_tr
Display_Mono_128x64:
u8g2_font_ncenB08_symbols8_ahoy
u8g2_font_ncenB10_symbols10_ahoy
Loading…
Cancel
Save