Component to provide button number
This commit is contained in:
@@ -13,6 +13,7 @@ DEPENDENCIES = ['uart']
|
|||||||
CONF_TX_ULTIMATE_EASY = "tx_ultimate_easy"
|
CONF_TX_ULTIMATE_EASY = "tx_ultimate_easy"
|
||||||
|
|
||||||
CONF_UART = "uart"
|
CONF_UART = "uart"
|
||||||
|
CONF_GANG_COUNT = "gang_count"
|
||||||
|
|
||||||
CONF_ON_TOUCH_EVENT = "on_touch_event"
|
CONF_ON_TOUCH_EVENT = "on_touch_event"
|
||||||
CONF_ON_PRESS = "on_press"
|
CONF_ON_PRESS = "on_press"
|
||||||
@@ -33,6 +34,7 @@ CONFIG_SCHEMA = cv.Schema({
|
|||||||
cv.GenerateID(): cv.declare_id(TxUltimateTouch),
|
cv.GenerateID(): cv.declare_id(TxUltimateTouch),
|
||||||
|
|
||||||
cv.Required(CONF_UART): cv.use_id(uart),
|
cv.Required(CONF_UART): cv.use_id(uart),
|
||||||
|
cv.Optional(CONF_GANG_COUNT, default=1): cv.int_range(min=1, max=4),
|
||||||
|
|
||||||
cv.Optional(CONF_ON_TOUCH_EVENT): automation.validate_automation(single=True),
|
cv.Optional(CONF_ON_TOUCH_EVENT): automation.validate_automation(single=True),
|
||||||
cv.Optional(CONF_ON_PRESS): automation.validate_automation(single=True),
|
cv.Optional(CONF_ON_PRESS): automation.validate_automation(single=True),
|
||||||
@@ -49,6 +51,9 @@ async def register_tx_ultimate_easy(var, config):
|
|||||||
uart_component = await cg.get_variable(config[CONF_UART])
|
uart_component = await cg.get_variable(config[CONF_UART])
|
||||||
cg.add(var.set_uart_component(uart_component))
|
cg.add(var.set_uart_component(uart_component))
|
||||||
|
|
||||||
|
if CONF_GANG_COUNT in config:
|
||||||
|
cg.add(var.set_gang_count(config[CONF_GANG_COUNT]))
|
||||||
|
|
||||||
if CONF_ON_TOUCH_EVENT in config:
|
if CONF_ON_TOUCH_EVENT in config:
|
||||||
await automation.build_automation(
|
await automation.build_automation(
|
||||||
var.get_trigger_touch_event(),
|
var.get_trigger_touch_event(),
|
||||||
|
|||||||
@@ -48,6 +48,30 @@ namespace esphome {
|
|||||||
|
|
||||||
void TxUltimateEasy::dump_config() {
|
void TxUltimateEasy::dump_config() {
|
||||||
ESP_LOGCONFIG(TAG, "TX Ultimate Easy");
|
ESP_LOGCONFIG(TAG, "TX Ultimate Easy");
|
||||||
|
ESP_LOGCONFIG(TAG, " Gang count: %" PRIu8, this->gang_count_);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TxUltimateEasy::set_gang_count(const uint8_t gang_count) {
|
||||||
|
if (gang_count < 1 or gang_count > 4)
|
||||||
|
return false;
|
||||||
|
this->gang_count_ = gang_count;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t TxUltimateEasy::get_button_from_position(const uint8_t position) {
|
||||||
|
if (position > TOUCH_MAX_POSITION) // Invalid position
|
||||||
|
return 0;
|
||||||
|
if (this->gang_count_ == 1) // For 1 Gang model, any position is button 1
|
||||||
|
return 1;
|
||||||
|
if (this->gang_count_ < 1 or this->gang_count_ > 4) // Invalid gang count
|
||||||
|
return 0;
|
||||||
|
const uint8_t width = TOUCH_MAX_POSITION / this->gang_count_; // Width of each button region
|
||||||
|
if (width < 1 or width > this->gang_count_) // Invalid width - and prevents division by zero
|
||||||
|
return 0;
|
||||||
|
uint8_t button = (position / width) + 1; // Determine button region
|
||||||
|
if (button > this->gang_count_)
|
||||||
|
button = this->gang_count_; // Clamp to max button count
|
||||||
|
return button;
|
||||||
}
|
}
|
||||||
|
|
||||||
void TxUltimateEasy::send_touch_(TouchPoint tp) {
|
void TxUltimateEasy::send_touch_(TouchPoint tp) {
|
||||||
@@ -133,6 +157,8 @@ namespace esphome {
|
|||||||
TouchPoint TxUltimateEasy::get_touch_point(const std::array<int, UART_RECEIVED_BYTES_SIZE> &uart_received_bytes) {
|
TouchPoint TxUltimateEasy::get_touch_point(const std::array<int, UART_RECEIVED_BYTES_SIZE> &uart_received_bytes) {
|
||||||
TouchPoint tp;
|
TouchPoint tp;
|
||||||
tp.x = this->get_touch_position_x(uart_received_bytes);
|
tp.x = this->get_touch_position_x(uart_received_bytes);
|
||||||
|
if (tp.x >= 0)
|
||||||
|
tp.button = this->get_button_from_position(static_cast<uint8_t>(tp.x));
|
||||||
tp.state = this->get_touch_state(uart_received_bytes);
|
tp.state = this->get_touch_state(uart_received_bytes);
|
||||||
switch (tp.state) {
|
switch (tp.state) {
|
||||||
case TOUCH_STATE_RELEASE:
|
case TOUCH_STATE_RELEASE:
|
||||||
|
|||||||
@@ -13,6 +13,9 @@
|
|||||||
|
|
||||||
namespace esphome {
|
namespace esphome {
|
||||||
namespace tx_ultimate_easy {
|
namespace tx_ultimate_easy {
|
||||||
|
// Touch Max Position
|
||||||
|
constexpr uint8_t TOUCH_MAX_POSITION = 10;
|
||||||
|
|
||||||
// Touch State Constants
|
// Touch State Constants
|
||||||
constexpr uint8_t TOUCH_STATE_RELEASE = 0x01;
|
constexpr uint8_t TOUCH_STATE_RELEASE = 0x01;
|
||||||
constexpr uint8_t TOUCH_STATE_PRESS = 0x02;
|
constexpr uint8_t TOUCH_STATE_PRESS = 0x02;
|
||||||
@@ -32,6 +35,7 @@ namespace esphome {
|
|||||||
static const char *TAG = "tx_ultimate_easy";
|
static const char *TAG = "tx_ultimate_easy";
|
||||||
|
|
||||||
struct TouchPoint {
|
struct TouchPoint {
|
||||||
|
uint8_t button = 0;
|
||||||
int8_t x = -1;
|
int8_t x = -1;
|
||||||
int8_t state = -1;
|
int8_t state = -1;
|
||||||
std::string state_str = "Unknown";
|
std::string state_str = "Unknown";
|
||||||
@@ -53,6 +57,10 @@ namespace esphome {
|
|||||||
void loop() override;
|
void loop() override;
|
||||||
void dump_config() override;
|
void dump_config() override;
|
||||||
|
|
||||||
|
uint8_t get_gang_count() { return this->gang_count_; }
|
||||||
|
bool set_gang_count(const uint8_t gang_count);
|
||||||
|
uint8_t get_button_from_position(const uint8_t position);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void send_touch_(TouchPoint tp);
|
void send_touch_(TouchPoint tp);
|
||||||
void handle_touch(const std::array<int, UART_RECEIVED_BYTES_SIZE> &bytes);
|
void handle_touch(const std::array<int, UART_RECEIVED_BYTES_SIZE> &bytes);
|
||||||
@@ -70,6 +78,8 @@ namespace esphome {
|
|||||||
Trigger<TouchPoint> trigger_multi_touch_release_;
|
Trigger<TouchPoint> trigger_multi_touch_release_;
|
||||||
Trigger<TouchPoint> trigger_long_touch_release_;
|
Trigger<TouchPoint> trigger_long_touch_release_;
|
||||||
|
|
||||||
|
uint8_t gang_count_ = 1;
|
||||||
|
|
||||||
}; // class TxUltimateEasy
|
}; // class TxUltimateEasy
|
||||||
|
|
||||||
} // namespace tx_ultimate_easy
|
} // namespace tx_ultimate_easy
|
||||||
|
|||||||
Reference in New Issue
Block a user