HomeSpan/examples/Expert/14-TargetStates/DEV_DoorsWindows.h

129 lines
3.4 KiB
C

////////////////////////////////////
// DEVICE-SPECIFIC LED SERVICES //
////////////////////////////////////
struct DEV_GarageDoor : Service::GarageDoorOpener { // A Garage Door Opener
SpanCharacteristic *current;
SpanCharacteristic *target;
SpanCharacteristic *obstruction;
unsigned long alarmTime;
DEV_GarageDoor(ServiceType sType=ServiceType::Regular) : Service::GarageDoorOpener(sType){ // constructor() method
new SpanEvent(1000); // check for events on this Service every 1 second
current=new Characteristic::CurrentDoorState(0);
target=new Characteristic::TargetDoorState(0);
obstruction=new Characteristic::ObstructionDetected(false);
Serial.print("Configuring Garage Door Opener"); // initialization message
Serial.print("\n");
} // end constructor
StatusCode update(){ // update() method
if(target->getNewVal()==0){
LOG1("Opening Garage Door\n");
current->setVal(2);
obstruction->setVal(false);
} else {
LOG1("Closing Garage Door\n");
current->setVal(3);
obstruction->setVal(false);
}
alarmTime=millis()+10000;
return(StatusCode::OK); // return OK status code
} // update
void event(){ // event() method
if(current->getVal()==target->getVal())
return;
if(random(30)==0){
current->setVal(4);
obstruction->setVal(true);
LOG1("Garage Door Obstruction Detected!\n");
}
if(current->getVal()==4)
return;
if(millis()>alarmTime)
current->setVal(target->getVal());
} // event
};
////////////////////////////////////
struct DEV_WindowShade : Service::WindowCovering { // A motorized Window Shade with Hold Feature
SpanCharacteristic *current;
SpanCharacteristic *target;
SpanCharacteristic *state;
SpanCharacteristic *hold;
unsigned long alarmTime;
int speed=5;
DEV_WindowShade(ServiceType sType=ServiceType::Regular) : Service::WindowCovering(sType){ // constructor() method
new SpanEvent(1000); // check for events on this Service every 1 second
current=new Characteristic::CurrentPosition(0);
target=new Characteristic::TargetPosition(0);
state=new Characteristic::PositionState(2);
Serial.print("Configuring Motorized Window Shade"); // initialization message
Serial.print("\n");
} // end constructor
StatusCode update(){ // update() method
if(target->getNewVal()>current->getVal()){
LOG1("Raising Shade\n");
state->setVal(1);
alarmTime=millis()+speed;
} else
if(target->getNewVal()<current->getVal()){
LOG1("Lowering Shade\n");
state->setVal(0);
alarmTime=millis()+speed;
}
return(StatusCode::OK); // return OK status code
} // update
void event(){ // event() method
if(current->getVal()==target->getVal())
return;
if(millis()<alarmTime)
return;
if(state->getVal()==1)
current->setVal(current->getVal()+1);
else
current->setVal(current->getVal()-1);
if(current->getVal()==target->getVal())
state->setVal(2);
else
alarmTime=millis()+speed;
} // event
};