package de.ctdo.bunti.dmx; import java.util.Collections; import java.util.HashMap; import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationListener; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import de.ctdo.bunti.DeviceChangedEvent; import de.ctdo.bunti.artnet.SimpleArtNetSender; import de.ctdo.bunti.model.*; @Component public class DMXMixerImpl implements DMXMixer, ApplicationListener { private static final Logger LOGGER = LoggerFactory.getLogger(DMXMixerImpl.class); private static final String ARTNET_DEVICE_ADDRESS = "192.168.0.90"; private final Map dmxMap = Collections.synchronizedMap(new HashMap()); private SimpleArtNetSender artNetSender; private boolean hasDataChanged = true; @Autowired public void setArtNetSender(SimpleArtNetSender artNetSender) { this.artNetSender = artNetSender; } public void initDMXData() { for (int i = 0; i <= DMX.DMX_CHANNELS_MAX; i++) { dmxMap.put(i, 0); } } @Scheduled(fixedDelay=100) //TODO aendern auf 10ms public void sendOutDMXBuffer() { if( dmxMap.size() == 0) initDMXData(); if( hasDataChanged ) { artNetSender.sendDMXData(dmxMap, ARTNET_DEVICE_ADDRESS); hasDataChanged = false; } // logger.debug(sb.toString()); } public void updateDevice(BuntiDevice device, Map options) { BuntiDMXDevice dmxDev = (BuntiDMXDevice)device; if( dmxDev.setValuesFromOptions(options) ) { dmxMap.putAll(dmxDev.getChannelData()); LOGGER.info("setValuesFromOptions on " + device); } else { LOGGER.info("setValuesFromOptions on " + device + " failed"); } } @Override public void setDMX512Channel(int channel, int value) { if(!DMX.checkChannelBoundaries(channel)) return; value = DMX.sanitizeDMXValue(value); dmxMap.put(channel, value); hasDataChanged = true; } @Override public void onApplicationEvent(DeviceChangedEvent arg0) { if( arg0.getDevice() instanceof BuntiDMXDevice) { updateDevice(arg0.getDevice(), arg0.getOptions()); hasDataChanged = true; // TODO: hier kann man z.B. auch noch direkt einmal die DMX Daten zu verschicken veranlassen } } }