ChannelBehaviourPtr OutputBehaviour::getChannelByIndex(size_t aChannelIndex, bool aPendingApplyOnly) { if (aChannelIndex<channels.size()) { ChannelBehaviourPtr ch = channels[aChannelIndex]; if (!aPendingApplyOnly || ch->needsApplying()) return ch; // found but has no apply pending -> return no channel } return ChannelBehaviourPtr(); }
void EnoceanRelayControlDevice::applyChannelValues(SimpleCB aDoneCB, bool aForDimming) { // standard output behaviour if (output) { ChannelBehaviourPtr ch = output->getChannelByType(channeltype_default); if (ch->needsApplying()) { bool up = ch->getChannelValue() >= (ch->getMax()-ch->getMin())/2; buttonAction(false, up, true); MainLoop::currentMainLoop().executeOnce(boost::bind(&EnoceanRelayControlDevice::sendReleaseTelegram, this, aDoneCB, up), BUTTON_PRESS_TIME); ch->channelValueApplied(); } } }
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 DigitalIODevice::applyChannelValues(SimpleCB aDoneCB, bool aForDimming) { LightBehaviourPtr lightBehaviour = boost::dynamic_pointer_cast<LightBehaviour>(output); if (lightBehaviour) { // light if (lightBehaviour->brightnessNeedsApplying()) { indicatorOutput->set(lightBehaviour->brightnessForHardware()); lightBehaviour->brightnessApplied(); // confirm having applied the value } } else if (output) { // simple switch output, activates at 50% of possible output range ChannelBehaviourPtr ch = output->getChannelByIndex(0); if (ch->needsApplying()) { indicatorOutput->set(ch->getChannelValue() >= (ch->getMax()-ch->getMin())/2); ch->channelValueApplied(); } } inherited::applyChannelValues(aDoneCB, aForDimming); }