diff --git a/src/HAP.cpp b/src/HAP.cpp index efe1d68..4f7a09b 100644 --- a/src/HAP.cpp +++ b/src/HAP.cpp @@ -1321,20 +1321,6 @@ void HAPClient::callServiceLoops(){ homeSpan.Loops[i]->loop(); // call the loop() method } - -////////////////////////////////////// - -void HAPClient::checkPushButtons(){ - - for(int i=0;ipushButton->triggered(sb->singleTime,sb->longTime,sb->doubleTime)){ // if the underlying PushButton is triggered - sb->service->button(sb->pin,sb->pushButton->type()); // call the Service's button() routine with pin and type as parameters - } - } - -} - ////////////////////////////////////// void HAPClient::checkNotifications(){ @@ -1347,7 +1333,7 @@ void HAPClient::checkNotifications(){ ////////////////////////////////////// -void HAPClient::checkTimedWrites(){ +void HAPClient::checkTimedWrites(){ unsigned long cTime=millis(); // get current time diff --git a/src/HAP.h b/src/HAP.h index 707f438..b26d7f0 100644 --- a/src/HAP.h +++ b/src/HAP.h @@ -143,7 +143,6 @@ struct HAPClient { static void removeController(uint8_t *id); // removes specific Controller. If no remaining admin Controllers, remove all others (if any) as per HAP requirements. static void printControllers(); // prints IDs of all allocated (paired) Controller static void callServiceLoops(); // call the loop() method for any Service with that over-rode the default method - static void checkPushButtons(); // checks for PushButton presses and calls button() method of attached Services when found static void checkNotifications(); // checks for Event Notifications and reports to controllers as needed (HAP Section 6.8) static void checkTimedWrites(); // checks for expired Timed Write PIDs, and clears any found (HAP Section 6.7.2.4) static void eventNotify(SpanBuf *pObj, int nObj, int ignoreClient=-1); // transmits EVENT Notifications for nObj SpanBuf objects, pObj, with optional flag to ignore a specific client diff --git a/src/HomeSpan.cpp b/src/HomeSpan.cpp index f881467..8e050aa 100644 --- a/src/HomeSpan.cpp +++ b/src/HomeSpan.cpp @@ -277,7 +277,10 @@ void Span::pollTask() { } // for-loop over connection slots HAPClient::callServiceLoops(); - HAPClient::checkPushButtons(); + + for(auto it=PushButtons.begin();it!=PushButtons.end();it++) // check for SpanButton presses + (*it)->check(); + HAPClient::checkNotifications(); HAPClient::checkTimedWrites(); @@ -1978,6 +1981,13 @@ SpanButton::SpanButton(int pin, uint16_t longTime, uint16_t singleTime, uint16_t homeSpan.PushButtons.push_back(this); } +/////////////////////////////// + +void SpanButton::check(){ + + if(pushButton->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 +} /////////////////////////////// // SpanUserCommand // diff --git a/src/HomeSpan.h b/src/HomeSpan.h index 29a99b5..d14636a 100644 --- a/src/HomeSpan.h +++ b/src/HomeSpan.h @@ -343,7 +343,10 @@ class SpanService{ /////////////////////////////// -struct SpanCharacteristic{ +class SpanCharacteristic{ + + friend class Span; + friend class SpanService; union UVal { BOOL_t BOOL; @@ -382,17 +385,9 @@ struct SpanCharacteristic{ unsigned long updateTime=0; // last time value was updated (in millis) either by PUT /characteristic OR by setVal() UVal newValue; // the updated value requested by PUT /characteristic SpanService *service=NULL; // pointer to Service containing this Characteristic - - SpanCharacteristic(HapChar *hapChar, boolean isCustom=false); // contructor - ~SpanCharacteristic(); - + int sprintfAttributes(char *cBuf, int flags); // prints Characteristic JSON records into buf, according to flags mask; return number of characters printed, excluding null terminator - StatusCode loadUpdate(char *val, char *ev); // load updated val/ev from PUT /characteristic JSON request. Return intiial HAP status code (checks to see if characteristic is found, is writable, etc.) - - boolean updated(){return(isUpdated);} // returns isUpdated - unsigned long timeVal(); // returns time elapsed (in millis) since value was last updated - - SpanCharacteristic *setValidValues(int n, ...); // sets a list of 'n' valid values allowed for a Characteristic and returns pointer to self. Only applicable if format=uint8 + StatusCode loadUpdate(char *val, char *ev); // load updated val/ev from PUT /characteristic JSON request. Return intitial HAP status code (checks to see if characteristic is found, is writable, etc.) String uvPrint(UVal &u){ char c[64]; @@ -479,19 +474,9 @@ struct SpanCharacteristic{ return(0); // included to prevent compiler warnings } - template SpanCharacteristic *setRange(A min, B max, S step=0){ + protected: - if(!staticRange){ - uvSet(minValue,min); - uvSet(maxValue,max); - uvSet(stepValue,step); - customRange=true; - } else - setRangeError=true; - - return(this); - - } // setRange() + ~SpanCharacteristic(); // destructor template void init(T val, boolean nvsStore, A min=0, B max=1){ @@ -540,6 +525,9 @@ struct SpanCharacteristic{ } // init() + public: + + SpanCharacteristic(HapChar *hapChar, boolean isCustom=false); // constructor template T getVal(){ return(uvGet(value)); @@ -622,6 +610,25 @@ struct SpanCharacteristic{ } // setVal() + boolean updated(){return(isUpdated);} // returns isUpdated + unsigned long timeVal(); // returns time elapsed (in millis) since value was last updated + + SpanCharacteristic *setValidValues(int n, ...); // sets a list of 'n' valid values allowed for a Characteristic and returns pointer to self. Only applicable if format=uint8 + + template SpanCharacteristic *setRange(A min, B max, S step=0){ + + if(!staticRange){ + uvSet(minValue,min); + uvSet(maxValue,max); + uvSet(stepValue,step); + customRange=true; + } else + setRangeError=true; + + return(this); + + } // setRange() + SpanCharacteristic *setPerms(uint8_t perms){ perms&=0x7F; if(perms>0) @@ -659,7 +666,21 @@ struct [[deprecated("Please use Characteristic::setRange() method instead.")]] S /////////////////////////////// -struct SpanButton{ +class SpanButton{ + + friend class Span; + friend class SpanService; + + int pin; // pin number + 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 doubleTime; // maximum time (in millis) between single presses to register a double press instead + 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 + + public: enum { SINGLE=0, @@ -667,14 +688,6 @@ struct SpanButton{ LONG=2 }; - int pin; // pin number - 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 doubleTime; // maximum time (in millis) between single presses to register a double press instead - SpanService *service; // Service to which this PushButton is attached - - PushButton *pushButton; // PushButton associated with this SpanButton - SpanButton(int pin, uint16_t longTime=2000, uint16_t singleTime=5, uint16_t doubleTime=200); };