extern int RedHomeKit; extern int GreenHomeKit; extern int BlueHomeKit; extern int RedHomeKit; extern bool turnOnFlag; struct DEV_RgbLED : Service::LightBulb { // RGB LED (Command Cathode) SpanCharacteristic *power; // reference to the On Characteristic SpanCharacteristic *H; // reference to the Hue Characteristic SpanCharacteristic *S; // reference to the Saturation Characteristic SpanCharacteristic *V; // reference to the Brightness Characteristic DEV_RgbLED() : Service::LightBulb(){ // constructor() method power=new Characteristic::On(); H=new Characteristic::Hue(100); // instantiate the Hue Characteristic with an initial value of 0 out of 360 S=new Characteristic::Saturation(100); // instantiate the Saturation Characteristic with an initial value of 0% V=new Characteristic::Brightness(100); // instantiate the Brightness Characteristic with an initial value of 100% V->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% // reczne ustawianie power->setVal(1); H->setVal(360); S->setVal(100); V->setVal(100); RedHomeKit = 100; GreenHomeKit = 100; BlueHomeKit = 100; // koniec recznego ustawiania char cBuf[128]; Serial.print(cBuf); } // end constructor boolean update(){ // update() method if (turnOnFlag == true){ power->setVal(1); turnOnFlag = false; } boolean p; float v, h, s, r, g, b; h=H->getVal(); // get and store all current values. Note the use of the template to properly read the values s=S->getVal(); v=V->getVal(); // though H and S are defined as FLOAT in HAP, V (which is brightness) is defined as INT, but will be re-cast appropriately p=power->getVal(); char cBuf[128]; LOG1(cBuf); if(power->updated()){ p=power->getNewVal(); sprintf(cBuf,"Power=%s->%s, ",power->getVal()?"true":"false",p?"true":"false"); } else { sprintf(cBuf,"Power=%s, ",p?"true":"false"); } LOG1(cBuf); if(H->updated()){ h=H->getNewVal(); sprintf(cBuf,"H=%.0f->%.0f, ",H->getVal(),h); } else { sprintf(cBuf,"H=%.0f, ",h); } LOG1(cBuf); if(S->updated()){ s=S->getNewVal(); sprintf(cBuf,"S=%.0f->%.0f, ",S->getVal(),s); } else { sprintf(cBuf,"S=%.0f, ",s); } LOG1(cBuf); if(V->updated()){ v=V->getNewVal(); sprintf(cBuf,"V=%.0f->%.0f ",V->getVal(),v); } else { sprintf(cBuf,"V=%.0f ",v); } LOG1(cBuf); LedPin::HSVtoRGB(h,s/100.0,v/100.0,&r,&g,&b); // since HomeKit provides S and V in percent, scale down by 100 int R, G, B; R=p*r*100; // since LedPin uses percent, scale back up by 100, and multiple by status fo power (either 0 or 1) G=p*g*100; B=p*b*100; RedHomeKit = R; GreenHomeKit = G; BlueHomeKit = B; sprintf(cBuf,"RGB=(%d,%d,%d)\n",R,G,B); LOG1(cBuf); return(true); // return true } };