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); }
void OlaDevice::applyChannelValueSteps(bool aForDimming, double aStepSize) { // generic device, show changed channels if (olaType==ola_dimmer) { // single channel dimmer LightBehaviourPtr l = boost::dynamic_pointer_cast<LightBehaviour>(output); double w = l->brightnessForHardware()*255/100; setDMXChannel(whiteChannel,(DmxValue)w); // next step if (l->brightnessTransitionStep(aStepSize)) { ALOG(LOG_DEBUG, "transitional DMX512 value %d=%d", whiteChannel, (int)w); // not yet complete, schedule next step transitionTicket = MainLoop::currentMainLoop().executeOnce( boost::bind(&OlaDevice::applyChannelValueSteps, this, aForDimming, aStepSize), TRANSITION_STEP_TIME ); return; // will be called later again } if (!aForDimming) { ALOG(LOG_INFO, "final DMX512 channel %d=%d", whiteChannel, (int)w); } l->brightnessApplied(); // confirm having applied the new brightness } else if (olaType==ola_fullcolordimmer) { // RGB, RGBW or RGBWA dimmer RGBColorLightBehaviourPtr cl = boost::dynamic_pointer_cast<RGBColorLightBehaviour>(output); MovingLightBehaviourPtr ml = boost::dynamic_pointer_cast<MovingLightBehaviour>(output); // RGB lamp, get components double r,g,b; double w = 0; double a = 0; if (whiteChannel!=dmxNone) { if (amberChannel!=dmxNone) { // RGBW cl->getRGBWA(r, g, b, w, a, 255); setDMXChannel(amberChannel,(DmxValue)a); } else { // RGBW cl->getRGBW(r, g, b, w, 255); } setDMXChannel(whiteChannel,(DmxValue)w); } else { // RGB cl->getRGB(r, g, b, 255); // get brightness per R,G,B channel } // There's always RGB setDMXChannel(redChannel,(DmxValue)r); setDMXChannel(greenChannel,(DmxValue)g); setDMXChannel(blueChannel,(DmxValue)b); // there might be position as well double h = 0; double v = 0; if (ml) { h = ml->horizontalPosition->getTransitionalValue()/100*255; setDMXChannel(hPosChannel,(DmxValue)h); v = ml->verticalPosition->getTransitionalValue()/100*255; setDMXChannel(vPosChannel,(DmxValue)v); // step position ml->positionTransitionStep(aStepSize); } // next step if (cl->colorTransitionStep(aStepSize)) { ALOG(LOG_DEBUG, "transitional DMX512 values R(%hd)=%d, G(%hd)=%d, B(%hd)=%d, W(%hd)=%d, A(%hd)=%d, H(%hd)=%d, V(%hd)=%d", redChannel, (int)r, greenChannel, (int)g, blueChannel, (int)b, whiteChannel, (int)w, amberChannel, (int)a, hPosChannel, (int)h, vPosChannel, (int)v ); // not yet complete, schedule next step transitionTicket = MainLoop::currentMainLoop().executeOnce( boost::bind(&OlaDevice::applyChannelValueSteps, this, aForDimming, aStepSize), TRANSITION_STEP_TIME ); return; // will be called later again } if (!aForDimming) { ALOG(LOG_INFO, "final DMX512 values R(%hd)=%d, G(%hd)=%d, B(%hd)=%d, W(%hd)=%d, A(%hd)=%d, H(%hd)=%d, V(%hd)=%d", redChannel, (int)r, greenChannel, (int)g, blueChannel, (int)b, whiteChannel, (int)w, amberChannel, (int)a, hPosChannel, (int)h, vPosChannel, (int)v ); } } }