143 lines
3.8 KiB
C++
143 lines
3.8 KiB
C++
#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);
|
|
}
|
|
}
|