diff --git a/.classpath b/.classpath
index 0eb4515..82f2ca1 100644
--- a/.classpath
+++ b/.classpath
@@ -3,5 +3,6 @@
+
diff --git a/.project b/.project
index ed216f2..8a73758 100644
--- a/.project
+++ b/.project
@@ -1,6 +1,6 @@
- org.hwo.pulscounter
+ org.hwo.pulscounter2
diff --git a/src/org/hwo/pulscounter/IPCController.java b/src/org/hwo/pulscounter/IPCController.java
new file mode 100644
index 0000000..fa129d5
--- /dev/null
+++ b/src/org/hwo/pulscounter/IPCController.java
@@ -0,0 +1,7 @@
+package org.hwo.pulscounter;
+
+public interface IPCController {
+
+ void shutdownService(int exitCode);
+
+}
diff --git a/src/org/hwo/pulscounter/IPulsCounter.java b/src/org/hwo/pulscounter/IPulsCounter.java
index 82748d0..85498c8 100644
--- a/src/org/hwo/pulscounter/IPulsCounter.java
+++ b/src/org/hwo/pulscounter/IPulsCounter.java
@@ -1,24 +1,30 @@
package org.hwo.pulscounter;
+import org.hwo.bitfields.BitField;
+import org.hwo.io.SerialPortExeption;
+
public interface IPulsCounter {
public String[] getDeviceName();
- public int getChannels();
+ public void close();
- public String getChannelName(Integer channel);
- public void setChannelName(Integer channel,String name);
+ public int getChannels() throws SerialPortExeption;
+
+ public String getChannelName(Integer channel) throws SerialPortExeption;
+ public void setChannelName(Integer channel,String name) throws SerialPortExeption;
- public int[] getChannelCounters();
- public void setChannelCounter(Integer channel,Integer count);
+ public int[] getChannelCounters() throws SerialPortExeption;
+ public void setChannelCounter(Integer channel,Integer count) throws SerialPortExeption;
- public int[] getChannelOffsets();
- public void setChannelOffset(Integer channel,Integer offset);
+ public int[] getChannelOffsets() throws SerialPortExeption;
+ public void setChannelOffset(Integer channel,Integer offset) throws SerialPortExeption;
- public String getPhysicalInterfaceName();
- public void setPhysicalInterfaceName(String interfaceName);
+ public String getPhysicalInterfaceName() throws SerialPortExeption;
+ public void setPhysicalInterfaceName(String interfaceName) throws SerialPortExeption;
- public String[] getPhysicalInterfaceNames();
+ public String[] getPhysicalInterfaceNames() throws SerialPortExeption;
+ public Integer getPhysicalInputs() throws SerialPortExeption;
}
diff --git a/src/org/hwo/pulscounter/NewPulsCounterDevice.java b/src/org/hwo/pulscounter/NewPulsCounterDevice.java
index bf95897..db9fcbc 100644
--- a/src/org/hwo/pulscounter/NewPulsCounterDevice.java
+++ b/src/org/hwo/pulscounter/NewPulsCounterDevice.java
@@ -14,7 +14,9 @@ import java.util.List;
import java.util.Properties;
import java.util.Random;
+import org.hwo.bitfields.BitField;
import org.hwo.io.SerialPort;
+import org.hwo.io.SerialPortExeption;
import org.hwo.io.servicelink.ServiceLink;
import org.hwo.io.servicelink.ServiceLinkException;
import org.hwo.io.servicelink.ServiceLinkRequestFailedException;
@@ -41,22 +43,12 @@ public class NewPulsCounterDevice implements IPulsCounter {
setPhysicalInterfaceName(defaultPort);
}
-
- synchronized public void reset(int ch)
- {
+
+ public void close(){
+ if (this.serviceLink != null)
+ this.serviceLink.close();
}
-
- synchronized public void reset()
- {
- }
-
-
- synchronized public void update()
- {
- System.err.println(String.format("BRKVAL: 0x%04x", serviceLink.getServiceRegisterCache().getCachedInteger((byte)0, (byte)0, (short)0x200)));
- System.err.println(String.format("SPLIM : 0x%04x", serviceLink.getServiceRegisterCache().getCachedInteger((byte)0, (byte)0, (short)0x201)));
- }
-
+
private void saveProps(){
File pf = new File("chnames.prop");
try {
@@ -72,6 +64,13 @@ public class NewPulsCounterDevice implements IPulsCounter {
if (!serviceLink.isOpen())
try {
serviceLink.open();
+ serviceLink.getSerialPort().setTimeout(250);
+ try {
+ Thread.sleep(500);
+ } catch (InterruptedException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
} catch (ServiceLinkException e) {
e.printStackTrace();
}
@@ -101,16 +100,18 @@ public class NewPulsCounterDevice implements IPulsCounter {
this.serviceLink.setSerialPort(serialPort);;
this.serviceLink.open();
+ this.serviceLink.getSerialPort().setTimeout(500);
- try {
+/* try {
this.serviceLink.readInt((byte)0, (byte)0, 0);
} catch (IOException e) {
e.printStackTrace();
}
-
+ */
System.err.println("BRKVAL: " + this.serviceLink.getServiceRegisterCache().getCachedInteger(13, 0, 0x0020));
System.err.println("SPLIM: " + this.serviceLink.getServiceRegisterCache().getCachedInteger(13, 0, 0x0021));
-
+ System.err.println("tCounter: " + this.serviceLink.getServiceRegisterCache().getCachedInteger(13, 0, 0x0500));
+ System.err.println("tInterface:" + this.serviceLink.getServiceRegisterCache().getCachedInteger(13, 0, 0x0501));
}
@Override
@@ -135,9 +136,13 @@ public class NewPulsCounterDevice implements IPulsCounter {
int[] counters = new int[ nch ];
for (int i=0;i options = Arrays.asList(args).iterator();
while (options.hasNext()) {
@@ -81,39 +124,181 @@ public class PulsCounter {
if (no.equals("-s")) {
serverMode = true;
+ guiMode = false;
+ } else if (no.equals("-bo")) {
+ serverMode = false;
+ startLocalService = false;
+ } else if (no.equals("-b")) {
+ batchMode = true;
+ } else if (no.equals("-c")) {
+ batchConvert = true;
+ batchConvertTarget = options.next();
+ } else if (no.equals("-f")){
+ batchFilename = options.next();
+ } else if (no.equals("-n")){
+ networkName = options.next();
+ startLocalService = false;
+ } else if (no.equals("-l")){
+ logFile = options.next();
+ } else if (no.equals("-u")){
+ startLocalService = true;
+ } else if (no.equals("-d")){
+ debugMode = true;
+ }
+ }
+
+ if (logFile != null){
+ try {
+ PrintStream logStream = new PrintStream(new FileOutputStream(logFile, true));
+ System.setErr(logStream);
+
+ } catch (FileNotFoundException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
}
}
-
- deviceConnection = null;
- beacon = new Beacon(44556);
- beacon.getProperties().setProperty("rpc.simple.interfaces", "org.hwo.pulsecounter");
- beacon.getProperties().setProperty("rpc.simple.port", "44352");
- beacon.setServerOnly(serverMode);
- beacon.start();
-
- try {
- NewPulsCounterDevice device = new NewPulsCounterDevice();
-
- SimpleRPCServer rpcserver = new SimpleRPCServer(InetAddress.getByName("0.0.0.0"), 44352);
- rpcserver.registerObject(IPulsCounter.class, device);
- rpcserver.start();
+
+
+
+ if (batchMode)
+ guiMode = false;
+
+
+
+ localService = new PulsCounterService();
+
+ if (startLocalService){
+ localService.start();
- } catch (UnknownHostException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
}
-
- if (!serverMode) {
+
+ if (batchMode) {
+ batchrun();
+ } else if (guiMode){
PulsCounterWindow window = new PulsCounterWindow();
window.setVisible(true);
}
+ if (batchConvert) {
+ batchConvert(batchFilename,batchConvertTarget);
+ }
+ }
+
+ private static void batchrun(){
+
+ if (networkName == null) {
+ // TODO: Use UUID from preferences to select network service
+ } else {
+ Beacon clientBeacon = new Beacon(44556);
+ clientBeacon.setClientOnly(true);
+ clientBeacon.start();
+
+ for (int i=0;i<120;i++){
+ if (clientBeacon.getSenderByName(networkName) != null)
+ break;
+
+ try {
+ Thread.sleep(100);
+ } catch (InterruptedException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+
+ BeaconSender sender = clientBeacon.getSenderByName(networkName);
+ if (sender == null) {
+ System.err.println("Networknode: " + networkName + " is offline.");
+ clientBeacon.exit();
+ return;
+ }
+
+ IPulsCounter ipc = createProxyFromBeaconSender(sender);
+
+ Date d = new Date();
+ String time = String.format("%04d-%02d-%02d %02d:%02d:%02d",d.getYear()+1900,d.getMonth()+1,d.getDate(),d.getHours(),d.getMinutes(),d.getSeconds());
+
+
+ try {
+
+ CounterChannel[] channels = new CounterChannel[ ipc.getChannels() ];
+ int[] values = ipc.getChannelCounters();
+
+ try {
+ File csvfile = new File(batchFilename);
+ boolean newfile = !csvfile.exists();
+ BufferedWriter writer = new BufferedWriter(new FileWriter(csvfile,true));
+
+ if (newfile){
+
+ writer.write("Zeitpunkt");
+
+ for (int i=0;i0)
+ writer.write("\t");
+
+ writer.write(String.format("%d",values[i]));
+ }
+ writer.write("\r\n");
+ writer.flush();
+
+ writer.close();
+
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ } catch (SerialPortExeption sex){
+ System.err.println(sex);
+ sex.printStackTrace();
+ } catch (Exception e) {
+ System.err.println(e);
+ e.printStackTrace();
+ }
+
+
+ clientBeacon.exit();
+ }
+
+ }
+
+ public static void batchConvert(String source,String target){
+
+ CSV csv = new CSV();
+ csv.setSeparator('\t');
+ csv.readFromFile(source);
+
+ for (int i=csv.getRecords().size()-1;i>1;--i){
+ for (int j=1;j appSettingsListeners;
+
+ public PulsCounter2Application(){
+ appSettingsListeners = new LinkedList();
+ }
+
+ public void addAppSettingsListener(AppSettingsListener listener){
+ appSettingsListeners.add(listener);
+ }
+ public void removeAppSettingsListener(AppSettingsListener listener){
+ appSettingsListeners.remove(listener);
+ }
+
+ private void fireServiceLinkChanged(){
+ for (AppSettingsListener l: appSettingsListeners){
+ l.ServiceLinkChanged(serviceLink);
+ }
+ }
+
+ public synchronized SerialPort getSerialPort() {
+ return serialPort;
+ }
+ public synchronized void setSerialPort(SerialPort serialPort) {
+ if (serviceLink != null){
+ serviceLink.close();
+ serviceLink = null;
+ }
+ this.serialPort = serialPort;
+
+ fireServiceLinkChanged();
+ }
+
+ public synchronized ServiceLink getServiceLink() {
+ if (serviceLink == null){
+ if (serialPort != null){
+ serviceLink = new ServiceLink(serialPort);
+ serviceLink.getSerialPort().setTimeout(200);
+ }
+ }
+ return serviceLink;
+ }
+ public synchronized void setServiceLink(ServiceLink serviceLink) {
+ if (serviceLink != null){
+ serviceLink.close();
+ }
+ this.serviceLink = serviceLink;
+
+ fireServiceLinkChanged();
+ }
+
+
+
+}
diff --git a/src/org/hwo/pulscounter/TimeBarrier.java b/src/org/hwo/pulscounter/TimeBarrier.java
index 6878390..37b4bae 100644
--- a/src/org/hwo/pulscounter/TimeBarrier.java
+++ b/src/org/hwo/pulscounter/TimeBarrier.java
@@ -41,7 +41,7 @@ public class TimeBarrier {
CSV csv = new CSV();
for (CounterChannel channel: channels)
{
- csv.getCells().add(new String[]{channel.getChannel().toString(),channel.getValue().toString(),channel.getCorrect().toString(),channel.correctedValue().toString()});
+// csv.getRecords().add(new String[]{channel.getChannel().toString(),channel.getValue().toString(),channel.getCorrect().toString(),channel.correctedValue().toString()});
}
csv.saveToStream(output);
}
diff --git a/src/org/hwo/pulscounter/application/InspectorApplication.java b/src/org/hwo/pulscounter/application/InspectorApplication.java
new file mode 100644
index 0000000..b477206
--- /dev/null
+++ b/src/org/hwo/pulscounter/application/InspectorApplication.java
@@ -0,0 +1,87 @@
+package org.hwo.pulscounter.application;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.LinkedList;
+import java.util.List;
+
+import org.hwo.pulscounter.elements.WorkShift;
+
+public class InspectorApplication {
+ List workShifts;
+
+ Connection db;
+
+ public InspectorApplication(){
+ workShifts = new LinkedList();
+/*
+ workShifts.add(new WorkShift());
+ workShifts.add(new WorkShift());
+
+ workShifts.get(0).setName("Frühschicht");
+ workShifts.get(0).getBegins().setHours(6);
+ workShifts.get(0).getBegins().setMinutes(0);
+ workShifts.get(0).getEnds().setHours(15);
+ workShifts.get(0).getEnds().setMinutes(0);
+ workShifts.get(1).setName("Frühschicht");
+ workShifts.get(1).getBegins().setHours(15);
+ workShifts.get(1).getBegins().setMinutes(0);
+ workShifts.get(1).getEnds().setHours(3);
+ workShifts.get(1).getEnds().setMinutes(0);
+ */
+ connect();
+
+ try {
+ Statement stat = db.createStatement();
+ ResultSet result = stat.executeQuery("SELECT * from workshifts");
+
+ while (result.next()){
+ WorkShift shift = new WorkShift();
+ shift.setName(result.getString("name"));
+ shift.getBegins().setTime( result.getTime("begins"));
+ shift.getEnds().setTime( result.getTime("ends"));
+ workShifts.add(shift);
+ }
+
+ result.close();
+ stat.close();
+
+ } catch (Exception e)
+ {
+ e.printStackTrace();
+ }
+ }
+
+ public void connect(){
+ try {
+ Class.forName("org.postgresql.Driver");
+
+ db = DriverManager.getConnection("jdbc:postgresql://10.112.1.1/pulscounter", "haraldwolff","diekleinefeine");
+ } catch (ClassNotFoundException e) {
+ e.printStackTrace();
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public WorkShift[] getWorkShifts(){
+ return workShifts.toArray(new WorkShift[0]);
+ }
+
+
+ public Connection getConnection() {
+ return db;
+ }
+
+
+
+}
+
+/***
+
+ properties.put("hibernate.connection.driver", "org.postgresql.Driver");
+ properties.put("hibernate.connection.url", );
+***/
\ No newline at end of file
diff --git a/src/org/hwo/pulscounter/elements/RawValueEntry.java b/src/org/hwo/pulscounter/elements/RawValueEntry.java
new file mode 100644
index 0000000..6fdaad0
--- /dev/null
+++ b/src/org/hwo/pulscounter/elements/RawValueEntry.java
@@ -0,0 +1,11 @@
+package org.hwo.pulscounter.elements;
+
+import org.hwo.datetime.DateTime;
+
+public class RawValueEntry {
+
+ int channel;
+ DateTime dateTime;
+ int value;
+
+}
diff --git a/src/org/hwo/pulscounter/elements/WorkShift.java b/src/org/hwo/pulscounter/elements/WorkShift.java
new file mode 100644
index 0000000..f93c354
--- /dev/null
+++ b/src/org/hwo/pulscounter/elements/WorkShift.java
@@ -0,0 +1,73 @@
+package org.hwo.pulscounter.elements;
+
+import org.hwo.datetime.Date;
+import org.hwo.datetime.TimeOfDay;
+import org.hwo.datetime.DateTime;
+
+
+public class WorkShift {
+
+ private String name;
+ private String comment;
+
+ private TimeOfDay begins;
+ private TimeOfDay ends;
+
+ public WorkShift(){
+ this.name = "";
+ this.comment = "";
+ this.begins = new TimeOfDay();
+ this.ends = new TimeOfDay();
+ }
+
+ public boolean isOverMidnight(){
+ return ends.isEarlierThan(begins);
+ }
+
+ public String getName() {
+ return name;
+ }
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getComment() {
+ return comment;
+ }
+ public void setComment(String comment) {
+ this.comment = comment;
+ }
+
+ public TimeOfDay getBegins() {
+ return begins;
+ }
+ public void setBegins(TimeOfDay begins) {
+ this.begins = begins;
+ }
+
+ public TimeOfDay getEnds() {
+ return ends;
+ }
+ public void setEnds(TimeOfDay ends) {
+ this.ends = ends;
+ }
+
+ public DateTime getShiftBegins(Date date){
+ DateTime dt = new DateTime(date, begins);
+ return dt;
+ }
+
+ public DateTime getShiftEnds(Date date){
+ DateTime dt = new DateTime(date, ends);
+ if (isOverMidnight()){
+ dt.getDate().addDays(1);
+ }
+ return dt;
+ }
+
+ @Override
+ public String toString() {
+ return this.name;
+ }
+
+}
diff --git a/src/org/hwo/pulscounter/elements/WorkShiftRecord.java b/src/org/hwo/pulscounter/elements/WorkShiftRecord.java
new file mode 100644
index 0000000..8c1707e
--- /dev/null
+++ b/src/org/hwo/pulscounter/elements/WorkShiftRecord.java
@@ -0,0 +1,131 @@
+package org.hwo.pulscounter.elements;
+
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.Hashtable;
+import java.util.LinkedList;
+import java.util.List;
+
+import org.hwo.datetime.Date;
+import org.hwo.datetime.DateTime;
+import org.hwo.pulscounter.PulsCounter;
+
+public class WorkShiftRecord {
+
+ public class ChannelRecords{
+
+ public class ChannelRecord
+ {
+ DateTime timestamp;
+ Integer value;
+
+ public ChannelRecord(DateTime timestamp,int value){
+ this.timestamp = timestamp;
+ this.value = value;
+ }
+
+ public DateTime getTimestamp() {
+ return timestamp;
+ }
+ public void setTimestamp(DateTime timestamp) {
+ this.timestamp = timestamp;
+ }
+
+ public int getValue() {
+ return value;
+ }
+ public void setValue(int value) {
+ this.value = value;
+ }
+ }
+
+ int channel;
+ List values;
+
+ public ChannelRecords(int channel){
+ this.channel = channel;
+ this.values = new LinkedList();
+ }
+
+ public void addValue(DateTime timestamp,int value){
+ this.values.add(new ChannelRecord(timestamp, value));
+ }
+
+ public void sort(){
+/* List sorted = new LinkedList();
+
+ for (ChannelRecord r: values){
+ if (values.size() == 0)
+ sorted.add(r);
+ }
+
+ this.values = sorted;
+ */
+ }
+
+ public List getRecords(){
+ return this.values;
+ }
+
+ }
+
+ WorkShift workShift;
+ Date date;
+
+ Hashtable
+ records;
+
+ public WorkShiftRecord(WorkShift shift,Date date){
+ workShift = shift;
+ this.date = date;
+ records = new Hashtable();
+
+ loadRecords();
+ }
+
+ void loadRecords(){
+ try {
+ PreparedStatement stat = PulsCounter.getInspectorApplication().getConnection().prepareStatement("SELECT tstamp,channel,chvalue FROM rawvalues WHERE tstamp >= ? AND tstamp < ? ORDER BY channel,tstamp");
+
+ stat.setTimestamp(1, workShift.getShiftBegins(date).getTimeStamp());
+ stat.setTimestamp(2, workShift.getShiftEnds(date).getTimeStamp());
+
+ ResultSet result = stat.executeQuery();
+
+ while (result.next()){
+ int channel = result.getInt("channel");
+
+ if (!records.containsKey(channel)){
+ records.put(channel, new ChannelRecords(channel));
+ }
+
+ // System.err.println("Record: " + result.getString("tstamp") + " [" + result.getString("channel") + "] " + result.getString("chvalue") );
+
+ records.get(channel).addValue(new DateTime(result.getTimestamp("tstamp")),result.getInt("chvalue"));
+
+
+ }
+
+ result.close();
+ stat.close();
+
+ for (WorkShiftRecord.ChannelRecords record: records.values().toArray(new WorkShiftRecord.ChannelRecords[0])){
+ record.sort();
+ }
+
+
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public Integer[] getChannels(){
+ return (Integer[]) this.records.keySet().toArray(new Integer[0]);
+ }
+
+ public ChannelRecords getChannelRecords(int channel){
+ return records.get(channel);
+ }
+}
diff --git a/src/org/hwo/pulscounter/service/PulsCounterService.java b/src/org/hwo/pulscounter/service/PulsCounterService.java
new file mode 100644
index 0000000..a02fe54
--- /dev/null
+++ b/src/org/hwo/pulscounter/service/PulsCounterService.java
@@ -0,0 +1,72 @@
+package org.hwo.pulscounter.service;
+
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+
+import org.hwo.beacon.Beacon;
+import org.hwo.pulscounter.IPulsCounter;
+import org.hwo.pulscounter.NewPulsCounterDevice;
+import org.hwo.rpc.simple.SimpleRPCServer;
+
+public class PulsCounterService {
+
+ private NewPulsCounterDevice localDevice;
+ private SimpleRPCServer localRPCServer;
+ private Beacon serviceBeacon;
+
+
+
+ public PulsCounterService(){
+
+ serviceBeacon = new Beacon(44556);
+ serviceBeacon.getProperties().setProperty("rpc.simple.interfaces", "org.hwo.pulsecounter");
+ serviceBeacon.getProperties().setProperty("rpc.simple.port", "44352");
+ serviceBeacon.setServerOnly(true);
+
+ }
+
+ public void start(){
+
+ if (localDevice == null){
+ localDevice = new NewPulsCounterDevice();
+
+ try {
+ localRPCServer = new SimpleRPCServer(InetAddress.getByName("0.0.0.0"), 44352);
+ localRPCServer.registerObject(IPulsCounter.class, localDevice);
+ localRPCServer.start();
+
+ serviceBeacon.start();
+
+ } catch (Exception e) {
+ localDevice = null;
+ e.printStackTrace();
+ }
+ }
+ }
+
+ public void stop(){
+ if (serviceBeacon.isAlive())
+ serviceBeacon.exit();
+
+ if (localDevice != null){
+ localRPCServer.exit();
+ localDevice.close();
+ localDevice = null;
+ }
+
+ }
+
+ public boolean isActive() {
+ return (serviceBeacon.isAlive());
+ }
+
+ public NewPulsCounterDevice getLocalDevice(){
+ return localDevice;
+ }
+ void setLocalDevice(NewPulsCounterDevice device){
+ localDevice = device;
+ }
+
+
+}
diff --git a/src/org/hwo/pulscounter/ui/AppSettingsFrame.java b/src/org/hwo/pulscounter/ui/AppSettingsFrame.java
new file mode 100644
index 0000000..034fdea
--- /dev/null
+++ b/src/org/hwo/pulscounter/ui/AppSettingsFrame.java
@@ -0,0 +1,165 @@
+package org.hwo.pulscounter.ui;
+
+import java.awt.BorderLayout;
+import java.awt.EventQueue;
+
+import javax.swing.JFrame;
+import javax.swing.JPanel;
+import javax.swing.border.EmptyBorder;
+
+import java.awt.Dialog.ModalExclusionType;
+
+import javax.swing.JTabbedPane;
+
+import java.awt.GridBagLayout;
+import java.awt.GridBagConstraints;
+
+import javax.swing.JLabel;
+
+import java.awt.Insets;
+
+import javax.swing.JTextField;
+import javax.swing.JButton;
+
+import org.hwo.io.SerialPort;
+import org.hwo.io.SerialPortChooser;
+import org.hwo.pulscounter.PulsCounter2Application;
+
+import java.awt.event.ActionListener;
+import java.awt.event.ActionEvent;
+
+public class AppSettingsFrame extends JFrame {
+
+ private JPanel contentPane;
+ private JTextField tfInterface;
+
+ private SerialPort selectedSerialPort;
+
+
+ /**
+ * Create the frame.
+ */
+ public AppSettingsFrame() {
+ setTitle("Einstellungen");
+ setModalExclusionType(ModalExclusionType.APPLICATION_EXCLUDE);
+ setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
+ setBounds(100, 100, 603, 447);
+ contentPane = new JPanel();
+ contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
+ contentPane.setLayout(new BorderLayout(0, 0));
+ setContentPane(contentPane);
+
+ JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.TOP);
+ contentPane.add(tabbedPane, BorderLayout.CENTER);
+
+ JPanel panel = new JPanel();
+ tabbedPane.addTab("Kommunikation", null, panel, null);
+ tabbedPane.setEnabledAt(0, true);
+ GridBagLayout gbl_panel = new GridBagLayout();
+ gbl_panel.columnWidths = new int[]{0, 0, 0, 0};
+ gbl_panel.rowHeights = new int[]{0, 0, 0, 0};
+ gbl_panel.columnWeights = new double[]{0.0, 1.0, 0.0, Double.MIN_VALUE};
+ gbl_panel.rowWeights = new double[]{0.0, 0.0, 0.0, Double.MIN_VALUE};
+ panel.setLayout(gbl_panel);
+
+ JLabel lblSchnittstelle = new JLabel("Schnittstelle:");
+ GridBagConstraints gbc_lblSchnittstelle = new GridBagConstraints();
+ gbc_lblSchnittstelle.anchor = GridBagConstraints.EAST;
+ gbc_lblSchnittstelle.insets = new Insets(0, 0, 5, 5);
+ gbc_lblSchnittstelle.gridx = 0;
+ gbc_lblSchnittstelle.gridy = 0;
+ panel.add(lblSchnittstelle, gbc_lblSchnittstelle);
+
+ tfInterface = new JTextField();
+ GridBagConstraints gbc_tfInterface = new GridBagConstraints();
+ gbc_tfInterface.anchor = GridBagConstraints.NORTH;
+ gbc_tfInterface.insets = new Insets(0, 0, 5, 5);
+ gbc_tfInterface.fill = GridBagConstraints.HORIZONTAL;
+ gbc_tfInterface.gridx = 1;
+ gbc_tfInterface.gridy = 0;
+ panel.add(tfInterface, gbc_tfInterface);
+ tfInterface.setColumns(10);
+
+ JButton btnWhlen = new JButton("wählen...");
+ btnWhlen.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent arg0) {
+ chooseSerialPort();
+ }
+ });
+ GridBagConstraints gbc_btnWhlen = new GridBagConstraints();
+ gbc_btnWhlen.insets = new Insets(0, 0, 5, 0);
+ gbc_btnWhlen.gridx = 2;
+ gbc_btnWhlen.gridy = 0;
+ panel.add(btnWhlen, gbc_btnWhlen);
+
+ JPanel panel_1 = new JPanel();
+ contentPane.add(panel_1, BorderLayout.SOUTH);
+ GridBagLayout gbl_panel_1 = new GridBagLayout();
+ gbl_panel_1.columnWidths = new int[]{0, 0, 0};
+ gbl_panel_1.rowHeights = new int[]{0, 0};
+ gbl_panel_1.columnWeights = new double[]{1.0, 1.0, Double.MIN_VALUE};
+ gbl_panel_1.rowWeights = new double[]{0.0, Double.MIN_VALUE};
+ panel_1.setLayout(gbl_panel_1);
+
+ JButton bCANCEL = new JButton("cancel");
+ bCANCEL.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ setVisible(false);
+ }
+ });
+ GridBagConstraints gbc_bCANCEL = new GridBagConstraints();
+ gbc_bCANCEL.fill = GridBagConstraints.HORIZONTAL;
+ gbc_bCANCEL.insets = new Insets(0, 0, 0, 5);
+ gbc_bCANCEL.gridx = 0;
+ gbc_bCANCEL.gridy = 0;
+ panel_1.add(bCANCEL, gbc_bCANCEL);
+
+ JButton bOK = new JButton("OK");
+ bOK.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ accept();
+ setVisible(false);
+ }
+ });
+ GridBagConstraints gbc_bOK = new GridBagConstraints();
+ gbc_bOK.fill = GridBagConstraints.HORIZONTAL;
+ gbc_bOK.gridx = 1;
+ gbc_bOK.gridy = 0;
+ panel_1.add(bOK, gbc_bOK);
+
+ initialize();
+ }
+
+ private void initialize(){
+ PulsCounter2Application pc2a = PulsCounter2Application.getApplication();
+
+ selectedSerialPort = pc2a.getSerialPort();
+
+ if (selectedSerialPort != null)
+ tfInterface.setText(selectedSerialPort.getPortName());
+ }
+
+ private void accept(){
+ PulsCounter2Application pc2a = PulsCounter2Application.getApplication();
+ pc2a.setSerialPort(selectedSerialPort);
+ }
+
+ private void chooseSerialPort(){
+ PulsCounter2Application pc2a = PulsCounter2Application.getApplication();
+
+ SerialPortChooser spc = new SerialPortChooser();
+
+ String selectedPortName = null;
+ if (selectedSerialPort != null)
+ selectedPortName = selectedSerialPort.getPortName();
+
+ SerialPort sp = spc.execute(selectedPortName);
+ if (sp != null){
+ selectedSerialPort = sp;
+ tfInterface.setText(sp.getPortName());
+ };
+
+ }
+
+
+}
diff --git a/src/org/hwo/pulscounter/ui/AppSettingsListener.java b/src/org/hwo/pulscounter/ui/AppSettingsListener.java
new file mode 100644
index 0000000..4286e6e
--- /dev/null
+++ b/src/org/hwo/pulscounter/ui/AppSettingsListener.java
@@ -0,0 +1,10 @@
+package org.hwo.pulscounter.ui;
+
+import org.hwo.io.servicelink.ServiceLink;
+
+public interface AppSettingsListener {
+
+ void ServiceLinkChanged(ServiceLink serviceLink);
+
+
+}
diff --git a/src/org/hwo/pulscounter/ui/CheckWorkshiftRecords.java b/src/org/hwo/pulscounter/ui/CheckWorkshiftRecords.java
new file mode 100644
index 0000000..4aff814
--- /dev/null
+++ b/src/org/hwo/pulscounter/ui/CheckWorkshiftRecords.java
@@ -0,0 +1,302 @@
+package org.hwo.pulscounter.ui;
+
+import java.awt.BorderLayout;
+import java.awt.EventQueue;
+
+import javax.swing.JFrame;
+import javax.swing.JPanel;
+import javax.swing.border.EmptyBorder;
+
+import java.awt.GridBagLayout;
+import java.awt.GridBagConstraints;
+
+import javax.swing.border.TitledBorder;
+
+import java.awt.Insets;
+
+import javax.swing.JLabel;
+import javax.swing.JTextField;
+import javax.swing.JButton;
+
+import org.hwo.datetime.Date;
+import org.hwo.pulscounter.PulsCounter;
+import org.hwo.pulscounter.elements.WorkShift;
+import org.hwo.pulscounter.elements.WorkShiftRecord;
+
+import javax.swing.JComboBox;
+
+import java.awt.event.ActionListener;
+import java.awt.event.ActionEvent;
+import java.util.LinkedList;
+
+import javax.swing.JTable;
+
+import org.hwo.ui.FlexibleJTable;
+import org.hwo.ui.JComboBoxEx;
+
+import javax.swing.JScrollPane;
+
+public class CheckWorkshiftRecords extends JFrame {
+
+ private Date selectedDate;
+ private WorkShiftRecord selectedWorkShift;
+
+
+ private JPanel contentPane;
+ private JTextField tfDatum;
+ private JComboBox cbWorkShift;
+ private JTextField tfBegins;
+ private JTextField tfEnds;
+ private FlexibleJTable flexibleJTable;
+ private JComboBoxEx cbChannel;
+
+ /**
+ * Launch the application.
+ */
+ public static void main(String[] args) {
+ EventQueue.invokeLater(new Runnable() {
+ public void run() {
+ try {
+ CheckWorkshiftRecords frame = new CheckWorkshiftRecords();
+ frame.setVisible(true);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ });
+ }
+
+ /**
+ * Create the frame.
+ */
+ public CheckWorkshiftRecords() {
+ setTitle("Schichtdaten prüfen");
+ setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+ setBounds(100, 100, 938, 686);
+ contentPane = new JPanel();
+ contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
+ setContentPane(contentPane);
+ GridBagLayout gbl_contentPane = new GridBagLayout();
+ gbl_contentPane.columnWidths = new int[]{0, 0};
+ gbl_contentPane.rowHeights = new int[]{0, 0, 0, 0};
+ gbl_contentPane.columnWeights = new double[]{1.0, Double.MIN_VALUE};
+ gbl_contentPane.rowWeights = new double[]{0.0, 0.0, 1.0, Double.MIN_VALUE};
+ contentPane.setLayout(gbl_contentPane);
+
+ JPanel panel = new JPanel();
+ panel.setBorder(new TitledBorder(null, "Auswahl", TitledBorder.LEADING, TitledBorder.TOP, null, null));
+ GridBagConstraints gbc_panel = new GridBagConstraints();
+ gbc_panel.insets = new Insets(0, 0, 5, 0);
+ gbc_panel.fill = GridBagConstraints.BOTH;
+ gbc_panel.gridx = 0;
+ gbc_panel.gridy = 0;
+ contentPane.add(panel, gbc_panel);
+ GridBagLayout gbl_panel = new GridBagLayout();
+ gbl_panel.columnWidths = new int[]{0, 0, 0, 0, 0, 0};
+ gbl_panel.rowHeights = new int[]{0, 0, 0, 0};
+ gbl_panel.columnWeights = new double[]{0.0, 1.0, 1.0, 0.0, 0.0, Double.MIN_VALUE};
+ gbl_panel.rowWeights = new double[]{0.0, 0.0, 0.0, Double.MIN_VALUE};
+ panel.setLayout(gbl_panel);
+
+ JLabel lblDatum = new JLabel("Datum:");
+ GridBagConstraints gbc_lblDatum = new GridBagConstraints();
+ gbc_lblDatum.insets = new Insets(0, 0, 5, 5);
+ gbc_lblDatum.anchor = GridBagConstraints.EAST;
+ gbc_lblDatum.gridx = 0;
+ gbc_lblDatum.gridy = 0;
+ panel.add(lblDatum, gbc_lblDatum);
+
+ tfDatum = new JTextField();
+ tfDatum.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ Date d = new Date();
+ d.fromSQLDate(tfDatum.getText());
+ selectDatum(d);
+ }
+ });
+ GridBagConstraints gbc_tfDatum = new GridBagConstraints();
+ gbc_tfDatum.gridwidth = 2;
+ gbc_tfDatum.insets = new Insets(0, 0, 5, 5);
+ gbc_tfDatum.fill = GridBagConstraints.HORIZONTAL;
+ gbc_tfDatum.gridx = 1;
+ gbc_tfDatum.gridy = 0;
+ panel.add(tfDatum, gbc_tfDatum);
+ tfDatum.setColumns(10);
+
+ JButton btnGestern = new JButton("GESTERN");
+ btnGestern.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ Date d = new Date();
+ d.addDays(-1);
+ selectDatum(d);
+ }
+ });
+
+ JButton btnHeute = new JButton("HEUTE");
+ btnHeute.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent arg0) {
+ selectDatum(new Date());
+ }
+ });
+ GridBagConstraints gbc_btnHeute = new GridBagConstraints();
+ gbc_btnHeute.insets = new Insets(0, 0, 5, 5);
+ gbc_btnHeute.gridx = 3;
+ gbc_btnHeute.gridy = 0;
+ panel.add(btnHeute, gbc_btnHeute);
+ GridBagConstraints gbc_btnGestern = new GridBagConstraints();
+ gbc_btnGestern.insets = new Insets(0, 0, 5, 0);
+ gbc_btnGestern.gridx = 4;
+ gbc_btnGestern.gridy = 0;
+ panel.add(btnGestern, gbc_btnGestern);
+
+ JLabel lblSchicht = new JLabel("Schicht:");
+ GridBagConstraints gbc_lblSchicht = new GridBagConstraints();
+ gbc_lblSchicht.insets = new Insets(0, 0, 5, 5);
+ gbc_lblSchicht.gridx = 0;
+ gbc_lblSchicht.gridy = 1;
+ panel.add(lblSchicht, gbc_lblSchicht);
+
+ cbWorkShift = new JComboBox();
+ cbWorkShift.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ selectionChanged();
+ }
+ });
+ GridBagConstraints gbc_cbWorkShift = new GridBagConstraints();
+ gbc_cbWorkShift.gridwidth = 2;
+ gbc_cbWorkShift.insets = new Insets(0, 0, 5, 5);
+ gbc_cbWorkShift.fill = GridBagConstraints.HORIZONTAL;
+ gbc_cbWorkShift.gridx = 1;
+ gbc_cbWorkShift.gridy = 1;
+ panel.add(cbWorkShift, gbc_cbWorkShift);
+
+ JLabel lblSchichtgrenzen = new JLabel("Schichtgrenzen:");
+ GridBagConstraints gbc_lblSchichtgrenzen = new GridBagConstraints();
+ gbc_lblSchichtgrenzen.anchor = GridBagConstraints.EAST;
+ gbc_lblSchichtgrenzen.insets = new Insets(0, 0, 0, 5);
+ gbc_lblSchichtgrenzen.gridx = 0;
+ gbc_lblSchichtgrenzen.gridy = 2;
+ panel.add(lblSchichtgrenzen, gbc_lblSchichtgrenzen);
+
+ tfBegins = new JTextField();
+ GridBagConstraints gbc_tfBegins = new GridBagConstraints();
+ gbc_tfBegins.insets = new Insets(0, 0, 0, 5);
+ gbc_tfBegins.fill = GridBagConstraints.HORIZONTAL;
+ gbc_tfBegins.gridx = 1;
+ gbc_tfBegins.gridy = 2;
+ panel.add(tfBegins, gbc_tfBegins);
+ tfBegins.setColumns(10);
+
+ tfEnds = new JTextField();
+ tfEnds.setColumns(10);
+ GridBagConstraints gbc_tfEnds = new GridBagConstraints();
+ gbc_tfEnds.insets = new Insets(0, 0, 0, 5);
+ gbc_tfEnds.fill = GridBagConstraints.HORIZONTAL;
+ gbc_tfEnds.gridx = 2;
+ gbc_tfEnds.gridy = 2;
+ panel.add(tfEnds, gbc_tfEnds);
+
+ JPanel panel_2 = new JPanel();
+ panel_2.setBorder(new TitledBorder(null, "Kanal", TitledBorder.LEADING, TitledBorder.TOP, null, null));
+ GridBagConstraints gbc_panel_2 = new GridBagConstraints();
+ gbc_panel_2.insets = new Insets(0, 0, 5, 0);
+ gbc_panel_2.fill = GridBagConstraints.BOTH;
+ gbc_panel_2.gridx = 0;
+ gbc_panel_2.gridy = 1;
+ contentPane.add(panel_2, gbc_panel_2);
+ GridBagLayout gbl_panel_2 = new GridBagLayout();
+ gbl_panel_2.columnWidths = new int[]{0, 0};
+ gbl_panel_2.rowHeights = new int[]{0, 0};
+ gbl_panel_2.columnWeights = new double[]{1.0, Double.MIN_VALUE};
+ gbl_panel_2.rowWeights = new double[]{0.0, Double.MIN_VALUE};
+ panel_2.setLayout(gbl_panel_2);
+
+ cbChannel = new JComboBoxEx();
+ cbChannel.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent arg0) {
+ selectChannel();
+ }
+ }
+ );
+ GridBagConstraints gbc_cbChannel = new GridBagConstraints();
+ gbc_cbChannel.fill = GridBagConstraints.HORIZONTAL;
+ gbc_cbChannel.gridx = 0;
+ gbc_cbChannel.gridy = 0;
+ panel_2.add(cbChannel, gbc_cbChannel);
+
+ JPanel panel_1 = new JPanel();
+ GridBagConstraints gbc_panel_1 = new GridBagConstraints();
+ gbc_panel_1.fill = GridBagConstraints.BOTH;
+ gbc_panel_1.gridx = 0;
+ gbc_panel_1.gridy = 2;
+ contentPane.add(panel_1, gbc_panel_1);
+ GridBagLayout gbl_panel_1 = new GridBagLayout();
+ gbl_panel_1.columnWidths = new int[]{0, 0};
+ gbl_panel_1.rowHeights = new int[]{0, 0};
+ gbl_panel_1.columnWeights = new double[]{1.0, Double.MIN_VALUE};
+ gbl_panel_1.rowWeights = new double[]{1.0, Double.MIN_VALUE};
+ panel_1.setLayout(gbl_panel_1);
+
+ JScrollPane scrollPane = new JScrollPane();
+ GridBagConstraints gbc_scrollPane = new GridBagConstraints();
+ gbc_scrollPane.fill = GridBagConstraints.BOTH;
+ gbc_scrollPane.gridx = 0;
+ gbc_scrollPane.gridy = 0;
+ panel_1.add(scrollPane, gbc_scrollPane);
+
+ flexibleJTable = new FlexibleJTable(WorkShiftRecord.ChannelRecords.ChannelRecord.class);
+ scrollPane.setViewportView(flexibleJTable);
+
+ this.initialize();
+ }
+
+ void initialize(){
+ for (WorkShift shift: PulsCounter.getInspectorApplication().getWorkShifts()){
+ cbWorkShift.addItem(shift);
+ }
+
+ flexibleJTable.addColumn("timestamp");
+ flexibleJTable.addColumn("value");
+
+
+
+ selectDatum(new Date());
+ }
+
+ void selectDatum(Date date){
+ tfDatum.setText(date.getSQLDate());
+ selectedDate = date;
+
+ selectionChanged();
+ }
+
+ void selectionChanged(){
+ if (cbWorkShift.getSelectedItem()==null)
+ return;
+ if (selectedDate == null)
+ return;
+
+ WorkShift shift = (WorkShift)cbWorkShift.getSelectedItem();
+
+ tfBegins.setText(shift.getShiftBegins(selectedDate).getSQLDateTime());
+ tfEnds.setText(shift.getShiftEnds(selectedDate).getSQLDateTime());
+
+ WorkShiftRecord workShiftRecord = new WorkShiftRecord(shift, selectedDate);
+
+ selectedWorkShift = null;
+
+ flexibleJTable.setRows(new LinkedList());
+ cbChannel.setItems(workShiftRecord.getChannels());
+
+ selectedWorkShift = workShiftRecord;
+ }
+
+ void selectChannel(){
+ if (selectedWorkShift != null){
+ Integer ch = (Integer)cbChannel.getSelectedItem();
+ flexibleJTable.setRows(selectedWorkShift.getChannelRecords(ch).getRecords());
+ }
+ }
+
+}
diff --git a/src/org/hwo/pulscounter/ui/InspectionMainFrame.java b/src/org/hwo/pulscounter/ui/InspectionMainFrame.java
new file mode 100644
index 0000000..4f21695
--- /dev/null
+++ b/src/org/hwo/pulscounter/ui/InspectionMainFrame.java
@@ -0,0 +1,122 @@
+package org.hwo.pulscounter.ui;
+
+import java.awt.BorderLayout;
+import java.awt.EventQueue;
+
+import javax.swing.JFrame;
+import javax.swing.JPanel;
+import javax.swing.border.EmptyBorder;
+
+import java.awt.GridBagLayout;
+
+import javax.swing.JButton;
+
+import java.awt.GridBagConstraints;
+import java.awt.Insets;
+
+import javax.swing.border.TitledBorder;
+
+import org.hwo.datetime.Date;
+import org.hwo.pulscounter.PulsCounter;
+import org.hwo.pulscounter.elements.WorkShift;
+
+import java.awt.event.ActionListener;
+import java.awt.event.ActionEvent;
+
+public class InspectionMainFrame extends JFrame {
+
+ private JPanel contentPane;
+
+ /**
+ * Launch the application.
+ */
+ public static void main(String[] args) {
+ EventQueue.invokeLater(new Runnable() {
+ public void run() {
+ try {
+ InspectionMainFrame frame = new InspectionMainFrame();
+ frame.setVisible(true);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ });
+ }
+
+ /**
+ * Create the frame.
+ */
+ public InspectionMainFrame() {
+ setTitle("Inspektor");
+ setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+ setBounds(100, 100, 841, 607);
+ contentPane = new JPanel();
+ contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
+ setContentPane(contentPane);
+ GridBagLayout gbl_contentPane = new GridBagLayout();
+ gbl_contentPane.columnWidths = new int[]{0, 0};
+ gbl_contentPane.rowHeights = new int[]{0, 0, 0};
+ gbl_contentPane.columnWeights = new double[]{1.0, Double.MIN_VALUE};
+ gbl_contentPane.rowWeights = new double[]{1.0, 1.0, Double.MIN_VALUE};
+ contentPane.setLayout(gbl_contentPane);
+
+ JPanel panel = new JPanel();
+ GridBagConstraints gbc_panel = new GridBagConstraints();
+ gbc_panel.insets = new Insets(0, 0, 5, 0);
+ gbc_panel.fill = GridBagConstraints.BOTH;
+ gbc_panel.gridx = 0;
+ gbc_panel.gridy = 0;
+ contentPane.add(panel, gbc_panel);
+ GridBagLayout gbl_panel = new GridBagLayout();
+ gbl_panel.columnWidths = new int[]{0, 0};
+ gbl_panel.rowHeights = new int[]{0, 0};
+ gbl_panel.columnWeights = new double[]{0.0, Double.MIN_VALUE};
+ gbl_panel.rowWeights = new double[]{0.0, Double.MIN_VALUE};
+ panel.setLayout(gbl_panel);
+
+ JButton btnNewButton = new JButton("Schichtdaten prüfen...");
+ btnNewButton.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ WorkShift[] shifts = PulsCounter.getInspectorApplication().getWorkShifts();
+ Date d = new Date();
+ d.addDays(10);
+ for (int i=0;i<40;i++){
+
+ for (int s = 0;s