From da7563f0ffced0e0287d3cce5577a4e2d7c14c23 Mon Sep 17 00:00:00 2001 From: Sven Bentfeld Date: Sun, 14 Feb 2016 20:14:10 +0100 Subject: [PATCH] Devices Ergaenzt, Touch Handling, 0-Bug fixed, refs #8, #5, #3 --- DMXSoftware/Data/DeviceTypes.xml | 150 ++++++++++++++- DMXSoftware/Data/Devices.xml | 21 +- DMXSoftware/nbactions.xml | 17 ++ .../Communicate/MidiConnection.java | 18 +- .../dmxsoftware/Database/Channel.java | 10 + .../dmxsoftware/Database/Device.java | 8 +- .../dmxsoftware/Processing/Manage.java | 7 +- .../Processing/ValueConverter.java | 7 + .../dmxsoftware/Surface/ControlSurface.java | 180 +++++++++++++----- .../dmxsoftware/Surface/Fader.java | 64 ++++++- .../dmxsoftware/Surface/FaderListener.java | 7 +- 11 files changed, 407 insertions(+), 82 deletions(-) create mode 100644 DMXSoftware/nbactions.xml diff --git a/DMXSoftware/Data/DeviceTypes.xml b/DMXSoftware/Data/DeviceTypes.xml index 25802a6..209c6e0 100644 --- a/DMXSoftware/Data/DeviceTypes.xml +++ b/DMXSoftware/Data/DeviceTypes.xml @@ -105,12 +105,12 @@ - "Renkforce RDM Par_10" + "Renkforce RDM Par_5" "Par" "60" - "https://www.conrad.de/medias/global/ce/6000_6999/6400/6440/6448/1301624_LB_00_FB.EPS_1000.jpg" + "" - + "Red" @@ -132,7 +132,7 @@ "Renkforce RDM Par_10" "Par" "60" - "Data/Pictures/RenkforceRDM_5.png" + "https://www.conrad.de/medias/global/ce/6000_6999/6400/6440/6448/1301624_LB_00_FB.EPS_1000.jpg" @@ -367,4 +367,146 @@ + + + "Outdoor" + "Par" + "120" + "https://www.thomann.de/pics/bdb/305314/7974151_800.jpg" + + + + + + "Dimmer" + + + + + + + + "Red" + + + + + + + + "Green" + + + + + + + + "Blue" + + + + + + + + "White" + + + + + + + + + + "Cameo" + "Par" + "144" + "http://www.cameolight.com/out/pictures/generated/product/1/1000_1000_80/CLPST64RGBWAU12W_1.jpg" + + + + + "Dimmer" + + + + + + + + "Red" + + + + + + + + "Green" + + + + + + + + "Blue" + + + + + + + + "White" + + + + + + + + "Amber" + + + + + + + + "UV" + + + + + + + + "Macro" + + + "Macro" + "Color Mix" + "Red" + "Green" + "Blue" + "White" + "Amber" + "Violet" + "Yellow" + "Cyan" + "Lavender" + "LightGreen" + "Magenta" + "Turqoise" + "Orange" + "Cool White" + "Warm White" + + + + + \ No newline at end of file diff --git a/DMXSoftware/Data/Devices.xml b/DMXSoftware/Data/Devices.xml index 722a3a6..e936135 100644 --- a/DMXSoftware/Data/Devices.xml +++ b/DMXSoftware/Data/Devices.xml @@ -5,7 +5,7 @@ "Nicht auf der Deele" - + "Renkforce-Par 1" "Kuhstall Haus-Seite" @@ -14,6 +14,21 @@ "Renkforce-Par 2" "Kuhstall Tor-Seite" + + + "Outdoor 1" + "Deele Haus" + + + + "Cameo Par" + "Deele Mitte" + + + + "Outdoor 2" + "Deele Tor" + "BAR 1" @@ -27,11 +42,11 @@ "BAR 3" - "Kuhstall Haus-Seite Mistfall" + "Kuhstall Haus-Seite Deele" "BAR 4" - "Kuhstall Haus-Seite Deele" + "Kuhstall Haus-Seite Mistfall" \ No newline at end of file diff --git a/DMXSoftware/nbactions.xml b/DMXSoftware/nbactions.xml new file mode 100644 index 0000000..d64ec5c --- /dev/null +++ b/DMXSoftware/nbactions.xml @@ -0,0 +1,17 @@ + + + + run + + jar + + + process-classes + org.codehaus.mojo:exec-maven-plugin:1.2.1:exec + + + -classpath %classpath SnowballThrower.dmxsoftware.HelloWorldMain + java + + + diff --git a/DMXSoftware/src/main/java/SnowballThrower/dmxsoftware/Communicate/MidiConnection.java b/DMXSoftware/src/main/java/SnowballThrower/dmxsoftware/Communicate/MidiConnection.java index 6977e53..25b7bcb 100644 --- a/DMXSoftware/src/main/java/SnowballThrower/dmxsoftware/Communicate/MidiConnection.java +++ b/DMXSoftware/src/main/java/SnowballThrower/dmxsoftware/Communicate/MidiConnection.java @@ -10,7 +10,6 @@ import javax.sound.midi.InvalidMidiDataException; import javax.sound.midi.MidiDevice; import javax.sound.midi.MidiDevice.Info; -import javax.sound.midi.MidiMessage; import javax.sound.midi.MidiSystem; import javax.sound.midi.MidiUnavailableException; import javax.sound.midi.ShortMessage; @@ -27,6 +26,7 @@ public class MidiConnection extends Thread { private int[] valOld; int[] valNew; boolean stop; + private long SLEEP = 2; public MidiConnection() { stop = false; @@ -61,8 +61,8 @@ public void change(int channel, int value) { } private void send(int channel, int value) { - System.out.println("Midi send: " + channel + " ," + value / 2); - System.out.println("Midi send: " + (CONTROL_CHANGE + channel / 128) + " ," + channel % 128 + " ," + value / 2); + //System.out.println("Midi send: " + channel + " ," + value / 2); + //System.out.println("Midi send: " + (CONTROL_CHANGE + channel / 128) + " ," + channel % 128 + " ," + value / 2); try { ShortMessage message = new ShortMessage(CONTROL_CHANGE, channel / 128, channel % 128, value / 2); try { @@ -82,11 +82,17 @@ private void send(int channel, int value) { private void loop() { int i; for (i = 0; i < MAX_CH; i++) { - if (valOld[i] != valNew[i]) { - send(i, valNew[i]); - valOld[i] = valNew[i]; + int valBuff = valNew[i]; + if (valOld[i] != valBuff) { + valOld[i] = valBuff; + send(i, valOld[i]); } } + try { + Thread.sleep(SLEEP); + } catch (InterruptedException ex) { + Logger.getLogger(MidiConnection.class.getName()).log(Level.SEVERE, null, ex); + } } @Override diff --git a/DMXSoftware/src/main/java/SnowballThrower/dmxsoftware/Database/Channel.java b/DMXSoftware/src/main/java/SnowballThrower/dmxsoftware/Database/Channel.java index ac47e94..fdaa256 100644 --- a/DMXSoftware/src/main/java/SnowballThrower/dmxsoftware/Database/Channel.java +++ b/DMXSoftware/src/main/java/SnowballThrower/dmxsoftware/Database/Channel.java @@ -6,6 +6,7 @@ package SnowballThrower.dmxsoftware.Database; import java.util.List; +import javafx.scene.text.Text; /** * @@ -28,6 +29,15 @@ String getMeaning(int value, int[] values) { return value + ""; } + public String getStandardMeaning(int value) { + if (meanings != null) { + if (meanings.get(0) != null) { + return meanings.get(0).getMeaning(value); + } + } + return null; + } + public Function getFunction() { return function; } diff --git a/DMXSoftware/src/main/java/SnowballThrower/dmxsoftware/Database/Device.java b/DMXSoftware/src/main/java/SnowballThrower/dmxsoftware/Database/Device.java index a4ebccf..9e4e893 100644 --- a/DMXSoftware/src/main/java/SnowballThrower/dmxsoftware/Database/Device.java +++ b/DMXSoftware/src/main/java/SnowballThrower/dmxsoftware/Database/Device.java @@ -23,11 +23,11 @@ int getValue(int channel) { return values[channel]; } - String getMeaning(int channel) { + public String getMeaning(int channel) { return type.getMeaning(channel, values); } - String getChannelName(int channel) { + public String getChannelName(int channel) { return type.channels[channel].name; } @@ -54,4 +54,8 @@ public String getImagePath() { public int getStartCh() { return this.startChannel; } + + public String getAdditon() { + return this.addition; + } } diff --git a/DMXSoftware/src/main/java/SnowballThrower/dmxsoftware/Processing/Manage.java b/DMXSoftware/src/main/java/SnowballThrower/dmxsoftware/Processing/Manage.java index 3b71b4f..0652023 100644 --- a/DMXSoftware/src/main/java/SnowballThrower/dmxsoftware/Processing/Manage.java +++ b/DMXSoftware/src/main/java/SnowballThrower/dmxsoftware/Processing/Manage.java @@ -24,7 +24,7 @@ public Manage() { } public void send(int channel, int value) { - if (channel < 16 * 12 && channel > 0 && value > 0 && value < 256) { + if (channel < 16 * 12 && channel >= 0 && value >= 0 && value < 256) { mc.change(channel, value); } } @@ -33,12 +33,11 @@ public void handle(String id, int value) { try { int ch = Integer.parseInt(id); if (ch < 1000) { - System.out.println("Change: " + id + " ," + value); + //System.out.println("Change: " + id + " ," + value); send(ch - 1, value); - return; } } catch (Exception ex) { - + System.out.println("no id: " + id); } } diff --git a/DMXSoftware/src/main/java/SnowballThrower/dmxsoftware/Processing/ValueConverter.java b/DMXSoftware/src/main/java/SnowballThrower/dmxsoftware/Processing/ValueConverter.java index 0f59593..6b06b26 100644 --- a/DMXSoftware/src/main/java/SnowballThrower/dmxsoftware/Processing/ValueConverter.java +++ b/DMXSoftware/src/main/java/SnowballThrower/dmxsoftware/Processing/ValueConverter.java @@ -7,6 +7,7 @@ import SnowballThrower.dmxsoftware.Database.Function; import java.awt.Color; +import javafx.scene.paint.Paint; /** * @@ -35,4 +36,10 @@ int getColorFor(int hue, int sat, int vol, Function func) { return -1; } } + + public Color stringToColor(String string){ + string = string.toUpperCase(); + Color color = Color.getColor(string, Color.LIGHT_GRAY); + return color; + } } diff --git a/DMXSoftware/src/main/java/SnowballThrower/dmxsoftware/Surface/ControlSurface.java b/DMXSoftware/src/main/java/SnowballThrower/dmxsoftware/Surface/ControlSurface.java index 2e3fb1a..71e70f2 100644 --- a/DMXSoftware/src/main/java/SnowballThrower/dmxsoftware/Surface/ControlSurface.java +++ b/DMXSoftware/src/main/java/SnowballThrower/dmxsoftware/Surface/ControlSurface.java @@ -10,15 +10,22 @@ import SnowballThrower.dmxsoftware.Processing.Manage; import java.util.List; import javafx.application.Application; +import javafx.event.ActionEvent; +import javafx.event.EventHandler; import javafx.scene.Group; +import javafx.scene.Node; import javafx.scene.Scene; +import javafx.scene.control.Button; import javafx.scene.control.ScrollPane; import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javafx.scene.input.InputEvent; +import javafx.scene.layout.GridPane; import javafx.scene.layout.StackPane; import javafx.scene.paint.Color; import javafx.scene.shape.Rectangle; +import javafx.scene.text.Font; +import javafx.scene.text.Text; import javafx.stage.Stage; /** @@ -27,14 +34,15 @@ */ public class ControlSurface extends Application { - Scene bars; + ScrollPane bars; Scene faders; Scene pultRouting; Scene groups; - Scene presets; - Scene deviceScene; + Node presets; + ScrollPane deviceScene; Scene device; Stage stage; + StackPane stack; List devices; double windowHeight; double windowWidth; @@ -43,69 +51,75 @@ public class ControlSurface extends Application { public ControlSurface(Manage mng, List devices) { manager = mng; this.devices = devices; + stack = new StackPane(); stage = new Stage(); - ScrollPane pane = allDevs(); - pane.setLayoutY(50); - Group buttons = new Group(); - StackPane devSceneGroup = new StackPane(pane, buttons); - faders = new Scene(devSceneGroup, 1000, 800); + deviceScene = allDevs(); + bars = bars(); + Button btn1 = new Button("Geräte"); + Button btn2 = new Button("Bars"); + Button btn3 = new Button("Szenen"); + Button btn4 = new Button("kompakt"); + GridPane buttons = new GridPane(); + buttons.add(btn1, 0, 0); + buttons.add(btn2, 1, 0); + buttons.add(btn3, 2, 0); + buttons.add(btn4, 3, 0); + GridPane scenePane = new GridPane(); + scenePane.add(buttons, 0, 0); + scenePane.add(stack, 0, 1); + + btn1.setOnAction(new EventHandler() { + + @Override + public void handle(ActionEvent event) { + stack.getChildren().clear(); + stack.getChildren().add(deviceScene); + } + }); + btn2.setOnAction(new EventHandler() { + + @Override + public void handle(ActionEvent event) { + stack.getChildren().clear(); + stack.getChildren().add(bars); + } + }); + + faders = new Scene(scenePane, 1000, 800); stage.setScene(faders); + stage.setTitle("Control Surface"); //pane.setMaxHeight(stage.getHeight()); stage.show(); } - ScrollPane allDevs(){ - + + ScrollPane allDevs() { + int dev = 0; double sizeX = 70; double sizeY = 200; - double distY = 20; + double distY = 50; ScrollPane pane = new ScrollPane(); pane.setVbarPolicy(ScrollPane.ScrollBarPolicy.ALWAYS); - pane.addEventFilter(InputEvent.ANY, (event) -> { - if (event.getEventType().toString().contains("SCROLL")) { - //System.out.println(event.getEventType()); - event.consume(); - } - }); - FaderListener fl = new FaderListener(manager); - Group faderGroup = new Group(); + + Group deviceGroup = new Group(); for (Device device : devices) { - Group picture; - System.out.println(device.getImagePath()); - try { - Image image = new Image(device.getImagePath()); - ImageView imV = new ImageView(image); - imV.setFitHeight(2 * sizeX); - imV.setFitWidth(2 * sizeX); - imV.setLayoutY(dev * (sizeY + distY)); - picture = new Group(imV); - } catch (Exception ex) { - System.out.println(ex); - Rectangle rect = new Rectangle(0, dev * (sizeY + distY), sizeX * 2, sizeX * 2); - rect.setFill(Color.WHITE); - picture = new Group(rect); - } - faderGroup.getChildren().add(picture); - int ch = 2; - System.out.println(device.getName()); - for (Channel channel : device.getType().getChannels()) { - if (channel != null) { - Fader fader = new Fader("" + (device.getStartCh() + ch - 2), - ch * sizeX, dev * (sizeY + distY), sizeX, sizeY, channel); - fl.addFader(fader); - faderGroup.getChildren().add(fader.getFader()); - } - ch++; - } + Group fG = faderGroup(sizeX, sizeY, device); + fG.setLayoutY(0.5 * distY + dev * (sizeY + distY)); + dev++; + deviceGroup.getChildren().add(fG); } - Group group = new Group(faderGroup); + /*deviceGroup.getChildren().add(new Line( + 0, dev * (sizeY + distY), + 2000, dev * (sizeY + distY))); + deviceGroup.getChildren().add(new Line( + 0, 0, + 2000, 0)); */ + Group group = new Group(deviceGroup); pane.setContent(group); - group.setOnMouseClicked(fl); - group.setOnMousePressed(fl); - group.setOnMouseDragged(fl); return pane; } + @Override public void start(Stage primaryStage) throws Exception { System.out.println("Start"); @@ -118,4 +132,70 @@ public void setManager(Manage mng) { public void send(int channel, int value) { } + + Group deviceImage(Device device, double sizeX, double sizeY) { + Group picture; + System.out.println(device.getImagePath()); + Rectangle rect = new Rectangle(0, 0, sizeX * 2, sizeY); + rect.setFill(Color.WHITE); + picture = new Group(rect); + try { + Image image = new Image(device.getImagePath()); + ImageView imV = new ImageView(image); + imV.setPreserveRatio(true); + imV.setFitHeight(2 * sizeX); + + picture.getChildren().add(imV); + } catch (Exception ex) { + System.out.println(ex); + } + Font font = new Font(sizeY/12); + Text type = new Text(device.getType().getName()); + type.setLayoutY(sizeY / 8 * 6); + type.setFont(font); + Text name = new Text(device.getName()); + name.setLayoutY(sizeY / 8 * 7); + name.setFont(font); + Text place = new Text(device.getAdditon()); + place.setLayoutY(sizeY); + place.setFont(font); + Group texts = new Group(picture, name, place, type); + return new Group(picture, texts); + } + + ScrollPane bars() { + ScrollPane pane = new ScrollPane(); + pane.setContent(new Rectangle(100, 100)); + return pane; + } + + Group faderGroup(double sizeX, double sizeY, Device device) { + + FaderListener fl = new FaderListener(manager); + Group faderGroup = new Group(); + faderGroup.getChildren().add(deviceImage(device, sizeX, sizeY)); + int ch = 2; + System.out.println(device.getName()); + for (Channel channel : device.getType().getChannels()) { + if (channel != null) { + Fader fader = new Fader("" + (device.getStartCh() + ch - 2), + ch * sizeX, 0, sizeX, sizeY, channel); + fl.addFader(fader); + Group fade = fader.getFader(); + fade.addEventFilter(InputEvent.ANY, (event) -> { + if (event.getEventType().toString().contains("SCROLL")) { + //System.out.println(event.getEventType()); + + event.consume(); + } + }); + faderGroup.getChildren().add(fade); + } + ch++; + } + faderGroup.setOnMouseClicked(fl); + faderGroup.setOnMousePressed(fl); + faderGroup.setOnMouseDragged(fl); + return faderGroup; + } } diff --git a/DMXSoftware/src/main/java/SnowballThrower/dmxsoftware/Surface/Fader.java b/DMXSoftware/src/main/java/SnowballThrower/dmxsoftware/Surface/Fader.java index a010ee4..bab5a8d 100644 --- a/DMXSoftware/src/main/java/SnowballThrower/dmxsoftware/Surface/Fader.java +++ b/DMXSoftware/src/main/java/SnowballThrower/dmxsoftware/Surface/Fader.java @@ -9,6 +9,10 @@ import SnowballThrower.dmxsoftware.Database.Function; import javafx.scene.Group; import javafx.scene.paint.Color; +import javafx.scene.paint.CycleMethod; +import javafx.scene.paint.LinearGradient; +import javafx.scene.paint.Paint; +import javafx.scene.paint.Stop; import javafx.scene.shape.Line; import javafx.scene.shape.Rectangle; @@ -29,6 +33,7 @@ public class Fader { Group background; Group head; Group fader; + Channel channel; int max = 255; private String Id; @@ -38,7 +43,8 @@ public Fader(String id, double posX, double posY, double width, double height, C this.height = height; this.posX = posX; this.posY = posY; - frameY = height / 20; + this.channel = channel; + frameY = height / 10; frameX = width / 10; background = getBackGround(); head = getHead(); @@ -51,7 +57,7 @@ public Fader(String id, double posX, double posY, double width, double height, C public void setValue(int value) { this.value = value; head.setTranslateY(-((height - 2 * frameY) / max) * value); - System.out.println(value); + //System.out.println(value); } double getFrameX() { @@ -83,38 +89,76 @@ void setStyle(int style) { } private Group getHead() { - double vert = height * 0.05; + double vert = height * 0.1; Rectangle rect = new Rectangle(frameX, height - frameY - 0.5 * vert, width - 2 * frameX, vert); rect.setFill(Color.GREY); return new Group(rect); } private Group getBackGround() { + Group backGround = new Group(); Rectangle rect = new Rectangle(0, 0, width, height); rect.setFill(Color.LIGHTGRAY); rect.setStroke(Color.BLACK); + backGround.getChildren().add(rect); + + Stop[] stops = new Stop[]{new Stop(0, Color.LIGHTGREY), new Stop(1, Color.LIGHTGREY)}; + boolean gradient = true; switch (function) { case Red: - rect.setFill(Color.RED); + stops = new Stop[]{new Stop(0, Color.WHITE), new Stop(1, Color.RED)}; break; case Green: - rect.setFill(Color.LIMEGREEN); + stops = new Stop[]{new Stop(0, Color.WHITE), new Stop(1, Color.LIMEGREEN)}; break; case Blue: - rect.setFill(Color.BLUE); + stops = new Stop[]{new Stop(0, Color.WHITE), new Stop(1, Color.BLUE)}; break; case White: - rect.setFill(Color.WHITESMOKE); + stops = new Stop[]{new Stop(0, Color.WHITE), new Stop(1, Color.WHITESMOKE)}; break; case Amber: - rect.setFill(Color.GOLD); + stops = new Stop[]{new Stop(0, Color.WHITE), new Stop(1, Color.GOLD)}; break; case UV: - rect.setFill(Color.BLUEVIOLET); + stops = new Stop[]{new Stop(0, Color.WHITE), new Stop(1, Color.BLUEVIOLET)}; + break; + case Dimmer: + stops = new Stop[]{new Stop(0, Color.BLACK), new Stop(1, Color.WHITE)}; break; + default: + gradient = false; } + if (gradient) { + LinearGradient lg1 = new LinearGradient(0, 1, 0, 0, true, CycleMethod.NO_CYCLE, stops); + rect.setFill(lg1); + } + switch (function) { + case Macro: + for (int i = 0; i < max; i++) { + Rectangle mac = new Rectangle( + 0, height - frameY - ((height - 2 * frameY) / max) * i, + width, (height - 2 * frameY) / max + 1); + + String string = channel.getStandardMeaning(i); + System.out.println(string); + try { + string = string.toUpperCase(); + mac.setFill(Paint.valueOf(string)); + } catch (Exception ex) { + mac.setFill(Color.LIGHTGRAY); + } + backGround.getChildren().add(mac); + } + Rectangle bg = new Rectangle(0, 0, width, height); + bg.setFill(null); + bg.setStroke(Color.BLACK); + backGround.getChildren().add(bg); + break; + } + Line line = new Line(width * 0.5, frameY, width * 0.5, height - frameY); - return new Group(rect, line); + return new Group(backGround, line); } double getWidth() { diff --git a/DMXSoftware/src/main/java/SnowballThrower/dmxsoftware/Surface/FaderListener.java b/DMXSoftware/src/main/java/SnowballThrower/dmxsoftware/Surface/FaderListener.java index 40e86d2..467dd28 100644 --- a/DMXSoftware/src/main/java/SnowballThrower/dmxsoftware/Surface/FaderListener.java +++ b/DMXSoftware/src/main/java/SnowballThrower/dmxsoftware/Surface/FaderListener.java @@ -45,10 +45,11 @@ public void mouseClicked(MouseEvent e) { && e.getX() <= fader.getPosX() + fader.getWidth() - fader.getFrameX() && e.getY() >= fader.getPosY() && e.getY() <= fader.getPosY() + fader.getHeight()) { - fader.setValue(constrain((int) ((fader.getHeight() - fader.getFrameY() + int value = constrain((int) ((fader.getHeight() - fader.getFrameY() - e.getY() + fader.getPosY()) - * 255 / (fader.getHeight() - 2 * fader.getFrameY())))); - manager.handle(fader.getID(), fader.getValue()); + * 255 / (fader.getHeight() - 2 * fader.getFrameY()))); + manager.handle(fader.getID(), value); + fader.setValue(value); } } }