diff --git a/esphome/components/inkplate6/display.py b/esphome/components/inkplate6/display.py index 56d20508ec..492cdf9340 100644 --- a/esphome/components/inkplate6/display.py +++ b/esphome/components/inkplate6/display.py @@ -6,9 +6,12 @@ from esphome.const import ( CONF_FULL_UPDATE_EVERY, CONF_ID, CONF_LAMBDA, + CONF_MIRROR_X, + CONF_MIRROR_Y, CONF_MODEL, CONF_OE_PIN, CONF_PAGES, + CONF_TRANSFORM, CONF_WAKEUP_PIN, ) @@ -36,7 +39,6 @@ CONF_SPH_PIN = "sph_pin" CONF_SPV_PIN = "spv_pin" CONF_VCOM_PIN = "vcom_pin" - inkplate6_ns = cg.esphome_ns.namespace("inkplate6") Inkplate6 = inkplate6_ns.class_( "Inkplate6", @@ -62,6 +64,12 @@ CONFIG_SCHEMA = cv.All( { cv.GenerateID(): cv.declare_id(Inkplate6), cv.Optional(CONF_GREYSCALE, default=False): cv.boolean, + cv.Optional(CONF_TRANSFORM): cv.Schema( + { + cv.Optional(CONF_MIRROR_X, default=False): cv.boolean, + cv.Optional(CONF_MIRROR_Y, default=False): cv.boolean, + } + ), cv.Optional(CONF_PARTIAL_UPDATING, default=True): cv.boolean, cv.Optional(CONF_FULL_UPDATE_EVERY, default=10): cv.uint32_t, cv.Optional(CONF_MODEL, default="inkplate_6"): cv.enum( @@ -126,6 +134,9 @@ async def to_code(config): cg.add(var.set_writer(lambda_)) cg.add(var.set_greyscale(config[CONF_GREYSCALE])) + if transform := config.get(CONF_TRANSFORM): + cg.add(var.set_mirror_x(transform[CONF_MIRROR_X])) + cg.add(var.set_mirror_y(transform[CONF_MIRROR_Y])) cg.add(var.set_partial_updating(config[CONF_PARTIAL_UPDATING])) cg.add(var.set_full_update_every(config[CONF_FULL_UPDATE_EVERY])) diff --git a/esphome/components/inkplate6/inkplate.cpp b/esphome/components/inkplate6/inkplate.cpp index f4d0fedf83..8c853b75c2 100644 --- a/esphome/components/inkplate6/inkplate.cpp +++ b/esphome/components/inkplate6/inkplate.cpp @@ -1,7 +1,7 @@ #include "inkplate.h" -#include "esphome/core/log.h" #include "esphome/core/application.h" #include "esphome/core/helpers.h" +#include "esphome/core/log.h" #ifdef USE_ESP32_FRAMEWORK_ARDUINO @@ -156,6 +156,12 @@ void HOT Inkplate6::draw_absolute_pixel_internal(int x, int y, Color color) { if (x >= this->get_width_internal() || y >= this->get_height_internal() || x < 0 || y < 0) return; + if (this->mirror_y_) + y = this->get_height_internal() - y - 1; + + if (this->mirror_x_) + x = this->get_width_internal() - x - 1; + if (this->greyscale_) { int x1 = x / 2; int x_sub = x % 2; diff --git a/esphome/components/inkplate6/inkplate.h b/esphome/components/inkplate6/inkplate.h index ca2ad46f1e..1680b84b7f 100644 --- a/esphome/components/inkplate6/inkplate.h +++ b/esphome/components/inkplate6/inkplate.h @@ -1,9 +1,9 @@ #pragma once +#include "esphome/components/display/display_buffer.h" +#include "esphome/components/i2c/i2c.h" #include "esphome/core/component.h" #include "esphome/core/hal.h" -#include "esphome/components/i2c/i2c.h" -#include "esphome/components/display/display_buffer.h" #ifdef USE_ESP32_FRAMEWORK_ARDUINO @@ -92,6 +92,9 @@ class Inkplate6 : public display::DisplayBuffer, public i2c::I2CDevice { if (this->is_ready()) this->initialize_(); } + void set_mirror_y(bool mirror_y) { this->mirror_y_ = mirror_y; } + void set_mirror_x(bool mirror_x) { this->mirror_x_ = mirror_x; } + void set_partial_updating(bool partial_updating) { this->partial_updating_ = partial_updating; } void set_full_update_every(uint32_t full_update_every) { this->full_update_every_ = full_update_every; } @@ -221,6 +224,8 @@ class Inkplate6 : public display::DisplayBuffer, public i2c::I2CDevice { bool block_partial_{true}; bool greyscale_; + bool mirror_y_{false}; + bool mirror_x_{false}; bool partial_updating_; InkplateModel model_;