Skip to content

Commit 6a233fb

Browse files
committed
Refactor out i2c_output work, bring in new display elements as i2c outputs!
1 parent 8022edd commit 6a233fb

32 files changed

+281
-1707
lines changed

src/Wippersnapper.cpp

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -834,25 +834,6 @@ bool cbDecodeSignalRequestI2C(pb_istream_t *stream, const pb_field_t *field,
834834
if (!encodeI2CResponse(&msgi2cResponse)) {
835835
return false;
836836
}
837-
} else if (field->tag ==
838-
wippersnapper_signal_v1_I2CRequest_req_i2c_device_out_write_tag) {
839-
WS_DEBUG_PRINTLN("[app] I2C Device Output Write");
840-
// Decode stream into an I2CDeviceDeinitRequest
841-
wippersnapper_i2c_v1_I2CDeviceOutputWrite msgDeviceWrite =
842-
wippersnapper_i2c_v1_I2CDeviceOutputWrite_init_zero;
843-
// Decode stream into struct, msgI2CDeviceDeinitRequest
844-
if (!ws_pb_decode(stream, wippersnapper_i2c_v1_I2CDeviceOutputWrite_fields,
845-
&msgDeviceWrite)) {
846-
WS_DEBUG_PRINTLN(
847-
"[app] ERROR: Failed decoding I2CDeviceOutputWrite message.");
848-
return false;
849-
}
850-
851-
if (!WS._i2cPort0->Handle_I2cDeviceOutputWrite(&msgDeviceWrite)) {
852-
WS_DEBUG_PRINTLN("[app] ERROR: Failed to write to I2C output device.");
853-
return false; // fail out if we can't decode, we don't have a response to
854-
// publish
855-
}
856837
WS_DEBUG_PRINTLN("[app] I2C Device Output Write Done");
857838
return true; // we successfully wrote to the device, this subtype has no
858839
// response to publish to IO

src/components/display/controller.cpp

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,11 +51,26 @@ bool DisplayController::Handle_Display_AddOrReplace(
5151
if (msgAdd->which_config ==
5252
wippersnapper_display_v1_DisplayAddOrReplace_config_epd_tag) {
5353
did_begin = display->beginEPD(&msgAdd->config.config_epd,
54-
&msgAdd->interface_type.spi_epd);
54+
&msgAdd->interface_type.cfg_spi);
5555
} else if (msgAdd->which_config ==
5656
wippersnapper_display_v1_DisplayAddOrReplace_config_tft_tag) {
5757
did_begin = display->beginTft(&msgAdd->config.config_tft,
58-
&msgAdd->interface_type.spi_tft);
58+
&msgAdd->interface_type.cfg_spi);
59+
} else if (msgAdd->which_config ==
60+
wippersnapper_display_v1_DisplayAddOrReplace_config_ssd1306_tag) {
61+
did_begin = display->beginOled(&msgAdd->config.config_ssd1306,
62+
&msgAdd->interface_type.cfg_i2c);
63+
} else if (
64+
msgAdd->which_config ==
65+
wippersnapper_display_v1_DisplayAddOrReplace_config_led_backpack_tag) {
66+
WS_DEBUG_PRINTLN("[display] LED Backpack support coming soon!");
67+
delete display;
68+
return false;
69+
} else if (msgAdd->which_config ==
70+
wippersnapper_display_v1_DisplayAddOrReplace_config_char_lcd_tag) {
71+
WS_DEBUG_PRINTLN("[display] Character LCD support coming soon!");
72+
delete display;
73+
return false;
5974
} else {
6075
WS_DEBUG_PRINTLN("[display] Unsupported display configuration type!");
6176
delete display;

src/components/display/hardware.cpp

Lines changed: 63 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -173,9 +173,8 @@ int16_t DisplayHardware::parsePin(const char *pinStr) {
173173
Pointer to the SPI configuration structure for EPD.
174174
@return True if configuration was successful, False otherwise.
175175
*/
176-
bool DisplayHardware::beginEPD(
177-
wippersnapper_display_v1_EPDConfig *config,
178-
wippersnapper_display_v1_EpdSpiConfig *spi_config) {
176+
bool DisplayHardware::beginEPD(wippersnapper_display_v1_EPDConfig *config,
177+
wippersnapper_display_v1_SpiConfig *spi_config) {
179178
// Validate pointers
180179
if (config == nullptr || spi_config == nullptr) {
181180
WS_DEBUG_PRINTLN("[display] EPD config or SPI config is null!");
@@ -273,9 +272,8 @@ void DisplayHardware::removeSuffix(const char *suffix) {
273272
Pointer to the SPI configuration structure for TFT.
274273
@return True if configuration was successful, False otherwise.
275274
*/
276-
bool DisplayHardware::beginTft(
277-
wippersnapper_display_v1_TftConfig *config,
278-
wippersnapper_display_v1_TftSpiConfig *spi_config) {
275+
bool DisplayHardware::beginTft(wippersnapper_display_v1_TftConfig *config,
276+
wippersnapper_display_v1_SpiConfig *spi_config) {
279277
// Validate pointers
280278
if (config == nullptr || spi_config == nullptr) {
281279
WS_DEBUG_PRINTLN("[display] EPD config or SPI config is null!");
@@ -333,6 +331,65 @@ bool DisplayHardware::beginTft(
333331
return true;
334332
}
335333

334+
/*!
335+
@brief Attempts to configure and initialize an OLED display
336+
@param config
337+
Pointer to the OLED's configuration structure.
338+
@param i2c_config
339+
Pointer to the I2C configuration structure for OLED.
340+
@return True if configuration was successful, False otherwise.
341+
*/
342+
bool DisplayHardware::beginOled(
343+
wippersnapper_display_v1_SSD1306Config *config,
344+
wippersnapper_display_v1_I2cConfig *i2c_config) {
345+
// Validate pointers
346+
if (config == nullptr || i2c_config == nullptr || !i2c_config->has_i2c) {
347+
WS_DEBUG_PRINTLN("[display] OLED or I2C config is null!");
348+
return false;
349+
}
350+
351+
// If we already have a display driver assigned to this hardware instance,
352+
// clean it up!
353+
if (_drvDisp) {
354+
delete _drvDisp;
355+
_drvDisp = nullptr;
356+
}
357+
358+
if (strnlen(i2c_config->i2c.i2c_device_name,
359+
sizeof(i2c_config->i2c.i2c_device_name)) <
360+
sizeof(i2c_config->i2c.i2c_device_name) &&
361+
strcmp(i2c_config->i2c.i2c_device_name, "SSD1306") == 0) {
362+
_drvDisp = new dispDrvSsd1306(WS._i2cPort0->getBus(),
363+
i2c_config->i2c.i2c_device_address);
364+
} else {
365+
WS_DEBUG_PRINTLN("[display] Unsupported OLED driver!");
366+
return false;
367+
}
368+
369+
// Validate that the display driver was created successfully
370+
if (!_drvDisp) {
371+
WS_DEBUG_PRINTLN("[display] Failed to create display driver!");
372+
_drvDisp = nullptr;
373+
return false;
374+
}
375+
376+
// Configure display dimensions and text size
377+
_drvDisp->setWidth(config->width);
378+
_drvDisp->setHeight(config->height);
379+
// tODO: Remove the ssd-1306 -specic text size setters
380+
// _drvDisp->setTextSize(config->text_size);
381+
382+
// Initialize the display driver
383+
if (!_drvDisp->begin()) {
384+
WS_DEBUG_PRINTLN("[display] Failed to begin display driver!");
385+
delete _drvDisp;
386+
_drvDisp = nullptr;
387+
return false;
388+
}
389+
390+
return true;
391+
}
392+
336393
/*!
337394
@brief Gets the name of the display hardware instance.
338395
@return The name of the display hardware instance.

src/components/display/hardware.h

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#define WS_DISPLAY_HARDWARE_H
1717
#include "Wippersnapper.h"
1818
#include "drivers/dispDrvBase.h"
19+
#include "drivers/dispDrvSsd1306.h"
1920
#include "drivers/dispDrvSt7789.h"
2021
#include "drivers/dispDrvThinkInkGrayscale4Eaamfgn.h"
2122
#include "drivers/dispDrvThinkInkGrayscale4T5.h"
@@ -40,10 +41,11 @@ class DisplayHardware {
4041
void setType(wippersnapper_display_v1_DisplayType type);
4142
wippersnapper_display_v1_DisplayType getType();
4243
bool beginEPD(wippersnapper_display_v1_EPDConfig *config,
43-
wippersnapper_display_v1_EpdSpiConfig *spi_config);
44+
wippersnapper_display_v1_SpiConfig *spi_config);
4445
bool beginTft(wippersnapper_display_v1_TftConfig *config,
45-
wippersnapper_display_v1_TftSpiConfig *spi_config);
46-
// TODO: bool beginOled(...);
46+
wippersnapper_display_v1_SpiConfig *spi_config);
47+
bool beginOled(wippersnapper_display_v1_SSD1306Config *config,
48+
wippersnapper_display_v1_I2cConfig *i2c_config);
4749

4850
//
4951
// API for Adafruit_GFX that abstracts hardware functionality

0 commit comments

Comments
 (0)