110 lines
2.6 KiB
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);
|
|
}
|
|
}
|
|
|
|
}
|