summary refs log tree commit diff
diff options
context:
space:
mode:
authorIgnaz Kevenaar <ignazkevenaar@gmail.com>2021-06-18 17:08:22 +0200
committerGitHub <noreply@github.com>2021-06-19 01:08:22 +1000
commit0311c8036d693baf63ed4d3b7badf4257ffd5f46 (patch)
tree90ea79a94aec8b5dcf160a5a323976b6e8dace2e
parent172e6a703041363decd6fc829542f33180c13beb (diff)
Add oled_invert (#13172)
Co-authored-by: Drashna Jaelre <drashna@live.com>
-rw-r--r--docs/feature_oled_driver.md4
-rw-r--r--drivers/oled/oled_driver.c26
-rw-r--r--drivers/oled/oled_driver.h4
3 files changed, 34 insertions, 0 deletions
diff --git a/docs/feature_oled_driver.md b/docs/feature_oled_driver.md
index f3b659b1bc..c90aabb9c6 100644
--- a/docs/feature_oled_driver.md
+++ b/docs/feature_oled_driver.md
@@ -346,6 +346,10 @@ bool oled_scroll_left(void);
 // Returns true if the screen was not scrolling or stops scrolling
 bool oled_scroll_off(void);
 
+// Inverts the display
+// Returns true if the screen was or is inverted
+bool oled_invert(bool invert);
+
 // Returns the maximum number of characters that will fit on a line
 uint8_t oled_max_chars(void);
 
diff --git a/drivers/oled/oled_driver.c b/drivers/oled/oled_driver.c
index 8e5ed5f070..7d41978905 100644
--- a/drivers/oled/oled_driver.c
+++ b/drivers/oled/oled_driver.c
@@ -34,6 +34,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #define DISPLAY_ALL_ON 0xA5
 #define DISPLAY_ALL_ON_RESUME 0xA4
 #define NORMAL_DISPLAY 0xA6
+#define INVERT_DISPLAY 0xA7
 #define DISPLAY_ON 0xAF
 #define DISPLAY_OFF 0xAE
 #define NOP 0xE3
@@ -114,6 +115,7 @@ OLED_BLOCK_TYPE oled_dirty          = 0;
 bool            oled_initialized    = false;
 bool            oled_active         = false;
 bool            oled_scrolling      = false;
+bool            oled_inverted       = false;
 uint8_t         oled_brightness     = OLED_BRIGHTNESS;
 oled_rotation_t oled_rotation       = 0;
 uint8_t         oled_rotation_width = 0;
@@ -690,6 +692,30 @@ bool oled_scroll_off(void) {
     return !oled_scrolling;
 }
 
+bool oled_invert(bool invert) {
+    if (!oled_initialized) {
+        return oled_inverted;
+    }
+
+    if (invert && !oled_inverted) {
+        static const uint8_t PROGMEM display_inverted[] = {I2C_CMD, INVERT_DISPLAY};
+        if (I2C_TRANSMIT_P(display_inverted) != I2C_STATUS_SUCCESS) {
+            print("oled_invert cmd failed\n");
+            return oled_inverted;
+        }
+        oled_inverted = true;
+    } else if (!invert && oled_inverted) {
+        static const uint8_t PROGMEM display_normal[] = {I2C_CMD, NORMAL_DISPLAY};
+        if (I2C_TRANSMIT_P(display_normal) != I2C_STATUS_SUCCESS) {
+            print("oled_invert cmd failed\n");
+            return oled_inverted;
+        }
+        oled_inverted = false;
+    }
+
+    return oled_inverted;
+}
+
 uint8_t oled_max_chars(void) {
     if (!HAS_FLAGS(oled_rotation, OLED_ROTATION_90)) {
         return OLED_DISPLAY_WIDTH / OLED_FONT_WIDTH;
diff --git a/drivers/oled/oled_driver.h b/drivers/oled/oled_driver.h
index a6b85f37e6..fc68f0ec95 100644
--- a/drivers/oled/oled_driver.h
+++ b/drivers/oled/oled_driver.h
@@ -313,6 +313,10 @@ bool oled_scroll_left(void);
 // Returns true if the screen was not scrolling or stops scrolling
 bool oled_scroll_off(void);
 
+// Inverts the display
+// Returns true if the screen was or is inverted
+bool oled_invert(bool invert);
+
 // Returns the maximum number of characters that will fit on a line
 uint8_t oled_max_chars(void);