#include "display.h" SSD1306Wire display(0x3c, SDA, SCL); bool initOK = false; OLEDDisplayUi ui(&display); int screenW = 128; int screenH = 64; int clockCenterX = screenW / 2; int clockCenterY = ((screenH - 16) / 2) + 16; // top yellow part is 16 px height int clockRadius = 23; // utility function for digital clock display: prints leading 0 String twoDigits(int digits) { if (digits < 10) { String i = '0' + String(digits); return i; } else { return String(digits); } } void msOverlay(OLEDDisplay *display, OLEDDisplayUiState *state) { } void initFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y) { // draw an xbm image. // Please note that everything that should be transitioned // needs to be drawn relative to x and y //display->drawXbm(x + 34, y + 14, WiFi_Logo_width, WiFi_Logo_height, WiFi_Logo_bits); display->setTextAlignment(TEXT_ALIGN_CENTER); display->setFont(ArialMT_Plain_16); display->drawString(64 + x, 8 + y, "DU-DSMR-W"); //display-> } void DSMRStatsFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y) { // Demonstrates the 3 included default sizes. The fonts come from SSD1306Fonts.h file // Besides the default fonts there will be a program to convert TrueType fonts into this format display->setTextAlignment(TEXT_ALIGN_LEFT); display->setFont(ArialMT_Plain_10); display->drawString(0 + x, 0 + y, "DSMR stats:"); display->drawString(0 + x, 11 + y, getMsgCount()); } void ElecFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y) { display->setTextAlignment(TEXT_ALIGN_LEFT); display->setFont(ArialMT_Plain_10); display->drawString(0 + x, 0 + y, "Electricity:"); display->drawString(0 + x, 11 + y, getElecDelivered()); display->drawString(0 + x, 22 + y, getElecReturned()); } void GasFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y) { display->setTextAlignment(TEXT_ALIGN_LEFT); display->setFont(ArialMT_Plain_10); display->drawString(0 + x, 0 + y, getGasDelivered()); } void drawFrame5(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y) { } // This array keeps function pointers to all frames // frames are the single views that slide in FrameCallback frames[] = {initFrame, DSMRStatsFrame, ElecFrame, GasFrame};//, drawFrame5}; // how many frames are there? int frameCount = 4; // Overlays are statically drawn on top of a frame eg. a clock //OverlayCallback overlays[] = {msOverlay}; //int overlaysCount = 1; void initDisplay(void) { // The ESP is capable of rendering 60fps in 80Mhz mode // but that won't give you much time for anything else // run it in 160Mhz mode or just set it to 30 fps ui.setTargetFPS(30); display.init(); // Customize the active and inactive symbol //ui.setActiveSymbol(activeSymbol); //ui.setInactiveSymbol(inactiveSymbol); // You can change this to // TOP, LEFT, BOTTOM, RIGHT ui.setIndicatorPosition(RIGHT); // Defines where the first frame is located in the bar. ui.setIndicatorDirection(LEFT_RIGHT); // You can change the transition that is used // SLIDE_LEFT, SLIDE_RIGHT, SLIDE_UP, SLIDE_DOWN ui.setFrameAnimation(SLIDE_UP); // Add frames ui.setFrames(frames, frameCount); // Add overlays //ui.setOverlays(overlays, overlaysCount); //ui.disableAllIndicators(); // Initialising the UI will init the display too. ui.init(); Serial.printf("initdisplay: h=%u, w=%u", display.height(), display.width()); //display.flipScreenVertically(); } void handleDisplay(void) { int remainingTimeBudget = ui.update(); if (remainingTimeBudget > 0) { // You can do some work here // Don't do stuff if you are below your // time budget. Serial.println(remainingTimeBudget); //delay(remainingTimeBudget); } }