1
0
mirror of https://github.com/esphome/esphome.git synced 2025-09-17 02:32:20 +01:00

Add Lilygo T-Embed to st7789v display config. (#5337)

* Add Lilygo T-Embed to st7789v display config.

* Move all configuration into the Python code.
Add presets for TTGO.
All preset configuration can be overridden.

* Add Adafruit S2 pin presets

* Add test

* Add funhouse pins.

Co-authored-by: Keith Burzinski <kbx81x@gmail.com>

* Keep ordering of options consistent

* Remove unused declarations

---------

Co-authored-by: Keith Burzinski <kbx81x@gmail.com>
This commit is contained in:
Clyde Stubbs
2023-09-05 17:01:28 +10:00
committed by GitHub
parent 343278b291
commit 32b24726ed
4 changed files with 112 additions and 104 deletions

View File

@@ -12,6 +12,8 @@ from esphome.const import (
CONF_RESET_PIN,
CONF_WIDTH,
CONF_POWER_SUPPLY,
CONF_ROTATION,
CONF_CS_PIN,
)
from . import st7789v_ns
@@ -26,48 +28,106 @@ DEPENDENCIES = ["spi"]
ST7789V = st7789v_ns.class_(
"ST7789V", cg.PollingComponent, spi.SPIDevice, display.DisplayBuffer
)
ST7789VRef = ST7789V.operator("ref")
ST7789VModel = st7789v_ns.enum("ST7789VModel")
MODEL_PRESETS = "model_presets"
REQUIRE_PS = "require_ps"
def model_spec(require_ps=False, presets=None):
if presets is None:
presets = {}
return {MODEL_PRESETS: presets, REQUIRE_PS: require_ps}
MODELS = {
"TTGO_TDISPLAY_135X240": ST7789VModel.ST7789V_MODEL_TTGO_TDISPLAY_135_240,
"ADAFRUIT_FUNHOUSE_240X240": ST7789VModel.ST7789V_MODEL_ADAFRUIT_FUNHOUSE_240_240,
"ADAFRUIT_RR_280X240": ST7789VModel.ST7789V_MODEL_ADAFRUIT_RR_280_240,
"ADAFRUIT_S2_TFT_FEATHER_240X135": ST7789VModel.ST7789V_MODEL_ADAFRUIT_S2_TFT_FEATHER_240_135,
"CUSTOM": ST7789VModel.ST7789V_MODEL_CUSTOM,
"TTGO_TDISPLAY_135X240": model_spec(
presets={
CONF_HEIGHT: 240,
CONF_WIDTH: 135,
CONF_OFFSET_HEIGHT: 52,
CONF_OFFSET_WIDTH: 40,
CONF_CS_PIN: "GPIO5",
CONF_DC_PIN: "GPIO16",
CONF_RESET_PIN: "GPIO23",
CONF_BACKLIGHT_PIN: "GPIO4",
}
),
"ADAFRUIT_FUNHOUSE_240X240": model_spec(
presets={
CONF_HEIGHT: 240,
CONF_WIDTH: 240,
CONF_OFFSET_HEIGHT: 0,
CONF_OFFSET_WIDTH: 0,
CONF_CS_PIN: "GPIO40",
CONF_DC_PIN: "GPIO39",
CONF_RESET_PIN: "GPIO41",
}
),
"ADAFRUIT_RR_280X240": model_spec(
presets={
CONF_HEIGHT: 280,
CONF_WIDTH: 240,
CONF_OFFSET_HEIGHT: 0,
CONF_OFFSET_WIDTH: 20,
}
),
"ADAFRUIT_S2_TFT_FEATHER_240X135": model_spec(
require_ps=True,
presets={
CONF_HEIGHT: 240,
CONF_WIDTH: 135,
CONF_OFFSET_HEIGHT: 52,
CONF_OFFSET_WIDTH: 40,
CONF_CS_PIN: "GPIO7",
CONF_DC_PIN: "GPIO39",
CONF_RESET_PIN: "GPIO40",
CONF_BACKLIGHT_PIN: "GPIO45",
},
),
"LILYGO_T-EMBED_170X320": model_spec(
presets={
CONF_HEIGHT: 320,
CONF_WIDTH: 170,
CONF_OFFSET_HEIGHT: 35,
CONF_OFFSET_WIDTH: 0,
CONF_ROTATION: 270,
CONF_CS_PIN: "GPIO10",
CONF_DC_PIN: "GPIO13",
CONF_RESET_PIN: "GPIO9",
CONF_BACKLIGHT_PIN: "GPIO15",
}
),
"CUSTOM": model_spec(),
}
ST7789V_MODEL = cv.enum(MODELS, upper=True, space="_")
def validate_st7789v(config):
if config[CONF_MODEL].upper() == "CUSTOM" and (
CONF_HEIGHT not in config
or CONF_WIDTH not in config
or CONF_OFFSET_HEIGHT not in config
or CONF_OFFSET_WIDTH not in config
):
raise cv.Invalid(
f'{CONF_HEIGHT}, {CONF_WIDTH}, {CONF_OFFSET_HEIGHT} and {CONF_OFFSET_WIDTH} must be specified when {CONF_MODEL} is "CUSTOM"'
)
model_data = MODELS[config[CONF_MODEL]]
presets = model_data[MODEL_PRESETS]
for key, value in presets.items():
if key not in config:
if key.endswith("pin"):
# All pins are output.
value = pins.gpio_output_pin_schema(value)
config[key] = value
if config[CONF_MODEL].upper() != "CUSTOM" and (
CONF_HEIGHT in config
or CONF_WIDTH in config
or CONF_OFFSET_HEIGHT in config
or CONF_OFFSET_WIDTH in config
):
if model_data[REQUIRE_PS] and CONF_POWER_SUPPLY not in config:
raise cv.Invalid(
f'Do not specify {CONF_HEIGHT}, {CONF_WIDTH}, {CONF_OFFSET_HEIGHT} or {CONF_OFFSET_WIDTH} when using {CONF_MODEL} that is not "CUSTOM"'
f'{CONF_POWER_SUPPLY} must be specified when {CONF_MODEL} is {config[CONF_MODEL]}"'
)
if (
config[CONF_MODEL].upper() == "ADAFRUIT_S2_TFT_FEATHER_240X135"
and CONF_POWER_SUPPLY not in config
CONF_OFFSET_WIDTH not in config
or CONF_OFFSET_HEIGHT not in config
or CONF_HEIGHT not in config
or CONF_WIDTH not in config
):
raise cv.Invalid(
f'{CONF_POWER_SUPPLY} must be specified when {CONF_MODEL} is "ADAFRUIT_S2_TFT_FEATHER_240X135"'
f"{CONF_HEIGHT}, {CONF_WIDTH}, {CONF_OFFSET_HEIGHT} and {CONF_OFFSET_WIDTH} must all be specified"
)
if CONF_DC_PIN not in config or CONF_RESET_PIN not in config:
raise cv.Invalid(f"both {CONF_DC_PIN} and {CONF_RESET_PIN} must be specified")
return config
@@ -75,9 +135,9 @@ CONFIG_SCHEMA = cv.All(
display.FULL_DISPLAY_SCHEMA.extend(
{
cv.GenerateID(): cv.declare_id(ST7789V),
cv.Required(CONF_MODEL): ST7789V_MODEL,
cv.Required(CONF_RESET_PIN): pins.gpio_output_pin_schema,
cv.Required(CONF_DC_PIN): pins.gpio_output_pin_schema,
cv.Required(CONF_MODEL): cv.one_of(*MODELS.keys(), upper=True, space="_"),
cv.Optional(CONF_RESET_PIN): pins.gpio_output_pin_schema,
cv.Optional(CONF_DC_PIN): pins.gpio_output_pin_schema,
cv.Optional(CONF_BACKLIGHT_PIN): pins.gpio_output_pin_schema,
cv.Optional(CONF_POWER_SUPPLY): cv.use_id(power_supply.PowerSupply),
cv.Optional(CONF_EIGHTBITCOLOR, default=False): cv.boolean,
@@ -99,13 +159,12 @@ async def to_code(config):
await display.register_display(var, config)
await spi.register_spi_device(var, config)
cg.add(var.set_model(config[CONF_MODEL]))
cg.add(var.set_model_str(config[CONF_MODEL]))
if config[CONF_MODEL].upper() == "CUSTOM":
cg.add(var.set_height(config[CONF_HEIGHT]))
cg.add(var.set_width(config[CONF_WIDTH]))
cg.add(var.set_offset_height(config[CONF_OFFSET_HEIGHT]))
cg.add(var.set_offset_width(config[CONF_OFFSET_WIDTH]))
cg.add(var.set_height(config[CONF_HEIGHT]))
cg.add(var.set_width(config[CONF_WIDTH]))
cg.add(var.set_offset_height(config[CONF_OFFSET_HEIGHT]))
cg.add(var.set_offset_width(config[CONF_OFFSET_WIDTH]))
cg.add(var.set_eightbitcolor(config[CONF_EIGHTBITCOLOR]))