mirror of
https://github.com/arendst/Tasmota.git
synced 2025-07-25 11:46:31 +00:00
PWM_DIMMER: fix light fade stop, use dimmer_step
This commit is contained in:
parent
497d49b417
commit
fdc37ad276
@ -1818,6 +1818,7 @@ void LightAnimate(void)
|
|||||||
memcpy(Light.fade_start_10, cur_col_10, sizeof(Light.fade_start_10));
|
memcpy(Light.fade_start_10, cur_col_10, sizeof(Light.fade_start_10));
|
||||||
// push the final values at 8 and 10 bits resolution to the PWMs
|
// push the final values at 8 and 10 bits resolution to the PWMs
|
||||||
LightSetOutputs(cur_col_10);
|
LightSetOutputs(cur_col_10);
|
||||||
|
LightStopFade();
|
||||||
Light.fade_initialized = true; // it is now ok to fade
|
Light.fade_initialized = true; // it is now ok to fade
|
||||||
Light.fade_once_enabled = false; // light has been set, reset fade_once_enabled
|
Light.fade_once_enabled = false; // light has been set, reset fade_once_enabled
|
||||||
Light.speed_once_enabled = false; // light has been set, reset speed_once_enabled
|
Light.speed_once_enabled = false; // light has been set, reset speed_once_enabled
|
||||||
@ -1842,10 +1843,6 @@ void LightAnimate(void)
|
|||||||
LightSetOutputs(Light.fade_cur_10);
|
LightSetOutputs(Light.fade_cur_10);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#ifdef USE_PWM_DIMMER
|
|
||||||
// If the power is off and the fade is done, turn the relay off.
|
|
||||||
if (PWM_DIMMER == TasmotaGlobal.module_type && !Light.power && !Light.fade_running) PWMDimmerSetPower();
|
|
||||||
#endif // USE_PWM_DIMMER
|
|
||||||
// For WYZE bulbs we must set the CT pin (PWM2) to INPUT to fully turn it off
|
// For WYZE bulbs we must set the CT pin (PWM2) to INPUT to fully turn it off
|
||||||
if (TasmotaGlobal.gpio_optiona.pwm1_input && !Light.power && !Light.fade_running) { // GPIO Option_A1
|
if (TasmotaGlobal.gpio_optiona.pwm1_input && !Light.power && !Light.fade_running) { // GPIO Option_A1
|
||||||
if (PinUsed(GPIO_PWM1, 1)) { pinMode(Pin(GPIO_PWM1, 1), INPUT); }
|
if (PinUsed(GPIO_PWM1, 1)) { pinMode(Pin(GPIO_PWM1, 1), INPUT); }
|
||||||
@ -1902,6 +1899,14 @@ uint8_t LightGetCurFadeBri(void) {
|
|||||||
return max_bri;
|
return max_bri;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void LightStopFade(void) {
|
||||||
|
Light.fade_running = false;
|
||||||
|
#ifdef USE_PWM_DIMMER
|
||||||
|
// If the power is off and the fade is done, turn the relay off.
|
||||||
|
if (PWM_DIMMER == TasmotaGlobal.module_type && !Light.power) PWMDimmerSetPower();
|
||||||
|
#endif // USE_PWM_DIMMER
|
||||||
|
}
|
||||||
|
|
||||||
bool LightApplyFade(void) { // did the value chanegd and needs to be applied
|
bool LightApplyFade(void) { // did the value chanegd and needs to be applied
|
||||||
static uint32_t last_millis = 0;
|
static uint32_t last_millis = 0;
|
||||||
uint32_t now = millis();
|
uint32_t now = millis();
|
||||||
@ -1940,7 +1945,7 @@ bool LightApplyFade(void) { // did the value chanegd and needs to be applied
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// no fade needed, we keep the duration at zero, it will fallback directly to end of fade
|
// no fade needed, we keep the duration at zero, it will fallback directly to end of fade
|
||||||
Light.fade_running = false;
|
LightStopFade();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1960,7 +1965,7 @@ bool LightApplyFade(void) { // did the value chanegd and needs to be applied
|
|||||||
} else {
|
} else {
|
||||||
// stop fade
|
// stop fade
|
||||||
//AddLop_P2(LOG_LEVEL_DEBUG, PSTR("Stop fade"));
|
//AddLop_P2(LOG_LEVEL_DEBUG, PSTR("Stop fade"));
|
||||||
Light.fade_running = false;
|
LightStopFade();
|
||||||
Light.fade_start = 0;
|
Light.fade_start = 0;
|
||||||
Light.fade_duration = 0;
|
Light.fade_duration = 0;
|
||||||
// set light to target value
|
// set light to target value
|
||||||
@ -2937,7 +2942,7 @@ void CmndFade(void)
|
|||||||
#ifdef USE_DEVICE_GROUPS
|
#ifdef USE_DEVICE_GROUPS
|
||||||
if (XdrvMailbox.payload >= 0 && XdrvMailbox.payload <= 2) SendDeviceGroupMessage(Light.device, DGR_MSGTYP_UPDATE, DGR_ITEM_LIGHT_FADE, Settings->light_fade);
|
if (XdrvMailbox.payload >= 0 && XdrvMailbox.payload <= 2) SendDeviceGroupMessage(Light.device, DGR_MSGTYP_UPDATE, DGR_ITEM_LIGHT_FADE, Settings->light_fade);
|
||||||
#endif // USE_DEVICE_GROUPS
|
#endif // USE_DEVICE_GROUPS
|
||||||
if (!Settings->light_fade) { Light.fade_running = false; }
|
if (!Settings->light_fade) { LightStopFade(); }
|
||||||
}
|
}
|
||||||
ResponseCmndStateText(Settings->light_fade);
|
ResponseCmndStateText(Settings->light_fade);
|
||||||
}
|
}
|
||||||
@ -2951,7 +2956,7 @@ void CmndSpeed(void)
|
|||||||
Light.fade_once_value = (XdrvMailbox.payload > 0);
|
Light.fade_once_value = (XdrvMailbox.payload > 0);
|
||||||
Light.speed_once_enabled = true;
|
Light.speed_once_enabled = true;
|
||||||
Light.speed_once_value = XdrvMailbox.payload;
|
Light.speed_once_value = XdrvMailbox.payload;
|
||||||
if (!Light.fade_once_value) { Light.fade_running = false; }
|
if (!Light.fade_once_value) { LightStopFade(); }
|
||||||
}
|
}
|
||||||
ResponseCmndIdxNumber(Light.speed_once_value);
|
ResponseCmndIdxNumber(Light.speed_once_value);
|
||||||
} else {
|
} else {
|
||||||
|
@ -271,7 +271,8 @@ void PWMDimmerHandleButton(uint32_t button_index, bool pressed)
|
|||||||
{
|
{
|
||||||
bool handle_tap = false;
|
bool handle_tap = false;
|
||||||
bool state_updated = false;
|
bool state_updated = false;
|
||||||
int32_t bri_offset = 0;
|
int8_t bri_hold = 0;
|
||||||
|
int8_t bri_tap = 0;
|
||||||
uint8_t power_on_bri = 0;
|
uint8_t power_on_bri = 0;
|
||||||
uint8_t dgr_item = 0;
|
uint8_t dgr_item = 0;
|
||||||
uint8_t dgr_value = 0;
|
uint8_t dgr_value = 0;
|
||||||
@ -294,7 +295,7 @@ void PWMDimmerHandleButton(uint32_t button_index, bool pressed)
|
|||||||
uint32_t now = millis();
|
uint32_t now = millis();
|
||||||
|
|
||||||
// If the button was pressed and released but was not processed by support_button because the
|
// If the button was pressed and released but was not processed by support_button because the
|
||||||
// button interval had not elapsed,
|
// button interval had not elapsed, publish an MQTT message.
|
||||||
if (button_unprocessed[button_index]) {
|
if (button_unprocessed[button_index]) {
|
||||||
mqtt_trigger = 5;
|
mqtt_trigger = 5;
|
||||||
#ifdef USE_PWM_DIMMER_REMOTE
|
#ifdef USE_PWM_DIMMER_REMOTE
|
||||||
@ -314,9 +315,9 @@ void PWMDimmerHandleButton(uint32_t button_index, bool pressed)
|
|||||||
// The new brightness will be calculated below.
|
// The new brightness will be calculated below.
|
||||||
if (power_is_on) {
|
if (power_is_on) {
|
||||||
#ifdef USE_PWM_DIMMER_REMOTE
|
#ifdef USE_PWM_DIMMER_REMOTE
|
||||||
bri_offset = (active_remote_pwm_dimmer ? (active_remote_pwm_dimmer->power_button_increases_bri ? 1 : -1) : (power_button_increases_bri ? 1 : -1));
|
bri_hold = (active_remote_pwm_dimmer ? (active_remote_pwm_dimmer->power_button_increases_bri ? 1 : -1) : (power_button_increases_bri ? 1 : -1));
|
||||||
#else // USE_PWM_DIMMER_REMOTE
|
#else // USE_PWM_DIMMER_REMOTE
|
||||||
bri_offset = (power_button_increases_bri ? 1 : -1);
|
bri_hold = (power_button_increases_bri ? 1 : -1);
|
||||||
#endif // USE_PWM_DIMMER_REMOTE
|
#endif // USE_PWM_DIMMER_REMOTE
|
||||||
invert_power_button_bri_direction = true;
|
invert_power_button_bri_direction = true;
|
||||||
}
|
}
|
||||||
@ -351,7 +352,7 @@ void PWMDimmerHandleButton(uint32_t button_index, bool pressed)
|
|||||||
// Otherwise, if the power is on and remote mode is enabled, adjust the brightness. Set the
|
// Otherwise, if the power is on and remote mode is enabled, adjust the brightness. Set the
|
||||||
// direction based on which button is pressed. The new brightness will be calculated below.
|
// direction based on which button is pressed. The new brightness will be calculated below.
|
||||||
else if (power_is_on && Settings->flag4.multiple_device_groups) {
|
else if (power_is_on && Settings->flag4.multiple_device_groups) {
|
||||||
bri_offset = (is_down_button ? -1 : 1);
|
bri_hold = (is_down_button ? -1 : 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Otherwise, publish MQTT Event Trigger#.
|
// Otherwise, publish MQTT Event Trigger#.
|
||||||
@ -365,7 +366,7 @@ void PWMDimmerHandleButton(uint32_t button_index, bool pressed)
|
|||||||
// Otherwise, if the power is on, adjust the brightness. Set the direction based on which
|
// Otherwise, if the power is on, adjust the brightness. Set the direction based on which
|
||||||
// button is pressed. The new brightness will be calculated below.
|
// button is pressed. The new brightness will be calculated below.
|
||||||
else if (power_is_on && !button_tapped) {
|
else if (power_is_on && !button_tapped) {
|
||||||
bri_offset = (is_down_button ? -1 : 1);
|
bri_hold = (is_down_button ? -1 : 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -465,7 +466,7 @@ void PWMDimmerHandleButton(uint32_t button_index, bool pressed)
|
|||||||
// If the button was not held, adjust the brightness. Set the direction based on which
|
// If the button was not held, adjust the brightness. Set the direction based on which
|
||||||
// button is pressed. The new brightness will be calculated below.
|
// button is pressed. The new brightness will be calculated below.
|
||||||
if (!button_was_held) {
|
if (!button_was_held) {
|
||||||
bri_offset = (is_down_button ? -5 : 5);
|
bri_tap = (is_down_button ? -1 : 1);
|
||||||
dgr_more_to_come = false;
|
dgr_more_to_come = false;
|
||||||
state_updated = true;
|
state_updated = true;
|
||||||
}
|
}
|
||||||
@ -494,7 +495,7 @@ void PWMDimmerHandleButton(uint32_t button_index, bool pressed)
|
|||||||
|
|
||||||
// If we need to adjust the brightness, do it.
|
// If we need to adjust the brightness, do it.
|
||||||
int32_t negated_device_group_index = -power_button_index;
|
int32_t negated_device_group_index = -power_button_index;
|
||||||
if (bri_offset) {
|
if (bri_hold || bri_tap) {
|
||||||
int32_t bri;
|
int32_t bri;
|
||||||
#ifdef USE_PWM_DIMMER_REMOTE
|
#ifdef USE_PWM_DIMMER_REMOTE
|
||||||
if (active_remote_pwm_dimmer)
|
if (active_remote_pwm_dimmer)
|
||||||
@ -502,8 +503,16 @@ void PWMDimmerHandleButton(uint32_t button_index, bool pressed)
|
|||||||
else
|
else
|
||||||
#endif // USE_PWM_DIMMER_REMOTE
|
#endif // USE_PWM_DIMMER_REMOTE
|
||||||
bri = light_state.getBri();
|
bri = light_state.getBri();
|
||||||
int32_t new_bri = bri + bri_offset * (Settings->light_correction ? 4 : bri / 16 + 1);
|
int32_t bri_offset = Settings->dimmer_step;
|
||||||
|
if (bri_tap)
|
||||||
|
bri_offset *= bri_tap;
|
||||||
|
else {
|
||||||
|
bri_offset /= 5;
|
||||||
|
if (!Settings->light_correction) bri_offset *= bri / 32;
|
||||||
|
if (bri_offset < 1) bri_offset = 1;
|
||||||
|
bri_offset *= bri_hold;
|
||||||
|
}
|
||||||
|
int32_t new_bri = bri + bri_offset;
|
||||||
if (bri_offset > 0) {
|
if (bri_offset > 0) {
|
||||||
if (new_bri > 255) new_bri = 255;
|
if (new_bri > 255) new_bri = 255;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user