[hub75] Add set_brightness action (#12521)
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
from typing import Any
|
from typing import Any
|
||||||
|
|
||||||
from esphome import pins
|
from esphome import automation, pins
|
||||||
import esphome.codegen as cg
|
import esphome.codegen as cg
|
||||||
from esphome.components import display
|
from esphome.components import display
|
||||||
from esphome.components.esp32 import add_idf_component
|
from esphome.components.esp32 import add_idf_component
|
||||||
@@ -17,6 +17,8 @@ from esphome.const import (
|
|||||||
CONF_OE_PIN,
|
CONF_OE_PIN,
|
||||||
CONF_UPDATE_INTERVAL,
|
CONF_UPDATE_INTERVAL,
|
||||||
)
|
)
|
||||||
|
from esphome.core import ID
|
||||||
|
from esphome.cpp_generator import MockObj, TemplateArgsType
|
||||||
import esphome.final_validate as fv
|
import esphome.final_validate as fv
|
||||||
from esphome.types import ConfigType
|
from esphome.types import ConfigType
|
||||||
|
|
||||||
@@ -135,6 +137,7 @@ CLOCK_SPEEDS = {
|
|||||||
HUB75Display = hub75_ns.class_("HUB75Display", cg.PollingComponent, display.Display)
|
HUB75Display = hub75_ns.class_("HUB75Display", cg.PollingComponent, display.Display)
|
||||||
Hub75Config = cg.global_ns.struct("Hub75Config")
|
Hub75Config = cg.global_ns.struct("Hub75Config")
|
||||||
Hub75Pins = cg.global_ns.struct("Hub75Pins")
|
Hub75Pins = cg.global_ns.struct("Hub75Pins")
|
||||||
|
SetBrightnessAction = hub75_ns.class_("SetBrightnessAction", automation.Action)
|
||||||
|
|
||||||
|
|
||||||
def _merge_board_pins(config: ConfigType) -> ConfigType:
|
def _merge_board_pins(config: ConfigType) -> ConfigType:
|
||||||
@@ -576,3 +579,27 @@ async def to_code(config: ConfigType) -> None:
|
|||||||
config[CONF_LAMBDA], [(display.DisplayRef, "it")], return_type=cg.void
|
config[CONF_LAMBDA], [(display.DisplayRef, "it")], return_type=cg.void
|
||||||
)
|
)
|
||||||
cg.add(var.set_writer(lambda_))
|
cg.add(var.set_writer(lambda_))
|
||||||
|
|
||||||
|
|
||||||
|
@automation.register_action(
|
||||||
|
"hub75.set_brightness",
|
||||||
|
SetBrightnessAction,
|
||||||
|
cv.maybe_simple_value(
|
||||||
|
{
|
||||||
|
cv.GenerateID(): cv.use_id(HUB75Display),
|
||||||
|
cv.Required(CONF_BRIGHTNESS): cv.templatable(cv.int_range(min=0, max=255)),
|
||||||
|
},
|
||||||
|
key=CONF_BRIGHTNESS,
|
||||||
|
),
|
||||||
|
)
|
||||||
|
async def hub75_set_brightness_to_code(
|
||||||
|
config: ConfigType,
|
||||||
|
action_id: ID,
|
||||||
|
template_arg: cg.TemplateArguments,
|
||||||
|
args: TemplateArgsType,
|
||||||
|
) -> MockObj:
|
||||||
|
var = cg.new_Pvariable(action_id, template_arg)
|
||||||
|
await cg.register_parented(var, config[CONF_ID])
|
||||||
|
template_ = await cg.templatable(config[CONF_BRIGHTNESS], args, cg.uint8)
|
||||||
|
cg.add(var.set_brightness(template_))
|
||||||
|
return var
|
||||||
|
|||||||
@@ -179,7 +179,7 @@ void HOT HUB75Display::draw_pixels_at(int x_start, int y_start, int w, int h, co
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void HUB75Display::set_brightness(int brightness) {
|
void HUB75Display::set_brightness(uint8_t brightness) {
|
||||||
this->brightness_ = brightness;
|
this->brightness_ = brightness;
|
||||||
this->enabled_ = (brightness > 0);
|
this->enabled_ = (brightness > 0);
|
||||||
if (this->driver_ != nullptr) {
|
if (this->driver_ != nullptr) {
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
#include <utility>
|
#include <utility>
|
||||||
|
|
||||||
#include "esphome/components/display/display_buffer.h"
|
#include "esphome/components/display/display_buffer.h"
|
||||||
|
#include "esphome/core/automation.h"
|
||||||
#include "esphome/core/component.h"
|
#include "esphome/core/component.h"
|
||||||
#include "esphome/core/hal.h"
|
#include "esphome/core/hal.h"
|
||||||
#include "esphome/core/log.h"
|
#include "esphome/core/log.h"
|
||||||
@@ -34,7 +35,7 @@ class HUB75Display : public display::Display {
|
|||||||
display::ColorBitness bitness, bool big_endian, int x_offset, int y_offset, int x_pad) override;
|
display::ColorBitness bitness, bool big_endian, int x_offset, int y_offset, int x_pad) override;
|
||||||
|
|
||||||
// Brightness control (runtime mutable)
|
// Brightness control (runtime mutable)
|
||||||
void set_brightness(int brightness);
|
void set_brightness(uint8_t brightness);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
// Display internal methods
|
// Display internal methods
|
||||||
@@ -46,10 +47,17 @@ class HUB75Display : public display::Display {
|
|||||||
Hub75Config config_; // Immutable configuration
|
Hub75Config config_; // Immutable configuration
|
||||||
|
|
||||||
// Runtime state (mutable)
|
// Runtime state (mutable)
|
||||||
int brightness_{128};
|
uint8_t brightness_{128};
|
||||||
bool enabled_{false};
|
bool enabled_{false};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template<typename... Ts> class SetBrightnessAction : public Action<Ts...>, public Parented<HUB75Display> {
|
||||||
|
public:
|
||||||
|
TEMPLATABLE_VALUE(uint8_t, brightness)
|
||||||
|
|
||||||
|
void play(const Ts &...x) override { this->parent_->set_brightness(this->brightness_.value(x...)); }
|
||||||
|
};
|
||||||
|
|
||||||
} // namespace esphome::hub75
|
} // namespace esphome::hub75
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
12
tests/components/hub75/common.yaml
Normal file
12
tests/components/hub75/common.yaml
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
esphome:
|
||||||
|
on_boot:
|
||||||
|
# Test simple value
|
||||||
|
- hub75.set_brightness: 200
|
||||||
|
|
||||||
|
# Test templatable value
|
||||||
|
- hub75.set_brightness: !lambda 'return 100;'
|
||||||
|
|
||||||
|
# Test with explicit ID
|
||||||
|
- hub75.set_brightness:
|
||||||
|
id: my_hub75
|
||||||
|
brightness: 50
|
||||||
@@ -1,8 +1,3 @@
|
|||||||
esp32:
|
|
||||||
board: esp32dev
|
|
||||||
framework:
|
|
||||||
type: esp-idf
|
|
||||||
|
|
||||||
display:
|
display:
|
||||||
- platform: hub75
|
- platform: hub75
|
||||||
id: my_hub75
|
id: my_hub75
|
||||||
@@ -37,3 +32,5 @@ display:
|
|||||||
then:
|
then:
|
||||||
lambda: |-
|
lambda: |-
|
||||||
ESP_LOGD("display", "1 -> 2");
|
ESP_LOGD("display", "1 -> 2");
|
||||||
|
|
||||||
|
<<: !include common.yaml
|
||||||
|
|||||||
@@ -1,8 +1,3 @@
|
|||||||
esp32:
|
|
||||||
board: esp32-s3-devkitc-1
|
|
||||||
framework:
|
|
||||||
type: esp-idf
|
|
||||||
|
|
||||||
display:
|
display:
|
||||||
- platform: hub75
|
- platform: hub75
|
||||||
id: hub75_display_board
|
id: hub75_display_board
|
||||||
@@ -24,3 +19,5 @@ display:
|
|||||||
then:
|
then:
|
||||||
lambda: |-
|
lambda: |-
|
||||||
ESP_LOGD("display", "1 -> 2");
|
ESP_LOGD("display", "1 -> 2");
|
||||||
|
|
||||||
|
<<: !include common.yaml
|
||||||
|
|||||||
@@ -1,8 +1,3 @@
|
|||||||
esp32:
|
|
||||||
board: esp32-s3-devkitc-1
|
|
||||||
framework:
|
|
||||||
type: esp-idf
|
|
||||||
|
|
||||||
display:
|
display:
|
||||||
- platform: hub75
|
- platform: hub75
|
||||||
id: my_hub75
|
id: my_hub75
|
||||||
@@ -37,3 +32,5 @@ display:
|
|||||||
then:
|
then:
|
||||||
lambda: |-
|
lambda: |-
|
||||||
ESP_LOGD("display", "1 -> 2");
|
ESP_LOGD("display", "1 -> 2");
|
||||||
|
|
||||||
|
<<: !include common.yaml
|
||||||
|
|||||||
Reference in New Issue
Block a user