diff --git a/src/main/drivers/display_ug2864hsweg01.c b/src/main/drivers/display_ug2864hsweg01.c index 055defc09..4481e47c8 100644 --- a/src/main/drivers/display_ug2864hsweg01.c +++ b/src/main/drivers/display_ug2864hsweg01.c @@ -169,14 +169,15 @@ static const uint8_t const multiWiiFont[][5] = { // Refer to "Times New Roman" F }; #define OLED_address 0x3C // OLED at address 0x3C in 7bit -void i2c_OLED_send_cmd(uint8_t command) + +static bool i2c_OLED_send_cmd(uint8_t command) { - i2cWrite(OLED_address, 0x80, command); + return i2cWrite(OLED_address, 0x80, command); } -static void i2c_OLED_send_byte(uint8_t val) +static bool i2c_OLED_send_byte(uint8_t val) { - i2cWrite(OLED_address, 0x40, val); + return i2cWrite(OLED_address, 0x40, val); } void i2c_OLED_clear_display(void) @@ -247,9 +248,14 @@ void i2c_OLED_send_string(const char *string) * according to http://www.adafruit.com/datasheets/UG-2864HSWEG01.pdf Chapter 4.4 Page 15 */ #if 1 -void ug2864hsweg01InitI2C(void) +bool ug2864hsweg01InitI2C(void) { - i2c_OLED_send_cmd(0xAE); // Set display OFF + + // Set display OFF + if (!i2c_OLED_send_cmd(0xAE)) { + return false; + } + i2c_OLED_send_cmd(0xD4); // Set Display Clock Divide Ratio / OSC Frequency i2c_OLED_send_cmd(0x80); // Display Clock Divide Ratio / OSC Frequency i2c_OLED_send_cmd(0xA8); // Set Multiplex Ratio @@ -272,7 +278,10 @@ void ug2864hsweg01InitI2C(void) i2c_OLED_send_cmd(0xA4); // Set all pixels OFF i2c_OLED_send_cmd(0xA6); // Set display not inverted i2c_OLED_send_cmd(0xAF); // Set display On + i2c_OLED_clear_display(); + + return true; } #else void ug2864hsweg01InitI2C(void) diff --git a/src/main/drivers/display_ug2864hsweg01.h b/src/main/drivers/display_ug2864hsweg01.h index b6be41c28..3a51eab7a 100644 --- a/src/main/drivers/display_ug2864hsweg01.h +++ b/src/main/drivers/display_ug2864hsweg01.h @@ -34,7 +34,7 @@ #define VERTICAL_BARGRAPH_ZERO_CHARACTER (128 + 32) #define VERTICAL_BARGRAPH_CHARACTER_COUNT 7 -void ug2864hsweg01InitI2C(void); +bool ug2864hsweg01InitI2C(void); void i2c_OLED_set_xy(uint8_t col, uint8_t row); void i2c_OLED_set_line(uint8_t row); diff --git a/src/main/io/display.c b/src/main/io/display.c index 4f46c60a1..14953c971 100644 --- a/src/main/io/display.c +++ b/src/main/io/display.c @@ -73,6 +73,7 @@ controlRateConfig_t *getControlRateConfig(uint8_t profileIndex); #define PAGE_CYCLE_FREQUENCY (MILLISECONDS_IN_A_SECOND * 5) static uint32_t nextDisplayUpdateAt = 0; +static bool displayPresent = false; static rxConfig_t *rxConfig; @@ -136,7 +137,7 @@ typedef struct pageState_s { static pageState_t pageState; void resetDisplay(void) { - ug2864hsweg01InitI2C(); + displayPresent = ug2864hsweg01InitI2C(); } void LCDprint(uint8_t i) { @@ -211,11 +212,6 @@ void showTitle() void handlePageChange(void) { - // Some OLED displays do not respond on the first initialisation so refresh the display - // when the page changes in the hopes the hardware responds. This also allows the - // user to power off/on the display or connect it while powered. - resetDisplay(); - i2c_OLED_clear_display_quick(); showTitle(); } @@ -533,9 +529,22 @@ void updateDisplay(void) } if (pageState.pageChanging) { - handlePageChange(); pageState.pageFlags &= ~PAGE_STATE_FLAG_FORCE_PAGE_CHANGE; pageState.nextPageAt = now + PAGE_CYCLE_FREQUENCY; + + // Some OLED displays do not respond on the first initialisation so refresh the display + // when the page changes in the hopes the hardware responds. This also allows the + // user to power off/on the display or connect it while powered. + resetDisplay(); + + if (!displayPresent) { + return; + } + handlePageChange(); + } + + if (!displayPresent) { + return; } switch(pageState.pageId) {