76 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			76 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C
		
	
	
	
| 
 | |
| ////////////////////////////////////
 | |
| //   DEVICE-SPECIFIC LED SERVICES //
 | |
| ////////////////////////////////////
 | |
| 
 | |
| #include "extras/PwmPin.h"                          // library of various PWM functions
 | |
| 
 | |
| ////////////////////////////////////
 | |
| 
 | |
| struct DEV_DimmableLED : Service::LightBulb {       // Dimmable LED
 | |
| 
 | |
|   // This version of the Dimmable LED Service includes a PushButton that can be used to turn on/off the LED.  Status of both the
 | |
|   // power state and the brightness of the LED are stored in NVS for restoration if the device reboots.
 | |
|   
 | |
|   LedPin *LED;                                      // reference to an LedPin
 | |
|   SpanCharacteristic *power;                        // reference to the On Characteristic
 | |
|   SpanCharacteristic *level;                        // reference to the Brightness Characteristic
 | |
|  
 | |
|   DEV_DimmableLED(int ledPin, int buttonPin) : Service::LightBulb(){
 | |
| 
 | |
|     power=new Characteristic::On(0,true);           // NEW! Second argument is true, so the value of the On Characteristic (initially set to 0) will be saved in NVS
 | |
|     level=new Characteristic::Brightness(5,true);   // NEW! Second argument is true, so the value of the Brightness Characteristic (initially set to 5) will be saved in NVS               
 | |
|     level->setRange(5,100,1);                       // sets the range of the Brightness to be from a min of 5%, to a max of 100%, in steps of 1%
 | |
| 
 | |
|     new SpanButton(buttonPin);                      // create a new SpanButton to control power using PushButton on pin number "buttonPin"
 | |
| 
 | |
|     this->LED=new LedPin(ledPin);                   // configures a PWM LED for output to pin number "ledPin"
 | |
| 
 | |
|     Serial.print("Configuring Dimmable LED: Pin="); // initialization message
 | |
|     Serial.print(LED->getPin());
 | |
|     Serial.print("\n");
 | |
| 
 | |
|     LED->set(power->getVal()*level->getVal());      // NEW! IMPORTANT: Set the LED to its initial state at startup.  Note we use getVal() here, since it is set upon instantiation.
 | |
|     
 | |
|   } // end constructor
 | |
| 
 | |
|   boolean update(){                              // update() method
 | |
| 
 | |
|     LOG1("Updating Dimmable LED on pin=");
 | |
|     LOG1(LED->getPin());
 | |
|     LOG1(":  Current Power=");
 | |
|     LOG1(power->getVal()?"true":"false");
 | |
|     LOG1("  Current Brightness=");
 | |
|     LOG1(level->getVal());
 | |
|   
 | |
|     if(power->updated()){
 | |
|       LOG1("  New Power=");
 | |
|       LOG1(power->getNewVal()?"true":"false");
 | |
|     }
 | |
| 
 | |
|     if(level->updated()){
 | |
|       LOG1("  New Brightness=");
 | |
|       LOG1(level->getNewVal());
 | |
|     } 
 | |
| 
 | |
|     LOG1("\n");
 | |
|     
 | |
|     LED->set(power->getNewVal()*level->getNewVal());         // update the physical LED to reflect the new values    
 | |
|    
 | |
|     return(true);                               // return true
 | |
|   
 | |
|   } // update
 | |
| 
 | |
|   void button(int pin, int pressType) override {
 | |
| 
 | |
|     if(pressType==SpanButton::SINGLE){                      // only respond to SINGLE presses
 | |
|       power->setVal(1-power->getVal());                     // toggle the value of the power Characteristic
 | |
|       LED->set(power->getVal()*level->getVal());            // update the physical LED to reflect the new values
 | |
|     }   
 | |
| 
 | |
|   } // button
 | |
| 
 | |
| };
 | |
|       
 | |
| //////////////////////////////////
 |