LoRa_APRS_iGate/lib/Display/Display.cpp

91 wiersze
1.8 KiB
C++

#include <logger.h>
#include "Display.h"
#include <TaskManager.h>
Display::Display()
: _disp(0), _statusFrame(0), _nextFrameTime(0)
{
}
void Display::setup(std::shared_ptr<BoardConfig> boardConfig)
{
if(boardConfig->OledReset != 0)
{
pinMode(boardConfig->OledReset, OUTPUT);
digitalWrite(boardConfig->OledReset, HIGH);
delay(1);
digitalWrite(boardConfig->OledReset, LOW);
delay(10);
digitalWrite(boardConfig->OledReset, HIGH);
}
Wire.begin(boardConfig->OledSda, boardConfig->OledScl);
_disp = std::shared_ptr<OLEDDisplay>(new SSD1306(&Wire, boardConfig->OledAddr));
Bitmap bitmap(_disp->getWidth(), _disp->getHeight());
_disp->display(&bitmap);
}
void Display::turn180()
{
_disp->flipScreenVertically();
}
void Display::update()
{
if(_statusFrame->isPrio())
{
Bitmap bitmap(_disp.get());
_statusFrame->drawStatusPage(bitmap);
_disp->display(&bitmap);
return;
}
if(_nextFrameTime > now())
{
return;
}
if(_frames.size() > 0)
{
std::shared_ptr<DisplayFrame> frame = *_frames.begin();
Bitmap bitmap(_disp.get());
frame->drawStatusPage(bitmap);
_disp->display(&bitmap);
_frames.pop_front();
_nextFrameTime = now() + 15;
}
else
{
Bitmap bitmap(_disp.get());
_statusFrame->drawStatusPage(bitmap);
_disp->display(&bitmap);
}
}
void Display::addFrame(std::shared_ptr<DisplayFrame> frame)
{
_frames.push_back(frame);
}
void Display::setStatusFrame(std::shared_ptr<StatusFrame> frame)
{
_statusFrame = frame;
}
void Display::showSpashScreen(String firmwareTitle, String version)
{
Bitmap bitmap(_disp.get());
bitmap.drawString( 0, 10, firmwareTitle);
bitmap.drawString( 0, 20, version);
bitmap.drawString( 0, 35, "by Peter Buchegger");
bitmap.drawString(30, 45, "OE5BPA");
_disp->display(&bitmap);
}
void TextFrame::drawStatusPage(Bitmap & bitmap)
{
bitmap.drawString(0, 0, _header);
bitmap.drawStringLF(0, 10, _text);
}