@@ -54,6 +54,9 @@ bool DisplayHardware::begin(ws_display_Add *addMsg) {
5454 return beginSpiEpd (addMsg);
5555 case ws_display_Add_ttl_rgb666_tag:
5656 return beginTtlRgb666 (addMsg);
57+ // DSI + i8080 todo
58+ case ws_display_Add_i2c_tag:
59+ return beginI2cDisplay (addMsg);
5760 default :
5861 WS_DEBUG_PRINTLN (
5962 " [display] ERROR: Unsupported display interface type!" );
@@ -359,6 +362,94 @@ bool DisplayHardware::beginTtlRgb666(ws_display_Add *msg) {
359362#endif
360363}
361364
365+ // ---------------------------------------------------------------------------
366+ // I2C display initialization (OLED, CharLCD, LED backpack, etc.)
367+ // ---------------------------------------------------------------------------
368+ bool DisplayHardware::beginI2cDisplay (ws_display_Add *msg) {
369+ if (msg->which_interface_type != ws_display_Add_i2c_tag) {
370+ WS_DEBUG_PRINTLN (" [display] ERROR: Expected I2C interface for I2C display!" );
371+ return false ;
372+ }
373+ ws_display_I2cDisplayConfig *i2c_cfg = &msg->interface_type .i2c ;
374+ uint16_t addr = (uint16_t )i2c_cfg->device_address ;
375+
376+ if (_drvDisp) {
377+ delete _drvDisp;
378+ _drvDisp = nullptr ;
379+ }
380+
381+ WS_DEBUG_PRINT (" [display] I2C driver: " );
382+ WS_DEBUG_PRINT (msg->driver );
383+ WS_DEBUG_PRINT (" addr: 0x" );
384+ WS_DEBUG_PRINTLN (addr, HEX);
385+
386+ // Get the initialized I2C bus from the I2C controller
387+ if (!Ws._i2c_controller ->IsBusStatusOK ()) {
388+ WS_DEBUG_PRINTLN (" [display] ERROR: I2C bus not initialized!" );
389+ return false ;
390+ }
391+ TwoWire *i2c = Ws._i2c_controller ->GetI2cBus ();
392+
393+ // Create the appropriate I2C output driver based on driver string
394+ drvOutputBase *drv = nullptr ;
395+ if (strcasecmp (msg->driver , " SSD1306" ) == 0 ) {
396+ drv = new drvOutSsd1306 (i2c, addr, 0 , msg->driver );
397+ } else if (strcasecmp (msg->driver , " SH1107" ) == 0 ) {
398+ drv = new drvOutSh1107 (i2c, addr, 0 , msg->driver );
399+ } else if (strcasecmp (msg->driver , " charlcd" ) == 0 ) {
400+ drv = new drvOutCharLcd (i2c, addr, 0 , msg->driver );
401+ } else if (strcasecmp (msg->driver , " 7seg" ) == 0 ) {
402+ drv = new drvOut7Seg (i2c, addr, 0 , msg->driver );
403+ } else if (strcasecmp (msg->driver , " quadalphanum" ) == 0 ) {
404+ drv = new drvOutQuadAlphaNum (i2c, addr, 0 , msg->driver );
405+ } else {
406+ WS_DEBUG_PRINT (" [display] ERROR: Unsupported I2C display driver: " );
407+ WS_DEBUG_PRINTLN (msg->driver );
408+ return false ;
409+ }
410+
411+ // Configure based on config type
412+ pb_size_t config = msg->which_config ;
413+ WS_DEBUG_PRINT (" [display] I2C config tag: " );
414+ WS_DEBUG_PRINTLN (config);
415+ if (config == ws_display_Add_config_oled_tag) {
416+ ws_display_OledConfig *cfg = &msg->config .config_oled ;
417+ WS_DEBUG_PRINT (" [display] OLED config: " );
418+ WS_DEBUG_PRINT (cfg->width );
419+ WS_DEBUG_PRINT (" x" );
420+ WS_DEBUG_PRINTLN (cfg->height );
421+ drv->ConfigureSSD1306 (cfg->width , cfg->height ,
422+ cfg->font_size > 0 ? cfg->font_size : 1 );
423+ } else if (config == ws_display_Add_config_char_lcd_tag) {
424+ ws_display_CharLcdConfig *cfg = &msg->config .config_char_lcd ;
425+ drv->ConfigureCharLcd (cfg->rows , cfg->columns , true );
426+ } else if (config == ws_display_Add_config_led_tag) {
427+ ws_display_LedBackpackConfig *cfg = &msg->config .config_led ;
428+ drv->ConfigureI2CBackpack (cfg->brightness , cfg->alignment );
429+ } else {
430+ // No matching config — for OLEDs, apply safe defaults to prevent
431+ // crash from uninitialized width/height in drvOutSsd1306::begin()
432+ WS_DEBUG_PRINTLN (" [display] WARNING: No config for I2C display, "
433+ " applying defaults" );
434+ if (strcasecmp (msg->driver , " SSD1306" ) == 0 ) {
435+ drv->ConfigureSSD1306 (128 , 32 , 1 );
436+ } else if (strcasecmp (msg->driver , " SH1107" ) == 0 ) {
437+ drv->ConfigureSSD1306 (128 , 64 , 1 );
438+ }
439+ }
440+
441+ WS_DEBUG_PRINTLN (" [display] Calling I2C driver begin()..." );
442+ if (!drv->begin ()) {
443+ WS_DEBUG_PRINTLN (" [display] ERROR: Failed to begin I2C display driver!" );
444+ delete drv;
445+ return false ;
446+ }
447+
448+ _drvDisp = new dispDrvI2cAdapter (drv);
449+ WS_DEBUG_PRINTLN (" [display] I2C display initialized successfully!" );
450+ return true ;
451+ }
452+
362453void DisplayHardware::showSplash () {
363454 if (_drvDisp)
364455 _drvDisp->showSplash ();
0 commit comments