Adding generic SpanButton function

This commit is contained in:
Gregg 2022-08-12 23:15:02 -05:00
parent 7841081fda
commit 9191b8664e
4 changed files with 39 additions and 14 deletions

View File

@ -1963,7 +1963,7 @@ SpanRange::SpanRange(int min, int max, int step){
// SpanButton // // SpanButton //
/////////////////////////////// ///////////////////////////////
SpanButton::SpanButton(int pin, uint16_t longTime, uint16_t singleTime, uint16_t doubleTime, Button buttonType){ SpanButton::SpanButton(int pin, uint16_t longTime, uint16_t singleTime, uint16_t doubleTime, Button buttonType) : PushButton(pin, buttonType){
if(homeSpan.Accessories.empty() || homeSpan.Accessories.back()->Services.empty()){ if(homeSpan.Accessories.empty() || homeSpan.Accessories.back()->Services.empty()){
Serial.printf("\nFATAL ERROR! Can't create new SpanButton(%d,%u,%u,%u) without a defined Service ***\n",pin,longTime,singleTime,doubleTime); Serial.printf("\nFATAL ERROR! Can't create new SpanButton(%d,%u,%u,%u) without a defined Service ***\n",pin,longTime,singleTime,doubleTime);
@ -1971,13 +1971,11 @@ SpanButton::SpanButton(int pin, uint16_t longTime, uint16_t singleTime, uint16_t
while(1); while(1);
} }
this->pin=pin;
this->longTime=longTime; this->longTime=longTime;
this->singleTime=singleTime; this->singleTime=singleTime;
this->doubleTime=doubleTime; this->doubleTime=doubleTime;
service=homeSpan.Accessories.back()->Services.back(); service=homeSpan.Accessories.back()->Services.back();
pushButton=new PushButton(pin,buttonType); // create underlying PushButton
homeSpan.PushButtons.push_back(this); homeSpan.PushButtons.push_back(this);
} }
@ -1985,8 +1983,8 @@ SpanButton::SpanButton(int pin, uint16_t longTime, uint16_t singleTime, uint16_t
void SpanButton::check(){ void SpanButton::check(){
if(pushButton->triggered(singleTime,longTime,doubleTime)) // if the underlying PushButton is triggered if(triggered(singleTime,longTime,doubleTime)) // if the underlying PushButton is triggered
service->button(pin,pushButton->type()); // call the Service's button() routine with pin and type as parameters service->button(pin,type()); // call the Service's button() routine with pin and type as parameters
} }
/////////////////////////////// ///////////////////////////////

View File

@ -691,17 +691,15 @@ struct [[deprecated("Please use Characteristic::setRange() method instead.")]] S
/////////////////////////////// ///////////////////////////////
class SpanButton{ class SpanButton : PushButton {
friend class Span; friend class Span;
friend class SpanService; friend class SpanService;
int pin; // pin number
uint16_t singleTime; // minimum time (in millis) required to register a single press uint16_t singleTime; // minimum time (in millis) required to register a single press
uint16_t longTime; // minimum time (in millis) required to register a long press uint16_t longTime; // minimum time (in millis) required to register a long press
uint16_t doubleTime; // maximum time (in millis) between single presses to register a double press instead uint16_t doubleTime; // maximum time (in millis) between single presses to register a double press instead
SpanService *service; // Service to which this PushButton is attached SpanService *service; // Service to which this PushButton is attached
PushButton *pushButton; // PushButton associated with this SpanButton
void check(); // check PushButton and call button() if pressed void check(); // check PushButton and call button() if pressed
@ -715,8 +713,8 @@ class SpanButton{
SpanButton(int pin, uint16_t longTime=2000, uint16_t singleTime=5, uint16_t doubleTime=200, Button buttonType=Button::GROUNDED); 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){}; SpanButton(int pin, Button buttonType, uint16_t longTime=2000, uint16_t singleTime=5, uint16_t doubleTime=200) : SpanButton(pin,longTime,singleTime,doubleTime,buttonType){};
SpanButton(int pin, boolean (*pressed)(int pin), uint16_t longTime=2000, uint16_t singleTime=5, uint16_t doubleTime=200) : SpanButton(pin,longTime,singleTime,doubleTime,Button::CUSTOM){this->pressed=pressed;};
static void configureTouch(uint16_t measureTime, uint16_t sleepTime, uint16_t thresh){PushButton::configureTouch(measureTime,sleepTime,thresh);}
}; };
/////////////////////////////// ///////////////////////////////

View File

@ -113,6 +113,12 @@ PushButton::PushButton(int pin, Button buttonType){
////////////////////////////////////// //////////////////////////////////////
PushButton::PushButton(int pin, boolean (*pressed)(int pin)) : PushButton(pin, Button::CUSTOM){
this->pressed=pressed;
}
//////////////////////////////////////
boolean PushButton::triggered(uint16_t singleTime, uint16_t longTime, uint16_t doubleTime){ boolean PushButton::triggered(uint16_t singleTime, uint16_t longTime, uint16_t doubleTime){
unsigned long cTime=millis(); unsigned long cTime=millis();
@ -220,6 +226,13 @@ void PushButton::reset(){
////////////////////////////////////// //////////////////////////////////////
void PushButton::configureTouch(uint16_t measureTime, uint16_t sleepTime, uint16_t thresh){
touchSetCycles(measureTime,sleepTime);
touchThreshold=thresh;
}
//////////////////////////////////////
uint16_t PushButton::touchThreshold; uint16_t PushButton::touchThreshold;
//////////////////////////////// ////////////////////////////////

View File

@ -40,7 +40,8 @@ String mask(char *c, int n); // simply utility that creates a String fr
enum class Button { enum class Button {
GROUNDED, GROUNDED,
POWERED, POWERED,
TOUCH TOUCH,
CUSTOM
}; };
///////////////////////////////////////////////// /////////////////////////////////////////////////
@ -80,13 +81,11 @@ struct TempBuffer {
class PushButton{ class PushButton{
int status; int status;
int pin;
boolean doubleCheck; boolean doubleCheck;
uint32_t singleAlarm; uint32_t singleAlarm;
uint32_t doubleAlarm; uint32_t doubleAlarm;
uint32_t longAlarm; uint32_t longAlarm;
int pressType; int pressType;
boolean (*pressed)(int pin);
static uint16_t touchThreshold; static uint16_t touchThreshold;
@ -94,6 +93,11 @@ class PushButton{
static boolean poweredButton(int pin){return(digitalRead(pin));} static boolean poweredButton(int pin){return(digitalRead(pin));}
static boolean touchButton(int pin){return(touchRead(pin)<touchThreshold);} static boolean touchButton(int pin){return(touchRead(pin)<touchThreshold);}
protected:
int pin;
boolean (*pressed)(int pin);
public: public:
enum { enum {
@ -104,10 +108,18 @@ class PushButton{
PushButton(int pin, Button buttonType=Button::GROUNDED); PushButton(int pin, Button buttonType=Button::GROUNDED);
// Creates generic pushbutton functionality on specified pin. // Creates pushbutton of specified type on specified pin
// //
// pin: Pin mumber to which pushbutton connects to ground when pressed // pin: Pin mumber to which pushbutton connects to ground when pressed
// buttonType: sets button type to Button::GROUNDED, Button::POWERED, or Button::TOUCH
PushButton(int pin, boolean (*pressed)(int pin));
// Creates generic pushbutton using custom boolean function that accepts a single paramater
//
// pin: an arbitrary INT that is passed to the user-define BOOLEAN function. Usually used to represent a pin number
// pressed: a user-defined BOOLEAN function that takes a single INT argument and returns TRUE if "button" is pressed, or FALSE if not
void reset(); void reset();
// Resets state of PushButton. Should be called once before any loops that will // Resets state of PushButton. Should be called once before any loops that will
@ -150,10 +162,14 @@ class PushButton{
// Returns pin number // Returns pin number
static void configureTouch(uint16_t measureTime, uint16_t sleepTime, uint16_t thresh){touchSetCycles(measureTime,sleepTime);touchThreshold=thresh;} static void configureTouch(uint16_t measureTime, uint16_t sleepTime, uint16_t thresh);
// Sets the measure time, sleep time, and lower threshold that triggers a touch - used only when buttonType=Button::TOUCH // Sets the measure time, sleep time, and lower threshold that triggers a touch - used only when buttonType=Button::TOUCH
// measureTime: duration of measurement time of all touch sensors in number of clock cycles
// sleepTime: duration of sleep time (between measurements) of all touch sensors number of clock cycles
// touchThreshhold: the read value of touch sensors, below which sensors are considered touched (i.e. "pressed")
}; };
//////////////////////////////// ////////////////////////////////