From 6edfe8d8b4fc7e9a49585e4a61a40a2732ce5b6e Mon Sep 17 00:00:00 2001 From: NewoPL <27411874+NewoPL@users.noreply.github.com> Date: Thu, 31 Oct 2024 18:20:59 +0100 Subject: [PATCH] [kp18058] take softI2C class outside of the component. Fix Arduino 2 clang formatting issues --- esphome/components/i2c_soft/__init__.py | 1 + .../{kp18058 => i2c_soft}/softi2c.cpp | 42 +++++++++---------- .../{kp18058 => i2c_soft}/softi2c.h | 12 +++--- esphome/components/kp18058/__init__.py | 3 +- esphome/components/kp18058/kp18058.cpp | 16 +++---- esphome/components/kp18058/kp18058.h | 37 ++++++++-------- .../kp18058/{message.h => kp18058_cfg.h} | 0 esphome/components/kp18058/output.py | 2 +- 8 files changed, 57 insertions(+), 56 deletions(-) create mode 100644 esphome/components/i2c_soft/__init__.py rename esphome/components/{kp18058 => i2c_soft}/softi2c.cpp (80%) rename esphome/components/{kp18058 => i2c_soft}/softi2c.h (93%) rename esphome/components/kp18058/{message.h => kp18058_cfg.h} (100%) diff --git a/esphome/components/i2c_soft/__init__.py b/esphome/components/i2c_soft/__init__.py new file mode 100644 index 0000000000..703860bb81 --- /dev/null +++ b/esphome/components/i2c_soft/__init__.py @@ -0,0 +1 @@ +CODEOWNERS = ["@NewoPL"] diff --git a/esphome/components/kp18058/softi2c.cpp b/esphome/components/i2c_soft/softi2c.cpp similarity index 80% rename from esphome/components/kp18058/softi2c.cpp rename to esphome/components/i2c_soft/softi2c.cpp index faf9d5f454..2e46b94631 100644 --- a/esphome/components/kp18058/softi2c.cpp +++ b/esphome/components/i2c_soft/softi2c.cpp @@ -1,7 +1,7 @@ #include "softi2c.h" namespace esphome { -namespace kp18058 { +namespace i2c_soft { // Hold time is 250 ns static const uint8_t SOFT_I2C_CLOCK_TIME = 50; @@ -12,15 +12,15 @@ void ns_sleep(int ns_delay) { __asm__("nop"); } -bool softI2C::reset() { +bool SoftI2C::reset() { // Ensure SDA is released (high) to avoid conflict during reset - set_high(data_pin_); + set_high_(data_pin_); // Clock SCL up to 9 times to clear any stuck data for (int i = 0; i < 9; ++i) { - set_high(clock_pin_); + set_high_(clock_pin_); ns_sleep(SOFT_I2C_CLOCK_TIME / 2); - set_low(clock_pin_); + set_low_(clock_pin_); ns_sleep(SOFT_I2C_CLOCK_TIME / 2); // Check if SDA is released (high) by the device during clocking @@ -44,18 +44,18 @@ bool softI2C::reset() { return (data_pin_->digital_read()) && (clock_pin_->digital_read()); } -bool softI2C::write_byte(uint8_t value) { +bool SoftI2C::write_byte(uint8_t value) { ns_sleep(SOFT_I2C_CLOCK_TIME / 2); for (uint8_t curr = 0x80; curr != 0; curr >>= 1) { if (curr & value) { - set_high(data_pin_); + set_high_(data_pin_); } else { - set_low(data_pin_); + set_low_(data_pin_); } - set_high(clock_pin_); + set_high_(clock_pin_); ns_sleep(SOFT_I2C_CLOCK_TIME); - set_low(clock_pin_); + set_low_(clock_pin_); // Data is written to the register on the falling edge of SCL // it needs to be valid through at least HOLD TIME // waiting half a cycle assuming it is longer than HOLD_TIME @@ -66,34 +66,34 @@ bool softI2C::write_byte(uint8_t value) { // is completed, in the ninth SCL, KP18058 internally // generates a response signal ACK bool ack_received; - set_high(data_pin_); - set_high(clock_pin_); + set_high_(data_pin_); + set_high_(clock_pin_); ns_sleep(SOFT_I2C_CLOCK_TIME / 2); ack_received = !data_pin_->digital_read(); ns_sleep(SOFT_I2C_CLOCK_TIME / 2); - set_low(clock_pin_); + set_low_(clock_pin_); return ack_received; } -void softI2C::start() { - set_low(data_pin_); +void SoftI2C::start() { + set_low_(data_pin_); // It needs to be valid through at least HOLD TIME // Waiting half a cycle. Assuming it is longer than HOLD_TIME ns_sleep(SOFT_I2C_CLOCK_TIME / 2); - set_low(clock_pin_); + set_low_(clock_pin_); } -void softI2C::stop() { +void SoftI2C::stop() { ns_sleep(SOFT_I2C_CLOCK_TIME / 2); - set_low(data_pin_); + set_low_(data_pin_); // It needs to be valid through at least HOLD TIME // Waiting half a cycle. Assuming it is longer than HOLD_TIME ns_sleep(SOFT_I2C_CLOCK_TIME / 2); - set_high(clock_pin_); + set_high_(clock_pin_); ns_sleep(SOFT_I2C_CLOCK_TIME / 2); - set_high(data_pin_); + set_high_(data_pin_); } -} // namespace kp18058 +} // namespace i2c_soft } // namespace esphome diff --git a/esphome/components/kp18058/softi2c.h b/esphome/components/i2c_soft/softi2c.h similarity index 93% rename from esphome/components/kp18058/softi2c.h rename to esphome/components/i2c_soft/softi2c.h index 79fa151743..f9eef02e88 100644 --- a/esphome/components/kp18058/softi2c.h +++ b/esphome/components/i2c_soft/softi2c.h @@ -3,7 +3,7 @@ #include "esphome/core/gpio.h" namespace esphome { -namespace kp18058 { +namespace i2c_soft { /** * @brief Class to implement a software I2C protocol. @@ -11,9 +11,9 @@ namespace kp18058 { * This class allows communication with I2C devices using GPIO pins * to simulate I2C communication through software control. */ -class softI2C { +class SoftI2C { public: - softI2C() : data_pin_(nullptr), clock_pin_(nullptr) {} + SoftI2C() : data_pin_(nullptr), clock_pin_(nullptr) {} /** * @brief Sets up the I2C pins. @@ -101,7 +101,7 @@ class softI2C { * * @param pin Pointer to the GPIOPin object representing the pin to set low. */ - void set_low(GPIOPin *pin) { + void set_low_(GPIOPin *pin) { pin->pin_mode(gpio::FLAG_OUTPUT); pin->digital_write(false); } @@ -113,11 +113,11 @@ class softI2C { * * @param pin Pointer to the GPIOPin object representing the pin to set high. */ - void set_high(GPIOPin *pin) { pin->pin_mode(gpio::FLAG_INPUT | gpio::FLAG_PULLUP); } + void set_high_(GPIOPin *pin) { pin->pin_mode(gpio::FLAG_INPUT | gpio::FLAG_PULLUP); } GPIOPin *data_pin_; ///< Pointer to the GPIOPin object for the data line (SDA). GPIOPin *clock_pin_; ///< Pointer to the GPIOPin object for the clock line (SCL). }; -} // namespace kp18058 +} // namespace i2c_soft } // namespace esphome diff --git a/esphome/components/kp18058/__init__.py b/esphome/components/kp18058/__init__.py index ed81d3b2e0..0b74af757b 100644 --- a/esphome/components/kp18058/__init__.py +++ b/esphome/components/kp18058/__init__.py @@ -3,6 +3,7 @@ import esphome.codegen as cg import esphome.config_validation as cv from esphome.const import CONF_CLOCK_PIN, CONF_DATA_PIN, CONF_ID +AUTO_LOAD = ["i2c_soft"] CODEOWNERS = ["@NewoPL"] MULTI_CONF = True @@ -11,7 +12,7 @@ CONF_CW_CURRENT = "cw_current" CONF_RGB_CURRENT = "rgb_current" KP18058_ns = cg.esphome_ns.namespace("kp18058") -KP18058 = KP18058_ns.class_("kp18058", cg.Component) +KP18058 = KP18058_ns.class_("KP18058", cg.Component) CONFIG_SCHEMA = cv.Schema( { diff --git a/esphome/components/kp18058/kp18058.cpp b/esphome/components/kp18058/kp18058.cpp index e84e55d246..f2a201c561 100644 --- a/esphome/components/kp18058/kp18058.cpp +++ b/esphome/components/kp18058/kp18058.cpp @@ -1,10 +1,10 @@ #include "kp18058.h" -#include "message.h" +#include "kp18058_cfg.h" namespace esphome { namespace kp18058 { -static const char *const TAG = "kp18058"; +static const char *const TAG = "KP18058"; static const uint8_t I2C_MAX_RETRY = 3; #define BIT_CHECK(PIN, N) !!(((PIN) & (1 << (N)))) @@ -18,18 +18,18 @@ uint8_t get_parity_bit(uint8_t b) { return sum % 2; // 0 for even, 1 for odd } -kp18058::kp18058() : max_cw_current_(0), max_rgb_current_(0), i2c_ready_(false) { +KP18058::KP18058() : max_cw_current_(0), max_rgb_current_(0), i2c_ready_(false) { for (auto &channel : channels_) { channel = nullptr; } } -void kp18058::setup() { +void KP18058::setup() { i2c_.setup(); i2c_ready_ = i2c_.reset(); } -void kp18058::dump_config() { +void KP18058::dump_config() { ESP_LOGCONFIG(TAG, "KP18058 LED Driver:"); LOG_PIN(" Data Pin: ", i2c_.get_data_pin()); LOG_PIN(" Clock Pin: ", i2c_.get_clock_pin()); @@ -38,7 +38,7 @@ void kp18058::dump_config() { ESP_LOGCONFIG(TAG, " RGB max current: %.1f", this->max_rgb_current_); } -void kp18058::program_led_driver() { +void KP18058::program_led_driver() { if (!i2c_ready_) { ESP_LOGI(TAG, "Reestablishing communication with KP18058."); i2c_ready_ = i2c_.reset(); @@ -90,8 +90,8 @@ void kp18058::program_led_driver() { } // Calculate parity bits for each byte - for (int i = 0; i < sizeof(KP18058_Settings); ++i) { - settings.bytes[i] |= get_parity_bit(settings.bytes[i]); + for (auto &byte : settings.bytes) { + byte |= get_parity_bit(byte); } // Send the I2C message diff --git a/esphome/components/kp18058/kp18058.h b/esphome/components/kp18058/kp18058.h index dfb6a93cd0..984c7d1a0f 100644 --- a/esphome/components/kp18058/kp18058.h +++ b/esphome/components/kp18058/kp18058.h @@ -3,17 +3,16 @@ #include "esphome/core/log.h" #include "esphome/core/gpio.h" #include "esphome/core/component.h" +#include "esphome/components/i2c_soft/softi2c.h" #include "esphome/components/output/float_output.h" -#include "softi2c.h" - namespace esphome { namespace kp18058 { // KP18058 main component for controlling LED drivers over soft I2C -class kp18058 : public Component { +class KP18058 : public Component { public: - kp18058(); + KP18058(); void setup() override; /** @@ -31,12 +30,12 @@ class kp18058 : public Component { void set_i2c_pins(GPIOPin *data_pin, GPIOPin *clock_pin) { i2c_.set_pins(data_pin, clock_pin); } /** - * Assigns an output channel to the kp18058 driver for LED control. + * Assigns an output channel to the KP18058 driver for LED control. * * @param channel The output channel to assign (1-5). * @param output Pointer to the kp18058_output instance for this channel. */ - void set_output_channel(uint8_t channel, class kp18058_output *output) { channels_[channel - 1] = output; } + void set_output_channel(uint8_t channel, class KP18058_output *output) { channels_[channel - 1] = output; } /** * Sets the maximum current for the CW (cold-white) channels. @@ -63,26 +62,26 @@ class kp18058 : public Component { float max_rgb_current_; private: - class kp18058_output *channels_[5]; - class softI2C i2c_; + class KP18058_output *channels_[5]; + class i2c_soft::SoftI2C i2c_; bool i2c_ready_; }; // class represents an output channel for the KP18058 LED driver -class kp18058_output : public output::FloatOutput { +class KP18058_output : public output::FloatOutput { public: /** - * Constructor for the kp18058_output class. + * Constructor for the KP18058_output class. * Initializes the channel with default values. */ - kp18058_output() : value_(0), parent_(nullptr) {} + KP18058_output() : value_(0), parent_(nullptr) {} /** - * Sets the parent kp18058 driver instance for this output channel. + * Sets the parent KP18058 driver instance for this output channel. * - * @param parent Pointer to the parent kp18058 instance. + * @param parent Pointer to the parent KP18058 instance. */ - void set_parent(kp18058 *parent) { parent_ = parent; } + void set_parent(KP18058 *parent) { parent_ = parent; } /** * Retrieves the current grayscale value for this output channel. @@ -100,11 +99,11 @@ class kp18058_output : public output::FloatOutput { * the parent class to program the LED driver. */ void write_state(float state) override { - if (state >= 1) + if (state >= 1) { state = 1; - else if (state <= 0) + } else if (state <= 0) { state = 0; - + } // Convert brightness state (0.0 - 1.0) to 10-bit value (0 - 1023). value_ = static_cast(roundf(state * 1023)); @@ -114,8 +113,8 @@ class kp18058_output : public output::FloatOutput { // 10-bit grayscale value representing intensity (0-1023) of the output. uint16_t value_; - // Pointer to the parent kp18058 driver class for this output channel. - kp18058 *parent_; + // Pointer to the parent KP18058 driver class for this output channel. + KP18058 *parent_; }; } // namespace kp18058 diff --git a/esphome/components/kp18058/message.h b/esphome/components/kp18058/kp18058_cfg.h similarity index 100% rename from esphome/components/kp18058/message.h rename to esphome/components/kp18058/kp18058_cfg.h diff --git a/esphome/components/kp18058/output.py b/esphome/components/kp18058/output.py index 43186f75b7..61109232c8 100644 --- a/esphome/components/kp18058/output.py +++ b/esphome/components/kp18058/output.py @@ -6,7 +6,7 @@ from esphome.const import CONF_CHANNEL, CONF_ID from . import KP18058 KP18058_ns = cg.esphome_ns.namespace("kp18058") -DriverOutput = KP18058_ns.class_("kp18058_output", output.FloatOutput) +DriverOutput = KP18058_ns.class_("KP18058_output", output.FloatOutput) CONF_KP18058_ID = "kp18058_id"