Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions src/components/display/controller.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -64,11 +64,11 @@ bool DisplayController::Handle_Display_AddOrReplace(
bool did_begin = false;
if (msgAdd->which_config ==
wippersnapper_display_v1_DisplayAddOrReplace_config_epd_tag) {
did_begin = display->beginEPD(&msgAdd->config.config_epd,
did_begin = display->beginEPD(&msgAdd->driver, &msgAdd->config.config_epd,
&msgAdd->interface_type.spi_epd);
} else if (msgAdd->which_config ==
wippersnapper_display_v1_DisplayAddOrReplace_config_tft_tag) {
did_begin = display->beginTft(&msgAdd->config.config_tft,
did_begin = display->beginTft(&msgAdd->driver, &msgAdd->config.config_tft,
&msgAdd->interface_type.spi_tft);
} else {
WS_DEBUG_PRINTLN("[display] Unsupported display configuration type!");
Expand Down
2 changes: 2 additions & 0 deletions src/components/display/drivers/dispDrvSt7789.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,8 @@ class dispDrvSt7789 : public dispDrvBase {
*/
~dispDrvSt7789() {
if (_display) {
// "Clear" the display before deleting
_display->fillScreen(ST77XX_BLACK);
delete _display;
_display = nullptr;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,9 @@ class drvDispThinkInkGrayscale4Eaamfgn : public dispDrvBase {

~drvDispThinkInkGrayscale4Eaamfgn() {
if (_display) {
// Clear the display buffer before deleting
_display->clearBuffer();
_display->display();
delete _display;
_display = nullptr;
}
Expand Down
3 changes: 3 additions & 0 deletions src/components/display/drivers/dispDrvThinkInkGrayscale4T5.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,9 @@ class dispDrvThinkInkGrayscale4T5 : public dispDrvBase {

~dispDrvThinkInkGrayscale4T5() {
if (_display) {
// Clear the display buffer before deleting
_display->clearBuffer();
_display->display();
delete _display;
_display = nullptr;
}
Expand Down
78 changes: 42 additions & 36 deletions src/components/display/hardware.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,19 +20,22 @@
using FnCreateDispDrvEpd =
std::function<dispDrvBase *(int16_t, int16_t, int16_t, int16_t, int16_t)>;

// Factory for creating a new display drivers
// Factory for creating new display drivers
// NOTE: When you add a new display driver, make sure to add it to the factory!
static const std::map<std::string, FnCreateDispDrvEpd> FactoryDrvDispEpd = {
{"eink-29-grayscale-ssd1680",
[](int16_t dc, int16_t rst, int16_t cs, int16_t sram_cs,
int16_t busy) -> dispDrvBase * {
return new drvDispThinkInkGrayscale4Eaamfgn(dc, rst, cs, sram_cs, busy);
}},
{"thinkink-gs4-t5",
[](int16_t dc, int16_t rst, int16_t cs, int16_t sram_cs,
int16_t busy) -> dispDrvBase * {
return new dispDrvThinkInkGrayscale4T5(dc, rst, cs, sram_cs, busy);
}}};
static const std::map<wippersnapper_display_v1_DisplayDriver,
FnCreateDispDrvEpd>
FactoryDrvDispEpd = {
{wippersnapper_display_v1_DisplayDriver_DISPLAY_DRIVER_EPD_SSD1680,
[](int16_t dc, int16_t rst, int16_t cs, int16_t sram_cs,
int16_t busy) -> dispDrvBase * {
return new drvDispThinkInkGrayscale4Eaamfgn(dc, rst, cs, sram_cs,
busy);
}},
{wippersnapper_display_v1_DisplayDriver_DISPLAY_DRIVER_EPD_ILI0373,
[](int16_t dc, int16_t rst, int16_t cs, int16_t sram_cs,
int16_t busy) -> dispDrvBase * {
return new dispDrvThinkInkGrayscale4T5(dc, rst, cs, sram_cs, busy);
}}};

/*!
@brief Lambda function to create a dispDrvBase SPI TFT instance
Expand All @@ -43,23 +46,20 @@ using FnCreateDispDrvTft = std::function<dispDrvBase *(
// Factory for creating a new SPI TFT display driver
// NOTE: When you add a new SPI TFT display driver, make sure to add it to the
// factory!
static const std::map<std::string, FnCreateDispDrvTft> FactoryDrvDispTft = {
{"tft-154-wide-angle",
[](int16_t cs, int16_t dc, int16_t mosi, int16_t sck, int16_t rst,
int16_t miso) -> dispDrvBase * {
return new dispDrvSt7789(cs, dc, mosi, sck, rst, miso);
}},
{"tft-114",
[](int16_t cs, int16_t dc, int16_t mosi, int16_t sck, int16_t rst,
int16_t miso) -> dispDrvBase * {
return new dispDrvSt7789(cs, dc, mosi, sck, rst, miso);
}}};
static const std::map<wippersnapper_display_v1_DisplayDriver,
FnCreateDispDrvTft>
FactoryDrvDispTft = {
{wippersnapper_display_v1_DisplayDriver_DISPLAY_DRIVER_TFT_ST7789,
[](int16_t cs, int16_t dc, int16_t mosi, int16_t sck, int16_t rst,
int16_t miso) -> dispDrvBase * {
return new dispDrvSt7789(cs, dc, mosi, sck, rst, miso);
}}};

/*!
@brief Creates a new E-Ink display driver instance based on the driver
name.
@param driver_name
The name of the display driver to create.
@param driver
The name of the EPD display driver to create.
@param dc
Data/Command pin number.
@param rst
Expand All @@ -73,10 +73,10 @@ static const std::map<std::string, FnCreateDispDrvTft> FactoryDrvDispTft = {
@return Pointer to the created display driver instance, or nullptr if the
driver name is not recognized.
*/
dispDrvBase *CreateDrvDispEpd(const char *driver_name, int16_t dc, int16_t rst,
int16_t cs, int16_t sram_cs = -1,
int16_t busy = -1) {
auto it = FactoryDrvDispEpd.find(driver_name);
dispDrvBase *CreateDrvDispEpd(wippersnapper_display_v1_DisplayDriver driver,
int16_t dc, int16_t rst, int16_t cs,
int16_t sram_cs = -1, int16_t busy = -1) {
auto it = FactoryDrvDispEpd.find(driver);
if (it == FactoryDrvDispEpd.end())
return nullptr;

Expand All @@ -86,7 +86,7 @@ dispDrvBase *CreateDrvDispEpd(const char *driver_name, int16_t dc, int16_t rst,
/*!
@brief Creates a new SPI TFT display driver instance based on the driver
name.
@param driver_name
@param driver
The name of the SPI TFT display driver to create.
@param cs
Chip Select pin number.
Expand All @@ -103,10 +103,10 @@ dispDrvBase *CreateDrvDispEpd(const char *driver_name, int16_t dc, int16_t rst,
@return Pointer to the created display driver instance, or nullptr if the
driver name is not recognized.
*/
dispDrvBase *CreateDrvDispTft(const char *driver_name, int16_t cs, int16_t dc,
int16_t mosi, int16_t sck, int16_t rst = -1,
int16_t miso = -1) {
auto it = FactoryDrvDispTft.find(driver_name);
dispDrvBase *CreateDrvDispTft(wippersnapper_display_v1_DisplayDriver driver,
int16_t cs, int16_t dc, int16_t mosi, int16_t sck,
int16_t rst = -1, int16_t miso = -1) {
auto it = FactoryDrvDispTft.find(driver);
if (it == FactoryDrvDispTft.end())
return nullptr;

Expand Down Expand Up @@ -167,13 +167,16 @@ int16_t DisplayHardware::parsePin(const char *pinStr) {

/*!
@brief Configures the EPD display with the provided configuration.
@param driver
Pointer to the display driver configuration structure.
@param config
Pointer to the EPD configuration structure.
@param spi_config
Pointer to the SPI configuration structure for EPD.
@return True if configuration was successful, False otherwise.
*/
bool DisplayHardware::beginEPD(
wippersnapper_display_v1_DisplayDriver *driver,
wippersnapper_display_v1_EPDConfig *config,
wippersnapper_display_v1_EpdSpiConfig *spi_config) {
// Validate pointers
Expand Down Expand Up @@ -217,7 +220,7 @@ bool DisplayHardware::beginEPD(
}

// Create display driver object using the factory function
_drvDisp = CreateDrvDispEpd(_name, dc, rst, cs, srcs, busy);
_drvDisp = CreateDrvDispEpd(*driver, dc, rst, cs, srcs, busy);
if (!_drvDisp) {
WS_DEBUG_PRINTLN("[display] Failed to create display driver!");
return false; // Failed to create display driver
Expand Down Expand Up @@ -301,13 +304,16 @@ void DisplayHardware::removeSuffix(const char *suffix) {

/*!
@brief Attempts to configure and initialize a TFT display
@param driver
Pointer to the display driver configuration structure.
@param config
Pointer to the TFT configuration structure.
@param spi_config
Pointer to the SPI configuration structure for TFT.
@return True if configuration was successful, False otherwise.
*/
bool DisplayHardware::beginTft(
wippersnapper_display_v1_DisplayDriver *driver,
wippersnapper_display_v1_TftConfig *config,
wippersnapper_display_v1_TftSpiConfig *spi_config) {
// Validate pointers
Expand Down Expand Up @@ -338,7 +344,7 @@ bool DisplayHardware::beginTft(
}

// Create display driver object using the factory function
_drvDisp = CreateDrvDispTft(_name, cs, dc, mosi, sck, rst, miso);
_drvDisp = CreateDrvDispTft(*driver, cs, dc, mosi, sck, rst, miso);
if (!_drvDisp) {
WS_DEBUG_PRINTLN("[display] Failed to create display driver!");
return false;
Expand Down
6 changes: 4 additions & 2 deletions src/components/display/hardware.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,9 +39,11 @@ class DisplayHardware {
const char *getName();
void setType(wippersnapper_display_v1_DisplayType type);
wippersnapper_display_v1_DisplayType getType();
bool beginEPD(wippersnapper_display_v1_EPDConfig *config,
bool beginEPD(wippersnapper_display_v1_DisplayDriver *driver,
wippersnapper_display_v1_EPDConfig *config,
wippersnapper_display_v1_EpdSpiConfig *spi_config);
bool beginTft(wippersnapper_display_v1_TftConfig *config,
bool beginTft(wippersnapper_display_v1_DisplayDriver *driver,
wippersnapper_display_v1_TftConfig *config,
wippersnapper_display_v1_TftSpiConfig *spi_config);

void showSplash();
Expand Down
Loading