Completed full implementation of setRange() and deprecation of SpanRange()
Next TO DO: Complete entry of default min/max into all Characteristics (except BOOL and STRING) defined Span.h so that setRange() error checking works for all Characteristics.
This commit is contained in:
parent
5c5361be7b
commit
26a38b68cc
|
|
@ -16,8 +16,7 @@ struct DEV_TempSensor : Service::TemperatureSensor { // A standalone Tempera
|
||||||
// of Celsius or Fahrenheit for each Service, it does not appear to work as advertised.
|
// of Celsius or Fahrenheit for each Service, it does not appear to work as advertised.
|
||||||
|
|
||||||
temp=new Characteristic::CurrentTemperature(30.0); // instantiate the Current Temperature Characteristic
|
temp=new Characteristic::CurrentTemperature(30.0); // instantiate the Current Temperature Characteristic
|
||||||
//new SpanRange(-50,100,1); // expand the range from the HAP default of 0-100 to -50 to 100 to allow for negative temperatures
|
temp->setRange(-50,100); // expand the range from the HAP default of 0-100 to -50 to 100 to allow for negative temperatures
|
||||||
temp->setRange(-50,100,5.5);
|
|
||||||
|
|
||||||
Serial.print("Configuring Temperature Sensor"); // initialization message
|
Serial.print("Configuring Temperature Sensor"); // initialization message
|
||||||
Serial.print("\n");
|
Serial.print("\n");
|
||||||
|
|
@ -40,7 +39,7 @@ struct DEV_TempSensor : Service::TemperatureSensor { // A standalone Tempera
|
||||||
void loop(){
|
void loop(){
|
||||||
|
|
||||||
if(temp->timeVal()>5000){ // check time elapsed since last update and proceed only if greater than 5 seconds
|
if(temp->timeVal()>5000){ // check time elapsed since last update and proceed only if greater than 5 seconds
|
||||||
float temperature=temp->getVal<float>()+0.5; // "simulate" a half-degree temperature change (it's okay that we set step size in SpanRange to 1)...
|
float temperature=temp->getVal<float>()+0.5; // "simulate" a half-degree temperature change...
|
||||||
if(temperature>35.0) // ...but cap the maximum at 35C before starting over at -30C
|
if(temperature>35.0) // ...but cap the maximum at 35C before starting over at -30C
|
||||||
temperature=-30.0;
|
temperature=-30.0;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1520,60 +1520,21 @@ int SpanCharacteristic::sprintfAttributes(char *cBuf, int flags){
|
||||||
nBytes+=snprintf(cBuf?(cBuf+nBytes):NULL,cBuf?64:0,",\"type\":\"%s\"",type);
|
nBytes+=snprintf(cBuf?(cBuf+nBytes):NULL,cBuf?64:0,",\"type\":\"%s\"",type);
|
||||||
|
|
||||||
if(perms&PR){
|
if(perms&PR){
|
||||||
|
if(perms&NV && !(flags&GET_NV))
|
||||||
if(perms&NV && !(flags&GET_NV)){
|
|
||||||
nBytes+=snprintf(cBuf?(cBuf+nBytes):NULL,cBuf?64:0,",\"value\":null");
|
nBytes+=snprintf(cBuf?(cBuf+nBytes):NULL,cBuf?64:0,",\"value\":null");
|
||||||
} else {
|
else
|
||||||
|
nBytes+=snprintf(cBuf?(cBuf+nBytes):NULL,cBuf?64:0,",\"value\":%s",uvPrint(value).c_str());
|
||||||
switch(format){
|
}
|
||||||
case BOOL:
|
|
||||||
nBytes+=snprintf(cBuf?(cBuf+nBytes):NULL,cBuf?64:0,",\"value\":%s",value.BOOL?"true":"false");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case INT:
|
|
||||||
nBytes+=snprintf(cBuf?(cBuf+nBytes):NULL,cBuf?64:0,",\"value\":%d",value.INT);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case UINT8:
|
|
||||||
nBytes+=snprintf(cBuf?(cBuf+nBytes):NULL,cBuf?64:0,",\"value\":%u",value.UINT8);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case UINT16:
|
|
||||||
nBytes+=snprintf(cBuf?(cBuf+nBytes):NULL,cBuf?64:0,",\"value\":%u",value.UINT16);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case UINT32:
|
|
||||||
nBytes+=snprintf(cBuf?(cBuf+nBytes):NULL,cBuf?64:0,",\"value\":%u",value.UINT32);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case UINT64:
|
|
||||||
nBytes+=snprintf(cBuf?(cBuf+nBytes):NULL,cBuf?64:0,",\"value\":%llu",value.UINT64);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case FLOAT:
|
|
||||||
nBytes+=snprintf(cBuf?(cBuf+nBytes):NULL,cBuf?64:0,",\"value\":%lg",value.FLOAT);
|
|
||||||
if(customRange && (flags&GET_META)){
|
|
||||||
nBytes+=snprintf(cBuf?(cBuf+nBytes):NULL,cBuf?128:0,",\"minValue\":%lg,\"maxValue\":%lg",minValue.FLOAT,maxValue.FLOAT);
|
|
||||||
if(stepValue.FLOAT>0)
|
|
||||||
nBytes+=snprintf(cBuf?(cBuf+nBytes):NULL,cBuf?128:0,",\"minStep\":%lg",stepValue.FLOAT);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case STRING:
|
|
||||||
nBytes+=snprintf(cBuf?(cBuf+nBytes):NULL,cBuf?64:0,",\"value\":\"%s\"",value.STRING);
|
|
||||||
break;
|
|
||||||
|
|
||||||
} // switch
|
|
||||||
} // print Characteristic value
|
|
||||||
} // permissions=PR
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if(flags&GET_META){
|
if(flags&GET_META){
|
||||||
nBytes+=snprintf(cBuf?(cBuf+nBytes):NULL,cBuf?64:0,",\"format\":\"%s\"",formatCodes[format]);
|
nBytes+=snprintf(cBuf?(cBuf+nBytes):NULL,cBuf?64:0,",\"format\":\"%s\"",formatCodes[format]);
|
||||||
|
|
||||||
if(range && (flags&GET_META))
|
if(customRange && (flags&GET_META)){
|
||||||
nBytes+=snprintf(cBuf?(cBuf+nBytes):NULL,cBuf?128:0,",\"minValue\":%d,\"maxValue\":%d,\"minStep\":%d",range->min,range->max,range->step);
|
nBytes+=snprintf(cBuf?(cBuf+nBytes):NULL,cBuf?128:0,",\"minValue\":%s,\"maxValue\":%s",uvPrint(minValue).c_str(),uvPrint(maxValue).c_str());
|
||||||
|
|
||||||
|
if(uvGet<float>(stepValue)>0)
|
||||||
|
nBytes+=snprintf(cBuf?(cBuf+nBytes):NULL,cBuf?128:0,",\"minStep\":%s",uvPrint(stepValue).c_str());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(desc && (flags&GET_DESC)){
|
if(desc && (flags&GET_DESC)){
|
||||||
|
|
@ -1699,20 +1660,13 @@ unsigned long SpanCharacteristic::timeVal(){
|
||||||
///////////////////////////////
|
///////////////////////////////
|
||||||
|
|
||||||
SpanRange::SpanRange(int min, int max, int step){
|
SpanRange::SpanRange(int min, int max, int step){
|
||||||
this->min=min;
|
|
||||||
this->max=max;
|
|
||||||
this->step=step;
|
|
||||||
|
|
||||||
homeSpan.configLog+="------>SpanRange: " + String(min) + "/" + String(max) + "/" + String(step);
|
|
||||||
|
|
||||||
if(homeSpan.Accessories.empty() || homeSpan.Accessories.back()->Services.empty() || homeSpan.Accessories.back()->Services.back()->Characteristics.empty() ){
|
if(homeSpan.Accessories.empty() || homeSpan.Accessories.back()->Services.empty() || homeSpan.Accessories.back()->Services.back()->Characteristics.empty() ){
|
||||||
homeSpan.configLog+=" *** ERROR! Can't create new Range without a defined Characteristic! ***\n";
|
homeSpan.configLog+="------>SpanRange: *** ERROR! Can't create new Range without a defined Characteristic! ***\n";
|
||||||
homeSpan.nFatalErrors++;
|
homeSpan.nFatalErrors++;
|
||||||
return;
|
} else {
|
||||||
|
homeSpan.Accessories.back()->Services.back()->Characteristics.back()->setRange(min,max,step);
|
||||||
}
|
}
|
||||||
|
|
||||||
homeSpan.configLog+="\n";
|
|
||||||
homeSpan.Accessories.back()->Services.back()->Characteristics.back()->range=this;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
///////////////////////////////
|
///////////////////////////////
|
||||||
|
|
|
||||||
|
|
@ -244,7 +244,6 @@ struct SpanCharacteristic{
|
||||||
UVal maxValue; // Characteristic maximum (not applicable for STRING)
|
UVal maxValue; // Characteristic maximum (not applicable for STRING)
|
||||||
UVal stepValue; // Characteristic step size (not applicable for STRING)
|
UVal stepValue; // Characteristic step size (not applicable for STRING)
|
||||||
boolean customRange=false; // Flag for custom ranges
|
boolean customRange=false; // Flag for custom ranges
|
||||||
SpanRange *range=NULL; // Characteristic min/max/step; NULL = default values (optional)
|
|
||||||
boolean *ev; // Characteristic Event Notify Enable (per-connection)
|
boolean *ev; // Characteristic Event Notify Enable (per-connection)
|
||||||
|
|
||||||
uint32_t aid=0; // Accessory ID - passed through from Service containing this Characteristic
|
uint32_t aid=0; // Accessory ID - passed through from Service containing this Characteristic
|
||||||
|
|
@ -281,7 +280,8 @@ struct SpanCharacteristic{
|
||||||
sprintf(c,"%llg",u.FLOAT);
|
sprintf(c,"%llg",u.FLOAT);
|
||||||
return(String(c));
|
return(String(c));
|
||||||
case FORMAT::STRING:
|
case FORMAT::STRING:
|
||||||
return(String(u.STRING));
|
sprintf(c,"\"%s\"",u.STRING);
|
||||||
|
return(String(c));
|
||||||
} // switch
|
} // switch
|
||||||
} // str()
|
} // str()
|
||||||
|
|
||||||
|
|
@ -339,11 +339,29 @@ struct SpanCharacteristic{
|
||||||
} // get()
|
} // get()
|
||||||
|
|
||||||
template <typename A, typename B, typename S=int> SpanCharacteristic *setRange(A min, B max, S step=0){
|
template <typename A, typename B, typename S=int> SpanCharacteristic *setRange(A min, B max, S step=0){
|
||||||
uvSet(minValue,min);
|
|
||||||
uvSet(maxValue,max);
|
char c[256];
|
||||||
uvSet(stepValue,step);
|
homeSpan.configLog+="------>Range: ";
|
||||||
customRange=true;
|
|
||||||
}
|
if(format==BOOL || format==STRING){
|
||||||
|
sprintf(c,"*** ERROR! Can't change range for STRING or BOOL Characteristics! ***\n",hapName);
|
||||||
|
homeSpan.nFatalErrors++;
|
||||||
|
} else {
|
||||||
|
|
||||||
|
uvSet(minValue,min);
|
||||||
|
uvSet(maxValue,max);
|
||||||
|
uvSet(stepValue,step);
|
||||||
|
customRange=true;
|
||||||
|
|
||||||
|
if(step>0)
|
||||||
|
sprintf(c,"%s/%s/%s\n",uvPrint(minValue),uvPrint(maxValue),uvPrint(stepValue));
|
||||||
|
else
|
||||||
|
sprintf(c,"%s/%s\n",uvPrint(minValue),uvPrint(maxValue));
|
||||||
|
}
|
||||||
|
homeSpan.configLog+=c;
|
||||||
|
return(this);
|
||||||
|
|
||||||
|
} // setRange()
|
||||||
|
|
||||||
template <typename T, typename A=boolean, typename B=boolean> void init(T val, A min=0, B max=1){
|
template <typename T, typename A=boolean, typename B=boolean> void init(T val, A min=0, B max=1){
|
||||||
uvSet(value,val);
|
uvSet(value,val);
|
||||||
|
|
@ -351,7 +369,8 @@ struct SpanCharacteristic{
|
||||||
uvSet(minValue,min);
|
uvSet(minValue,min);
|
||||||
uvSet(maxValue,max);
|
uvSet(maxValue,max);
|
||||||
uvSet(stepValue,0);
|
uvSet(stepValue,0);
|
||||||
}
|
|
||||||
|
} // init()
|
||||||
|
|
||||||
template <class T=int> T getVal(){
|
template <class T=int> T getVal(){
|
||||||
return(uvGet<T>(value));
|
return(uvGet<T>(value));
|
||||||
|
|
@ -364,7 +383,7 @@ struct SpanCharacteristic{
|
||||||
template <typename T> void setVal(T val){
|
template <typename T> void setVal(T val){
|
||||||
|
|
||||||
if(format==STRING){
|
if(format==STRING){
|
||||||
Serial.printf("\n*** WARNING: Attempt to update Characteristic::%s(\"%s\") with setVal() ignored. Can't update string Characteristics once they are initialized!\n\n",hapName,value.STRING);
|
Serial.printf("\n*** WARNING: Attempt to update Characteristic::%s(\"%s\") with setVal() ignored. Can't update STRING Characteristics once they are initialized!\n\n",hapName,value.STRING);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -385,17 +404,13 @@ struct SpanCharacteristic{
|
||||||
sb.val=dummy; // set dummy "val" so that sprintfNotify knows to consider this "update"
|
sb.val=dummy; // set dummy "val" so that sprintfNotify knows to consider this "update"
|
||||||
homeSpan.Notifications.push_back(sb); // store SpanBuf in Notifications vector
|
homeSpan.Notifications.push_back(sb); // store SpanBuf in Notifications vector
|
||||||
|
|
||||||
} // setValue
|
} // setVal()
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
///////////////////////////////
|
///////////////////////////////
|
||||||
|
|
||||||
struct SpanRange{
|
struct SpanRange{
|
||||||
int min;
|
|
||||||
int max;
|
|
||||||
int step;
|
|
||||||
|
|
||||||
SpanRange(int min, int max, int step);
|
SpanRange(int min, int max, int step);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue