abstracting display, touch and sd
This commit is contained in:
97
display/low_level_display_epaper.cpp
Normal file
97
display/low_level_display_epaper.cpp
Normal file
@@ -0,0 +1,97 @@
|
||||
#include "low_level_display_epaper.h"
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
// Note: This is a placeholder implementation
|
||||
// You'll need to add the actual e-paper driver code to lib/epaper/
|
||||
|
||||
LowLevelDisplayEPaper::LowLevelDisplayEPaper(const epaper_config* cfg, int w, int h)
|
||||
: config(cfg), width(w), height(h), initialized(false), framebuffer(nullptr), dirty(false) {
|
||||
|
||||
// Allocate framebuffer (1 bit per pixel for monochrome e-paper)
|
||||
int buffer_size = (width * height + 7) / 8; // Round up to nearest byte
|
||||
framebuffer = (uint8_t*)malloc(buffer_size);
|
||||
if (framebuffer) {
|
||||
memset(framebuffer, 0xFF, buffer_size); // White
|
||||
}
|
||||
}
|
||||
|
||||
LowLevelDisplayEPaper::~LowLevelDisplayEPaper() {
|
||||
if (framebuffer) {
|
||||
free(framebuffer);
|
||||
}
|
||||
}
|
||||
|
||||
bool LowLevelDisplayEPaper::init() {
|
||||
if (initialized) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!framebuffer) {
|
||||
printf("Failed to allocate framebuffer for e-paper display\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
// TODO: Implement e-paper initialization
|
||||
// epaper_init(config, width, height);
|
||||
printf("E-paper display initialized: %dx%d (stub)\n", width, height);
|
||||
initialized = true;
|
||||
return false; // Return false until actual driver is implemented
|
||||
}
|
||||
|
||||
void LowLevelDisplayEPaper::clear(bool white) {
|
||||
if (!framebuffer) return;
|
||||
|
||||
int buffer_size = (width * height + 7) / 8;
|
||||
memset(framebuffer, white ? 0xFF : 0x00, buffer_size);
|
||||
dirty = true;
|
||||
}
|
||||
|
||||
void LowLevelDisplayEPaper::draw_pixel(int x, int y, bool white) {
|
||||
if (!framebuffer || x < 0 || x >= width || y < 0 || y >= height) {
|
||||
return;
|
||||
}
|
||||
|
||||
int byte_index = (y * width + x) / 8;
|
||||
int bit_index = 7 - ((y * width + x) % 8);
|
||||
|
||||
if (white) {
|
||||
framebuffer[byte_index] |= (1 << bit_index);
|
||||
} else {
|
||||
framebuffer[byte_index] &= ~(1 << bit_index);
|
||||
}
|
||||
|
||||
dirty = true;
|
||||
}
|
||||
|
||||
void LowLevelDisplayEPaper::draw_buffer(const uint8_t* bit_buffer) {
|
||||
if (!bit_buffer || !framebuffer) return;
|
||||
|
||||
// Direct copy of 1-bit buffer
|
||||
int buffer_size = (width * height + 7) / 8;
|
||||
memcpy(framebuffer, bit_buffer, buffer_size);
|
||||
dirty = true;
|
||||
}
|
||||
|
||||
void LowLevelDisplayEPaper::refresh() {
|
||||
if (!dirty || !framebuffer) {
|
||||
return;
|
||||
}
|
||||
|
||||
// TODO: Implement actual e-paper refresh
|
||||
// epaper_update(framebuffer);
|
||||
printf("E-paper refresh (stub)\n");
|
||||
|
||||
dirty = false;
|
||||
}
|
||||
|
||||
void LowLevelDisplayEPaper::clear_display() {
|
||||
clear(true); // Fill with white
|
||||
refresh();
|
||||
}
|
||||
|
||||
void LowLevelDisplayEPaper::sleep() {
|
||||
// TODO: Implement e-paper sleep mode
|
||||
// epaper_sleep();
|
||||
}
|
||||
Reference in New Issue
Block a user