commit 4baa7be05c26230e287f62c3cd7dbedcf386707a Author: Stephan Richter Date: Thu Oct 19 15:05:03 2023 +0200 inital commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..aa00ffa --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..82dbec8 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..2b63946 --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..270ef61 --- /dev/null +++ b/pom.xml @@ -0,0 +1,24 @@ + + + 4.0.0 + + org.example + ArtDMX + 1.0-SNAPSHOT + + + + org.slf4j + slf4j-simple + 2.0.9 + + + + 17 + 17 + UTF-8 + + + \ No newline at end of file diff --git a/src/main/java/de/srsoftware/artdmx/ArtNetLib.java b/src/main/java/de/srsoftware/artdmx/ArtNetLib.java new file mode 100644 index 0000000..15ef878 --- /dev/null +++ b/src/main/java/de/srsoftware/artdmx/ArtNetLib.java @@ -0,0 +1,120 @@ +package de.srsoftware.artdmx; + +import java.net.DatagramPacket; +import java.net.DatagramSocket; +import java.net.InetAddress; + +/** + * ArtNet Class + * @author: Mirco Borella + */ +public class ArtNetLib { + + private DatagramSocket socket; + private String socketIp; + + /** + * Constructor with ip + * @param socketIp Ip address of the socket + */ + public ArtNetLib(String socketIp){ + this.socketIp = socketIp; + try { + socket = new DatagramSocket(); + } catch (Exception e) { + System.out.println("Exception in constructor: " + e); + } + } + + /** + * Send a ArtDmx packet in a universe, subnet and net given. + * @param dmxChannelData Dmx data array. ArraySize=512, ArrayType=byte, ArrayValue=(0-255) + * @param universe Universe in which send the packets. (Values from 0 to 15) + * @param subnet Subnet in which send the packets. (Values from 0 to 15) + * @param net Net in which send the packets. (Values from 0 to 15) + */ + public void sendArtDmxPacket(byte[] dmxChannelData, byte universe, byte subnet, byte net){ + //Name: Size: Bytes: Bits: + //Id[8] Int8 8 64 + char[] idChars = {'A', 'r', 't', '-', 'N', 'e', 't', 0x00}; + byte[] id = new byte[8]; + for (int i = 0; i < id.length; i++) { + id[i] = (byte)idChars[i]; + } + + //Name: Size: Bytes: Bits: + //OpCode Int16 2 16 + //Choosen OpCode: OpDmx=0x5000; + //Notation: Little-endian + byte[] opCode = {(byte)0, (byte)80}; + + //Name: Size: Bytes: Bits: + //ProtVerHi Int8 1 8 + byte protVerHi = 0; + + //Name: Size: Bytes: Bits: + //ProtVerLow Int8 1 8 + byte protVerLow = 14; + + //Name: Size: Bytes: Bits: + //Sequence Int8 1 8 + byte sequence = 0; + + //Name: Size: Bytes: Bits: + //Physical Int8 1 8 + byte physical = 0; + + //Name: Size: Bytes: Bits: + //SubUni Int8 1 8 + //Most significant 4 bit- > Subnet + //Least significant 4 bit -> Universe + //Values accepted: 0-15 + subnet = (byte) (subnet << 4); + byte subUni = (byte) (subnet + universe); + + //Name: Size: Bytes: Bits: + //Net Int8 1 8 + //Values accepted: 0-127 + byte pNet = net; + + //Name: Size: Bytes: Bits: + //LengthHi Int8 1 8 + byte lengthHi = 2; + + //Name: Size: Bytes: Bits: + //Lenght Int8 1 8 + byte length = 0; + + //Name: Size: Bytes: Bits: + //Data Int8 512 4096 + byte[] data = dmxChannelData; + + //Preparing the byte array + byte[] byteToSend = new byte[530]; + for (int i = 0; i < id.length; i++) { + byteToSend[i] = id[i]; + } + byteToSend[8] = opCode[0]; + byteToSend[9] = opCode[1]; + byteToSend[10] = protVerHi; + byteToSend[11] = protVerLow; + byteToSend[12] = sequence; + byteToSend[13] = physical; + byteToSend[14] = subUni; + byteToSend[15] = pNet; + byteToSend[16] = lengthHi; + byteToSend[17] = length; + for (int i = 18; i < byteToSend.length; i++) { + byteToSend[i] = data[i-18]; + } + + //Sending the packet + try { + DatagramPacket dgram = new DatagramPacket(byteToSend, byteToSend.length, InetAddress.getByName(socketIp), 6454); + socket.send(dgram); + } catch (Exception e) { + System.out.println("Exception at packet sending: " + e); + } + } + +} \ No newline at end of file diff --git a/src/main/java/de/srsoftware/artdmx/Light.java b/src/main/java/de/srsoftware/artdmx/Light.java new file mode 100644 index 0000000..4638b9b --- /dev/null +++ b/src/main/java/de/srsoftware/artdmx/Light.java @@ -0,0 +1,53 @@ +package de.srsoftware.artdmx; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Random; + +public class Light implements Runnable{ + private static final Logger LOG = LoggerFactory.getLogger(Light.class); + private final byte chn; + private static final int min = 4; + private static final int max = 128; + private static final Random RAND = new Random(); + private final Universe uni; + + public Light(Universe universe, byte channel) { + LOG.info("creating Light {}",channel); + chn = channel; + uni = universe; + } + + @Override + public void run() { + LOG.info("started light {}",chn); + while (true){ + try { + long time = 1000+RAND.nextInt(30000); + LOG.info("light {} sleeping for {}s",chn,time/1000d); + Thread.sleep(time); + } catch (InterruptedException e) { + break; + } + for (int bright = min; bright < max; bright++) { + uni.send(chn,(byte)bright); + sleep(); + } + for (int bright = max; bright > min; bright--) { + uni.send(chn,(byte)bright); + sleep(); + } + + } + } + + private static void sleep(){ + try { + Thread.sleep(33); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } + +} diff --git a/src/main/java/de/srsoftware/artdmx/Main.java b/src/main/java/de/srsoftware/artdmx/Main.java new file mode 100644 index 0000000..b0ad79c --- /dev/null +++ b/src/main/java/de/srsoftware/artdmx/Main.java @@ -0,0 +1,25 @@ +package de.srsoftware.artdmx; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class Main { + private static final Logger LOG = LoggerFactory.getLogger("ArtDmx"); + public static void main(String[] args) { + byte lights = 8; + var universe = new Universe("192.168.1.255",(byte)1); + startLights(lights,universe); + } + + private static void startLights(byte lights, Universe universe) { + LOG.info("Setting up {} lights…",lights); + for (byte i = 0; i