~ruther/qmk_firmware

833c5ae87aa89124451efafdf0cf9fc0400f4b03 — brickbots 5 years ago 57de9e6
Buffer based OLED panning, write byte to buffer at arbitrary index (#8055)

* Add buffer based single line pan, arbitrary byte write to buffer

* Change dirty mask to inverse of OLED_BLOCK_TYPE for future proofing larger buffer sizes

* Updating docs to include new functions

* Updating to clarify scroll vs pan
3 files changed, 38 insertions(+), 0 deletions(-)

M docs/feature_oled_driver.md
M drivers/oled/oled_driver.c
M drivers/oled/oled_driver.h
M docs/feature_oled_driver.md => docs/feature_oled_driver.md +9 -0
@@ 221,6 221,12 @@ void oled_write(const char *data, bool invert);
// Advances the cursor to the next page, wiring ' ' to the remainder of the current page
void oled_write_ln(const char *data, bool invert);

// Pans the buffer to the right (or left by passing true) by moving contents of the buffer
// Useful for moving the screen in preparation for new drawing 
// oled_scroll_left or oled_scroll_right should be preferred for all cases of moving a static
// image such as a logo or to avoid burn-in as it's much, much less cpu intensive
void oled_pan(bool left);

// Writes a PROGMEM string to the buffer at current cursor position
// Advances the cursor while writing, inverts the pixels if true
// Remapped to call 'void oled_write(const char *data, bool invert);' on ARM


@@ 235,6 241,9 @@ void oled_write_ln_P(const char *data, bool invert);
// Writes a string to the buffer at current cursor position
void oled_write_raw(const char *data, uint16_t size);

// Writes a single byte into the buffer at the specified index
void oled_write_raw_byte(const char data, uint16_t index);

// Writes a PROGMEM string to the buffer at current cursor position
void oled_write_raw_P(const char *data, uint16_t size);


M drivers/oled/oled_driver.c => drivers/oled/oled_driver.c +25 -0
@@ 428,6 428,31 @@ void oled_write_ln(const char *data, bool invert) {
    oled_advance_page(true);
}

void oled_pan(bool left) {
    uint16_t i = 0;
    for (uint16_t y = 0; y < OLED_DISPLAY_HEIGHT/8; y++) {
        if(left) {
            for (uint16_t x = 0; x < OLED_DISPLAY_WIDTH - 1; x++) {
                i = y * OLED_DISPLAY_WIDTH + x;
                oled_buffer[i] = oled_buffer[i+1];
            }
        } else {
            for (uint16_t x = OLED_DISPLAY_WIDTH -1; x > 0; x--) {
                i = y * OLED_DISPLAY_WIDTH + x;
                oled_buffer[i] = oled_buffer[i-1];
            }
        }
    }
    oled_dirty = ~((OLED_BLOCK_TYPE)0);
}

void oled_write_raw_byte(const char data, uint16_t index) {
    if (index > OLED_MATRIX_SIZE) index = OLED_MATRIX_SIZE;
    if (oled_buffer[index] == data) return;
    oled_buffer[index] = data;
    oled_dirty |= (1 << (index / OLED_BLOCK_SIZE));
}

void oled_write_raw(const char *data, uint16_t size) {
    if (size > OLED_MATRIX_SIZE) size = OLED_MATRIX_SIZE;
    for (uint16_t i = 0; i < size; i++) {

M drivers/oled/oled_driver.h => drivers/oled/oled_driver.h +4 -0
@@ 200,7 200,11 @@ void oled_write(const char *data, bool invert);
// Advances the cursor to the next page, wiring ' ' to the remainder of the current page
void oled_write_ln(const char *data, bool invert);

// Pans the buffer to the right (or left by passing true) by moving contents of the buffer
void oled_pan(bool left);

void oled_write_raw(const char *data, uint16_t size);
void oled_write_raw_byte(const char data, uint16_t index);

#if defined(__AVR__)
// Writes a PROGMEM string to the buffer at current cursor position