bunti/bunti_server/src/main/java/de/ctdo/dmx/Mixer.java

110 lines
2.6 KiB
Java

package de.ctdo.dmx;
import java.net.SocketException;
import java.util.ArrayList;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import artnet4j.ArtNet;
import artnet4j.ArtNetException;
import artnet4j.ArtNetNode;
import artnet4j.packets.ArtDmxPacket;
public class Mixer {
static Mixer instance = new Mixer();
final int TICKS_BETWEEN_DMX_SEND = 20;
final int DMX_MIN_CHANNEL = 0;
final int DMX_MAX_CHANNEL = 512;
Logger logger = LoggerFactory.getLogger(Mixer.class);
int[] dmx512databuffer = new int[512];
static int sequenceID = 0;
ArtNet artnet = new ArtNet();
ArtNetNode firstNodeFound = null;
long ticksLastBufferFlush = 0;
protected final List<DMXDataChangedListener> listeners = new ArrayList<DMXDataChangedListener>();
public static Mixer getInstance() {
return instance;
}
public void addListener(DMXDataChangedListener l) {
synchronized (listeners) {
listeners.add(l);
}
}
public void removeListener(DMXDataChangedListener l) {
synchronized (listeners) {
listeners.remove(l);
}
}
private Mixer() {
try {
artnet.start();
}
catch (ArtNetException e) {
logger.error("ArtNetException... " + e.toString());
}
catch (SocketException e) {
logger.error("SocketException... " + e.toString());
}
}
private void sendOutDMXBuffer() {
// if(firstNodeFound == null) {
// logger.info("No ArtNetNode to send data to");
// return;
// }
ArtDmxPacket dmx = new ArtDmxPacket();
// dmx.setUniverse(firstNodeFound.getSubNet(), firstNodeFound.getDmxOuts()[0]);
// dmx.setSequenceID(sequenceID % 255);
// dmx.setDMX(dmx512databuffer, dmx512databuffer.length);
// artnet.unicastPacket(dmx, firstNodeFound.getIPAddress());
dmx.setUniverse(0, 0);
dmx.setSequenceID(sequenceID % 255);
byte[] arr = new byte[dmx512databuffer.length];
for (int i = 0; i < dmx512databuffer.length; i++) {
arr[i] = (byte)dmx512databuffer[i];
}
dmx.setDMX(arr, arr.length);
artnet.unicastPacket(dmx, "192.168.0.90");
sequenceID++;
ticksLastBufferFlush = System.currentTimeMillis();
// logger.debug("Send out DMX Data");
}
public void sendOutDMXBufferIfNeeded() {
if(ticksLastBufferFlush + TICKS_BETWEEN_DMX_SEND < System.currentTimeMillis()) {
sendOutDMXBuffer();
}
}
public void setDMX512Channel(int channel, int value) {
if(channel < DMX_MIN_CHANNEL || channel > DMX_MAX_CHANNEL) {
return;
}
if(value < 0) value = 0;
if(value > 255) value = 255;
dmx512databuffer[channel-1] = value;
sendOutDMXBufferIfNeeded();
for (DMXDataChangedListener l : this.listeners) {
l.DMXDataChanged(dmx512databuffer);
}
}
}