Files
EnergyMonitor_Pico/libs/mare/mare.cpp
Emanuele Trabattoni 8325dcfdd8 we render a point!!!
2021-05-26 23:38:07 +02:00

64 lines
1.9 KiB
C++

/*******************************************
* Most Awesome Renderer Ever
*******************************************/
#include "mare.h"
namespace Render {
Mare::Mare(dim_t size) :
_screenSize(size),
_screenBufferBackground(nullptr),
_screenBufferForeground(nullptr)
{
int rv;
_bufferDim = (_screenSize.x >> 3) * _screenSize.y;
_screenBufferBackground = (uint8_t*)malloc(sizeof(uint8_t)* _bufferDim);
_screenBufferForeground = (uint8_t*)malloc(sizeof(uint8_t)* _bufferDim);
clearBuffer(_screenBufferForeground, _bufferDim, Color::White);
clearBuffer(_screenBufferBackground, _bufferDim, Color::White);
// init display
DEV_Delay_ms(500);
if((rv=DEV_Module_Init())!=0){
printf("Init Failed, %d\n",rv);
return;
}
EPD_2IN9_V2_Init();
EPD_2IN9_V2_Clear();
printf("Mare render engine created\n");
}
Mare::~Mare(){
for (auto &d :_drawables) {
d.reset();
}
for (auto &p : _pages){
p.reset();
}
free(_screenBufferBackground);
free(_screenBufferForeground);
}
void Mare::render() {
clearBuffer(_screenBufferBackground, _bufferDim, Color::White);
for (auto d: _drawables) {
if (d != nullptr)
d->render();
}
EPD_2IN9_V2_Display_Partial(_screenBufferBackground);
}
void Mare::setPixel(uint8_t* img, uint16_t x, uint16_t y, bool value){
assert(x <= _screenSize.x);
assert(y <= _screenSize.y);
img += (sizeof(uint8_t)*y*(_screenSize.x/8) + sizeof(uint8_t)*(x/8));
if (value) *img &= ~(0x80 >> (x%8));
else *img |= (0x80 >> (x%8));
}
void Mare::clearBuffer(uint8_t* buffer, uint16_t len, Color col){
assert(buffer != nullptr);
std::memset(buffer, col == Color::White ? 0xff : 0x00, len);
}
}