Added getVal and getNewVal

Updated Example 11 to use getVal and getNewVal, but kept distinction between integer and double Characteristics
This commit is contained in:
Gregg 2020-08-03 21:23:50 -05:00
parent 819c6ebe0d
commit 1347e4fd5c
3 changed files with 48 additions and 18 deletions

View File

@ -74,22 +74,23 @@ struct DEV_DimmableLED : Service::LightBulb { // Dimmable LED
LOG1(ledPin);
LOG1(": Current Power=");
LOG1(power->value.BOOL?"true":"false");
LOG1(power->getVal<boolean>()?"true":"false");
LOG1(" Current Brightness=");
LOG1(level->value.INT);
LOG1(level->getVal<int>());
if(power->isUpdated){
LOG1(" New Power=");
LOG1(power->newValue.BOOL?"true":"false");
LOG1(power->getNewVal<boolean>()?"true":"false");
}
if(level->isUpdated){
LOG1(" New Brightness=");
LOG1(level->newValue.INT);
LOG1(level->getNewVal<boolean>());
}
LOG1("\n");
pwmPin->set(channel,power->newValue.BOOL*level->newValue.INT);
pwmPin->set(channel,power->getNewVal<boolean>()*level->getNewVal<boolean>());
return(StatusCode::OK); // return OK status code
@ -138,42 +139,42 @@ struct DEV_RgbLED : Service::LightBulb { // RGB LED (Command Cathode)
int v;
double h, s, r, g, b;
h=H->value.FLOAT; // get all current values
s=S->value.FLOAT;
v=V->value.INT;
p=power->value.BOOL;
h=H->getVal<double>(); // get all current values
s=S->getVal<double>();
v=V->getVal<int>();
p=power->getVal<boolean>();
char cBuf[128];
sprintf(cBuf,"Updating RGB LED on pins=(%d,%d,%d): ",redPin->getPin(),greenPin->getPin(),bluePin->getPin());
LOG1(cBuf);
if(power->isUpdated){
p=power->newValue.BOOL;
sprintf(cBuf,"Power=%s->%s, ",power->value.BOOL?"true":"false",p?"true":"false");
p=power->getNewVal<boolean>();
sprintf(cBuf,"Power=%s->%s, ",power->getVal<boolean>()?"true":"false",p?"true":"false");
} else {
sprintf(cBuf,"Power=%s, ",p?"true":"false");
}
LOG1(cBuf);
if(H->isUpdated){
h=H->newValue.FLOAT;
sprintf(cBuf,"H=%d->%d, ",(int)H->value.FLOAT,(int)h);
h=H->getNewVal<double>();
sprintf(cBuf,"H=%d->%d, ",(int)H->getVal<double>(),(int)h);
} else {
sprintf(cBuf,"H=%d, ",(int)h);
}
LOG1(cBuf);
if(S->isUpdated){
s=S->newValue.FLOAT;
sprintf(cBuf,"S=%d->%d, ",(int)S->value.FLOAT,(int)s);
s=S->getNewVal<double>();
sprintf(cBuf,"S=%d->%d, ",(int)S->getVal<double>(),(int)s);
} else {
sprintf(cBuf,"S=%d, ",(int)s);
}
LOG1(cBuf);
if(V->isUpdated){
v=V->newValue.INT;
sprintf(cBuf,"V=%d->%d ",V->value.INT,v);
v=V->getNewVal<int>();
sprintf(cBuf,"V=%d->%d ",V->getVal<int>(),v);
} else {
sprintf(cBuf,"V=%d ",v);
}

View File

@ -1093,5 +1093,3 @@ SpanRange::SpanRange(int min, int max, int step){
}
///////////////////////////////

View File

@ -164,6 +164,37 @@ 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.)
template <class T> T getVal(){return(getValue<T>(value));} // returns UVal value
template <class T> T getNewVal(){return(getValue<T>(newValue));} // returns UVal newValue
template <class T> T getValue(UVal v); // returns UVal v
};
///////////////////////////////
template <class T> 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);
}
};
///////////////////////////////