diff --git a/application/ws63/user_main/spotlight/spotlight_main.c b/application/ws63/user_main/spotlight/spotlight_main.c index 514ab31..55e4b76 100755 --- a/application/ws63/user_main/spotlight/spotlight_main.c +++ b/application/ws63/user_main/spotlight/spotlight_main.c @@ -938,19 +938,30 @@ static void stop_save_task(void) int set_light(light_ctrl_source_e source, int32_t brightness_local_target, int32_t cct_local_target) { + bool was_on = g_device_control.on; struct fade_ctx_t tmp_fade_ctx = {0}; if (fade_ctx.is_fading) { - cancel_current_light_fade(); + bool closing_fade_active = fade_ctx.is_closing_fade; + bool suppress_cancel = false; + // 在关灯渐变过程中,属性/模式变更不应打断关灯过程 + if (closing_fade_active) { + if (source == APP_CHANGE_LIGHT_BRIGHTNESS_CCT || source == APP_CHANGE_LIGHT_MODE || source == APP_CLOSE_LIGHT) { + suppress_cancel = true; // 允许继续关灯渐变;再次关灯请求可复用或稍后重启 + } + } + if (!suppress_cancel) { + cancel_current_light_fade(); + } } // 如果打开灯,则需要手动将前置状态设置为关闭的样子,这样子后面计算渐变才能正常计算 if (APP_OPEN_LIGHT == source || DEV_POWER_ON == source) { g_device_control.on = true; - if (DEV_POWER_ON == source) { - // 🔧 开机渐变:明确设置从0开始 - fade_ctx.current_brightness = 0; // 从0开始渐变 + if (DEV_POWER_ON == source || (APP_OPEN_LIGHT == source && !was_on)) { + // 开机或关灯→开灯:从0开始渐变 + fade_ctx.current_brightness = 0; fade_ctx.current_cct = g_device_control.cct_local; // 色温保持目标值 - e_printf("[set_light] 开机渐变设置: brightness=0->%d, cct=%d\n", + e_printf("[set_light] 开灯渐变设置: brightness=0->%d, cct=%d\n", g_device_control.brightness_local, fade_ctx.current_cct); } @@ -964,15 +975,24 @@ int set_light(light_ctrl_source_e source, } } memcpy(&tmp_fade_ctx, &fade_ctx, FADE_CTRL_DATA_SIZE(fade_ctx)); - // tmp_fade_ctx.target_brightness = tmp_fade_ctx.current_brightness; + // 默认目标应为“当前设备状态”,避免在未指定字段时误用上一次渐变的目标(可能为0)。 + tmp_fade_ctx.target_brightness = g_device_control.brightness_local; + tmp_fade_ctx.target_cct = g_device_control.cct_local; + if (brightness_local_target >= 0) { BRIGHTNESS_LITME_RANGE(brightness_local_target); tmp_fade_ctx.target_brightness = brightness_local_target; + } else { + e_printf("[set_light] keep brightness:%d (source:%d)\r\n", + tmp_fade_ctx.target_brightness, source); } - // tmp_fade_ctx.target_cct = tmp_fade_ctx.current_cct; + if (cct_local_target >= 0) { CCT_LITME_RANGE(cct_local_target); tmp_fade_ctx.target_cct = cct_local_target; + } else { + e_printf("[set_light] keep cct:%d (source:%d)\r\n", + tmp_fade_ctx.target_cct, source); } e_printf("source:%d, lightMode:%d, local brightness: base:%d, target:%d, local cct: base:%d, target:%d\r\n", source, g_device_control.elightMode, tmp_fade_ctx.current_brightness, @@ -1005,53 +1025,88 @@ int set_light(light_ctrl_source_e source, case APP_OPEN_LIGHT: tmp_fade_ctx.fade_time = NORMAL_FADE_TIME; // 上电时,直接设置为默认渐变时长 case APP_CHANGE_LIGHT_MODE: - // 直接将信息更新到目标值 - if (g_device_control.colourMode == COLOUR_MODE_DUAL) { - g_device_control.cct_local = tmp_fade_ctx.target_cct; + // 开灯场景或上电:执行渐变;关灯状态下仅更新目标不执行渐变 + if (was_on || source != APP_CHANGE_LIGHT_MODE) { + if (g_device_control.colourMode == COLOUR_MODE_DUAL) { + g_device_control.cct_local = tmp_fade_ctx.target_cct; + } + g_device_control.brightness_local = tmp_fade_ctx.target_brightness; + tmp_fade_ctx.is_fading = true; + tmp_fade_ctx.fade_completed = false; + if (tmp_fade_ctx.is_fading) { + cancel_current_light_fade(); + } + calculate_fade_steps(&tmp_fade_ctx); + memcpy(&fade_ctx, &tmp_fade_ctx, FADE_CTRL_DATA_SIZE(tmp_fade_ctx)); + e_printf("start fade\r\n"); + fade_ctx.timer_active = true; + uapi_timer_start(fade_ctx.timer_handle, fade_ctx.update_interval, fade_timer_callback, 0); + start_report_task(REPORT_SWITCH | REPORT_BRIGHTNESS | REPORT_CCT | REPORT_LIGHT_MODE | REPORT_COLOUR_MODE); + req_save_device_data(); + return 0; // 异步上报 + } else { + // 灯处于关闭:仅更新目标值,保持当前亮度为0,不触发渐变 + if (g_device_control.colourMode == COLOUR_MODE_DUAL) { + g_device_control.cct_local = tmp_fade_ctx.target_cct; + // 关灯渐变进行中不改动 fade_ctx,避免打断渐变过程的内部状态 + if (!fade_ctx.is_closing_fade) { + fade_ctx.current_cct = tmp_fade_ctx.target_cct; // 预设色温,开灯后按新色温渐变 + } + } + g_device_control.brightness_local = tmp_fade_ctx.target_brightness; + e_printf("[set_light] off-state mode change, preserve current_brightness:%d, target_brightness:%d\r\n", + fade_ctx.current_brightness, g_device_control.brightness_local); + start_report_task(REPORT_BRIGHTNESS | REPORT_CCT | REPORT_LIGHT_MODE | REPORT_COLOUR_MODE); + req_save_device_data(); + return -111; } - g_device_control.brightness_local = tmp_fade_ctx.target_brightness; - //情景模式或者上电时直接切换到对应的色温和亮度 - tmp_fade_ctx.is_fading = true; - tmp_fade_ctx.fade_completed = false; - if (tmp_fade_ctx.is_fading) { - cancel_current_light_fade(); - } - calculate_fade_steps(&tmp_fade_ctx); - memcpy(&fade_ctx, &tmp_fade_ctx, FADE_CTRL_DATA_SIZE(tmp_fade_ctx)); - e_printf("start fade\r\n"); - fade_ctx.timer_active = true; - uapi_timer_start(fade_ctx.timer_handle, fade_ctx.update_interval, fade_timer_callback, 0); - start_report_task(REPORT_SWITCH | REPORT_BRIGHTNESS | REPORT_CCT | REPORT_LIGHT_MODE | REPORT_COLOUR_MODE); - req_save_device_data(); - return 0; // 异步上报 break; case APP_CHANGE_LIGHT_BRIGHTNESS_CCT: - // 直接将信息更新到目标值 - if (g_device_control.colourMode == COLOUR_MODE_DUAL) { //只有双色温模式下,色温才会变化 - g_device_control.cct_local = tmp_fade_ctx.target_cct; + if (!was_on) { + // 关灯状态:仅更新目标,不执行渐变,保持 current_brightness=0,避免开灯时跳变 + if (g_device_control.colourMode == COLOUR_MODE_DUAL && cct_local_target >= 0) { + g_device_control.cct_local = tmp_fade_ctx.target_cct; + if (!fade_ctx.is_closing_fade) { + fade_ctx.current_cct = tmp_fade_ctx.target_cct; // 预设色温 + } + } + if (brightness_local_target >= 0) { + g_device_control.brightness_local = tmp_fade_ctx.target_brightness; + } + e_printf("[set_light] off-state attr change, keep current_brightness:%d, target_brightness:%d\r\n", + fade_ctx.current_brightness, g_device_control.brightness_local); + start_report_task(REPORT_BRIGHTNESS | REPORT_CCT | REPORT_LIGHT_MODE | REPORT_COLOUR_MODE); + req_save_device_data(); + } else { + // 开灯状态:执行正常渐变 + if (g_device_control.colourMode == COLOUR_MODE_DUAL && cct_local_target >= 0) { // 双色温且明确修改时才更新色温 + g_device_control.cct_local = tmp_fade_ctx.target_cct; + } + if (brightness_local_target >= 0) { // 明确修改亮度时才更新亮度 + g_device_control.brightness_local = tmp_fade_ctx.target_brightness; + } + tmp_fade_ctx.is_fading = true; + tmp_fade_ctx.fade_completed = false; + if (tmp_fade_ctx.is_fading) { + cancel_current_light_fade(); + } + calculate_fade_steps(&tmp_fade_ctx); + memcpy(&fade_ctx, &tmp_fade_ctx, FADE_CTRL_DATA_SIZE(tmp_fade_ctx)); + e_printf("start fade\r\n"); + fade_ctx.timer_active = true; + uapi_timer_start(fade_ctx.timer_handle, fade_ctx.update_interval, fade_timer_callback, 0); + start_report_task(REPORT_BRIGHTNESS | REPORT_CCT | REPORT_LIGHT_MODE | REPORT_COLOUR_MODE); + req_save_device_data(); } - g_device_control.brightness_local = tmp_fade_ctx.target_brightness; - tmp_fade_ctx.is_fading = true; - tmp_fade_ctx.fade_completed = false; - if (tmp_fade_ctx.is_fading) { - cancel_current_light_fade(); - } - calculate_fade_steps(&tmp_fade_ctx); - memcpy(&fade_ctx, &tmp_fade_ctx, FADE_CTRL_DATA_SIZE(tmp_fade_ctx)); - e_printf("start fade\r\n"); - fade_ctx.timer_active = true; - uapi_timer_start(fade_ctx.timer_handle, fade_ctx.update_interval, fade_timer_callback, 0); - start_report_task(REPORT_BRIGHTNESS | REPORT_CCT | REPORT_LIGHT_MODE | REPORT_COLOUR_MODE); - req_save_device_data(); - #if 0 +#if 0 等待渐变完成 while (!fade_ctx.fade_completed) { msleep(10); } return 0; // 同步上报 - #else +#else return -111; // 异步上报 - #endif +#endif break; } e_printf("set_light error, source:%d, current_brightness_local:%d, current_cct_local:%d, brightness_local_target:%d, cct_local_target:%d\r\n", diff --git a/output/SR_light-LPT262_hilink-20251116-1.0.6.fwpkg b/output/SR_light-LPT262_hilink-20251116-1.0.6.fwpkg new file mode 100644 index 0000000..c4142e8 Binary files /dev/null and b/output/SR_light-LPT262_hilink-20251116-1.0.6.fwpkg differ diff --git a/output/package(SR_light-LPT262_hilink-20251116-1.0.6).zip b/output/package(SR_light-LPT262_hilink-20251116-1.0.6).zip new file mode 100644 index 0000000..2e3344f Binary files /dev/null and b/output/package(SR_light-LPT262_hilink-20251116-1.0.6).zip differ