From d400e3cbeaab09c8a5140559cfbfc936c156ad87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A1bor=20Poczkodi?= Date: Sun, 13 Oct 2024 18:55:55 +0200 Subject: [PATCH] finished implementing all registers --- esphome/components/kt0803/__init__.py | 52 +++++--- esphome/components/kt0803/kt0803.cpp | 114 +++++++++++++++- esphome/components/kt0803/kt0803.h | 26 +++- esphome/components/kt0803/select/__init__.py | 40 +++++- .../kt0803/select/alc_high_select.cpp | 14 ++ .../kt0803/select/alc_high_select.h | 18 +++ .../kt0803/select/alc_hold_time_select.cpp | 14 ++ .../kt0803/select/alc_hold_time_select.h | 18 +++ .../kt0803/select/alc_low_select.cpp | 14 ++ .../components/kt0803/select/alc_low_select.h | 18 +++ .../kt0803/select/ref_clk_select.cpp | 14 ++ .../components/kt0803/select/ref_clk_select.h | 18 +++ esphome/components/kt0803/switch/__init__.py | 23 +++- .../kt0803/switch/ref_clk_enable_switch.cpp | 12 ++ .../kt0803/switch/ref_clk_enable_switch.h | 18 +++ .../kt0803/switch/xtal_enable_switch.cpp | 12 ++ .../kt0803/switch/xtal_enable_switch.h | 18 +++ .../components/kt0803/test.esp32-s3-ard.yaml | 122 ++++++++++++++++++ .../components/kt0803/test.esp32-s3-idf.yaml | 122 ++++++++++++++++++ 19 files changed, 663 insertions(+), 24 deletions(-) create mode 100644 esphome/components/kt0803/select/alc_high_select.cpp create mode 100644 esphome/components/kt0803/select/alc_high_select.h create mode 100644 esphome/components/kt0803/select/alc_hold_time_select.cpp create mode 100644 esphome/components/kt0803/select/alc_hold_time_select.h create mode 100644 esphome/components/kt0803/select/alc_low_select.cpp create mode 100644 esphome/components/kt0803/select/alc_low_select.h create mode 100644 esphome/components/kt0803/select/ref_clk_select.cpp create mode 100644 esphome/components/kt0803/select/ref_clk_select.h create mode 100644 esphome/components/kt0803/switch/ref_clk_enable_switch.cpp create mode 100644 esphome/components/kt0803/switch/ref_clk_enable_switch.h create mode 100644 esphome/components/kt0803/switch/xtal_enable_switch.cpp create mode 100644 esphome/components/kt0803/switch/xtal_enable_switch.h create mode 100644 tests/components/kt0803/test.esp32-s3-ard.yaml create mode 100644 tests/components/kt0803/test.esp32-s3-idf.yaml diff --git a/esphome/components/kt0803/__init__.py b/esphome/components/kt0803/__init__.py index bcc07526d4..76107eb565 100644 --- a/esphome/components/kt0803/__init__.py +++ b/esphome/components/kt0803/__init__.py @@ -64,6 +64,12 @@ CONF_ALC_GAIN = "alc_gain" CONF_XTAL_SEL = "xtal_sel" CONF_AU_ENHANCE = "au_enhance" CONF_FREQUENCY_DEVIATION = "frequency_deviation" +CONF_REF_CLK = "ref_clk" +CONF_XTAL_ENABLE = "xtal_enable" +CONF_REF_CLK_ENABLE = "ref_clk_enable" +CONF_ALC_HIGH = "alc_high" +CONF_ALC_HOLD_TIME = "alc_hold_time" +CONF_ALC_LOW = "alc_low" SetFrequencyAction = kt0803_ns.class_( "SetFrequencyAction", automation.Action, cg.Parented.template(KT0803Component) @@ -231,27 +237,27 @@ REFERENCE_CLOCK = { } AlcHigh = kt0803_ns.enum("AlcHigh", True) -ALC_HIGH_THRESHOLD_SELECTION = { - "50ms": AlcHigh.ALCHIGHTH_50MS, - "100ms": AlcHigh.ALCHIGHTH_100MS, - "150ms": AlcHigh.ALCHIGHTH_150MS, - "200ms": AlcHigh.ALCHIGHTH_200MS, - "1s": AlcHigh.ALCHIGHTH_1S, - "5s": AlcHigh.ALCHIGHTH_5S, - "10s": AlcHigh.ALCHIGHTH_10S, - "15s": AlcHigh.ALCHIGHTH_15S, +ALC_HIGH = { + "0.6": AlcHigh.ALCHOLD_06, + "0.5": AlcHigh.ALCHOLD_05, + "0.4": AlcHigh.ALCHOLD_04, + "0.3": AlcHigh.ALCHOLD_03, + "0.2": AlcHigh.ALCHOLD_02, + "0.1": AlcHigh.ALCHOLD_01, + "0.05": AlcHigh.ALCHOLD_005, + "0.01": AlcHigh.ALCHOLD_001, } AlcHoldTime = kt0803_ns.enum("AlcHoldTime", True) ALC_HOLD_TIME = { - "0.6": AlcHoldTime.ALCHOLD_06, - "0.5": AlcHoldTime.ALCHOLD_05, - "0.4": AlcHoldTime.ALCHOLD_04, - "0.3": AlcHoldTime.ALCHOLD_03, - "0.2": AlcHoldTime.ALCHOLD_02, - "0.1": AlcHoldTime.ALCHOLD_01, - "0.05": AlcHoldTime.ALCHOLD_005, - "0.01": AlcHoldTime.ALCHOLD_001, + "50ms": AlcHoldTime.ALCHIGHTH_50MS, + "100ms": AlcHoldTime.ALCHIGHTH_100MS, + "150ms": AlcHoldTime.ALCHIGHTH_150MS, + "200ms": AlcHoldTime.ALCHIGHTH_200MS, + "1s": AlcHoldTime.ALCHIGHTH_1S, + "5s": AlcHoldTime.ALCHIGHTH_5S, + "10s": AlcHoldTime.ALCHIGHTH_10S, + "15s": AlcHoldTime.ALCHIGHTH_15S, } AlcLow = kt0803_ns.enum("AlcLow", True) @@ -310,6 +316,12 @@ CONFIG_SCHEMA = ( cv.Optional(CONF_XTAL_SEL, default="32.768kHz"): cv.enum(XTAL_SEL), cv.Optional(CONF_AU_ENHANCE, default=False): cv.boolean, cv.Optional(CONF_FREQUENCY_DEVIATION, default="75kHz"): cv.enum(FREQUENCY_DEVIATION), + cv.Optional(CONF_REF_CLK, default="32.768kHz"): cv.enum(REFERENCE_CLOCK), + cv.Optional(CONF_XTAL_ENABLE, default=True): cv.boolean, + cv.Optional(CONF_REF_CLK_ENABLE, default=False): cv.boolean, + cv.Optional(CONF_ALC_HIGH, default="0.6"): cv.enum(ALC_HIGH), + cv.Optional(CONF_ALC_HOLD_TIME, default="5s"): cv.enum(ALC_HOLD_TIME), + cv.Optional(CONF_ALC_LOW, default="0.25"): cv.enum(ALC_LOW), cv.Optional(CONF_PW_OK): binary_sensor.binary_sensor_schema( device_class=DEVICE_CLASS_POWER, icon=ICON_RADIO_TOWER, @@ -368,5 +380,11 @@ async def to_code(config): await set_var(config, CONF_XTAL_SEL, var.set_xtal_sel) await set_var(config, CONF_AU_ENHANCE, var.set_au_enhance) await set_var(config, CONF_FREQUENCY_DEVIATION, var.set_frequency_deviation) + await set_var(config, CONF_REF_CLK, var.set_ref_clk) + await set_var(config, CONF_XTAL_ENABLE, var.set_xtal_enable) + await set_var(config, CONF_REF_CLK_ENABLE, var.set_ref_clk_enable) + await set_var(config, CONF_ALC_HIGH, var.set_alc_high) + await set_var(config, CONF_ALC_HOLD_TIME, var.set_alc_hold_time) + await set_var(config, CONF_ALC_LOW, var.set_alc_low) await set_binary_sensor(config, CONF_PW_OK, var.set_pw_ok_binary_sensor) await set_binary_sensor(config, CONF_SLNCID, var.set_slncid_binary_sensor) diff --git a/esphome/components/kt0803/kt0803.cpp b/esphome/components/kt0803/kt0803.cpp index 5ff1ed5a6d..d5a16402af 100644 --- a/esphome/components/kt0803/kt0803.cpp +++ b/esphome/components/kt0803/kt0803.cpp @@ -162,6 +162,12 @@ void KT0803Component::setup() { this->publish_xtal_sel(); this->publish_au_enhance(); this->publish_frequency_deviation(); + this->publish_ref_clk(); + this->publish_xtal_enable(); + this->publish_ref_clk_enable(); + this->publish_alc_high(); + this->publish_alc_hold_time(); + this->publish_alc_low(); } void KT0803Component::dump_config() { @@ -295,6 +301,8 @@ void KT0803Component::set_pga(float value) { this->write_reg_(0x04); } + ESP_LOGV(TAG, "PGA %02X", (int) pga); + this->publish_pga(); } @@ -667,7 +675,7 @@ void KT0803Component::set_xtal_sel(XtalSel value) { if (value >= XtalSel::LAST) { ESP_LOGE(TAG, "set_xtal_sel(%d) invalid", value); return; - } + } this->state_.XTAL_SEL = (uint8_t) value; if (this->chip_id_ == ChipId::KT0803L) { this->write_reg_(0x17); @@ -716,6 +724,92 @@ FrequencyDeviation KT0803Component::get_frequency_deviation() { return FrequencyDeviation::FDEV_75KHZ; } +void KT0803Component::set_ref_clk(ReferenceClock value) { + if (value >= ReferenceClock::LAST) { + ESP_LOGE(TAG, "set_ref_clk(%d) invalid", (int) value); + return; + } + + this->state_.REF_CLK = (uint8_t) value; + if (this->chip_id_ == ChipId::KT0803L) { + this->write_reg_(0x1E); + } + + this->publish_ref_clk(); +} + +ReferenceClock KT0803Component::get_ref_clk() { return (ReferenceClock) this->state_.REF_CLK; } + +void KT0803Component::set_xtal_enable(bool value) { + this->state_.XTALD = value ? 0 : 1; + if (this->chip_id_ == ChipId::KT0803L) { + this->write_reg_(0x1E); + } + + this->publish_xtal_enable(); +} + +bool KT0803Component::get_xtal_enable() { return this->state_.XTALD == 0; } + +void KT0803Component::set_ref_clk_enable(bool value) { + this->state_.DCLK = value ? 1 : 0; + if (this->chip_id_ == ChipId::KT0803L) { + this->write_reg_(0x1E); + } + + this->publish_ref_clk_enable(); +} + +bool KT0803Component::get_ref_clk_enable() { return this->state_.DCLK == 1; } + +void KT0803Component::set_alc_high(AlcHigh value) { + if (value >= AlcHigh::LAST) { + ESP_LOGE(TAG, "set_alc_high(%d) invalid", (int) value); + return; + } + + this->state_.ALCHIGHTH = (uint8_t) value; + if (this->chip_id_ == ChipId::KT0803L) { + this->write_reg_(0x26); + } + + this->publish_alc_high(); +} + +AlcHigh KT0803Component::get_alc_high() { return (AlcHigh) this->state_.ALCHIGHTH; } + +void KT0803Component::set_alc_hold_time(AlcHoldTime value) { + if (value >= AlcHoldTime::LAST) { + ESP_LOGE(TAG, "set_alc_hold(%d) invalid", (int) value); + return; + } + + this->state_.ALCHOLD = (uint8_t) value; + if (this->chip_id_ == ChipId::KT0803L) { + this->write_reg_(0x26); + } + + this->publish_alc_hold_time(); +} + +AlcHoldTime KT0803Component::get_alc_hold_time() { return (AlcHoldTime) this->state_.ALCHOLD; } + +void KT0803Component::set_alc_low(AlcLow value) { + if (value >= AlcLow::LAST) { + ESP_LOGE(TAG, "set_alc_low(%d) invalid", (int) value); + return; + } + + this->state_.ALCLOWTH = (uint8_t) value; + if (this->chip_id_ == ChipId::KT0803L) { + this->write_reg_(0x26); + } + + this->publish_alc_low(); +} + +AlcLow KT0803Component::get_alc_low() { return (AlcLow) this->state_.ALCLOWTH; } + // publish void KT0803Component::publish_pw_ok() { this->publish(this->pw_ok_binary_sensor_, this->state_.PW_OK == 1); } @@ -806,6 +900,24 @@ void KT0803Component::publish_frequency_deviation() { this->publish(this->frequency_deviation_select_, (size_t) this->get_frequency_deviation()); } +void KT0803Component::publish_ref_clk() { this->publish(this->ref_clk_select_, (size_t) this->get_ref_clk()); } + +void KT0803Component::publish_xtal_enable() { + this->publish(this->xtal_enable_switch_, (size_t) this->get_xtal_enable()); +} + +void KT0803Component::publish_ref_clk_enable() { + this->publish(this->ref_clk_enable_switch_, (size_t) this->get_ref_clk_enable()); +} + +void KT0803Component::publish_alc_high() { this->publish(this->alc_high_select_, (size_t) this->get_alc_high()); } + +void KT0803Component::publish_alc_hold_time() { + this->publish(this->alc_hold_time_select_, (size_t) this->get_alc_hold_time()); +} + +void KT0803Component::publish_alc_low() { this->publish(this->alc_low_select_, (size_t) this->get_alc_low()); } + void KT0803Component::publish(text_sensor::TextSensor *s, const std::string &state) { if (s != nullptr) { if (!s->has_state() || s->state != state) { diff --git a/esphome/components/kt0803/kt0803.h b/esphome/components/kt0803/kt0803.h index 314b032b14..6c7617c4cf 100644 --- a/esphome/components/kt0803/kt0803.h +++ b/esphome/components/kt0803/kt0803.h @@ -66,6 +66,12 @@ class KT0803Component : public PollingComponent, public i2c::I2CDevice { SUB_SELECT(xtal_sel) SUB_SWITCH(au_enhance) SUB_SELECT(frequency_deviation) + SUB_SELECT(ref_clk) + SUB_SWITCH(xtal_enable) + SUB_SWITCH(ref_clk_enable) + SUB_SELECT(alc_high) + SUB_SELECT(alc_hold_time) + SUB_SELECT(alc_low) void publish_pw_ok(); void publish_slncid(); @@ -96,6 +102,12 @@ class KT0803Component : public PollingComponent, public i2c::I2CDevice { void publish_xtal_sel(); void publish_au_enhance(); void publish_frequency_deviation(); + void publish_ref_clk(); + void publish_xtal_enable(); + void publish_ref_clk_enable(); + void publish_alc_high(); + void publish_alc_hold_time(); + void publish_alc_low(); void publish(sensor::Sensor *s, float state); void publish(binary_sensor::BinarySensor *s, bool state); @@ -118,7 +130,7 @@ class KT0803Component : public PollingComponent, public i2c::I2CDevice { ChipId get_chip_id(); std::string get_chip_string() const; - void set_frequency(float value); // MHz + void set_frequency(float value); float get_frequency(); void set_pga(float value); float get_pga(); @@ -172,6 +184,18 @@ class KT0803Component : public PollingComponent, public i2c::I2CDevice { bool get_au_enhance(); void set_frequency_deviation(FrequencyDeviation value); FrequencyDeviation get_frequency_deviation(); + void set_ref_clk(ReferenceClock value); + ReferenceClock get_ref_clk(); + void set_xtal_enable(bool value); + bool get_xtal_enable(); + void set_ref_clk_enable(bool value); + bool get_ref_clk_enable(); + void set_alc_high(AlcHigh value); + AlcHigh get_alc_high(); + void set_alc_hold_time(AlcHoldTime value); + AlcHoldTime get_alc_hold_time(); + void set_alc_low(AlcLow value); + AlcLow get_alc_low(); }; } // namespace kt0803 diff --git a/esphome/components/kt0803/select/__init__.py b/esphome/components/kt0803/select/__init__.py index 9e3af1376e..7ada0a2b11 100644 --- a/esphome/components/kt0803/select/__init__.py +++ b/esphome/components/kt0803/select/__init__.py @@ -24,6 +24,10 @@ from .. import ( CONF_SILENCE_LOW_COUNTER, CONF_XTAL_SEL, CONF_FREQUENCY_DEVIATION, + CONF_REF_CLK, + CONF_ALC_HIGH, + CONF_ALC_HOLD_TIME, + CONF_ALC_LOW, ICON_SLEEP, ICON_SINE_WAVE, ICON_SPEAKER, @@ -41,6 +45,10 @@ from .. import ( SILENCE_LOW_LEVEL_COUNTER, XTAL_SEL, FREQUENCY_DEVIATION, + REFERENCE_CLOCK, + ALC_HIGH, + ALC_HOLD_TIME, + ALC_LOW, ) PreEmphasisSelect = kt0803_ns.class_("PreEmphasisSelect", select.Select) @@ -57,6 +65,10 @@ SilenceHighCounterSelect = kt0803_ns.class_("SilenceHighCounterSelect", select.S SilenceLowCounterSelect = kt0803_ns.class_("SilenceLowCounterSelect", select.Select) XtalSelSelect = kt0803_ns.class_("XtalSelSelect", select.Select) FrequencyDeviationSelect = kt0803_ns.class_("FrequencyDeviationSelect", select.Select) +RefClkSelect = kt0803_ns.class_("RefClkSelect", select.Select) +AlcHighSelect = kt0803_ns.class_("AlcHighSelect", select.Select) +AlcHoldTimeSelect = kt0803_ns.class_("AlcHoldTimeSelect", select.Select) +AlcLowSelect = kt0803_ns.class_("AlcLowSelect", select.Select) CONFIG_SCHEMA = cv.Schema( { @@ -79,12 +91,12 @@ CONFIG_SCHEMA = cv.Schema( cv.Optional(CONF_ALC_ATTACK_TIME): select.select_schema( AlcAttackTimeSelect, entity_category=ENTITY_CATEGORY_CONFIG, - icon=ICON_SPEAKER, + icon=ICON_SINE_WAVE, ), cv.Optional(CONF_ALC_DECAY_TIME): select.select_schema( AlcDecayTimeSelect, entity_category=ENTITY_CATEGORY_CONFIG, - icon=ICON_SPEAKER, + icon=ICON_SINE_WAVE, ), cv.Optional(CONF_AUDIO_LIMITER_LEVEL): select.select_schema( AudioLimiterLevelSelect, @@ -131,6 +143,26 @@ CONFIG_SCHEMA = cv.Schema( entity_category=ENTITY_CATEGORY_CONFIG, icon=ICON_SINE_WAVE, ), + cv.Optional(CONF_REF_CLK): select.select_schema( + RefClkSelect, + entity_category=ENTITY_CATEGORY_CONFIG, + icon=ICON_SINE_WAVE, + ), + cv.Optional(CONF_ALC_HIGH): select.select_schema( + AlcHighSelect, + entity_category=ENTITY_CATEGORY_CONFIG, + icon=ICON_SINE_WAVE, + ), + cv.Optional(CONF_ALC_HOLD_TIME): select.select_schema( + AlcHoldTimeSelect, + entity_category=ENTITY_CATEGORY_CONFIG, + icon=ICON_SINE_WAVE, + ), + cv.Optional(CONF_ALC_LOW): select.select_schema( + AlcLowSelect, + entity_category=ENTITY_CATEGORY_CONFIG, + icon=ICON_SINE_WAVE, + ), } ) @@ -158,3 +190,7 @@ async def to_code(config): await new_select(config, CONF_SILENCE_LOW_COUNTER, c.set_silence_low_counter_select, SILENCE_LOW_LEVEL_COUNTER) await new_select(config, CONF_XTAL_SEL, c.set_xtal_sel_select, XTAL_SEL) await new_select(config, CONF_FREQUENCY_DEVIATION, c.set_frequency_deviation_select, FREQUENCY_DEVIATION) + await new_select(config, CONF_REF_CLK, c.set_ref_clk_select, REFERENCE_CLOCK) + await new_select(config, CONF_ALC_HIGH, c.set_alc_high_select, ALC_HIGH) + await new_select(config, CONF_ALC_HOLD_TIME, c.set_alc_hold_time_select, ALC_HOLD_TIME) + await new_select(config, CONF_ALC_LOW, c.set_alc_low_select, ALC_LOW) diff --git a/esphome/components/kt0803/select/alc_high_select.cpp b/esphome/components/kt0803/select/alc_high_select.cpp new file mode 100644 index 0000000000..321e8e0803 --- /dev/null +++ b/esphome/components/kt0803/select/alc_high_select.cpp @@ -0,0 +1,14 @@ +#include "alc_high_select.h" + +namespace esphome { +namespace kt0803 { + +void AlcHighSelect::control(const std::string &value) { + this->publish_state(value); + if (auto index = this->active_index()) { + this->parent_->set_alc_high((AlcHigh) *index); + } +} + +} // namespace kt0803 +} // namespace esphome diff --git a/esphome/components/kt0803/select/alc_high_select.h b/esphome/components/kt0803/select/alc_high_select.h new file mode 100644 index 0000000000..154f4ff6b0 --- /dev/null +++ b/esphome/components/kt0803/select/alc_high_select.h @@ -0,0 +1,18 @@ +#pragma once + +#include "esphome/components/select/select.h" +#include "../kt0803.h" + +namespace esphome { +namespace kt0803 { + +class AlcHighSelect : public select::Select, public Parented { + public: + AlcHighSelect() = default; + + protected: + void control(const std::string &value) override; +}; + +} // namespace kt0803 +} // namespace esphome diff --git a/esphome/components/kt0803/select/alc_hold_time_select.cpp b/esphome/components/kt0803/select/alc_hold_time_select.cpp new file mode 100644 index 0000000000..a1e0732bad --- /dev/null +++ b/esphome/components/kt0803/select/alc_hold_time_select.cpp @@ -0,0 +1,14 @@ +#include "alc_hold_time_select.h" + +namespace esphome { +namespace kt0803 { + +void AlcHoldTimeSelect::control(const std::string &value) { + this->publish_state(value); + if (auto index = this->active_index()) { + this->parent_->set_alc_hold_time((AlcHoldTime) *index); + } +} + +} // namespace kt0803 +} // namespace esphome diff --git a/esphome/components/kt0803/select/alc_hold_time_select.h b/esphome/components/kt0803/select/alc_hold_time_select.h new file mode 100644 index 0000000000..cbc430b9f6 --- /dev/null +++ b/esphome/components/kt0803/select/alc_hold_time_select.h @@ -0,0 +1,18 @@ +#pragma once + +#include "esphome/components/select/select.h" +#include "../kt0803.h" + +namespace esphome { +namespace kt0803 { + +class AlcHoldTimeSelect : public select::Select, public Parented { + public: + AlcHoldTimeSelect() = default; + + protected: + void control(const std::string &value) override; +}; + +} // namespace kt0803 +} // namespace esphome diff --git a/esphome/components/kt0803/select/alc_low_select.cpp b/esphome/components/kt0803/select/alc_low_select.cpp new file mode 100644 index 0000000000..1e1dc648d4 --- /dev/null +++ b/esphome/components/kt0803/select/alc_low_select.cpp @@ -0,0 +1,14 @@ +#include "alc_low_select.h" + +namespace esphome { +namespace kt0803 { + +void AlcLowSelect::control(const std::string &value) { + this->publish_state(value); + if (auto index = this->active_index()) { + this->parent_->set_alc_low((AlcLow) *index); + } +} + +} // namespace kt0803 +} // namespace esphome diff --git a/esphome/components/kt0803/select/alc_low_select.h b/esphome/components/kt0803/select/alc_low_select.h new file mode 100644 index 0000000000..90f5fa2386 --- /dev/null +++ b/esphome/components/kt0803/select/alc_low_select.h @@ -0,0 +1,18 @@ +#pragma once + +#include "esphome/components/select/select.h" +#include "../kt0803.h" + +namespace esphome { +namespace kt0803 { + +class AlcLowSelect : public select::Select, public Parented { + public: + AlcLowSelect() = default; + + protected: + void control(const std::string &value) override; +}; + +} // namespace kt0803 +} // namespace esphome diff --git a/esphome/components/kt0803/select/ref_clk_select.cpp b/esphome/components/kt0803/select/ref_clk_select.cpp new file mode 100644 index 0000000000..5584fd1780 --- /dev/null +++ b/esphome/components/kt0803/select/ref_clk_select.cpp @@ -0,0 +1,14 @@ +#include "ref_clk_select.h" + +namespace esphome { +namespace kt0803 { + +void RefClkSelect::control(const std::string &value) { + this->publish_state(value); + if (auto index = this->active_index()) { + this->parent_->set_ref_clk((ReferenceClock) *index); + } +} + +} // namespace kt0803 +} // namespace esphome diff --git a/esphome/components/kt0803/select/ref_clk_select.h b/esphome/components/kt0803/select/ref_clk_select.h new file mode 100644 index 0000000000..ee2352f193 --- /dev/null +++ b/esphome/components/kt0803/select/ref_clk_select.h @@ -0,0 +1,18 @@ +#pragma once + +#include "esphome/components/select/select.h" +#include "../kt0803.h" + +namespace esphome { +namespace kt0803 { + +class RefClkSelect : public select::Select, public Parented { + public: + RefClkSelect() = default; + + protected: + void control(const std::string &value) override; +}; + +} // namespace kt0803 +} // namespace esphome diff --git a/esphome/components/kt0803/switch/__init__.py b/esphome/components/kt0803/switch/__init__.py index 1bd8930c3f..6abf63e922 100644 --- a/esphome/components/kt0803/switch/__init__.py +++ b/esphome/components/kt0803/switch/__init__.py @@ -4,7 +4,7 @@ import esphome.config_validation as cv from esphome.const import ( DEVICE_CLASS_SWITCH, ENTITY_CATEGORY_CONFIG, - ICON_SECURITY, + ICON_PULSE, ) from .. import ( CONF_KT0803_ID, @@ -19,12 +19,12 @@ from .. import ( CONF_PA_BIAS, CONF_SILENCE_DETECTION, CONF_AU_ENHANCE, + CONF_XTAL_ENABLE, + CONF_REF_CLK_ENABLE, ICON_VOLUME_MUTE, ICON_EAR_HEARING, ICON_SINE_WAVE, ICON_SLEEP, - ICON_RADIO_TOWER, - ICON_FORMAT_TEXT, ) MuteSwitch = kt0803_ns.class_("MuteSwitch", switch.Switch) @@ -36,6 +36,9 @@ StandbyEnableSwitch = kt0803_ns.class_("StandbyEnableSwitch", switch.Switch) PaBiasSwitch = kt0803_ns.class_("PaBiasSwitch", switch.Switch) SilenceDetectionSwitch = kt0803_ns.class_("SilenceDetectionSwitch", switch.Switch) AuEnhanceSwitch = kt0803_ns.class_("AuEnhanceSwitch", switch.Switch) +AuEnhanceSwitch = kt0803_ns.class_("AuEnhanceSwitch", switch.Switch) +XtalEnableSwitch = kt0803_ns.class_("XtalEnableSwitch", switch.Switch) +RefClkEnableSwitch = kt0803_ns.class_("RefClkEnableSwitch", switch.Switch) CONFIG_SCHEMA = cv.Schema( { @@ -94,6 +97,18 @@ CONFIG_SCHEMA = cv.Schema( entity_category=ENTITY_CATEGORY_CONFIG, icon=ICON_SINE_WAVE, ), + cv.Optional(CONF_XTAL_ENABLE): switch.switch_schema( + XtalEnableSwitch, + device_class=DEVICE_CLASS_SWITCH, + entity_category=ENTITY_CATEGORY_CONFIG, + icon=ICON_PULSE, + ), + cv.Optional(CONF_REF_CLK_ENABLE): switch.switch_schema( + RefClkEnableSwitch, + device_class=DEVICE_CLASS_SWITCH, + entity_category=ENTITY_CATEGORY_CONFIG, + icon=ICON_PULSE, + ), } ) @@ -116,3 +131,5 @@ async def to_code(config): await new_switch(config, CONF_PA_BIAS, c.set_pa_bias_switch) await new_switch(config, CONF_SILENCE_DETECTION, c.set_silence_detection_switch) await new_switch(config, CONF_AU_ENHANCE, c.set_au_enhance_switch) + await new_switch(config, CONF_XTAL_ENABLE, c.set_xtal_enable_switch) + await new_switch(config, CONF_REF_CLK_ENABLE, c.set_ref_clk_enable_switch) diff --git a/esphome/components/kt0803/switch/ref_clk_enable_switch.cpp b/esphome/components/kt0803/switch/ref_clk_enable_switch.cpp new file mode 100644 index 0000000000..87392aae50 --- /dev/null +++ b/esphome/components/kt0803/switch/ref_clk_enable_switch.cpp @@ -0,0 +1,12 @@ +#include "ref_clk_enable_switch.h" + +namespace esphome { +namespace kt0803 { + +void RefClkEnableSwitch::write_state(bool value) { + this->publish_state(value); + this->parent_->set_ref_clk_enable(value); +} + +} // namespace kt0803 +} // namespace esphome diff --git a/esphome/components/kt0803/switch/ref_clk_enable_switch.h b/esphome/components/kt0803/switch/ref_clk_enable_switch.h new file mode 100644 index 0000000000..a5d164011f --- /dev/null +++ b/esphome/components/kt0803/switch/ref_clk_enable_switch.h @@ -0,0 +1,18 @@ +#pragma once + +#include "esphome/components/switch/switch.h" +#include "../kt0803.h" + +namespace esphome { +namespace kt0803 { + +class RefClkEnableSwitch : public switch_::Switch, public Parented { + public: + RefClkEnableSwitch() = default; + + protected: + void write_state(bool value) override; +}; + +} // namespace kt0803 +} // namespace esphome diff --git a/esphome/components/kt0803/switch/xtal_enable_switch.cpp b/esphome/components/kt0803/switch/xtal_enable_switch.cpp new file mode 100644 index 0000000000..82b5d5101e --- /dev/null +++ b/esphome/components/kt0803/switch/xtal_enable_switch.cpp @@ -0,0 +1,12 @@ +#include "xtal_enable_switch.h" + +namespace esphome { +namespace kt0803 { + +void XtalEnableSwitch::write_state(bool value) { + this->publish_state(value); + this->parent_->set_xtal_enable(value); +} + +} // namespace kt0803 +} // namespace esphome diff --git a/esphome/components/kt0803/switch/xtal_enable_switch.h b/esphome/components/kt0803/switch/xtal_enable_switch.h new file mode 100644 index 0000000000..d0d193749a --- /dev/null +++ b/esphome/components/kt0803/switch/xtal_enable_switch.h @@ -0,0 +1,18 @@ +#pragma once + +#include "esphome/components/switch/switch.h" +#include "../kt0803.h" + +namespace esphome { +namespace kt0803 { + +class XtalEnableSwitch : public switch_::Switch, public Parented { + public: + XtalEnableSwitch() = default; + + protected: + void write_state(bool value) override; +}; + +} // namespace kt0803 +} // namespace esphome diff --git a/tests/components/kt0803/test.esp32-s3-ard.yaml b/tests/components/kt0803/test.esp32-s3-ard.yaml new file mode 100644 index 0000000000..e7d8487140 --- /dev/null +++ b/tests/components/kt0803/test.esp32-s3-ard.yaml @@ -0,0 +1,122 @@ +i2c: + sda: 10 + scl: 9 + scan: True + +kt0803: + id: kt0803_transmitter + chip_id: KT0803L + frequency: 87.5 + pga: -15 + rfgain: 108 + mute: False + mono: False + pre_emphasis: 75us + pilot_tone_amplitude: Low + bass_boost_control: Disabled + alc_enable: False + auto_pa_down: True + pa_down: False + standby_enable: False + alc_attack_time: 25us + alc_decay_time: 25us + pa_bias: False + audio_limiter_level: '0.875' + switch_mode: Mute + silence_detection: True + silence_high: '32mV' + silence_low: '8mV' + silence_duration: '100ms' + silence_high_counter: '15' + silence_low_counter: '1' + alc_gain: -3 + xtal_sel: '32.768kHz' + au_enhance: False + frequency_deviation: 75kHz + ref_clk: '32.768kHz' + xtal_enable: True + ref_clk_enable: False + alc_high: '0.6' + alc_hold_time: 5s + alc_low: '0.25' + pw_ok: + name: Power OK + slncid: + name: Silence Detected + update_interval: 3s + +number: + - platform: kt0803 + frequency: + id: kt0803_frequency + name: Frequency + pga: + name: PGA Gain Control + rfgain: + name: RF Gain + alc_gain: + name: ALC Gain + +switch: + - platform: kt0803 + mute: + name: Mute + mono: + name: Mono + alc_enable: + name: ALC Enable + auto_pa_down: + name: Automatic PA Power Down + pa_down: + name: PA Power Down + standby_enable: + name: Standby Enable + pa_bias: + name: PA Bias + silence_detection: + name: Silence Detection + au_enhance: + name: Audio Frequency Response Enhancement + xtal_enable: + name: Crystal Oscillator Enable + ref_clk_enable: + name: Refence Clock Enable + +select: + - platform: kt0803 + pre_emphasis: + name: Pre-emphasis + pilot_tone_amplitude: + name: Pilot Tone Amplitude + bass_boost_control: + name: Bass Boost Control + alc_attack_time: + name: ALC Attack Time + alc_decay_time: + name: ALC Decay Time + audio_limiter_level: + name: Audio Limiter Level + switch_mode: + name: Switching Channel Mode Selection + silence_high: + name: Silence High + silence_low: + name: Silence Low + silence_duration: + name: Silence Duration + silence_high_counter: + name: Silence High Counter + silence_low_counter: + name: Silence Low Counter + xtal_sel: + name: Xtal Selection + frequency_deviation: + name: Frequency Deviation + ref_clk: + name: Refence Clock + alc_high: + name: ALC High Threshold + alc_hold_time: + name: ALC Hold Time + alc_low: + name: ALC Low Threshold diff --git a/tests/components/kt0803/test.esp32-s3-idf.yaml b/tests/components/kt0803/test.esp32-s3-idf.yaml new file mode 100644 index 0000000000..e7d8487140 --- /dev/null +++ b/tests/components/kt0803/test.esp32-s3-idf.yaml @@ -0,0 +1,122 @@ +i2c: + sda: 10 + scl: 9 + scan: True + +kt0803: + id: kt0803_transmitter + chip_id: KT0803L + frequency: 87.5 + pga: -15 + rfgain: 108 + mute: False + mono: False + pre_emphasis: 75us + pilot_tone_amplitude: Low + bass_boost_control: Disabled + alc_enable: False + auto_pa_down: True + pa_down: False + standby_enable: False + alc_attack_time: 25us + alc_decay_time: 25us + pa_bias: False + audio_limiter_level: '0.875' + switch_mode: Mute + silence_detection: True + silence_high: '32mV' + silence_low: '8mV' + silence_duration: '100ms' + silence_high_counter: '15' + silence_low_counter: '1' + alc_gain: -3 + xtal_sel: '32.768kHz' + au_enhance: False + frequency_deviation: 75kHz + ref_clk: '32.768kHz' + xtal_enable: True + ref_clk_enable: False + alc_high: '0.6' + alc_hold_time: 5s + alc_low: '0.25' + pw_ok: + name: Power OK + slncid: + name: Silence Detected + update_interval: 3s + +number: + - platform: kt0803 + frequency: + id: kt0803_frequency + name: Frequency + pga: + name: PGA Gain Control + rfgain: + name: RF Gain + alc_gain: + name: ALC Gain + +switch: + - platform: kt0803 + mute: + name: Mute + mono: + name: Mono + alc_enable: + name: ALC Enable + auto_pa_down: + name: Automatic PA Power Down + pa_down: + name: PA Power Down + standby_enable: + name: Standby Enable + pa_bias: + name: PA Bias + silence_detection: + name: Silence Detection + au_enhance: + name: Audio Frequency Response Enhancement + xtal_enable: + name: Crystal Oscillator Enable + ref_clk_enable: + name: Refence Clock Enable + +select: + - platform: kt0803 + pre_emphasis: + name: Pre-emphasis + pilot_tone_amplitude: + name: Pilot Tone Amplitude + bass_boost_control: + name: Bass Boost Control + alc_attack_time: + name: ALC Attack Time + alc_decay_time: + name: ALC Decay Time + audio_limiter_level: + name: Audio Limiter Level + switch_mode: + name: Switching Channel Mode Selection + silence_high: + name: Silence High + silence_low: + name: Silence Low + silence_duration: + name: Silence Duration + silence_high_counter: + name: Silence High Counter + silence_low_counter: + name: Silence Low Counter + xtal_sel: + name: Xtal Selection + frequency_deviation: + name: Frequency Deviation + ref_clk: + name: Refence Clock + alc_high: + name: ALC High Threshold + alc_hold_time: + name: ALC Hold Time + alc_low: + name: ALC Low Threshold