diff options
| author | Ryan Caltabiano <rcalt2vt@gmail.com> | 2019-04-16 18:36:55 -0500 |
|---|---|---|
| committer | skullydazed <skullydazed@users.noreply.github.com> | 2019-04-20 08:05:10 -0700 |
| commit | dd3a813f871b911012da55a499955307c309a7a5 (patch) | |
| tree | 80df58d039a9b20283057809925a2351121135d5 /drivers/oled | |
| parent | 0a645225b9c863a106921185a6c2e0c340f10694 (diff) | |
| download | qmk_firmware-dd3a813f871b911012da55a499955307c309a7a5.tar.gz qmk_firmware-dd3a813f871b911012da55a499955307c309a7a5.zip | |
Reducing size of data send in one frame & update Zen rev2 oled usage
Diffstat (limited to 'drivers/oled')
| -rw-r--r-- | drivers/oled/oled_driver.c | 7 | ||||
| -rw-r--r-- | drivers/oled/oled_driver.h | 43 |
2 files changed, 31 insertions, 19 deletions
diff --git a/drivers/oled/oled_driver.c b/drivers/oled/oled_driver.c index aa025d7a4..96ea58ccb 100644 --- a/drivers/oled/oled_driver.c +++ b/drivers/oled/oled_driver.c | |||
| @@ -203,7 +203,7 @@ bool oled_init(uint8_t rotation) { | |||
| 203 | } | 203 | } |
| 204 | 204 | ||
| 205 | __attribute__((weak)) | 205 | __attribute__((weak)) |
| 206 | uint8_t oled_init_user(uint8_t rotation) { | 206 | oled_rotation_t oled_init_user(oled_rotation_t rotation) { |
| 207 | return rotation; | 207 | return rotation; |
| 208 | } | 208 | } |
| 209 | 209 | ||
| @@ -384,7 +384,10 @@ void oled_write_char(const char data, bool invert) { | |||
| 384 | 384 | ||
| 385 | // Dirty check | 385 | // Dirty check |
| 386 | if (memcmp(&oled_temp_buffer, oled_cursor, OLED_FONT_WIDTH)) { | 386 | if (memcmp(&oled_temp_buffer, oled_cursor, OLED_FONT_WIDTH)) { |
| 387 | oled_dirty |= (1 << ((oled_cursor - &oled_buffer[0]) / OLED_BLOCK_SIZE)); | 387 | uint16_t index = oled_cursor - &oled_buffer[0]; |
| 388 | oled_dirty |= (1 << (index / OLED_BLOCK_SIZE)); | ||
| 389 | // Edgecase check if the written data spans the 2 chunks | ||
| 390 | oled_dirty |= (1 << ((index + OLED_FONT_WIDTH) / OLED_BLOCK_SIZE)); | ||
| 388 | } | 391 | } |
| 389 | 392 | ||
| 390 | // Finally move to the next char | 393 | // Finally move to the next char |
diff --git a/drivers/oled/oled_driver.h b/drivers/oled/oled_driver.h index 1ca31df11..ec07f1d9b 100644 --- a/drivers/oled/oled_driver.h +++ b/drivers/oled/oled_driver.h | |||
| @@ -27,14 +27,17 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
| 27 | #define OLED_DISPLAY_WIDTH 128 | 27 | #define OLED_DISPLAY_WIDTH 128 |
| 28 | #define OLED_DISPLAY_HEIGHT 64 | 28 | #define OLED_DISPLAY_HEIGHT 64 |
| 29 | #define OLED_MATRIX_SIZE (OLED_DISPLAY_HEIGHT / 8 * OLED_DISPLAY_WIDTH) // 1024 (compile time mathed) | 29 | #define OLED_MATRIX_SIZE (OLED_DISPLAY_HEIGHT / 8 * OLED_DISPLAY_WIDTH) // 1024 (compile time mathed) |
| 30 | #define OLED_BLOCK_TYPE uint16_t | 30 | #define OLED_BLOCK_TYPE uint32_t |
| 31 | #define OLED_BLOCK_COUNT (sizeof(OLED_BLOCK_TYPE) * 8) // 16 (compile time mathed) | 31 | #define OLED_BLOCK_COUNT (sizeof(OLED_BLOCK_TYPE) * 8) // 32 (compile time mathed) |
| 32 | #define OLED_BLOCK_SIZE (OLED_MATRIX_SIZE / OLED_BLOCK_COUNT) // 64 (compile time mathed) | 32 | #define OLED_BLOCK_SIZE (OLED_MATRIX_SIZE / OLED_BLOCK_COUNT) // 32 (compile time mathed) |
| 33 | 33 | ||
| 34 | // For 90 degree rotation, we map our internal matrix to oled matrix using fixed arrays | 34 | // For 90 degree rotation, we map our internal matrix to oled matrix using fixed arrays |
| 35 | // The OLED writes to it's memory horizontally, starting top left, but our memory starts bottom left in this mode | 35 | // The OLED writes to it's memory horizontally, starting top left, but our memory starts bottom left in this mode |
| 36 | #define OLED_SOURCE_MAP { 0, 8, 16, 24, 32, 40, 48, 56 } | 36 | #define OLED_SOURCE_MAP { 32, 40, 48, 56 } |
| 37 | #define OLED_TARGET_MAP { 56, 48, 40, 32, 24, 16, 8, 0 } | 37 | #define OLED_TARGET_MAP { 24, 16, 8, 0 } |
| 38 | // If OLED_BLOCK_TYPE is uint16_t, these tables would look like: | ||
| 39 | // #define OLED_SOURCE_MAP { 0, 8, 16, 24, 32, 40, 48, 56 } | ||
| 40 | // #define OLED_TARGET_MAP { 56, 48, 40, 32, 24, 16, 8, 0 } | ||
| 38 | // If OLED_BLOCK_TYPE is uint8_t, these tables would look like: | 41 | // If OLED_BLOCK_TYPE is uint8_t, these tables would look like: |
| 39 | // #define OLED_SOURCE_MAP { 0, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120 } | 42 | // #define OLED_SOURCE_MAP { 0, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120 } |
| 40 | // #define OLED_TARGET_MAP { 56, 120, 48, 112, 40, 104, 32, 96, 24, 88, 16, 80, 8, 72, 0, 64 } | 43 | // #define OLED_TARGET_MAP { 56, 120, 48, 112, 40, 104, 32, 96, 24, 88, 16, 80, 8, 72, 0, 64 } |
| @@ -43,14 +46,17 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
| 43 | #define OLED_DISPLAY_WIDTH 128 | 46 | #define OLED_DISPLAY_WIDTH 128 |
| 44 | #define OLED_DISPLAY_HEIGHT 32 | 47 | #define OLED_DISPLAY_HEIGHT 32 |
| 45 | #define OLED_MATRIX_SIZE (OLED_DISPLAY_HEIGHT / 8 * OLED_DISPLAY_WIDTH) // 512 (compile time mathed) | 48 | #define OLED_MATRIX_SIZE (OLED_DISPLAY_HEIGHT / 8 * OLED_DISPLAY_WIDTH) // 512 (compile time mathed) |
| 46 | #define OLED_BLOCK_TYPE uint8_t // Type to use for segmenting the oled display for smart rendering, use unsigned types only | 49 | #define OLED_BLOCK_TYPE uint16_t // Type to use for segmenting the oled display for smart rendering, use unsigned types only |
| 47 | #define OLED_BLOCK_COUNT (sizeof(OLED_BLOCK_TYPE) * 8) // 8 (compile time mathed) | 50 | #define OLED_BLOCK_COUNT (sizeof(OLED_BLOCK_TYPE) * 8) // 16 (compile time mathed) |
| 48 | #define OLED_BLOCK_SIZE (OLED_MATRIX_SIZE / OLED_BLOCK_COUNT) // 128 (compile time mathed) | 51 | #define OLED_BLOCK_SIZE (OLED_MATRIX_SIZE / OLED_BLOCK_COUNT) // 32 (compile time mathed) |
| 49 | 52 | ||
| 50 | // For 90 degree rotation, we map our internal matrix to oled matrix using fixed arrays | 53 | // For 90 degree rotation, we map our internal matrix to oled matrix using fixed arrays |
| 51 | // The OLED writes to it's memory horizontally, starting top left, but our memory starts bottom left in this mode | 54 | // The OLED writes to it's memory horizontally, starting top left, but our memory starts bottom left in this mode |
| 52 | #define OLED_SOURCE_MAP { 0, 8, 16, 24, 32, 40, 48, 56 } | 55 | #define OLED_SOURCE_MAP { 0, 8, 16, 24 } |
| 53 | #define OLED_TARGET_MAP { 48, 32, 16, 0, 56, 40, 24, 8 } | 56 | #define OLED_TARGET_MAP { 24, 16, 8, 0 } |
| 57 | // If OLED_BLOCK_TYPE is uint8_t, these tables would look like: | ||
| 58 | // #define OLED_SOURCE_MAP { 0, 8, 16, 24, 32, 40, 48, 56 } | ||
| 59 | // #define OLED_TARGET_MAP { 48, 32, 16, 0, 56, 40, 24, 8 } | ||
| 54 | #endif // defined(OLED_DISPLAY_CUSTOM) | 60 | #endif // defined(OLED_DISPLAY_CUSTOM) |
| 55 | 61 | ||
| 56 | // Address to use for tthe i2d oled communication | 62 | // Address to use for tthe i2d oled communication |
| @@ -79,19 +85,22 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
| 79 | #define OLED_FONT_HEIGHT 8 | 85 | #define OLED_FONT_HEIGHT 8 |
| 80 | #endif | 86 | #endif |
| 81 | 87 | ||
| 82 | #define OLED_ROTATION_0 0x00 | 88 | // OLED Rotation enum values are flags |
| 83 | #define OLED_ROTATION_90 0x01 | 89 | typedef enum { |
| 84 | #define OLED_ROTATION_180 0x02 | 90 | OLED_ROTATION_0 = 0, |
| 85 | #define OLED_ROTATION_270 0x03 | 91 | OLED_ROTATION_90 = 1, |
| 92 | OLED_ROTATION_180 = 2, | ||
| 93 | OLED_ROTATION_270 = 3, // OLED_ROTATION_90 | OLED_ROTATION_180 | ||
| 94 | } oled_rotation_t; | ||
| 86 | 95 | ||
| 87 | // Initialize the oled display, rotating the rendered output based on the define passed in. | 96 | // Initialize the oled display, rotating the rendered output based on the define passed in. |
| 88 | // Returns true if the OLED was initialized successfully | 97 | // Returns true if the OLED was initialized successfully |
| 89 | bool oled_init(uint8_t rotation); | 98 | bool oled_init(oled_rotation_t rotation); |
| 90 | 99 | ||
| 91 | // Called at the start of oled_init, weak function overridable by the user | 100 | // Called at the start of oled_init, weak function overridable by the user |
| 92 | // rotation - the value passed into oled_init | 101 | // rotation - the value passed into oled_init |
| 93 | // Return new uint8_t if you want to override default rotation | 102 | // Return new oled_rotation_t if you want to override default rotation |
| 94 | uint8_t oled_init_user(uint8_t rotation); | 103 | oled_rotation_t oled_init_user(oled_rotation_t rotation); |
| 95 | 104 | ||
| 96 | // Clears the display buffer, resets cursor position to 0, and sets the buffer to dirty for rendering | 105 | // Clears the display buffer, resets cursor position to 0, and sets the buffer to dirty for rendering |
| 97 | void oled_clear(void); | 106 | void oled_clear(void); |
