From 756f0f2d4dbf1285cda8152d92bbc93fa3ec795a Mon Sep 17 00:00:00 2001 From: Harald Wolff Date: Thu, 6 Oct 2016 10:57:31 +0200 Subject: [PATCH] WIP / Beta 161006 --- .../pulscounter/PulsCounterApplication.java | 2 + src/org/hwo/pulscounter/SnapShot.java | 4 +- .../pulscounter/device/IDeviceConnector.java | 6 +- .../device/ServiceLinkDeviceConnector.java | 88 ++- .../pulscounter/device/SimulatedCounter.java | 6 + .../pulscounter/ui/DeviceConfiguration.java | 29 +- .../hwo/pulscounter/ui/DeviceTestFrame.java | 713 +++++++++--------- .../hwo/pulscounter/ui/ExportFilesFrame.java | 16 + src/org/hwo/pulscounter/ui/NewMainWindow.java | 7 +- 9 files changed, 506 insertions(+), 365 deletions(-) diff --git a/src/org/hwo/pulscounter/PulsCounterApplication.java b/src/org/hwo/pulscounter/PulsCounterApplication.java index 4971d07..42efb24 100644 --- a/src/org/hwo/pulscounter/PulsCounterApplication.java +++ b/src/org/hwo/pulscounter/PulsCounterApplication.java @@ -279,6 +279,8 @@ public class PulsCounterApplication implements ServiceLinkListener{ Integer nProfiles = new Integer(sProfiles); for (int n=0;n> 8) & 0xff); } for (int n=0;n<32;n++) diff --git a/src/org/hwo/pulscounter/device/IDeviceConnector.java b/src/org/hwo/pulscounter/device/IDeviceConnector.java index a509c4c..657d5f3 100644 --- a/src/org/hwo/pulscounter/device/IDeviceConnector.java +++ b/src/org/hwo/pulscounter/device/IDeviceConnector.java @@ -3,7 +3,10 @@ package org.hwo.pulscounter.device; import org.hwo.pulscounter.SnapShot; public interface IDeviceConnector { - + + public static int ESC_DEBUG_MASK = 0xFFFF0000; + public static int ESC_DEBUG_SCHEDULER_BUG = 0x00010000; + public Integer getDeviceSerial(); public boolean showConnctionSetup(); @@ -60,6 +63,7 @@ public interface IDeviceConnector { readSnapShots(int startIndex); public void reset(int flags); + public int escape(int escape,int parm); public void syncConfigToLive(); diff --git a/src/org/hwo/pulscounter/device/ServiceLinkDeviceConnector.java b/src/org/hwo/pulscounter/device/ServiceLinkDeviceConnector.java index c2e9d05..4de7c51 100644 --- a/src/org/hwo/pulscounter/device/ServiceLinkDeviceConnector.java +++ b/src/org/hwo/pulscounter/device/ServiceLinkDeviceConnector.java @@ -1,8 +1,10 @@ package org.hwo.pulscounter.device; import java.io.IOException; +import java.text.DateFormat; import java.util.ArrayList; import java.util.Calendar; +import java.util.Date; import java.util.LinkedList; import java.util.List; @@ -20,9 +22,10 @@ import static org.hwo.logging.LogLevel.*; public class ServiceLinkDeviceConnector implements IDeviceConnector { private ServiceLink serviceLink; - private Integer deviceSerial; + private int debugMode; + public ServiceLinkDeviceConnector() { serviceLink = new ServiceLink(new NewSerialPort("COM1:")); @@ -45,6 +48,10 @@ public class ServiceLinkDeviceConnector implements IDeviceConnector { return String.format("Serial [%s]", this.serviceLink.getSerialPort().getPortName()); } + public ServiceLink getServiceLink() { + return serviceLink; + } + private Integer readDeviceSerial(){ checkOpen(); @@ -313,6 +320,15 @@ public class ServiceLinkDeviceConnector implements IDeviceConnector { Integer id; try { + Integer sbrk,stacklimit,cycletime; + + sbrk = serviceLink.readInt(13, 0, 0x0020); + stacklimit = serviceLink.readInt(13, 0, 0x0021); + cycletime = serviceLink.readInt(13, 0, 0x1310); + + log(INFO,"HEAP END: 0x%04x SYS-STACK: 0x%04x",sbrk,stacklimit); + log(INFO,"I/O cycle time: %dus",cycletime); + newest = serviceLink.readInt(13, 0, 0x0581); sssize = serviceLink.readInt(13, 0, 0x0582); @@ -397,6 +413,8 @@ public class ServiceLinkDeviceConnector implements IDeviceConnector { log(e); } + checkForAssertions(); + } return snapshots.toArray(new SnapShot[0]); } @@ -561,7 +579,7 @@ public class ServiceLinkDeviceConnector implements IDeviceConnector { checkOpen(); try { - serviceLink.writeInt(13, 0, 0x0581, -1 ); + serviceLink.writeInt(13, 0, 0x0581, flags ); } catch (IOException | ServiceLinkException e) { throw new NoDeviceConnectionException(); } @@ -654,13 +672,17 @@ public class ServiceLinkDeviceConnector implements IDeviceConnector { try { Integer deviceTime = serviceLink.readInt(13, 0, 0x001C); - Long delta = deviceTime - (System.currentTimeMillis()/1000); - - if ((delta < -1) || (delta > 1)){ - log(INFO,"realtime clock has a %d seconds shift",delta); - serviceLink.writeInt((byte)13, (byte)0, 0x001C, (int)(calendar.getTimeInMillis() / 1000L)); - log(INFO,"realtime clock has been corrected."); - + Long currentTime = (System.currentTimeMillis()/1000); + + if (debugMode != ESC_DEBUG_SCHEDULER_BUG){ + Long delta = deviceTime - currentTime; + if ((delta < -1) || (delta > 1)){ + log(INFO,"realtime clock has a %d seconds shift",delta); + serviceLink.writeInt((byte)13, (byte)0, 0x001C, (int)(calendar.getTimeInMillis() / 1000L)); + log(INFO,"realtime clock has been corrected."); + } + } else { + log(DEBUG,"SCHEDULER_DEBUG: DeviceTime is %s",DateFormat.getInstance().format(new Date(((long)deviceTime)*1000))); } } catch (ServiceLinkRequestFailedException e) { e.printStackTrace(); @@ -671,7 +693,55 @@ public class ServiceLinkDeviceConnector implements IDeviceConnector { } } + + private void checkForAssertions(){ + Integer assert_error,assert_code; + + try + { + assert_error = -1; + for (int i=0;i<8;i++){ + assert_error = serviceLink.readInt(13, 0, 0x0026); + assert_code = serviceLink.readInt(13, 0, 0x0025); + + if (assert_error >= 0) + break; + + log(WARN,"Assertion: Error: 0x%08x (%d) Position: 0x%04x Mark: %d", assert_error,assert_error, assert_code & 0xffff, (assert_code >> 16) & 0xffff); + serviceLink.writeInt(13, 0, 0x0025, -1); + }; + } catch (Exception ex){ + System.err.println("Exception while checking for assertions..."); + ex.printStackTrace(); + } + } + @Override + public int escape(int escape, int parm) { + if ((escape & ESC_DEBUG_MASK)!=0){ + debugMode = escape; + } + + switch (escape){ + case ESC_DEBUG_SCHEDULER_BUG: + try { + Long currentTime = (System.currentTimeMillis()/1000); + currentTime -= currentTime % 86400; + currentTime += -920; + log(DEBUG,"ESC_DEBUG_SCHEDULER_BUG"); + serviceLink.writeInt((byte)13, (byte)0, 0x001C, (currentTime.intValue())); + } catch (ServiceLinkRequestFailedException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } catch (ServiceLinkException e) { + e.printStackTrace(); + } + + return 0; + } + return 0; + } } diff --git a/src/org/hwo/pulscounter/device/SimulatedCounter.java b/src/org/hwo/pulscounter/device/SimulatedCounter.java index 5eb0331..7fbbc97 100644 --- a/src/org/hwo/pulscounter/device/SimulatedCounter.java +++ b/src/org/hwo/pulscounter/device/SimulatedCounter.java @@ -282,4 +282,10 @@ public class SimulatedCounter implements IDeviceConnector { }; + @Override + public int escape(int escape, int parm) { + // TODO Auto-generated method stub + return 0; + } + } diff --git a/src/org/hwo/pulscounter/ui/DeviceConfiguration.java b/src/org/hwo/pulscounter/ui/DeviceConfiguration.java index 65d979f..2515c5e 100644 --- a/src/org/hwo/pulscounter/ui/DeviceConfiguration.java +++ b/src/org/hwo/pulscounter/ui/DeviceConfiguration.java @@ -100,9 +100,9 @@ public class DeviceConfiguration extends JFrame { tabbedPane.addTab("Intervalle", null, panel_2, null); GridBagLayout gbl_panel_2 = new GridBagLayout(); gbl_panel_2.columnWidths = new int[]{0, 0, 0}; - gbl_panel_2.rowHeights = new int[]{0, 0, 0, 0, 0, 0, 0, 0}; + gbl_panel_2.rowHeights = new int[]{0, 0, 0, 0, 0, 0, 0, 0, 0}; gbl_panel_2.columnWeights = new double[]{0.0, 1.0, Double.MIN_VALUE}; - gbl_panel_2.rowWeights = new double[]{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, Double.MIN_VALUE}; + gbl_panel_2.rowWeights = new double[]{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, Double.MIN_VALUE}; panel_2.setLayout(gbl_panel_2); bfeIntervall = new BitFieldEditor(); @@ -233,7 +233,7 @@ public class DeviceConfiguration extends JFrame { GridBagConstraints gbc_btnSnapshotSpeicherZurcksetzen = new GridBagConstraints(); gbc_btnSnapshotSpeicherZurcksetzen.gridwidth = 2; gbc_btnSnapshotSpeicherZurcksetzen.fill = GridBagConstraints.HORIZONTAL; - gbc_btnSnapshotSpeicherZurcksetzen.insets = new Insets(0, 0, 5, 5); + gbc_btnSnapshotSpeicherZurcksetzen.insets = new Insets(0, 0, 5, 0); gbc_btnSnapshotSpeicherZurcksetzen.gridx = 0; gbc_btnSnapshotSpeicherZurcksetzen.gridy = 5; panel_2.add(btnSnapshotSpeicherZurcksetzen, gbc_btnSnapshotSpeicherZurcksetzen); @@ -244,12 +244,25 @@ public class DeviceConfiguration extends JFrame { resetCounters(); } }); + + JButton btnSnapshotSpeicherAuf = new JButton("SnapShot Speicher auf letzten bekannten SnapShot setzen"); + btnSnapshotSpeicherAuf.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + resetSnapShots(true); + } + }); + GridBagConstraints gbc_btnSnapshotSpeicherAuf = new GridBagConstraints(); + gbc_btnSnapshotSpeicherAuf.fill = GridBagConstraints.HORIZONTAL; + gbc_btnSnapshotSpeicherAuf.gridwidth = 2; + gbc_btnSnapshotSpeicherAuf.insets = new Insets(0, 0, 5, 0); + gbc_btnSnapshotSpeicherAuf.gridx = 0; + gbc_btnSnapshotSpeicherAuf.gridy = 6; + panel_2.add(btnSnapshotSpeicherAuf, gbc_btnSnapshotSpeicherAuf); GridBagConstraints gbc_btnAlleZhlerLschen = new GridBagConstraints(); gbc_btnAlleZhlerLschen.gridwidth = 2; gbc_btnAlleZhlerLschen.fill = GridBagConstraints.HORIZONTAL; - gbc_btnAlleZhlerLschen.insets = new Insets(0, 0, 0, 5); gbc_btnAlleZhlerLschen.gridx = 0; - gbc_btnAlleZhlerLschen.gridy = 6; + gbc_btnAlleZhlerLschen.gridy = 7; panel_2.add(btnAlleZhlerLschen, gbc_btnAlleZhlerLschen); JPanel panel_1 = new JPanel(); @@ -331,7 +344,11 @@ public class DeviceConfiguration extends JFrame { } private void resetSnapShots(){ - deviceConnector.reset(0); + resetSnapShots(false); + } + + private void resetSnapShots(boolean toLastKnown){ + deviceConnector.reset(toLastKnown ? PulsCounterApplication.getApplication().getDatabase().highestSnapShot(deviceConnector.getDeviceSerial()) : -1); } private void resetCounters(){ diff --git a/src/org/hwo/pulscounter/ui/DeviceTestFrame.java b/src/org/hwo/pulscounter/ui/DeviceTestFrame.java index 197a997..b19e001 100644 --- a/src/org/hwo/pulscounter/ui/DeviceTestFrame.java +++ b/src/org/hwo/pulscounter/ui/DeviceTestFrame.java @@ -8,8 +8,12 @@ import javax.swing.JPanel; import javax.swing.border.EmptyBorder; import org.hwo.datetime.DateTime; +import org.hwo.logging.Logging; +import org.hwo.logging.LoggingListener; import org.hwo.pulscounter.PulsCounterApplication; import org.hwo.pulscounter.PulsCounterApplicationListener; +import org.hwo.pulscounter.device.ServiceLinkDeviceConnector; +import org.hwo.servicelink.ServiceLink; import org.hwo.servicelink.ServiceLinkException; import java.awt.GridBagLayout; @@ -26,352 +30,369 @@ import javax.swing.JButton; import javax.swing.JList; import javax.swing.JScrollPane; -public class DeviceTestFrame extends JFrame { //implements PulsCounterApplicationListener { +import static org.hwo.logging.Logging.*; +import static org.hwo.logging.LogLevel.*; +import java.awt.event.ActionListener; +import java.awt.event.ActionEvent; + +public class DeviceTestFrame extends JFrame implements LoggingListener{ + + private JPanel contentPane; + private JTextField tfCommunication; + private JTextField tfEEPROM; + private JTextField tfIO; + private JTextField tfAD; + private JTextField tfSerial; + + private Timer reconnectTimer; + + private DeviceChecker deviceChecker; + private JList lMessages; + private DefaultListModel messageListModel; + + private PulsCounterApplication pulsCounterApplication; + + /** + * Create the frame. + */ + public DeviceTestFrame(PulsCounterApplication pulsCounterApplication) { + this.pulsCounterApplication = pulsCounterApplication; + + setTitle("Device Test Frame"); + setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + setBounds(100, 100, 701, 464); + 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, 0}; + gbl_contentPane.rowHeights = new int[]{0, 0, 0, 0, 0, 0, 0, 0, 0}; + gbl_contentPane.columnWeights = new double[]{1.0, 1.0, Double.MIN_VALUE}; + gbl_contentPane.rowWeights = new double[]{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, Double.MIN_VALUE}; + contentPane.setLayout(gbl_contentPane); + + JLabel lblKommunikation = new JLabel("Communication:"); + GridBagConstraints gbc_lblKommunikation = new GridBagConstraints(); + gbc_lblKommunikation.anchor = GridBagConstraints.EAST; + gbc_lblKommunikation.insets = new Insets(0, 0, 5, 5); + gbc_lblKommunikation.gridx = 0; + gbc_lblKommunikation.gridy = 0; + contentPane.add(lblKommunikation, gbc_lblKommunikation); + + tfCommunication = new JTextField(); + GridBagConstraints gbc_tfCommunication = new GridBagConstraints(); + gbc_tfCommunication.insets = new Insets(0, 0, 5, 0); + gbc_tfCommunication.fill = GridBagConstraints.HORIZONTAL; + gbc_tfCommunication.gridx = 1; + gbc_tfCommunication.gridy = 0; + contentPane.add(tfCommunication, gbc_tfCommunication); + tfCommunication.setColumns(10); + + JLabel lblLeds = new JLabel("LEDs:"); + GridBagConstraints gbc_lblLeds = new GridBagConstraints(); + gbc_lblLeds.insets = new Insets(0, 0, 5, 5); + gbc_lblLeds.gridx = 0; + gbc_lblLeds.gridy = 1; + contentPane.add(lblLeds, gbc_lblLeds); + + JLabel lblEeprom = new JLabel("EEPROM:"); + GridBagConstraints gbc_lblEeprom = new GridBagConstraints(); + gbc_lblEeprom.anchor = GridBagConstraints.EAST; + gbc_lblEeprom.insets = new Insets(0, 0, 5, 5); + gbc_lblEeprom.gridx = 0; + gbc_lblEeprom.gridy = 2; + contentPane.add(lblEeprom, gbc_lblEeprom); + + tfEEPROM = new JTextField(); + GridBagConstraints gbc_tfEEPROM = new GridBagConstraints(); + gbc_tfEEPROM.insets = new Insets(0, 0, 5, 0); + gbc_tfEEPROM.fill = GridBagConstraints.HORIZONTAL; + gbc_tfEEPROM.gridx = 1; + gbc_tfEEPROM.gridy = 2; + contentPane.add(tfEEPROM, gbc_tfEEPROM); + tfEEPROM.setColumns(10); + + JLabel lblIoCircuit = new JLabel("I/O Circuit:"); + GridBagConstraints gbc_lblIoCircuit = new GridBagConstraints(); + gbc_lblIoCircuit.anchor = GridBagConstraints.EAST; + gbc_lblIoCircuit.insets = new Insets(0, 0, 5, 5); + gbc_lblIoCircuit.gridx = 0; + gbc_lblIoCircuit.gridy = 3; + contentPane.add(lblIoCircuit, gbc_lblIoCircuit); + + tfIO = new JTextField(); + GridBagConstraints gbc_tfIO = new GridBagConstraints(); + gbc_tfIO.insets = new Insets(0, 0, 5, 0); + gbc_tfIO.fill = GridBagConstraints.HORIZONTAL; + gbc_tfIO.gridx = 1; + gbc_tfIO.gridy = 3; + contentPane.add(tfIO, gbc_tfIO); + tfIO.setColumns(10); + + JLabel lblAdConverters = new JLabel("A/D Converters:"); + GridBagConstraints gbc_lblAdConverters = new GridBagConstraints(); + gbc_lblAdConverters.anchor = GridBagConstraints.EAST; + gbc_lblAdConverters.insets = new Insets(0, 0, 5, 5); + gbc_lblAdConverters.gridx = 0; + gbc_lblAdConverters.gridy = 4; + contentPane.add(lblAdConverters, gbc_lblAdConverters); + + tfAD = new JTextField(); + GridBagConstraints gbc_tfAD = new GridBagConstraints(); + gbc_tfAD.insets = new Insets(0, 0, 5, 0); + gbc_tfAD.fill = GridBagConstraints.HORIZONTAL; + gbc_tfAD.gridx = 1; + gbc_tfAD.gridy = 4; + contentPane.add(tfAD, gbc_tfAD); + tfAD.setColumns(10); + + JLabel lblSerial = new JLabel("Serial:"); + GridBagConstraints gbc_lblSerial = new GridBagConstraints(); + gbc_lblSerial.anchor = GridBagConstraints.EAST; + gbc_lblSerial.insets = new Insets(0, 0, 5, 5); + gbc_lblSerial.gridx = 0; + gbc_lblSerial.gridy = 5; + contentPane.add(lblSerial, gbc_lblSerial); + + tfSerial = new JTextField(); + GridBagConstraints gbc_tfSerial = new GridBagConstraints(); + gbc_tfSerial.insets = new Insets(0, 0, 5, 0); + gbc_tfSerial.fill = GridBagConstraints.HORIZONTAL; + gbc_tfSerial.gridx = 1; + gbc_tfSerial.gridy = 5; + contentPane.add(tfSerial, gbc_tfSerial); + tfSerial.setColumns(10); + + JButton btnStart = new JButton("Start"); + btnStart.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + startTest(); + } + }); + GridBagConstraints gbc_btnStart = new GridBagConstraints(); + gbc_btnStart.insets = new Insets(0, 0, 5, 5); + gbc_btnStart.gridx = 0; + gbc_btnStart.gridy = 6; + contentPane.add(btnStart, gbc_btnStart); + + JButton btnSetDevice = new JButton("Confirm Device"); + GridBagConstraints gbc_btnSetDevice = new GridBagConstraints(); + gbc_btnSetDevice.insets = new Insets(0, 0, 5, 0); + gbc_btnSetDevice.gridx = 1; + gbc_btnSetDevice.gridy = 6; + contentPane.add(btnSetDevice, gbc_btnSetDevice); + + JScrollPane scrollPane = new JScrollPane(); + GridBagConstraints gbc_scrollPane = new GridBagConstraints(); + gbc_scrollPane.fill = GridBagConstraints.BOTH; + gbc_scrollPane.gridwidth = 2; + gbc_scrollPane.gridx = 0; + gbc_scrollPane.gridy = 7; + contentPane.add(scrollPane, gbc_scrollPane); + + lMessages = new JList(); + scrollPane.setViewportView(lMessages); + + this.initialize(); + } + + private PulsCounterApplication application(){ + return this.pulsCounterApplication; + } + + private void initialize(){ + this.reconnectTimer = new Timer("Reconnection Timer"); + + messageListModel = new DefaultListModel(); + lMessages.setModel(messageListModel); + + Logging.getInstance().addLoggingListener(this); + + setVisible(true); + } + + ServiceLink getServiceLink(){ + return ((ServiceLinkDeviceConnector)(application().getInterfaces().get(0))).getServiceLink(); + } + + /* + @Override + public void connectionStateChanged(Boolean connected) { + + if (!connected){ + tfCommunication.setText("NO CONNECTION"); + if (this.deviceChecker != null){ + this.deviceChecker.cancel(); + } + reconnectTimer.schedule(new TimerTask() { + + @Override + public void run() { + if (!getServiceLink().isOpen()){ + try { + getServiceLink().open(); + } catch (ServiceLinkException e) { + e.printStackTrace(); + } + } + } + }, 3000); + + } else { + + } + + } + */ + + private void startTest(){ + if (this.deviceChecker != null){ + while (this.deviceChecker.isAlive()){ + try { + Thread.sleep(100); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + } + this.deviceChecker = new DeviceChecker(); + this.deviceChecker.start(); + } + + @Override + public void logMessageArrived(String message) { + if (EventQueue.isDispatchThread()){ + int pos = messageListModel.size(); + messageListModel.addElement(message); + lMessages.ensureIndexIsVisible(messageListModel.size()-1); + } else { + final String msg = message; + EventQueue.invokeLater(new Runnable() { + + @Override + public void run() { + logMessageArrived(msg); + } + }); + } + } + + + class DeviceChecker extends Thread { + + private boolean cancel; + + public DeviceChecker(){ + cancel = false; + } + + public void cancel(){ + this.cancel = true; + } + + @Override + public void run() { + + try { + getServiceLink().open(); + } catch (ServiceLinkException e) { + log(e); + } + + checkCommunication(); + checkEEPROM(); + checkIO(); + checkADC(); + + while (!cancel){ + checkCommunication(); + } + + } + + private void checkCommunication(){ + if (!this.cancel){ + Integer version = getServiceLink().getServiceRegisterCache().getCachedInteger(13, 0, 0x001A); + Integer uptime = getServiceLink().getServiceRegisterCache().getCachedInteger(13, 0, 0x0022); + + if ((version != null)&&(uptime != null)){ + tfCommunication.setText(String.format("OK (V: %d.%d.%d) Up: %d:%d:%d",version >> 16, (version >> 8) & 0xff, version & 0xff, uptime / 3600, (uptime / 60)%60, uptime % 60)); + } + } + } + + private void checkEEPROM(){ + if (!this.cancel){ + Integer eesize = getServiceLink().getServiceRegisterCache().getCachedInteger(13, 0, 0x9000); + if (eesize != null){ + tfEEPROM.setText(String.format("EEPROM Size Detected: 0x%08x Bytes (%d kBytes)", eesize, (eesize >> 10))); + } else { + tfEEPROM.setText("EEPROM failed."); + } + } + } + + private void checkIO(){ + if (!this.cancel){ + + log(INFO,"I/O test begins..."); + log(INFO,"I/O reset..."); + + try { + getServiceLink().writeInt(13, 0, 0x0682, 0); + getServiceLink().writeInt(13, 0, 0x0683, 0); + getServiceLink().writeInt(13, 0, 0x0684, 0); + getServiceLink().writeInt(13, 0, 0x0685, 0); + + log(INFO,"counter reset."); + for (int i=0;i<32;i++){ + getServiceLink().writeInt(13, 0, 0x0600 + i, 0); + } + + log(INFO,"PullUP-Counter test."); + for (int i=0;i<12;i++){ + Thread.sleep(250); + getServiceLink().writeInt(13, 0, 0x0683, -1); + Thread.sleep(250); + getServiceLink().writeInt(13, 0, 0x0683, 0); + } + + for (int i=0;i<32;i++){ + Thread.sleep(100); + + Integer c = getServiceLink().readInt(13, 0, 0x0600 + i); + if ((c != null) && (c.equals(12))){ + log(INFO,String.format("OK: Channel %d counted %d events.", i, c)); + } else { + log(INFO,String.format("FAILED: Channel %d counted %d events.", i, c)); + } + } + + + + log(INFO,"I/O test finished!"); + } catch (IOException | ServiceLinkException e) { + e.printStackTrace(); + + log(INFO,"I/O test FAILED!"); + } catch (InterruptedException iex){ + iex.printStackTrace(); + + log(INFO,"I/O test FAILED!"); + } + + + + } + } + + private void checkADC(){ + if (!this.cancel){ + } + } + + } -// private JPanel contentPane; -// private JTextField tfCommunication; -// private JTextField tfEEPROM; -// private JTextField tfIO; -// private JTextField tfAD; -// private JTextField tfSerial; -// -// private Timer reconnectTimer; -// -// private DeviceChecker deviceChecker; -// private JList lMessages; -// private DefaultListModel messageListModel; -// -// private PulsCounterApplication pulsCounterApplication; -// -// /** -// * Create the frame. -// */ -// public DeviceTestFrame(PulsCounterApplication pulsCounterApplication) { -// this.pulsCounterApplication = pulsCounterApplication; -// -// setTitle("Device Test Frame"); -// setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); -// setBounds(100, 100, 701, 464); -// 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, 0}; -// gbl_contentPane.rowHeights = new int[]{0, 0, 0, 0, 0, 0, 0, 0, 0}; -// gbl_contentPane.columnWeights = new double[]{1.0, 1.0, Double.MIN_VALUE}; -// gbl_contentPane.rowWeights = new double[]{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, Double.MIN_VALUE}; -// contentPane.setLayout(gbl_contentPane); -// -// JLabel lblKommunikation = new JLabel("Communication:"); -// GridBagConstraints gbc_lblKommunikation = new GridBagConstraints(); -// gbc_lblKommunikation.anchor = GridBagConstraints.EAST; -// gbc_lblKommunikation.insets = new Insets(0, 0, 5, 5); -// gbc_lblKommunikation.gridx = 0; -// gbc_lblKommunikation.gridy = 0; -// contentPane.add(lblKommunikation, gbc_lblKommunikation); -// -// tfCommunication = new JTextField(); -// GridBagConstraints gbc_tfCommunication = new GridBagConstraints(); -// gbc_tfCommunication.insets = new Insets(0, 0, 5, 0); -// gbc_tfCommunication.fill = GridBagConstraints.HORIZONTAL; -// gbc_tfCommunication.gridx = 1; -// gbc_tfCommunication.gridy = 0; -// contentPane.add(tfCommunication, gbc_tfCommunication); -// tfCommunication.setColumns(10); -// -// JLabel lblLeds = new JLabel("LEDs:"); -// GridBagConstraints gbc_lblLeds = new GridBagConstraints(); -// gbc_lblLeds.insets = new Insets(0, 0, 5, 5); -// gbc_lblLeds.gridx = 0; -// gbc_lblLeds.gridy = 1; -// contentPane.add(lblLeds, gbc_lblLeds); -// -// JLabel lblEeprom = new JLabel("EEPROM:"); -// GridBagConstraints gbc_lblEeprom = new GridBagConstraints(); -// gbc_lblEeprom.anchor = GridBagConstraints.EAST; -// gbc_lblEeprom.insets = new Insets(0, 0, 5, 5); -// gbc_lblEeprom.gridx = 0; -// gbc_lblEeprom.gridy = 2; -// contentPane.add(lblEeprom, gbc_lblEeprom); -// -// tfEEPROM = new JTextField(); -// GridBagConstraints gbc_tfEEPROM = new GridBagConstraints(); -// gbc_tfEEPROM.insets = new Insets(0, 0, 5, 0); -// gbc_tfEEPROM.fill = GridBagConstraints.HORIZONTAL; -// gbc_tfEEPROM.gridx = 1; -// gbc_tfEEPROM.gridy = 2; -// contentPane.add(tfEEPROM, gbc_tfEEPROM); -// tfEEPROM.setColumns(10); -// -// JLabel lblIoCircuit = new JLabel("I/O Circuit:"); -// GridBagConstraints gbc_lblIoCircuit = new GridBagConstraints(); -// gbc_lblIoCircuit.anchor = GridBagConstraints.EAST; -// gbc_lblIoCircuit.insets = new Insets(0, 0, 5, 5); -// gbc_lblIoCircuit.gridx = 0; -// gbc_lblIoCircuit.gridy = 3; -// contentPane.add(lblIoCircuit, gbc_lblIoCircuit); -// -// tfIO = new JTextField(); -// GridBagConstraints gbc_tfIO = new GridBagConstraints(); -// gbc_tfIO.insets = new Insets(0, 0, 5, 0); -// gbc_tfIO.fill = GridBagConstraints.HORIZONTAL; -// gbc_tfIO.gridx = 1; -// gbc_tfIO.gridy = 3; -// contentPane.add(tfIO, gbc_tfIO); -// tfIO.setColumns(10); -// -// JLabel lblAdConverters = new JLabel("A/D Converters:"); -// GridBagConstraints gbc_lblAdConverters = new GridBagConstraints(); -// gbc_lblAdConverters.anchor = GridBagConstraints.EAST; -// gbc_lblAdConverters.insets = new Insets(0, 0, 5, 5); -// gbc_lblAdConverters.gridx = 0; -// gbc_lblAdConverters.gridy = 4; -// contentPane.add(lblAdConverters, gbc_lblAdConverters); -// -// tfAD = new JTextField(); -// GridBagConstraints gbc_tfAD = new GridBagConstraints(); -// gbc_tfAD.insets = new Insets(0, 0, 5, 0); -// gbc_tfAD.fill = GridBagConstraints.HORIZONTAL; -// gbc_tfAD.gridx = 1; -// gbc_tfAD.gridy = 4; -// contentPane.add(tfAD, gbc_tfAD); -// tfAD.setColumns(10); -// -// JLabel lblSerial = new JLabel("Serial:"); -// GridBagConstraints gbc_lblSerial = new GridBagConstraints(); -// gbc_lblSerial.anchor = GridBagConstraints.EAST; -// gbc_lblSerial.insets = new Insets(0, 0, 5, 5); -// gbc_lblSerial.gridx = 0; -// gbc_lblSerial.gridy = 5; -// contentPane.add(lblSerial, gbc_lblSerial); -// -// tfSerial = new JTextField(); -// GridBagConstraints gbc_tfSerial = new GridBagConstraints(); -// gbc_tfSerial.insets = new Insets(0, 0, 5, 0); -// gbc_tfSerial.fill = GridBagConstraints.HORIZONTAL; -// gbc_tfSerial.gridx = 1; -// gbc_tfSerial.gridy = 5; -// contentPane.add(tfSerial, gbc_tfSerial); -// tfSerial.setColumns(10); -// -// JButton btnSetDevice = new JButton("Confirm Device"); -// GridBagConstraints gbc_btnSetDevice = new GridBagConstraints(); -// gbc_btnSetDevice.insets = new Insets(0, 0, 5, 0); -// gbc_btnSetDevice.gridx = 1; -// gbc_btnSetDevice.gridy = 6; -// contentPane.add(btnSetDevice, gbc_btnSetDevice); -// -// JScrollPane scrollPane = new JScrollPane(); -// GridBagConstraints gbc_scrollPane = new GridBagConstraints(); -// gbc_scrollPane.fill = GridBagConstraints.BOTH; -// gbc_scrollPane.gridwidth = 2; -// gbc_scrollPane.insets = new Insets(0, 0, 0, 5); -// gbc_scrollPane.gridx = 0; -// gbc_scrollPane.gridy = 7; -// contentPane.add(scrollPane, gbc_scrollPane); -// -// lMessages = new JList(); -// scrollPane.setViewportView(lMessages); -// -// this.initialize(); -// } -// -// private PulsCounterApplication application(){ -// return this.pulsCounterApplication; -// } -// -// private void initialize(){ -// this.reconnectTimer = new Timer("Reconnection Timer"); -// -// messageListModel = new DefaultListModel(); -// lMessages.setModel(messageListModel); -// -// application().addPulsCounterApplicationListener(this); -// -// setVisible(true); -// } -// -// /* -// @Override -// public void connectionStateChanged(Boolean connected) { -// -// if (!connected){ -// tfCommunication.setText("NO CONNECTION"); -// if (this.deviceChecker != null){ -// this.deviceChecker.cancel(); -// } -// reconnectTimer.schedule(new TimerTask() { -// -// @Override -// public void run() { -// if (!application().getServiceLink().isOpen()){ -// try { -// application().getServiceLink().open(); -// } catch (ServiceLinkException e) { -// e.printStackTrace(); -// } -// } -// } -// }, 3000); -// -// } else { -// if (this.deviceChecker != null){ -// while (this.deviceChecker.isAlive()){ -// try { -// Thread.sleep(100); -// } catch (InterruptedException e) { -// // TODO Auto-generated catch block -// e.printStackTrace(); -// } -// } -// } -// this.deviceChecker = new DeviceChecker(); -// this.deviceChecker.start(); -// } -// -// } -// */ -// -// @Override -// public synchronized void messageArrived(String message) { -// if (EventQueue.isDispatchThread()){ -// int pos = messageListModel.size(); -// String t = String.format("%s: %s",DateTime.NOW().getSQLDateTime(),message); -// messageListModel.addElement(t); -// lMessages.ensureIndexIsVisible(messageListModel.size()-1); -// } else { -// final String msg = message; -// EventQueue.invokeLater(new Runnable() { -// -// @Override -// public void run() { -// messageArrived(msg); -// } -// }); -// } -// } -// -// -// class DeviceChecker extends Thread { -// -// private boolean cancel; -// -// public DeviceChecker(){ -// cancel = false; -// } -// -// public void cancel(){ -// this.cancel = true; -// } -// -// @Override -// public void run() { -// -// checkCommunication(); -// checkEEPROM(); -// checkIO(); -// checkADC(); -// -// while (!cancel){ -// checkCommunication(); -// } -// -// } -// -// private void checkCommunication(){ -// if (!this.cancel){ -// Integer version = application().getServiceLink().getServiceRegisterCache().getCachedInteger(13, 0, 0x001A); -// Integer uptime = application().getServiceLink().getServiceRegisterCache().getCachedInteger(13, 0, 0x0022); -// -// if ((version != null)&&(uptime != null)){ -// tfCommunication.setText(String.format("OK (V: %d.%d.%d) Up: %d:%d:%d",version >> 16, (version >> 8) & 0xff, version & 0xff, uptime / 3600, (uptime / 60)%60, uptime % 60)); -// } -// } -// } -// -// private void checkEEPROM(){ -// if (!this.cancel){ -// Integer eesize = application().getServiceLink().getServiceRegisterCache().getCachedInteger(13, 0, 0x9000); -// if (eesize != null){ -// tfEEPROM.setText(String.format("EEPROM Size Detected: 0x%08x Bytes (%d kBytes)", eesize, (eesize >> 10))); -// } else { -// tfEEPROM.setText("EEPROM failed."); -// } -// } -// } -// -// private void checkIO(){ -// if (!this.cancel){ -// -// application().message("I/O test begins..."); -// application().message("I/O reset..."); -// -// try { -// application().getServiceLink().writeInt(13, 0, 0x0682, 0); -// application().getServiceLink().writeInt(13, 0, 0x0683, 0); -// application().getServiceLink().writeInt(13, 0, 0x0684, 0); -// application().getServiceLink().writeInt(13, 0, 0x0685, 0); -// -// application().message("counter reset."); -// for (int i=0;i<32;i++){ -// application().getServiceLink().writeInt(13, 0, 0x0600 + i, 0); -// } -// -// application().message("PullUP-Counter test."); -// for (int i=0;i<12;i++){ -// Thread.sleep(250); -// application().getServiceLink().writeInt(13, 0, 0x0683, -1); -// Thread.sleep(250); -// application().getServiceLink().writeInt(13, 0, 0x0683, 0); -// } -// -// for (int i=0;i<32;i++){ -// Thread.sleep(100); -// -// Integer c = application().getServiceLink().readInt(13, 0, 0x0600 + i); -// if ((c != null) && (c.equals(12))){ -// application().message(String.format("OK: Channel %d counted %d events.", i, c)); -// } else { -// application().message(String.format("FAILED: Channel %d counted %d events.", i, c)); -// } -// } -// -// -// -// application().message("I/O test finished!"); -// } catch (IOException | ServiceLinkException e) { -// e.printStackTrace(); -// -// application().message("I/O test FAILED!"); -// } catch (InterruptedException iex){ -// iex.printStackTrace(); -// -// application().message("I/O test FAILED!"); -// } -// -// -// -// } -// } -// -// private void checkADC(){ -// if (!this.cancel){ -// } -// } -// -// } -// -// -// @Override -// public void interfaceClassesChanged(PulsCounterApplication pulsCounterApplication) { -// // TODO Auto-generated method stub -// -// } -// -// @Override -// public void interfacesChanged(PulsCounterApplication pulsCounterApplication) { -// // TODO Auto-generated method stub -// -// } } diff --git a/src/org/hwo/pulscounter/ui/ExportFilesFrame.java b/src/org/hwo/pulscounter/ui/ExportFilesFrame.java index d2b7f81..1f7c4ad 100644 --- a/src/org/hwo/pulscounter/ui/ExportFilesFrame.java +++ b/src/org/hwo/pulscounter/ui/ExportFilesFrame.java @@ -41,6 +41,7 @@ public class ExportFilesFrame extends JFrame { private ExportSetting selectedExportSetting; private JSeparator separator; private JButton btnExec; + private JButton btnBatch; /** * Create the frame. @@ -118,6 +119,14 @@ public class ExportFilesFrame extends JFrame { doExport(); } }); + + btnBatch = new JButton("BATCH"); + btnBatch.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + doBatchExport(); + } + }); + toolBar.add(btnBatch); toolBar.add(btnExec); JScrollPane scrollPane = new JScrollPane(); @@ -176,5 +185,12 @@ public class ExportFilesFrame extends JFrame { ((ExportSetting)tmExportSettings.getSelectedRow()).export(); } + public void doBatchExport(){ + for (ExportSetting es: PulsCounterApplication.getApplication().getExportSettings()){ + if (es.getAutostart()){ + es.export(); + } + } + } } diff --git a/src/org/hwo/pulscounter/ui/NewMainWindow.java b/src/org/hwo/pulscounter/ui/NewMainWindow.java index 4a79c6e..06c299f 100644 --- a/src/org/hwo/pulscounter/ui/NewMainWindow.java +++ b/src/org/hwo/pulscounter/ui/NewMainWindow.java @@ -274,7 +274,12 @@ public class NewMainWindow implements PulsCounterApplicationListener, TaskletLis if (selectedDeviceInterface != null){ if (ServiceLinkDeviceConnector.class.isInstance(selectedDeviceInterface)){ ServiceLinkDeviceConnector dc = (ServiceLinkDeviceConnector)selectedDeviceInterface; - dc.setDeviceSerial(Integer.parseInt(descriptionText.substring(5))); + if (descriptionText.startsWith("!\"ยง$%&")){ + Integer escape = Integer.decode(descriptionText.substring(6)); + dc.escape(escape, 0); + } else { + dc.setDeviceSerial(Integer.parseInt(descriptionText.substring(5))); + } } } }