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