void AnalogIODevice::applyChannelValues(SimpleCB aDoneCB, bool aForDimming) { MLMicroSeconds transitionTime = 0; // abort previous transition MainLoop::currentMainLoop().cancelExecutionTicket(timerTicket); // generic device, show changed channels if (analogIOType==analogio_dimmer) { // single channel PWM dimmer LightBehaviourPtr l = boost::dynamic_pointer_cast<LightBehaviour>(output); if (l && l->brightnessNeedsApplying()) { transitionTime = l->transitionTimeToNewBrightness(); l->brightnessTransitionStep(); // init applyChannelValueSteps(aForDimming, transitionTime==0 ? 1 : (double)TRANSITION_STEP_TIME/transitionTime); } // consider applied l->brightnessApplied(); } else if (analogIOType==analogio_rgbdimmer) { // three channel RGB PWM dimmer RGBColorLightBehaviourPtr cl = boost::dynamic_pointer_cast<RGBColorLightBehaviour>(output); if (cl) { if (needsToApplyChannels()) { // needs update // - derive (possibly new) color mode from changed channels cl->deriveColorMode(); // - calculate and start transition // TODO: depending to what channel has changed, take transition time from that channel. For now always using brightness transition time transitionTime = cl->transitionTimeToNewBrightness(); cl->brightnessTransitionStep(); // init cl->colorTransitionStep(); // init applyChannelValueSteps(aForDimming, transitionTime==0 ? 1 : (double)TRANSITION_STEP_TIME/transitionTime); } // if needs update // consider applied cl->appliedColorValues(); } } else { // direct single channel PWM output, no smooth transitions ChannelBehaviourPtr ch = getChannelByIndex(0); if (ch && ch->needsApplying()) { double chVal = ch->getTransitionalValue()-ch->getMin(); double chSpan = ch->getMax()-ch->getMin(); analogIO->setValue(chVal/chSpan*100); // 0..100% ch->channelValueApplied(); // confirm having applied the value } } // always consider apply done, even if transition is still running inherited::applyChannelValues(aDoneCB, aForDimming); }
void OlaDevice::applyChannelValues(SimpleCB aDoneCB, bool aForDimming) { MLMicroSeconds transitionTime = 0; // abort previous transition MainLoop::currentMainLoop().cancelExecutionTicket(transitionTicket); // generic device, show changed channels if (olaType==ola_dimmer) { // single channel dimmer LightBehaviourPtr l = boost::dynamic_pointer_cast<LightBehaviour>(output); if (l && l->brightnessNeedsApplying()) { transitionTime = l->transitionTimeToNewBrightness(); l->brightnessTransitionStep(); // init applyChannelValueSteps(aForDimming, transitionTime==0 ? 1 : (double)TRANSITION_STEP_TIME/transitionTime); } // consider applied l->brightnessApplied(); } else if (olaType==ola_fullcolordimmer) { // RGB, RGBW or RGBWA dimmer RGBColorLightBehaviourPtr cl = boost::dynamic_pointer_cast<RGBColorLightBehaviour>(output); if (cl) { MovingLightBehaviourPtr ml = boost::dynamic_pointer_cast<MovingLightBehaviour>(output); if (needsToApplyChannels()) { // needs update // - derive (possibly new) color mode from changed channels cl->deriveColorMode(); // - calculate and start transition // TODO: depending to what channel has changed, take transition time from that channel. For now always using brightness transition time transitionTime = cl->transitionTimeToNewBrightness(); cl->brightnessTransitionStep(); // init cl->colorTransitionStep(); // init if (ml) ml->positionTransitionStep(); // init applyChannelValueSteps(aForDimming, transitionTime==0 ? 1 : (double)TRANSITION_STEP_TIME/transitionTime); } // consider applied if (ml) ml->appliedPosition(); cl->appliedColorValues(); } } inherited::applyChannelValues(aDoneCB, aForDimming); }