From 0d552cd8808a78d39ff0cc637c608601239647fb Mon Sep 17 00:00:00 2001 From: Blaz Kristan Date: Wed, 25 Aug 2021 21:24:56 +0200 Subject: [PATCH] Button rewrite. Buttons >0 behave differently than 0. --- wled00/button.cpp | 109 +++++++++++++++++++++++++++------------------- wled00/wled.h | 2 +- 2 files changed, 66 insertions(+), 45 deletions(-) diff --git a/wled00/button.cpp b/wled00/button.cpp index ba6a0c973..bd409060f 100644 --- a/wled00/button.cpp +++ b/wled00/button.cpp @@ -10,10 +10,11 @@ static const char _mqtt_topic_button[] PROGMEM = "%s/button/%d"; // optimize fl void shortPressAction(uint8_t b) { - if (!macroButton[b]) - { - toggleOnOff(); - colorUpdated(CALL_MODE_BUTTON); + if (!macroButton[b]) { + switch (b) { + case 0: toggleOnOff(); colorUpdated(CALL_MODE_BUTTON); break; + default: ++effectCurrent %= strip.getModeCount(); colorUpdated(CALL_MODE_BUTTON); break; + } } else { applyPreset(macroButton[b], CALL_MODE_BUTTON); } @@ -26,6 +27,44 @@ void shortPressAction(uint8_t b) } } +void longPressAction(uint8_t b) +{ + if (!macroLongPress[b]) { + switch (b) { + case 0: _setRandomColor(false,true); break; + default: bri += 8; colorUpdated(CALL_MODE_BUTTON); buttonPressedTime[b] = millis(); break; // repeatable action + } + } else { + applyPreset(macroLongPress[b], CALL_MODE_BUTTON); + } + + // publish MQTT message + if (buttonPublishMqtt && WLED_MQTT_CONNECTED) { + char subuf[64]; + sprintf_P(subuf, _mqtt_topic_button, mqttDeviceTopic, (int)b); + mqtt->publish(subuf, 0, false, "long"); + } +} + +void doublePressAction(uint8_t b) +{ + if (!macroDoublePress[b]) { + switch (b) { + case 0: toggleOnOff(); colorUpdated(CALL_MODE_BUTTON); break; + default: ++effectPalette %= strip.getPaletteCount(); colorUpdated(CALL_MODE_BUTTON); break; + } + } else { + applyPreset(macroDoublePress[b], CALL_MODE_BUTTON); + } + + // publish MQTT message + if (buttonPublishMqtt && WLED_MQTT_CONNECTED) { + char subuf[64]; + sprintf_P(subuf, _mqtt_topic_button, mqttDeviceTopic, (int)b); + mqtt->publish(subuf, 0, false, "double"); + } +} + bool isButtonPressed(uint8_t i) { if (btnPin[i]<0) return false; @@ -186,61 +225,43 @@ void handleButton() } //momentary button logic - if (isButtonPressed(b)) //pressed - { + if (isButtonPressed(b)) { //pressed + if (!buttonPressedBefore[b]) buttonPressedTime[b] = millis(); buttonPressedBefore[b] = true; - if (millis() - buttonPressedTime[b] > 600) //long press - { - if (!buttonLongPressed[b]) - { - if (macroLongPress[b]) {applyPreset(macroLongPress[b], CALL_MODE_BUTTON);} - else _setRandomColor(false,true); - - // publish MQTT message - if (buttonPublishMqtt && WLED_MQTT_CONNECTED) { - char subuf[64]; - sprintf_P(subuf, _mqtt_topic_button, mqttDeviceTopic, (int)b); - mqtt->publish(subuf, 0, false, "long"); - } - - buttonLongPressed[b] = true; + if (millis() - buttonPressedTime[b] > 600) { //long press + if (!buttonLongPressed[b]) longPressAction(b); + else if (b) { // repeatable action (~3 times per s) on button > 0 + longPressAction(b); + buttonPressedTime[b] = millis() - 300; // 300ms } + buttonLongPressed[b] = true; } - } - else if (!isButtonPressed(b) && buttonPressedBefore[b]) //released - { + + } else if (!isButtonPressed(b) && buttonPressedBefore[b]) { //released + long dur = millis() - buttonPressedTime[b]; if (dur < WLED_DEBOUNCE_THRESHOLD) {buttonPressedBefore[b] = false; continue;} //too short "press", debounce - bool doublePress = buttonWaitTime[b]; + bool doublePress = buttonWaitTime[b]; //did we have short press before? buttonWaitTime[b] = 0; - if (dur > 6000 && b==0) //long press on button 0 - { + if (b == 0 && dur > 6000) { //long press on button 0 (when released) WLED::instance().initAP(true); - } - else if (!buttonLongPressed[b]) { //short press - if (macroDoublePress[b]) - { - if (doublePress) { - applyPreset(macroDoublePress[b], CALL_MODE_BUTTON); - - // publish MQTT message - if (buttonPublishMqtt && WLED_MQTT_CONNECTED) { - char subuf[64]; - sprintf_P(subuf, _mqtt_topic_button, mqttDeviceTopic, (int)b); - mqtt->publish(subuf, 0, false, "double"); - } - } else buttonWaitTime[b] = millis(); - } else shortPressAction(b); + } else if (!buttonLongPressed[b]) { //short press + // if this is second release within 350ms it is a double press (buttonWaitTime!=0) + if (doublePress) { + doublePressAction(b); + } else { + buttonWaitTime[b] = millis(); + } } buttonPressedBefore[b] = false; buttonLongPressed[b] = false; } - if (buttonWaitTime[b] && millis() - buttonWaitTime[b] > 450 && !buttonPressedBefore[b]) - { + // if 450ms elapsed since last press/release it is a short press + if (buttonWaitTime[b] && millis() - buttonWaitTime[b] > 350 && !buttonPressedBefore[b]) { buttonWaitTime[b] = 0; shortPressAction(b); } diff --git a/wled00/wled.h b/wled00/wled.h index 5db45ba93..d9e96800d 100644 --- a/wled00/wled.h +++ b/wled00/wled.h @@ -8,7 +8,7 @@ */ // version code in format yymmddb (b = daily build) -#define VERSION 2108241 +#define VERSION 2108251 //uncomment this if you have a "my_config.h" file you'd like to use //#define WLED_USE_MY_CONFIG