diff --git a/src/HomeSpan.cpp b/src/HomeSpan.cpp index cc47eb2..935c8ff 100644 --- a/src/HomeSpan.cpp +++ b/src/HomeSpan.cpp @@ -61,6 +61,8 @@ void Span::begin(Category catID, const char *displayName, const char *hostNameBa statusLED.init(statusPin,0,autoOffLED); + PushButton::configureTouch(4000,1000,10); // set default parameters for any touch-style pushbuttons + if(requestedMaxConServices.empty()){ Serial.printf("\nFATAL ERROR! Can't create new SpanButton(%d,%u,%u,%u) without a defined Service ***\n",pin,longTime,singleTime,doubleTime); @@ -1975,7 +1977,7 @@ SpanButton::SpanButton(int pin, uint16_t longTime, uint16_t singleTime, uint16_t this->doubleTime=doubleTime; service=homeSpan.Accessories.back()->Services.back(); - pushButton=new PushButton(pin); // create underlying PushButton + pushButton=new PushButton(pin,buttonType); // create underlying PushButton homeSpan.PushButtons.push_back(this); } diff --git a/src/HomeSpan.h b/src/HomeSpan.h index 5f29530..9c2262d 100644 --- a/src/HomeSpan.h +++ b/src/HomeSpan.h @@ -713,7 +713,10 @@ class SpanButton{ LONG=2 }; - SpanButton(int pin, uint16_t longTime=2000, uint16_t singleTime=5, uint16_t doubleTime=200); + SpanButton(int pin, uint16_t longTime=2000, uint16_t singleTime=5, uint16_t doubleTime=200, Button buttonType=Button::GROUNDED); + SpanButton(int pin, Button buttonType, uint16_t longTime=2000, uint16_t singleTime=5, uint16_t doubleTime=200) : SpanButton(pin,longTime,singleTime,doubleTime,buttonType){}; + + static void configureTouch(uint16_t measureTime, uint16_t sleepTime, uint16_t thresh){PushButton::configureTouch(measureTime,sleepTime,thresh);} }; /////////////////////////////// diff --git a/src/Utils.cpp b/src/Utils.cpp index 98f06c7..12cd87b 100644 --- a/src/Utils.cpp +++ b/src/Utils.cpp @@ -85,12 +85,30 @@ String Utils::mask(char *c, int n){ // PushButton // //////////////////////////////// -PushButton::PushButton(int pin){ +PushButton::PushButton(int pin, Button buttonType){ this->pin=pin; status=0; doubleCheck=false; - pinMode(pin, INPUT_PULLUP); + + switch(buttonType){ + + case Button::GROUNDED: + pinMode(pin, INPUT_PULLUP); + pressed=groundedButton; + break; + + case Button::POWERED: + pinMode(pin, INPUT_PULLDOWN); + pressed=poweredButton; + break; + + case Button::TOUCH: + pressed=touchButton; + break; + + }; + } ////////////////////////////////////// @@ -108,7 +126,7 @@ boolean PushButton::triggered(uint16_t singleTime, uint16_t longTime, uint16_t d return(true); } - if(!digitalRead(pin)){ // button is pressed + if(pressed(pin)){ // button is pressed singleAlarm=cTime+singleTime; if(!doubleCheck){ status=1; @@ -122,7 +140,7 @@ boolean PushButton::triggered(uint16_t singleTime, uint16_t longTime, uint16_t d case 1: case 2: - if(digitalRead(pin)){ // button is released + if(!pressed(pin)){ // button is released status=0; if(cTime>singleAlarm){ doubleCheck=true; @@ -138,7 +156,7 @@ boolean PushButton::triggered(uint16_t singleTime, uint16_t longTime, uint16_t d break; case 3: - if(digitalRead(pin)) // button has been released after a long press + if(!pressed(pin)) // button has been released after a long press status=0; else if(cTime>longAlarm){ longAlarm=cTime+longTime; @@ -148,7 +166,7 @@ boolean PushButton::triggered(uint16_t singleTime, uint16_t longTime, uint16_t d break; case 4: - if(digitalRead(pin)){ // button is released + if(!pressed(pin)){ // button is released status=0; } else @@ -161,7 +179,7 @@ boolean PushButton::triggered(uint16_t singleTime, uint16_t longTime, uint16_t d break; case 5: - if(digitalRead(pin)) // button has been released after double-click + if(!pressed(pin)) // button has been released after double-click status=0; break; @@ -191,7 +209,7 @@ int PushButton::type(){ ////////////////////////////////////// void PushButton::wait(){ - while(!digitalRead(pin)); + while(pressed(pin)); } ////////////////////////////////////// @@ -200,6 +218,10 @@ void PushButton::reset(){ status=0; } +////////////////////////////////////// + +uint16_t PushButton::touchThreshold; + //////////////////////////////// // Blinker // //////////////////////////////// diff --git a/src/Utils.h b/src/Utils.h index 040ea44..a9f288c 100644 --- a/src/Utils.h +++ b/src/Utils.h @@ -37,6 +37,12 @@ String mask(char *c, int n); // simply utility that creates a String fr } +enum class Button { + GROUNDED, + POWERED, + TOUCH +}; + ///////////////////////////////////////////////// // Creates a temporary buffer that is freed after // going out of scope @@ -80,7 +86,14 @@ class PushButton{ uint32_t doubleAlarm; uint32_t longAlarm; int pressType; + boolean (*pressed)(int pin); + + static uint16_t touchThreshold; + static boolean groundedButton(int pin){return(!digitalRead(pin));} + static boolean poweredButton(int pin){return(digitalRead(pin));} + static boolean touchButton(int pin){return(touchRead(pin)