bunti/src/main/java/de/ctdo/bunti/dmx/DMXMixerImpl.java

89 lines
2.3 KiB
Java

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<DeviceChangedEvent> {
private static final Logger LOGGER = LoggerFactory.getLogger(DMXMixerImpl.class);
private static final String ARTNET_DEVICE_ADDRESS = "192.168.0.90";
private final Map<Integer,Integer> dmxMap = Collections.synchronizedMap(new HashMap<Integer,Integer>());
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<String, Object> 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
}
}
}