diff --git a/dump_grabber/dump_grabber/main.py b/dump_grabber/dump_grabber/main.py index 5dd5951..8b6aa9e 100644 --- a/dump_grabber/dump_grabber/main.py +++ b/dump_grabber/dump_grabber/main.py @@ -174,8 +174,6 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow, except AttributeError: pass else: - if text == "temperatur": - text += "e" if actor == "merle": self.add_text(0, "%s = %s" % ( text, ", ".join([str(i) for i in args]))) diff --git a/ehealth_sketch/ehealth_eno/ehealth_eno.ino b/ehealth_sketch/ehealth_eno/ehealth_eno.ino index 839c917..48b01e8 100644 --- a/ehealth_sketch/ehealth_eno/ehealth_eno.ino +++ b/ehealth_sketch/ehealth_eno/ehealth_eno.ino @@ -59,14 +59,14 @@ float getTemperature(void) void loop() { zaehler++; - int airFlow = analogRead(A1); - int emg = analogRead(0); - int temp = getTemperature(); - Serial.print(airFlow); +// int airFlow = analogRead(A1); +// int emg = analogRead(0); +// int temp = getTemperature(); + Serial.print(analogRead(A1)); Serial.print(";"); - Serial.print(emg); + Serial.print(analogRead(0)); Serial.print(";"); - Serial.println(temp); + Serial.println(getTemperature()); delay(100); if(zaehler >= 10) { diff --git a/fensterkram/.devilspie/vlc.ds b/fensterkram/.devilspie/vlc.ds new file mode 100644 index 0000000..7f329ee --- /dev/null +++ b/fensterkram/.devilspie/vlc.ds @@ -0,0 +1 @@ +(if (contains (window_name) "VLC media player") (undecorate)) diff --git a/fensterkram/positions.sh b/fensterkram/positions.sh new file mode 100755 index 0000000..b34d458 --- /dev/null +++ b/fensterkram/positions.sh @@ -0,0 +1,23 @@ +#!/bin/bash + +# vlc mit Kamera +STR="Universal Pictures" +wmctrl -r $STR -e 0,1600,0,640,480 +wmctrl -r $STR -b add,sticky,above + +# vlc mit annes texter +STR="http://walter" +wmctrl -r $STR -e 0,2240,0,640,480 +wmctrl -r $STR -b add,sticky,above + +# datenstroeme +STR="http://devimages" +wmctrl -r $STR -e 0,2880,0,640,480 +wmctrl -r $STR -b add,sticky,above + +#das HealthDisplay +wmctrl -r "HD Main" -e 0,2570,480,950,570 +wmctrl -r "HD Main" -b add,sticky,above + +killall devilspie +devilspie & diff --git a/fensterkram/vlc_webcam.sh b/fensterkram/vlc_webcam.sh new file mode 100755 index 0000000..42ed975 --- /dev/null +++ b/fensterkram/vlc_webcam.sh @@ -0,0 +1,7 @@ +#!/bin/bash + + + +vlc --no-audio --video-on-top --no-video-title-show --no-osd \ + --repeat --qt-notification 0 --no-video-deco --autoscale \ + ../streaming/Serenity\ -\ HD\ DVD\ Trailer.mp4 diff --git a/healthdisplay/.idea/copyright/profiles_settings.xml b/healthdisplay/.idea/copyright/profiles_settings.xml index 3572571..e7bedf3 100644 --- a/healthdisplay/.idea/copyright/profiles_settings.xml +++ b/healthdisplay/.idea/copyright/profiles_settings.xml @@ -1,5 +1,3 @@ - - - + \ No newline at end of file diff --git a/healthdisplay/.idea/misc.xml b/healthdisplay/.idea/misc.xml index 8a80acb..4c4c1de 100644 --- a/healthdisplay/.idea/misc.xml +++ b/healthdisplay/.idea/misc.xml @@ -10,7 +10,7 @@ - + diff --git a/healthdisplay/.idea/uiDesigner.xml b/healthdisplay/.idea/uiDesigner.xml index c47fa82..aff8117 100644 --- a/healthdisplay/.idea/uiDesigner.xml +++ b/healthdisplay/.idea/uiDesigner.xml @@ -119,16 +119,21 @@ - - - + + + + + + + + + - - + \ 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/healthdisplay.iml b/healthdisplay/healthdisplay.iml index d987de2..efc4c55 100644 --- a/healthdisplay/healthdisplay.iml +++ b/healthdisplay/healthdisplay.iml @@ -5,20 +5,19 @@ + + + - - - - - + \ No newline at end of file diff --git a/healthdisplay/pom.xml b/healthdisplay/pom.xml index cd5c36f..8fc0fba 100644 --- a/healthdisplay/pom.xml +++ b/healthdisplay/pom.xml @@ -15,21 +15,22 @@ 0.2 - - org.jboss.netty - netty - 3.2.7.Final - + + + + + com.intellij forms_rt 7.0.3 + compile - - org.snmp4j - snmp4j - 1.9.1f - + + + + + diff --git a/healthdisplay/src/main/java/de/psychose/ActorData.java b/healthdisplay/src/main/java/de/psychose/ActorData.java new file mode 100644 index 0000000..3f921cd --- /dev/null +++ b/healthdisplay/src/main/java/de/psychose/ActorData.java @@ -0,0 +1,162 @@ +package de.psychose; + +/** + * @author: lucas + * @date: 17.11.14 21:07 + */ +public class ActorData { + + private String actor = ""; + private String caption = ""; + private PulseData pulseData = new PulseData(); + private int airflow; + private int ekg; + private int emg; + private double temperature; + private double temperatureOffset; + private boolean tommyHeartbeat; + + private long timestampPulse = 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; + + public ActorData(String actor, String caption) { + this.actor = actor; + this.caption = caption; + } + + 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() { + return airflow; + } + + public void setAirflow(int airflow) { + this.airflow = airflow; + this.timestampBreath = System.currentTimeMillis(); + } + + public int getEkg() { + return ekg; + } + + public void setEkg(int ekg) { + this.ekg = ekg; + this.timestampEkg = System.currentTimeMillis(); + } + + public int getEmg() { + return emg; + } + + public void setEmg(int emg) { + this.emg = emg; + this.timestampEmg = System.currentTimeMillis(); + } + + public double getTemperature() { + return temperature; + } + + public void setTemperature(double temperature) { + this.temperature = temperature; + this.timestampTemperature = System.currentTimeMillis(); + } + + public boolean getTommyHeartbeat() { + return tommyHeartbeat; + } + + public void setTommyHeartbeat(boolean tommyHeartbeat) { + this.tommyHeartbeat = tommyHeartbeat; + this.timestampTommyHeartbeat = System.currentTimeMillis(); + } + + public double getTemperatureOffset() { + return temperatureOffset; + } + + public void setTemperatureOffset(double temperatureOffset) { + this.temperatureOffset = temperatureOffset; + } + + public long getTimestampPulse() { + return timestampPulse; + } + + public long getTimestampEkg() { + return timestampEkg; + } + + public long getTimestampEmg() { + return timestampEmg; + } + + public long getTimestampTemperature() { + return timestampTemperature; + } + + 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 e2f0531..d6383cf 100644 --- a/healthdisplay/src/main/java/de/psychose/ActorDisplay.java +++ b/healthdisplay/src/main/java/de/psychose/ActorDisplay.java @@ -2,19 +2,14 @@ package de.psychose; import javax.swing.*; import java.awt.*; -import java.awt.event.ActionEvent; +import java.text.DecimalFormat; /** * @author: lucas * @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 JPanel actorPanel; + private static final long TIMEOUT_MILLISECONDS = 2000; private JLabel lblCaption; private JLabel lblHeartbeat; private JLabel lblPulse; @@ -23,116 +18,48 @@ public class ActorDisplay { private JLabel lblEmg; private JLabel lblTemperature; private JLabel lblBreath; + private JPanel mainPanel; + private ActorData actorData; + private boolean showErrors = false; + private DecimalFormat df = new DecimalFormat("#.0"); - private int counterHeartbeat = 0; - private int counterPulse = 0; - private int counterOxy = 0; - private int counterEkg = 0; - private int counterEmg = 0; - private int counterTemperature = 0; - private int counterBreath = 0; + public void update() { + if (actorData == null) { + return; + } - private int timeout = 20; // 20 * 100ms + lblBreath.setText(String.valueOf(actorData.getAirflow())); + lblTemperature.setText(df.format(actorData.getTemperature() + actorData.getTemperatureOffset())); + lblEkg.setText(String.valueOf(actorData.getEkg())); + lblPulse.setText(actorData.getHeartbeat() ? "systole" : "diastole"); + lblEmg.setText(String.valueOf(actorData.getEmg())); + lblOxy.setText(String.valueOf(actorData.getOxygen())); + lblHeartbeat.setText(String.valueOf(actorData.getPulse())); - public void setCaption(String caption) { - lblCaption.setText(caption); + 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 void setBreath(String breath) { - lblBreath.setText(breath); - counterBreath = 0; + public void init(ActorData actorData, final boolean showErrors) { + this.actorData = actorData; + lblCaption.setText(actorData.getCaption()); + this.showErrors = showErrors; } - public void setTemperature(String temperature) { - lblTemperature.setText(temperature); - counterTemperature = 0; - } - - public void setEkg(String value) { - lblEkg.setText(value); - counterEkg = 0; - } - - public void setPulse(String pulse) { - lblPulse.setText(pulse); - counterPulse = 0; - } - - public void setEmg(String emg) { - lblEmg.setText(emg); - counterEmg = 0; - } - - public void setOxy(String oxy) { - lblOxy.setText(oxy); - counterOxy = 0; - } - - public void setHeartbeat(String heartbeat) { - lblHeartbeat.setText(heartbeat); - counterHeartbeat = 0; - } - - public ActorDisplay() { - this.timer = new Timer(100, new AbstractAction() { - @Override - public void actionPerformed(ActionEvent e) { - - if (++counterTemperature > timeout) { - lblTemperature.setForeground(offColor); - lblTemperature.setText(offText); - } else { - lblTemperature.setForeground(onColor); - } - - if (++counterPulse > timeout) { - lblPulse.setForeground(offColor); - lblPulse.setText(offText); - } else { - lblPulse.setForeground(onColor); - } - - if (++counterOxy > timeout) { - lblOxy.setForeground(offColor); - lblOxy.setText(offText); - } else { - lblOxy.setForeground(onColor); - } - - if (++counterEkg > timeout) { - lblEkg.setForeground(offColor); - lblEkg.setText(offText); - } else { - lblEkg.setForeground(onColor); - } - - if (++counterEmg > timeout) { - lblEmg.setForeground(offColor); - lblEmg.setText(offText); - } else { - lblEmg.setForeground(onColor); - } - - if (++counterHeartbeat > timeout) { - lblHeartbeat.setForeground(offColor); - lblHeartbeat.setText(offText); - } else { - lblHeartbeat.setForeground(onColor); - } - - if (++counterBreath > timeout) { - lblBreath.setForeground(offColor); - lblBreath.setText(offText); - } else { - lblBreath.setForeground(onColor); - } - } - }); - this.timer.setRepeats(true); - } - - public void startErrorTimer() { - this.timer.start(); + 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 new file mode 100644 index 0000000..ef11e05 --- /dev/null +++ b/healthdisplay/src/main/java/de/psychose/ActorHeart.form @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/healthdisplay/src/main/java/de/psychose/ActorHeart.java b/healthdisplay/src/main/java/de/psychose/ActorHeart.java new file mode 100644 index 0000000..f1ece30 --- /dev/null +++ b/healthdisplay/src/main/java/de/psychose/ActorHeart.java @@ -0,0 +1,57 @@ +package de.psychose; + +import javax.imageio.ImageIO; +import javax.swing.*; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.IOException; + +/** + * @author: lucas + * @date: 15.11.14 21:36 + */ +public class ActorHeart { + private JPanel mainPanel; + private ActorData[] actorDatas; + private ImagePanel imagePanel; + + public ActorHeart() { + imagePanel = new ImagePanel("/de/psychose/heart1_klein_inv.jpg", "/de/psychose/heart2_klein_inv.jpg"); + mainPanel.add(imagePanel); + } + + public void update() { + imagePanel.repaint(); + } + + public void setActorDatas(final ActorData[] actorDatas) { + this.actorDatas = actorDatas; + } + + private class ImagePanel extends JPanel { + private BufferedImage image1; + private BufferedImage image2; + + public ImagePanel(String imageA, String imageB) { + try { + image1 = ImageIO.read(getClass().getResourceAsStream(imageA)); + image2 = ImageIO.read(getClass().getResourceAsStream(imageB)); + } catch (IOException e) { + e.printStackTrace(); + } + } + + @Override + protected void paintComponent(Graphics g) { + super.paintComponent(g); + + 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 9674dfa..9670aac 100644 --- a/healthdisplay/src/main/java/de/psychose/ChaOSCclient.java +++ b/healthdisplay/src/main/java/de/psychose/ChaOSCclient.java @@ -23,7 +23,12 @@ public class ChaOSCclient { public ChaOSCclient(String host, int port) throws UnknownHostException, SocketException { portOut = new OSCPortOut(InetAddress.getByName(host), port); - portIn = new OSCPortIn(OSC_CLIENT_PORT); + try { + portIn = new OSCPortIn(OSC_CLIENT_PORT); + } catch (SocketException se) { + System.out.println("Port " + OSC_CLIENT_PORT + " already in use. Trying " + OSC_CLIENT_PORT + 1); + portIn = new OSCPortIn(OSC_CLIENT_PORT + 1); + } } public void addListener(String address, OSCListener listener) { @@ -40,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 new file mode 100644 index 0000000..865d822 --- /dev/null +++ b/healthdisplay/src/main/java/de/psychose/ControlForm.form @@ -0,0 +1,58 @@ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/healthdisplay/src/main/java/de/psychose/ControlForm.java b/healthdisplay/src/main/java/de/psychose/ControlForm.java new file mode 100644 index 0000000..537a458 --- /dev/null +++ b/healthdisplay/src/main/java/de/psychose/ControlForm.java @@ -0,0 +1,68 @@ +package de.psychose; + +import javax.swing.*; +import java.util.Observable; +import java.util.Observer; + +/** + * @author: lucas + * @date: 15.11.14 22:23 + */ +public class ControlForm extends JFrame { + private PulseControl pulse1; + private PulseControl pulse2; + private PulseControl pulse3; + 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 ControlForm(ChaOSCclient chaOSCclient, final ActorData[] actorData) { + super("HD Control"); + this.osCclient = chaOSCclient; + + setContentPane(rootPanel); + setResizable(false); + setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); + + 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 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.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"); + } + } + }); + + 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 0a14f32..b993c40 100644 --- a/healthdisplay/src/main/java/de/psychose/Main.java +++ b/healthdisplay/src/main/java/de/psychose/Main.java @@ -1,10 +1,12 @@ package de.psychose; +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; /** * @author: lucas @@ -12,48 +14,116 @@ import java.net.UnknownHostException; */ public class Main { - public static void main(String[] args) { + new Main(); + } - final boolean showErrors = args.length > 0; + 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( UIManager.getSystemLookAndFeelClassName() ); - UIManager.setLookAndFeel( "com.sun.java.swing.plaf.gtk.GTKLookAndFeel" ); - } - catch ( Exception e ) - { + try { + UIManager.setLookAndFeel("com.sun.java.swing.plaf.gtk.GTKLookAndFeel"); + } catch (Exception e) { e.printStackTrace(); } try { final ChaOSCclient chaOSCclient = new ChaOSCclient("chaosc", 7110); - final SnmpStatClient snmp = new SnmpStatClient("switch/161"); - final MainForm mainForm = new MainForm(showErrors, chaOSCclient, snmp); - final JFrame frame = new JFrame("MainForm"); - frame.setContentPane(mainForm.getMainPanel()); - frame.setResizable(false); - frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); - frame.pack(); - frame.addWindowListener(new WindowAdapter() { - @Override - public void windowClosing(WindowEvent e) { - chaOSCclient.stopReceiver(); - super.windowClosing(e); - } - }); - - frame.setVisible(true); - - new Streamer(8888, mainForm.getMainPanel()).run(); + 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 static void addActorOSCListeners(final ChaOSCclient chaOSCclient, final ActorData actorData) { + + chaOSCclient.addListener("/" + actorData.getActor().toLowerCase() + "/heartbeat", new OSCListener() { + @Override + public void acceptMessage(Date time, OSCMessage message) { + if (message.getArguments().length == 3) { + + // 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) { + final int pulse = (int) (message.getArguments()[1]); + if (pulse > 60) { // try to skip the invalid pulse rate from device + actorData.setPulse(pulse); + } + } + + // set the oxy level + if (message.getArguments()[2] instanceof Integer) { + actorData.setOxygen((int) (message.getArguments()[2])); + } + } + } + }); + + chaOSCclient.addListener("/" + actorData.getActor().toLowerCase() + "/ekg", new OSCListener() { + @Override + public void acceptMessage(Date time, OSCMessage message) { + if (message.getArguments().length == 1 && message.getArguments()[0] instanceof Integer) { + actorData.setEkg((int) (message.getArguments()[0])); + } + } + }); + + chaOSCclient.addListener("/" + actorData.getActor().toLowerCase() + "/emg", new OSCListener() { + @Override + public void acceptMessage(Date time, OSCMessage message) { + if (message.getArguments().length == 1 && message.getArguments()[0] instanceof Integer) { + actorData.setEmg((int) (message.getArguments()[0])); + } + } + }); + + chaOSCclient.addListener("/" + actorData.getActor().toLowerCase() + "/temperature", new OSCListener() { + @Override + public void acceptMessage(Date time, OSCMessage message) { + if (message.getArguments().length == 1 && message.getArguments()[0] instanceof Float) { + actorData.setTemperature((float) (message.getArguments()[0])); + } + } + }); + + chaOSCclient.addListener("/" + actorData.getActor().toLowerCase() + "/airFlow", new OSCListener() { + @Override + public void acceptMessage(Date time, OSCMessage message) { + 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 7a2b026..126e114 100644 --- a/healthdisplay/src/main/java/de/psychose/MainForm.form +++ b/healthdisplay/src/main/java/de/psychose/MainForm.form @@ -1,74 +1,57 @@
- - + + - + - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + diff --git a/healthdisplay/src/main/java/de/psychose/MainForm.java b/healthdisplay/src/main/java/de/psychose/MainForm.java index 24bc772..d2eccf5 100644 --- a/healthdisplay/src/main/java/de/psychose/MainForm.java +++ b/healthdisplay/src/main/java/de/psychose/MainForm.java @@ -1,148 +1,52 @@ package de.psychose; -import com.illposed.osc.OSCListener; -import com.illposed.osc.OSCMessage; - import javax.swing.*; import java.awt.event.ActionEvent; -import java.util.Date; -import java.util.Observable; -import java.util.Observer; /** * @author: lucas * @date: 14.04.14 21:43 */ -public class MainForm { - private final ChaOSCclient osCclient; +public class MainForm extends JFrame { private JPanel mainPanel; + private ActorHeart heart; private ActorDisplay actor1; private ActorDisplay actor2; private ActorDisplay actor3; - private StatsDisplay statDisplay; - private PulseControl pulse1; - private PulseControl pulse2; - private PulseControl pulse3; + private JLabel breath; - private int totalMessageCount = 0; - private int messagesTempCounter = 0; + public MainForm(final ActorData[] actorDatas) { + super("HD Main"); + setContentPane(mainPanel); + setResizable(false); + setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); + setUndecorated(true); - private long totalTraffic = 0; - private long lastTraffic = 0; + actor1.init(actorDatas[0], false); + actor2.init(actorDatas[1], false); + actor3.init(actorDatas[2], false); + heart.setActorDatas(actorDatas); - public JPanel getMainPanel() { - return mainPanel; - } - - public MainForm(final boolean showErrors, final ChaOSCclient chaOSCclient, final SnmpStatClient snmpStatClient) { - this.osCclient = chaOSCclient; - - addActor("merle", "Körper 1", actor1, pulse1); - addActor("uwe", "Körper 2", actor2, pulse2); - addActor("bjoern", "Körper 3", actor3, pulse3); - - - final Timer timer = new Timer(1000, 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) { - statDisplay.setMessagesPerSec(String.valueOf(totalMessageCount - messagesTempCounter)); - statDisplay.setMessageCount(String.valueOf(totalMessageCount)); - messagesTempCounter = totalMessageCount; + // update the breath display + breath.setText(String.valueOf(actorDatas[0].getAirflow())); + + actor1.update(); + actor2.update(); + actor3.update(); + heart.update(); } }); - timer.setRepeats(true); timer.start(); - final Timer snmpTimer = new Timer(5000, new AbstractAction() { - @Override - public void actionPerformed(ActionEvent e) { - totalTraffic = snmpStatClient.getTrafficSum(); // in kB - statDisplay.setTotalTraffic(String.valueOf(totalTraffic)); - statDisplay.setBandwidth(String.valueOf((totalTraffic - lastTraffic) / 5)); - lastTraffic = totalTraffic; - } - }); - snmpTimer.setRepeats(true); - - - if(showErrors) { - actor1.startErrorTimer(); - actor2.startErrorTimer(); - actor3.startErrorTimer(); - snmpTimer.start(); - } else { - pulse1.hide(); - pulse2.hide(); - pulse3.hide(); - statDisplay.hide(); - } + pack(); + setVisible(true); } - private void addActor(final String actor, final String label, final ActorDisplay actorDisplay, final PulseControl pulse) { - actorDisplay.setCaption(label); - osCclient.addListener("/" + actor.toLowerCase() + "/heartbeat", new OSCListener() { - @Override - public void acceptMessage(Date time, OSCMessage message) { - if (message.getArguments().length == 3) { - totalMessageCount++; - actorDisplay.setHeartbeat(message.getArguments()[0].toString().equals("0") ? "Systole" : "Diastole"); - actorDisplay.setPulse(message.getArguments()[1].toString()); - actorDisplay.setOxy(message.getArguments()[2].toString()); - } - } - }); - - osCclient.addListener("/" + actor.toLowerCase() + "/ekg", new OSCListener() { - @Override - public void acceptMessage(Date time, OSCMessage message) { - if (message.getArguments().length == 1) { - totalMessageCount++; - actorDisplay.setEkg(message.getArguments()[0].toString()); - } - } - }); - - osCclient.addListener("/" + actor.toLowerCase() + "/emg", new OSCListener() { - @Override - public void acceptMessage(Date time, OSCMessage message) { - if (message.getArguments().length == 1) { - totalMessageCount++; - actorDisplay.setEmg(message.getArguments()[0].toString()); - } - } - }); - - osCclient.addListener("/" + actor.toLowerCase() + "/temperatur", new OSCListener() { - @Override - public void acceptMessage(Date time, OSCMessage message) { - if (message.getArguments().length == 1) { - totalMessageCount++; - actorDisplay.setTemperature(message.getArguments()[0].toString()); - } - } - }); - - osCclient.addListener("/" + actor.toLowerCase() + "/airFlow", new OSCListener() { - @Override - public void acceptMessage(Date time, OSCMessage message) { - if (message.getArguments().length == 1) { - totalMessageCount++; - actorDisplay.setBreath(message.getArguments()[0].toString()); - } - } - }); - - 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()); - } - } - }); - } diff --git a/healthdisplay/src/main/java/de/psychose/PulseControl.form b/healthdisplay/src/main/java/de/psychose/PulseControl.form index 9e77e02..1386e2c 100644 --- a/healthdisplay/src/main/java/de/psychose/PulseControl.form +++ b/healthdisplay/src/main/java/de/psychose/PulseControl.form @@ -1,42 +1,45 @@
- + - + - - + - + - + - + + - + - + - + + + + diff --git a/healthdisplay/src/main/java/de/psychose/PulseControl.java b/healthdisplay/src/main/java/de/psychose/PulseControl.java index 915518e..13a92aa 100644 --- a/healthdisplay/src/main/java/de/psychose/PulseControl.java +++ b/healthdisplay/src/main/java/de/psychose/PulseControl.java @@ -14,63 +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 > 180) pulse = 180; + 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) { - System.out.println("item state changed"); - 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(); } - } }); } - - public void hide() { - this.pulsePanel.setVisible(false); - } - } 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/SnmpStatClient.java b/healthdisplay/src/main/java/de/psychose/SnmpStatClient.java deleted file mode 100644 index ee84098..0000000 --- a/healthdisplay/src/main/java/de/psychose/SnmpStatClient.java +++ /dev/null @@ -1,93 +0,0 @@ -package de.psychose; - -import org.snmp4j.CommunityTarget; -import org.snmp4j.Snmp; -import org.snmp4j.TransportMapping; -import org.snmp4j.mp.SnmpConstants; -import org.snmp4j.smi.OID; -import org.snmp4j.smi.OctetString; -import org.snmp4j.smi.UdpAddress; -import org.snmp4j.smi.VariableBinding; -import org.snmp4j.transport.DefaultUdpTransportMapping; -import org.snmp4j.util.DefaultPDUFactory; -import org.snmp4j.util.TreeEvent; -import org.snmp4j.util.TreeUtils; - -import java.io.IOException; -import java.util.HashMap; -import java.util.List; - -/** - * @author: lucas - * @date: 18.04.14 12:10 - */ -public class SnmpStatClient { - public static final String OID_COUNTER = "1.3.6.1.2.1.2.2.1.10"; - private HashMap lastPorts = new HashMap<>(); - private HashMap sumPorts = new HashMap<>(); - private Snmp snmp; - private CommunityTarget communityTarget; - - private CommunityTarget getCommunityTarget(String host) { - CommunityTarget communityTarget = new CommunityTarget(); - communityTarget.setCommunity(new OctetString("public")); - communityTarget.setVersion(SnmpConstants.version2c); - communityTarget.setAddress(new UdpAddress(host)); - communityTarget.setTimeout(100); - return communityTarget; - } - - public SnmpStatClient(String host) { - try { - final TransportMapping transportMapping = new DefaultUdpTransportMapping(); - transportMapping.listen(); - - this.communityTarget = getCommunityTarget(host); - this.snmp = new Snmp(transportMapping); - - } catch (IOException e) { - System.out.println("error: cannot get traffic from snmp target"); - } - } - - public long getTrafficSum() { - - if (snmp == null || this.communityTarget == null) { - System.out.println("snmp error"); - return 0; - } - - long sum = 0; - - try { - - final TreeUtils treeUtils = new TreeUtils(snmp, new DefaultPDUFactory()); - final List treeEventList = treeUtils.getSubtree(this.communityTarget, new OID(OID_COUNTER)); - - for (TreeEvent treeEvent : treeEventList) { - if (treeEvent.getStatus() == TreeEvent.STATUS_OK) { - for (VariableBinding binding : treeEvent.getVariableBindings()) { - int oid = binding.getOid().last(); - long value = binding.getVariable().toLong() / 1024; // convert bytes down to kilobytes - long lastValue = 0; - if (lastPorts.containsKey(oid)) lastValue = lastPorts.get(oid); - long diff = value - lastValue; - - if (diff > 0) { - sumPorts.put(oid, lastValue + diff); - } - } - } - } - } catch (IllegalArgumentException e) { - System.out.println("error: could not resolve address from snmp target"); - } - - for (long port : sumPorts.values()) { - sum += port; - } - - return sum; - } - -} diff --git a/healthdisplay/src/main/java/de/psychose/StatsDisplay.form b/healthdisplay/src/main/java/de/psychose/StatsDisplay.form deleted file mode 100644 index 0ea389a..0000000 --- a/healthdisplay/src/main/java/de/psychose/StatsDisplay.form +++ /dev/null @@ -1,112 +0,0 @@ - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/healthdisplay/src/main/java/de/psychose/StatsDisplay.java b/healthdisplay/src/main/java/de/psychose/StatsDisplay.java deleted file mode 100644 index d0a002d..0000000 --- a/healthdisplay/src/main/java/de/psychose/StatsDisplay.java +++ /dev/null @@ -1,37 +0,0 @@ -package de.psychose; - -import javax.swing.*; - -/** - * @author: lucas - * @date: 18.04.14 02:19 - */ -public class StatsDisplay { - private JLabel lblCaption; - private JLabel lblMessageCount; - private JLabel lblMessagesPerSec; - private JPanel statPanel; - private JLabel lblTraffic; - private JLabel lblBandwidth; - - public void setMessageCount(String count) { - lblMessageCount.setText(count); - } - - public void setMessagesPerSec(String messagesPerSec) { - lblMessagesPerSec.setText(messagesPerSec); - } - - public void setTotalTraffic(String totalTraffic) { - lblTraffic.setText(totalTraffic); - } - - public void setBandwidth(String bandwidth) { - lblBandwidth.setText(bandwidth); - } - - public void hide() { - this.statPanel.setVisible(false); - } - -} diff --git a/healthdisplay/src/main/java/de/psychose/Streamer.java b/healthdisplay/src/main/java/de/psychose/Streamer.java deleted file mode 100644 index deea16a..0000000 --- a/healthdisplay/src/main/java/de/psychose/Streamer.java +++ /dev/null @@ -1,256 +0,0 @@ -package de.psychose; - -import org.jboss.netty.bootstrap.ServerBootstrap; -import org.jboss.netty.buffer.ChannelBuffers; -import org.jboss.netty.channel.*; -import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory; -import org.jboss.netty.handler.codec.frame.TooLongFrameException; -import org.jboss.netty.handler.codec.http.*; -import org.jboss.netty.handler.stream.ChunkedInput; -import org.jboss.netty.handler.stream.ChunkedWriteHandler; -import org.jboss.netty.util.CharsetUtil; - -import javax.imageio.ImageIO; -import java.awt.*; -import java.awt.image.BufferedImage; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.net.InetSocketAddress; -import java.nio.channels.ClosedChannelException; -import java.util.concurrent.Executors; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.concurrent.atomic.AtomicReference; - -import static org.jboss.netty.handler.codec.http.HttpHeaders.Names.CONTENT_TYPE; -import static org.jboss.netty.handler.codec.http.HttpMethod.GET; -import static org.jboss.netty.handler.codec.http.HttpResponseStatus.*; -import static org.jboss.netty.handler.codec.http.HttpVersion.HTTP_1_1; - -/** - * @author Maurus Cuelenaere - * taken from http://blog.maurus.be/2012/05/09/netty-mjpeg-streamer/ - */ -public class Streamer { - private final int port; - private final Component view; - private final ViewRenderer renderer; - - private class ViewRenderer implements Runnable { - private final BufferedImage image; - private final AtomicReference currentBuffer; - private final AtomicInteger listenerCount; - private final int napTime; - private final ByteArrayOutputStream outputStream; - - public ViewRenderer() { - this(10); - } - - public ViewRenderer(int fps) { - this.napTime = 1000 / fps; - this.listenerCount = new AtomicInteger(); - this.currentBuffer = new AtomicReference(); - this.image = new BufferedImage(view.getWidth(), view.getHeight(), BufferedImage.TYPE_INT_RGB); - this.outputStream = new ByteArrayOutputStream(); - } - - @Override - public void run() { - while (!Thread.interrupted()) { - long sleepTill = System.currentTimeMillis() + napTime; - - if (listenerCount.get() > 0) { - Graphics g = image.createGraphics(); - view.paint(g); - g.dispose(); - - byte[] newData = null; - try { - ImageIO.write(image, "jpg", outputStream); - newData = outputStream.toByteArray(); - } catch (IOException e) { - e.printStackTrace(); - } finally { - outputStream.reset(); - } - - if (newData != null) { - currentBuffer.set(newData); - synchronized (currentBuffer) { - currentBuffer.notifyAll(); - } - } - } - - try { - long remainingTime = sleepTill - System.currentTimeMillis(); - if (remainingTime > 0) - Thread.sleep(remainingTime); - } catch (InterruptedException e) { - return; - } - } - } - - public void registerListener() { - listenerCount.incrementAndGet(); - } - - public void unregisterListener() { - listenerCount.decrementAndGet(); - } - - public void waitForData() throws InterruptedException { - synchronized (currentBuffer) { - currentBuffer.wait(); - } - } - - public byte[] getData() { - return currentBuffer.get(); - } - } - - private class HttpMultipartReplaceStream implements ChunkedInput { - private final byte[] header; - private boolean closed; - - public HttpMultipartReplaceStream(String boundary) { - this.header = ("--" + boundary + "\r\nContent-Type: image/jpeg\r\n\r\n").getBytes(); - - renderer.registerListener(); - } - - @Override - public void close() throws Exception { - if (closed) - return; - - closed = true; - renderer.unregisterListener(); - } - - @Override - public boolean hasNextChunk() throws Exception { - return !closed; - } - - @Override - public boolean isEndOfInput() throws Exception { - return closed; - } - - @Override - public Object nextChunk() throws Exception { - if (closed) - return null; - - renderer.waitForData(); - byte[] body = renderer.getData(); - - return ChannelBuffers.wrappedBuffer(header, body); - } - } - - private class HttpStreamerHandler extends SimpleChannelUpstreamHandler { - @Override - public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception { - HttpRequest request = (HttpRequest) e.getMessage(); - if (request.getMethod() != GET) { - sendError(ctx, METHOD_NOT_ALLOWED); - return; - } else if (!"/stream".equals(request.getUri())) { - sendError(ctx, NOT_FOUND); - return; - } - - final String boundary = "thisisourmagicboundary"; - HttpResponse response = new DefaultHttpResponse(HTTP_1_1, OK); - HttpHeaders.setHeader(response, "Connection", "close"); - HttpHeaders.setHeader(response, "Content-Type", "multipart/x-mixed-replace;boundary=" + boundary); - HttpHeaders.setHeader(response, "Cache-control", "no-cache"); - HttpHeaders.setHeader(response, "Pragma", "no-cache"); - HttpHeaders.setHeader(response, "Expires", "Thu, 01 Dec 1994 16:00:00 GMT"); - - Channel ch = e.getChannel(); - - final HttpMultipartReplaceStream replaceStream = new HttpMultipartReplaceStream(boundary); - ch.getCloseFuture().addListener(new ChannelFutureListener() { - @Override - public void operationComplete(ChannelFuture future) throws Exception { - // Stop the stream when the channel is closed - replaceStream.close(); - } - }); - - // Write the initial line and the headers - ch.write(response); - - // Write the content - ChannelFuture writeFuture = ch.write(replaceStream); - - // Close the connection when the whole content is written out - writeFuture.addListener(ChannelFutureListener.CLOSE); - } - - @Override - public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) throws Exception { - Channel ch = e.getChannel(); - Throwable cause = e.getCause(); - if (cause instanceof TooLongFrameException) { - sendError(ctx, BAD_REQUEST); - return; - } else if (cause instanceof ClosedChannelException) { - ch.close(); - return; - } - - cause.printStackTrace(); - if (ch.isConnected()) - sendError(ctx, INTERNAL_SERVER_ERROR); - } - - private void sendError(ChannelHandlerContext ctx, HttpResponseStatus status) { - HttpResponse response = new DefaultHttpResponse(HTTP_1_1, status); - response.setHeader(CONTENT_TYPE, "text/plain; charset=UTF-8"); - response.setContent(ChannelBuffers.copiedBuffer("Failure: " + status.toString() + "\r\n", CharsetUtil.UTF_8)); - - // Close the connection as soon as the error message is sent. - ctx.getChannel().write(response).addListener(ChannelFutureListener.CLOSE); - } - } - - public Streamer(int port, Component view) { - this.port = port; - this.view = view; - this.renderer = new ViewRenderer(); - } - - public void run() { - // Configure the server. - ServerBootstrap bootstrap = new ServerBootstrap(new NioServerSocketChannelFactory(Executors.newCachedThreadPool(), Executors.newCachedThreadPool())); - - // Set up the event pipeline factory. - bootstrap.setPipelineFactory(new ChannelPipelineFactory() { - @Override - public ChannelPipeline getPipeline() throws Exception { - // Create a default pipeline implementation. - ChannelPipeline pipeline = Channels.pipeline(); - - pipeline.addLast("decoder", new HttpRequestDecoder()); - pipeline.addLast("aggregator", new HttpChunkAggregator(65536)); - pipeline.addLast("encoder", new HttpResponseEncoder()); - pipeline.addLast("chunkedWriter", new ChunkedWriteHandler()); - pipeline.addLast("handler", new HttpStreamerHandler()); - - return pipeline; - } - }); - - // Bind and start to accept incoming connections. - bootstrap.bind(new InetSocketAddress(port)); - - // Start the renderer - new Thread(renderer, "Image renderer").start(); - } -} \ No newline at end of file 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); + } +} diff --git a/healthdisplay/src/main/java/de/psychose/Test.java b/healthdisplay/src/main/java/de/psychose/Test.java deleted file mode 100644 index 6a1e54c..0000000 --- a/healthdisplay/src/main/java/de/psychose/Test.java +++ /dev/null @@ -1,94 +0,0 @@ -package de.psychose; - -import javax.sound.midi.*; -import java.io.File; -import java.net.InetAddress; -import java.net.NetworkInterface; -import java.net.SocketException; -import java.util.Collections; -import java.util.Enumeration; -import java.util.HashSet; - -public class Test { - public static final int NOTE_ON = 0x90; - public static final int NOTE_OFF = 0x80; - public static final String[] NOTE_NAMES = {"C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "H"}; - - private static void displayInterfaceInformation(NetworkInterface netint) throws SocketException { - System.out.printf("Display name: %s%n", netint.getDisplayName()); - System.out.printf("Name: %s%n", netint.getName()); - Enumeration inetAddresses = netint.getInetAddresses(); - - for (InetAddress inetAddress : Collections.list(inetAddresses)) { - System.out.printf("InetAddress: %s%n", inetAddress); - } - System.out.printf("%n"); - } - - public static void main(String[] args) throws Exception { - - SnmpStatClient snmpStatClient = new SnmpStatClient("switch/161"); - - System.out.println(snmpStatClient.getTrafficSum() / 1024 / 1024 + "MB"); - - - if(true) return; - - Enumeration nets = NetworkInterface.getNetworkInterfaces(); - for (NetworkInterface netint : Collections.list(nets)) { - displayInterfaceInformation(netint); - } - - - if(true) return; - - Sequence sequence = MidiSystem.getSequence(new File("/home/lucas/jake-avril_14th.mid")); - - HashSet notes = new HashSet(); - - int trackNumber = 0; - for (Track track : sequence.getTracks()) { - trackNumber++; - System.out.println("Track " + trackNumber + ": size = " + track.size()); - System.out.println(); - for (int i = 0; i < track.size(); i++) { - MidiEvent event = track.get(i); - System.out.print("@" + event.getTick() + " "); - MidiMessage message = event.getMessage(); - if (message instanceof ShortMessage) { - ShortMessage sm = (ShortMessage) message; - System.out.print("Channel: " + sm.getChannel() + " "); - if (sm.getCommand() == NOTE_ON) { - int key = sm.getData1(); - int octave = (key / 12) - 1; - int note = key % 12; - String noteName = NOTE_NAMES[note]; - int velocity = sm.getData2(); - System.out.println("Note on, " + noteName + octave + " key=" + key + " velocity: " + velocity); - - notes.add(noteName + octave); - - } else if (sm.getCommand() == NOTE_OFF) { - int key = sm.getData1(); - int octave = (key / 12) - 1; - int note = key % 12; - String noteName = NOTE_NAMES[note]; - int velocity = sm.getData2(); - System.out.println("Note off, " + noteName + octave + " key=" + key + " velocity: " + velocity); - } else { - System.out.println("Command:" + sm.getCommand()); - } - } else { - System.out.println("Other message: " + message.getClass()); - } - } - - System.out.println(); - - - } - - - System.out.println(notes); - } -} \ No newline at end of file diff --git a/healthdisplay/src/main/resources/de/psychose/heart1_klein.jpg b/healthdisplay/src/main/resources/de/psychose/heart1_klein.jpg new file mode 100644 index 0000000..b6d2260 Binary files /dev/null and b/healthdisplay/src/main/resources/de/psychose/heart1_klein.jpg differ diff --git a/healthdisplay/src/main/resources/de/psychose/heart1_klein_inv.jpg b/healthdisplay/src/main/resources/de/psychose/heart1_klein_inv.jpg new file mode 100644 index 0000000..842f27e Binary files /dev/null and b/healthdisplay/src/main/resources/de/psychose/heart1_klein_inv.jpg differ diff --git a/healthdisplay/src/main/resources/de/psychose/heart2_klein.jpg b/healthdisplay/src/main/resources/de/psychose/heart2_klein.jpg new file mode 100644 index 0000000..0c06048 Binary files /dev/null and b/healthdisplay/src/main/resources/de/psychose/heart2_klein.jpg differ diff --git a/healthdisplay/src/main/resources/de/psychose/heart2_klein_inv.jpg b/healthdisplay/src/main/resources/de/psychose/heart2_klein_inv.jpg new file mode 100644 index 0000000..4d1d6d5 Binary files /dev/null and b/healthdisplay/src/main/resources/de/psychose/heart2_klein_inv.jpg differ diff --git a/mod_ekg_psychose/gcc/MOD-EKG_DemoSoft.c b/mod_ekg_psychose/gcc/MOD-EKG_DemoSoft.c new file mode 100644 index 0000000..ed8deac --- /dev/null +++ b/mod_ekg_psychose/gcc/MOD-EKG_DemoSoft.c @@ -0,0 +1,462 @@ +//***************************************************************************** +// MSP430FG439-Heart Rate Monitor Demo +// +// Description; Uses one Instrumentation Amplifier INA321 and the three +// internal opamps of the MSP430FG439 +// +// Murugavel Raju +// Texas Instruments, Inc +// October 2004 +// Edited by: M Morales, November 2008 +// * Updated to non-depracated intrinsic functions +// * Changed spacing for legibility +// Edited by: +// Penko T. Bozhkov - Olimex LTD, 05.10.2012 +// * RTC capcitors changed according to Olimex's crystall requirements +// * Olimex LCD definitions are added and heart rate is visualized at 2 places on LCD +// Built with IAR Embedded Workbench Version: 4.21 +//***************************************************************************** +//***************************************************************************** +// THIS PROGRAM IS PROVIDED "AS IS". TI MAKES NO WARRANTIES OR +// REPRESENTATIONS, EITHER EXPRESS, IMPLIED OR STATUTORY, +// INCLUDING ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE, LACK OF VIRUSES, ACCURACY OR +// COMPLETENESS OF RESPONSES, RESULTS AND LACK OF NEGLIGENCE. +// TI DISCLAIMS ANY WARRANTY OF TITLE, QUIET ENJOYMENT, QUIET +// POSSESSION, AND NON-INFRINGEMENT OF ANY THIRD PARTY +// INTELLECTUAL PROPERTY RIGHTS WITH REGARD TO THE PROGRAM OR +// YOUR USE OF THE PROGRAM. +// +// IN NO EVENT SHALL TI BE LIABLE FOR ANY SPECIAL, INCIDENTAL, +// CONSEQUENTIAL OR INDIRECT DAMAGES, HOWEVER CAUSED, ON ANY +// THEORY OF LIABILITY AND WHETHER OR NOT TI HAS BEEN ADVISED +// OF THE POSSIBILITY OF SUCH DAMAGES, ARISING IN ANY WAY OUT +// OF THIS AGREEMENT, THE PROGRAM, OR YOUR USE OF THE PROGRAM. +// EXCLUDED DAMAGES INCLUDE, BUT ARE NOT LIMITED TO, COST OF +// REMOVAL OR REINSTALLATION, COMPUTER TIME, LABOR COSTS, LOSS +// OF GOODWILL, LOSS OF PROFITS, LOSS OF SAVINGS, OR LOSS OF +// USE OR INTERRUPTION OF BUSINESS. IN NO EVENT WILL TI'S +// AGGREGATE LIABILITY UNDER THIS AGREEMENT OR ARISING OUT OF +// YOUR USE OF THE PROGRAM EXCEED FIVE HUNDRED DOLLARS +// (U.S.$500). +// +// Unless otherwise stated, the Program written and copyrighted +// by Texas Instruments is distributed as "freeware". You may, +// only under TI's copyright in the Program, use and modify the +// Program without any charge or restriction. You may +// distribute to third parties, provided that you transfer a +// copy of this license to the third party and the third party +// agrees to these terms by its first use of the Program. You +// must reproduce the copyright notice and any other legend of +// ownership on each copy or partial copy, of the Program. +// +// You acknowledge and agree that the Program contains +// copyrighted material, trade secrets and other TI proprietary +// information and is protected by copyright laws, +// international copyright treaties, and trade secret laws, as +// well as other intellectual property laws. To protect TI's +// rights in the Program, you agree not to decompile, reverse +// engineer, disassemble or otherwise translate any object code +// versions of the Program to a human-readable form. You agree +// that in no event will you alter, remove or destroy any +// copyright notice included in the Program. TI reserves all +// rights not specifically granted under this license. Except +// as specifically provided herein, nothing in this agreement +// shall be construed as conferring by implication, estoppel, +// or otherwise, upon you, any license or other right under any +// TI patents, copyrights or trade secrets. +// +// You may not use the Program in non-TI devices. +//***************************************************************************** +#include "msp430fg439.h" +#include "math.h" +//defines +#define PB_2_0 (1 << 0) // Push Button on P2.0 +#define PB_2_1 (1 << 1) // Push Button on P2.1 + +// variables declaration +static char beats; +int i=0, first_detection=0; +long result = 0; +int Datain, Dataout, Dataout_pulse, pulseperiod, counter, heartrate; +int heartrate_buffer[] = {0,0,0,0,0,0,0,0,0,0}; +int heartrate_cursor = 0, heartrate_mean; + +// Lowpass FIR filter coefficients for 17 taps to filter > 30Hz +static const int coeffslp[9] = { + 5225, 5175, 7255, 9453, 11595, 13507, 15016, 15983, 16315 }; +// Highpass FIR filter coefficients for 17 taps to filter < 2Hz +static const int coeffshp[9] = { + -763, -1267, -1091, -1867, -1969, -2507, -2619, -2911, 29908 }; + +// ******************************************* +// Definitions related to Olimex LCD Digits!!!! +// ******************************************* +// Definitions for Olimex LCD digits 10 and 11 +#define a 0x10 +#define b 0x01 +#define c 0x04 +#define d 0x08 +#define e 0x40 +#define f 0x20 +#define g 0x02 +#define h 0x80 +// Character generator definition for display digits 10 and 11 +const char char_gen_10_11[] = { + a+b+c+d+e+f, // 0 Displays "0" + b+c, // 1 Displays "1" + a+b+d+e+g, // 2 Displays "2" + a+b+c+d+g, // 3 Displays "3" + b+c+f+g, // 4 Displays "4" + a+c+d+f+g, // 5 Displays "5" + a+c+d+e+f+g, // 6 Displays "6" + a+b+c, // 7 Displays "7" + a+b+c+d+e+f+g, // 8 Displays "8" + a+b+c+d+f+g, // 9 Displays "9" +}; +// undefines +#undef a +#undef b +#undef c +#undef d +#undef e +#undef f +#undef g +#undef h + +// Definitions for Olimex LCD digits 8 and 9 +#define a 0x01 +#define b 0x02 +#define c 0x04 +#define d 0x80 +#define e 0x40 +#define f 0x10 +#define g 0x20 +#define h 0x08 +// Character generator definition for display digits 8 and 9 +const char char_gen_8_9[] = { + a+b+c+d+e+f, // 0 Displays "0" + b+c, // 1 Displays "1" + a+b+d+e+g, // 2 Displays "2" + a+b+c+d+g, // 3 Displays "3" + b+c+f+g, // 4 Displays "4" + a+c+d+f+g, // 5 Displays "5" + a+c+d+e+f+g, // 6 Displays "6" + a+b+c, // 7 Displays "7" + a+b+c+d+e+f+g, // 8 Displays "8" + a+b+c+d+f+g, // 9 Displays "9" +}; +// undefines +#undef a +#undef b +#undef c +#undef d +#undef e +#undef f +#undef g +#undef h + +// Definitions for Olimex LCD digits 1 to 7. Here each digit definition require 2 bytes +#define a 0x0080 +#define b 0x0040 +#define c 0x0020 +#define d 0x0010 +#define e 0x2000 +#define f 0x4000 +#define g 0x0402 +#define h 0x1000 +// Character generator definition for display digits 1 to 7 +const int char_gen_1_7[] = { + a+b+c+d+e+f, // 0 Displays "0" + b+c, // 1 Displays "1" + a+b+d+e+g, // 2 Displays "2" + a+b+c+d+g, // 3 Displays "3" + b+c+f+g, // 4 Displays "4" + a+c+d+f+g, // 5 Displays "5" + a+c+d+e+f+g, // 6 Displays "6" + a+b+c, // 7 Displays "7" + a+b+c+d+e+f+g, // 8 Displays "8" + a+b+c+d+f+g, // 9 Displays "9" +}; +// undefines +#undef a +#undef b +#undef c +#undef d +#undef e +#undef f +#undef g +#undef h + + + +// function prototypes +void Init(void); // Initializes device for the application +void ClearLCD(void); // Clears the LCD memory +int filterlp(int); // 17 tap lowpass FIR filter +int filterhp(int); // 17 tap highpass FIR filter +long mul16(register int x, register int y); // 16-bit signed multiplication +int itobcd(int i); // 16-bit hex to bcd conversion + +// main function +int main(void) +{ + Init(); // Initialize device for the application + LCDMEM[7] = 0x80; // Turn on LCD's Olimex row!!! + +/* + // For debug purpose only! + for(unsigned char j=0;j<10;j++){ + LCDMEM[2] = char_gen_10_11[j]; // LCD -> Digit 11 + LCDMEM[3] = char_gen_10_11[j]; // LCD -> Digit 10 + LCDMEM[4] = char_gen_8_9[j]; // LCD -> Digit 9 + LCDMEM[5] = char_gen_8_9[j]; // LCD -> Digit 8 + + LCDMEM[7] = ((char)(char_gen_1_7[j]>>8)); // LCD -> Digit 7 High Byte + LCDMEM[6] = ((char)(char_gen_1_7[j]&0x00FF)); // LCD -> Digit 7 Low Byte + LCDMEM[9] = ((char)(char_gen_1_7[j]>>8)); // LCD -> Digit 6 High Byte + LCDMEM[8] = ((char)(char_gen_1_7[j]&0x00FF)); // LCD -> Digit 6 Low Byte + LCDMEM[11] = ((char)(char_gen_1_7[j]>>8)); // LCD -> Digit 5 High Byte + LCDMEM[10] = ((char)(char_gen_1_7[j]&0x00FF)); // LCD -> Digit 5 Low Byte + //LCDMEM[13] = ((char)(char_gen_1_7[j]>>8)); // LCD -> Digit 4 High Byte + //LCDMEM[12] = ((char)(char_gen_1_7[j]&0x00FF)); // LCD -> Digit 4 Low Byte + //LCDMEM[15] = ((char)(char_gen_1_7[j]>>8)); // LCD -> Digit 3 High Byte + //LCDMEM[14] = ((char)(char_gen_1_7[j]&0x00FF)); // LCD -> Digit 3 Low Byte + //LCDMEM[17] = ((char)(char_gen_1_7[j]>>8)); // LCD -> Digit 2 High Byte + //LCDMEM[16] = ((char)(char_gen_1_7[j]&0x00FF)); // LCD -> Digit 2 Low Byte + } +*/ + + while(1) + { + __bis_SR_register(LPM0_bits); // Enter LPM0 needed for UART TX completion + __no_operation(); + + Dataout = filterlp(Datain); // Lowpass FIR filter for filtering out 60Hz + Dataout_pulse = filterhp(Dataout)-128; // Highpass FIR filter to filter muscle artifacts + Dataout = Dataout >> 6; // Scale Dataout to use scope program + if(Dataout > 255) Dataout = 255; // Set boundary 255 max + if(Dataout < 0) Dataout = 0; // Set boundary 0 min + //DAC12_0DAT = Dataout; // For scope display + + + if( 0 ) { + TXBUF0 = Dataout; // Transmit via UART0 for Scope display + } else { + // send the data as ascii values + TXBUF0 = (Dataout / 100) + 48; // hundreds + while (!(IFG1 & UTXIFG0)); // wait for transmission + TXBUF0 = ((Dataout / 10) % 10 ) + 48; // tens + while (!(IFG1 & UTXIFG0)); + TXBUF0 = ((Dataout / 1) % 10 ) + 48; // ones + while (!(IFG1 & UTXIFG0)); + TXBUF0 = 32; // send a blank + while (!(IFG1 & UTXIFG0)); + TXBUF0 = ((heartrate & 0xf00) >> 8) + 48; + while (!(IFG1 & UTXIFG0)); + TXBUF0 = ((heartrate & 0xf0) >> 4) + 48; + while (!(IFG1 & UTXIFG0)); + TXBUF0 = (heartrate & 0x0f) + 48; + while (!(IFG1 & UTXIFG0)); + TXBUF0 = 10; // send a \n + } + + + counter++; // Debounce counter + pulseperiod++; // Pulse period counter + if (Dataout_pulse > 100) // Check if above threshold (48) + { + LCDMEM[1] = 0xF0; // Heart beat detected enable "<^>" on LCD + counter = 0; // Reset debounce counter + } + if (counter == 128) // Allow 128 sample debounce time + { + LCDMEM[1] = 0x00; // Disable "<^>" on LCD for blinking effect + beats++; + if (beats == 3) + { + beats = 0; + + //heartrate_buffer[heartrate_cursor] = 50720/pulseperiod; + //heartrate_cursor++; + //heartrate_cursor = heartrate_cursor % 10; + + //int ct; + //for(ct = 0; ct < 10; ct++) { +// heartrate_mean += heartrate_buffer[ct]; + //} + //heartrate = itobcd(heartrate_mean / 10); + + // heartrate = itobcd(30720/pulseperiod); // Calculate beat to beat heart rate per min + //heartrate = itobcd(92160/pulseperiod); // Calculate 3 beat average heart rate per min + heartrate = itobcd(50720/pulseperiod); // Calculate 3 beat average heart rate per min + //heartrate = (92160/pulseperiod); // Calculate 3 beat average heart rate per min + pulseperiod = 0; // Reset pulse period for next measurement + + + + ///* + LCDMEM[2] = char_gen_10_11[heartrate & 0x0f]; // Display current heart rate units -> LCD Digit 11 + LCDMEM[3] = char_gen_10_11[(heartrate & 0xf0) >> 4]; // tens -> LCD Digit 10 + LCDMEM[4] = char_gen_8_9[(heartrate & 0xf00) >> 8]; // hundreds -> LCD Digit 9 + + LCDMEM[7] = ((char)(char_gen_1_7[heartrate & 0x0f]>>8)); // LCD -> Digit 7 High Byte + LCDMEM[6] = ((char)(char_gen_1_7[heartrate & 0x0f]&0x00FF)); // LCD -> Digit 7 Low Byte + LCDMEM[9] = ((char)(char_gen_1_7[((heartrate & 0xf0) >> 4)]>>8)); // LCD -> Digit 6 High Byte + LCDMEM[8] = ((char)(char_gen_1_7[((heartrate & 0xf0) >> 4)]&0x00FF)); // LCD -> Digit 6 Low Byte + LCDMEM[11] = ((char)(char_gen_1_7[((heartrate & 0xf00) >> 8)]>>8)); // LCD -> Digit 5 High Byte + LCDMEM[10] = ((char)(char_gen_1_7[((heartrate & 0xf00) >> 8)]&0x00FF)); // LCD -> Digit 5 Low Byte + //*/ + + } + } + } +}//main + +// Initialization function +void Init( void ) +{ + FLL_CTL0 |= XCAP10PF; // Set load capacitance for xtal + WDTCTL = WDTPW | WDTHOLD; // Disable the Watchdog + while ( LFOF & FLL_CTL0); // wait for watch crystal to stabilize + SCFQCTL = 63; // 32 x 32768 x 2 = 2.097152MHz + BTCTL = BT_fLCD_DIV128; // Set LCD frame freq = ACLK/128 +// Initialize and enable LCD peripheral + ClearLCD(); // Clear LCD memory + LCDCTL = LCDSG0_3 + LCD4MUX + LCDON ; // 4mux LCD, segs0-23 enabled +// Initialize and enable GPIO ports + P1OUT = 0x00 + BIT3; // Clear P1OUT register, INA turned ON + P1DIR = 0x3f; // Unused pins as outputs, Comparator pins as inputs + P2OUT = 0x00; // Clear P2OUT register + P2DIR = 0xff; // Unused pins as outputs + P2DIR = ~(PB_2_0+PB_2_1); // P2.0 and P2.1 push buttons + P2IES = 0x00; // Interrupt edge low to high transition + P2IFG = 0x00; // Clear pending P2 interrupts + P2IE = PB_2_0 | PB_2_1; // Enable intterupts for push buttons + P3OUT = 0x00; // Clear P3OUT register + P3DIR = 0x0f; // Unused pins as outputs except P3.<4-7> -> For the new LCD's received at ~04.10.2012 this must be inputs!! + P4OUT = 0x00; // Clear P4OUT register + P4DIR = 0xff; // Unused pins as outputs + P5OUT = 0x00; // Clear P5OUT register + P5DIR = 0xff; // Unused pins as outputs + P5SEL = 0xfc; // Set Rxx and COM pins for LCD + P6OUT = 0x00; // Clear P6OUT register + P6SEL = 0xff; // P6 = Analog +// Initialize and enable UART + P2SEL|=BIT4; // P2.4 = TXD + UCTL0 |= SWRST; // UART SWRST = 1 + ME1 |= UTXE0; // Enable UART0 TXD + UCTL0 |= CHAR; // 8-bit char, SWRST=1 + UTCTL0 |= SSEL1; // UCLK = SMCLK + UBR00 = 18; // 115200 from 2.097152MHz + UBR10 = 0; + UMCTL0 = 0x2c; // Modulation = 0.2044 + UCTL0 &= ~SWRST; // UART SWRST = 0, enable UART + IFG1 &= ~UTXIFG0; +// Initialize and enable ADC12 + ADC12CTL0 = ADC12ON + SHT0_4 + REFON + REF2_5V; + // ADC12 ON, Reference = 2.5V for DAC0 + ADC12CTL1 = SHP + SHS_1 + CONSEQ_2; // Use sampling timer, TA1 trigger + ADC12MCTL0 = INCH_1 + SREF_1; // Vref, channel = 1 = OA0 Out + ADC12IE = BIT0; // Enable interrupt for ADC12 MEM0 + ADC12CTL0 |= ENC; // Enable conversions +// Initialize and enable Timer_A + TACTL = TASSEL0 + MC_1 + TACLR; // ACLK, Clear TAR, Up Mode + TACCTL1 = OUTMOD_2; // Set / Reset + TACCR0 = 63; // 512 samples per second + TACCR1 = 15; // +// Initialize and enable DAC12x + DAC12_0CTL = DAC12OPS + DAC12CALON + DAC12IR + DAC12AMP_2 + DAC12ENC;// DAC0 enable + DAC12_1CTL = DAC12CALON + DAC12IR + DAC12AMP_2 + DAC12ENC; // DAC1 enable + DAC12_1DAT = 0x099A; // Offset level = 1.5V for op amp bias +// Initialize and enable opamps + OA0CTL0 = OAP_1 + OAPM_1 + OAADC1; // OA0 enable power mode 1, OA0- = P6.0, 0A0+ = P6.2, OA0O = P6.1 + OA0CTL1 = OARRIP; // General purpose mode, no Rail-to-Rail inputs + OA1CTL0 = OAP_3 + OAPM_1 + OAADC1; // OA1 enable power mode 1, OA1- = P6.4, OA1+ = DAC1, OA1O = P6.3 + OA1CTL1 = OARRIP; // General purpose mode, no Rail-to-Rail inputs + OA2CTL0 = OAP_3 + OAPM_1 + OAADC1; // OA2 enable power mode 1, OA2+ = DAC1, OA2O = P6.5, Select inputs, power mode + OA2CTL1 = OAFC_1 + OARRIP; // Unit gain Mode, no Rail-to-Rail inputs + __enable_interrupt(); // Enable global Interrupts +} //init + +void ClearLCD(void) +{ + int i; // + for( i = 0; i < 20; i++){ // Clear LCDMEM + LCDMEM[i] = 0; // + } +}//clear LCD + +int itobcd(int i) // Convert hex word to BCD. +{ + int bcd = 0; // + char j = 0; // + + while (i > 9) // + { + bcd |= ((i % 10) << j); // + i /= 10; // + j += 4; + } // + return (bcd | (i << j)); // Return converted value +}// itobcd(i) + + +int filterlp(int sample) // Lowpass FIR filter for EKG +{ + static int buflp[32]; // Reserve 32 loactions for circular buffering + static int offsetlp = 0; + long z; + int i; + + buflp[offsetlp] = sample; + z = mul16(coeffslp[8], buflp[(offsetlp - 8) & 0x1F]); + + __no_operation(); + + for (i = 0; i < 8; i++){ + z += mul16(coeffslp[i], buflp[(offsetlp - i) & 0x1F] + buflp[(offsetlp - 16 + i) & 0x1F]); + } + + offsetlp = (offsetlp + 1) & 0x1F; + return z >> 15; // Return filter output +}// int filter + +int filterhp(int samplehp) // Highpass FIR filter for hear rate +{ + static int bufhp[32]; // Reserve 32 loactions for circular buffering + static int offsethp = 0; + long z; + int i; + + bufhp[offsethp] = samplehp; + z = mul16(coeffshp[8], bufhp[(offsethp - 8) & 0x1F]); + + for (i = 0; i < 8; i++){ + z += mul16(coeffshp[i], bufhp[(offsethp - i) & 0x1F] + bufhp[(offsethp - 16 + i) & 0x1F]); + } + + offsethp = (offsethp + 1) & 0x1F; + return z >> 15; // Return filter output +}// int filterhp + +long mul16(register int x, register int y) +{ + return ((long)x) * y; +} + + +#pragma vector = PORT2_VECTOR +__interrupt void Port2ISR (void) +{ + P2IFG = 0; +}//Push buttons unused + +#pragma vector = ADC_VECTOR // ADC12 ISR +__interrupt void ADC12ISR (void) +{ + Datain = ADC12MEM0; // Store converted value in Datain + __bic_SR_register_on_exit(LPM0_bits); // Exit LPM0 on return +}// ADC12ISR + + diff --git a/mod_ekg_psychose/gcc/Makefile b/mod_ekg_psychose/gcc/Makefile new file mode 100644 index 0000000..08dfffa --- /dev/null +++ b/mod_ekg_psychose/gcc/Makefile @@ -0,0 +1,91 @@ +# +# Makefile for msp430 +# +# 'make' builds everything +# 'make clean' deletes everything except source files and Makefile +# You need to set TARGET, MCU and SOURCES for your project. +# TARGET is the name of the executable file to be produced +# $(TARGET).elf $(TARGET).hex and $(TARGET).txt nad $(TARGET).map are all generated. +# The TXT file is used for BSL loading, the ELF can be used for JTAG use +# +TARGET = mod-pulse-ekg +MCU = msp430fg439 + +# List all the source files here +# eg if you have a source file foo.c then list it here +SOURCES = MOD-EKG_DemoSoft.c +# Include are located in the Include directory +INCLUDES = -IInclude + +# Add or subtract whatever MSPGCC flags you want. There are plenty more +####################################################################################### +CFLAGS = -mmcu=$(MCU) -g -Os -Wall -Wunused $(INCLUDES) +ASFLAGS = -mmcu=$(MCU) -x assembler-with-cpp -Wa,-gstabs +LDFLAGS = -mmcu=$(MCU) -Wl,-Map=$(TARGET).map -lm -lfp -pipe +######################################################################################## +CC = msp430-gcc +LD = msp430-ld +AR = msp430-ar +AS = msp430-gcc +GASP = msp430-gasp +NM = msp430-nm +OBJCOPY = msp430-objcopy +RANLIB = msp430-ranlib +STRIP = msp430-strip +SIZE = msp430-size +READELF = msp430-readelf +MAKETXT = srec_cat +CP = cp -p +RM = rm -f +MV = mv +######################################################################################## +# the file which will include dependencies + +DEPEND = $(SOURCES:.c=.d) + +# all the object files +OBJECTS = $(SOURCES:.c=.o) + +#all: $(TARGET).elf $(TARGET).hex $(TARGET).txt +all: $(TARGET).elf $(TARGET).hex +$(TARGET).elf: $(OBJECTS) + echo "Linking $@" + $(CC) $(OBJECTS) $(LDFLAGS) $(LIBS) -o $@ + echo + echo ">>>> Size of Firmware <<<<" + $(SIZE) $(TARGET).elf + echo + +%.hex: %.elf + $(OBJCOPY) -O ihex $< $@ + +#%.txt: %.hex +# $(MAKETXT) -O $@ -TITXT $< -I +# unix2dos $(TARGET).txt +# The above line is required for the DOS based TI BSL tool to be able to read the txt file generated from linux/unix systems. + +%.o: %.c + echo "Compiling $<" + $(CC) -c $(CFLAGS) -o $@ $< + +# rule for making assembler source listing, to see the code +%.lst: %.c + $(CC) -c $(ASFLAGS) -Wa,-anlhd $< > $@ + +# include the dependencies unless we're going to clean, then forget about them. +ifneq ($(MAKECMDGOALS), clean) +-include $(DEPEND) +endif +# dependencies file +# includes also considered, since some of these are our own +# (otherwise use -MM instead of -M) +%.d: %.c + echo "Generating dependencies $@ from $<" + $(CC) -M ${CFLAGS} $< >$@ +.SILENT: +.PHONY: clean +clean: + -$(RM) $(OBJECTS) + -$(RM) $(TARGET).* + -$(RM) $(SOURCES:.c=.lst) + -$(RM) $(DEPEND) diff --git a/mod_ekg_psychose/gcc/make.sh b/mod_ekg_psychose/gcc/make.sh new file mode 100755 index 0000000..736a772 --- /dev/null +++ b/mod_ekg_psychose/gcc/make.sh @@ -0,0 +1,2 @@ +msp430-gcc -I/usr/msp430/include -Wall mod_ -mmcu=msp430fg439 -o mod-ekg-pyschose -L /usr/msp430/lib/ldscripts/msp430fg439 -lm -lfp -pipe + diff --git a/mod_ekg_psychose/iar/Backup of MOD-EKG_DemoSoft.ewd b/mod_ekg_psychose/iar/Backup of MOD-EKG_DemoSoft.ewd new file mode 100644 index 0000000..a46677a --- /dev/null +++ b/mod_ekg_psychose/iar/Backup of MOD-EKG_DemoSoft.ewd @@ -0,0 +1,571 @@ + + + + 2 + + Debug + + MSP430 + + 1 + + C-SPY + 4 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + 430FET + 1 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SIM430 + 1 + + 3 + 1 + 1 + + + + + + + + $TOOLKIT_DIR$\plugins\Lcd\lcd.ewplugin + 1 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\SymList\SymList.ENU.ewplugin + 1 + + + + + Release + + MSP430 + + 0 + + C-SPY + 4 + + 23 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + 430FET + 1 + + 15 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SIM430 + 1 + + 3 + 1 + 0 + + + + + + + + $TOOLKIT_DIR$\plugins\Lcd\lcd.ewplugin + 1 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\SymList\SymList.ENU.ewplugin + 1 + + + + + + diff --git a/mod_ekg_psychose/iar/Backup of MOD-EKG_DemoSoft.ewp b/mod_ekg_psychose/iar/Backup of MOD-EKG_DemoSoft.ewp new file mode 100644 index 0000000..36b8bcb --- /dev/null +++ b/mod_ekg_psychose/iar/Backup of MOD-EKG_DemoSoft.ewp @@ -0,0 +1,1744 @@ + + + + 2 + + Debug + + MSP430 + + 1 + + General + 7 + + 26 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICC430 + 4 + + 28 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A430 + 4 + + 13 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + XLINK + 4 + + 22 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + XAR + 4 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Release + + MSP430 + + 0 + + General + 7 + + 26 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICC430 + 4 + + 28 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A430 + 4 + + 13 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + XLINK + 4 + + 22 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + XAR + 4 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + + $PROJ_DIR$\MOD-EKG_DemoSoft.c + + + $PROJ_DIR$\mul.s43 + + + + diff --git a/mod_ekg_psychose/iar/MOD-EKG_DemoSoft.c b/mod_ekg_psychose/iar/MOD-EKG_DemoSoft.c new file mode 100644 index 0000000..6db8d34 --- /dev/null +++ b/mod_ekg_psychose/iar/MOD-EKG_DemoSoft.c @@ -0,0 +1,436 @@ +//***************************************************************************** +// MSP430FG439-Heart Rate Monitor Demo +// +// Description; Uses one Instrumentation Amplifier INA321 and the three +// internal opamps of the MSP430FG439 +// +// Murugavel Raju +// Texas Instruments, Inc +// October 2004 +// Edited by: M Morales, November 2008 +// * Updated to non-depracated intrinsic functions +// * Changed spacing for legibility +// Edited by: +// Penko T. Bozhkov - Olimex LTD, 05.10.2012 +// * RTC capcitors changed according to Olimex's crystall requirements +// * Olimex LCD definitions are added and heart rate is visualized at 2 places on LCD +// Built with IAR Embedded Workbench Version: 4.21 +//***************************************************************************** +//***************************************************************************** +// THIS PROGRAM IS PROVIDED "AS IS". TI MAKES NO WARRANTIES OR +// REPRESENTATIONS, EITHER EXPRESS, IMPLIED OR STATUTORY, +// INCLUDING ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE, LACK OF VIRUSES, ACCURACY OR +// COMPLETENESS OF RESPONSES, RESULTS AND LACK OF NEGLIGENCE. +// TI DISCLAIMS ANY WARRANTY OF TITLE, QUIET ENJOYMENT, QUIET +// POSSESSION, AND NON-INFRINGEMENT OF ANY THIRD PARTY +// INTELLECTUAL PROPERTY RIGHTS WITH REGARD TO THE PROGRAM OR +// YOUR USE OF THE PROGRAM. +// +// IN NO EVENT SHALL TI BE LIABLE FOR ANY SPECIAL, INCIDENTAL, +// CONSEQUENTIAL OR INDIRECT DAMAGES, HOWEVER CAUSED, ON ANY +// THEORY OF LIABILITY AND WHETHER OR NOT TI HAS BEEN ADVISED +// OF THE POSSIBILITY OF SUCH DAMAGES, ARISING IN ANY WAY OUT +// OF THIS AGREEMENT, THE PROGRAM, OR YOUR USE OF THE PROGRAM. +// EXCLUDED DAMAGES INCLUDE, BUT ARE NOT LIMITED TO, COST OF +// REMOVAL OR REINSTALLATION, COMPUTER TIME, LABOR COSTS, LOSS +// OF GOODWILL, LOSS OF PROFITS, LOSS OF SAVINGS, OR LOSS OF +// USE OR INTERRUPTION OF BUSINESS. IN NO EVENT WILL TI'S +// AGGREGATE LIABILITY UNDER THIS AGREEMENT OR ARISING OUT OF +// YOUR USE OF THE PROGRAM EXCEED FIVE HUNDRED DOLLARS +// (U.S.$500). +// +// Unless otherwise stated, the Program written and copyrighted +// by Texas Instruments is distributed as "freeware". You may, +// only under TI's copyright in the Program, use and modify the +// Program without any charge or restriction. You may +// distribute to third parties, provided that you transfer a +// copy of this license to the third party and the third party +// agrees to these terms by its first use of the Program. You +// must reproduce the copyright notice and any other legend of +// ownership on each copy or partial copy, of the Program. +// +// You acknowledge and agree that the Program contains +// copyrighted material, trade secrets and other TI proprietary +// information and is protected by copyright laws, +// international copyright treaties, and trade secret laws, as +// well as other intellectual property laws. To protect TI's +// rights in the Program, you agree not to decompile, reverse +// engineer, disassemble or otherwise translate any object code +// versions of the Program to a human-readable form. You agree +// that in no event will you alter, remove or destroy any +// copyright notice included in the Program. TI reserves all +// rights not specifically granted under this license. Except +// as specifically provided herein, nothing in this agreement +// shall be construed as conferring by implication, estoppel, +// or otherwise, upon you, any license or other right under any +// TI patents, copyrights or trade secrets. +// +// You may not use the Program in non-TI devices. +//***************************************************************************** +#include +#include "math.h" +//defines +#define PB_2_0 (1 << 0) // Push Button on P2.0 +#define PB_2_1 (1 << 1) // Push Button on P2.1 + +// variables declaration +static char beats; +int i=0, first_detection=0; +long result = 0; +int Datain, Dataout, Dataout_pulse, pulseperiod, counter, heartrate; +int Heart_Rate_Buffer[] = {0,0,0,0}; +// Lowpass FIR filter coefficients for 17 taps to filter > 30Hz +static const int coeffslp[9] = { + 5225, 5175, 7255, 9453, 11595, 13507, 15016, 15983, 16315 }; +// Highpass FIR filter coefficients for 17 taps to filter < 2Hz +static const int coeffshp[9] = { + -763, -1267, -1091, -1867, -1969, -2507, -2619, -2911, 29908 }; + +// ******************************************* +// Definitions related to Olimex LCD Digits!!!! +// ******************************************* +// Definitions for Olimex LCD digits 10 and 11 +#define a 0x10 +#define b 0x01 +#define c 0x04 +#define d 0x08 +#define e 0x40 +#define f 0x20 +#define g 0x02 +#define h 0x80 +// Character generator definition for display digits 10 and 11 +const char char_gen_10_11[] = { + a+b+c+d+e+f, // 0 Displays "0" + b+c, // 1 Displays "1" + a+b+d+e+g, // 2 Displays "2" + a+b+c+d+g, // 3 Displays "3" + b+c+f+g, // 4 Displays "4" + a+c+d+f+g, // 5 Displays "5" + a+c+d+e+f+g, // 6 Displays "6" + a+b+c, // 7 Displays "7" + a+b+c+d+e+f+g, // 8 Displays "8" + a+b+c+d+f+g, // 9 Displays "9" +}; +// undefines +#undef a +#undef b +#undef c +#undef d +#undef e +#undef f +#undef g +#undef h + +// Definitions for Olimex LCD digits 8 and 9 +#define a 0x01 +#define b 0x02 +#define c 0x04 +#define d 0x80 +#define e 0x40 +#define f 0x10 +#define g 0x20 +#define h 0x08 +// Character generator definition for display digits 8 and 9 +const char char_gen_8_9[] = { + a+b+c+d+e+f, // 0 Displays "0" + b+c, // 1 Displays "1" + a+b+d+e+g, // 2 Displays "2" + a+b+c+d+g, // 3 Displays "3" + b+c+f+g, // 4 Displays "4" + a+c+d+f+g, // 5 Displays "5" + a+c+d+e+f+g, // 6 Displays "6" + a+b+c, // 7 Displays "7" + a+b+c+d+e+f+g, // 8 Displays "8" + a+b+c+d+f+g, // 9 Displays "9" +}; +// undefines +#undef a +#undef b +#undef c +#undef d +#undef e +#undef f +#undef g +#undef h + +// Definitions for Olimex LCD digits 1 to 7. Here each digit definition require 2 bytes +#define a 0x0080 +#define b 0x0040 +#define c 0x0020 +#define d 0x0010 +#define e 0x2000 +#define f 0x4000 +#define g 0x0402 +#define h 0x1000 +// Character generator definition for display digits 1 to 7 +const int char_gen_1_7[] = { + a+b+c+d+e+f, // 0 Displays "0" + b+c, // 1 Displays "1" + a+b+d+e+g, // 2 Displays "2" + a+b+c+d+g, // 3 Displays "3" + b+c+f+g, // 4 Displays "4" + a+c+d+f+g, // 5 Displays "5" + a+c+d+e+f+g, // 6 Displays "6" + a+b+c, // 7 Displays "7" + a+b+c+d+e+f+g, // 8 Displays "8" + a+b+c+d+f+g, // 9 Displays "9" +}; +// undefines +#undef a +#undef b +#undef c +#undef d +#undef e +#undef f +#undef g +#undef h + + + +// function prototypes +void Init(void); // Initializes device for the application +void ClearLCD(void); // Clears the LCD memory +int filterlp(int); // 17 tap lowpass FIR filter +int filterhp(int); // 17 tap highpass FIR filter +long mul16(register int x, register int y); // 16-bit signed multiplication +int itobcd(int i); // 16-bit hex to bcd conversion +// main function +void main(void) +{ + Init(); // Initialize device for the application + LCDMEM[7] = 0x80; // Turn on LCD's Olimex row!!! + +/* + // For debug purpose only! + for(unsigned char j=0;j<10;j++){ + LCDMEM[2] = char_gen_10_11[j]; // LCD -> Digit 11 + LCDMEM[3] = char_gen_10_11[j]; // LCD -> Digit 10 + LCDMEM[4] = char_gen_8_9[j]; // LCD -> Digit 9 + LCDMEM[5] = char_gen_8_9[j]; // LCD -> Digit 8 + + LCDMEM[7] = ((char)(char_gen_1_7[j]>>8)); // LCD -> Digit 7 High Byte + LCDMEM[6] = ((char)(char_gen_1_7[j]&0x00FF)); // LCD -> Digit 7 Low Byte + LCDMEM[9] = ((char)(char_gen_1_7[j]>>8)); // LCD -> Digit 6 High Byte + LCDMEM[8] = ((char)(char_gen_1_7[j]&0x00FF)); // LCD -> Digit 6 Low Byte + LCDMEM[11] = ((char)(char_gen_1_7[j]>>8)); // LCD -> Digit 5 High Byte + LCDMEM[10] = ((char)(char_gen_1_7[j]&0x00FF)); // LCD -> Digit 5 Low Byte + //LCDMEM[13] = ((char)(char_gen_1_7[j]>>8)); // LCD -> Digit 4 High Byte + //LCDMEM[12] = ((char)(char_gen_1_7[j]&0x00FF)); // LCD -> Digit 4 Low Byte + //LCDMEM[15] = ((char)(char_gen_1_7[j]>>8)); // LCD -> Digit 3 High Byte + //LCDMEM[14] = ((char)(char_gen_1_7[j]&0x00FF)); // LCD -> Digit 3 Low Byte + //LCDMEM[17] = ((char)(char_gen_1_7[j]>>8)); // LCD -> Digit 2 High Byte + //LCDMEM[16] = ((char)(char_gen_1_7[j]&0x00FF)); // LCD -> Digit 2 Low Byte + } +*/ + + while(1) + { + __bis_SR_register(LPM0_bits); // Enter LPM0 needed for UART TX completion + __no_operation(); + + Dataout = filterlp(Datain); // Lowpass FIR filter for filtering out 60Hz + Dataout_pulse = filterhp(Dataout)-128; // Highpass FIR filter to filter muscle artifacts + Dataout = Dataout >> 6; // Scale Dataout to use scope program + if(Dataout > 255) Dataout = 255; // Set boundary 255 max + if(Dataout < 0) Dataout = 0; // Set boundary 0 min + //DAC12_0DAT = Dataout; // For scope display + //TXBUF0 = Dataout; // Transmit via UART0 for Scope display + + // send the data as ascii values + TXBUF0 = (Dataout / 100) + 48; // hundreds + while (!(IFG1 & UTXIFG0)); // wait for transmission + TXBUF0 = ((Dataout / 10) % 10 ) + 48; // tens + while (!(IFG1 & UTXIFG0)); + TXBUF0 = ((Dataout / 1) % 10 ) + 48; // ones + while (!(IFG1 & UTXIFG0)); + TXBUF0 = 32; // send a blank + while (!(IFG1 & UTXIFG0)); + TXBUF0 = ((heartrate & 0xf00) >> 8) + 48; + while (!(IFG1 & UTXIFG0)); + TXBUF0 = ((heartrate & 0xf0) >> 4) + 48; + while (!(IFG1 & UTXIFG0)); + TXBUF0 = (heartrate & 0x0f) + 48; + while (!(IFG1 & UTXIFG0)); + TXBUF0 = 10; // send a \n + + + counter++; // Debounce counter + pulseperiod++; // Pulse period counter + if (Dataout_pulse > 110) // Check if above threshold (48) + { + LCDMEM[1] = 0xF0; // Heart beat detected enable "<^>" on LCD + counter = 0; // Reset debounce counter + } + if (counter == 128) // Allow 128 sample debounce time + { + LCDMEM[1] = 0x00; // Disable "<^>" on LCD for blinking effect + beats++; + if (beats == 3) + { + beats = 0; + // heartrate = itobcd(30720/pulseperiod); // Calculate beat to beat heart rate per min + //heartrate = itobcd(92160/pulseperiod); // Calculate 3 beat average heart rate per min + heartrate = itobcd(50720/pulseperiod); // Calculate 3 beat average heart rate per min + //heartrate = (92160/pulseperiod); // Calculate 3 beat average heart rate per min + pulseperiod = 0; // Reset pulse period for next measurement + + ///* + LCDMEM[2] = char_gen_10_11[heartrate & 0x0f]; // Display current heart rate units -> LCD Digit 11 + LCDMEM[3] = char_gen_10_11[(heartrate & 0xf0) >> 4]; // tens -> LCD Digit 10 + LCDMEM[4] = char_gen_8_9[(heartrate & 0xf00) >> 8]; // hundreds -> LCD Digit 9 + + LCDMEM[7] = ((char)(char_gen_1_7[heartrate & 0x0f]>>8)); // LCD -> Digit 7 High Byte + LCDMEM[6] = ((char)(char_gen_1_7[heartrate & 0x0f]&0x00FF)); // LCD -> Digit 7 Low Byte + LCDMEM[9] = ((char)(char_gen_1_7[((heartrate & 0xf0) >> 4)]>>8)); // LCD -> Digit 6 High Byte + LCDMEM[8] = ((char)(char_gen_1_7[((heartrate & 0xf0) >> 4)]&0x00FF)); // LCD -> Digit 6 Low Byte + LCDMEM[11] = ((char)(char_gen_1_7[((heartrate & 0xf00) >> 8)]>>8)); // LCD -> Digit 5 High Byte + LCDMEM[10] = ((char)(char_gen_1_7[((heartrate & 0xf00) >> 8)]&0x00FF)); // LCD -> Digit 5 Low Byte + //*/ + + } + } + } +}//main + +// Initialization function +void Init( void ) +{ + FLL_CTL0 |= XCAP10PF; // Set load capacitance for xtal + WDTCTL = WDTPW | WDTHOLD; // Disable the Watchdog + while ( LFOF & FLL_CTL0); // wait for watch crystal to stabilize + SCFQCTL = 63; // 32 x 32768 x 2 = 2.097152MHz + BTCTL = BT_fLCD_DIV128; // Set LCD frame freq = ACLK/128 +// Initialize and enable LCD peripheral + ClearLCD(); // Clear LCD memory + LCDCTL = LCDSG0_3 + LCD4MUX + LCDON ; // 4mux LCD, segs0-23 enabled +// Initialize and enable GPIO ports + P1OUT = 0x00 + BIT3; // Clear P1OUT register, INA turned ON + P1DIR = 0x3f; // Unused pins as outputs, Comparator pins as inputs + P2OUT = 0x00; // Clear P2OUT register + P2DIR = 0xff; // Unused pins as outputs + P2DIR = ~(PB_2_0+PB_2_1); // P2.0 and P2.1 push buttons + P2IES = 0x00; // Interrupt edge low to high transition + P2IFG = 0x00; // Clear pending P2 interrupts + P2IE = PB_2_0 | PB_2_1; // Enable intterupts for push buttons + P3OUT = 0x00; // Clear P3OUT register + P3DIR = 0x0f; // Unused pins as outputs except P3.<4-7> -> For the new LCD's received at ~04.10.2012 this must be inputs!! + P4OUT = 0x00; // Clear P4OUT register + P4DIR = 0xff; // Unused pins as outputs + P5OUT = 0x00; // Clear P5OUT register + P5DIR = 0xff; // Unused pins as outputs + P5SEL = 0xfc; // Set Rxx and COM pins for LCD + P6OUT = 0x00; // Clear P6OUT register + P6SEL = 0xff; // P6 = Analog +// Initialize and enable UART + P2SEL|=BIT4; // P2.4 = TXD + UCTL0 |= SWRST; // UART SWRST = 1 + ME1 |= UTXE0; // Enable UART0 TXD + UCTL0 |= CHAR; // 8-bit char, SWRST=1 + UTCTL0 |= SSEL1; // UCLK = SMCLK + UBR00 = 18; // 115200 from 2.097152MHz + UBR10 = 0; + UMCTL0 = 0x2c; // Modulation = 0.2044 + UCTL0 &= ~SWRST; // UART SWRST = 0, enable UART + IFG1 &= ~UTXIFG0; +// Initialize and enable ADC12 + ADC12CTL0 = ADC12ON + SHT0_4 + REFON + REF2_5V; + // ADC12 ON, Reference = 2.5V for DAC0 + ADC12CTL1 = SHP + SHS_1 + CONSEQ_2; // Use sampling timer, TA1 trigger + ADC12MCTL0 = INCH_1 + SREF_1; // Vref, channel = 1 = OA0 Out + ADC12IE = BIT0; // Enable interrupt for ADC12 MEM0 + ADC12CTL0 |= ENC; // Enable conversions +// Initialize and enable Timer_A + TACTL = TASSEL0 + MC_1 + TACLR; // ACLK, Clear TAR, Up Mode + TACCTL1 = OUTMOD_2; // Set / Reset + TACCR0 = 63; // 512 samples per second + TACCR1 = 15; // +// Initialize and enable DAC12x + DAC12_0CTL = DAC12OPS + DAC12CALON + DAC12IR + DAC12AMP_2 + DAC12ENC;// DAC0 enable + DAC12_1CTL = DAC12CALON + DAC12IR + DAC12AMP_2 + DAC12ENC; // DAC1 enable + DAC12_1DAT = 0x099A; // Offset level = 1.5V for op amp bias +// Initialize and enable opamps + OA0CTL0 = OAP_1 + OAPM_1 + OAADC1; // OA0 enable power mode 1, OA0- = P6.0, 0A0+ = P6.2, OA0O = P6.1 + OA0CTL1 = OARRIP; // General purpose mode, no Rail-to-Rail inputs + OA1CTL0 = OAP_3 + OAPM_1 + OAADC1; // OA1 enable power mode 1, OA1- = P6.4, OA1+ = DAC1, OA1O = P6.3 + OA1CTL1 = OARRIP; // General purpose mode, no Rail-to-Rail inputs + OA2CTL0 = OAP_3 + OAPM_1 + OAADC1; // OA2 enable power mode 1, OA2+ = DAC1, OA2O = P6.5, Select inputs, power mode + OA2CTL1 = OAFC_1 + OARRIP; // Unit gain Mode, no Rail-to-Rail inputs + __enable_interrupt(); // Enable global Interrupts +} //init + +void ClearLCD(void) +{ + int i; // + for( i = 0; i < 20; i++){ // Clear LCDMEM + LCDMEM[i] = 0; // + } +}//clear LCD + +int itobcd(int i) // Convert hex word to BCD. +{ + int bcd = 0; // + char j = 0; // + + while (i > 9) // + { + bcd |= ((i % 10) << j); // + i /= 10; // + j += 4; + } // + return (bcd | (i << j)); // Return converted value +}// itobcd(i) + + +int filterlp(int sample) // Lowpass FIR filter for EKG +{ + static int buflp[32]; // Reserve 32 loactions for circular buffering + static int offsetlp = 0; + long z; + int i; + + buflp[offsetlp] = sample; + z = mul16(coeffslp[8], buflp[(offsetlp - 8) & 0x1F]); + + __no_operation(); + + for (i = 0; i < 8; i++){ + z += mul16(coeffslp[i], buflp[(offsetlp - i) & 0x1F] + buflp[(offsetlp - 16 + i) & 0x1F]); + } + + offsetlp = (offsetlp + 1) & 0x1F; + return z >> 15; // Return filter output +}// int filter + +int filterhp(int samplehp) // Highpass FIR filter for hear rate +{ + static int bufhp[32]; // Reserve 32 loactions for circular buffering + static int offsethp = 0; + long z; + int i; + + bufhp[offsethp] = samplehp; + z = mul16(coeffshp[8], bufhp[(offsethp - 8) & 0x1F]); + + for (i = 0; i < 8; i++){ + z += mul16(coeffshp[i], bufhp[(offsethp - i) & 0x1F] + bufhp[(offsethp - 16 + i) & 0x1F]); + } + + offsethp = (offsethp + 1) & 0x1F; + return z >> 15; // Return filter output +}// int filterhp + +#pragma vector = PORT2_VECTOR +__interrupt void Port2ISR (void) +{ + P2IFG = 0; +}//Push buttons unused + +#pragma vector = ADC_VECTOR // ADC12 ISR +__interrupt void ADC12ISR (void) +{ + Datain = ADC12MEM0; // Store converted value in Datain + __bic_SR_register_on_exit(LPM0_bits); // Exit LPM0 on return +}// ADC12ISR + + diff --git a/mod_ekg_psychose/iar/MOD-EKG_DemoSoft.dep b/mod_ekg_psychose/iar/MOD-EKG_DemoSoft.dep new file mode 100644 index 0000000..7466b10 --- /dev/null +++ b/mod_ekg_psychose/iar/MOD-EKG_DemoSoft.dep @@ -0,0 +1,128 @@ + + + + 2 + 475830264 + + Debug + + $PROJ_DIR$\MOD-EKG_DemoSoft.c + $TOOLKIT_DIR$\inc\msp430xg43x.h + $PROJ_DIR$\Debug\Exe\MOD-EKG_DemoSoft.d43 + $PROJ_DIR$\Debug\Obj\MOD-EKG_DemoSoft.pbd + $PROJ_DIR$\mul.s43 + $TOOLKIT_DIR$\inc\intrinsics.h + $PROJ_DIR$\Debug\Obj\MOD-EKG_DemoSoft.pbi + $TOOLKIT_DIR$\lib\dlib\dl430fn.h + $PROJ_DIR$\Debug\Obj\MOD-EKG_DemoSoft.r43 + $TOOLKIT_DIR$\lib\dlib\dl430fn.r43 + $TOOLKIT_DIR$\inc\in430.h + $PROJ_DIR$\Debug\Exe\MOD-EKG_DemoSoft.ulp + $PROJ_DIR$\Debug\Obj\mul.r43 + $TOOLKIT_DIR$\inc\dlib\c\ymath.h + $TOOLKIT_DIR$\inc\dlib\c\math.h + $TOOLKIT_DIR$\inc\dlib\c\ycheck.h + $TOOLKIT_DIR$\inc\dlib\c\DLib_Defaults.h + $TOOLKIT_DIR$\inc\dlib\c\xencoding_limits.h + $TOOLKIT_DIR$\inc\dlib\c\yvals.h + $TOOLKIT_DIR$\inc\dlib\c\DLib_Threads.h + $TOOLKIT_DIR$\inc\dlib\c\DLib_Product.h + $TOOLKIT_DIR$\inc\dlib\c\xtgmath.h + $TOOLKIT_DIR$\config\linker\lnk430fg439.xcl + $PROJ_DIR$\Debug\Exe\MOD-EKG_DemoSoft.a43 + $PROJ_DIR$\Debug\Exe\MOD-EKG_DemoSoft.hex + $PROJ_DIR$\Debug\Exe\ekg.hex + + + $PROJ_DIR$\MOD-EKG_DemoSoft.c + + + BICOMP + 6 + + + ICC430 + 8 + + + + + BICOMP + 1 10 5 14 15 13 18 16 7 20 17 19 21 + + + ICC430 + 1 10 5 14 15 13 18 16 7 20 17 19 21 + + + + + $PROJ_DIR$\Debug\Exe\MOD-EKG_DemoSoft.d43 + + + XLINK + 22 8 12 9 + + + + + $PROJ_DIR$\mul.s43 + + + A430 + 12 + + + + + $PROJ_DIR$\Debug\Exe\MOD-EKG_DemoSoft.a43 + + + XLINK + 22 8 12 9 + + + + + $PROJ_DIR$\Debug\Exe\MOD-EKG_DemoSoft.hex + + + XLINK + 22 8 12 9 + + + + + [ROOT_NODE] + + + XLINK + 25 + + + ULP430 + 11 + + + + + $PROJ_DIR$\Debug\Exe\ekg.hex + + + XLINK + 22 8 12 9 + + + + + + Release + + + [MULTI_TOOL] + XLINK + + + + + diff --git a/mod_ekg_psychose/iar/MOD-EKG_DemoSoft.ewd b/mod_ekg_psychose/iar/MOD-EKG_DemoSoft.ewd new file mode 100644 index 0000000..8e50d56 --- /dev/null +++ b/mod_ekg_psychose/iar/MOD-EKG_DemoSoft.ewd @@ -0,0 +1,819 @@ + + + + 2 + + Debug + + MSP430 + + 1 + + C-SPY + 4 + + 27 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 430FET + 1 + + 27 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SIM430 + 1 + + 4 + 1 + 1 + + + + + + + + + + + $TOOLKIT_DIR$\plugins\Lcd\lcd.ewplugin + 1 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\SymList\SymList.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + + Release + + MSP430 + + 0 + + C-SPY + 4 + + 27 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 430FET + 1 + + 27 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SIM430 + 1 + + 4 + 1 + 0 + + + + + + + + + + + $TOOLKIT_DIR$\plugins\Lcd\lcd.ewplugin + 1 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\SymList\SymList.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + + + diff --git a/mod_ekg_psychose/iar/MOD-EKG_DemoSoft.ewp b/mod_ekg_psychose/iar/MOD-EKG_DemoSoft.ewp new file mode 100644 index 0000000..774bc6b --- /dev/null +++ b/mod_ekg_psychose/iar/MOD-EKG_DemoSoft.ewp @@ -0,0 +1,2161 @@ + + + + 2 + + Debug + + MSP430 + + 1 + + General + 14 + + 32 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICC430 + 4 + + 37 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A430 + 5 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + XLINK + 4 + + 27 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + XAR + 4 + + 0 + 1 + 1 + + + + + + + ULP430 + 1 + + 1 + 1 + 1 + + + + + + + + + BILINK + 0 + + + + + Release + + MSP430 + + 0 + + General + 14 + + 32 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICC430 + 4 + + 37 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A430 + 5 + + 14 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + XLINK + 4 + + 27 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + XAR + 4 + + 0 + 1 + 0 + + + + + + + ULP430 + 1 + + 1 + 1 + 0 + + + + + + + + + BILINK + 0 + + + + + $PROJ_DIR$\MOD-EKG_DemoSoft.c + + + $PROJ_DIR$\mul.s43 + + + + diff --git a/mod_ekg_psychose/iar/MOD-EKG_DemoSoft.eww b/mod_ekg_psychose/iar/MOD-EKG_DemoSoft.eww new file mode 100644 index 0000000..a488007 --- /dev/null +++ b/mod_ekg_psychose/iar/MOD-EKG_DemoSoft.eww @@ -0,0 +1,10 @@ + + + + + $WS_DIR$\MOD-EKG_DemoSoft.ewp + + + + + diff --git a/mod_ekg_psychose/iar/mul.s43 b/mod_ekg_psychose/iar/mul.s43 new file mode 100644 index 0000000..38de4bf --- /dev/null +++ b/mod_ekg_psychose/iar/mul.s43 @@ -0,0 +1,110 @@ +// +//16x16=>32 multiply +//long mul16(register int x, register int y) +// +// Edited by: M Morales, November 2008 +// * Updated calling conventions in support of IAR compiler >= 4.x +//***************************************************************************** +// THIS PROGRAM IS PROVIDED "AS IS". TI MAKES NO WARRANTIES OR +// REPRESENTATIONS, EITHER EXPRESS, IMPLIED OR STATUTORY, +// INCLUDING ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE, LACK OF VIRUSES, ACCURACY OR +// COMPLETENESS OF RESPONSES, RESULTS AND LACK OF NEGLIGENCE. +// TI DISCLAIMS ANY WARRANTY OF TITLE, QUIET ENJOYMENT, QUIET +// POSSESSION, AND NON-INFRINGEMENT OF ANY THIRD PARTY +// INTELLECTUAL PROPERTY RIGHTS WITH REGARD TO THE PROGRAM OR +// YOUR USE OF THE PROGRAM. +// +// IN NO EVENT SHALL TI BE LIABLE FOR ANY SPECIAL, INCIDENTAL, +// CONSEQUENTIAL OR INDIRECT DAMAGES, HOWEVER CAUSED, ON ANY +// THEORY OF LIABILITY AND WHETHER OR NOT TI HAS BEEN ADVISED +// OF THE POSSIBILITY OF SUCH DAMAGES, ARISING IN ANY WAY OUT +// OF THIS AGREEMENT, THE PROGRAM, OR YOUR USE OF THE PROGRAM. +// EXCLUDED DAMAGES INCLUDE, BUT ARE NOT LIMITED TO, COST OF +// REMOVAL OR REINSTALLATION, COMPUTER TIME, LABOR COSTS, LOSS +// OF GOODWILL, LOSS OF PROFITS, LOSS OF SAVINGS, OR LOSS OF +// USE OR INTERRUPTION OF BUSINESS. IN NO EVENT WILL TI'S +// AGGREGATE LIABILITY UNDER THIS AGREEMENT OR ARISING OUT OF +// YOUR USE OF THE PROGRAM EXCEED FIVE HUNDRED DOLLARS +// (U.S.$500). +// +// Unless otherwise stated, the Program written and copyrighted +// by Texas Instruments is distributed as "freeware". You may, +// only under TI's copyright in the Program, use and modify the +// Program without any charge or restriction. You may +// distribute to third parties, provided that you transfer a +// copy of this license to the third party and the third party +// agrees to these terms by its first use of the Program. You +// must reproduce the copyright notice and any other legend of +// ownership on each copy or partial copy, of the Program. +// +// You acknowledge and agree that the Program contains +// copyrighted material, trade secrets and other TI proprietary +// information and is protected by copyright laws, +// international copyright treaties, and trade secret laws, as +// well as other intellectual property laws. To protect TI's +// rights in the Program, you agree not to decompile, reverse +// engineer, disassemble or otherwise translate any object code +// versions of the Program to a human-readable form. You agree +// that in no event will you alter, remove or destroy any +// copyright notice included in the Program. TI reserves all +// rights not specifically granted under this license. Except +// as specifically provided herein, nothing in this agreement +// shall be construed as conferring by implication, estoppel, +// or otherwise, upon you, any license or other right under any +// TI patents, copyrights or trade secrets. +// +// You may not use the Program in non-TI devices. +//***************************************************************************** + public mul16 + + RSEG CODE +mul16 + +#define x1 r9 +#define z0 r14 +#define z1 r15 +#define x r12 +#define y r13 + + push r9 + + clr z0 + mov z0,z1 + mov z0,x1 + tst x + jge xbooth_2 + mov #-1,x1 + jmp xbooth_2 + +xbooth_6 + add x,z1 + addc x1,z0 +xbooth_1 + rla x + rlc x1 +xbooth_2 + rra y + jc xbooth_5 + jne xbooth_1 + jmp xbooth_4 + +xbooth_5 + sub x,z1 + subc x1,z0 +xbooth_3 + rla x + rlc x1 + rra y + jnc xbooth_6 + cmp #0FFFFh,y + jne xbooth_3 + +xbooth_4 + mov z1,r12 + mov z0,r13 + + pop r9 + + ret + end diff --git a/mod_ekg_psychose/iar/path.txt b/mod_ekg_psychose/iar/path.txt new file mode 100644 index 0000000..e69de29 diff --git a/mod_ekg_psychose/iar/settings/MOD-EKG_DemoSoft.Debug.cspy.bat b/mod_ekg_psychose/iar/settings/MOD-EKG_DemoSoft.Debug.cspy.bat new file mode 100644 index 0000000..bdbe693 --- /dev/null +++ b/mod_ekg_psychose/iar/settings/MOD-EKG_DemoSoft.Debug.cspy.bat @@ -0,0 +1,24 @@ +@REM This batch file has been generated by the IAR Embedded Workbench +@REM C-SPY Debugger, as an aid to preparing a command line for running +@REM the cspybat command line utility using the appropriate settings. +@REM +@REM Note that this file is generated every time a new debug session +@REM is initialized, so you may want to move or rename the file before +@REM making changes. +@REM +@REM You can launch cspybat by typing the name of this batch file followed +@REM by the name of the debug file (usually an ELF/DWARF or UBROF file). +@REM +@REM Read about available command line parameters in the C-SPY Debugging +@REM Guide. Hints about additional command line parameters that may be +@REM useful in specific cases: +@REM --download_only Downloads a code image without starting a debug +@REM session afterwards. +@REM --silent Omits the sign-on message. +@REM --timeout Limits the maximum allowed execution time. +@REM + + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 7.0_2\common\bin\cspybat" "C:\Program Files (x86)\IAR Systems\Embedded Workbench 7.0_2\430\bin\430proc.dll" "C:\Program Files (x86)\IAR Systems\Embedded Workbench 7.0_2\430\bin\430fet.dll" %1 --plugin "C:\Program Files (x86)\IAR Systems\Embedded Workbench 7.0_2\430\bin\430bat.dll" --backend -B "-p" "C:\Program Files (x86)\IAR Systems\Embedded Workbench 7.0_2\430\config\debugger\MSP430FG439.ddf" "--iv_base" "0xFFE0" "-d" "fet" "--erase_main_and_info" "--derivative" "MSP430FG43x_F43x" "--protocol" "4wire" "--eem" "EMEX_LOW" "--port" "Automatic" "--connection" "olimex" "--settlingtime=0" "--msp430_dll" "msp430.dll" "--vccDefault" "3.3" "--jtag_speed" "medium" "--memtype" "F" + + diff --git a/mod_ekg_psychose/iar/settings/MOD-EKG_DemoSoft.cspy.bat b/mod_ekg_psychose/iar/settings/MOD-EKG_DemoSoft.cspy.bat new file mode 100644 index 0000000..e68ae66 --- /dev/null +++ b/mod_ekg_psychose/iar/settings/MOD-EKG_DemoSoft.cspy.bat @@ -0,0 +1,34 @@ +@REM This bat file has been generated by the IAR Embeddded Workbench +@REM C-SPY interactive debugger,as an aid to preparing a command +@REM line for running the cspybat command line utility with the +@REM appropriate settings. +@REM +@REM After making some adjustments to this file, you can launch cspybat +@REM by typing the name of this file followed by the name of the debug +@REM file (usually an ubrof file). Note that this file is generated +@REM every time a new debug session is initialized, so you may want to +@REM move or rename the file before making changes. +@REM +@REM Note: some command line arguments cannot be properly generated +@REM by this process. Specifically, the plugin which is responsible +@REM for the Terminal I/O window (and other C runtime functionality) +@REM comes in a special version for cspybat, and the name of that +@REM plugin dll is not known when generating this file. It resides in +@REM the $TOOLKIT_DIR$\bin folder and is usually called XXXbat.dll or +@REM XXXlibsupportbat.dll, where XXX is the name of the corresponding +@REM tool chain. Replace the '' parameter +@REM below with the appropriate file name. Other plugins loaded by +@REM C-SPY are usually not needed by, or will not work in, cspybat +@REM but they are listed at the end of this file for reference. + + +"C:\Program Files\IAR Systems\IAR Embedded Workbench for MSP, v4.21 Evaluation version\common\bin\cspybat" "C:\Program Files\IAR Systems\IAR Embedded Workbench for MSP, v4.21 Evaluation version\430\bin\430proc.dll" "C:\Program Files\IAR Systems\IAR Embedded Workbench for MSP, v4.21 Evaluation version\430\bin\430fet.dll" %1 --plugin "C:\Program Files\IAR Systems\IAR Embedded Workbench for MSP, v4.21 Evaluation version\430\bin\" --backend -B "-p" "C:\Program Files\IAR Systems\IAR Embedded Workbench for MSP, v4.21 Evaluation version\430\config\MSP430FG439.ddf" "--iv_base" "0xFFE0" "-d" "fet" "--erase_main_and_info" "--derivative" "MSP430FG439" "--vccvoltage=3.3" "--protocol" "4wire" "--eem" "EMEX_LOW" "--connection" "olimex" "--settlingtime=0" + + +@REM Loaded plugins: +@REM C:\Program Files\IAR Systems\IAR Embedded Workbench for MSP, v4.21 Evaluation version\430\bin\430libsupport.dll +@REM C:\Program Files\IAR Systems\IAR Embedded Workbench for MSP, v4.21 Evaluation version\430\plugins\lcd\lcd.dll +@REM C:\Program Files\IAR Systems\IAR Embedded Workbench for MSP, v4.21 Evaluation version\common\plugins\CodeCoverage\CodeCoverage.dll +@REM C:\Program Files\IAR Systems\IAR Embedded Workbench for MSP, v4.21 Evaluation version\common\plugins\Profiling\Profiling.dll +@REM C:\Program Files\IAR Systems\IAR Embedded Workbench for MSP, v4.21 Evaluation version\common\plugins\stack\stack.dll +@REM C:\Program Files\IAR Systems\IAR Embedded Workbench for MSP, v4.21 Evaluation version\common\plugins\SymList\SymList.dll diff --git a/mod_ekg_psychose/iar/settings/MOD-EKG_DemoSoft.dbgdt b/mod_ekg_psychose/iar/settings/MOD-EKG_DemoSoft.dbgdt new file mode 100644 index 0000000..ad1fd54 --- /dev/null +++ b/mod_ekg_psychose/iar/settings/MOD-EKG_DemoSoft.dbgdt @@ -0,0 +1,89 @@ + + + + + + + + + 201221 + + + + + + 2091524461 + + + + + + + 174272727 + + + + + + 100Disassembly_I05002011 + + + + + + + + + TabID-32631-32423 + Debug Log + Debug-Log + + + + TabID-32108-32433 + Build + Build + + + + + 0 + + + TabID-10611-32426 + Workspace + Workspace + + + MOD-EKG_DemoSoft + + + + 0 + + + TabID-21360-32430 + Disassembly + Disassembly + + + + + 0 + + + + + + TextEditor$WS_DIR$\MOD-EKG_DemoSoft.c00000249115951159500100000010000001 + + + + + + + iaridepm.enu1debuggergui.enu1430fet1-2-2562248-2-2250175156250211353156250681159-2-2562248-2-2250175156250211353156250681159-2-21731602-2-216041751002500211353156250211353 + + + + diff --git a/mod_ekg_psychose/iar/settings/MOD-EKG_DemoSoft.dni b/mod_ekg_psychose/iar/settings/MOD-EKG_DemoSoft.dni new file mode 100644 index 0000000..82319a6 --- /dev/null +++ b/mod_ekg_psychose/iar/settings/MOD-EKG_DemoSoft.dni @@ -0,0 +1,94 @@ +[Interrupts] +Enabled=1 +[MemoryMap] +Enabled=0 +Base=0 +UseAuto=0 +TypeViolation=1 +UnspecRange=1 +ActionState=1 +[TraceHelper] +Enabled=0 +ShowSource=1 +[DebugChecksum] +Checksum=-1742591943 +[State Storage] +Control Register=5814 +[Sequencer] +Control Register=0 +NextState0=0 +NextState1=0 +[Action Register] +Break=0 +State Storage=0 +[DisAssemblyWindow] +NumStates=_ 1 +State 1=_ 1 +[InstructionProfiling] +Enabled=_ 0 +[CodeCoverage] +Enabled=_ 0 +[Profiling] +Enabled=0 +[StackPlugin] +Enabled=1 +OverflowWarningsEnabled=1 +WarningThreshold=90 +SpWarningsEnabled=1 +WarnHow=0 +UseTrigger=1 +TriggerName=main +LimitSize=0 +ByteLimit=50 +[Stack] +FillEnabled=0 +OverflowWarningsEnabled=1 +WarningThreshold=90 +SpWarningsEnabled=1 +WarnLogOnly=1 +UseTrigger=1 +TriggerName=main +LimitSize=0 +ByteLimit=50 +[EEM State Storage] +Buffer=BAAAAAAADAAAAAAAAAAAAAAA +[EEM Sequencer] +Buffer=AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +[NumberOfSequencerBp] +Number=4 +[Breakpoints] +Count=0 +[FET] +Clock mode=46 +Extended Clock mode=65535 +Secure Password= +Extended Clock Control Enable=1 +Advanced Extended Clock Control=0 +Emulation mode=0 +Free running=0 +Shutting Down=3 +[Memory Dump] +Start address= +Lenghth= +Address info=0 +Format=0 +Dump registers=0 +PC=0 +SP=0 +SR=0 +all registers=0 +File name= +[Log file] +LoggingEnabled=_ 0 +LogFile=_ "" +Category=_ 0 +[TermIOLog] +LoggingEnabled=_ 0 +LogFile=_ "" +[Aliases] +Count=0 +SuppressDialog=0 +[CallStack] +ShowArgs=0 +[Disassembly] +MixedMode=1 diff --git a/mod_ekg_psychose/iar/settings/MOD-EKG_DemoSoft.wsdt b/mod_ekg_psychose/iar/settings/MOD-EKG_DemoSoft.wsdt new file mode 100644 index 0000000..5dc5a36 --- /dev/null +++ b/mod_ekg_psychose/iar/settings/MOD-EKG_DemoSoft.wsdt @@ -0,0 +1,77 @@ + + + + + + MOD-EKG_DemoSoft/Debug + + + + + + + + + 318272727 + + + + + + + 2091524461 + + + + 201221 + + 44062754 + + + + + + + TabID-5007-30075 + Workspace + Workspace + + + MOD-EKG_DemoSoftMOD-EKG_DemoSoft/OutputMOD-EKG_DemoSoft/Output/MOD-EKG_DemoSoft.d43 + + + + 0 + + + TabID-616-32204 + Build + Build + + + + TabID-32338-32224 + Debug Log + Debug-Log + + + TabID-552-6144Find in FilesFind-in-Files + + 0 + + + + + + TextEditor$WS_DIR$\MOD-EKG_DemoSoft.c00000199119051190500100000010000001 + + + + + + + iaridepm.enu1-2-2630392-2-2250175156250211353246250763285-2-21531602-2-216041551002500187198156250211353 + + + + diff --git a/mod_ekg_psychose/iar/settings/MOD-EKG_DemoSoft.wspos b/mod_ekg_psychose/iar/settings/MOD-EKG_DemoSoft.wspos new file mode 100644 index 0000000..2c8cfad --- /dev/null +++ b/mod_ekg_psychose/iar/settings/MOD-EKG_DemoSoft.wspos @@ -0,0 +1,2 @@ +[MainWindow] +WindowPlacement=_ 25 25 1225 657 3 diff --git a/sensors2osc/sensors2osc/ehealth2osc.py b/sensors2osc/sensors2osc/ehealth2osc.py index e65fc54..ff1bb6f 100644 --- a/sensors2osc/sensors2osc/ehealth2osc.py +++ b/sensors2osc/sensors2osc/ehealth2osc.py @@ -79,14 +79,14 @@ def main(): try: - temp = int(temp) + temp = float(temp) except ValueError, msg: logger.exception(msg) continue try: - osc_message = OSCMessage("/%s/temperatur" % actor) - osc_message.appendTypedArg(temp, "i") + osc_message = OSCMessage("/%s/temperature" % actor) + osc_message.appendTypedArg(temp, "f") platform.osc_sock.sendto(osc_message.encode_osc(), platform.remote) except socket.error, msg: logger.exception(msg) diff --git a/sensors2osc/sensors2osc/main.py b/sensors2osc/sensors2osc/main.py index 01a0606..e726c14 100644 --- a/sensors2osc/sensors2osc/main.py +++ b/sensors2osc/sensors2osc/main.py @@ -73,7 +73,7 @@ class EHealth2OSC(Forwarder): osc_message = OSCMessage("/%s/emg" % self.actor) osc_message.appendTypedArg(emg, "i") osc_sock.sendall(osc_message.encode_osc()) - osc_message = OSCMessage("/%s/temperatur" % self.actor) + osc_message = OSCMessage("/%s/temperature" % self.actor) osc_message.appendTypedArg(temp, "i") osc_sock.sendall(osc_message.encode_osc()) diff --git a/sensors2osc/sensors2osc/sensorTest.py b/sensors2osc/sensors2osc/sensorTest.py index 79ab7b7..5602db4 100644 --- a/sensors2osc/sensors2osc/sensorTest.py +++ b/sensors2osc/sensors2osc/sensorTest.py @@ -75,7 +75,7 @@ class EHealth2OSC(Forwarder): osc_message = OSCMessage("/%s/emg" % self.actor) osc_message.appendTypedArg(emg, "i") osc_sock.sendall(osc_message.encode_osc()) - osc_message = OSCMessage("/%s/temperatur" % self.actor) + osc_message = OSCMessage("/%s/temperature" % self.actor) osc_message.appendTypedArg(temp, "i") osc_sock.sendall(osc_message.encode_osc())