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
 | 
						|
  
 | 
						|
};
 |