Reworking checkEvents()

creating code to allow for multiple characteristics to be updated within event() call.  To Do: define anogther sensor that supports multiple characteristics.  also need to check that "new SpanEvent" works as expected from within a defined service.
This commit is contained in:
Gregg 2020-08-10 21:59:30 -05:00
parent 3a4be161e7
commit 8d6db796cb
5 changed files with 74 additions and 15 deletions

View File

@ -47,7 +47,7 @@ void setup() {
new SpanAccessory();
new DEV_Identify("Temp Sensor","HomeSpan","123-ABC","Celsius","0.9",0);
new DEV_TempSensor(); // Create a Temperature Sensor
new SpanEvent(60000);
new SpanEvent(5000);
} // end of setup()

View File

@ -6,28 +6,20 @@
struct DEV_TempSensor : Service::TemperatureSensor { // A standalone temperature sensor
SpanCharacteristic *temp; // reference to the Current Temperature Characteristic
float step=0.5;
DEV_TempSensor(ServiceType sType=ServiceType::Regular) : Service::TemperatureSensor(sType){ // constructor() method
temp=new Characteristic::CurrentTemperature();
temp->value.FLOAT=22.0;
Serial.print("Configuring Temperature Sensor"); // initialization message
Serial.print("\n");
} // end constructor
SpanCharacteristic *event(){
void event(){
temp->value.FLOAT+=step;
if(temp->value.FLOAT>28.0)
step=-step;
else if(temp->value.FLOAT<18.0)
step=-step;
return(temp);
temp->setVal(22.0);
} // event
};

View File

@ -1098,8 +1098,27 @@ void HAPClient::checkEvents(){
for(int i=0;i<homeSpan.Events.size();i++){ // loop over all defined Events
if(cTime>homeSpan.Events[i]->alarmTime){ // if alarm time has passed
homeSpan.Events[i]->alarmTime=cTime+homeSpan.Events[i]->period; // set new alarm time to current time plus alarm period
SpanCharacteristic *characteristic=homeSpan.Events[i]->service->event(); // check service for new EVENT
homeSpan.Events[i]->service->event(); // check service for new EVENTS
for(int j=0;j<homeSpan.Events[i]->service->Characteristics.size();j++){ // loop over all characteristics
if(homeSpan.Events[i]->service->Characteristics[j]->isUpdated){ // if characteristic is updated
Serial.print("Event for aid=");
Serial.print(homeSpan.Events[i]->service->Characteristics[j]->aid);
Serial.print(" iid=");
Serial.print(homeSpan.Events[i]->service->Characteristics[j]->iid);
Serial.print("\n");
homeSpan.Events[i]->service->Characteristics[j]->isUpdated=false; // reset isUpdated flag
}
}
}
}
}
/*
if(characteristic){ // if the service has responded with a characteristic to update
pObj[nObj].status=StatusCode::OK; // populate pObj
pObj[nObj].characteristic=characteristic;
@ -1114,6 +1133,8 @@ void HAPClient::checkEvents(){
}
*/
//////////////////////////////////////
void HAPClient::checkTimedResets(){

View File

@ -1054,6 +1054,49 @@ StatusCode SpanCharacteristic::loadUpdate(char *val, char *ev){
return(StatusCode::TBD);
}
///////////////////////////////
void SpanCharacteristic::setVal(int val){
switch(format){
case BOOL:
value.BOOL=(boolean)val;
break;
case INT:
value.INT=(int)val;
break;
case UINT8:
value.UINT8=(uint8_t)val;
break;
case UINT16:
value.UINT16=(uint16_t)val;
break;
case UINT32:
value.UINT32=(uint32_t)val;
break;
case UINT64:
value.UINT64=(uint64_t)val;
break;
}
isUpdated=true;
}
///////////////////////////////
void SpanCharacteristic::setVal(double val){
value.FLOAT=(double)val;
isUpdated=true;
}
///////////////////////////////
// SpanTimedReset //
///////////////////////////////

View File

@ -102,7 +102,7 @@ struct SpanService{
int sprintfAttributes(char *cBuf); // prints Service JSON records into buf; return number of characters printed, excluding null terminator
virtual StatusCode update() {return(StatusCode::OK);} // update Service and return final statusCode based on updated Characteristics - should be overridden by DEVICE-SPECIFIC Services
virtual SpanCharacteristic* event(){return(NULL);} // event generation for Services that create their own events and need to notify HomeKit of a new Characteristic value
virtual void event(){} // event generation for Services that create their own events and need to notify HomeKit of a new Characteristic value(s)
};
///////////////////////////////
@ -151,7 +151,7 @@ struct SpanCharacteristic{
boolean ev[MAX_CONNECTIONS]={false}; // Characteristic Event Notify Enable (per-connection)
int aid=0; // Accessory ID - passed through from Service containing this Characteristic
boolean isUpdated=false; // set to true when new value has been requested by PUT /characteristic
boolean isUpdated=false; // set to true when new value has been requested by PUT /characteristic, or when value is updated with setVal()
UVal newValue; // the updated value requested by PUT /characteristic
SpanService *service=NULL; // pointer to Service containing this Characteristic
@ -172,6 +172,9 @@ struct SpanCharacteristic{
template <class T=int> T getNewVal(){return(getValue<T>(newValue));} // returns UVal newValue
template <class T> T getValue(UVal v); // returns UVal v
void setVal(int value); // sets value of UVal value for all integer-based Characterstic types
void setVal(double value); // sets value of UVal value for FLOAT Characteristic type
boolean updated(){return(isUpdated);} // returns isUpdated
};