89 lines
2.3 KiB
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 final Logger logger = LoggerFactory.getLogger(getClass());
|
|
private 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
|
|
}
|
|
}
|
|
|
|
}
|