summary refs log tree commit diff
diff options
context:
space:
mode:
authorBarabas <barabas.raffai@gmail.com>2021-05-08 11:27:13 +0100
committerGitHub <noreply@github.com>2021-05-08 12:27:13 +0200
commitfca7cc1747642d077898e301945df86bfdea0784 (patch)
tree627ca5164421d41ee21698ec803767ef826c56d2
parent992b146bc4d761d2ff81222b7c750caded640711 (diff)
Added OLED fade out support (#12086)
-rw-r--r--docs/feature_oled_driver.md2
-rw-r--r--drivers/oled/oled_driver.c21
-rw-r--r--drivers/oled/oled_driver.h8
3 files changed, 29 insertions, 2 deletions
diff --git a/docs/feature_oled_driver.md b/docs/feature_oled_driver.md
index 44202487f1..d2dc6103a6 100644
--- a/docs/feature_oled_driver.md
+++ b/docs/feature_oled_driver.md
@@ -145,6 +145,8 @@ void oled_task_user(void) {
 |`OLED_FONT_WIDTH`          |`6`              |The font width                                                                                                            |
 |`OLED_FONT_HEIGHT`         |`8`              |The font height (untested)                                                                                                |
 |`OLED_TIMEOUT`             |`60000`          |Turns off the OLED screen after 60000ms of keyboard inactivity. Helps reduce OLED Burn-in. Set to 0 to disable.           |
+|`OLED_FADE_OUT`            |*Not defined*    |Enables fade out animation. Use together with `OLED_TIMEOUT`.                                                             |
+|`OLED_FADE_OUT_INTERVAL`   |`0`              |The speed of fade out animation, from 0 to 15. Larger values are slower.                                                  |
 |`OLED_SCROLL_TIMEOUT`      |`0`              |Scrolls the OLED screen after 0ms of OLED inactivity. Helps reduce OLED Burn-in. Set to 0 to disable.                     |
 |`OLED_SCROLL_TIMEOUT_RIGHT`|*Not defined*    |Scroll timeout direction is right when defined, left when undefined.                                                      |
 |`OLED_IC`                  |`OLED_IC_SSD1306`|Set to `OLED_IC_SH1106` if you're using the SH1106 OLED controller.                                                       |
diff --git a/drivers/oled/oled_driver.c b/drivers/oled/oled_driver.c
index 6c1238cd6f..082115d534 100644
--- a/drivers/oled/oled_driver.c
+++ b/drivers/oled/oled_driver.c
@@ -73,6 +73,11 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #define PRE_CHARGE_PERIOD 0xD9
 #define VCOM_DETECT 0xDB
 
+// Advance Graphic Commands
+#define FADE_BLINK 0x23
+#define ENABLE_FADE 0x20
+#define ENABLE_BLINK 0x30
+
 // Charge Pump Commands
 #define CHARGE_PUMP 0x8D
 
@@ -547,7 +552,13 @@ bool oled_on(void) {
     oled_timeout = timer_read32() + OLED_TIMEOUT;
 #endif
 
-    static const uint8_t PROGMEM display_on[] = {I2C_CMD, DISPLAY_ON};
+    static const uint8_t PROGMEM display_on[] =
+#ifdef OLED_FADE_OUT
+        {I2C_CMD, FADE_BLINK, 0x00};
+#else
+        {I2C_CMD, DISPLAY_ON};
+#endif
+
     if (!oled_active) {
         if (I2C_TRANSMIT_P(display_on) != I2C_STATUS_SUCCESS) {
             print("oled_on cmd failed\n");
@@ -563,7 +574,13 @@ bool oled_off(void) {
         return !oled_active;
     }
 
-    static const uint8_t PROGMEM display_off[] = {I2C_CMD, DISPLAY_OFF};
+    static const uint8_t PROGMEM display_off[] =
+#ifdef OLED_FADE_OUT
+        {I2C_CMD, FADE_BLINK, ENABLE_FADE | OLED_FADE_OUT_INTERVAL};
+#else
+        {I2C_CMD, DISPLAY_OFF};
+#endif
+
     if (oled_active) {
         if (I2C_TRANSMIT_P(display_off) != I2C_STATUS_SUCCESS) {
             print("oled_off cmd failed\n");
diff --git a/drivers/oled/oled_driver.h b/drivers/oled/oled_driver.h
index 00896f01c2..cbf5380ee0 100644
--- a/drivers/oled/oled_driver.h
+++ b/drivers/oled/oled_driver.h
@@ -154,6 +154,14 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #    endif
 #endif
 
+#if !defined(OLED_FADE_OUT_INTERVAL)
+#    define OLED_FADE_OUT_INTERVAL 0x00
+#endif
+
+#if OLED_FADE_OUT_INTERVAL > 0x0F || OLED_FADE_OUT_INTERVAL < 0x00
+#    error OLED_FADE_OUT_INTERVAL must be between 0x00 and 0x0F
+#endif
+
 #if !defined(OLED_I2C_TIMEOUT)
 #    define OLED_I2C_TIMEOUT 100
 #endif