WLED/wled00/button.cpp

139 lines
3.0 KiB
C++
Raw Normal View History

#include "wled.h"
2020-03-25 10:14:23 +01:00
/*
* Physical IO
*/
void shortPressAction()
{
if (!macroButton)
{
toggleOnOff();
2020-02-22 16:17:32 +01:00
colorUpdated(NOTIFIER_CALL_MODE_BUTTON);
} else {
2020-11-06 22:12:48 +01:00
applyPreset(macroButton);
}
}
bool isButtonPressed()
{
#if defined(BTNPIN) && BTNPIN > -1
if (digitalRead(BTNPIN) == LOW) return true;
#endif
#ifdef TOUCHPIN
if (touchRead(TOUCHPIN) <= TOUCH_THRESHOLD) return true;
#endif
return false;
}
void handleButton()
{
#if (defined(BTNPIN) && BTNPIN > -1) || defined(TOUCHPIN)
if (!buttonEnabled) return;
if (isButtonPressed()) //pressed
{
2019-10-18 12:19:52 +02:00
if (!buttonPressedBefore) buttonPressedTime = millis();
buttonPressedBefore = true;
2019-10-18 12:19:52 +02:00
if (millis() - buttonPressedTime > 600) //long press
{
if (!buttonLongPressed)
{
2020-11-06 22:12:48 +01:00
if (macroLongPress) {applyPreset(macroLongPress);}
2019-10-18 12:19:52 +02:00
else _setRandomColor(false,true);
buttonLongPressed = true;
}
}
}
else if (!isButtonPressed() && buttonPressedBefore) //released
{
long dur = millis() - buttonPressedTime;
if (dur < 50) {buttonPressedBefore = false; return;} //too short "press", debounce
bool doublePress = buttonWaitTime;
buttonWaitTime = 0;
2019-10-18 12:19:52 +02:00
if (dur > 6000) //long press
{
2020-03-25 10:14:23 +01:00
WLED::instance().initAP(true);
}
2019-10-18 12:19:52 +02:00
else if (!buttonLongPressed) { //short press
if (macroDoublePress)
{
2020-11-06 22:12:48 +01:00
if (doublePress) applyPreset(macroDoublePress);
else buttonWaitTime = millis();
} else shortPressAction();
}
buttonPressedBefore = false;
2019-10-18 12:19:52 +02:00
buttonLongPressed = false;
}
if (buttonWaitTime && millis() - buttonWaitTime > 450 && !buttonPressedBefore)
{
buttonWaitTime = 0;
shortPressAction();
}
#endif
}
void handleIO()
{
handleButton();
//set relay when LEDs turn on
if (strip.getBrightness())
{
lastOnTime = millis();
if (offMode)
{
#if RLYPIN >= 0
digitalWrite(RLYPIN, RLYMDE);
#endif
offMode = false;
}
} else if (millis() - lastOnTime > 600)
{
if (!offMode) {
#if LEDPIN == LED_BUILTIN
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, HIGH);
#endif
#if RLYPIN >= 0
digitalWrite(RLYPIN, !RLYMDE);
#endif
}
offMode = true;
}
2017-01-27 22:59:01 +01:00
#if AUXPIN >= 0
2017-01-27 22:59:01 +01:00
//output
if (auxActive || auxActiveBefore)
{
if (!auxActiveBefore)
{
auxActiveBefore = true;
switch (auxTriggeredState)
{
2018-11-18 00:31:45 +01:00
case 0: pinMode(AUXPIN, INPUT); break;
case 1: pinMode(AUXPIN, OUTPUT); digitalWrite(AUXPIN, HIGH); break;
case 2: pinMode(AUXPIN, OUTPUT); digitalWrite(AUXPIN, LOW); break;
2017-01-27 22:59:01 +01:00
}
auxStartTime = millis();
}
if ((millis() - auxStartTime > auxTime*1000 && auxTime != 255) || !auxActive)
{
auxActive = false;
auxActiveBefore = false;
switch (auxDefaultState)
{
2018-11-18 00:31:45 +01:00
case 0: pinMode(AUXPIN, INPUT); break;
case 1: pinMode(AUXPIN, OUTPUT); digitalWrite(AUXPIN, HIGH); break;
case 2: pinMode(AUXPIN, OUTPUT); digitalWrite(AUXPIN, LOW); break;
2017-01-27 22:59:01 +01:00
}
}
}
#endif
}