From 0f802cdd4bcae6d7ad78dc68346035fdf7da5384 Mon Sep 17 00:00:00 2001
From: Shi Xin Ke <shixinke@espressif.com>
Date: Thu, 7 Nov 2024 18:21:42 +0800
Subject: [PATCH] fix(lightbulb): Fixed the issue of low power output in CCT
 mode

---
 components/led/lightbulb_driver/CHANGELOG.md  |  6 ++++++
 .../led/lightbulb_driver/idf_component.yml    |  2 +-
 .../led/lightbulb_driver/src/lightbulb.c      | 20 +++++++++----------
 .../lightbulb/main/lightbulb_example_main.c   | 14 ++++---------
 4 files changed, 21 insertions(+), 21 deletions(-)

diff --git a/components/led/lightbulb_driver/CHANGELOG.md b/components/led/lightbulb_driver/CHANGELOG.md
index d74992202..c2bcfe265 100644
--- a/components/led/lightbulb_driver/CHANGELOG.md
+++ b/components/led/lightbulb_driver/CHANGELOG.md
@@ -1,5 +1,11 @@
 # ChangeLog
 
+## v1.3.3 - 2024-11-07
+
+### Bug Fixes:
+
+* Fixed the issue of low power output in CCT mode.
+
 ## v1.3.2 - 2024-09-19
 
 ### Enhancements:
diff --git a/components/led/lightbulb_driver/idf_component.yml b/components/led/lightbulb_driver/idf_component.yml
index 96a1ec9b5..ef982c21f 100644
--- a/components/led/lightbulb_driver/idf_component.yml
+++ b/components/led/lightbulb_driver/idf_component.yml
@@ -1,4 +1,4 @@
-version: "1.3.2"
+version: "1.3.3"
 description: Provide multiple dimming driver solutions to easily build lightbulb applications
 url: https://github.com/espressif/esp-iot-solution/tree/master/components/led/lightbulb_driver
 dependencies:
