diff --git a/drivers/uc8151/uc8151.cpp b/drivers/uc8151/uc8151.cpp index a908860e..249ca3d9 100644 --- a/drivers/uc8151/uc8151.cpp +++ b/drivers/uc8151/uc8151.cpp @@ -377,7 +377,7 @@ namespace pimoroni { }); command(TCON, {0x22}); // tcon setting - command(CDI, {0b01'00'1100}); // vcom and data interval + command(CDI, {(uint8_t)(inverted ? 0b01'01'1100 : 0b01'00'1100)}); // vcom and data interval command(PLL, { HZ_100 @@ -459,6 +459,11 @@ namespace pimoroni { *p |= b; // set bit value } + void UC8151::invert(bool inv) { + inverted = inv; + command(CDI, {(uint8_t)(inverted ? 0b01'01'1100 : 0b01'00'1100)}); // vcom and data interval + } + void UC8151::update_speed(uint8_t speed) { setup(speed); } diff --git a/drivers/uc8151/uc8151.hpp b/drivers/uc8151/uc8151.hpp index 279044a8..fb60c5a4 100644 --- a/drivers/uc8151/uc8151.hpp +++ b/drivers/uc8151/uc8151.hpp @@ -144,6 +144,8 @@ namespace pimoroni { uint BUSY = PIN_UNUSED; uint RESET = PIN_UNUSED; + bool inverted = false; + public: UC8151(uint16_t width, uint16_t height) : width(width), height(height), frame_buffer(new uint8_t[width * height / 8]) { @@ -195,6 +197,7 @@ namespace pimoroni { void command(uint8_t reg) {command(reg, 0, nullptr);}; void data(size_t len, const uint8_t *data); + void invert(bool invert); void update_speed(uint8_t speed); void update(bool blocking = true); void partial_update(int x, int y, int w, int h, bool blocking = true); diff --git a/libraries/badger2040/badger2040.cpp b/libraries/badger2040/badger2040.cpp index 80a660a9..aca7b540 100644 --- a/libraries/badger2040/badger2040.cpp +++ b/libraries/badger2040/badger2040.cpp @@ -195,6 +195,10 @@ namespace pimoroni { uc8151.power_off(); } + void Badger2040::invert(bool invert) { + uc8151.invert(invert); + } + void Badger2040::update_speed(uint8_t speed) { uc8151.update_speed(speed); } diff --git a/libraries/badger2040/badger2040.hpp b/libraries/badger2040/badger2040.hpp index 7e9536cc..93a9fabe 100644 --- a/libraries/badger2040/badger2040.hpp +++ b/libraries/badger2040/badger2040.hpp @@ -34,6 +34,7 @@ namespace pimoroni { void sleep(); bool is_busy(); void power_off(); + void invert(bool invert); // state void led(uint8_t brightness); diff --git a/micropython/modules/badger2040/README.md b/micropython/modules/badger2040/README.md index e4b572f8..a73a9e6b 100644 --- a/micropython/modules/badger2040/README.md +++ b/micropython/modules/badger2040/README.md @@ -32,6 +32,7 @@ Badger 2040 is an RP2040 powered EInk badge. - [Update](#update) - [Clear](#clear) - [Partial Update](#partial-update) + - [Invert (aka Dark Mode)](#invert-aka-dark-mode) - [Update Speed](#update-speed-1) - [LED](#led) @@ -95,6 +96,7 @@ clear() update() partial_update(x, y, w, h) update_speed(speed) +invert(inverted) ``` ## Other Constants @@ -365,6 +367,16 @@ partial_update( ) ``` +### Invert (aka Dark Mode) + +Badger2040 can invert all your display data for a quick and easy dark mode: + +```python +invert( + inverted # bool: True to invert, False to... not invert! +) +``` + ### Update Speed Badger2040 is capable of updating the display at multiple different speeds. diff --git a/micropython/modules/badger2040/badger2040.c b/micropython/modules/badger2040/badger2040.c index 6bd3fa51..3a09276a 100644 --- a/micropython/modules/badger2040/badger2040.c +++ b/micropython/modules/badger2040/badger2040.c @@ -9,6 +9,7 @@ MP_DEFINE_CONST_FUN_OBJ_1(Badger2040_is_busy_obj, Badger2040_is_busy); MP_DEFINE_CONST_FUN_OBJ_1(Badger2040_update_obj, Badger2040_update); MP_DEFINE_CONST_FUN_OBJ_KW(Badger2040_partial_update_obj, 4, Badger2040_partial_update); +MP_DEFINE_CONST_FUN_OBJ_2(Badger2040_invert_obj, Badger2040_invert); MP_DEFINE_CONST_FUN_OBJ_2(Badger2040_led_obj, Badger2040_led); MP_DEFINE_CONST_FUN_OBJ_2(Badger2040_font_obj, Badger2040_font); MP_DEFINE_CONST_FUN_OBJ_2(Badger2040_pen_obj, Badger2040_pen); @@ -39,6 +40,7 @@ STATIC const mp_rom_map_elem_t Badger2040_locals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_update), MP_ROM_PTR(&Badger2040_update_obj) }, { MP_ROM_QSTR(MP_QSTR_partial_update), MP_ROM_PTR(&Badger2040_partial_update_obj) }, + { MP_ROM_QSTR(MP_QSTR_invert), MP_ROM_PTR(&Badger2040_invert_obj) }, { MP_ROM_QSTR(MP_QSTR_led), MP_ROM_PTR(&Badger2040_led_obj) }, { MP_ROM_QSTR(MP_QSTR_font), MP_ROM_PTR(&Badger2040_font_obj) }, { MP_ROM_QSTR(MP_QSTR_pen), MP_ROM_PTR(&Badger2040_pen_obj) }, diff --git a/micropython/modules/badger2040/badger2040.cpp b/micropython/modules/badger2040/badger2040.cpp index 863915fd..657b0400 100644 --- a/micropython/modules/badger2040/badger2040.cpp +++ b/micropython/modules/badger2040/badger2040.cpp @@ -173,6 +173,12 @@ MICROPY_EVENT_POLL_HOOK // halt // sleep +mp_obj_t Badger2040_invert(mp_obj_t self_in, mp_obj_t invert) { + _Badger2040_obj_t *self = MP_OBJ_TO_PTR2(self_in, _Badger2040_obj_t); + self->badger2040->invert(invert == mp_const_true); + return mp_const_none; +} + mp_obj_t Badger2040_led(mp_obj_t self_in, mp_obj_t brightness) { _Badger2040_obj_t *self = MP_OBJ_TO_PTR2(self_in, _Badger2040_obj_t); self->badger2040->led(mp_obj_get_int(brightness)); diff --git a/micropython/modules/badger2040/badger2040.h b/micropython/modules/badger2040/badger2040.h index fd9f5d28..b60a3154 100644 --- a/micropython/modules/badger2040/badger2040.h +++ b/micropython/modules/badger2040/badger2040.h @@ -15,6 +15,7 @@ extern mp_obj_t Badger2040_update_speed(mp_obj_t self_in, mp_obj_t speed); extern mp_obj_t Badger2040_update(mp_obj_t self_in); extern mp_obj_t Badger2040_partial_update(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args); +extern mp_obj_t Badger2040_invert(mp_obj_t self_in, mp_obj_t invert); extern mp_obj_t Badger2040_led(mp_obj_t self_in, mp_obj_t brightness); extern mp_obj_t Badger2040_font(mp_obj_t self_in, mp_obj_t font); extern mp_obj_t Badger2040_pen(mp_obj_t self_in, mp_obj_t color);