69 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			69 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C
		
	
	
	
| 
 | |
| ////////////////////////////////////
 | |
| //   DEVICE-SPECIFIC LED SERVICES //
 | |
| ////////////////////////////////////
 | |
| 
 | |
| #include <extras/PwmPin.h>
 | |
| 
 | |
| ////////////////////////////////////
 | |
| 
 | |
| struct DEV_WindowShade : Service::WindowCovering {     // A motorized Window Shade with Hold Feature
 | |
| 
 | |
|   SpanCharacteristic *current;                     // reference to a "generic" Current Position Characteristic (used by a variety of different Service)
 | |
|   SpanCharacteristic *target;                      // reference to a "generic" Target Position Characteristic (used by a variety of different Service)
 | |
|   SpanCharacteristic *hTiltCurrent;                // reference to horizontal tilt of window shade - current position
 | |
|   SpanCharacteristic *hTiltTarget;                 // reference to horizontal tilt of window shade - target position
 | |
| 
 | |
|   ServoPin *hTiltServo;                            // reference to Servo Pin to control Horiontal Tilt
 | |
| 
 | |
|   DEV_WindowShade(uint8_t hTiltServoPin) : Service::WindowCovering(){       // constructor() method
 | |
|         
 | |
|     current=new Characteristic::CurrentPosition(0);     // Window Shades have positions that range from 0 (fully lowered) to 100 (fully raised)    
 | |
|     target=new Characteristic::TargetPosition(0);       // Window Shades have positions that range from 0 (fully lowered) to 100 (fully raised)
 | |
|     target->setRange(0,100,10);                         // set the allowable target-position range to 0-100 IN STEPS of 10
 | |
| 
 | |
|     hTiltCurrent=new Characteristic::CurrentHorizontalTiltAngle();      // Tilt Angle is measured in degrees; HAP default is -90 to +90
 | |
|     hTiltTarget=new Characteristic::TargetHorizontalTiltAngle();
 | |
| 
 | |
|     // Here we define our Servo using HomeSpan's ServoPin Class.
 | |
|     // See the HomeSpan API Reference for full details and a list of all parameters.
 | |
|     
 | |
|     hTiltServo=new ServoPin(hTiltServoPin);
 | |
|        
 | |
|     Serial.print("Configuring Motorized Window Shade");   // initialization message
 | |
|     Serial.print("\n");
 | |
| 
 | |
|   } // end constructor
 | |
| 
 | |
|   boolean update(){                              // update() method
 | |
| 
 | |
|     if(target->updated()){                            // check to see if shade target position was updated
 | |
|       if(target->getNewVal()>current->getVal()){      // if the target-position requested is greater than the current-position, simply log a "raise" message  
 | |
|         LOG1("Raising Shade\n");                      // ** there is nothing more to do - HomeKit keeps track of the current-position so knows raising is required
 | |
|       } else 
 | |
|       if(target->getNewVal()<current->getVal()){      // if the target-position requested is less than the current-position, simply log a "raise" message  
 | |
|         LOG1("Lowering Shade\n");                     // ** there is nothing more to do - HomeKit keeps track of the current-position so knows lowering is required
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     if(hTiltTarget->updated()){                         // check to see if shade tilt angle was updated
 | |
|       hTiltCurrent->setVal(hTiltTarget->getNewVal());   // set current value of tilt to match target value
 | |
|       hTiltServo->set(hTiltTarget->getNewVal());        // <--- update actual servo position with ServoPin->set(degrees) method
 | |
|     }
 | |
|         
 | |
|     return(true);                               // return true
 | |
|   
 | |
|   } // update
 | |
| 
 | |
|   void loop(){                                     // loop() method
 | |
| 
 | |
|     // Here we simulate a window shade that takes 5 seconds to move to its new target position
 | |
|     
 | |
|     if(current->getVal()!=target->getVal() && target->timeVal()>5000){          // if 5 seconds have elapsed since the target-position was last modified...
 | |
|       current->setVal(target->getVal());                                        // ...set the current position to equal the target position
 | |
|     }
 | |
|     
 | |
|   } // loop
 | |
|   
 | |
| };
 |