Files
P1-Wifi/P1_gateway_FW/src/display.cpp
2021-08-23 17:12:02 +02:00

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);
}
}