diff --git a/src/app.cpp b/src/app.cpp index 53feeb48..8cefcb38 100644 --- a/src/app.cpp +++ b/src/app.cpp @@ -115,7 +115,7 @@ void app::setup() { // Plugins if (mConfig->plugin.display.type != 0) - mDisplay.setup(&mConfig->plugin.display, &mSys, &mTimestamp, mVersion); + mDisplay.setup(this, &mConfig->plugin.display, &mSys, &mNrfRadio, &mTimestamp); mPubSerial.setup(mConfig, &mSys, &mTimestamp); diff --git a/src/app.h b/src/app.h index 5a7831c1..e67a9580 100644 --- a/src/app.h +++ b/src/app.h @@ -55,7 +55,8 @@ typedef PubSerial PubSerialType; // PLUGINS #include "plugins/Display/Display.h" -typedef Display DisplayType; +#include "plugins/Display/Display_data.h" +typedef Display> DisplayType; class app : public IApp, public ah::Scheduler { public: @@ -362,6 +363,7 @@ class app : public IApp, public ah::Scheduler { // plugins DisplayType mDisplay; + DisplayData mDispData; }; #endif /*__APP_H__*/ diff --git a/src/hm/hmRadio.h b/src/hm/hmRadio.h index ee037adb..ace1c212 100644 --- a/src/hm/hmRadio.h +++ b/src/hm/hmRadio.h @@ -272,8 +272,8 @@ class HmRadio { isLastPackage = true; // response from dev control command } } - yield(); - } + yield(); + } return isLastPackage; } diff --git a/src/hm/miPayload.h b/src/hm/miPayload.h index ca2da50e..dd49d658 100644 --- a/src/hm/miPayload.h +++ b/src/hm/miPayload.h @@ -96,16 +96,16 @@ class MiPayload { } else { mStat->rxFail++; // got "fragments" (part of the required messages) // but no complete set of responses - if (mSerialDebug) { + if (mSerialDebug) { DBGPRINT(F("no complete Payload received! (retransmits: ")); - DBGPRINT(String(mPayload[iv->id].retransmits)); - DBGPRINTLN(F(")")); + DBGPRINT(String(mPayload[iv->id].retransmits)); + DBGPRINTLN(F(")")); + } } - } iv->setQueuedCmdFinished(); // command failed + } } } - } reset(iv->id); mPayload[iv->id].requested = true; diff --git a/src/plugins/Display/Display.h b/src/plugins/Display/Display.h index 36a7df46..58c2fa83 100644 --- a/src/plugins/Display/Display.h +++ b/src/plugins/Display/Display.h @@ -5,6 +5,7 @@ #include #include "../../hm/hmSystem.h" +#include "../../hm/hmRadio.h" #include "../../utils/helper.h" #include "Display_Mono.h" #include "Display_Mono_128X32.h" @@ -12,21 +13,25 @@ #include "Display_Mono_84X48.h" #include "Display_Mono_64X48.h" #include "Display_ePaper.h" +#include "Display_data.h" -template +template class Display { public: Display() { mMono = NULL; } - void setup(display_t *cfg, HMSYSTEM *sys, uint32_t *utcTs, const char *version) { + void setup(IApp *app, display_t *cfg, HMSYSTEM *sys, HMRADIO *radio, uint32_t *utcTs) { + mApp = app; + mHmRadio = radio; mCfg = cfg; mSys = sys; mUtcTs = utcTs; mNewPayload = false; mLoopCnt = 0; - mVersion = version; + + mDisplayData.version = app->getVersion(); // version never changes, so only set once switch (mCfg->type) { case 0: mMono = NULL; break; @@ -41,7 +46,7 @@ class Display { mMono = NULL; // ePaper does not use this mRefreshCycle = 0; mEpaper.config(mCfg->rot, mCfg->pwrSaveAtIvOffline); - mEpaper.init(mCfg->type, mCfg->disp_cs, mCfg->disp_dc, mCfg->disp_reset, mCfg->disp_busy, mCfg->disp_clk, mCfg->disp_data, mUtcTs, mVersion); + mEpaper.init(mCfg->type, mCfg->disp_cs, mCfg->disp_dc, mCfg->disp_reset, mCfg->disp_busy, mCfg->disp_clk, mCfg->disp_data, mUtcTs, mDisplayData.version); break; #endif @@ -49,7 +54,7 @@ class Display { } if(mMono) { mMono->config(mCfg->pwrSaveAtIvOffline, mCfg->pxShift, mCfg->contrast); - mMono->init(mCfg->type, mCfg->rot, mCfg->disp_cs, mCfg->disp_dc, 0xff, mCfg->disp_clk, mCfg->disp_data, mUtcTs, mVersion); + mMono->init(mCfg->type, mCfg->rot, mCfg->disp_cs, mCfg->disp_dc, 0xff, mCfg->disp_clk, mCfg->disp_data, &mDisplayData); } } @@ -75,8 +80,6 @@ class Display { void DataScreen() { if (mCfg->type == 0) return; - if (*mUtcTs == 0) - return; float totalPower = 0; float totalYieldDay = 0; @@ -100,8 +103,23 @@ class Display { totalYieldTotal += iv->getChannelFieldValue(CH0, FLD_YT, rec); } + // prepare display data + mDisplayData.isProducing = isprod; + 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.ipAddress = WiFi.localIP(); + time_t utc= mApp->getTimestamp(); + if (year(utc) > 2020) + mDisplayData.utcTs = utc; + else + mDisplayData.utcTs = 0; + if (mMono ) { - mMono->disp(totalPower, totalYieldDay, totalYieldTotal, isprod); + mMono->disp(); } #if defined(ESP32) else if (mCfg->type == 10) { @@ -117,12 +135,14 @@ class Display { } // private member variables + IApp *mApp; + DisplayData mDisplayData; bool mNewPayload; uint8_t mLoopCnt; uint32_t *mUtcTs; - const char *mVersion; display_t *mCfg; HMSYSTEM *mSys; + HMRADIO *mHmRadio; uint16_t mRefreshCycle; #if defined(ESP32) diff --git a/src/plugins/Display/Display_Mono.h b/src/plugins/Display/Display_Mono.h index 4739f83f..1dfcc5d2 100644 --- a/src/plugins/Display/Display_Mono.h +++ b/src/plugins/Display/Display_Mono.h @@ -9,6 +9,7 @@ #define DISP_FMT_TEXT_LEN 32 #define BOTTOM_MARGIN 5 +#include "defines.h" #ifdef ESP8266 #include @@ -16,25 +17,29 @@ #include #endif #include "../../utils/helper.h" +#include "Display_data.h" class DisplayMono { public: DisplayMono() {}; - virtual void init(uint8_t type, uint8_t rot, uint8_t cs, uint8_t dc, uint8_t reset, uint8_t clock, uint8_t data, uint32_t* utcTs, const char* version) = 0; - virtual void config(bool enPowerSafe, bool enScreenSaver, uint8_t lum) = 0; + virtual void init(uint8_t type, uint8_t rot, uint8_t cs, uint8_t dc, uint8_t reset, uint8_t clock, uint8_t data, DisplayData *displayData) = 0; + virtual void config(bool enPowerSave, bool enScreenSaver, uint8_t lum) = 0; virtual void loop(uint8_t lum) = 0; - virtual void disp(float totalPower, float totalYieldDay, float totalYieldTotal, uint8_t isprod) = 0; + virtual void disp(void) = 0; protected: U8G2* mDisplay; + DisplayData *mDisplayData; uint8_t mType; - bool mEnPowerSafe, mEnScreenSaver; + uint16_t mDispWidth; + uint16_t mDispHeight; + + bool mEnPowerSave, mEnScreenSaver; uint8_t mLuminance; uint8_t mLoopCnt; - uint32_t* mUtcTs; uint8_t mLineXOffsets[5] = {}; uint8_t mLineYOffsets[5] = {}; @@ -42,4 +47,17 @@ class DisplayMono { uint8_t mExtra; uint16_t mTimeout; - char mFmtText[DISP_FMT_TEXT_LEN];}; + char mFmtText[DISP_FMT_TEXT_LEN]; + + // Common initialization function to be called by subclasses + void monoInit(U8G2* display, uint8_t type, DisplayData *displayData) { + mDisplay = display; + mType = type; + mDisplayData = displayData; + mDisplay->begin(); + mDisplay->setContrast(mLuminance); + mDisplay->clearBuffer(); + mDispWidth = mDisplay->getDisplayWidth(); + mDispHeight = mDisplay->getDisplayHeight(); + } +}; \ No newline at end of file diff --git a/src/plugins/Display/Display_Mono_128X32.h b/src/plugins/Display/Display_Mono_128X32.h index 5a6d6c7e..f6577cc6 100644 --- a/src/plugins/Display/Display_Mono_128X32.h +++ b/src/plugins/Display/Display_Mono_128X32.h @@ -9,45 +9,32 @@ class DisplayMono128X32 : public DisplayMono { public: DisplayMono128X32() : DisplayMono() { - mEnPowerSafe = true; + mEnPowerSave = true; mEnScreenSaver = true; mLuminance = 60; mExtra = 0; mDispY = 0; mTimeout = DISP_DEFAULT_TIMEOUT; // interval at which to power save (milliseconds) - mUtcTs = NULL; - mType = 0; } - - void init(uint8_t type, uint8_t rotation, uint8_t cs, uint8_t dc, uint8_t reset, uint8_t clock, uint8_t data, uint32_t *utcTs, const char *version) { - - u8g2_cb_t *rot = (u8g2_cb_t *)((rotation != 0x00) ? U8G2_R2 : U8G2_R0); - mType = type; - mDisplay = new U8G2_SSD1306_128X32_UNIVISION_F_HW_I2C(rot, reset, clock, data); - - mUtcTs = utcTs; - - mDisplay->begin(); - - calcLinePositions(); - - mDisplay->clearBuffer(); - mDisplay->setContrast(mLuminance); - printText("AHOY!", 0); - printText("ahoydtu.de", 2); - printText(version, 3); - mDisplay->sendBuffer(); - } - - void config(bool enPowerSafe, bool enScreenSaver, uint8_t lum) { - mEnPowerSafe = enPowerSafe; + void config(bool enPowerSave, bool enScreenSaver, uint8_t lum) { + mEnPowerSave = enPowerSave; mEnScreenSaver = enScreenSaver; mLuminance = lum; } + void init(uint8_t type, uint8_t rotation, uint8_t cs, uint8_t dc, uint8_t reset, uint8_t clock, uint8_t data, DisplayData *displayData) { + u8g2_cb_t *rot = (u8g2_cb_t *)((rotation != 0x00) ? U8G2_R2 : U8G2_R0); + monoInit(new U8G2_SSD1306_128X32_UNIVISION_F_HW_I2C(rot, reset, clock, data), type, displayData); + calcLinePositions(); + printText("Ahoy!", 0); + printText("ahoydtu.de", 2); + printText(mDisplayData->version, 3); + mDisplay->sendBuffer(); + } + void loop(uint8_t lum) { - if (mEnPowerSafe) { + if (mEnPowerSave) { if (mTimeout != 0) mTimeout--; } @@ -58,43 +45,43 @@ class DisplayMono128X32 : public DisplayMono { } } - void disp(float totalPower, float totalYieldDay, float totalYieldTotal, uint8_t isprod) { + void disp(void) { mDisplay->clearBuffer(); // set Contrast of the Display to raise the lifetime if (3 != mType) mDisplay->setContrast(mLuminance); - if ((totalPower > 0) && (isprod > 0)) { + if ((mDisplayData->totalPower > 0) && (mDisplayData->isProducing > 0)) { mTimeout = DISP_DEFAULT_TIMEOUT; mDisplay->setPowerSave(false); - if (totalPower > 999) - snprintf(mFmtText, DISP_FMT_TEXT_LEN, "%2.2f kW", (totalPower / 1000)); + if (mDisplayData->totalPower > 999) + snprintf(mFmtText, DISP_FMT_TEXT_LEN, "%2.2f kW", (mDisplayData->totalPower / 1000)); else - snprintf(mFmtText, DISP_FMT_TEXT_LEN, "%3.0f W", totalPower); + snprintf(mFmtText, DISP_FMT_TEXT_LEN, "%3.0f W", mDisplayData->totalPower); printText(mFmtText, 0); } else { printText("offline", 0); // check if it's time to enter power saving mode if (mTimeout == 0) - mDisplay->setPowerSave(mEnPowerSafe); + mDisplay->setPowerSave(mEnPowerSave); } - snprintf(mFmtText, DISP_FMT_TEXT_LEN, "today: %4.0f Wh", totalYieldDay); + snprintf(mFmtText, DISP_FMT_TEXT_LEN, "today: %4.0f Wh", mDisplayData->totalYieldDay); printText(mFmtText, 1); - snprintf(mFmtText, DISP_FMT_TEXT_LEN, "total: %.1f kWh", totalYieldTotal); + snprintf(mFmtText, DISP_FMT_TEXT_LEN, "total: %.1f kWh", mDisplayData->totalYieldTotal); printText(mFmtText, 2); 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", isprod); + snprintf(mFmtText, DISP_FMT_TEXT_LEN, "%d Inverter on", mDisplayData->isProducing); printText(mFmtText, 3); - } else if (NULL != mUtcTs) - printText(ah::getTimeStr(gTimezone.toLocal(*mUtcTs)).c_str(), 3); + } else if (0 != mDisplayData->utcTs) + printText(ah::getTimeStr(gTimezone.toLocal(mDisplayData->utcTs)).c_str(), 3); mDisplay->sendBuffer(); diff --git a/src/plugins/Display/Display_Mono_128X64.h b/src/plugins/Display/Display_Mono_128X64.h index 438cb79e..86061f89 100644 --- a/src/plugins/Display/Display_Mono_128X64.h +++ b/src/plugins/Display/Display_Mono_128X64.h @@ -9,53 +9,42 @@ class DisplayMono128X64 : public DisplayMono { public: DisplayMono128X64() : DisplayMono() { - mEnPowerSafe = true; + mEnPowerSave = true; mEnScreenSaver = true; mLuminance = 60; mDispY = 0; mTimeout = DISP_DEFAULT_TIMEOUT; // interval at which to power save (milliseconds) - mUtcTs = NULL; - mType = 0; } - void init(uint8_t type, uint8_t rotation, uint8_t cs, uint8_t dc, uint8_t reset, uint8_t clock, uint8_t data, uint32_t *utcTs, const char *version) { - - u8g2_cb_t *rot = (u8g2_cb_t *)((rotation != 0x00) ? U8G2_R2 : U8G2_R0); - mType = type; - - switch (type) { - case 1: - mDisplay = new U8G2_SSD1306_128X64_NONAME_F_HW_I2C(rot, reset, clock, data); - break; - case 2: - mDisplay = new U8G2_SH1106_128X64_NONAME_F_HW_I2C(rot, reset, clock, data); - break; - case 6: - mDisplay = new U8G2_SSD1309_128X64_NONAME0_F_HW_I2C(rot, reset, clock, data); - break; - } - - mUtcTs = utcTs; - - mDisplay->begin(); - calcLinePositions(); - - mDisplay->clearBuffer(); - mDisplay->setContrast(mLuminance); - printText("AHOY!", 0, 35); - printText("ahoydtu.de", 2, 20); - printText(version, 3, 46); - mDisplay->sendBuffer(); - } - - void config(bool enPowerSafe, bool enScreenSaver, uint8_t lum) { - mEnPowerSafe = enPowerSafe; + void config(bool enPowerSave, bool enScreenSaver, uint8_t lum) { + mEnPowerSave = enPowerSave; mEnScreenSaver = enScreenSaver; mLuminance = lum; } + void init(uint8_t type, uint8_t rotation, uint8_t cs, uint8_t dc, uint8_t reset, uint8_t clock, uint8_t data, DisplayData *displayData) { + u8g2_cb_t *rot = (u8g2_cb_t *)((rotation != 0x00) ? U8G2_R2 : U8G2_R0); + switch (type) { + case 1: + monoInit(new U8G2_SSD1306_128X64_NONAME_F_HW_I2C(rot, reset, clock, data), type, displayData); + break; + case 2: + monoInit(new U8G2_SH1106_128X64_NONAME_F_HW_I2C(rot, reset, clock, data), type, displayData); + break; + case 6: + default: + monoInit(new U8G2_SSD1309_128X64_NONAME0_F_HW_I2C(rot, reset, clock, data), type, displayData); + break; + } + calcLinePositions(); + printText("Ahoy!", 0, 35); + printText("ahoydtu.de", 2, 20); + printText(mDisplayData->version, 3, 46); + mDisplay->sendBuffer(); + } + void loop(uint8_t lum) { - if (mEnPowerSafe) { + if (mEnPowerSave) { if (mTimeout != 0) mTimeout--; } @@ -66,43 +55,43 @@ class DisplayMono128X64 : public DisplayMono { } } - void disp(float totalPower, float totalYieldDay, float totalYieldTotal, uint8_t isprod) { + void disp(void) { mDisplay->clearBuffer(); // set Contrast of the Display to raise the lifetime mDisplay->setContrast(mLuminance); - if ((totalPower > 0) && (isprod > 0)) { + if ((mDisplayData->totalPower > 0) && (mDisplayData->isProducing > 0)) { mTimeout = DISP_DEFAULT_TIMEOUT; mDisplay->setPowerSave(false); - if (totalPower > 999) - snprintf(mFmtText, DISP_FMT_TEXT_LEN, "%2.2f kW", (totalPower / 1000)); + if (mDisplayData->totalPower > 999) + snprintf(mFmtText, DISP_FMT_TEXT_LEN, "%2.2f kW", (mDisplayData->totalPower / 1000)); else - snprintf(mFmtText, DISP_FMT_TEXT_LEN, "%3.0f W", totalPower); + snprintf(mFmtText, DISP_FMT_TEXT_LEN, "%3.0f W", mDisplayData->totalPower); printText(mFmtText, 0); } else { printText("offline", 0, 25); // check if it's time to enter power saving mode if (mTimeout == 0) - mDisplay->setPowerSave(mEnPowerSafe); + mDisplay->setPowerSave(mEnPowerSave); } - snprintf(mFmtText, DISP_FMT_TEXT_LEN, "today: %4.0f Wh", totalYieldDay); + snprintf(mFmtText, DISP_FMT_TEXT_LEN, "today: %4.0f Wh", mDisplayData->totalYieldDay); printText(mFmtText, 1); - snprintf(mFmtText, DISP_FMT_TEXT_LEN, "total: %.1f kWh", totalYieldTotal); + snprintf(mFmtText, DISP_FMT_TEXT_LEN, "total: %.1f kWh", mDisplayData->totalYieldTotal); printText(mFmtText, 2); 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", isprod); + snprintf(mFmtText, DISP_FMT_TEXT_LEN, "%d Inverter on", mDisplayData->isProducing); printText(mFmtText, 3); - } else if (NULL != mUtcTs) - printText(ah::getDateTimeStr(gTimezone.toLocal(*mUtcTs)).c_str(), 3); + } else if (0 != mDisplayData->utcTs) + printText(ah::getDateTimeStr(gTimezone.toLocal(mDisplayData->utcTs)).c_str(), 3); mDisplay->sendBuffer(); diff --git a/src/plugins/Display/Display_Mono_64X48.h b/src/plugins/Display/Display_Mono_64X48.h index ae074c33..a040c3f8 100644 --- a/src/plugins/Display/Display_Mono_64X48.h +++ b/src/plugins/Display/Display_Mono_64X48.h @@ -9,46 +9,33 @@ class DisplayMono64X48 : public DisplayMono { public: DisplayMono64X48() : DisplayMono() { - mEnPowerSafe = true; + mEnPowerSave = true; mEnScreenSaver = false; mLuminance = 20; mExtra = 0; mDispY = 0; mTimeout = DISP_DEFAULT_TIMEOUT; // interval at which to power save (milliseconds) - mUtcTs = NULL; - mType = 0; } - void init(uint8_t type, uint8_t rotation, uint8_t cs, uint8_t dc, uint8_t reset, uint8_t clock, uint8_t data, uint32_t *utcTs, const char *version) { - - u8g2_cb_t *rot = (u8g2_cb_t *)((rotation != 0x00) ? U8G2_R2 : U8G2_R0); - mType = type; - - // Wemos OLed Shield is not defined in u8 lib -> use nearest compatible - mDisplay = new U8G2_SSD1306_64X48_ER_F_HW_I2C(rot, reset, clock, data); - - mUtcTs = utcTs; - - mDisplay->begin(); - calcLinePositions(); - - mDisplay->clearBuffer(); - mDisplay->setContrast(mLuminance); - - printText("AHOY!", 0); - printText("ahoydtu.de", 1); - printText(version, 2); - mDisplay->sendBuffer(); - } - - void config(bool enPowerSafe, bool enScreenSaver, uint8_t lum) { - mEnPowerSafe = enPowerSafe; + void config(bool enPowerSave, bool enScreenSaver, uint8_t lum) { + mEnPowerSave = enPowerSave; mEnScreenSaver = enScreenSaver; mLuminance = lum; } + void init(uint8_t type, uint8_t rotation, uint8_t cs, uint8_t dc, uint8_t reset, uint8_t clock, uint8_t data, DisplayData *displayData) { + u8g2_cb_t *rot = (u8g2_cb_t *)((rotation != 0x00) ? U8G2_R2 : U8G2_R0); + // Wemos OLed Shield is not defined in u8 lib -> use nearest compatible + monoInit(new U8G2_SSD1306_64X48_ER_F_HW_I2C(rot, reset, clock, data), type, displayData); + calcLinePositions(); + printText("Ahoy!", 0); + printText("ahoydtu.de", 1); + printText(mDisplayData->version, 2); + mDisplay->sendBuffer(); + } + void loop(uint8_t lum) { - if (mEnPowerSafe) { + if (mEnPowerSave) { if (mTimeout != 0) mTimeout--; } @@ -59,43 +46,43 @@ class DisplayMono64X48 : public DisplayMono { } } - void disp(float totalPower, float totalYieldDay, float totalYieldTotal, uint8_t isprod) { + void disp(void) { mDisplay->clearBuffer(); // set Contrast of the Display to raise the lifetime mDisplay->setContrast(mLuminance); - if ((totalPower > 0) && (isprod > 0)) { + if ((mDisplayData->totalPower > 0) && (mDisplayData->isProducing > 0)) { mTimeout = DISP_DEFAULT_TIMEOUT; mDisplay->setPowerSave(false); - if (totalPower > 999) - snprintf(mFmtText, DISP_FMT_TEXT_LEN, "%2.2f kW", (totalPower / 1000)); + if (mDisplayData->totalPower > 999) + snprintf(mFmtText, DISP_FMT_TEXT_LEN, "%2.2f kW", (mDisplayData->totalPower / 1000)); else - snprintf(mFmtText, DISP_FMT_TEXT_LEN, "%3.0f W", totalPower); + snprintf(mFmtText, DISP_FMT_TEXT_LEN, "%3.0f W", mDisplayData->totalPower); printText(mFmtText, 0); } else { printText("offline", 0); // check if it's time to enter power saving mode if (mTimeout == 0) - mDisplay->setPowerSave(mEnPowerSafe); + mDisplay->setPowerSave(mEnPowerSave); } - snprintf(mFmtText, DISP_FMT_TEXT_LEN, "D: %4.0f Wh", totalYieldDay); + snprintf(mFmtText, DISP_FMT_TEXT_LEN, "D: %4.0f Wh", mDisplayData->totalYieldDay); printText(mFmtText, 1); - snprintf(mFmtText, DISP_FMT_TEXT_LEN, "T: %4.0f kWh", totalYieldTotal); + snprintf(mFmtText, DISP_FMT_TEXT_LEN, "T: %4.0f kWh", mDisplayData->totalYieldTotal); printText(mFmtText, 2); IPAddress ip = WiFi.localIP(); if (!(mExtra % 10) && (ip)) printText(ip.toString().c_str(), 3); else if (!(mExtra % 5)) { - snprintf(mFmtText, DISP_FMT_TEXT_LEN, "active Inv: %d", isprod); + snprintf(mFmtText, DISP_FMT_TEXT_LEN, "active Inv: %d", mDisplayData->isProducing); printText(mFmtText, 3); - } else if (NULL != mUtcTs) - printText(ah::getTimeStr(gTimezone.toLocal(*mUtcTs)).c_str(), 3); + } else if (0 != mDisplayData->utcTs) + printText(ah::getTimeStr(gTimezone.toLocal(mDisplayData->utcTs)).c_str(), 3); mDisplay->sendBuffer(); diff --git a/src/plugins/Display/Display_Mono_84X48.h b/src/plugins/Display/Display_Mono_84X48.h index fff983bc..0db18ed5 100644 --- a/src/plugins/Display/Display_Mono_84X48.h +++ b/src/plugins/Display/Display_Mono_84X48.h @@ -9,46 +9,32 @@ class DisplayMono84X48 : public DisplayMono { public: DisplayMono84X48() : DisplayMono() { - mEnPowerSafe = true; + mEnPowerSave = true; mEnScreenSaver = true; - mLuminance = 60; + mLuminance = 140; mExtra = 0; mDispY = 0; mTimeout = DISP_DEFAULT_TIMEOUT; // interval at which to power save (milliseconds) - mUtcTs = NULL; - mType = 0; - mDispWidth = 0; } - void init(uint8_t type, uint8_t rotation, uint8_t cs, uint8_t dc, uint8_t reset, uint8_t clock, uint8_t data, uint32_t *utcTs, const char *version) { - - u8g2_cb_t *rot = (u8g2_cb_t *)((rotation != 0x00) ? U8G2_R2 : U8G2_R0); - mType = type; - mDisplay = new U8G2_PCD8544_84X48_F_4W_SW_SPI(rot, clock, data, cs, dc, reset); - - mUtcTs = utcTs; - - mDisplay->begin(); - mDispWidth = mDisplay->getDisplayWidth(); - calcLinePositions(); - - mDisplay->clearBuffer(); - mDisplay->setContrast(mLuminance); - - printText("AHOY!", l_Ahoy); - printText("ahoydtu.de", l_Website); - printText(version, l_Version); - mDisplay->sendBuffer(); - } - - void config(bool enPowerSafe, bool enScreenSaver, uint8_t lum) { - mEnPowerSafe = enPowerSafe; + void config(bool enPowerSave, bool enScreenSaver, uint8_t lum) { + mEnPowerSave = enPowerSave; mEnScreenSaver = enScreenSaver; mLuminance = lum; } + void init(uint8_t type, uint8_t rotation, uint8_t cs, uint8_t dc, uint8_t reset, uint8_t clock, uint8_t data, DisplayData *displayData) { + 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); + mDisplay->sendBuffer(); + } + void loop(uint8_t lum) { - if (mEnPowerSafe) { + if (mEnPowerSave) { if (mTimeout != 0) mTimeout--; } @@ -59,43 +45,43 @@ class DisplayMono84X48 : public DisplayMono { } } - void disp(float totalPower, float totalYieldDay, float totalYieldTotal, uint8_t isprod) { + void disp(void) { mDisplay->clearBuffer(); // set Contrast of the Display to raise the lifetime mDisplay->setContrast(mLuminance); - if ((totalPower > 0) && (isprod > 0)) { + if ((mDisplayData->totalPower > 0) && (mDisplayData->isProducing > 0)) { mTimeout = DISP_DEFAULT_TIMEOUT; mDisplay->setPowerSave(false); - if (totalPower > 999) - snprintf(mFmtText, DISP_FMT_TEXT_LEN, "%.2f kW", (totalPower / 1000)); + if (mDisplayData->totalPower > 999) + snprintf(mFmtText, DISP_FMT_TEXT_LEN, "%.2f kW", (mDisplayData->totalPower / 1000)); else - snprintf(mFmtText, DISP_FMT_TEXT_LEN, "%.0f W", totalPower); + snprintf(mFmtText, DISP_FMT_TEXT_LEN, "%.0f W", mDisplayData->totalPower); printText(mFmtText, l_TotalPower); } else { printText("offline", l_TotalPower); // check if it's time to enter power saving mode if (mTimeout == 0) - mDisplay->setPowerSave(mEnPowerSafe); + mDisplay->setPowerSave(mEnPowerSave); } - snprintf(mFmtText, DISP_FMT_TEXT_LEN, "Today: %4.0f Wh", totalYieldDay); + + snprintf(mFmtText, DISP_FMT_TEXT_LEN, "Today: %.0f Wh", mDisplayData->totalYieldDay); printText(mFmtText, l_YieldDay); - snprintf(mFmtText, DISP_FMT_TEXT_LEN, "Total: %.1f kWh", totalYieldTotal); + snprintf(mFmtText, DISP_FMT_TEXT_LEN, "Total: %.1f kWh", mDisplayData->totalYieldTotal); printText(mFmtText, l_YieldTotal); - if (NULL != mUtcTs) - printText(ah::getDateTimeStrShort(gTimezone.toLocal(*mUtcTs)).c_str(), l_Time); + if (0 != mDisplayData->utcTs) + printText(ah::getDateTimeStrShort(gTimezone.toLocal(mDisplayData->utcTs)).c_str(), l_Time); - IPAddress ip = WiFi.localIP(); - if (!(mExtra % 5) && (ip)) - snprintf(mFmtText, DISP_FMT_TEXT_LEN, "%s", ip.toString().c_str()); + if (!(mExtra % 5) && (mDisplayData->ipAddress)) + snprintf(mFmtText, DISP_FMT_TEXT_LEN, "%s", (mDisplayData->ipAddress).toString().c_str()); else - snprintf(mFmtText, DISP_FMT_TEXT_LEN, "Inv.On: %d", isprod); + snprintf(mFmtText, DISP_FMT_TEXT_LEN, "Inv.On: %d", mDisplayData->isProducing); printText(mFmtText, l_Status); mDisplay->sendBuffer(); @@ -153,3 +139,4 @@ class DisplayMono84X48 : public DisplayMono { mDisplay->drawStr(dispX, mLineYOffsets[line], text); } }; + diff --git a/src/plugins/Display/Display_data.h b/src/plugins/Display/Display_data.h new file mode 100644 index 00000000..81496579 --- /dev/null +++ b/src/plugins/Display/Display_data.h @@ -0,0 +1,20 @@ +#include "../../utils/helper.h" + +#ifndef __DISPLAY_DATA__ +#define __DISPLAY_DATA__ + +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; +}; + +#endif /*__DISPLAY_DATA__*/ diff --git a/src/plugins/Display/Display_ePaper.cpp b/src/plugins/Display/Display_ePaper.cpp index 9a4b594c..d12da365 100644 --- a/src/plugins/Display/Display_ePaper.cpp +++ b/src/plugins/Display/Display_ePaper.cpp @@ -46,9 +46,9 @@ void DisplayEPaper::init(uint8_t type, uint8_t _CS, uint8_t _DC, uint8_t _RST, u } } -void DisplayEPaper::config(uint8_t rotation, bool enPowerSafe) { +void DisplayEPaper::config(uint8_t rotation, bool enPowerSave) { mDisplayRotation = rotation; - mEnPowerSafe = enPowerSafe; + mEnPowerSave = enPowerSave; } //*************************************************************************** @@ -209,7 +209,7 @@ void DisplayEPaper::actualPowerPaged(float totalPower, float totalYieldDay, floa } else snprintf(_fmtText, sizeof(_fmtText), "offline"); - if ((totalPower == 0) && (mEnPowerSafe)) { + if ((totalPower == 0) && (mEnPowerSave)) { _display->fillRect(0, mHeadFootPadding, 200, 200, GxEPD_BLACK); _display->drawBitmap(0, 0, logo, 200, 200, GxEPD_WHITE); } else { @@ -291,7 +291,7 @@ void DisplayEPaper::loop(float totalPower, float totalYieldDay, float totalYield if ((isprod > 0) && (_changed)) { _changed = false; lastUpdatePaged(); - } else if ((0 == totalPower) && (mEnPowerSafe)) + } else if ((0 == totalPower) && (mEnPowerSave)) offlineFooter(); _display->powerOff(); diff --git a/src/plugins/Display/Display_ePaper.h b/src/plugins/Display/Display_ePaper.h index 2ff7e58d..c9a0fbf5 100644 --- a/src/plugins/Display/Display_ePaper.h +++ b/src/plugins/Display/Display_ePaper.h @@ -28,7 +28,7 @@ class DisplayEPaper { DisplayEPaper(); void fullRefresh(); void init(uint8_t type, uint8_t _CS, uint8_t _DC, uint8_t _RST, uint8_t _BUSY, uint8_t _SCK, uint8_t _MOSI, uint32_t* utcTs, const char* version); - void config(uint8_t rotation, bool enPowerSafe); + void config(uint8_t rotation, bool enPowerSave); void loop(float totalPower, float totalYieldDay, float totalYieldTotal, uint8_t isprod); void refreshLoop(); void tickerSecond(); @@ -56,7 +56,7 @@ class DisplayEPaper { uint8_t mHeadFootPadding; GxEPD2_GFX* _display; uint32_t* mUtcTs; - bool mEnPowerSafe; + bool mEnPowerSave; const char* _version; RefreshStatus mRefreshState, mNextRefreshState; uint8_t mSecondCnt;