From a0c98997afa91c47d0312b3404afb7dc5495ad12 Mon Sep 17 00:00:00 2001 From: XScorpion2 Date: Sun, 25 Aug 2019 14:37:55 -0500 Subject: Added OLED Display autoscroll during periods of OLED data inactivity (#6546) * Added OLED Display autoscroll during periods of OLED data inactivity. * Fixing compile errors * Feedback from review --- drivers/oled/oled_driver.c | 40 ++++++++++++++++++++++++++++++++++------ drivers/oled/oled_driver.h | 19 +++++++++++++++---- 2 files changed, 49 insertions(+), 10 deletions(-) (limited to 'drivers/oled') diff --git a/drivers/oled/oled_driver.c b/drivers/oled/oled_driver.c index 2d049963e6..d274a9d120 100644 --- a/drivers/oled/oled_driver.c +++ b/drivers/oled/oled_driver.c @@ -114,8 +114,11 @@ bool oled_active = false; bool oled_scrolling = false; uint8_t oled_rotation = 0; uint8_t oled_rotation_width = 0; -#if !defined(OLED_DISABLE_TIMEOUT) - uint16_t oled_last_activity; +#if OLED_TIMEOUT > 0 + uint32_t oled_timeout; +#endif +#if OLED_SCROLL_TIMEOUT > 0 + uint32_t oled_scroll_timeout; #endif // Internal variables to reduce math instructions @@ -209,6 +212,13 @@ bool oled_init(uint8_t rotation) { return false; } +#if OLED_TIMEOUT > 0 + oled_timeout = timer_read32() + OLED_TIMEOUT; +#endif +#if OLED_SCROLL_TIMEOUT > 0 + oled_scroll_timeout = timer_read32() + OLED_SCROLL_TIMEOUT; +#endif + oled_clear(); oled_initialized = true; oled_active = true; @@ -454,8 +464,8 @@ void oled_write_ln_P(const char *data, bool invert) { #endif // defined(__AVR__) bool oled_on(void) { -#if !defined(OLED_DISABLE_TIMEOUT) - oled_last_activity = timer_read(); +#if OLED_TIMEOUT > 0 + oled_timeout = timer_read32() + OLED_TIMEOUT; #endif static const uint8_t PROGMEM display_on[] = { I2C_CMD, DISPLAY_ON }; @@ -519,6 +529,7 @@ bool oled_scroll_off(void) { return oled_scrolling; } oled_scrolling = false; + oled_dirty = -1; } return !oled_scrolling; } @@ -546,15 +557,32 @@ void oled_task(void) { oled_task_user(); +#if OLED_SCROLL_TIMEOUT > 0 + if (oled_dirty && oled_scrolling) { + oled_scroll_timeout = timer_read32() + OLED_SCROLL_TIMEOUT; + oled_scroll_off(); + } +#endif + // Smart render system, no need to check for dirty oled_render(); // Display timeout check -#if !defined(OLED_DISABLE_TIMEOUT) - if (oled_active && timer_elapsed(oled_last_activity) > OLED_TIMEOUT) { +#if OLED_TIMEOUT > 0 + if (oled_active && timer_expired32(timer_read32(), oled_timeout)) { oled_off(); } #endif + +#if OLED_SCROLL_TIMEOUT > 0 + if (!oled_scrolling && timer_expired32(timer_read32(), oled_scroll_timeout)) { +#ifdef OLED_SCROLL_TIMEOUT_RIGHT + oled_scroll_right(); +#else + oled_scroll_left(); +#endif + } +#endif } __attribute__((weak)) diff --git a/drivers/oled/oled_driver.h b/drivers/oled/oled_driver.h index 59cb4a0b2e..9c6384edce 100644 --- a/drivers/oled/oled_driver.h +++ b/drivers/oled/oled_driver.h @@ -138,10 +138,21 @@ along with this program. If not, see . #define OLED_FONT_HEIGHT 8 #endif -#define OLED_ROTATION_0 0x00 -#define OLED_ROTATION_90 0x01 -#define OLED_ROTATION_180 0x02 -#define OLED_ROTATION_270 0x03 +#if !defined(OLED_TIMEOUT) + #if defined(OLED_DISABLE_TIMEOUT) + #define OLED_TIMEOUT 0 + #else + #define OLED_TIMEOUT 60000 + #endif +#endif + +// OLED Rotation enum values are flags +typedef enum { + OLED_ROTATION_0 = 0, + OLED_ROTATION_90 = 1, + OLED_ROTATION_180 = 2, + OLED_ROTATION_270 = 3, // OLED_ROTATION_90 | OLED_ROTATION_180 +} oled_rotation_t; // Initialize the oled display, rotating the rendered output based on the define passed in. // Returns true if the OLED was initialized successfully -- cgit v1.2.3