diff --git a/src/HomeSpan.cpp b/src/HomeSpan.cpp index a05214e..4e01328 100644 --- a/src/HomeSpan.cpp +++ b/src/HomeSpan.cpp @@ -1737,109 +1737,6 @@ StatusCode SpanCharacteristic::loadUpdate(char *val, char *ev){ /////////////////////////////// -void SpanCharacteristic::setVal(int val){ - - switch(format){ - - case BOOL: - value.BOOL=(boolean)val; - newValue.BOOL=(boolean)val; - break; - - case INT: - value.INT=(int)val; - newValue.INT=(int)val; - break; - - case UINT8: - value.UINT8=(uint8_t)val; - newValue.INT=(int)val; - break; - - case UINT16: - value.UINT16=(uint16_t)val; - newValue.UINT16=(uint16_t)val; - break; - - case UINT32: - value.UINT32=(uint32_t)val; - newValue.UINT32=(uint32_t)val; - break; - - case UINT64: - value.UINT64=(uint64_t)val; - newValue.UINT64=(uint64_t)val; - break; - - case FLOAT: - value.FLOAT=(double)val; - newValue.FLOAT=(double)val; - break; - - default: - break; - } - - updateTime=homeSpan.snapTime; - - SpanBuf sb; // create SpanBuf object - sb.characteristic=this; // set characteristic - sb.status=StatusCode::OK; // set status - char dummy[]=""; - sb.val=dummy; // set dummy "val" so that sprintfNotify knows to consider this "update" - homeSpan.Notifications.push_back(sb); // store SpanBuf in Notifications vector -} - -/////////////////////////////// - -void SpanCharacteristic::setVal(uint32_t val){ - - value.UINT32=(uint32_t)val; - newValue.UINT32=(uint32_t)val; - updateTime=homeSpan.snapTime; - - SpanBuf sb; // create SpanBuf object - sb.characteristic=this; // set characteristic - sb.status=StatusCode::OK; // set status - char dummy[]=""; - sb.val=dummy; // set dummy "val" so that sprintfNotify knows to consider this "update" - homeSpan.Notifications.push_back(sb); // store SpanBuf in Notifications vector -} - -/////////////////////////////// - -void SpanCharacteristic::setVal(uint64_t val){ - - value.UINT64=(uint64_t)val; - newValue.UINT64=(uint64_t)val; - updateTime=homeSpan.snapTime; - - SpanBuf sb; // create SpanBuf object - sb.characteristic=this; // set characteristic - sb.status=StatusCode::OK; // set status - char dummy[]=""; - sb.val=dummy; // set dummy "val" so that sprintfNotify knows to consider this "update" - homeSpan.Notifications.push_back(sb); // store SpanBuf in Notifications vector -} - -/////////////////////////////// - -void SpanCharacteristic::setVal(double val){ - - value.FLOAT=(double)val; - newValue.FLOAT=(double)val; - updateTime=homeSpan.snapTime; - - SpanBuf sb; // create SpanBuf object - sb.characteristic=this; // set characteristic - sb.status=StatusCode::OK; // set status - char dummy[]=""; - sb.val=dummy; // set dummy "val" so that sprintfNotify knows to consider this "update" - homeSpan.Notifications.push_back(sb); // store SpanBuf in Notifications vector -} - -/////////////////////////////// - unsigned long SpanCharacteristic::timeVal(){ return(homeSpan.snapTime-updateTime); diff --git a/src/HomeSpan.h b/src/HomeSpan.h index f28e1ff..1d52edc 100644 --- a/src/HomeSpan.h +++ b/src/HomeSpan.h @@ -54,6 +54,64 @@ enum { GET_ALL=255 }; +enum FORMAT { // HAP Table 6-5 + BOOL, + UINT8, + UINT16, + UINT32, + UINT64, + INT, + FLOAT, + STRING +}; + +union UVal { + boolean BOOL; + uint8_t UINT8; + uint16_t UINT16; + uint32_t UINT32; + uint64_t UINT64; + int32_t INT; + double FLOAT; + const char *STRING; + + template void set(FORMAT fmt, T val){ + + switch(fmt){ + + case FORMAT::BOOL: + BOOL=(boolean)val; + break; + + case FORMAT::INT: + INT=(int)val; + break; + + case FORMAT::UINT8: + UINT8=(uint8_t)val; + break; + + case FORMAT::UINT16: + UINT16=(uint16_t)val; + break; + + case FORMAT::UINT32: + UINT32=(uint32_t)val; + break; + + case FORMAT::UINT64: + UINT64=(uint64_t)val; + break; + + case FORMAT::FLOAT: + FLOAT=(double)val; + break; + } + } +}; + +/////////////////////////////// + // Forward-Declarations struct Span; @@ -64,6 +122,8 @@ struct SpanRange; struct SpanBuf; struct SpanButton; +extern Span homeSpan; + /////////////////////////////// struct SpanConfig { @@ -73,6 +133,17 @@ struct SpanConfig { /////////////////////////////// +struct SpanBuf{ // temporary storage buffer for use with putCharacteristicsURL() and checkTimedResets() + uint32_t aid=0; // updated aid + int iid=0; // updated iid + char *val=NULL; // updated value (optional, though either at least 'val' or 'ev' must be specified) + char *ev=NULL; // updated event notification flag (optional, though either at least 'val' or 'ev' must be specified) + StatusCode status; // return status (HAP Table 6-11) + SpanCharacteristic *characteristic=NULL; // Characteristic to update (NULL if not found) +}; + +/////////////////////////////// + struct Span{ const char *displayName; // display name for this device - broadcast as part of Bonjour MDNS @@ -217,28 +288,6 @@ struct SpanCharacteristic{ WR=64, NV=128 }; - - enum FORMAT { // HAP Table 6-5 - BOOL=0, - UINT8=1, - UINT16=2, - UINT32=3, - UINT64=4, - INT=5, - FLOAT=6, - STRING=7 - }; - - union UVal { - boolean BOOL; - uint8_t UINT8; - uint16_t UINT16; - uint32_t UINT32; - uint64_t UINT64; - int32_t INT; - double FLOAT; - const char *STRING; - }; int iid=0; // Instance ID (HAP Table 6-3) const char *type; // Characteristic Type @@ -269,44 +318,53 @@ struct 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 + template T getVal(){return(getValue(value));} // returns UVal value template T getNewVal(){return(getValue(newValue));} // returns UVal newValue - template T getValue(UVal v); // returns UVal v - - void setVal(uint64_t value); // sets value of UVal value for UINT64 Characteristic when parameter type is uint64_t - void setVal(uint32_t value); // sets value of UVal value for UINT32 Characteristic when parameter type is uint32_t - void setVal(double value); // sets value of UVal value for FLOAT Characteristic when parameter type is float or double - void setVal(int value); // sets value of UVal value for ANY Characteristic (except char *) when parameter type does not exactly match uint64_t, uint32_t, double, or float - - boolean updated(){return(isUpdated);} // returns isUpdated - unsigned long timeVal(); // returns time elapsed (in millis) since value was last updated -}; - -/////////////////////////////// - -template T SpanCharacteristic::getValue(UVal v){ - - switch(format){ - case BOOL: - return((T) v.BOOL); - case INT: - return((T) v.INT); - case UINT8: - return((T) v.UINT8); - case UINT16: - return((T) v.UINT16); - case UINT32: - return((T) v.UINT32); - case UINT64: - return((T) v.UINT64); - case FLOAT: - return((T) v.FLOAT); - case STRING: - Serial.print("*** ERROR: Can't use getVal() or getNewVal() for string Characteristics.\n\n"); - return(0); - } + template T getValue(UVal v){ + + switch(format){ + case BOOL: + return((T) v.BOOL); + case INT: + return((T) v.INT); + case UINT8: + return((T) v.UINT8); + case UINT16: + return((T) v.UINT16); + case UINT32: + return((T) v.UINT32); + case UINT64: + return((T) v.UINT64); + case FLOAT: + return((T) v.FLOAT); + case STRING: + Serial.print("*** ERROR: Can't use getVal() or getNewVal() for string Characteristics.\n\n"); + return(0); + + } // switch + + } // getValue + + template void setVal(T val){ + value.set(format, val); + newValue.set(format, val); + + updateTime=homeSpan.snapTime; + + SpanBuf sb; // create SpanBuf object + sb.characteristic=this; // set characteristic + sb.status=StatusCode::OK; // set status + char dummy[]=""; + sb.val=dummy; // set dummy "val" so that sprintfNotify knows to consider this "update" + homeSpan.Notifications.push_back(sb); // store SpanBuf in Notifications vector + + } // setValue + }; /////////////////////////////// @@ -321,17 +379,6 @@ struct SpanRange{ /////////////////////////////// -struct SpanBuf{ // temporary storage buffer for use with putCharacteristicsURL() and checkTimedResets() - uint32_t aid=0; // updated aid - int iid=0; // updated iid - char *val=NULL; // updated value (optional, though either at least 'val' or 'ev' must be specified) - char *ev=NULL; // updated event notification flag (optional, though either at least 'val' or 'ev' must be specified) - StatusCode status; // return status (HAP Table 6-11) - SpanCharacteristic *characteristic=NULL; // Characteristic to update (NULL if not found) -}; - -/////////////////////////////// - struct SpanButton{ enum { @@ -352,10 +399,6 @@ struct SpanButton{ }; ///////////////////////////////////////////////// -// Extern Variables -extern Span homeSpan; - -///////////////////////////////////////////////// #include "Services.h"