From ddea2d1e691849d18c7540ecd98d5a7cc912f5ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lucas=20Ple=C3=9F?= Date: Sat, 3 Mar 2012 18:29:31 +0100 Subject: [PATCH] =?UTF-8?q?artnet=20optimiert,=20fehlerkorrigiert=20senden?= =?UTF-8?q?=20von=20Werten=20nur,=20wenn=20was=20ge=C3=A4ndert=20wurde.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...pse.jst.j2ee.ejb.annotations.xdoclet.prefs | 5 + .../org.eclipse.ltk.core.refactoring.prefs | 2 + .../org.eclipse.wst.ws.service.policy.prefs | 2 + .../src/main/java/artnet4j/ArtNet.java | 146 -------------- .../main/java/artnet4j/ArtNetException.java | 33 ---- .../src/main/java/artnet4j/ArtNetNode.java | 170 ---------------- .../java/artnet4j/ArtNetNodeDiscovery.java | 132 ------------- .../src/main/java/artnet4j/ArtNetServer.java | 179 ----------------- .../src/main/java/artnet4j/DmxUniverse.java | 122 ------------ .../main/java/artnet4j/DmxUniverseConfig.java | 53 ----- .../java/artnet4j/InetAddressAdapter.java | 38 ---- .../main/java/artnet4j/NodeReportCode.java | 78 -------- .../src/main/java/artnet4j/NodeStyle.java | 50 ----- .../main/java/artnet4j/PortDescriptor.java | 65 ------ .../src/main/java/artnet4j/PortType.java | 33 ---- .../events/ArtNetDiscoveryEventAdapter.java | 47 ----- .../events/ArtNetDiscoveryListener.java | 35 ---- .../events/ArtNetServerEventAdapter.java | 70 ------- .../artnet4j/events/ArtNetServerListener.java | 37 ---- .../artnet4j/packets/ArtNetPacketParser.java | 69 ------- .../java/artnet4j/packets/ArtPollPacket.java | 65 ------ .../artnet4j/packets/ArtPollReplyPacket.java | 185 ------------------ .../de/ctdo/bunti/artnet/ArtNetSocket.java | 10 + .../ctdo/bunti/artnet/ArtNetSocketImpl.java | 56 ++++++ .../ctdo/bunti/artnet}/ByteUtils.java | 26 +-- .../ctdo/bunti/artnet/SimpleArtNetSender.java | 9 + .../bunti/artnet/SimpleArtNetSenderImpl.java | 41 ++++ .../bunti/artnet}/packets/ArtDmxPacket.java | 9 +- .../bunti/artnet}/packets/ArtNetPacket.java | 48 +---- .../bunti/artnet}/packets/PacketType.java | 36 ++-- .../de/ctdo/bunti/devices/DeviceMixer.java | 5 +- .../ctdo/bunti/devices/DeviceMixerImpl.java | 6 +- .../main/java/de/ctdo/bunti/dmx/.gitignore | 1 + .../java/de/ctdo/bunti/dmx/DMXChannel.java | 8 +- .../java/de/ctdo/bunti/dmx/DMXChannels.java | 87 ++++---- .../java/de/ctdo/bunti/dmx/DMXMixerImpl.java | 116 +++++------ .../de/ctdo/bunti/model/BuntiDMXDevice.java | 69 +++++-- .../webapp/WEB-INF/dispatcher-servlet.xml | 13 +- 38 files changed, 326 insertions(+), 1830 deletions(-) create mode 100644 bunti_server/.settings/org.eclipse.jst.j2ee.ejb.annotations.xdoclet.prefs create mode 100644 bunti_server/.settings/org.eclipse.ltk.core.refactoring.prefs create mode 100644 bunti_server/.settings/org.eclipse.wst.ws.service.policy.prefs delete mode 100644 bunti_server/src/main/java/artnet4j/ArtNet.java delete mode 100644 bunti_server/src/main/java/artnet4j/ArtNetException.java delete mode 100644 bunti_server/src/main/java/artnet4j/ArtNetNode.java delete mode 100644 bunti_server/src/main/java/artnet4j/ArtNetNodeDiscovery.java delete mode 100644 bunti_server/src/main/java/artnet4j/ArtNetServer.java delete mode 100644 bunti_server/src/main/java/artnet4j/DmxUniverse.java delete mode 100644 bunti_server/src/main/java/artnet4j/DmxUniverseConfig.java delete mode 100644 bunti_server/src/main/java/artnet4j/InetAddressAdapter.java delete mode 100644 bunti_server/src/main/java/artnet4j/NodeReportCode.java delete mode 100644 bunti_server/src/main/java/artnet4j/NodeStyle.java delete mode 100644 bunti_server/src/main/java/artnet4j/PortDescriptor.java delete mode 100644 bunti_server/src/main/java/artnet4j/PortType.java delete mode 100644 bunti_server/src/main/java/artnet4j/events/ArtNetDiscoveryEventAdapter.java delete mode 100644 bunti_server/src/main/java/artnet4j/events/ArtNetDiscoveryListener.java delete mode 100644 bunti_server/src/main/java/artnet4j/events/ArtNetServerEventAdapter.java delete mode 100644 bunti_server/src/main/java/artnet4j/events/ArtNetServerListener.java delete mode 100644 bunti_server/src/main/java/artnet4j/packets/ArtNetPacketParser.java delete mode 100644 bunti_server/src/main/java/artnet4j/packets/ArtPollPacket.java delete mode 100644 bunti_server/src/main/java/artnet4j/packets/ArtPollReplyPacket.java create mode 100644 bunti_server/src/main/java/de/ctdo/bunti/artnet/ArtNetSocket.java create mode 100644 bunti_server/src/main/java/de/ctdo/bunti/artnet/ArtNetSocketImpl.java rename bunti_server/src/main/java/{artnet4j/packets => de/ctdo/bunti/artnet}/ByteUtils.java (96%) create mode 100644 bunti_server/src/main/java/de/ctdo/bunti/artnet/SimpleArtNetSender.java create mode 100644 bunti_server/src/main/java/de/ctdo/bunti/artnet/SimpleArtNetSenderImpl.java rename bunti_server/src/main/java/{artnet4j => de/ctdo/bunti/artnet}/packets/ArtDmxPacket.java (92%) rename bunti_server/src/main/java/{artnet4j => de/ctdo/bunti/artnet}/packets/ArtNetPacket.java (56%) rename bunti_server/src/main/java/{artnet4j => de/ctdo/bunti/artnet}/packets/PacketType.java (65%) create mode 100644 bunti_server/src/main/java/de/ctdo/bunti/dmx/.gitignore diff --git a/bunti_server/.settings/org.eclipse.jst.j2ee.ejb.annotations.xdoclet.prefs b/bunti_server/.settings/org.eclipse.jst.j2ee.ejb.annotations.xdoclet.prefs new file mode 100644 index 0000000..7c8126d --- /dev/null +++ b/bunti_server/.settings/org.eclipse.jst.j2ee.ejb.annotations.xdoclet.prefs @@ -0,0 +1,5 @@ +XDOCLETBUILDERACTIVE=true +XDOCLETHOME= +XDOCLETUSEGLOBAL=true +XDOCLETVERSION=1.2.1 +eclipse.preferences.version=1 diff --git a/bunti_server/.settings/org.eclipse.ltk.core.refactoring.prefs b/bunti_server/.settings/org.eclipse.ltk.core.refactoring.prefs new file mode 100644 index 0000000..b196c64 --- /dev/null +++ b/bunti_server/.settings/org.eclipse.ltk.core.refactoring.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=false diff --git a/bunti_server/.settings/org.eclipse.wst.ws.service.policy.prefs b/bunti_server/.settings/org.eclipse.wst.ws.service.policy.prefs new file mode 100644 index 0000000..9cfcabe --- /dev/null +++ b/bunti_server/.settings/org.eclipse.wst.ws.service.policy.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +org.eclipse.wst.ws.service.policy.projectEnabled=false diff --git a/bunti_server/src/main/java/artnet4j/ArtNet.java b/bunti_server/src/main/java/artnet4j/ArtNet.java deleted file mode 100644 index 07e4296..0000000 --- a/bunti_server/src/main/java/artnet4j/ArtNet.java +++ /dev/null @@ -1,146 +0,0 @@ -/* - * This file is part of artnet4j. - * - * Copyright 2009 Karsten Schmidt (PostSpectacular Ltd.) - * - * artnet4j is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * artnet4j is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with artnet4j. If not, see . - */ - -package artnet4j; - -import java.net.InetAddress; -import java.net.SocketException; -import java.net.UnknownHostException; -import java.util.logging.Level; -import java.util.logging.Logger; - -import artnet4j.packets.ArtNetPacket; - -public class ArtNet { - - public static final Logger logger = Logger.getLogger(ArtNet.class.getClass().getName()); - - protected static final long ARTPOLL_REPLY_TIMEOUT = 3000; - - protected static final String VERSION = "0001-20091119"; - - protected ArtNetServer server; -// protected ArtNetNodeDiscovery discovery; - -// public ArtNet() { -// logger.info("Art-Net v" + VERSION); -// } - -// public void addServerListener(ArtNetServerListener l) { -// server.addListener(l); -// } -// -// public void broadcastPacket(ArtNetPacket packet) { -// server.broadcastPacket(packet); -// } - -// public ArtNetNodeDiscovery getNodeDiscovery() { -// if (discovery == null) { -// discovery = new ArtNetNodeDiscovery(this); -// } -// return discovery; -// } - - public void init() { - server = new ArtNetServer(); -// server.addListener(new ArtNetServerEventAdapter() { -// @Override -// public void artNetPacketReceived(ArtNetPacket packet) { -// logger.fine("packet received: " + packet.getType()); -// if (discovery != null && packet.getType() == PacketType.ART_POLL_REPLY) { -// discovery.discoverNode((ArtPollReplyPacket) packet); -// } -// } -// -// @Override -// public void artNetServerStarted(ArtNetServer artNetServer) { -// logger.fine("server started callback"); -// } -// -// @Override -// public void artNetServerStopped(ArtNetServer artNetServer) { -// logger.info("server stopped"); -// } -// }); - } - -// public void removeServerListener(ArtNetServerListener l) { -// server.removeListener(l); -// } -// -// public void setBroadCastAddress(String ip) { -// server.setBroadcastAddress(ip); -// } - - public void start() throws SocketException, ArtNetException { - if (server == null) { - init(); - } - server.start(); - } - -// public void startNodeDiscovery() throws ArtNetException { -// getNodeDiscovery().start(); -// } - - public void stop() { -// if (discovery != null) { -// discovery.stop(); -// } - if (server != null) { - server.stop(); - } - } - -// /** -// * Sends the given packet to the specified Art-Net node. -// * -// * @param packet -// * @param node -// */ -// public void unicastPacket(ArtNetPacket packet, ArtNetNode node) { -// server.unicastPacket(packet, node.getIPAddress()); -// } -// -// /** -// * Sends the given packet to the specified IP address. -// * -// * @param packet -// * @param adr -// */ -// public void unicastPacket(ArtNetPacket packet, InetAddress adr) { -// server.unicastPacket(packet, adr); -// } - - /** - * Sends the given packet to the specified IP address. - * - * @param packet - * @param adr - */ - public void unicastPacket(ArtNetPacket packet, String adr) { - InetAddress targetAdress; - try { - targetAdress = InetAddress.getByName(adr); - server.unicastPacket(packet, targetAdress); - } catch (UnknownHostException e) { - logger.log(Level.WARNING, e.getMessage(), e); - } - } -} \ No newline at end of file diff --git a/bunti_server/src/main/java/artnet4j/ArtNetException.java b/bunti_server/src/main/java/artnet4j/ArtNetException.java deleted file mode 100644 index 753b8dc..0000000 --- a/bunti_server/src/main/java/artnet4j/ArtNetException.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * This file is part of artnet4j. - * - * Copyright 2009 Karsten Schmidt (PostSpectacular Ltd.) - * - * artnet4j is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * artnet4j is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with artnet4j. If not, see . - */ - -package artnet4j; - -public class ArtNetException extends Exception { - - private static final long serialVersionUID = 1L; - - public ArtNetException(String message) { - super(message); - } - - public ArtNetException(String message, Throwable cause) { - super(message, cause); - } -} diff --git a/bunti_server/src/main/java/artnet4j/ArtNetNode.java b/bunti_server/src/main/java/artnet4j/ArtNetNode.java deleted file mode 100644 index be5bf73..0000000 --- a/bunti_server/src/main/java/artnet4j/ArtNetNode.java +++ /dev/null @@ -1,170 +0,0 @@ -/* - * This file is part of artnet4j. - * - * Copyright 2009 Karsten Schmidt (PostSpectacular Ltd.) - * - * artnet4j is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * artnet4j is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with artnet4j. If not, see . - */ - -package artnet4j; - -import java.net.InetAddress; -import java.util.logging.Logger; - -import artnet4j.packets.ArtPollReplyPacket; -import artnet4j.packets.ByteUtils; - -public class ArtNetNode { - - protected static final Logger logger = Logger.getLogger(ArtNetNode.class - .getClass().getName()); - - protected final NodeStyle nodeStyle; - - private InetAddress ip; - - private int subSwitch; - - private int oemCode; - - private int nodeStatus; - private NodeReportCode reportCode; - - private String shortName; - private String longName; - - private int numPorts; - private PortDescriptor[] ports; - private byte[] dmxIns; - private byte[] dmxOuts; - - public ArtNetNode() { - this(NodeStyle.ST_NODE); - } - - public ArtNetNode(NodeStyle style) { - nodeStyle = style; - } - - public void extractConfig(ArtPollReplyPacket source) { - setIPAddress(source.getIPAddress()); - subSwitch = source.getSubSwitch(); - oemCode = source.getOEMCode(); - nodeStatus = source.getNodeStatus(); - shortName = source.getShortName(); - longName = source.getLongName(); - ports = source.getPorts(); - numPorts = ports.length; - reportCode = source.getReportCode(); - dmxIns = source.getDmxIns(); - dmxOuts = source.getDmxOuts(); - logger.info("updated node config"); - } - - /** - * @return the dmxIns - */ - public byte[] getDmxIns() { - return dmxIns; - } - - /** - * @return the dmxOuts - */ - public byte[] getDmxOuts() { - return dmxOuts; - } - - /** - * @return the ip - */ - public InetAddress getIPAddress() { - return ip; - } - - /** - * @return the longName - */ - public String getLongName() { - return longName; - } - - /** - * @return the nodeStatus - */ - public int getNodeStatus() { - return nodeStatus; - } - - /** - * @return the nodeStyle - */ - public NodeStyle getNodeStyle() { - return nodeStyle; - } - - /** - * @return the numPorts - */ - public int getNumPorts() { - return numPorts; - } - - /** - * @return the oemCode - */ - public int getOemCode() { - return oemCode; - } - - /** - * @return the ports - */ - public PortDescriptor[] getPorts() { - return ports; - } - - /** - * @return the reportCode - */ - public NodeReportCode getReportCode() { - return reportCode; - } - - /** - * @return the shortName - */ - public String getShortName() { - return shortName; - } - - public int getSubNet() { - return subSwitch; - } - - public String getSubNetAsHex() { - return ByteUtils.hex(subSwitch, 2); - } - - public void setIPAddress(InetAddress ip) { - this.ip = ip; - } - - @Override - public String toString() { - return "node: " + nodeStyle + " " + ip + " " + longName + ", " - + numPorts + " ports, subswitch: " - + ByteUtils.hex(subSwitch, 2); - } -} diff --git a/bunti_server/src/main/java/artnet4j/ArtNetNodeDiscovery.java b/bunti_server/src/main/java/artnet4j/ArtNetNodeDiscovery.java deleted file mode 100644 index 7bdc754..0000000 --- a/bunti_server/src/main/java/artnet4j/ArtNetNodeDiscovery.java +++ /dev/null @@ -1,132 +0,0 @@ -///* -// * This file is part of artnet4j. -// * -// * Copyright 2009 Karsten Schmidt (PostSpectacular Ltd.) -// * -// * artnet4j is free software: you can redistribute it and/or modify -// * it under the terms of the GNU General Public License as published by -// * the Free Software Foundation, either version 3 of the License, or -// * (at your option) any later version. -// * -// * artnet4j is distributed in the hope that it will be useful, -// * but WITHOUT ANY WARRANTY; without even the implied warranty of -// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// * GNU General Public License for more details. -// * -// * You should have received a copy of the GNU General Public License -// * along with artnet4j. If not, see . -// */ -// -//package artnet4j; -// -//import java.net.InetAddress; -//import java.util.ArrayList; -//import java.util.List; -//import java.util.concurrent.ConcurrentHashMap; -//import java.util.logging.Logger; -// -//import artnet4j.events.ArtNetDiscoveryListener; -//import artnet4j.packets.ArtPollPacket; -//import artnet4j.packets.ArtPollReplyPacket; -// -//public class ArtNetNodeDiscovery implements Runnable { -// -// public static final int POLL_INTERVAL = 10000; -// -// public static final Logger logger = Logger -// .getLogger(ArtNetNodeDiscovery.class.getClass().getName()); -// -// protected final ArtNet artNet; -// protected ConcurrentHashMap discoveredNodes = new ConcurrentHashMap(); -// protected List lastDiscovered = new ArrayList(); -// protected List listeners = new ArrayList(); -// -// protected boolean isActive = true; -// -// protected long discoveryInterval; -// -// private Thread discoveryThread; -// -// public ArtNetNodeDiscovery(ArtNet artNet) { -// this.artNet = artNet; -// setInterval(POLL_INTERVAL); -// } -// -// public void addListener(ArtNetDiscoveryListener l) { -// synchronized (listeners) { -// listeners.add(l); -// } -// } -// -// public void discoverNode(ArtPollReplyPacket reply) { -// InetAddress nodeIP = reply.getIPAddress(); -// ArtNetNode node = discoveredNodes.get(nodeIP); -// if (node == null) { -// logger.info("discovered new node: " + nodeIP); -// node = reply.getNodeStyle().createNode(); -// node.extractConfig(reply); -// discoveredNodes.put(nodeIP, node); -// for (ArtNetDiscoveryListener l : listeners) { -// l.discoveredNewNode(node); -// } -// } else { -// node.extractConfig(reply); -// } -// lastDiscovered.add(node); -// } -// -// public void removeListener(ArtNetDiscoveryListener l) { -// synchronized (listeners) { -// listeners.remove(l); -// } -// } -// -// @Override -// public void run() { -// try { -// while (isActive) { -// lastDiscovered.clear(); -// ArtPollPacket poll = new ArtPollPacket(); -// artNet.broadcastPacket(poll); -// Thread.sleep(ArtNet.ARTPOLL_REPLY_TIMEOUT); -// if (isActive) { -// synchronized (listeners) { -// for (ArtNetNode node : discoveredNodes.values()) { -// if (!lastDiscovered.contains(node)) { -// discoveredNodes.remove(node.getIPAddress()); -// for (ArtNetDiscoveryListener l : listeners) { -// l.discoveredNodeDisconnected(node); -// } -// } -// } -// for (ArtNetDiscoveryListener l : listeners) { -// l.discoveryCompleted(new ArrayList( -// discoveredNodes.values())); -// } -// } -// Thread.sleep(discoveryInterval -// - ArtNet.ARTPOLL_REPLY_TIMEOUT); -// } -// } -// } catch (InterruptedException e) { -// logger.warning("node discovery interrupted"); -// } -// } -// -// public void setInterval(int interval) { -// discoveryInterval = Math.max(interval, ArtNet.ARTPOLL_REPLY_TIMEOUT); -// } -// -// public void start() throws ArtNetException { -// if (discoveryThread == null) { -// discoveryThread = new Thread(this); -// discoveryThread.start(); -// } else { -// throw new ArtNetException("discovery already started."); -// } -// } -// -// public void stop() { -// isActive = false; -// } -//} \ No newline at end of file diff --git a/bunti_server/src/main/java/artnet4j/ArtNetServer.java b/bunti_server/src/main/java/artnet4j/ArtNetServer.java deleted file mode 100644 index a811232..0000000 --- a/bunti_server/src/main/java/artnet4j/ArtNetServer.java +++ /dev/null @@ -1,179 +0,0 @@ -/* - * This file is part of artnet4j. - * - * Copyright 2009 Karsten Schmidt (PostSpectacular Ltd.) - * - * artnet4j is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * artnet4j is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with artnet4j. If not, see . - */ - -package artnet4j; - -import java.io.IOException; -import java.net.DatagramPacket; -import java.net.DatagramSocket; -import java.net.InetAddress; -import java.net.SocketException; -import java.net.UnknownHostException; -import java.util.logging.Level; - -import artnet4j.packets.ArtNetPacket; - -public class ArtNetServer extends ArtNetNode { // implements Runnable { - - public static final int DEFAULT_PORT = 0x1936; - - public static final String DEFAULT_BROADCAST_IP = "2.255.255.255"; - - protected final int port; - protected final int sendPort; - - protected DatagramSocket socket; - protected InetAddress broadCastAddress; - protected Thread serverThread; - - protected int receiveBufferSize; - protected boolean isRunning; - -// protected final List listeners; - - public ArtNetServer() { - this(DEFAULT_PORT, DEFAULT_PORT); - } - - public ArtNetServer(int port, int sendPort) { - super(NodeStyle.ST_SERVER); - this.port = port; - this.sendPort = sendPort; -// this.listeners = new ArrayList(); - setBufferSize(2048); - } - -// public void addListener(ArtNetServerListener l) { -// synchronized (listeners) { -// listeners.add(l); -// } -// } -// -// public void broadcastPacket(ArtNetPacket ap) { -// try { -// DatagramPacket packet = new DatagramPacket(ap.getData(), ap -// .getLength(), broadCastAddress, sendPort); -// socket.send(packet); -// for (ArtNetServerListener l : listeners) { -// l.artNetPacketBroadcasted(ap); -// } -// } catch (IOException e) { -// logger.warning(e.getMessage()); -// } -// } -// -// public void removeListener(ArtNetServerListener l) { -// synchronized (listeners) { -// listeners.remove(l); -// } -// } - -// @Override -// public void run() { -// byte[] receiveBuffer = new byte[receiveBufferSize]; -// DatagramPacket receivedPacket = new DatagramPacket(receiveBuffer, receiveBuffer.length); -// -// try { -// while (isRunning) { -// socket.receive(receivedPacket); -// logger.finer("received new packet"); -// ArtNetPacket packet = ArtNetPacketParser.parse(receivedPacket); -// if (packet != null) { -// if (packet.getType() == PacketType.ART_POLL) { -// sendArtPollReply(receivedPacket.getAddress(), (ArtPollPacket) packet); -// } -// for (ArtNetServerListener l : listeners) { -// l.artNetPacketReceived(packet); -// } -// } -// } -// socket.close(); -// logger.info("server thread terminated."); -// for (ArtNetServerListener l : listeners) { -// l.artNetServerStopped(this); -// } -// } catch (IOException e) { -// e.printStackTrace(); -// } -// } - -// private void sendArtPollReply(InetAddress inetAddress, ArtPollPacket packet) { -// // TODO send reply with self description -// } - - public void setBroadcastAddress(String address) { - try { - broadCastAddress = InetAddress.getByName(address); - logger.fine("broadcast IP set to: " + broadCastAddress); - } catch (UnknownHostException e) { - logger.log(Level.WARNING, e.getMessage(), e); - } - } - - private void setBufferSize(int size) { - if (!isRunning) { - receiveBufferSize = size; - } - } - - public void start() throws SocketException, ArtNetException { - if (broadCastAddress == null) { - setBroadcastAddress(DEFAULT_BROADCAST_IP); - } - if (socket == null) { -// socket = new DatagramSocket(port); - socket = new DatagramSocket(); -// logger.info("Art-Net server started at port: " + port); -// for (ArtNetServerListener l : listeners) { -// l.artNetServerStarted(this); -// } - isRunning = true; -// serverThread = new Thread(this); -// serverThread.start(); - } else { - throw new ArtNetException( - "Couldn't create server socket, server already running?"); - } - } - - public void stop() { - isRunning = false; - } - - /** - * Sends the given packet to the specified IP address. - * - * @param ap - * @param targetAdress - */ - public void unicastPacket(ArtNetPacket ap, InetAddress targetAdress) { - try { - DatagramPacket packet = new DatagramPacket(ap.getData(), ap.getLength(), targetAdress, sendPort); - - socket.send(packet); - logger.finer("sent packet to: " + targetAdress); - -// for (ArtNetServerListener l : listeners) { -// l.artNetPacketUnicasted(ap); -// } - } catch (IOException e) { - logger.warning(e.getMessage()); - } - } -} \ No newline at end of file diff --git a/bunti_server/src/main/java/artnet4j/DmxUniverse.java b/bunti_server/src/main/java/artnet4j/DmxUniverse.java deleted file mode 100644 index dfd9201..0000000 --- a/bunti_server/src/main/java/artnet4j/DmxUniverse.java +++ /dev/null @@ -1,122 +0,0 @@ -/* - * This file is part of artnet4j. - * - * Copyright 2009 Karsten Schmidt (PostSpectacular Ltd.) - * - * artnet4j is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * artnet4j is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with artnet4j. If not, see . - */ - -package artnet4j; - -import artnet4j.packets.ArtDmxPacket; - -public class DmxUniverse { - - protected final DmxUniverseConfig config; - protected final byte[] frameData; - - protected ArtNetNode node; - protected boolean isEnabled = true; - protected boolean isActive = true; - - public DmxUniverse(ArtNetNode node, DmxUniverseConfig config) { - this.node = node; - this.config = config; - frameData = new byte[0x200]; - } - - public DmxUniverseConfig getConfig() { - return config; - } - - public String getID() { - return config.id; - } - - public ArtNetNode getNode() { - return node; - } - - public int getNumChannels() { - return config.numDmxChannels; - } - - public ArtDmxPacket getPacket(int sequenceID) { - ArtDmxPacket packet = new ArtDmxPacket(); - packet.setSequenceID(sequenceID); - packet.setUniverse(node.getSubNet(), config.universeID); - // FIXME Art-Lynx OP has firmware issue with packet lengths < 512 - // channels - // packet.setDMX(frameData, config.numDmxChannels); - packet.setDMX(frameData, config.ignoreNumChannels - ? 0x200 - : config.numDmxChannels); - return packet; - } - - /** - * @return the isActive - */ - public boolean isActive() { - return isActive; - } - - /** - * @return the isEnabled - */ - public boolean isEnabled() { - return isEnabled; - } - - /** - * @param isActive - * the isActive to sunsetTime - */ - public void setActive(boolean isActive) { - this.isActive = isActive; - } - - public void setChannel(int offset, int val) { - frameData[offset] = (byte) val; - } - - /** - * @param isEnabled - * the isEnabled to sunsetTime - */ - public void setEnabled(boolean isEnabled) { - this.isEnabled = isEnabled; - } - - /** - * @param node - * the node to sunsetTime - */ - public void setNode(ArtNetNode node) { - this.node = node; - } - - public void setRGBPixel(int offset, int col) { - offset *= 3; - frameData[offset] = (byte) (col >> 16 & 0xff); - frameData[offset + 1] = (byte) (col >> 8 & 0xff); - frameData[offset + 2] = (byte) (col & 0xff); - } - - @Override - public String toString() { - return node.getIPAddress() + "u: " + config.universeID + " st: " - + isEnabled + "/" + isActive + " c: " + config.numDmxChannels; - } -} diff --git a/bunti_server/src/main/java/artnet4j/DmxUniverseConfig.java b/bunti_server/src/main/java/artnet4j/DmxUniverseConfig.java deleted file mode 100644 index c6eebaa..0000000 --- a/bunti_server/src/main/java/artnet4j/DmxUniverseConfig.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * This file is part of artnet4j. - * - * Copyright 2009 Karsten Schmidt (PostSpectacular Ltd.) - * - * artnet4j is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * artnet4j is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with artnet4j. If not, see . - */ - -package artnet4j; - -import java.net.InetAddress; - -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; - -public class DmxUniverseConfig { - - @XmlAttribute - public String id; - - @XmlAttribute - @XmlJavaTypeAdapter(InetAddressAdapter.class) - public InetAddress ip; - - @XmlAttribute(name = "universe") - public int universeID; - - @XmlAttribute(name = "numchannels") - public int numDmxChannels; - - @XmlAttribute(name = "port") - public int serverPort; - - @XmlAttribute - public boolean ignoreNumChannels; - - @Override - public String toString() { - return "nodeConfig: id=" + id + ", ip=" + ip + ", uid=" + universeID - + ", nc=" + numDmxChannels; - } -} \ No newline at end of file diff --git a/bunti_server/src/main/java/artnet4j/InetAddressAdapter.java b/bunti_server/src/main/java/artnet4j/InetAddressAdapter.java deleted file mode 100644 index ea40237..0000000 --- a/bunti_server/src/main/java/artnet4j/InetAddressAdapter.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * This file is part of artnet4j. - * - * Copyright 2009 Karsten Schmidt (PostSpectacular Ltd.) - * - * artnet4j is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * artnet4j is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with artnet4j. If not, see . - */ - -package artnet4j; - -import java.net.InetAddress; - -import javax.xml.bind.annotation.adapters.XmlAdapter; - -public class InetAddressAdapter extends XmlAdapter { - - @Override - public String marshal(InetAddress adr) throws Exception { - return adr.getHostAddress(); - } - - @Override - public InetAddress unmarshal(String adr) throws Exception { - return InetAddress.getByName(adr); - } - -} diff --git a/bunti_server/src/main/java/artnet4j/NodeReportCode.java b/bunti_server/src/main/java/artnet4j/NodeReportCode.java deleted file mode 100644 index 088b4ee..0000000 --- a/bunti_server/src/main/java/artnet4j/NodeReportCode.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * This file is part of artnet4j. - * - * Copyright 2009 Karsten Schmidt (PostSpectacular Ltd.) - * - * artnet4j is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * artnet4j is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with artnet4j. If not, see . - */ -package artnet4j; - -public enum NodeReportCode { - - RcDebug("#0000", "Booted in debug mode"), - RcPowerOk("#0001", "Power On Tests successful"), - RcPowerFail("#0002", "Hardware tests failed at Power On"), - RcSocketWr1( - "#0003", - "Last UDP from Node failed due to truncated length. Most likely caused by a collision."), - RcParseFail("#0004", - "Unable to identify last UDP transmission. Check OpCode and packet length."), - RcUdpFail("#0005", "Unable to open Udp Socket in last transmission attempt"), - RcShNameOk("#0006", - "Confirms that Short Name programming via ArtAddress, was successful."), - RcLoNameOk("#0007", - "Confirms that Long Name programming via ArtAddress, was successful."), - RcDmxError("#0008", "DMX512 receive errors detected."), RcDmxUdpFull( - "#0009", "Ran out of internal DMX transmit buffers."), RcDmxRxFull( - "#000a", "Ran out of internal DMX Rx buffers."), RcSwitchErr( - "#000b", "Rx Universe switches conflict."), RcConfigErr("#000c", - "Product configuration does not match firmware."), RcDmxShort( - "#000d", "DMX output short detected. See GoodOutput field."), - RcFirmwareFail("#000e", "Last attempt to upload new firmware failed."), - RcUserFail("#000f", - "User changed switch settings when address locked by remote."); - - public static NodeReportCode getForID(String id) { - NodeReportCode code = null; - for (NodeReportCode c : values()) { - if (c.id.equalsIgnoreCase(id)) { - code = c; - break; - } - } - return code; - } - - private final String id; - private final String description; - - private NodeReportCode(String id, String desc) { - this.id = id; - this.description = desc; - } - - /** - * @return the description - */ - public String getDescription() { - return description; - } - - /** - * @return the id - */ - public String getID() { - return id; - } -} \ No newline at end of file diff --git a/bunti_server/src/main/java/artnet4j/NodeStyle.java b/bunti_server/src/main/java/artnet4j/NodeStyle.java deleted file mode 100644 index 8660796..0000000 --- a/bunti_server/src/main/java/artnet4j/NodeStyle.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * This file is part of artnet4j. - * - * Copyright 2009 Karsten Schmidt (PostSpectacular Ltd.) - * - * artnet4j is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * artnet4j is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with artnet4j. If not, see . - */ - -package artnet4j; - -public enum NodeStyle { - ST_NODE(0, ArtNetNode.class), ST_SERVER(1, ArtNetServer.class), ST_MEDIA(2, - ArtNetNode.class), ST_ROUTER(3, ArtNetNode.class), ST_BACKUP(4, - ArtNetNode.class), ST_CONFIG(5, ArtNetNode.class); - - private int id; - private Class nodeClass; - - private NodeStyle(int id, Class nodeClass) { - this.id = id; - this.nodeClass = nodeClass; - } - - public ArtNetNode createNode() { - ArtNetNode node = null; - try { - node = nodeClass.newInstance(); - } catch (InstantiationException e) { - e.printStackTrace(); - } catch (IllegalAccessException e) { - e.printStackTrace(); - } - return node; - } - - public int getStyleID() { - return id; - } -} diff --git a/bunti_server/src/main/java/artnet4j/PortDescriptor.java b/bunti_server/src/main/java/artnet4j/PortDescriptor.java deleted file mode 100644 index c581dd0..0000000 --- a/bunti_server/src/main/java/artnet4j/PortDescriptor.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * This file is part of artnet4j. - * - * Copyright 2009 Karsten Schmidt (PostSpectacular Ltd.) - * - * artnet4j is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * artnet4j is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with artnet4j. If not, see . - */ - -package artnet4j; - -public class PortDescriptor { - - protected boolean canOutput; - protected boolean canInput; - protected PortType type; - - public PortDescriptor(int id) { - canOutput = (id & 0x80) > 0; - canInput = (id & 0x40) > 0; - id &= 0x3f; - for (PortType t : PortType.values()) { - if (id == t.getPortID()) { - type = t; - } - } - } - - /** - * @return the canInput - */ - public boolean canInput() { - return canInput; - } - - /** - * @return the canOutput - */ - public boolean canOutput() { - return canOutput; - } - - /** - * @return the type - */ - public PortType getType() { - return type; - } - - @Override - public String toString() { - return "PortDescriptor: " + type + " out: " + canOutput + " in: " - + canInput; - } -} diff --git a/bunti_server/src/main/java/artnet4j/PortType.java b/bunti_server/src/main/java/artnet4j/PortType.java deleted file mode 100644 index 7887274..0000000 --- a/bunti_server/src/main/java/artnet4j/PortType.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * This file is part of artnet4j. - * - * Copyright 2009 Karsten Schmidt (PostSpectacular Ltd.) - * - * artnet4j is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * artnet4j is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with artnet4j. If not, see . - */ -package artnet4j; - -public enum PortType { - DMX512(0), MIDI(1), AVAB(2), COLORTRAN(3), ADB62_5(4), ARTNET(5); - - private int id; - - private PortType(int id) { - this.id = id; - } - - public int getPortID() { - return id; - } -} diff --git a/bunti_server/src/main/java/artnet4j/events/ArtNetDiscoveryEventAdapter.java b/bunti_server/src/main/java/artnet4j/events/ArtNetDiscoveryEventAdapter.java deleted file mode 100644 index 64f9132..0000000 --- a/bunti_server/src/main/java/artnet4j/events/ArtNetDiscoveryEventAdapter.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * This file is part of artnet4j. - * - * Copyright 2009 Karsten Schmidt (PostSpectacular Ltd.) - * - * artnet4j is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * artnet4j is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with artnet4j. If not, see . - */ - -package artnet4j.events; - -import java.util.List; - -import artnet4j.ArtNetNode; - -public class ArtNetDiscoveryEventAdapter implements ArtNetDiscoveryListener { - - @Override - public void discoveredNewNode(ArtNetNode node) { - - } - - @Override - public void discoveredNodeDisconnected(ArtNetNode node) { - - } - - @Override - public void discoveryCompleted(List nodes) { - - } - - @Override - public void discoveryFailed(Throwable t) { - - } -} diff --git a/bunti_server/src/main/java/artnet4j/events/ArtNetDiscoveryListener.java b/bunti_server/src/main/java/artnet4j/events/ArtNetDiscoveryListener.java deleted file mode 100644 index 98ae548..0000000 --- a/bunti_server/src/main/java/artnet4j/events/ArtNetDiscoveryListener.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * This file is part of artnet4j. - * - * Copyright 2009 Karsten Schmidt (PostSpectacular Ltd.) - * - * artnet4j is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * artnet4j is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with artnet4j. If not, see . - */ - -package artnet4j.events; - -import java.util.List; - -import artnet4j.ArtNetNode; - -public interface ArtNetDiscoveryListener { - - void discoveredNewNode(ArtNetNode node); - - void discoveredNodeDisconnected(ArtNetNode node); - - void discoveryCompleted(List nodes); - - void discoveryFailed(Throwable t); -} diff --git a/bunti_server/src/main/java/artnet4j/events/ArtNetServerEventAdapter.java b/bunti_server/src/main/java/artnet4j/events/ArtNetServerEventAdapter.java deleted file mode 100644 index f7f95f6..0000000 --- a/bunti_server/src/main/java/artnet4j/events/ArtNetServerEventAdapter.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * This file is part of artnet4j. - * - * Copyright 2009 Karsten Schmidt (PostSpectacular Ltd.) - * - * artnet4j is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * artnet4j is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with artnet4j. If not, see . - */ - -package artnet4j.events; - -/* - * This file is part of artnet4j. - * - * Copyright 2009 Karsten Schmidt (PostSpectacular Ltd.) - * - * artnet4j is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * artnet4j is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with artnet4j. If not, see . - */ - -import artnet4j.ArtNetServer; -import artnet4j.packets.ArtNetPacket; - -public class ArtNetServerEventAdapter implements ArtNetServerListener { - - @Override - public void artNetPacketBroadcasted(ArtNetPacket packet) { - - } - - @Override - public void artNetPacketReceived(ArtNetPacket packet) { - - } - - @Override - public void artNetPacketUnicasted(ArtNetPacket packet) { - - } - - @Override - public void artNetServerStarted(ArtNetServer server) { - - } - - @Override - public void artNetServerStopped(ArtNetServer server) { - - } -} diff --git a/bunti_server/src/main/java/artnet4j/events/ArtNetServerListener.java b/bunti_server/src/main/java/artnet4j/events/ArtNetServerListener.java deleted file mode 100644 index 348212c..0000000 --- a/bunti_server/src/main/java/artnet4j/events/ArtNetServerListener.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * This file is part of artnet4j. - * - * Copyright 2009 Karsten Schmidt (PostSpectacular Ltd.) - * - * artnet4j is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * artnet4j is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with artnet4j. If not, see . - */ - -package artnet4j.events; - -import artnet4j.ArtNetServer; -import artnet4j.packets.ArtNetPacket; - -public interface ArtNetServerListener { - - void artNetPacketBroadcasted(ArtNetPacket packet); - - void artNetPacketReceived(ArtNetPacket packet); - - void artNetPacketUnicasted(ArtNetPacket packet); - - void artNetServerStarted(ArtNetServer server); - - void artNetServerStopped(ArtNetServer server); - -} diff --git a/bunti_server/src/main/java/artnet4j/packets/ArtNetPacketParser.java b/bunti_server/src/main/java/artnet4j/packets/ArtNetPacketParser.java deleted file mode 100644 index ad9800a..0000000 --- a/bunti_server/src/main/java/artnet4j/packets/ArtNetPacketParser.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * This file is part of artnet4j. - * - * Copyright 2009 Karsten Schmidt (PostSpectacular Ltd.) - * - * artnet4j is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * artnet4j is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with artnet4j. If not, see . - */ - -package artnet4j.packets; - -import java.net.DatagramPacket; -import java.util.logging.Logger; - -public class ArtNetPacketParser { - - public static final Logger logger = - Logger.getLogger(ArtNetPacketParser.class.getClass().getName()); - - public static ArtNetPacket createPacketForOpCode(int opCode, byte[] data) { - logger.finer("creating packet instance for opcode: 0x" - + ByteUtils.hex(opCode, 4)); - ArtNetPacket packet = null; - for (PacketType type : PacketType.values()) { - if (opCode == type.getOpCode()) { - packet = type.createPacket(); - if (packet != null) { - packet.parse(data); - break; - } else { - logger.fine("packet type valid, but not yet supported: " - + type); - } - } - } - return packet; - } - - private static ArtNetPacket parse(byte[] raw, int offset, int length) { - ArtNetPacket packet = null; - ByteUtils data = new ByteUtils(raw); - if (data.length > 10) { - if (data.compareBytes(ArtNetPacket.HEADER, 0, 8)) { - int opCode = data.getInt16LE(8); - packet = createPacketForOpCode(opCode, raw); - } else { - logger.warning("invalid header"); - } - } else { - logger.warning("invalid packet length: " + data.length); - } - return packet; - } - - public static ArtNetPacket parse(DatagramPacket receivedPacket) { - return parse(receivedPacket.getData(), receivedPacket.getOffset(), - receivedPacket.getLength()); - } -} diff --git a/bunti_server/src/main/java/artnet4j/packets/ArtPollPacket.java b/bunti_server/src/main/java/artnet4j/packets/ArtPollPacket.java deleted file mode 100644 index 5392540..0000000 --- a/bunti_server/src/main/java/artnet4j/packets/ArtPollPacket.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * This file is part of artnet4j. - * - * Copyright 2009 Karsten Schmidt (PostSpectacular Ltd.) - * - * artnet4j is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * artnet4j is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with artnet4j. If not, see . - */ - -package artnet4j.packets; - -public class ArtPollPacket extends ArtNetPacket { - - private static int ARTPOLL_LENGTH = 14; - - private boolean replyOnce; - private boolean replyDirect; - - public ArtPollPacket() { - this(true, true); - } - - public ArtPollPacket(boolean replyOnce, boolean replyDirect) { - super(PacketType.ART_POLL); - setData(new byte[ARTPOLL_LENGTH]); - setHeader(); - setProtocol(); - setTalkToMe(replyOnce, replyDirect); - } - - @Override - public int getLength() { - return data.getLength(); - } - - @Override - public boolean parse(byte[] raw) { - setData(raw, ARTPOLL_LENGTH); - int talk = data.getInt8(12); - replyOnce = 0 == (talk & 0x02); - replyDirect = 1 == (talk & 0x01); - return true; - } - - private void setTalkToMe(boolean replyOnce, boolean replyDirect) { - this.replyOnce = replyOnce; - this.replyDirect = replyDirect; - data.setInt8((replyOnce ? 0 : 2) | (replyDirect ? 1 : 0), 12); - } - - @Override - public String toString() { - return type + ": reply once:" + replyOnce + " direct: " + replyDirect; - } -} diff --git a/bunti_server/src/main/java/artnet4j/packets/ArtPollReplyPacket.java b/bunti_server/src/main/java/artnet4j/packets/ArtPollReplyPacket.java deleted file mode 100644 index 84fb8e2..0000000 --- a/bunti_server/src/main/java/artnet4j/packets/ArtPollReplyPacket.java +++ /dev/null @@ -1,185 +0,0 @@ -/* - * This file is part of artnet4j. - * - * Copyright 2009 Karsten Schmidt (PostSpectacular Ltd.) - * - * artnet4j is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * artnet4j is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with artnet4j. If not, see . - */ - -package artnet4j.packets; - -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.util.logging.Level; - -import artnet4j.NodeReportCode; -import artnet4j.NodeStyle; -import artnet4j.PortDescriptor; - -public class ArtPollReplyPacket extends ArtNetPacket { - - private InetAddress ip; - - private int subSwitch; - private int oemCode; - private int nodeStatus; - - private String shortName; - private String longName; - - private int numPorts; - private PortDescriptor[] ports; - - private NodeStyle nodeStyle; - private NodeReportCode reportCode; - - private byte[] dmxIns; - private byte[] dmxOuts; - - public ArtPollReplyPacket() { - super(PacketType.ART_POLL_REPLY); - } - - public ArtPollReplyPacket(byte[] data) { - super(PacketType.ART_POLL_REPLY); - setData(data); - } - - /** - * @return the dmxIns - */ - public byte[] getDmxIns() { - return dmxIns; - } - - /** - * @return the dmxOuts - */ - public byte[] getDmxOuts() { - return dmxOuts; - } - - /** - * @return the ip - */ - public InetAddress getIPAddress() { - InetAddress ipClone = null; - try { - ipClone = InetAddress.getByAddress(ip.getAddress()); - } catch (UnknownHostException e) { - } - return ipClone; - } - - public String getLongName() { - return longName; - } - - public int getNodeStatus() { - return nodeStatus; - } - - public NodeStyle getNodeStyle() { - return nodeStyle; - } - - public int getOEMCode() { - return oemCode; - } - - public PortDescriptor[] getPorts() { - return ports; - } - - /** - * @return the reportCode - */ - public NodeReportCode getReportCode() { - return reportCode; - } - - public String getShortName() { - return shortName; - } - - public int getSubSwitch() { - return subSwitch; - } - - @Override - public boolean parse(byte[] raw) { - setData(raw); - // System.out.println(data.toHex(256)); - setIPAddress(data.getByteChunk(null, 10, 4)); - subSwitch = data.getInt16(18); - oemCode = data.getInt16(20); - nodeStatus = data.getInt8(23); - shortName = new String(data.getByteChunk(null, 26, 17)); - longName = new String(data.getByteChunk(null, 44, 64)); - reportCode = - NodeReportCode.getForID(new String(data.getByteChunk(null, 108, - 5))); - numPorts = data.getInt16(172); - ports = new PortDescriptor[numPorts]; - for (int i = 0; i < numPorts; i++) { - ports[i] = new PortDescriptor(data.getInt8(174 + i)); - } - dmxIns = data.getByteChunk(null, 186, 4); - dmxOuts = data.getByteChunk(null, 190, 4); - for (int i = 0; i < 4; i++) { - dmxIns[i] &= 0x0f; - dmxOuts[i] &= 0x0f; - } - int styleID = data.getInt8(200); - for (NodeStyle s : NodeStyle.values()) { - if (styleID == s.getStyleID()) { - nodeStyle = s; - } - } - return true; - } - - /** - * @param dmxIns - * the dmxIns to set - */ - public void setDmxIns(byte[] dmxIns) { - this.dmxIns = dmxIns; - } - - /** - * @param dmxOuts - * the dmxOuts to set - */ - public void setDmxOuts(byte[] dmxOuts) { - this.dmxOuts = dmxOuts; - } - - private void setIPAddress(byte[] address) { - try { - ip = InetAddress.getByAddress(address); - logger.fine("setting ip address: " + ip); - } catch (UnknownHostException e) { - logger.log(Level.WARNING, e.getMessage(), e); - } - } - - /** - * @param reportCode - * the reportCode to set - */ - public void setReportCode(NodeReportCode reportCode) { - this.reportCode = reportCode; - } -} diff --git a/bunti_server/src/main/java/de/ctdo/bunti/artnet/ArtNetSocket.java b/bunti_server/src/main/java/de/ctdo/bunti/artnet/ArtNetSocket.java new file mode 100644 index 0000000..38cb792 --- /dev/null +++ b/bunti_server/src/main/java/de/ctdo/bunti/artnet/ArtNetSocket.java @@ -0,0 +1,10 @@ +package de.ctdo.bunti.artnet; + +import de.ctdo.bunti.artnet.packets.ArtNetPacket; + + +public interface ArtNetSocket { + + public boolean unicastPacket(ArtNetPacket pack, String address); + +} diff --git a/bunti_server/src/main/java/de/ctdo/bunti/artnet/ArtNetSocketImpl.java b/bunti_server/src/main/java/de/ctdo/bunti/artnet/ArtNetSocketImpl.java new file mode 100644 index 0000000..e384e40 --- /dev/null +++ b/bunti_server/src/main/java/de/ctdo/bunti/artnet/ArtNetSocketImpl.java @@ -0,0 +1,56 @@ +package de.ctdo.bunti.artnet; + +import java.io.IOException; +import java.net.DatagramPacket; +import java.net.DatagramSocket; +import java.net.InetAddress; +import java.net.SocketException; +import java.net.UnknownHostException; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import de.ctdo.bunti.artnet.packets.ArtNetPacket; + +@Component +public class ArtNetSocketImpl implements ArtNetSocket { + private final Logger logger = LoggerFactory.getLogger(getClass()); + public static final int DEFAULT_PORT = 0x1936; + protected DatagramSocket socket; + + public ArtNetSocketImpl() { + try { + socket = new DatagramSocket(); + + + } catch (SocketException e) { + + // TODO + logger.debug(e.getMessage(), e.getStackTrace()); + } + + } + + @Override + public boolean unicastPacket(ArtNetPacket pack, String address) { + InetAddress targetAdress; + try { + targetAdress = InetAddress.getByName(address); + + DatagramPacket packet = new DatagramPacket(pack.getData(), pack.getLength(), targetAdress, DEFAULT_PORT); + + socket.send(packet); + //socket.send(packet, targetAdress); + + } catch (UnknownHostException e) { + logger.error(e.getMessage(), e); + } catch (IOException e) { + logger.error(e.getMessage(), e); + } + + return false; + } + + +} diff --git a/bunti_server/src/main/java/artnet4j/packets/ByteUtils.java b/bunti_server/src/main/java/de/ctdo/bunti/artnet/ByteUtils.java similarity index 96% rename from bunti_server/src/main/java/artnet4j/packets/ByteUtils.java rename to bunti_server/src/main/java/de/ctdo/bunti/artnet/ByteUtils.java index 5a4951d..8bbce8b 100644 --- a/bunti_server/src/main/java/artnet4j/packets/ByteUtils.java +++ b/bunti_server/src/main/java/de/ctdo/bunti/artnet/ByteUtils.java @@ -17,16 +17,17 @@ * along with artnet4j. If not, see . */ -package artnet4j.packets; +package de.ctdo.bunti.artnet; public class ByteUtils { - - /** - * Converts the byte into an unsigned int. - * - * @param b - * @return - */ + protected final byte[] data; + public final int length; + + public ByteUtils(byte[] data) { + this.data = data; + this.length = data.length; + } + public static final int byteToUint(byte b) { return (b < 0 ? 256 + b : b); } @@ -43,15 +44,6 @@ public class ByteUtils { return stuff; } - protected final byte[] data; - - public final int length; - - public ByteUtils(byte[] data) { - this.data = data; - this.length = data.length; - } - public boolean compareBytes(byte[] other, int offset, int length) { boolean isEqual = (offset + length) < data.length; for (int i = 0; i < length && isEqual; i++) { diff --git a/bunti_server/src/main/java/de/ctdo/bunti/artnet/SimpleArtNetSender.java b/bunti_server/src/main/java/de/ctdo/bunti/artnet/SimpleArtNetSender.java new file mode 100644 index 0000000..83abda7 --- /dev/null +++ b/bunti_server/src/main/java/de/ctdo/bunti/artnet/SimpleArtNetSender.java @@ -0,0 +1,9 @@ +package de.ctdo.bunti.artnet; + +import java.util.Map; + +public interface SimpleArtNetSender { + + public void sendDMXData(Map dmxdata, String adr); + +} diff --git a/bunti_server/src/main/java/de/ctdo/bunti/artnet/SimpleArtNetSenderImpl.java b/bunti_server/src/main/java/de/ctdo/bunti/artnet/SimpleArtNetSenderImpl.java new file mode 100644 index 0000000..87a8c74 --- /dev/null +++ b/bunti_server/src/main/java/de/ctdo/bunti/artnet/SimpleArtNetSenderImpl.java @@ -0,0 +1,41 @@ +package de.ctdo.bunti.artnet; + +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + + +import de.ctdo.bunti.artnet.packets.ArtDmxPacket; + +@Component +public class SimpleArtNetSenderImpl implements SimpleArtNetSender { + + private ArtNetSocket socket; + private int sequence = 0; + + @Autowired + public void setSocket(ArtNetSocket socket) { + this.socket = socket; + } + + @Override + public void sendDMXData(Map dmxdata, String adr) { + + ArtDmxPacket packet = new ArtDmxPacket(); + int size = dmxdata.size(); + + byte[] arr = new byte[size]; + + for (int i = 0; i < dmxdata.size(); i++) { + arr[i] = (byte)(dmxdata.get(i) & 0xff); + } + + packet.setSequenceID(sequence++); + packet.setDMX(arr, arr.length); + packet.setUniverse(0, 0); + + socket.unicastPacket(packet, adr); + + } +} diff --git a/bunti_server/src/main/java/artnet4j/packets/ArtDmxPacket.java b/bunti_server/src/main/java/de/ctdo/bunti/artnet/packets/ArtDmxPacket.java similarity index 92% rename from bunti_server/src/main/java/artnet4j/packets/ArtDmxPacket.java rename to bunti_server/src/main/java/de/ctdo/bunti/artnet/packets/ArtDmxPacket.java index d75f7aa..4f93f20 100644 --- a/bunti_server/src/main/java/artnet4j/packets/ArtDmxPacket.java +++ b/bunti_server/src/main/java/de/ctdo/bunti/artnet/packets/ArtDmxPacket.java @@ -17,7 +17,8 @@ * along with artnet4j. If not, see . */ -package artnet4j.packets; +package de.ctdo.bunti.artnet.packets; + public class ArtDmxPacket extends ArtNetPacket { @@ -79,7 +80,6 @@ public class ArtDmxPacket extends ArtNetPacket { } public void setDMX(byte[] dmxData, int numChannels) { - logger.finer("setting DMX data for: " + numChannels + " channels"); this.numChannels = numChannels; data.setByteChunk(dmxData, 18, numChannels); data.setInt16((1 == numChannels % 2 ? numChannels + 1 : numChannels), @@ -111,9 +111,6 @@ public class ArtDmxPacket extends ArtNetPacket { this.subnetID = subnetID & 0x0f; this.universeID = universeID & 0x0f; data.setInt16LE(subnetID << 4 | universeID, 14); - logger.finer("universe ID set to: subnet: " - + ByteUtils.hex(subnetID, 2) + "/" - + ByteUtils.hex(universeID, 2)); } /** @@ -123,4 +120,4 @@ public class ArtDmxPacket extends ArtNetPacket { public void setUniverseID(int universeID) { this.universeID = universeID & 0x0f; } -} +} \ No newline at end of file diff --git a/bunti_server/src/main/java/artnet4j/packets/ArtNetPacket.java b/bunti_server/src/main/java/de/ctdo/bunti/artnet/packets/ArtNetPacket.java similarity index 56% rename from bunti_server/src/main/java/artnet4j/packets/ArtNetPacket.java rename to bunti_server/src/main/java/de/ctdo/bunti/artnet/packets/ArtNetPacket.java index 8094f9c..0b82fa1 100644 --- a/bunti_server/src/main/java/artnet4j/packets/ArtNetPacket.java +++ b/bunti_server/src/main/java/de/ctdo/bunti/artnet/packets/ArtNetPacket.java @@ -1,35 +1,11 @@ -/* - * This file is part of artnet4j. - * - * Copyright 2009 Karsten Schmidt (PostSpectacular Ltd.) - * - * artnet4j is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * artnet4j is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with artnet4j. If not, see . - */ +package de.ctdo.bunti.artnet.packets; -package artnet4j.packets; - -import java.util.logging.Logger; +import de.ctdo.bunti.artnet.ByteUtils; public abstract class ArtNetPacket { - public static final byte[] HEADER = "Art-Net\0".getBytes(); - public static final int PROTOCOL_VERSION = 14; - public static final Logger logger = - Logger.getLogger(ArtNetPacket.class.getClass().getName()); - protected ByteUtils data; protected final PacketType type; @@ -37,31 +13,18 @@ public abstract class ArtNetPacket { this.type = type; } - /** - * @return the data - */ public byte[] getData() { return data.getBytes(); } - /** - * Returns the actually used length of the data buffer. - * - * @return - */ public int getLength() { return data.length; } - /** - * Returns the type of this packet. - * - * @return the type - */ public PacketType getType() { return type; } - + /** * Parses the given byte array into semantic values and populates type * specific fields for each packet type. Implementing classes do not need to @@ -90,10 +53,6 @@ public abstract class ArtNetPacket { setData(raw); } - /** - * Sets the header bytes of the packet consisting of {@link #HEADER} and the - * type's OpCode. - */ protected void setHeader() { data.setByteChunk(HEADER, 0, 8); data.setInt16LE(type.getOpCode(), 8); @@ -107,4 +66,5 @@ public abstract class ArtNetPacket { public String toString() { return data.toHex(getLength()); } + } diff --git a/bunti_server/src/main/java/artnet4j/packets/PacketType.java b/bunti_server/src/main/java/de/ctdo/bunti/artnet/packets/PacketType.java similarity index 65% rename from bunti_server/src/main/java/artnet4j/packets/PacketType.java rename to bunti_server/src/main/java/de/ctdo/bunti/artnet/packets/PacketType.java index 9338d63..874e8d3 100644 --- a/bunti_server/src/main/java/artnet4j/packets/PacketType.java +++ b/bunti_server/src/main/java/de/ctdo/bunti/artnet/packets/PacketType.java @@ -17,21 +17,33 @@ * along with artnet4j. If not, see . */ -package artnet4j.packets; +package de.ctdo.bunti.artnet.packets; public enum PacketType { - ART_POLL(0x2000, ArtPollPacket.class), ART_POLL_REPLY(0x2100, - ArtPollReplyPacket.class), ART_OUTPUT(0x5000, null), ART_ADDRESS( - 0x6000, null), ART_INPUT(0x7000, null), ART_TOD_REQUEST(0x8000, - null), ART_TOD_DATA(0x8100, null), ART_TOD_CONTROL(0x8200, null), - ART_RDM(0x8300, null), ART_RDMSUB(0x8400, null), ART_MEDIA(0x9000, null), - ART_MEDIA_PATCH(0x9100, null), ART_MEDIA_CONTROL(0x9200, null), - ART_MEDIA_CONTROL_REPLY(0x9300, null), ART_VIDEO_SETUP(0xa010, null), - ART_VIDEO_PALETTE(0xa020, null), ART_VIDEO_DATA(0xa040, null), - ART_MAC_MASTER(0xf000, null), ART_MAC_SLAVE(0xf100, null), - ART_FIRMWARE_MASTER(0xf200, null), ART_FIRMWARE_REPLY(0xf300, null), - ART_IP_PROG(0xf800, null), ART_IP_PROG_REPLY(0xf900, null); + ART_POLL(0x2000, null), + ART_POLL_REPLY(0x2100, null), + ART_OUTPUT(0x5000, null), + ART_ADDRESS(0x6000, null), + ART_INPUT(0x7000, null), + ART_TOD_REQUEST(0x8000, null), + ART_TOD_DATA(0x8100, null), + ART_TOD_CONTROL(0x8200, null), + ART_RDM(0x8300, null), + ART_RDMSUB(0x8400, null), + ART_MEDIA(0x9000, null), + ART_MEDIA_PATCH(0x9100, null), + ART_MEDIA_CONTROL(0x9200, null), + ART_MEDIA_CONTROL_REPLY(0x9300, null), + ART_VIDEO_SETUP(0xa010, null), + ART_VIDEO_PALETTE(0xa020, null), + ART_VIDEO_DATA(0xa040, null), + ART_MAC_MASTER(0xf000, null), + ART_MAC_SLAVE(0xf100, null), + ART_FIRMWARE_MASTER(0xf200, null), + ART_FIRMWARE_REPLY(0xf300, null), + ART_IP_PROG(0xf800, null), + ART_IP_PROG_REPLY(0xf900, null); private final int opCode; private final Class packetClass; diff --git a/bunti_server/src/main/java/de/ctdo/bunti/devices/DeviceMixer.java b/bunti_server/src/main/java/de/ctdo/bunti/devices/DeviceMixer.java index 36e26ab..71af194 100644 --- a/bunti_server/src/main/java/de/ctdo/bunti/devices/DeviceMixer.java +++ b/bunti_server/src/main/java/de/ctdo/bunti/devices/DeviceMixer.java @@ -1,11 +1,8 @@ package de.ctdo.bunti.devices; -import org.springframework.context.ApplicationListener; -import de.ctdo.bunti.DeviceChangedEvent; - -public interface DeviceMixer extends ApplicationListener { +public interface DeviceMixer { diff --git a/bunti_server/src/main/java/de/ctdo/bunti/devices/DeviceMixerImpl.java b/bunti_server/src/main/java/de/ctdo/bunti/devices/DeviceMixerImpl.java index f5c24e5..24f5c1c 100644 --- a/bunti_server/src/main/java/de/ctdo/bunti/devices/DeviceMixerImpl.java +++ b/bunti_server/src/main/java/de/ctdo/bunti/devices/DeviceMixerImpl.java @@ -1,7 +1,6 @@ package de.ctdo.bunti.devices; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.springframework.context.ApplicationListener; import org.springframework.stereotype.Component; import de.ctdo.bunti.DeviceChangedEvent; @@ -9,8 +8,7 @@ import de.ctdo.bunti.model.BuntiSwitchingDevice; @Component -public class DeviceMixerImpl implements DeviceMixer { - private Logger logger = LoggerFactory.getLogger(getClass()); +public class DeviceMixerImpl implements DeviceMixer, ApplicationListener { @Override public void onApplicationEvent(DeviceChangedEvent arg0) { diff --git a/bunti_server/src/main/java/de/ctdo/bunti/dmx/.gitignore b/bunti_server/src/main/java/de/ctdo/bunti/dmx/.gitignore new file mode 100644 index 0000000..beb1afd --- /dev/null +++ b/bunti_server/src/main/java/de/ctdo/bunti/dmx/.gitignore @@ -0,0 +1 @@ +/DMXMixer.java diff --git a/bunti_server/src/main/java/de/ctdo/bunti/dmx/DMXChannel.java b/bunti_server/src/main/java/de/ctdo/bunti/dmx/DMXChannel.java index ee629ba..34d51f1 100644 --- a/bunti_server/src/main/java/de/ctdo/bunti/dmx/DMXChannel.java +++ b/bunti_server/src/main/java/de/ctdo/bunti/dmx/DMXChannel.java @@ -1,10 +1,10 @@ package de.ctdo.bunti.dmx; public class DMXChannel { - int offset; - String name; - int value; - long lastChangedTimestamp = 0; + private int offset; + private String name; + private int value; + private long lastChangedTimestamp = 0; public DMXChannel(int offset, String name) { this.name = name; diff --git a/bunti_server/src/main/java/de/ctdo/bunti/dmx/DMXChannels.java b/bunti_server/src/main/java/de/ctdo/bunti/dmx/DMXChannels.java index 8542fa8..99bb3f0 100644 --- a/bunti_server/src/main/java/de/ctdo/bunti/dmx/DMXChannels.java +++ b/bunti_server/src/main/java/de/ctdo/bunti/dmx/DMXChannels.java @@ -6,8 +6,10 @@ import java.util.HashMap; import java.util.Map; /** -* DMXChannel container -*/ + * DMXChannel container + * @author jCoder + * + */ public class DMXChannels { protected Map channelByNumber = new HashMap(); @@ -33,14 +35,14 @@ public class DMXChannels { return this.channelByName.get(name); } -// /** -// * Returns a channel by offset -// * @param number number -// * @return channel or null if not found -// */ -// public DMXChannel getChannelByNumber(int number) { -// return this.channelByNumber.get(number); -// } + /** + * Returns a channel by offset + * @param number number + * @return channel or null if not found + */ + public DMXChannel getChannelByNumber(int number) { + return this.channelByNumber.get(number); + } /** * Adds a channel @@ -53,51 +55,52 @@ public class DMXChannels { return false; } // description cannot be null - if (channel.name == null) { + if (channel.getName() == null) { return false; } // entry must not exist by offset - if (this.channelByNumber.containsKey(channel.offset) == true) { + if (this.channelByNumber.containsKey(channel.getOffset()) == true) { return false; } // entry must not exist by name - if (this.channelByName.containsKey(channel.name) == true) { + if (this.channelByName.containsKey(channel.getName()) == true) { return false; } - this.channelByNumber.put(channel.offset, channel); - this.channelByName.put(channel.name, channel); + this.channelByNumber.put(channel.getOffset(), channel); + this.channelByName.put(channel.getName(), channel); return true; } -// /** -// * Removes a channel by offset -// * @param offset offset -// * @return removed channel or null if it does not exist -// */ -// public DMXChannel removeChannel(int offset) { -// DMXChannel tmpChannel = this.channelByNumber.remove(offset); -// if (tmpChannel != null) { -// this.channelByName.remove(tmpChannel.name); -// } -// return tmpChannel; -// } + /** + * Removes a channel by offset + * @param offset offset + * @return removed channel or null if it does not exist + */ + public DMXChannel removeChannel(int offset) { + DMXChannel tmpChannel = this.channelByNumber.remove(offset); + if (tmpChannel != null) { + this.channelByName.remove(tmpChannel.getName()); + } + return tmpChannel; + } -// /** -// * Removes a channel by name -// * @param name channel name -// * @return removed channel or null if it does not exist -// */ -// public DMXChannel removeChannel(String name) { -// if (name == null) { -// return null; -// } -// DMXChannel tmpChannel = this.channelByName.remove(name); -// if (tmpChannel != null) { -// this.channelByOffset.remove(tmpChannel.offset); -// } -// return tmpChannel; -// } + /** + * Removes a channel by name + * @param name channel name + * @return removed channel or null if it does not exist + */ + public DMXChannel removeChannel(String name) { + if (name == null) { + return null; + } + DMXChannel tmpChannel = this.channelByName.remove(name); + if (tmpChannel != null) { + this.channelByNumber.remove(tmpChannel.getOffset()); + } + return tmpChannel; + } + /** * Returns an (unmodifiable) collection of all channels * @return unmodifiable collection of all channels diff --git a/bunti_server/src/main/java/de/ctdo/bunti/dmx/DMXMixerImpl.java b/bunti_server/src/main/java/de/ctdo/bunti/dmx/DMXMixerImpl.java index f5f5409..9263ff7 100644 --- a/bunti_server/src/main/java/de/ctdo/bunti/dmx/DMXMixerImpl.java +++ b/bunti_server/src/main/java/de/ctdo/bunti/dmx/DMXMixerImpl.java @@ -1,112 +1,84 @@ 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.dao.BuntiDevicesDAO; +import de.ctdo.bunti.artnet.SimpleArtNetSender; import de.ctdo.bunti.model.*; @Component -public class DMXMixerImpl implements DMXMixer { - private Logger logger = LoggerFactory.getLogger(getClass()); - private final int TICKS_BETWEEN_DMX_SEND = 20; -// private final String ARTNET_DEVICE_ADDRESS = "192.168.0.90"; +public class DMXMixerImpl implements DMXMixer, ApplicationListener { + private final Logger logger = LoggerFactory.getLogger(getClass()); + private final String ARTNET_DEVICE_ADDRESS = "192.168.0.90"; - private int[] dmx512databuffer = new int[DMX.DMX_CHANNELS_MAX+1]; - -// private int sequenceID = 0; - private long ticksLastBufferFlush = 0; - private BuntiDevicesDAO devicesDAO; + private final Map dmxMap = Collections.synchronizedMap(new HashMap()); + private SimpleArtNetSender artNetSender; + private boolean hasDataChanged = true; @Autowired - public void setDevicesDAO(BuntiDevicesDAO devicesDAO) { - this.devicesDAO = devicesDAO; + public void setArtNetSender(SimpleArtNetSender artNetSender) { + this.artNetSender = artNetSender; } - - private void sendOutDMXBuffer() { - - StringBuilder sb = new StringBuilder(); - sb.append("DMX Data: "); - - byte[] arr = new byte[dmx512databuffer.length]; - for (int i = 0; i < dmx512databuffer.length; i++) { - arr[i] = (byte)dmx512databuffer[i]; - sb.append(i); - sb.append("="); - sb.append(dmx512databuffer[i]); - sb.append(", "); + public void initDMXData() { + for (int i = 0; i <= DMX.DMX_CHANNELS_MAX; i++) { + dmxMap.put(i, 0); } + } -// sequenceID++; - - logger.debug(sb.toString()); - } - - - public void sendOutDMXBufferIfNeeded() { - if(ticksLastBufferFlush + TICKS_BETWEEN_DMX_SEND < System.currentTimeMillis()) { - -// mergeDevicesIntoBuffer(); - sendOutDMXBuffer(); - ticksLastBufferFlush = System.currentTimeMillis(); + @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()); } - private void updateDevice(BuntiDevice device, Map options) { + public void updateDevice(BuntiDevice device, Map options) { BuntiDMXDevice dmxDev = (BuntiDMXDevice)device; - boolean retval = dmxDev.setValuesFromOptions(options); - if( retval ) { - dmxDev.mergeDMXData(dmx512databuffer); + if( dmxDev.setValuesFromOptions(options) ) { - sendOutDMXBufferIfNeeded(); + dmxMap.putAll(dmxDev.getChannelData()); + + + logger.info("setValuesFromOptions on " + device); } else { - logger.error("setValuesFromOptions failed"); + logger.info("setValuesFromOptions on " + device + " failed"); } } -// private void mergeDevicesIntoBuffer() { -// -// for (BuntiDMXDevice buntiDMXDevice : devicesDAO.getAllDMXDevices()) { -// long lastchanged = buntiDMXDevice.getLastChanged(); -// long lastSend = buntiDMXDevice.getLastSendOut(); -// -// if (lastchanged >= lastSend) { -// buntiDMXDevice.mergeDMXData(dmx512databuffer); -// logger.debug("merged " + buntiDMXDevice + " into dmx buffer"); -// buntiDMXDevice.setSendOutNow(); -// } -// -// } -// } - -// public void setDMX512Channel(int channel, int value) { -// if(!DMX.checkChannelBoundaries(channel)) return; -// value = DMX.sanitizeDMXValue(value); -// -// dmx512databuffer[channel] = value; -// -// sendOutDMXBufferIfNeeded(); -// } - @Override - public void onApplicationEvent(DeviceChangedEvent arg0) { + 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 } } - - - } diff --git a/bunti_server/src/main/java/de/ctdo/bunti/model/BuntiDMXDevice.java b/bunti_server/src/main/java/de/ctdo/bunti/model/BuntiDMXDevice.java index d46b3b5..ae33fc4 100644 --- a/bunti_server/src/main/java/de/ctdo/bunti/model/BuntiDMXDevice.java +++ b/bunti_server/src/main/java/de/ctdo/bunti/model/BuntiDMXDevice.java @@ -1,5 +1,6 @@ package de.ctdo.bunti.model; +import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; @@ -58,28 +59,66 @@ public abstract class BuntiDMXDevice extends BuntiDevice { return 0; } - /** - * Merge the DMX values from this device into a global DMX512 Data Array. - * @param dmxData DMX512 Data array to merge the local values into. - * @return True on success, false otherwise. - */ - public boolean mergeDMXData(int[] dmxData) { - - if(dmxData == null || dmxData.length == 0) { - return false; - } +// /** +// * Merge the DMX values from this device into a global DMX512 Data Array. +// * @param dmxData DMX512 Data array to merge the local values into. +// * @return True on success, false otherwise. +// */ +// public boolean mergeDMXData(int[] dmxData) { +// +// if(dmxData == null || dmxData.length == 0) { +// return false; +// } +// +// for (DMXChannel channel : dmxChannels.getAllChannels()) { +// int index = channel.getOffset() + (startAddress - DMX.DMX_STARTADDRESS_OFFSET); +// +// if(index >= 0 && index < dmxData.length){ +// dmxData[index] = channel.getValue(); +// } else { +// return false; +// } +// } +// +// return true; +// } +// +// /** +// * Merge the DMX values from this device into a global DMX512 Data Array. +// * @param dmxData DMX512 Data to merge the local values into. +// * @return True on success, false otherwise. +// */ +// public boolean mergeDMXData(Map dmxData) { +// +// if(dmxData == null || dmxData.size() == 0) { +// return false; +// } +// +// for (DMXChannel channel : dmxChannels.getAllChannels()) { +// int index = channel.getOffset() + (startAddress - DMX.DMX_STARTADDRESS_OFFSET); +// +// if(index >= DMX.DMX_CHANNELS_MIN && index <= DMX.DMX_CHANNELS_MAX){ +// dmxData.put(index, channel.getValue()); +// } else { +// return false; +// } +// } +// +// return true; +// } + + public Map getChannelData() { + Map map = new HashMap(); for (DMXChannel channel : dmxChannels.getAllChannels()) { int index = channel.getOffset() + (startAddress - DMX.DMX_STARTADDRESS_OFFSET); - if(index >= 0 && index < dmxData.length){ - dmxData[index] = channel.getValue(); - } else { - return false; + if(index >= DMX.DMX_CHANNELS_MIN && index <= DMX.DMX_CHANNELS_MAX){ + map.put(index, channel.getValue()); } } - return true; + return map; } @Override diff --git a/bunti_server/src/main/webapp/WEB-INF/dispatcher-servlet.xml b/bunti_server/src/main/webapp/WEB-INF/dispatcher-servlet.xml index 12269b6..07d1f55 100644 --- a/bunti_server/src/main/webapp/WEB-INF/dispatcher-servlet.xml +++ b/bunti_server/src/main/webapp/WEB-INF/dispatcher-servlet.xml @@ -1,10 +1,12 @@ + http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd + http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd"> @@ -12,4 +14,9 @@ + + + + \ No newline at end of file