Defensive code for Heltec Display (#1296)

Added to Heltec board display code logic to reduce corruption of messages on the display

Two piece of defensive code were added

- Only display messages to the display when operating on Core 1 ( Default Arduino ESP32 CONFIG_ARDUINO_RUNNING_CORE )

- Only display one character/string at a time

In the event of failure, default to Serial output.

PS SSD1306 driver similar issues

https://github.com/ThingPulse/esp8266-oled-ssd1306/issues/326
https://github.com/ThingPulse/esp8266-oled-ssd1306/issues/352
This commit is contained in:
Northern Man authored and GitHub committed 2022-10-23 13:36:59 -05:00
1 parent 941b1e109f
commit 19d58e01e0
2 files changed
+28 -22

No files matched your search

+22 -21
View File
@@ -32,7 +32,8 @@
#if defined(ZboardHELTEC)
# include "ArduinoLog.h"
# include "config_HELTEC.h"
// # include "heltec.h"
SemaphoreHandle_t semaphoreOLEDOperation;
void logToLCD(bool display) {
display ? Log.begin(LOG_LEVEL_LCD, &Oled) : Log.begin(LOG_LEVEL, &Serial); // Log on LCD following LOG_LEVEL_LCD
@@ -125,6 +126,10 @@ OledSerial::OledSerial(int x) {
void OledSerial::begin() {
// Heltec.begin(); // User OMG serial support
semaphoreOLEDOperation = xSemaphoreCreateBinary();
xSemaphoreGive(semaphoreOLEDOperation);
display->init();
display->flipScreenVertically();
display->setFont(ArialMT_Plain_10);
@@ -157,28 +162,24 @@ void OledSerial::fillScreen(OLEDDISPLAY_COLOR color) {
display->fillRect(0, 0, OLED_WIDTH, OLED_HEIGHT);
}
size_t OledSerial::write(uint8_t c) {
display->clear();
display->setColor(WHITE);
display->setFont(ArialMT_Plain_10);
display->write((char)c);
display->drawLogBuffer(0, 0);
display->display();
return 1;
}
size_t OledSerial::write(const uint8_t* buffer, size_t size) {
display->clear();
display->setColor(WHITE);
display->setFont(ArialMT_Plain_10);
while (size) {
display->write((char)*buffer++);
size--;
if (xPortGetCoreID() == CONFIG_ARDUINO_RUNNING_CORE) {
if (xSemaphoreTake(semaphoreOLEDOperation, pdMS_TO_TICKS(30000)) == pdTRUE) {
display->clear();
display->setColor(WHITE);
display->setFont(ArialMT_Plain_10);
while (size) {
display->write((char)*buffer++);
size--;
}
display->drawLogBuffer(0, 0);
display->display();
xSemaphoreGive(semaphoreOLEDOperation);
return size;
}
}
display->drawLogBuffer(0, 0);
display->display();
return size;
// Default to Serial output if the display is not available
return Serial.write(buffer, size);
}
/*
+6 -1
View File
@@ -87,7 +87,12 @@ public:
void fillScreen(OLEDDISPLAY_COLOR); // fillScreen display and set color
size_t write(uint8_t);
// This is a bit of lazy programmer simplifacation for the semapore and core detecting code. Not sure if it is truly space efficient.
inline size_t write(uint8_t x) {
return write(&x, 1);
}
size_t write(const uint8_t* buffer, size_t size);
inline size_t write(const char* buffer, size_t size) {
return write((uint8_t*)buffer, size);