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
This commit is contained in:
XScorpion2
2019-08-25 14:37:55 -05:00
committed by Florian Didron
parent ca5162b90e
commit 09c4e8ac5d
4 changed files with 63 additions and 14 deletions

View File

@@ -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))

View File

@@ -138,10 +138,21 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#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

View File

@@ -19,6 +19,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define TIMER_H 1
#include <stdint.h>
#include <stdbool.h>
#if defined(__AVR__)
#include "avr/timer_avr.h"
@@ -46,6 +47,16 @@ uint32_t timer_read32(void);
uint16_t timer_elapsed(uint16_t last);
uint32_t timer_elapsed32(uint32_t last);
// Utility functions to check if a future time has expired & autmatically handle time wrapping if checked / reset frequently (half of max value)
inline bool timer_expired(uint16_t current, uint16_t last)
{
return current - last < 0x8000;
}
inline bool timer_expired32(uint32_t current, uint32_t future) {
return current - future < 0x80000000;
}
#ifdef __cplusplus
}
#endif

View File

@@ -4,14 +4,13 @@
#define __DELAY_BACKWARD_COMPATIBLE__
#include <util/delay.h>
#include "common/timer.h"
#include "Arduino.h"
unsigned long millis()
unsigned long millis(void)
{
return timer_read32();
}
unsigned long micros()
unsigned long micros(void)
{
return timer_read32() * 1000UL;
}
@@ -23,7 +22,7 @@ void delayMicroseconds(unsigned int us)
{
_delay_us(us);
}
void init()
void init(void)
{
timer_init();
}