diff --git a/components/led/lightbulb_driver/src/lightbulb.c b/components/led/lightbulb_driver/src/lightbulb.c
index d2a00aab4..3d96cccb4 100644
--- a/components/led/lightbulb_driver/src/lightbulb.c
+++ b/components/led/lightbulb_driver/src/lightbulb.c
@@ -300,43 +300,43 @@ static uint8_t precise_kelvin_convert_to_percentage(uint16_t kelvin)
  */
 static void cct_and_brightness_convert_and_power_limit(lightbulb_led_beads_comb_t led_beads, float multiple, uint8_t cct, uint8_t brightness, uint16_t white_value[])
 {
+    uint16_t max_value = 0;
+    hal_get_driver_feature(QUERY_MAX_INPUT_VALUE, &max_value);
+
     if (led_beads == LED_BEADS_1CH_C || led_beads == LED_BEADS_4CH_RGBC || led_beads == LED_BEADS_4CH_RGBCC) {
-        uint16_t value = brightness * 255 / 100;
+        uint16_t value = brightness / 100.0 * max_value;
         hal_get_linear_table_value((uint8_t)value, &white_value[3]);
         if (led_beads == LED_BEADS_4CH_RGBCC) {
             hal_get_linear_table_value((uint8_t)value, &white_value[4]);
         }
     } else if (led_beads == LED_BEADS_1CH_W || led_beads == LED_BEADS_4CH_RGBW || led_beads == LED_BEADS_4CH_RGBWW) {
-        uint16_t value = brightness * 255 / 100;
-        hal_get_linear_table_value((uint8_t)value, &white_value[4]);
+        uint16_t value = brightness / 100.0 * max_value;
+        hal_get_linear_table_value(value, &white_value[4]);
+
         if (led_beads == LED_BEADS_4CH_RGBWW) {
             hal_get_linear_table_value((uint8_t)value, &white_value[3]);
         }
     } else if ((led_beads == LED_BEADS_2CH_CW || led_beads == LED_BEADS_5CH_RGBCW) && IS_WHITE_OUTPUT_HARDWARE_MIXED()) {
-        uint16_t value1 = cct * 255 / 100;
-        uint16_t value2 = brightness * 255 / 100;
+        uint16_t value1 = cct / 100.0 * max_value;
+        uint16_t value2 = brightness / 100.0 * max_value;
         hal_get_linear_table_value((uint8_t)value1, &white_value[3]);
         hal_get_linear_table_value((uint8_t)value2, &white_value[4]);
     } else if (led_beads == LED_BEADS_2CH_CW || ((led_beads == LED_BEADS_5CH_RGBCW) && (s_lb_obj->cap.enable_precise_cct_control == false))) {
-        uint16_t max_value;
         float max_power;
         float _c = cct / 100.0;
         float _w = (100 - cct) / 100.0;
-
-        hal_get_driver_feature(QUERY_MAX_INPUT_VALUE, &max_value);
         float baseline = MAX(_c, _w);
+
         max_power = MIN(max_value * multiple, max_value / baseline);
         _c = max_power * _c * (brightness / 100.0);
         _w = max_power * _w * (brightness / 100.0);
         hal_get_linear_table_value((uint16_t)_c, &white_value[3]);
         hal_get_linear_table_value((uint16_t)_w, &white_value[4]);
     } else {
-        uint16_t max_value;
         float max_power;
         lightbulb_cct_mapping_data_t data = search_mapping_cct_data(cct);
         ESP_LOGD(TAG, "%f, %f, %f, %f, %f", data.rgbcw[0], data.rgbcw[1], data.rgbcw[2], data.rgbcw[3], data.rgbcw[4]);
 
-        hal_get_driver_feature(QUERY_MAX_INPUT_VALUE, &max_value);
         float baseline = MAX(data.rgbcw[0], data.rgbcw[1]);
         baseline = MAX(baseline, data.rgbcw[2]);
         baseline = MAX(baseline, data.rgbcw[3]);
diff --git a/examples/lighting/lightbulb/main/lightbulb_example_main.c b/examples/lighting/lightbulb/main/lightbulb_example_main.c
index bfa212efe..2ab3ddc6c 100644
--- a/examples/lighting/lightbulb/main/lightbulb_example_main.c
+++ b/examples/lighting/lightbulb/main/lightbulb_example_main.c
@@ -13,12 +13,10 @@
 const char *TAG = "lightbulb demo";
 
 //Based on PWM test 5ch (rgbcw)
-#define TEST_PWM_RGBCW_LIGHTBULB        1
 #define PWM_C_GPIO                      5
 #define PWM_W_GPIO                      4
 
 //Based on BP5758D test 5ch (rgbww)
-#define TEST_IIC_RGBWW_LIGHTBULB        1
 #define MIX_TABLE_SIZE                  15
 lightbulb_cct_mapping_data_t table[MIX_TABLE_SIZE] = {
     {.cct_kelvin = 2200, .cct_percentage = 0, .rgbcw = {0.547, 0.0, 0.0, 0.0, 0.453}},
@@ -102,8 +100,8 @@ void app_main(void)
         .type = DRIVER_BP57x8D,
         .driver_conf.bp57x8d.freq_khz = 300,
         .driver_conf.bp57x8d.enable_iic_queue = true,
-        .driver_conf.bp57x8d.iic_clk = 3,
-        .driver_conf.bp57x8d.iic_sda = 7,
+        .driver_conf.bp57x8d.iic_clk = CONFIG_BP5758D_IIC_CLK_GPIO,
+        .driver_conf.bp57x8d.iic_sda = CONFIG_BP5758D_IIC_SDA_GPIO,
         .driver_conf.bp57x8d.current = {10, 10, 10, 30, 30},
 #endif
         // 2. Configure the drive capability
@@ -114,11 +112,7 @@ void app_main(void)
 #if CONFIG_LIGHTBULB_DEMO_DRIVER_SELECT_WS2812
         .capability.led_beads = LED_BEADS_3CH_RGB,
 #elif CONFIG_LIGHTBULB_DEMO_DRIVER_SELECT_BP5758D
-#if TEST_IIC_RGBWW_LIGHTBULB
         .capability.led_beads = LED_BEADS_5CH_RGBCW,
-#else
-        .capability.led_beads = LED_BEADS_5CH_RGBCW,
-#endif
 #elif CONFIG_LIGHTBULB_DEMO_DRIVER_SELECT_PWM && TEST_PWM_RGBCW_LIGHTBULB
         .capability.led_beads = LED_BEADS_5CH_RGBCW,
 #else
@@ -135,8 +129,8 @@ void app_main(void)
         .io_conf.pwm_io.warm_brightness = PWM_W_GPIO,
 #endif
 #ifdef CONFIG_LIGHTBULB_DEMO_DRIVER_SELECT_BP5758D
-        .io_conf.iic_io.red = OUT1,
-        .io_conf.iic_io.green = OUT2,
+        .io_conf.iic_io.red = OUT2,
+        .io_conf.iic_io.green = OUT1,
         .io_conf.iic_io.blue = OUT3,
         .io_conf.iic_io.cold_white = OUT5,
         .io_conf.iic_io.warm_yellow = OUT4,