diff --git a/release-notes.yml b/release-notes.yml index 1dc5fc34..14752607 100644 --- a/release-notes.yml +++ b/release-notes.yml @@ -368,6 +368,21 @@ releases: breaking_changes: - "Saved settings move to the new `prefs.json` format on first boot; downgrading to earlier firmware afterwards reverts the device to the old (pre-migration) settings file." + - track: observer-eastmesh + version: "2026.8.1" + tag: "observer-eastmesh-v2026.8.1" + date: "2026-08-09" + previous_version: "2026.8.0" + summary: "Hardens T-Beam S3 Supreme display bring-up so a failed boot-time OLED probe can no longer crash-loop the node." + changes: + - type: fixed + area: board + text: "Restored the proven T-Beam S3 Supreme SH1106 bring-up order (initialise the display before probing the bus, which can NAK cold probes on this board) so the OLED reliably comes up at boot." + - type: fixed + area: board + text: "Made a failed or absent SH1106 display boot the node headless instead of crash-looping: display operations are now safe no-ops when the boot-time initialisation did not succeed." + breaking_changes: [] + - track: observer-eastmesh-bridge-espnow version: "2026.5.1" tag: "observer-eastmesh-bridge-espnow-v2026.5.1" @@ -597,3 +612,18 @@ releases: text: "Fixed the web panel refusing connections (browser `PR_CONNECT_RESET_ERROR`) after long uptimes by evicting stale keep-alive connections instead of letting vanished clients permanently occupy the connection pool." breaking_changes: - "Saved settings move to the new `prefs.json` format on first boot; downgrading to earlier firmware afterwards reverts the device to the old (pre-migration) settings file." + + - track: observer-eastmesh-bridge-espnow + version: "2026.8.1" + tag: "observer-eastmesh-bridge-espnow-v2026.8.1" + date: "2026-08-09" + previous_version: "2026.8.0" + summary: "Hardens T-Beam S3 Supreme display bring-up so a failed boot-time OLED probe can no longer crash-loop the node." + changes: + - type: fixed + area: board + text: "Restored the proven T-Beam S3 Supreme SH1106 bring-up order (initialise the display before probing the bus, which can NAK cold probes on this board) so the OLED reliably comes up at boot." + - type: fixed + area: board + text: "Made a failed or absent SH1106 display boot the node headless instead of crash-looping: display operations are now safe no-ops when the boot-time initialisation did not succeed." + breaking_changes: [] diff --git a/src/helpers/ui/SH1106Display.cpp b/src/helpers/ui/SH1106Display.cpp index e7b15ebf..81809349 100644 --- a/src/helpers/ui/SH1106Display.cpp +++ b/src/helpers/ui/SH1106Display.cpp @@ -23,29 +23,39 @@ ColorVal UIColor::corp_blue = SH110X_WHITE; bool SH1106Display::begin() { #if defined(ESP32) && defined(TBEAM_SUPREME_SX1262) && defined(PIN_BOARD_SDA) && defined(PIN_BOARD_SCL) + // The S3 Supreme OLED bus NAKs cold address probes on some boards, so run the + // Adafruit init (with its reset sequence) first, then settle the bus before + // verifying the display responds. + _began = display.begin(DISPLAY_ADDRESS, true); Wire.begin(PIN_BOARD_SDA, PIN_BOARD_SCL); Wire.setClock(100000); -#endif + _began = _began && i2c_probe(Wire, DISPLAY_ADDRESS); +#else // Wire must already be initialised by board.begin() before this is called. // Boards with non-standard SH1106 addresses should define DISPLAY_ADDRESS // in their variant/platformio configuration. - return i2c_probe(Wire, DISPLAY_ADDRESS) && display.begin(DISPLAY_ADDRESS, true); + _began = i2c_probe(Wire, DISPLAY_ADDRESS) && display.begin(DISPLAY_ADDRESS, true); +#endif + return _began; } void SH1106Display::turnOn() { + if (!_began) return; // display.begin() never ran; oled_command would crash on a null bus device display.oled_command(SH110X_DISPLAYON); _isOn = true; } void SH1106Display::turnOff() { + if (!_began) return; display.oled_command(SH110X_DISPLAYOFF); _isOn = false; } void SH1106Display::clear() { + if (!_began) return; display.clearDisplay(); display.display(); } diff --git a/src/helpers/ui/SH1106Display.h b/src/helpers/ui/SH1106Display.h index 4e269d5e..417dab99 100644 --- a/src/helpers/ui/SH1106Display.h +++ b/src/helpers/ui/SH1106Display.h @@ -18,12 +18,13 @@ class SH1106Display : public DisplayDriver { Adafruit_SH1106G display; bool _isOn; + bool _began; uint8_t _color; bool i2c_probe(TwoWire &wire, uint8_t addr); public: - SH1106Display() : DisplayDriver(128, 64), display(128, 64, &Wire, PIN_OLED_RESET) { _isOn = false; } + SH1106Display() : DisplayDriver(128, 64), display(128, 64, &Wire, PIN_OLED_RESET) { _isOn = false; _began = false; } bool begin(); bool isOn() override { return _isOn; }