@@ -300,43 +300,43 @@ static uint8_t precise_kelvin_convert_to_percentage(uint16_t kelvin)
300
300
*/
301
301
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 [])
302
302
{
303
+ uint16_t max_value = 0 ;
304
+ hal_get_driver_feature (QUERY_MAX_INPUT_VALUE , & max_value );
305
+
303
306
if (led_beads == LED_BEADS_1CH_C || led_beads == LED_BEADS_4CH_RGBC || led_beads == LED_BEADS_4CH_RGBCC ) {
304
- uint16_t value = brightness * 255 / 100 ;
307
+ uint16_t value = brightness / 100.0 * max_value ;
305
308
hal_get_linear_table_value ((uint8_t )value , & white_value [3 ]);
306
309
if (led_beads == LED_BEADS_4CH_RGBCC ) {
307
310
hal_get_linear_table_value ((uint8_t )value , & white_value [4 ]);
308
311
}
309
312
} else if (led_beads == LED_BEADS_1CH_W || led_beads == LED_BEADS_4CH_RGBW || led_beads == LED_BEADS_4CH_RGBWW ) {
310
- uint16_t value = brightness * 255 / 100 ;
311
- hal_get_linear_table_value ((uint8_t )value , & white_value [4 ]);
313
+ uint16_t value = brightness / 100.0 * max_value ;
314
+ hal_get_linear_table_value (value , & white_value [4 ]);
315
+
312
316
if (led_beads == LED_BEADS_4CH_RGBWW ) {
313
317
hal_get_linear_table_value ((uint8_t )value , & white_value [3 ]);
314
318
}
315
319
} else if ((led_beads == LED_BEADS_2CH_CW || led_beads == LED_BEADS_5CH_RGBCW ) && IS_WHITE_OUTPUT_HARDWARE_MIXED ()) {
316
- uint16_t value1 = cct * 255 / 100 ;
317
- uint16_t value2 = brightness * 255 / 100 ;
320
+ uint16_t value1 = cct / 100.0 * max_value ;
321
+ uint16_t value2 = brightness / 100.0 * max_value ;
318
322
hal_get_linear_table_value ((uint8_t )value1 , & white_value [3 ]);
319
323
hal_get_linear_table_value ((uint8_t )value2 , & white_value [4 ]);
320
324
} else if (led_beads == LED_BEADS_2CH_CW || ((led_beads == LED_BEADS_5CH_RGBCW ) && (s_lb_obj -> cap .enable_precise_cct_control == false))) {
321
- uint16_t max_value ;
322
325
float max_power ;
323
326
float _c = cct / 100.0 ;
324
327
float _w = (100 - cct ) / 100.0 ;
325
-
326
- hal_get_driver_feature (QUERY_MAX_INPUT_VALUE , & max_value );
327
328
float baseline = MAX (_c , _w );
329
+
328
330
max_power = MIN (max_value * multiple , max_value / baseline );
329
331
_c = max_power * _c * (brightness / 100.0 );
330
332
_w = max_power * _w * (brightness / 100.0 );
331
333
hal_get_linear_table_value ((uint16_t )_c , & white_value [3 ]);
332
334
hal_get_linear_table_value ((uint16_t )_w , & white_value [4 ]);
333
335
} else {
334
- uint16_t max_value ;
335
336
float max_power ;
336
337
lightbulb_cct_mapping_data_t data = search_mapping_cct_data (cct );
337
338
ESP_LOGD (TAG , "%f, %f, %f, %f, %f" , data .rgbcw [0 ], data .rgbcw [1 ], data .rgbcw [2 ], data .rgbcw [3 ], data .rgbcw [4 ]);
338
339
339
- hal_get_driver_feature (QUERY_MAX_INPUT_VALUE , & max_value );
340
340
float baseline = MAX (data .rgbcw [0 ], data .rgbcw [1 ]);
341
341
baseline = MAX (baseline , data .rgbcw [2 ]);
342
342
baseline = MAX (baseline , data .rgbcw [3 ]);
0 commit comments