浏览代码

Add oled_invert (#13172)

Co-authored-by: Drashna Jaelre <drashna@live.com>
Ignaz Kevenaar 4 年之前
父节点
当前提交
0311c8036d
共有 3 个文件被更改,包括 34 次插入0 次删除
  1. 4 0
      docs/feature_oled_driver.md
  2. 26 0
      drivers/oled/oled_driver.c
  3. 4 0
      drivers/oled/oled_driver.h

+ 4 - 0
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);
 

+ 26 - 0
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;

+ 4 - 0
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);