diff --git a/healthdisplay/.idea/uiDesigner.xml b/healthdisplay/.idea/uiDesigner.xml index 709fd23..aff8117 100644 --- a/healthdisplay/.idea/uiDesigner.xml +++ b/healthdisplay/.idea/uiDesigner.xml @@ -131,6 +131,9 @@ + + + \ No newline at end of file diff --git a/healthdisplay/README b/healthdisplay/README index 4a3b245..f965e40 100644 --- a/healthdisplay/README +++ b/healthdisplay/README @@ -1,5 +1,10 @@ +you need jdk 1.7 or newer and maven2 installed compile with mvn clean compile ideauidesigner:javac2 assembly:single + +run with + +java -jar psychose-X.X-jar-with-dependencies.jar diff --git a/healthdisplay/src/main/java/de/psychose/ActorData.java b/healthdisplay/src/main/java/de/psychose/ActorData.java index db0374b..3f921cd 100644 --- a/healthdisplay/src/main/java/de/psychose/ActorData.java +++ b/healthdisplay/src/main/java/de/psychose/ActorData.java @@ -6,34 +6,63 @@ package de.psychose; */ public class ActorData { + private String actor = ""; + private String caption = ""; private PulseData pulseData = new PulseData(); private int airflow; private int ekg; private int emg; - private float temperature; + private double temperature; + private double temperatureOffset; private boolean tommyHeartbeat; private long timestampPulse = 0; - private long timestampTommyPulse = 0; + private long timestampHeartbeat = 0; + private long timestampOxygen = 0; + private long timestampTommyHeartbeat = 0; private long timestampEkg = 0; private long timestampEmg = 0; private long timestampTemperature = 0; private long timestampBreath = 0; - // TODO: hier die timestamps setzen wann letztes mal geändert, - // dann kann ich in ActorDisplay im Timer einfach prüfen ob differenz > timeout, dann rot setzen - - - public void setTimestampPulse() { - this.timestampPulse = System.currentTimeMillis(); - } - public PulseData getPulseData() { - return pulseData; + public ActorData(String actor, String caption) { + this.actor = actor; + this.caption = caption; } - public void setPulseData(PulseData pulseData) { - this.pulseData = pulseData; - this.timestampPulse = System.currentTimeMillis(); + public String getActor() { + return actor; + } + + public String getCaption() { + return caption; + } + + public int getOxygen() { + return pulseData.getOxygen(); + } + + public void setOxygen(int oxygen) { + timestampOxygen = System.currentTimeMillis(); + pulseData.setOxygen(oxygen); + } + + public boolean getHeartbeat() { + return pulseData.getHeartbeat(); + } + + public void setHeartbeat(boolean heartbeat) { + timestampHeartbeat = System.currentTimeMillis(); + pulseData.setHeartbeat(heartbeat); + } + + public int getPulse() { + return pulseData.getPulse(); + } + + public void setPulse(int pulse) { + timestampPulse = System.currentTimeMillis(); + pulseData.setPulse(pulse); } public int getAirflow() { @@ -63,11 +92,11 @@ public class ActorData { this.timestampEmg = System.currentTimeMillis(); } - public float getTemperature() { + public double getTemperature() { return temperature; } - public void setTemperature(float temperature) { + public void setTemperature(double temperature) { this.temperature = temperature; this.timestampTemperature = System.currentTimeMillis(); } @@ -78,7 +107,15 @@ public class ActorData { public void setTommyHeartbeat(boolean tommyHeartbeat) { this.tommyHeartbeat = tommyHeartbeat; - this.timestampTommyPulse = System.currentTimeMillis(); + this.timestampTommyHeartbeat = System.currentTimeMillis(); + } + + public double getTemperatureOffset() { + return temperatureOffset; + } + + public void setTemperatureOffset(double temperatureOffset) { + this.temperatureOffset = temperatureOffset; } public long getTimestampPulse() { @@ -100,4 +137,26 @@ public class ActorData { public long getTimestampBreath() { return timestampBreath; } + + @Override + public String toString() { + return "ActorData{" + + "actor='" + actor + '\'' + + ", caption='" + caption + '\'' + + ", airflow=" + airflow + + ", ekg=" + ekg + + ", emg=" + emg + + ", temperature=" + temperature + + ", temperatureOffset=" + temperatureOffset + + ", tommyHeartbeat=" + tommyHeartbeat + + ", timestampPulse=" + timestampPulse + + ", timestampHeartbeat=" + timestampHeartbeat + + ", timestampOxygen=" + timestampOxygen + + ", timestampTommyHeartbeat=" + timestampTommyHeartbeat + + ", timestampEkg=" + timestampEkg + + ", timestampEmg=" + timestampEmg + + ", timestampTemperature=" + timestampTemperature + + ", timestampBreath=" + timestampBreath + + '}'; + } } diff --git a/healthdisplay/src/main/java/de/psychose/ActorDisplay.form b/healthdisplay/src/main/java/de/psychose/ActorDisplay.form index d72dc0a..3bb806e 100644 --- a/healthdisplay/src/main/java/de/psychose/ActorDisplay.form +++ b/healthdisplay/src/main/java/de/psychose/ActorDisplay.form @@ -1,6 +1,6 @@
- + diff --git a/healthdisplay/src/main/java/de/psychose/ActorDisplay.java b/healthdisplay/src/main/java/de/psychose/ActorDisplay.java index a6c9313..d6383cf 100644 --- a/healthdisplay/src/main/java/de/psychose/ActorDisplay.java +++ b/healthdisplay/src/main/java/de/psychose/ActorDisplay.java @@ -2,7 +2,6 @@ package de.psychose; import javax.swing.*; import java.awt.*; -import java.awt.event.ActionEvent; import java.text.DecimalFormat; /** @@ -10,11 +9,7 @@ import java.text.DecimalFormat; * @date: 14.04.14 21:44 */ public class ActorDisplay { - private final Timer timer; - private final static Color onColor = Color.WHITE; - private final static Color offColor = Color.RED; - private final static String offText = "no data"; - + private static final long TIMEOUT_MILLISECONDS = 2000; private JLabel lblCaption; private JLabel lblHeartbeat; private JLabel lblPulse; @@ -23,98 +18,49 @@ public class ActorDisplay { private JLabel lblEmg; private JLabel lblTemperature; private JLabel lblBreath; - private JPanel actorPanel; + private JPanel mainPanel; private ActorData actorData; private boolean showErrors = false; private DecimalFormat df = new DecimalFormat("#.0"); - //TODO: die einzelnen Setter wegmachen, dafür eine setData() bauen die die daten en bloc nimmt - // die darin enthaltenen timestamps dann für rotfärbung nehmen - - public void setActorData(ActorData actorData) { - this.actorData = actorData; - } - - public void setCaption(String caption) { - lblCaption.setText(caption); - } - public void update() { + if (actorData == null) { + return; + } + lblBreath.setText(String.valueOf(actorData.getAirflow())); - - lblTemperature.setText(df.format(actorData.getTemperature())); + lblTemperature.setText(df.format(actorData.getTemperature() + actorData.getTemperatureOffset())); lblEkg.setText(String.valueOf(actorData.getEkg())); - lblPulse.setText(actorData.getPulseData().getHeartbeat() == 0 ? "systole" : "diastole"); + lblPulse.setText(actorData.getHeartbeat() ? "systole" : "diastole"); lblEmg.setText(String.valueOf(actorData.getEmg())); - lblOxy.setText(String.valueOf(actorData.getPulseData().getOxygen())); - lblHeartbeat.setText(String.valueOf(actorData.getPulseData().getPulse())); + lblOxy.setText(String.valueOf(actorData.getOxygen())); + lblHeartbeat.setText(String.valueOf(actorData.getPulse())); + if (showErrors) { + checkTimeout(lblTemperature, actorData.getTimestampTemperature()); + checkTimeout(lblPulse, actorData.getTimestampPulse()); + checkTimeout(lblOxy, actorData.getTimestampPulse()); + checkTimeout(lblHeartbeat, actorData.getTimestampPulse()); + checkTimeout(lblEkg, actorData.getTimestampEkg()); + checkTimeout(lblEmg, actorData.getTimestampEmg()); + checkTimeout(lblBreath, actorData.getTimestampBreath()); + } } - public ActorDisplay() { - this.timer = new Timer(100, new AbstractAction() { - @Override - public void actionPerformed(ActionEvent e) { - - if (actorData == null) - return; - - update(); - - if (showErrors) { - - long timeout = System.currentTimeMillis() - 1000; - - if (actorData.getTimestampTemperature() < timeout) { - lblTemperature.setForeground(offColor); - lblTemperature.setText(offText); - } else { - lblTemperature.setForeground(onColor); - } - - if (actorData.getTimestampPulse() < timeout) { - lblPulse.setForeground(offColor); - lblPulse.setText(offText); - lblOxy.setForeground(offColor); - lblOxy.setText(offText); - lblHeartbeat.setForeground(offColor); - lblHeartbeat.setText(offText); - } else { - lblPulse.setForeground(onColor); - lblOxy.setForeground(onColor); - lblHeartbeat.setForeground(onColor); - } - - if (actorData.getTimestampEkg() < timeout) { - lblEkg.setForeground(offColor); - lblEkg.setText(offText); - } else { - lblEkg.setForeground(onColor); - } - - if (actorData.getTimestampEmg() < timeout) { - lblEmg.setForeground(offColor); - lblEmg.setText(offText); - } else { - lblEmg.setForeground(onColor); - } - - if (actorData.getTimestampBreath() < timeout) { - lblBreath.setForeground(offColor); - lblBreath.setText(offText); - } else { - lblBreath.setForeground(onColor); - } - } - } - }); - - timer.setRepeats(true); - timer.start(); - } - - public void setShowErrors(boolean showErrors) { + public void init(ActorData actorData, final boolean showErrors) { + this.actorData = actorData; + lblCaption.setText(actorData.getCaption()); this.showErrors = showErrors; } + + private void checkTimeout(final JLabel label, final long time) { + if (time < System.currentTimeMillis() - TIMEOUT_MILLISECONDS) { + label.setText("no data"); + label.setForeground(Color.red); + } else { + label.setForeground(Color.white); + } + } + } diff --git a/healthdisplay/src/main/java/de/psychose/ActorHeart.form b/healthdisplay/src/main/java/de/psychose/ActorHeart.form index 86b3aa2..ef11e05 100644 --- a/healthdisplay/src/main/java/de/psychose/ActorHeart.form +++ b/healthdisplay/src/main/java/de/psychose/ActorHeart.form @@ -1,6 +1,6 @@ - + diff --git a/healthdisplay/src/main/java/de/psychose/ActorHeart.java b/healthdisplay/src/main/java/de/psychose/ActorHeart.java index 2dfeef4..f1ece30 100644 --- a/healthdisplay/src/main/java/de/psychose/ActorHeart.java +++ b/healthdisplay/src/main/java/de/psychose/ActorHeart.java @@ -3,7 +3,6 @@ package de.psychose; import javax.imageio.ImageIO; import javax.swing.*; import java.awt.*; -import java.awt.event.ActionEvent; import java.awt.image.BufferedImage; import java.io.IOException; @@ -12,33 +11,21 @@ import java.io.IOException; * @date: 15.11.14 21:36 */ public class ActorHeart { - private JPanel heartPanel; - private ActorData actorData1; - private ActorData actorData2; - private ActorData actorData3; + private JPanel mainPanel; + private ActorData[] actorDatas; private ImagePanel imagePanel; - private Timer timer; public ActorHeart() { imagePanel = new ImagePanel("/de/psychose/heart1_klein_inv.jpg", "/de/psychose/heart2_klein_inv.jpg"); - heartPanel.add(imagePanel); - - timer = new Timer(100, new AbstractAction() { - @Override - public void actionPerformed(ActionEvent e) { - if(actorData1 != null && actorData2 != null && actorData3 != null) { - imagePanel.repaint(); - } - } - }); - timer.setRepeats(true); - timer.start(); + mainPanel.add(imagePanel); } - public void setActorData(final ActorData actorData1, final ActorData actorData2, final ActorData actorData3) { - this.actorData1 = actorData1; - this.actorData2 = actorData2; - this.actorData3 = actorData3; + public void update() { + imagePanel.repaint(); + } + + public void setActorDatas(final ActorData[] actorDatas) { + this.actorDatas = actorDatas; } private class ImagePanel extends JPanel { @@ -57,10 +44,13 @@ public class ActorHeart { @Override protected void paintComponent(Graphics g) { super.paintComponent(g); - if(actorData1 != null && actorData2 != null && actorData3 != null) { - g.drawImage(ActorHeart.this.actorData1.getTommyHeartbeat() ? image1 : image2, 0, 0, null, null); - g.drawImage(ActorHeart.this.actorData2.getTommyHeartbeat() ? image1 : image2, 263, 0, null, null); - g.drawImage(ActorHeart.this.actorData3.getTommyHeartbeat() ? image1 : image2, 526, 0, null, null); + + if (actorDatas != null) { + for (int i = 0; i < actorDatas.length; i++) { + if (actorDatas[i] != null) { + g.drawImage(actorDatas[i].getTommyHeartbeat() ? image1 : image2, 263 * i, 0, null, null); + } + } } } } diff --git a/healthdisplay/src/main/java/de/psychose/ChaOSCclient.java b/healthdisplay/src/main/java/de/psychose/ChaOSCclient.java index a795850..9670aac 100644 --- a/healthdisplay/src/main/java/de/psychose/ChaOSCclient.java +++ b/healthdisplay/src/main/java/de/psychose/ChaOSCclient.java @@ -45,21 +45,21 @@ public class ChaOSCclient { return changeChaoscSubscription(true); } - public void sendPulse(String actor, int heartbeat, int pulse, int oxygen) { - + public void sendMessage(final String address, Object... args) { try { - OSCMessage subscribeMessage = new OSCMessage("/" + actor + "/heartbeat"); - subscribeMessage.addArgument(heartbeat); - subscribeMessage.addArgument(pulse); - subscribeMessage.addArgument(oxygen); + OSCMessage subscribeMessage = new OSCMessage(address); + + for(Object param: args) { + subscribeMessage.addArgument(param); + } portOut.send(subscribeMessage); } catch (IOException e) { System.out.println("could not send pulse OSC Message"); e.printStackTrace(); } - } + } private boolean changeChaoscSubscription(boolean subscribe) { try { diff --git a/healthdisplay/src/main/java/de/psychose/ControlForm.form b/healthdisplay/src/main/java/de/psychose/ControlForm.form index 1a0130d..865d822 100644 --- a/healthdisplay/src/main/java/de/psychose/ControlForm.form +++ b/healthdisplay/src/main/java/de/psychose/ControlForm.form @@ -1,6 +1,6 @@ - + @@ -25,15 +25,30 @@ - + - + + + + + + + + + + + + + + + + diff --git a/healthdisplay/src/main/java/de/psychose/ControlForm.java b/healthdisplay/src/main/java/de/psychose/ControlForm.java index 4bec000..537a458 100644 --- a/healthdisplay/src/main/java/de/psychose/ControlForm.java +++ b/healthdisplay/src/main/java/de/psychose/ControlForm.java @@ -8,47 +8,61 @@ import java.util.Observer; * @author: lucas * @date: 15.11.14 22:23 */ -public class ControlForm { +public class ControlForm extends JFrame { private PulseControl pulse1; private PulseControl pulse2; private PulseControl pulse3; - private JPanel mainPanel; + private JPanel rootPanel; private ActorDisplay actor1; private ActorDisplay actor2; private ActorDisplay actor3; + private TemperatureControl temp1; + private TemperatureControl temp2; + private TemperatureControl temp3; private final ChaOSCclient osCclient; - public JPanel getMainPanel() { - return mainPanel; - } - - - public ControlForm(ChaOSCclient chaOSCclient, final ActorData actorData1, final ActorData actorData2, final ActorData actorData3) { + public ControlForm(ChaOSCclient chaOSCclient, final ActorData[] actorData) { + super("HD Control"); this.osCclient = chaOSCclient; - addActor("merle", pulse1, actor1, actorData1); - addActor("uwe", pulse2, actor2, actorData2); - addActor("bjoern", pulse3, actor3, actorData3); + setContentPane(rootPanel); + setResizable(false); + setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); - actor1.setShowErrors(true); - actor2.setShowErrors(true); - actor3.setShowErrors(true); + addActor(pulse1, actor1, temp1, actorData[0]); + addActor(pulse2, actor2, temp2, actorData[1]); + addActor(pulse3, actor3, temp3, actorData[2]); + pack(); + setVisible(true); } - private void addActor(final String actor, PulseControl pulse, ActorDisplay display, ActorData actorData) { + private void addActor(final PulseControl pulse, final ActorDisplay display, final TemperatureControl temp, final ActorData actorData) { pulse.addObserver(new Observer() { @Override public void update(Observable o, Object arg) { - if(arg instanceof PulseData) { - final PulseData data = (PulseData)arg; - osCclient.sendPulse(actor, data.getHeartbeat(), data.getPulse(), data.getOxygen()); + if (arg instanceof PulseData) { + final PulseData data = (PulseData) arg; + osCclient.sendMessage("/" + actorData.getActor().toLowerCase() + "/heartbeat", data.getHeartbeat(), + data.getPulse(), data.getOxygen()); + + // TODO: delete this line, bc tommy will send the real events + osCclient.sendMessage("/" + actorData.getActor().toLowerCase() + "/tommyheartbeat"); } } }); - display.setCaption(actor); - display.setActorData(actorData); + + temp.addObserver(new Observer() { + @Override + public void update(Observable o, Object arg) { + if (arg instanceof Double) { + actorData.setTemperatureOffset((double)arg); + } + } + }); + + display.init(actorData, true); } } diff --git a/healthdisplay/src/main/java/de/psychose/Main.java b/healthdisplay/src/main/java/de/psychose/Main.java index aad4233..b993c40 100644 --- a/healthdisplay/src/main/java/de/psychose/Main.java +++ b/healthdisplay/src/main/java/de/psychose/Main.java @@ -4,8 +4,6 @@ import com.illposed.osc.OSCListener; import com.illposed.osc.OSCMessage; import javax.swing.*; -import java.awt.event.WindowAdapter; -import java.awt.event.WindowEvent; import java.net.SocketException; import java.net.UnknownHostException; import java.util.Date; @@ -15,26 +13,17 @@ import java.util.Date; * @date: 25.04.14 00:23 */ public class Main { - private ChaOSCclient chaOSCclient; - private ControlForm controlForm; - private MainForm mainForm; - - private int totalMessageCount = 0; - private int messagesTempCounter = 0; - - private long totalTraffic = 0; - private long lastTraffic = 0; - - private final ActorData actorData1 = new ActorData(); - private final ActorData actorData2 = new ActorData(); - private final ActorData actorData3 = new ActorData(); - public static void main(String[] args) { new Main(); } public Main() { + final ActorData[] actorDatas = new ActorData[3]; + actorDatas[0] = new ActorData("merle", "Körper 1"); + actorDatas[1] = new ActorData("uwe", "Körper 2"); + actorDatas[2] = new ActorData("bjoern", "Körper 3"); + try { UIManager.setLookAndFeel("com.sun.java.swing.plaf.gtk.GTKLookAndFeel"); } catch (Exception e) { @@ -42,151 +31,99 @@ public class Main { } try { - this.chaOSCclient = new ChaOSCclient("chaosc", 7110); - this.controlForm = new ControlForm(chaOSCclient, actorData1, actorData2, actorData3); + final ChaOSCclient chaOSCclient = new ChaOSCclient("chaosc", 7110); - final JFrame cframe = new JFrame("HD Control"); - cframe.setContentPane(controlForm.getMainPanel()); - cframe.setResizable(false); - cframe.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); - cframe.pack(); - - - this.mainForm = new MainForm(actorData1, actorData2, actorData3); - final JFrame frame = new JFrame("HD Main"); - frame.setContentPane(mainForm.getMainPanel()); - frame.setResizable(false); - frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); -// frame.setExtendedState(JFrame.MAXIMIZED_BOTH); - frame.setUndecorated(true); - frame.pack(); - - frame.addWindowListener(new WindowAdapter() { - @Override - public void windowClosing(WindowEvent e) { - chaOSCclient.stopReceiver(); -// snmp.stopRunning(); - super.windowClosing(e); - } - }); - - - addActor("merle", actorData1); - addActor("uwe", actorData2); - addActor("bjoern", actorData3); - - cframe.setVisible(true); - frame.setVisible(true); + for(int i = 0; i < actorDatas.length; i++) { + addActorOSCListeners(chaOSCclient, actorDatas[i]); + } chaOSCclient.startReceiver(); + new ControlForm(chaOSCclient, actorDatas); + new MainForm(actorDatas); + + Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { + @Override + public void run() { + chaOSCclient.stopReceiver(); + } + })); + } catch (UnknownHostException | SocketException e) { e.printStackTrace(); } - } - private void addActor(final String actor, final ActorData actorData) { + private static void addActorOSCListeners(final ChaOSCclient chaOSCclient, final ActorData actorData) { - chaOSCclient.addListener("/" + actor.toLowerCase() + "/heartbeat", new OSCListener() { + chaOSCclient.addListener("/" + actorData.getActor().toLowerCase() + "/heartbeat", new OSCListener() { @Override public void acceptMessage(Date time, OSCMessage message) { if (message.getArguments().length == 3) { - totalMessageCount++; + // set the beat ( 0 or 1 ) + if (message.getArguments()[0] instanceof Integer) { + actorData.setHeartbeat( (int)(message.getArguments()[0]) == 1); + } + + // set the heartrate if (message.getArguments()[1] instanceof Integer) { - int pulse = (int) (message.getArguments()[1]); - - if (pulse > 60) { // try to skip the invalid pulserate from device - - // set the heartrate - actorData.getPulseData().setPulse((int) (message.getArguments()[1])); - - // set the beat ( 0 or 1 ) - if (message.getArguments()[0] instanceof Integer) { - actorData.getPulseData().setHeartbeat((int) (message.getArguments()[0])); - } - - //TODO: remove this, its for testing without tommy only - actorData.setTommyHeartbeat(((int) message.getArguments()[0]) == 1); - - // set the oxy level - if (message.getArguments()[2] instanceof Integer) { - actorData.getPulseData().setOxygen((int) (message.getArguments()[2])); - } - - actorData.setTimestampPulse(); + final int pulse = (int) (message.getArguments()[1]); + if (pulse > 60) { // try to skip the invalid pulse rate from device + actorData.setPulse(pulse); } } - } - } - }); - chaOSCclient.addListener("/" + actor.toLowerCase() + "/ekg", new OSCListener() { - @Override - public void acceptMessage(Date time, OSCMessage message) { - if (message.getArguments().length == 1) { - totalMessageCount++; - - if (message.getArguments()[0] instanceof Integer) { - actorData.setEkg((int) (message.getArguments()[0])); + // set the oxy level + if (message.getArguments()[2] instanceof Integer) { + actorData.setOxygen((int) (message.getArguments()[2])); } } } }); - chaOSCclient.addListener("/" + actor.toLowerCase() + "/emg", new OSCListener() { + chaOSCclient.addListener("/" + actorData.getActor().toLowerCase() + "/ekg", new OSCListener() { @Override public void acceptMessage(Date time, OSCMessage message) { - if (message.getArguments().length == 1) { - totalMessageCount++; - - if (message.getArguments()[0] instanceof Integer) { - actorData.setEmg((int) (message.getArguments()[0])); - } + if (message.getArguments().length == 1 && message.getArguments()[0] instanceof Integer) { + actorData.setEkg((int) (message.getArguments()[0])); } } }); - chaOSCclient.addListener("/" + actor.toLowerCase() + "/temperature", new OSCListener() { + chaOSCclient.addListener("/" + actorData.getActor().toLowerCase() + "/emg", new OSCListener() { @Override public void acceptMessage(Date time, OSCMessage message) { - if (message.getArguments().length == 1) { - totalMessageCount++; - - if (message.getArguments()[0] instanceof Float) { - actorData.setTemperature((float) (message.getArguments()[0])); - } + if (message.getArguments().length == 1 && message.getArguments()[0] instanceof Integer) { + actorData.setEmg((int) (message.getArguments()[0])); } } }); - chaOSCclient.addListener("/" + actor.toLowerCase() + "/airFlow", new OSCListener() { + chaOSCclient.addListener("/" + actorData.getActor().toLowerCase() + "/temperature", new OSCListener() { @Override public void acceptMessage(Date time, OSCMessage message) { - if (message.getArguments().length == 1) { - totalMessageCount++; - - if (message.getArguments()[0] instanceof Integer) { - actorData.setAirflow((int) (message.getArguments()[0])); - } + if (message.getArguments().length == 1 && message.getArguments()[0] instanceof Float) { + actorData.setTemperature((float) (message.getArguments()[0])); } } }); - chaOSCclient.addListener("/" + actor.toLowerCase() + "/tommypuls", new OSCListener() { + chaOSCclient.addListener("/" + actorData.getActor().toLowerCase() + "/airFlow", new OSCListener() { @Override public void acceptMessage(Date time, OSCMessage message) { - if (message.getArguments().length == 1) { - totalMessageCount++; - - if (message.getArguments()[0] instanceof Integer) { - actorData.setTommyHeartbeat((boolean) (message.getArguments()[0])); - } - //TODO: evtl muss das oben hier noch anders + if (message.getArguments().length == 1 && message.getArguments()[0] instanceof Integer) { + actorData.setAirflow((int) (message.getArguments()[0])); } } }); + //TODO: evtl muss das oben hier noch anders + chaOSCclient.addListener("/" + actorData.getActor().toLowerCase() + "/tommyheartbeat", new OSCListener() { + @Override + public void acceptMessage(Date time, OSCMessage message) { + actorData.setTommyHeartbeat(!actorData.getTommyHeartbeat()); + } + }); } } diff --git a/healthdisplay/src/main/java/de/psychose/MainForm.form b/healthdisplay/src/main/java/de/psychose/MainForm.form index 75ac05b..126e114 100644 --- a/healthdisplay/src/main/java/de/psychose/MainForm.form +++ b/healthdisplay/src/main/java/de/psychose/MainForm.form @@ -1,16 +1,16 @@ - + - + - - + + @@ -19,9 +19,9 @@ - + - + @@ -36,17 +36,22 @@ - + - + - + + + + + + diff --git a/healthdisplay/src/main/java/de/psychose/MainForm.java b/healthdisplay/src/main/java/de/psychose/MainForm.java index 9178b32..d2eccf5 100644 --- a/healthdisplay/src/main/java/de/psychose/MainForm.java +++ b/healthdisplay/src/main/java/de/psychose/MainForm.java @@ -2,44 +2,48 @@ package de.psychose; import javax.swing.*; import java.awt.event.ActionEvent; -import java.text.DecimalFormat; /** * @author: lucas * @date: 14.04.14 21:43 */ -public class MainForm { +public class MainForm extends JFrame { private JPanel mainPanel; - private ActorHeart heart1; + private ActorHeart heart; private ActorDisplay actor1; private ActorDisplay actor2; private ActorDisplay actor3; private JLabel breath; - private final DecimalFormat df = new DecimalFormat("#.0"); - public JPanel getMainPanel() { - return mainPanel; - } + public MainForm(final ActorData[] actorDatas) { + super("HD Main"); + setContentPane(mainPanel); + setResizable(false); + setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); + setUndecorated(true); - public MainForm(final ActorData actorData1, final ActorData actorData2, final ActorData actorData3) { + actor1.init(actorDatas[0], false); + actor2.init(actorDatas[1], false); + actor3.init(actorDatas[2], false); + heart.setActorDatas(actorDatas); - actor1.setCaption("Körper 1"); - actor2.setCaption("Körper 2"); - actor3.setCaption("Körper 3"); - actor1.setActorData(actorData1); - actor2.setActorData(actorData2); - actor3.setActorData(actorData3); - heart1.setActorData(actorData1, actorData2, actorData3); - - final Timer timer = new Timer(100, new AbstractAction() { + // this is now our main timer to update all and everything gui related + final Timer timer = new Timer(50, new AbstractAction() { @Override public void actionPerformed(ActionEvent e) { - breath.setText(String.valueOf(actorData1.getAirflow())); + // update the breath display + breath.setText(String.valueOf(actorDatas[0].getAirflow())); + + actor1.update(); + actor2.update(); + actor3.update(); + heart.update(); } }); - timer.setRepeats(true); timer.start(); + pack(); + setVisible(true); } diff --git a/healthdisplay/src/main/java/de/psychose/PulseControl.form b/healthdisplay/src/main/java/de/psychose/PulseControl.form index a27987b..1386e2c 100644 --- a/healthdisplay/src/main/java/de/psychose/PulseControl.form +++ b/healthdisplay/src/main/java/de/psychose/PulseControl.form @@ -1,9 +1,9 @@
- + - + @@ -12,29 +12,34 @@ - + + - + - + + - + - + - + + + + diff --git a/healthdisplay/src/main/java/de/psychose/PulseControl.java b/healthdisplay/src/main/java/de/psychose/PulseControl.java index 191d0a2..13a92aa 100644 --- a/healthdisplay/src/main/java/de/psychose/PulseControl.java +++ b/healthdisplay/src/main/java/de/psychose/PulseControl.java @@ -14,58 +14,41 @@ import java.util.Random; public class PulseControl extends Observable { private final int PULSE_WOBBLE_WIDTH = 10; private JCheckBox enableCheckBox; - private JSpinner spinner1; - private JPanel pulsePanel; - private Timer timer; - private Random random = new Random(); - private int heartbeat = 0; - + private JSpinner spinner; + private JPanel mainPanel; + private final Timer timer; + private final Random random = new Random(); + private boolean heartbeat = false; public PulseControl() { - enableCheckBox.setFocusable(false); - spinner1.setFocusable(false); - spinner1.setValue(110); + spinner.setValue(110); - timer = new Timer(100, new AbstractAction() { + timer = new Timer(500, new AbstractAction() { @Override public void actionPerformed(ActionEvent e) { - heartbeat = (heartbeat+1) % 2; + heartbeat = !heartbeat; - final int pulseWobbleCenter = (int)spinner1.getValue(); - int pulse = pulseWobbleCenter - PULSE_WOBBLE_WIDTH / 2 + random.nextInt(PULSE_WOBBLE_WIDTH); + int pulse = (int) spinner.getValue() - PULSE_WOBBLE_WIDTH / 2 + random.nextInt(PULSE_WOBBLE_WIDTH); if(pulse < 60) pulse = 60; if(pulse > 230) pulse = 230; - final PulseData data = new PulseData(heartbeat, pulse, 95 + random.nextInt(4)); setChanged(); - notifyObservers(data); + notifyObservers(new PulseData(heartbeat, pulse, 95 + random.nextInt(4))); - final int delay = 60000 / pulse; - timer.setDelay(delay); + timer.setDelay(60000 / pulse); } }); - timer.setRepeats(true); - enableCheckBox.addItemListener(new ItemListener() { @Override public void itemStateChanged(ItemEvent e) { - JCheckBox checkBox = (JCheckBox)e.getSource(); - if(checkBox.isSelected()) { - if(!timer.isRunning()) { - System.out.println("starting pulsecontrol " + this); - timer.start(); - } - } else { - if(timer.isRunning()) { - System.out.println("stopping pulsecontrol " + this); - timer.stop(); - } + if (enableCheckBox.isSelected() && !timer.isRunning()) { + timer.start(); + } else if (timer.isRunning()) { + timer.stop(); } - } }); } - } diff --git a/healthdisplay/src/main/java/de/psychose/PulseData.java b/healthdisplay/src/main/java/de/psychose/PulseData.java index 7d23497..5198362 100644 --- a/healthdisplay/src/main/java/de/psychose/PulseData.java +++ b/healthdisplay/src/main/java/de/psychose/PulseData.java @@ -6,7 +6,7 @@ package de.psychose; */ public class PulseData { - private int heartbeat; + private boolean heartbeat; private int pulse; private int oxygen; @@ -14,17 +14,17 @@ public class PulseData { } - public PulseData(int heartbeat, int pulse, int oxygen) { + public PulseData(boolean heartbeat, int pulse, int oxygen) { this.heartbeat = heartbeat; this.pulse = pulse; this.oxygen = oxygen; } - public int getHeartbeat() { + public boolean getHeartbeat() { return heartbeat; } - public void setHeartbeat(int heartbeat) { + public void setHeartbeat(boolean heartbeat) { this.heartbeat = heartbeat; } diff --git a/healthdisplay/src/main/java/de/psychose/TemperatureControl.form b/healthdisplay/src/main/java/de/psychose/TemperatureControl.form new file mode 100644 index 0000000..34215ed --- /dev/null +++ b/healthdisplay/src/main/java/de/psychose/TemperatureControl.form @@ -0,0 +1,35 @@ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/healthdisplay/src/main/java/de/psychose/TemperatureControl.java b/healthdisplay/src/main/java/de/psychose/TemperatureControl.java new file mode 100644 index 0000000..4a1fd35 --- /dev/null +++ b/healthdisplay/src/main/java/de/psychose/TemperatureControl.java @@ -0,0 +1,34 @@ +package de.psychose; + +import javax.swing.*; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; +import java.util.Observable; + +/** + * @author: lucas + * @date: 20.11.14 23:11 + */ +public class TemperatureControl extends Observable { + private static final double MIN_OFFSET = -20; + private static final double MAX_OFFSET = 20; + private static final double INCREMENT = 0.1; + private JCheckBox enableCheckBox; + private JSpinner spinner1; + private JPanel mainPanel; + + public TemperatureControl() { + spinner1.setModel(new SpinnerNumberModel(0, MIN_OFFSET, MAX_OFFSET, INCREMENT)); + + final ChangeListener changeListener = new ChangeListener() { + @Override + public void stateChanged(ChangeEvent e) { + setChanged(); + notifyObservers(enableCheckBox.isSelected() ? spinner1.getValue() : 0.0); + } + }; + + spinner1.addChangeListener(changeListener); + enableCheckBox.addChangeListener(changeListener); + } +}