From 0ee2da6a6131ba96486b312f9f80401b9186b845 Mon Sep 17 00:00:00 2001 From: Harald Wolff Date: Tue, 6 Sep 2016 16:49:11 +0200 Subject: [PATCH] =?UTF-8?q?Alpha=20f=C3=BCr=2016/C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .classpath | 5 +- .gitignore | 5 +- .settings/org.eclipse.jdt.core.prefs | 7 +- postgresql-9.1-901.jdbc4.jar | Bin ...bstractPulsCounterApplicationListener.java | 10 + src/org/hwo/pulscounter/ExportSetting.java | 203 ++++ .../hwo/pulscounter/NewPulsCounterDevice.java | 20 +- src/org/hwo/pulscounter/PulsCounter.java | 305 ----- .../pulscounter/PulsCounter2Application.java | 182 ++- .../PulsCounterApplicationListener.java | 10 + src/org/hwo/pulscounter/SnapShot.java | 211 ++++ src/org/hwo/pulscounter/SnapshotManager.java | 321 +++++ src/org/hwo/pulscounter/TriggerType.java | 32 + .../pulscounter/elements/WorkShiftRecord.java | 4 +- .../hwo/pulscounter/ui/AppSettingsFrame.java | 490 +++++++- .../pulscounter/ui/AppSettingsListener.java | 2 +- src/org/hwo/pulscounter/ui/BatchRunner.java | 63 + .../hwo/pulscounter/ui/ChannelDisplay.java | 278 +++++ .../ui/ChannelDisplayListener.java | 8 + .../pulscounter/ui/CheckWorkshiftRecords.java | 302 ----- .../pulscounter/ui/DeviceConfiguration.java | 508 ++++++++ .../hwo/pulscounter/ui/DeviceTestFrame.java | 366 ++++++ .../hwo/pulscounter/ui/ExportFilesFrame.java | 181 +++ .../ui/ExportSettingsEditorDialog.java | 346 ++++++ .../pulscounter/ui/InspectionMainFrame.java | 122 -- src/org/hwo/pulscounter/ui/JBitSetter.java | 120 ++ src/org/hwo/pulscounter/ui/LiveViewFrame.java | 401 ++++++- src/org/hwo/pulscounter/ui/MainWindow.java | 98 -- src/org/hwo/pulscounter/ui/NewMainWindow.java | 913 +++++++++++++++ .../hwo/pulscounter/ui/PulsCounterWindow.java | 1038 ----------------- src/org/hwo/pulscounter/ui/sym_a_aktiv.png | Bin 0 -> 662 bytes src/org/hwo/pulscounter/ui/sym_a_passiv.png | Bin 0 -> 659 bytes src/org/hwo/pulscounter/ui/sym_e_aktiv.png | Bin 0 -> 422 bytes src/org/hwo/pulscounter/ui/sym_e_passiv.png | Bin 0 -> 430 bytes src/org/hwo/pulscounter/ui/sym_p2_aktiv.png | Bin 0 -> 380 bytes src/org/hwo/pulscounter/ui/sym_p2_passiv.png | Bin 0 -> 390 bytes src/org/hwo/pulscounter/ui/sym_p_aktiv.png | Bin 0 -> 421 bytes src/org/hwo/pulscounter/ui/sym_p_passiv.png | Bin 0 -> 431 bytes 38 files changed, 4622 insertions(+), 1929 deletions(-) mode change 100755 => 100644 postgresql-9.1-901.jdbc4.jar create mode 100644 src/org/hwo/pulscounter/AbstractPulsCounterApplicationListener.java create mode 100644 src/org/hwo/pulscounter/ExportSetting.java delete mode 100644 src/org/hwo/pulscounter/PulsCounter.java create mode 100644 src/org/hwo/pulscounter/PulsCounterApplicationListener.java create mode 100644 src/org/hwo/pulscounter/SnapShot.java create mode 100644 src/org/hwo/pulscounter/SnapshotManager.java create mode 100644 src/org/hwo/pulscounter/TriggerType.java create mode 100644 src/org/hwo/pulscounter/ui/BatchRunner.java create mode 100644 src/org/hwo/pulscounter/ui/ChannelDisplay.java create mode 100644 src/org/hwo/pulscounter/ui/ChannelDisplayListener.java delete mode 100644 src/org/hwo/pulscounter/ui/CheckWorkshiftRecords.java create mode 100644 src/org/hwo/pulscounter/ui/DeviceConfiguration.java create mode 100644 src/org/hwo/pulscounter/ui/DeviceTestFrame.java create mode 100644 src/org/hwo/pulscounter/ui/ExportFilesFrame.java create mode 100644 src/org/hwo/pulscounter/ui/ExportSettingsEditorDialog.java delete mode 100644 src/org/hwo/pulscounter/ui/InspectionMainFrame.java create mode 100644 src/org/hwo/pulscounter/ui/JBitSetter.java delete mode 100644 src/org/hwo/pulscounter/ui/MainWindow.java create mode 100644 src/org/hwo/pulscounter/ui/NewMainWindow.java delete mode 100644 src/org/hwo/pulscounter/ui/PulsCounterWindow.java create mode 100644 src/org/hwo/pulscounter/ui/sym_a_aktiv.png create mode 100644 src/org/hwo/pulscounter/ui/sym_a_passiv.png create mode 100644 src/org/hwo/pulscounter/ui/sym_e_aktiv.png create mode 100644 src/org/hwo/pulscounter/ui/sym_e_passiv.png create mode 100644 src/org/hwo/pulscounter/ui/sym_p2_aktiv.png create mode 100644 src/org/hwo/pulscounter/ui/sym_p2_passiv.png create mode 100644 src/org/hwo/pulscounter/ui/sym_p_aktiv.png create mode 100644 src/org/hwo/pulscounter/ui/sym_p_passiv.png diff --git a/.classpath b/.classpath index 82f2ca1..47daea1 100644 --- a/.classpath +++ b/.classpath @@ -1,8 +1,11 @@ - + + + + diff --git a/.gitignore b/.gitignore index d766072..06a51e8 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,7 @@ bin/** /bin live.csv -chnames.prop \ No newline at end of file +chnames.prop +*.dat +*.log +*.old diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs index 8000cd6..d17b672 100644 --- a/.settings/org.eclipse.jdt.core.prefs +++ b/.settings/org.eclipse.jdt.core.prefs @@ -1,11 +1,12 @@ eclipse.preferences.version=1 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.compliance=1.7 org.eclipse.jdt.core.compiler.debug.lineNumber=generate org.eclipse.jdt.core.compiler.debug.localVariable=generate org.eclipse.jdt.core.compiler.debug.sourceFile=generate org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.6 +org.eclipse.jdt.core.compiler.source=1.7 diff --git a/postgresql-9.1-901.jdbc4.jar b/postgresql-9.1-901.jdbc4.jar old mode 100755 new mode 100644 diff --git a/src/org/hwo/pulscounter/AbstractPulsCounterApplicationListener.java b/src/org/hwo/pulscounter/AbstractPulsCounterApplicationListener.java new file mode 100644 index 0000000..5dc6716 --- /dev/null +++ b/src/org/hwo/pulscounter/AbstractPulsCounterApplicationListener.java @@ -0,0 +1,10 @@ +package org.hwo.pulscounter; + +public abstract class AbstractPulsCounterApplicationListener implements PulsCounterApplicationListener { + + @Override + public void serialPortChanged() { + + } + +} diff --git a/src/org/hwo/pulscounter/ExportSetting.java b/src/org/hwo/pulscounter/ExportSetting.java new file mode 100644 index 0000000..2e330b5 --- /dev/null +++ b/src/org/hwo/pulscounter/ExportSetting.java @@ -0,0 +1,203 @@ +package org.hwo.pulscounter; + +import java.io.File; +import java.text.SimpleDateFormat; +import java.util.Arrays; +import java.util.Calendar; +import java.util.Date; +import java.util.Hashtable; +import java.util.Iterator; + +import org.hwo.configuration.ConfigurableAttribute; +import org.hwo.configuration.ConfigurableObject; +import org.hwo.csv.CSV; +import org.hwo.csv.CSVRecord; +import org.hwo.interactiveobjects.InteractiveObject; +import org.hwo.interactiveobjects.ObjectEditorUI; +import org.hwo.models.TableMapper.TableColumn; +import org.hwo.pulscounter.ui.ExportSettingsEditorDialog; + +@ObjectEditorUI(editor=ExportSettingsEditorDialog.class) +@ConfigurableObject +public class ExportSetting { + + @ConfigurableAttribute + private String name; + @ConfigurableAttribute + private TriggerType triggerType; + @ConfigurableAttribute + private Integer triggerSource; + @ConfigurableAttribute + private String fileName; + @ConfigurableAttribute + private String path; + @ConfigurableAttribute + private Boolean extended; + @ConfigurableAttribute + private Boolean autostart; + @ConfigurableAttribute + private Boolean recordDelta; + + private SimpleDateFormat dateFormat; + + public ExportSetting() { + this.dateFormat = new SimpleDateFormat(); + this.name = "unbenannt"; + this.path = "."; + this.fileName = "synololog.csv"; + this.triggerType = triggerType.ALL; + this.triggerSource = 0; + this.extended = false; + this.autostart = false; + this.recordDelta = false; + } + + @TableColumn(label="Benennung",firstColumn=true) + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + + @TableColumn(label="Auslöser") + public TriggerType getTriggerType() { + return triggerType; + } + public void setTriggerType(TriggerType triggerType) { + this.triggerType = triggerType; + } + + @TableColumn(label="Dateiname") + public String getFileName() { + return fileName; + } + public void setFileName(String fileName) { + this.fileName = fileName; + } + + @TableColumn(label="Verzeichnis") + public String getPath() { + return path; + } + public void setPath(String path) { + this.path = path; + } + + public Integer getTriggerSource() { + return triggerSource; + } + public void setTriggerSource(Integer triggerSource) { + this.triggerSource = triggerSource; + } + + public Boolean getExtended() { + return extended; + } + public void setExtended(Boolean extended) { + this.extended = extended; + } + + @TableColumn(label="Autostart",after="Auslöser") + public Boolean getAutostart() { + return autostart; + } + public void setAutostart(Boolean autostart) { + this.autostart = autostart; + } + + public Boolean getRecordDelta() { + return recordDelta; + } + public void setRecordDelta(Boolean recordDelta) { + this.recordDelta = recordDelta; + } + + private String calculateFileName(String filename,SnapShot ss){ + Date d = new Date(((long)ss.getTimestamp())*1000); + Calendar c = Calendar.getInstance(); + c.setTime(d); + + return filename + .replaceAll("\\%Y", String.format("%04d", new Integer(c.get(Calendar.YEAR)))) + .replaceAll("\\%M", String.format("%02d", new Integer(c.get(Calendar.MONTH)+1))) + .replaceAll("\\%D", String.format("%02d", new Integer(c.get(Calendar.DAY_OF_MONTH)))); + } + + public void export(){ + SnapshotManager ssm = PulsCounter2Application.getApplication().getSnapshotManager(); + + Hashtable hash = new Hashtable(); + + for (int n=0;n iter = csv.getRecords().iterator(); + + iter.next(); + + CSVRecord n = iter.next(); + Integer[] vals = new Integer[32]; + + for (int i=0;i<32;i++){ + vals[i] = n.getIntegerValue(extended ? i + 4 : i + 1 ); + } + + while (iter.hasNext()){ + n = iter.next(); + + for (int i=0;i<32;i++){ + Integer v = n.getIntegerValue(extended ? i + 4 : i + 1 ); + n.setValue(extended ? i + 4 : i + 1 , v - vals[i]); + vals[i] = v; + } + } + + csv.getRecords().remove(1); + + } + + + } + + + hash.get(fn).saveToFile(new File(path,fn)); + } + } + + +} diff --git a/src/org/hwo/pulscounter/NewPulsCounterDevice.java b/src/org/hwo/pulscounter/NewPulsCounterDevice.java index db9fcbc..e327cfd 100644 --- a/src/org/hwo/pulscounter/NewPulsCounterDevice.java +++ b/src/org/hwo/pulscounter/NewPulsCounterDevice.java @@ -17,9 +17,10 @@ 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; +import org.hwo.io.NewSerialPort.NewSerialPort; +import org.hwo.servicelink.ServiceLink; +import org.hwo.servicelink.ServiceLinkException; +import org.hwo.servicelink.ServiceLinkRequestFailedException; public class NewPulsCounterDevice implements IPulsCounter { private ServiceLink serviceLink; @@ -64,7 +65,7 @@ public class NewPulsCounterDevice implements IPulsCounter { if (!serviceLink.isOpen()) try { serviceLink.open(); - serviceLink.getSerialPort().setTimeout(250); + serviceLink.getSerialPort().setTimeOut(250); try { Thread.sleep(500); } catch (InterruptedException e) { @@ -86,11 +87,11 @@ public class NewPulsCounterDevice implements IPulsCounter { return new Date(); } - public SerialPort getSerialPort() { + public NewSerialPort getSerialPort() { return serviceLink.getSerialPort(); } - public void setSerialPort(SerialPort serialPort) throws ServiceLinkException { + public void setSerialPort(NewSerialPort serialPort) throws ServiceLinkException { if (this.serviceLink == null) this.serviceLink = new ServiceLink(serialPort); @@ -100,7 +101,7 @@ public class NewPulsCounterDevice implements IPulsCounter { this.serviceLink.setSerialPort(serialPort);; this.serviceLink.open(); - this.serviceLink.getSerialPort().setTimeout(500); + this.serviceLink.getSerialPort().setTimeOut(500); /* try { this.serviceLink.readInt((byte)0, (byte)0, 0); @@ -219,9 +220,8 @@ public class NewPulsCounterDevice implements IPulsCounter { saveProps(); if ((this.serviceLink == null) || (serviceLink.getSerialPort() == null)) { - SerialPort sport = SerialPort.newInstance(); - sport.setPortName(interfaceName); - setSerialPort(sport); + NewSerialPort nsp = new NewSerialPort(interfaceName); + setSerialPort(nsp); } else { serviceLink.getSerialPort().setPortName(interfaceName); } diff --git a/src/org/hwo/pulscounter/PulsCounter.java b/src/org/hwo/pulscounter/PulsCounter.java deleted file mode 100644 index 1e706af..0000000 --- a/src/org/hwo/pulscounter/PulsCounter.java +++ /dev/null @@ -1,305 +0,0 @@ -package org.hwo.pulscounter; - -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.FileWriter; -import java.io.IOException; -import java.io.PrintStream; -import java.lang.reflect.Field; -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.text.DateFormat; -import java.util.Arrays; -import java.util.Date; -import java.util.Iterator; -import java.util.List; -import java.util.logging.Level; -import java.util.logging.LogManager; -import java.util.logging.Logger; -import java.util.prefs.Preferences; - -import org.hwo.beacon.Beacon; -import org.hwo.beacon.Beacon.BeaconSender; -import org.hwo.csv.CSV; -import org.hwo.io.SerialPortExeption; -import org.hwo.os.OsDetect; -import org.hwo.os.OsDetect.OsType; -import org.hwo.pulscounter.application.InspectorApplication; -import org.hwo.pulscounter.service.PulsCounterService; -import org.hwo.pulscounter.ui.PulsCounterWindow; -import org.hwo.rpc.json.RPCAdapter; -import org.hwo.rpc.simple.SimpleRPCServer; -import org.hwo.rpc.simple.SimpleRPCService; - - -public class PulsCounter { - - static private Preferences prefs; - public static Preferences getPrefs() { - return prefs; - } - - static private PulsCounterService localService; - public static PulsCounterService getLocalService(){ - return localService; - } - - static private InspectorApplication inspectorApplication; - static public InspectorApplication getInspectorApplication() { - if (inspectorApplication == null) - inspectorApplication = new InspectorApplication(); - return inspectorApplication; - } - - - static String logFile; - - static boolean serverMode = false; - static boolean guiMode = true; - static boolean batchMode = false; - static boolean batchConvert = false; - - static boolean startLocalService = false; - - static String batchFilename = null; - static String networkName = null; - static String batchConvertTarget = null; - - static boolean debugMode = false; - - - public static void main(String args[]) - { - File cwd = new File("."); - -/* System.err.println("Starting on OS: " + System.getProperty("os.name")); - System.err.println("Current Directory: " + cwd.getAbsolutePath()); - System.err.println("Library Path: " + System.getProperty("java.library.path")); - */ - - Logger rootLogger = LogManager.getLogManager().getLogger(""); - if (rootLogger != null){ - rootLogger.setLevel(Level.SEVERE); - } - - prefs = Preferences.userRoot(); - - if (OsDetect.getOperatingSystem() == OsType.LINUX) - { -// System.err.println("Linux erkannt. Patche java.library.path"); -// System.setProperty("java.library.path",String.format(".:%s",System.getProperty("java.library.path"))); - Field fieldSysPath; - try { - fieldSysPath = ClassLoader.class.getDeclaredField( "sys_paths" ); - fieldSysPath.setAccessible( true ); - fieldSysPath.set( null, null ); - } catch (SecurityException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (NoSuchFieldException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (IllegalArgumentException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (IllegalAccessException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - -// System.err.println("Library Path: " + System.getProperty("java.library.path")); - } - - - /* TODO: Load serverMode default from local preferences */ - - startLocalService = prefs.getBoolean("pulscounter.local.enabled", false); - - Iterator options = Arrays.asList(args).iterator(); - - while (options.hasNext()) { - String no = options.next(); - - 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(); - } - - } - - - - - if (batchMode) - guiMode = false; - - - - localService = new PulsCounterService(); - - if (startLocalService){ - localService.start(); - - } - - 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; + private List appSettingsListeners; + private List applicationListeners; - public PulsCounter2Application(){ + private boolean snapshotLock; + + private Vector unseenMessages; + + private SnapshotManager snapshotManager; + + private List exportSettings; + + private Scheduler scheduler; + + public PulsCounter2Application() { appSettingsListeners = new LinkedList(); + applicationListeners = new LinkedList(); + unseenMessages = new Vector(); + exportSettings = new LinkedList(); + scheduler = new Scheduler(); + + loadPrefs(); + + try { + snapshotManager = new SnapshotManager(); + snapshotManager.notify(Notification.INITIALIZE); + + } catch (FileNotFoundException e){ + e.printStackTrace(); + } + } + + public void addAppSettingsListener(AppSettingsListener listener){ appSettingsListeners.add(listener); @@ -33,31 +71,78 @@ public class PulsCounter2Application { appSettingsListeners.remove(listener); } - private void fireServiceLinkChanged(){ + public void addPulsCounterApplicationListener(PulsCounterApplicationListener listener){ + applicationListeners.add(listener); + } + public void removePulsCounterApplicationListener(PulsCounterApplicationListener listener){ + applicationListeners.remove(listener); + } + + + public void fireServiceLinkChanged(){ for (AppSettingsListener l: appSettingsListeners){ l.ServiceLinkChanged(serviceLink); } } - public synchronized SerialPort getSerialPort() { + public void fireSerialPortChanged(){ + for (PulsCounterApplicationListener listener: applicationListeners){ + listener.serialPortChanged(); + } + } + + public void fireConnectionStateChanged(){ + fireConnectionStateChanged(getServiceLink().isOpen()); + } + + public void fireConnectionStateChanged(Boolean connected){ + for (PulsCounterApplicationListener listener: applicationListeners){ + listener.connectionStateChanged(connected); + } + } + + public void message(String message){ + + if (applicationListeners.size() == 0){ + unseenMessages.addElement(message); + } else { + while (!unseenMessages.isEmpty()){ + String msg = unseenMessages.remove(0); + for (PulsCounterApplicationListener listener: applicationListeners){ + listener.messageArrived(msg); + } + } + + for (PulsCounterApplicationListener listener: applicationListeners){ + listener.messageArrived(message); + } + }; + } + + public synchronized NewSerialPort getSerialPort() { + if (serialPort == null){ + serialPort = new NewSerialPort("COM1:"); + } return serialPort; } - public synchronized void setSerialPort(SerialPort serialPort) { + public synchronized void setSerialPort(NewSerialPort serialPort) { if (serviceLink != null){ serviceLink.close(); serviceLink = null; } this.serialPort = serialPort; + getServiceLink(); + fireServiceLinkChanged(); + fireSerialPortChanged(); } public synchronized ServiceLink getServiceLink() { if (serviceLink == null){ - if (serialPort != null){ - serviceLink = new ServiceLink(serialPort); - serviceLink.getSerialPort().setTimeout(200); - } + serviceLink = new ServiceLink(getSerialPort()); + serviceLink.getSerialPort().setTimeOut(200); + serviceLink.addServiceLinkListener(this); } return serviceLink; } @@ -70,6 +155,77 @@ public class PulsCounter2Application { fireServiceLinkChanged(); } + private Preferences getPreferencesNode(){ + return Preferences.userNodeForPackage(getClass()); + } + + public void savePrefs(){ + Preferences prefs = getPreferencesNode(); + + if (serialPort != null) + prefs.put("io.port", serialPort.getPortName()); + + System.out.println(String.format("savePrefs(): %d exportSettings werden gesichert.", exportSettings.size())); + if (exportSettings.size()>0) + { + for (int n=0;n getExportSettings() { + return exportSettings; + } + + public void shutdown(){ + System.err.println("Shutting down..."); + this.scheduler.shutdown(); + this.snapshotManager.doShutdown(); + TaskletManager.instance().shutdown(); + + this.getServiceLink().close(); + } } diff --git a/src/org/hwo/pulscounter/PulsCounterApplicationListener.java b/src/org/hwo/pulscounter/PulsCounterApplicationListener.java new file mode 100644 index 0000000..974a53e --- /dev/null +++ b/src/org/hwo/pulscounter/PulsCounterApplicationListener.java @@ -0,0 +1,10 @@ +package org.hwo.pulscounter; + +public interface PulsCounterApplicationListener { + + void serialPortChanged(); + void connectionStateChanged(Boolean connected); + + void messageArrived(String message); + +} diff --git a/src/org/hwo/pulscounter/SnapShot.java b/src/org/hwo/pulscounter/SnapShot.java new file mode 100644 index 0000000..b276c0f --- /dev/null +++ b/src/org/hwo/pulscounter/SnapShot.java @@ -0,0 +1,211 @@ +package org.hwo.pulscounter; + +import java.io.IOException; +import java.nio.ByteBuffer; +import java.text.SimpleDateFormat; +import java.util.Arrays; +import java.util.Date; + +import org.hwo.csv.CSVRecord; +import org.hwo.servicelink.ServiceLink; +import org.hwo.servicelink.ServiceLinkException; + +public class SnapShot { + Integer timestamp; + Integer field0; + + Integer[] values; + Integer[] analog; + + Integer inputmask, + outputmask, + pullupmask, + invertmask, + triggermask; + + public SnapShot(){ + this.values = new Integer[32]; + this.analog = new Integer[8]; + } + + public SnapShot(byte[] bytes){ + this.values = new Integer[32]; + this.analog = new Integer[8]; + + fromBytes(bytes); + } + + public void setField0(Integer field0) { + this.field0 = field0; + } + public Integer getField0() { + return field0; + } + public void setTimestamp(Integer timestamp) { + this.timestamp = timestamp; + } + public Integer getTimestamp() { + return timestamp; + } + public Integer getInputmask() { + return inputmask; + } + public void setInputmask(Integer inputmask) { + this.inputmask = inputmask; + } + public Integer getOutputmask() { + return outputmask; + } + public void setOutputmask(Integer outputmask) { + this.outputmask = outputmask; + } + public Integer getPullupmask() { + return pullupmask; + } + public void setPullupmask(Integer pullupmask) { + this.pullupmask = pullupmask; + } + public Integer getInvertmask() { + return invertmask; + } + public void setInvertmask(Integer invertmask) { + this.invertmask = invertmask; + } + public Integer getTriggermask() { + return triggermask; + } + public void setTriggermask(Integer triggermask) { + this.triggermask = triggermask; + } + + public void setValue(Integer ch,Integer value){ + if ((ch >= 0) && (ch<32)){ + this.values[ch] = value; + } + } + public Integer getValue(Integer ch){ + if ((ch >= 0) && (ch<32)){ + return this.values[ch]; + } + return null; + } + public Integer[] getValues(){ + return Arrays.copyOf(this.values, this.values.length); + } + + public void setAnalog(Integer ch,Integer value){ + if ((ch >= 0) && (ch<8)){ + this.analog[ch] = value; + } + } + public Integer getAnalog(Integer ch){ + if ((ch >= 0) && (ch<8)){ + return this.analog[ch]; + } + return null; + } + public Integer[] getAnalog(){ + return Arrays.copyOf(this.analog, this.analog.length); + } + + public long getHashCode(){ + return ((long)timestamp << 32) | field0; + } + + public TriggerType getTriggerType(){ + return TriggerType.get(this.field0 & 0xff); + } + + public int getSource(){ + return (field0 >> 8) & 0xff; + } + + + public byte[] toBytes(){ + byte[] buffer = new byte[256]; + ByteBuffer bb = ByteBuffer.wrap(buffer); + + Arrays.fill(buffer, (byte)0); + + bb.putInt(0, timestamp); + bb.putInt(4, field0); + bb.putInt(8, inputmask); + bb.putInt(12, outputmask); + bb.putInt(16, pullupmask); + bb.putInt(20, invertmask); + bb.putInt(24, triggermask); + + for (int i=0;i<32;i++){ + bb.putInt(32 + (i<<2), values[i]); + } + for (int i=0;i<8;i++){ + bb.putInt(160 + (i<<2), analog[i]); + } + + return buffer; + } + + private void fromBytes(byte[] bytes){ + ByteBuffer bb = ByteBuffer.wrap(bytes); + + timestamp = bb.getInt(0); + field0 = bb.getInt(4); + inputmask = bb.getInt(8); + outputmask = bb.getInt(12); + pullupmask = bb.getInt(16); + invertmask = bb.getInt(20); + triggermask = bb.getInt(24); + + for (int i=0;i<32;i++){ + values[i] = bb.getInt(32 + (i<<2)); + } + for (int i=0;i<8;i++){ + analog[i] = bb.getInt(160 + (i<<2)); + } + } + + public CSVRecord getCSVRecord(){ + return getCSVRecord(false); + } + public CSVRecord getCSVRecord(Boolean extended){ + CSVRecord record = new CSVRecord(); + + if (extended) + record.appendValue(timestamp); + + SimpleDateFormat df = new SimpleDateFormat("YYYY-MM-dd HH:mm:ss"); + + record.appendValue(df.format(new Date(((long)timestamp)*1000))); + + if (extended){ + record.appendValue("TRIGGER"); + record.appendValue("QUELLE"); + } + + for (int n=0;n<32;n++) + record.appendValue( values[n]); + for (int n=0;n<8;n++) + record.appendValue( analog[n]); + + return record; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + + sb.append("SnapShot("); + sb.append(this.timestamp); + sb.append(":"); + for (int i=0;i<32;i++){ + if (i>0) + sb.append(","); + sb.append(this.values[i]); + } + + sb.append(")"); + + return sb.toString(); + } + +} diff --git a/src/org/hwo/pulscounter/SnapshotManager.java b/src/org/hwo/pulscounter/SnapshotManager.java new file mode 100644 index 0000000..9914df4 --- /dev/null +++ b/src/org/hwo/pulscounter/SnapshotManager.java @@ -0,0 +1,321 @@ +package org.hwo.pulscounter; + + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.RandomAccessFile; +import java.nio.ByteBuffer; +import java.util.Hashtable; + +import org.hwo.servicelink.ServiceLinkException; +import org.hwo.servicelink.ServiceLinkRequestFailedException; +import org.hwo.tasklet.Tasklet; +import org.hwo.tasklet.TaskletManager; + +public class SnapshotManager { + + public enum Notification { INITIALIZE, SHUTDOWN, SYNC, FULLSYNC }; + + private RandomAccessFile file; + + private Hashtable hashList; + + private Integer lastNewest, + snapshotSize; + + + public SnapshotManager() throws FileNotFoundException { + this.file = new RandomAccessFile("snapshots.dat", "rws"); + this.initialize(); + } + + public SnapshotManager(File file) throws FileNotFoundException { + this.file = new RandomAccessFile(file, "rws"); + this.initialize(); + } + + private synchronized void initialize(){ + hashList = new Hashtable(); + + } + + + private PulsCounter2Application application(){ + return PulsCounter2Application.getApplication(); + } + + public synchronized void notify(Notification notification){ + switch (notification){ + case INITIALIZE: + TaskletManager.instance().enqueue(new Tasklet("SnapShot Manager initialisieren") { + + @Override + public void run() { + doInitialize(); + } + }); + break; + case SHUTDOWN: + doShutdown(); + return; + case FULLSYNC: + TaskletManager.instance().enqueue(new Tasklet("Volle Synchronisation") { + + @Override + public void run() { + doFullSync(); + } + }); + break; + case SYNC: + TaskletManager.instance().enqueue(new Tasklet("Schnelle Synchronisation") { + + @Override + public void run() { + doSync(); + } + }); + break; + } + } + + + public synchronized void doInitialize(){ + try { + byte[] buffer = new byte[256]; + ByteBuffer bb = ByteBuffer.wrap(buffer); + Integer ind = 0; + + application().message("SnapShotManager: Initialisieren"); + + hashList.clear(); + file.seek(0); + + while (file.read(buffer)==256){ + Integer timestamp,field0; + Long hash; + + timestamp = bb.getInt(0); + field0 = bb.getInt(4); + + hash = ((long)timestamp << 32) | field0; + + hashList.put(hash, ind++); + } + + application().message(String.format("SnapShotManager: %d SnapShots lokal", hashList.size())); + + } catch (Exception e){ + e.printStackTrace(); + application().message("SnapShotManager meldet Fehler: " + e.toString()); + } + } + + public synchronized void doShutdown(){ + + } + + public synchronized void doFullSync(){ + Integer ind_oldest,ind_newest,ind; + int n = 0; + + application().message("SnapShotManager: Beginne volle synchronisation"); + + try { + try { + snapshotSize = application().getServiceLink().readInt(13, 0, 0x0582); + } catch (ServiceLinkRequestFailedException e){ + snapshotSize = 512; + } + + ind_oldest = application().getServiceLink().readInt(13, 0, 0x0580); + ind_newest = application().getServiceLink().readInt(13, 0, 0x0581); + lastNewest = ind_newest; + + System.out.println(String.format("ind_oldest: %d", ind_oldest)); + System.out.println(String.format("ind_newest: %d", ind_newest)); + + ind = ind_oldest; + + do { + TaskletManager.instance().setProgress(String.format("%d / %d", n++, snapshotSize)); + + Integer id; + try { + application().getServiceLink().writeInt(13, 0, 0x0500, ind); + id = application().getServiceLink().readInt(13, 0, 0x0500); + if (!id.equals(ind)){ + System.out.println(String.format("bus_snapshot_id: %d != %d",ind,id)); + } else { + Integer ts,f0; + + ts = application().getServiceLink().readInt(13, 0, 0x0501); + f0 = application().getServiceLink().readInt(13, 0, 0x0502); + + Long hash = ((long)ts<<32) | f0; + + if (!hashList.containsKey(hash)){ + SnapShot snap = snapshotFromDevice(ind); + if (snap != null){ + Integer find = snapshotToFile(snap); + if (find != -1){ + hashList.put(snap.getHashCode(), find); + } else { + application().message("Snapshot konnte nicht gespeichert werden!"); + } + }; + }; + }; + + if (ind.equals(ind_newest)) + break; + + } catch (ServiceLinkRequestFailedException failed){ + failed.printStackTrace(); + }; + + ind++; + if (ind > snapshotSize){ + ind = 0; + } + + } while (!ind.equals(ind_oldest)); + + } catch (Exception e){ + e.printStackTrace(); + } + + application().message(String.format("SnapShotManager: %d bekannte Snapshots nach FullSync", hashList.size())); + + } + + private synchronized void doSync(){ + Integer ind_oldest,ind_newest,ind; + int n,c; + + try { + ind_newest = application().getServiceLink().readInt(13, 0, 0x0581); + + if (ind_newest == lastNewest) + return; + + ind = lastNewest; + + c = ind_newest - lastNewest; + if (c < 0) + c+=snapshotSize; + + n = 0; + + if (c == 0){ + return; + } + + do { + TaskletManager.instance().setProgress(String.format("%d / %d", n,c)); + + ind ++; + ind &= 0x1FF; + n++; + + SnapShot snap = snapshotFromDevice(ind); + if (snap != null){ + Integer ind_file = snapshotToFile(snap); + + hashList.put(snap.getHashCode(), ind_file); + } + + } while (!ind.equals(ind_newest)); + + lastNewest = ind_newest; + + application().message(String.format("%d neue Snapshots", n)); + + + } catch (ServiceLinkRequestFailedException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } catch (ServiceLinkException e) { + e.printStackTrace(); + } + + } + + public synchronized SnapShot loadSnapShot(int ind){ + byte[] bytes = new byte[256]; + + try { + file.seek(ind * 256); + file.read(bytes); + return new SnapShot(bytes); + } catch (IOException e) { + e.printStackTrace(); + } + return null; + } + + public synchronized Integer size(){ + try { + return ((int)(file.length())/256); + } catch (IOException e) { + e.printStackTrace(); + } + return 0; + } + + private synchronized Integer snapshotToFile(SnapShot snap){ + Long find; + try { + + find = file.length()/256; + + file.seek(find * 256); + file.write(snap.toBytes()); + + + return find.intValue(); + } catch (IOException e) { + e.printStackTrace(); + return -1; + } + } + + private SnapShot snapshotFromDevice(Integer ind){ + SnapShot ss = new SnapShot(); + Integer id; + try { + application().getServiceLink().writeInt(13, 0, 0x0500, ind); + id = application().getServiceLink().readInt(13, 0, 0x0500); + if (!id.equals(ind)){ + System.out.println(String.format("bus_snapshot_id: %d != %d",ind,id)); + return null; + }; + ss.setTimestamp( application().getServiceLink().readInt(13, 0, 0x0501)); + ss.setField0( application().getServiceLink().readInt(13, 0, 0x0502)); + ss.setInputmask( application().getServiceLink().readInt(13, 0, 0x0503)); + ss.setOutputmask( application().getServiceLink().readInt(13, 0, 0x0504)); + ss.setPullupmask( application().getServiceLink().readInt(13, 0, 0x0505)); + ss.setInvertmask( application().getServiceLink().readInt(13, 0, 0x0506)); + ss.setTriggermask( application().getServiceLink().readInt(13, 0, 0x0507)); + + for (int i=0;i<32;i++){ + ss.setValue(i, application().getServiceLink().readInt(13, 0, 0x0510 + i)); + } + for (int i=0;i<8;i++){ + ss.setAnalog(i, application().getServiceLink().readInt(13, 0, 0x0508 + i)); + } + + + } catch (Exception e){ + e.printStackTrace(); + return null; + } + + System.out.print(String.format("Snapshot from Device: %s\n", ss.toString())); + + return ss; + } + +} diff --git a/src/org/hwo/pulscounter/TriggerType.java b/src/org/hwo/pulscounter/TriggerType.java new file mode 100644 index 0000000..ddb6c6f --- /dev/null +++ b/src/org/hwo/pulscounter/TriggerType.java @@ -0,0 +1,32 @@ +package org.hwo.pulscounter; + +public enum TriggerType { + + Intervall(1),Trigger(2),Timer(4),Manual(8),ALL(-1),UNKOWN(-2); + + TriggerType(int n){ + this.n = n; + } + + public static TriggerType get(int n){ + switch (n){ + case 1: + return TriggerType.Intervall; + case 2: + return TriggerType.Trigger; + case 4: + return TriggerType.Timer; + case 8: + return TriggerType.Manual; + default: + return TriggerType.UNKOWN; + } + } + + Integer n; + + public Integer getValue(){ + return this.n; + } + +} diff --git a/src/org/hwo/pulscounter/elements/WorkShiftRecord.java b/src/org/hwo/pulscounter/elements/WorkShiftRecord.java index 8c1707e..49123dc 100644 --- a/src/org/hwo/pulscounter/elements/WorkShiftRecord.java +++ b/src/org/hwo/pulscounter/elements/WorkShiftRecord.java @@ -10,7 +10,6 @@ import java.util.List; import org.hwo.datetime.Date; import org.hwo.datetime.DateTime; -import org.hwo.pulscounter.PulsCounter; public class WorkShiftRecord { @@ -86,7 +85,7 @@ public class WorkShiftRecord { } void loadRecords(){ - try { +/* 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()); @@ -119,6 +118,7 @@ public class WorkShiftRecord { } catch (SQLException e) { e.printStackTrace(); } + */ } public Integer[] getChannels(){ diff --git a/src/org/hwo/pulscounter/ui/AppSettingsFrame.java b/src/org/hwo/pulscounter/ui/AppSettingsFrame.java index 034fdea..e8161b7 100644 --- a/src/org/hwo/pulscounter/ui/AppSettingsFrame.java +++ b/src/org/hwo/pulscounter/ui/AppSettingsFrame.java @@ -1,8 +1,10 @@ package org.hwo.pulscounter.ui; import java.awt.BorderLayout; +import java.awt.Component; import java.awt.EventQueue; +import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.border.EmptyBorder; @@ -21,27 +23,65 @@ import java.awt.Insets; import javax.swing.JTextField; import javax.swing.JButton; +import org.hwo.csv.CSV; import org.hwo.io.SerialPort; -import org.hwo.io.SerialPortChooser; +import org.hwo.io.NewSerialPort.NewSerialPort; import org.hwo.pulscounter.PulsCounter2Application; +import org.hwo.pulscounter.SnapShot; +import org.hwo.pulscounter.SnapshotManager; +import org.hwo.servicelink.ServiceLink; +import org.hwo.servicelink.ServiceLinkException; +import org.hwo.servicelink.ServiceLinkRequestFailedException; +import org.hwo.ui.dialog.SerialPortChooser; import java.awt.event.ActionListener; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.PrintStream; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.Hashtable; +import java.util.Timer; +import java.util.TimerTask; import java.awt.event.ActionEvent; +import java.awt.Dialog.ModalityType; +import javax.swing.border.TitledBorder; +import javax.swing.JSpinner; +import javax.swing.JEditorPane; +import javax.swing.JScrollPane; -public class AppSettingsFrame extends JFrame { +public class AppSettingsFrame extends JDialog { private JPanel contentPane; private JTextField tfInterface; - private SerialPort selectedSerialPort; - + private NewSerialPort selectedSerialPort,formerSerialPort; + private JTextField timeComputer; + private JTextField timeSynololog; + private JSpinner spTrimm; + private Timer timer; + + private Calendar calendar = Calendar.getInstance(); + private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + private JTabbedPane tabbedPane; + private JPanel debugPanel; + private JLabel lHeapDec; + private JLabel lHeapHex; + private JLabel lSStackDec; + private JLabel lSStackHex; + private JEditorPane msgExc; + /** * Create the frame. */ public AppSettingsFrame() { + setModalityType(ModalityType.APPLICATION_MODAL); + setModal(true); setTitle("Einstellungen"); - setModalExclusionType(ModalExclusionType.APPLICATION_EXCLUDE); setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); setBounds(100, 100, 603, 447); contentPane = new JPanel(); @@ -49,7 +89,7 @@ public class AppSettingsFrame extends JFrame { contentPane.setLayout(new BorderLayout(0, 0)); setContentPane(contentPane); - JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.TOP); + tabbedPane = new JTabbedPane(JTabbedPane.TOP); contentPane.add(tabbedPane, BorderLayout.CENTER); JPanel panel = new JPanel(); @@ -71,6 +111,7 @@ public class AppSettingsFrame extends JFrame { panel.add(lblSchnittstelle, gbc_lblSchnittstelle); tfInterface = new JTextField(); + tfInterface.setToolTipText("\nAktuell eingstellte Schnittstelle
\n
\nDiese Schnittstelle wird wür die Kommunikation mit dem Synololog verwendet.\n"); GridBagConstraints gbc_tfInterface = new GridBagConstraints(); gbc_tfInterface.anchor = GridBagConstraints.NORTH; gbc_tfInterface.insets = new Insets(0, 0, 5, 5); @@ -92,6 +133,235 @@ public class AppSettingsFrame extends JFrame { gbc_btnWhlen.gridy = 0; panel.add(btnWhlen, gbc_btnWhlen); + JPanel panel_3 = new JPanel(); + tabbedPane.addTab("Inbetriebnahme", null, panel_3, null); + GridBagLayout gbl_panel_3 = new GridBagLayout(); + gbl_panel_3.columnWidths = new int[]{0, 0}; + gbl_panel_3.rowHeights = new int[]{0, 0}; + gbl_panel_3.columnWeights = new double[]{1.0, Double.MIN_VALUE}; + gbl_panel_3.rowWeights = new double[]{1.0, Double.MIN_VALUE}; + panel_3.setLayout(gbl_panel_3); + + JPanel panel_4 = new JPanel(); + panel_4.setBorder(new TitledBorder(null, "Echtzeituhr", TitledBorder.LEADING, TitledBorder.TOP, null, null)); + GridBagConstraints gbc_panel_4 = new GridBagConstraints(); + gbc_panel_4.fill = GridBagConstraints.BOTH; + gbc_panel_4.gridx = 0; + gbc_panel_4.gridy = 0; + panel_3.add(panel_4, gbc_panel_4); + GridBagLayout gbl_panel_4 = new GridBagLayout(); + gbl_panel_4.columnWidths = new int[]{0, 0, 0}; + gbl_panel_4.rowHeights = new int[]{0, 0, 0, 0}; + gbl_panel_4.columnWeights = new double[]{0.0, 1.0, Double.MIN_VALUE}; + gbl_panel_4.rowWeights = new double[]{0.0, 0.0, 0.0, Double.MIN_VALUE}; + panel_4.setLayout(gbl_panel_4); + + JLabel lblAktuelleUhrzeitcomputer = new JLabel("Aktuelle Uhrzeit (Computer):"); + GridBagConstraints gbc_lblAktuelleUhrzeitcomputer = new GridBagConstraints(); + gbc_lblAktuelleUhrzeitcomputer.anchor = GridBagConstraints.EAST; + gbc_lblAktuelleUhrzeitcomputer.insets = new Insets(0, 0, 5, 5); + gbc_lblAktuelleUhrzeitcomputer.gridx = 0; + gbc_lblAktuelleUhrzeitcomputer.gridy = 0; + panel_4.add(lblAktuelleUhrzeitcomputer, gbc_lblAktuelleUhrzeitcomputer); + + timeComputer = new JTextField(); + GridBagConstraints gbc_timeComputer = new GridBagConstraints(); + gbc_timeComputer.insets = new Insets(0, 0, 5, 0); + gbc_timeComputer.fill = GridBagConstraints.HORIZONTAL; + gbc_timeComputer.gridx = 1; + gbc_timeComputer.gridy = 0; + panel_4.add(timeComputer, gbc_timeComputer); + timeComputer.setColumns(10); + + JLabel lblAktuelleUhrzeitsynololog = new JLabel("Aktuelle Uhrzeit (Synololog):"); + GridBagConstraints gbc_lblAktuelleUhrzeitsynololog = new GridBagConstraints(); + gbc_lblAktuelleUhrzeitsynololog.anchor = GridBagConstraints.EAST; + gbc_lblAktuelleUhrzeitsynololog.insets = new Insets(0, 0, 5, 5); + gbc_lblAktuelleUhrzeitsynololog.gridx = 0; + gbc_lblAktuelleUhrzeitsynololog.gridy = 1; + panel_4.add(lblAktuelleUhrzeitsynololog, gbc_lblAktuelleUhrzeitsynololog); + + timeSynololog = new JTextField(); + GridBagConstraints gbc_timeSynololog = new GridBagConstraints(); + gbc_timeSynololog.insets = new Insets(0, 0, 5, 0); + gbc_timeSynololog.fill = GridBagConstraints.HORIZONTAL; + gbc_timeSynololog.gridx = 1; + gbc_timeSynololog.gridy = 1; + panel_4.add(timeSynololog, gbc_timeSynololog); + timeSynololog.setColumns(10); + + JLabel lblTrimmungsynololog = new JLabel("Trimmung (Synololog):"); + GridBagConstraints gbc_lblTrimmungsynololog = new GridBagConstraints(); + gbc_lblTrimmungsynololog.insets = new Insets(0, 0, 0, 5); + gbc_lblTrimmungsynololog.anchor = GridBagConstraints.EAST; + gbc_lblTrimmungsynololog.gridx = 0; + gbc_lblTrimmungsynololog.gridy = 2; + panel_4.add(lblTrimmungsynololog, gbc_lblTrimmungsynololog); + + spTrimm = new JSpinner(); + spTrimm.setToolTipText("\nTrimmung
\n
\nDieser Wert korrigiert die Echtzeituhr des Synololog.
\nPositive Werte beschleunigen, negative Werte verlangsamen die Echtzeituhr des Synololog.
\n
\nEinheit: us / 1004ms\n"); + GridBagConstraints gbc_spTrimm = new GridBagConstraints(); + gbc_spTrimm.fill = GridBagConstraints.HORIZONTAL; + gbc_spTrimm.gridx = 1; + gbc_spTrimm.gridy = 2; + panel_4.add(spTrimm, gbc_spTrimm); + + debugPanel = new JPanel(); + GridBagLayout gbl_debugPanel = new GridBagLayout(); + gbl_debugPanel.columnWidths = new int[]{0, 0}; + gbl_debugPanel.rowHeights = new int[]{0, 0, 0, 0}; + gbl_debugPanel.columnWeights = new double[]{1.0, Double.MIN_VALUE}; + gbl_debugPanel.rowWeights = new double[]{0.0, 0.0, 1.0, Double.MIN_VALUE}; + debugPanel.setLayout(gbl_debugPanel); + + JPanel panel_5 = new JPanel(); + GridBagConstraints gbc_panel_5 = new GridBagConstraints(); + gbc_panel_5.insets = new Insets(0, 0, 5, 0); + gbc_panel_5.fill = GridBagConstraints.BOTH; + gbc_panel_5.gridx = 0; + gbc_panel_5.gridy = 0; + debugPanel.add(panel_5, gbc_panel_5); + GridBagLayout gbl_panel_5 = new GridBagLayout(); + gbl_panel_5.columnWidths = new int[]{0, 0, 0, 0, 0, 0}; + gbl_panel_5.rowHeights = new int[]{0, 0}; + gbl_panel_5.columnWeights = new double[]{0.0, 0.0, 0.0, 0.0, 0.0, Double.MIN_VALUE}; + gbl_panel_5.rowWeights = new double[]{0.0, Double.MIN_VALUE}; + panel_5.setLayout(gbl_panel_5); + + JButton btnUpdate = new JButton("Update..."); + btnUpdate.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + readDebug(); + } + }); + GridBagConstraints gbc_btnUpdate = new GridBagConstraints(); + gbc_btnUpdate.insets = new Insets(0, 0, 0, 5); + gbc_btnUpdate.gridx = 0; + gbc_btnUpdate.gridy = 0; + panel_5.add(btnUpdate, gbc_btnUpdate); + + JButton btnRamImage = new JButton("RAM Image..."); + GridBagConstraints gbc_btnRamImage = new GridBagConstraints(); + gbc_btnRamImage.insets = new Insets(0, 0, 0, 5); + gbc_btnRamImage.gridx = 1; + gbc_btnRamImage.gridy = 0; + panel_5.add(btnRamImage, gbc_btnRamImage); + + JButton btnDumpSnapshots = new JButton("Dump Snapshots"); + btnDumpSnapshots.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + dumpSnapshots(); + } + }); + GridBagConstraints gbc_btnDumpSnapshots = new GridBagConstraints(); + gbc_btnDumpSnapshots.insets = new Insets(0, 0, 0, 5); + gbc_btnDumpSnapshots.gridx = 2; + gbc_btnDumpSnapshots.gridy = 0; + panel_5.add(btnDumpSnapshots, gbc_btnDumpSnapshots); + + JButton btnResetDevice = new JButton("Reset Device"); + btnResetDevice.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + doRESETDevice(); + } + }); + GridBagConstraints gbc_btnResetDevice = new GridBagConstraints(); + gbc_btnResetDevice.insets = new Insets(0, 0, 0, 5); + gbc_btnResetDevice.gridx = 3; + gbc_btnResetDevice.gridy = 0; + panel_5.add(btnResetDevice, gbc_btnResetDevice); + + JButton btnRckDump = new JButton("RCK Dump"); + btnRckDump.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + doRCKDump(); + } + }); + GridBagConstraints gbc_btnRckDump = new GridBagConstraints(); + gbc_btnRckDump.gridx = 4; + gbc_btnRckDump.gridy = 0; + panel_5.add(btnRckDump, gbc_btnRckDump); + btnRamImage.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + doRAMImage(); + } + }); + + tabbedPane.addTab("DEBUG", null, debugPanel, null); + + JPanel panel_2 = new JPanel(); + panel_2.setBorder(new TitledBorder(null, "Live Stats", 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; + debugPanel.add(panel_2, gbc_panel_2); + GridBagLayout gbl_panel_2 = new GridBagLayout(); + gbl_panel_2.columnWidths = new int[]{0, 0, 0, 0, 0, 0}; + gbl_panel_2.rowHeights = new int[]{0, 0, 0}; + gbl_panel_2.columnWeights = new double[]{0.0, 1.0, 1.0, 0.0, 0.0, Double.MIN_VALUE}; + gbl_panel_2.rowWeights = new double[]{0.0, 0.0, Double.MIN_VALUE}; + panel_2.setLayout(gbl_panel_2); + + JLabel lblHeapEnd = new JLabel("HEAP END:"); + GridBagConstraints gbc_lblHeapEnd = new GridBagConstraints(); + gbc_lblHeapEnd.anchor = GridBagConstraints.EAST; + gbc_lblHeapEnd.insets = new Insets(0, 0, 5, 5); + gbc_lblHeapEnd.gridx = 0; + gbc_lblHeapEnd.gridy = 0; + panel_2.add(lblHeapEnd, gbc_lblHeapEnd); + + lHeapDec = new JLabel("Heap Dec"); + GridBagConstraints gbc_lHeapDec = new GridBagConstraints(); + gbc_lHeapDec.anchor = GridBagConstraints.EAST; + gbc_lHeapDec.insets = new Insets(0, 0, 5, 5); + gbc_lHeapDec.gridx = 1; + gbc_lHeapDec.gridy = 0; + panel_2.add(lHeapDec, gbc_lHeapDec); + + lHeapHex = new JLabel("HeapHex"); + GridBagConstraints gbc_lHeapHex = new GridBagConstraints(); + gbc_lHeapHex.anchor = GridBagConstraints.EAST; + gbc_lHeapHex.insets = new Insets(0, 0, 5, 5); + gbc_lHeapHex.gridx = 2; + gbc_lHeapHex.gridy = 0; + panel_2.add(lHeapHex, gbc_lHeapHex); + + JLabel lblSysStackBottom = new JLabel("SYS STACK BOTTOM:"); + GridBagConstraints gbc_lblSysStackBottom = new GridBagConstraints(); + gbc_lblSysStackBottom.anchor = GridBagConstraints.EAST; + gbc_lblSysStackBottom.insets = new Insets(0, 0, 0, 5); + gbc_lblSysStackBottom.gridx = 0; + gbc_lblSysStackBottom.gridy = 1; + panel_2.add(lblSysStackBottom, gbc_lblSysStackBottom); + + lSStackDec = new JLabel("Stack Dec"); + GridBagConstraints gbc_lSStackDec = new GridBagConstraints(); + gbc_lSStackDec.anchor = GridBagConstraints.EAST; + gbc_lSStackDec.insets = new Insets(0, 0, 0, 5); + gbc_lSStackDec.gridx = 1; + gbc_lSStackDec.gridy = 1; + panel_2.add(lSStackDec, gbc_lSStackDec); + + lSStackHex = new JLabel("StackHex"); + GridBagConstraints gbc_lSStackHex = new GridBagConstraints(); + gbc_lSStackHex.anchor = GridBagConstraints.EAST; + gbc_lSStackHex.insets = new Insets(0, 0, 0, 5); + gbc_lSStackHex.gridx = 2; + gbc_lSStackHex.gridy = 1; + panel_2.add(lSStackHex, gbc_lSStackHex); + + JScrollPane scrollPane = new JScrollPane(); + GridBagConstraints gbc_scrollPane = new GridBagConstraints(); + gbc_scrollPane.fill = GridBagConstraints.BOTH; + gbc_scrollPane.gridx = 0; + gbc_scrollPane.gridy = 2; + debugPanel.add(scrollPane, gbc_scrollPane); + + msgExc = new JEditorPane(); + scrollPane.setViewportView(msgExc); + JPanel panel_1 = new JPanel(); contentPane.add(panel_1, BorderLayout.SOUTH); GridBagLayout gbl_panel_1 = new GridBagLayout(); @@ -119,6 +389,7 @@ public class AppSettingsFrame extends JFrame { public void actionPerformed(ActionEvent e) { accept(); setVisible(false); + application().savePrefs(); } }); GridBagConstraints gbc_bOK = new GridBagConstraints(); @@ -134,14 +405,75 @@ public class AppSettingsFrame extends JFrame { PulsCounter2Application pc2a = PulsCounter2Application.getApplication(); selectedSerialPort = pc2a.getSerialPort(); + formerSerialPort = selectedSerialPort; if (selectedSerialPort != null) tfInterface.setText(selectedSerialPort.getPortName()); + + Integer trimmung = application().getServiceLink().getServiceRegisterCache().getCachedInteger(13, 0, 0x1002); + if (trimmung == null){ + System.err.println("Trimmung konnte nicht gelesen werden!"); + trimmung = 0; + spTrimm.setEnabled(false); + + } else { + spTrimm.setValue(trimmung); + } + + timer = new Timer(); + timer.scheduleAtFixedRate(new TimerTask() { + + @Override + public void run() { + Long deviceTimestamp; + Integer i; + i = application().getServiceLink().getServiceRegisterCache().getCachedInteger(13, 0, 0x001C); + if (i != null){ + deviceTimestamp = new Long(i); + + calendar.setTimeInMillis(deviceTimestamp * 1000L); + timeSynololog.setText( sdf.format( calendar.getTime() )); + timeComputer.setText(sdf.format(new Date())); + } + } + }, 500, 500); + + for (int i=0;i>8) & 0xff); + o.write((i32>>16) & 0xff); + o.write((i32>>24) & 0xff); + */ + } + + o.close(); + + + + } catch (ServiceLinkRequestFailedException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } catch (ServiceLinkException e) { + e.printStackTrace(); + } + + } + + void readDebug(){ + Integer v; + + PulsCounter2Application pc2a = PulsCounter2Application.getApplication(); + ServiceLink sl = pc2a.getServiceLink(); + + try { + + v = sl.getServiceRegisterCache().getCachedInteger(13, 0, 0x0020); + if (v != null){ + lHeapDec.setText(v.toString()); + lHeapHex.setText(Integer.toHexString(v)); + } + v = sl.getServiceRegisterCache().getCachedInteger(13, 0, 0x0021); + if (v != null){ + lSStackDec.setText(v.toString()); + lSStackHex.setText(Integer.toHexString(v)); + } + + } catch (Exception e){ + StringBuilder sb = new StringBuilder(); + ByteArrayOutputStream out = new ByteArrayOutputStream(); + + sb.append(e.toString()); + e.printStackTrace(new PrintStream(out)); + + sb.append("\n"); + sb.append(out.toString()); + + msgExc.setText(sb.toString()); + } + } + + void dumpSnapshots(){ +SnapshotManager ssm = PulsCounter2Application.getApplication().getSnapshotManager(); + + for (int n=0;n channelDisplayListeners; + + /** + * Create the panel. + */ + public ChannelDisplay() { + setBackground(Color.GRAY); + setBorder(new EmptyBorder(4, 4, 4, 4)); + setSize(260, 64); + setMinimumSize(new Dimension(160,64)); + + GridBagLayout gridBagLayout = new GridBagLayout(); + gridBagLayout.columnWidths = new int[]{0, 0, 0, 0, 0}; + gridBagLayout.rowHeights = new int[]{0, 0, 0}; + gridBagLayout.columnWeights = new double[]{0.0, 0.0, 0.0, 1.0, Double.MIN_VALUE}; + gridBagLayout.rowWeights = new double[]{1.0, 1.0, Double.MIN_VALUE}; + setLayout(gridBagLayout); + + lblChannelName = new JLabel("XXX"); + lblChannelName.setToolTipText("\nKanal
\n
\nDies ist die Nummer des Kanals\n"); + lblChannelName.setFont(new Font("DejaVu Sans", Font.PLAIN, 20)); + lblChannelName.setSize(new Dimension(48, 24)); + GridBagConstraints gbc_lblChannelName = new GridBagConstraints(); + gbc_lblChannelName.insets = new Insets(0, 0, 5, 5); + gbc_lblChannelName.gridx = 0; + gbc_lblChannelName.gridy = 0; + add(lblChannelName, gbc_lblChannelName); + + lblE = new JLabel(""); + lblE.setToolTipText("\nEingang
\n
\nzeigt den digitalen Status der Eingangsmessung\n"); + lblE.setMinimumSize(new Dimension(24, 24)); + lblE.setMaximumSize(new Dimension(24, 24)); + lblE.setIcon(new ImageIcon(ChannelDisplay.class.getResource("/org/hwo/pulscounter/ui/sym_e_passiv.png"))); + lblE.setPreferredSize(new Dimension(24, 24)); + GridBagConstraints gbc_lblE = new GridBagConstraints(); + gbc_lblE.insets = new Insets(0, 0, 5, 5); + gbc_lblE.gridx = 1; + gbc_lblE.gridy = 0; + add(lblE, gbc_lblE); + + lblP = new JLabel(""); + lblP.setToolTipText("\nPullUp Widerstand
\n
\nZeigt an, ob der PullUp-Widerstand für diesen Kanal eingeschaltet ist.\n"); + lblP.setMaximumSize(new Dimension(24, 24)); + lblP.setMinimumSize(new Dimension(24, 24)); + lblP.setIcon(new ImageIcon(ChannelDisplay.class.getResource("/org/hwo/pulscounter/ui/sym_p_passiv.png"))); + lblP.setPreferredSize(new Dimension(24, 24)); + GridBagConstraints gbc_lblP = new GridBagConstraints(); + gbc_lblP.insets = new Insets(0, 0, 5, 5); + gbc_lblP.anchor = GridBagConstraints.EAST; + gbc_lblP.gridx = 2; + gbc_lblP.gridy = 0; + add(lblP, gbc_lblP); + + tfCounter = new JTextField(); + tfCounter.setToolTipText("\nZählerstand
\n
\nZeigt den aktuellen Zählerstand dieses Kanals.\n"); + tfCounter.setEditable(false); + tfCounter.setHorizontalAlignment(SwingConstants.RIGHT); + tfCounter.setMinimumSize(new Dimension(100, 19)); + tfCounter.setFont(new Font("DejaVu Sans", Font.PLAIN, 12)); + tfCounter.setInheritsPopupMenu(true); + GridBagConstraints gbc_tfCounter = new GridBagConstraints(); + gbc_tfCounter.insets = new Insets(0, 0, 5, 0); + gbc_tfCounter.fill = GridBagConstraints.HORIZONTAL; + gbc_tfCounter.gridx = 3; + gbc_tfCounter.gridy = 0; + add(tfCounter, gbc_tfCounter); + tfCounter.setColumns(10); + + lblA = new JLabel(""); + lblA.setToolTipText("\nAusgang
\n
\nZeigt, ob die Ausgangsschaltung für diesen Kanal aktiv ist.\n"); + lblA.setIcon(new ImageIcon(ChannelDisplay.class.getResource("/org/hwo/pulscounter/ui/sym_a_passiv.png"))); + lblA.setPreferredSize(new Dimension(24, 24)); + GridBagConstraints gbc_lblA = new GridBagConstraints(); + gbc_lblA.insets = new Insets(0, 0, 0, 5); + gbc_lblA.gridx = 2; + gbc_lblA.gridy = 1; + add(lblA, gbc_lblA); + + tfAnalog = new JTextField(); + tfAnalog.setToolTipText("\nAnalog Messwert
\n
\nZeigt die an diesem Kanal gemessene Spannung.\n"); + tfAnalog.setEditable(false); + tfAnalog.setHorizontalAlignment(SwingConstants.RIGHT); + tfAnalog.setInheritsPopupMenu(true); + GridBagConstraints gbc_tfAnalog = new GridBagConstraints(); + gbc_tfAnalog.fill = GridBagConstraints.HORIZONTAL; + gbc_tfAnalog.gridx = 3; + gbc_tfAnalog.gridy = 1; + add(tfAnalog, gbc_tfAnalog); + tfAnalog.setColumns(10); + + this.initialize(); + } + + private void initialize(){ + + channelDisplayListeners = new LinkedList(); + + popupMenu = new JPopupMenu(""); + setComponentPopupMenu(popupMenu); + + JMenuItem mi = new JMenuItem("Zurücksetzen"); + mi.addActionListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent e) { + fireChannelDisplayReset(); + } + }); + popupMenu.add(mi); + popupMenu.addSeparator(); + + JLabel l = new JLabel("Setzen:"); + popupMenu.add(l); + + final JFormattedTextField tf = new JFormattedTextField(NumberFormat.getIntegerInstance()); + tf.setText("0"); + tf.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + fireChannelDisplaySet(((Long)tf.getValue()).intValue()); + popupMenu.setVisible(false); + } + }); + + popupMenu.add(tf); + + } + + @Override + public void setToolTipText(String text) { + super.setToolTipText(text); + } + + public void addChannelDisplayListener(ChannelDisplayListener listener){ + channelDisplayListeners.add(listener); + } + public void removeChannelDisplayListener(ChannelDisplayListener listener){ + channelDisplayListeners.remove(listener); + } + + private void fireChannelDisplayReset(){ + for (ChannelDisplayListener l:channelDisplayListeners){ + l.reset(this); + } + } + private void fireChannelDisplaySet(int setValue){ + for (ChannelDisplayListener l:channelDisplayListeners){ + l.set(this, setValue); + } + } + + public void setAnalog(boolean isAnalog) { + this.isAnalog = isAnalog; + tfAnalog.setVisible(isAnalog); + } + public boolean isAnalog() { + return isAnalog; + } + + public void setPullup(boolean pullup) { + this.pullup = pullup; + if (pullup){ + lblP.setIcon(iconPactive); + } else { + lblP.setIcon(iconPpassive); + } + } + public boolean isPullup() { + return pullup; + } + + public void setInput(boolean input) { + this.input = input; + if (input){ + lblE.setIcon(iconEactive); + } else { + lblE.setIcon(iconEpassive); + } + } + public boolean isInput() { + return input; + } + + public void setOutput(boolean output) { + this.output = output; + if (output){ + lblA.setIcon(iconAactive); + } else { + lblA.setIcon(iconApassive); + } + } + public boolean isOutput() { + return output; + } + + public Integer getCounter() { + return counter; + } + public void setCounter(Integer counter) { + this.counter = counter; + tfCounter.setText(String.format("%d", counter)); + } + + public Double getVoltage() { + return voltage; + } + public void setVoltage(Double voltage) { + this.voltage = voltage; + tfAnalog.setText(String.format("%.02f V",voltage)); + } + + public void setChannelName(String channelName) { + this.channelName = channelName; + lblChannelName.setText(channelName); + } + public String getChannelName() { + return channelName; + } + +} diff --git a/src/org/hwo/pulscounter/ui/ChannelDisplayListener.java b/src/org/hwo/pulscounter/ui/ChannelDisplayListener.java new file mode 100644 index 0000000..bf021ba --- /dev/null +++ b/src/org/hwo/pulscounter/ui/ChannelDisplayListener.java @@ -0,0 +1,8 @@ +package org.hwo.pulscounter.ui; + +public interface ChannelDisplayListener { + + public void reset (ChannelDisplay sender); + public void set (ChannelDisplay sender,int setValue); + +} diff --git a/src/org/hwo/pulscounter/ui/CheckWorkshiftRecords.java b/src/org/hwo/pulscounter/ui/CheckWorkshiftRecords.java deleted file mode 100644 index 4aff814..0000000 --- a/src/org/hwo/pulscounter/ui/CheckWorkshiftRecords.java +++ /dev/null @@ -1,302 +0,0 @@ -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/DeviceConfiguration.java b/src/org/hwo/pulscounter/ui/DeviceConfiguration.java new file mode 100644 index 0000000..6fb891e --- /dev/null +++ b/src/org/hwo/pulscounter/ui/DeviceConfiguration.java @@ -0,0 +1,508 @@ +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 javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; + +import org.hwo.pulscounter.PulsCounter2Application; +import org.hwo.servicelink.ServiceLink; +import org.hwo.servicelink.ServiceLinkException; +import org.hwo.servicelink.ServiceLinkRequestFailedException; + +import java.awt.GridLayout; +import javax.swing.JTabbedPane; +import java.awt.GridBagLayout; +import java.awt.GridBagConstraints; +import javax.swing.JLabel; +import java.awt.Insets; +import java.awt.Dimension; +import javax.swing.JComboBox; +import java.awt.event.ActionListener; +import java.io.IOException; +import java.math.BigInteger; +import java.awt.event.ActionEvent; +import javax.swing.JCheckBox; +import javax.swing.JSpinner; +import javax.swing.SpinnerNumberModel; +import javax.swing.JButton; + +import org.hwo.bitfields.BitField; +import org.hwo.bitfields.Field; +import org.hwo.bitfields.ui.BitFieldEditor; +import org.hwo.models.TableMapper.TableColumn; +import org.hwo.models.TableMapper.TableMapper; +import org.hwo.ui.JTimeSpanEditor; +import java.awt.event.FocusAdapter; +import java.awt.event.FocusEvent; +import javax.swing.JScrollPane; +import javax.swing.JTable; + +public class DeviceConfiguration extends JFrame { + + private JPanel contentPane; + + + int currentChannel; + private BitFieldEditor bfeIntervall; + private JTimeSpanEditor tseI3; + private JTimeSpanEditor tseI2; + private JTimeSpanEditor tseI1; + private JTimeSpanEditor tseI0; + + private TableMapper tmSettings; + + int outputs, + pullups, + inverts, + trigger; + + int[] filter, + windows; + private JTable tSettings; + + + + /** + * Create the frame. + */ + public DeviceConfiguration() { + setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); + setBounds(100, 100, 860, 498); + contentPane = new JPanel(); + contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); + setContentPane(contentPane); + GridBagLayout gbl_contentPane = new GridBagLayout(); + gbl_contentPane.columnWidths = new int[] {30, 0, 0}; + gbl_contentPane.rowHeights = new int[] {183, 0}; + gbl_contentPane.columnWeights = new double[]{1.0, 0.0, 0.0}; + gbl_contentPane.rowWeights = new double[]{1.0, 0.0}; + contentPane.setLayout(gbl_contentPane); + + JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.TOP); + GridBagConstraints gbc_tabbedPane = new GridBagConstraints(); + gbc_tabbedPane.gridwidth = 3; + gbc_tabbedPane.fill = GridBagConstraints.BOTH; + gbc_tabbedPane.insets = new Insets(0, 0, 5, 0); + gbc_tabbedPane.gridx = 0; + gbc_tabbedPane.gridy = 0; + contentPane.add(tabbedPane, gbc_tabbedPane); + + JPanel panel_2 = new JPanel(); + 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}; + 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, Double.MIN_VALUE}; + panel_2.setLayout(gbl_panel_2); + + bfeIntervall = new BitFieldEditor(); + bfeIntervall.setToolTipText("\nTagesbasierte Intervalle
\n
\nTagesbasierte Intervalle werden immer auf 0:00:00 Uhr des aktuellen Tages bezogen ausgeführt.
\nDies ermöglicht nicht nur eine Regelmäßige Aufzeichnung, sondern erzwingt auch eine Aufzeichnung
\nin einem festgelegten immer gleichen Raster.
\n
\nNicht tageszeitbasierte Intervalle werden mit Bezug auf den 1.1.1970 0:00:00 Uhr ausgeführt.
\nDiese ermöglichen eine stete regelmäßige Aufzeichnung bei der die tageszeit ignoriert wird.\n"); + bfeIntervall.addChangeListener(new ChangeListener() { + public void stateChanged(ChangeEvent e) { + int v = bfeIntervall.getIntValue(); + tseI0.setDaysEnabled(((v & 0x01)==0)); + tseI1.setDaysEnabled(((v & 0x02)==0)); + tseI2.setDaysEnabled(((v & 0x04)==0)); + tseI3.setDaysEnabled(((v & 0x08)==0)); + + ServiceLink sl = PulsCounter2Application.getApplication().getServiceLink(); + try { + + sl.writeInt(13, 0, 0x1003, bfeIntervall.getIntValue()); + + } catch (ServiceLinkRequestFailedException e1) { + e1.printStackTrace(); + } catch (IOException e1) { + e1.printStackTrace(); + } catch (ServiceLinkException e1) { + e1.printStackTrace(); + } + } + }); + + JLabel lblTageszeitabhngigkeit = new JLabel("Tageszeitabhängigkeit:"); + GridBagConstraints gbc_lblTageszeitabhngigkeit = new GridBagConstraints(); + gbc_lblTageszeitabhngigkeit.fill = GridBagConstraints.HORIZONTAL; + gbc_lblTageszeitabhngigkeit.insets = new Insets(0, 0, 5, 5); + gbc_lblTageszeitabhngigkeit.gridx = 0; + gbc_lblTageszeitabhngigkeit.gridy = 0; + panel_2.add(lblTageszeitabhngigkeit, gbc_lblTageszeitabhngigkeit); + GridBagConstraints gbc_bfeIntervall = new GridBagConstraints(); + gbc_bfeIntervall.anchor = GridBagConstraints.NORTH; + gbc_bfeIntervall.insets = new Insets(0, 0, 5, 0); + gbc_bfeIntervall.fill = GridBagConstraints.HORIZONTAL; + gbc_bfeIntervall.gridx = 1; + gbc_bfeIntervall.gridy = 0; + panel_2.add(bfeIntervall, gbc_bfeIntervall); + + JLabel lblIntervall = new JLabel("Intervall 0:"); + lblIntervall.setToolTipText("\nIntervall
\n
\nStellen Sie die gewünschten Intervalllängen ein.
\n
\nEinheiten: Tage, Stunden, Minuten, Sekunden\n"); + GridBagConstraints gbc_lblIntervall = new GridBagConstraints(); + gbc_lblIntervall.fill = GridBagConstraints.HORIZONTAL; + gbc_lblIntervall.insets = new Insets(0, 0, 5, 5); + gbc_lblIntervall.gridx = 0; + gbc_lblIntervall.gridy = 1; + panel_2.add(lblIntervall, gbc_lblIntervall); + + tseI0 = new JTimeSpanEditor(); + tseI0.setToolTipText("\nIntervall
\n
\nStellen Sie die gewünschten Intervalllängen ein.
\n
\nEinheiten: Tage, Stunden, Minuten, Sekunden\n"); + tseI0.addFocusListener(new FocusAdapter() { + @Override + public void focusLost(FocusEvent e) { + System.err.println("FOCUS LOST 0"); + ServiceLink sl = PulsCounter2Application.getApplication().getServiceLink(); + try { + + sl.writeInt(13, 0, 0x1010, (Integer)tseI0.getValue()); + + } catch (ServiceLinkRequestFailedException e1) { + e1.printStackTrace(); + } catch (IOException e1) { + e1.printStackTrace(); + } catch (ServiceLinkException e1) { + e1.printStackTrace(); + } + } + }); + GridBagConstraints gbc_tseI0 = new GridBagConstraints(); + gbc_tseI0.anchor = GridBagConstraints.WEST; + gbc_tseI0.insets = new Insets(0, 0, 5, 0); + gbc_tseI0.gridx = 1; + gbc_tseI0.gridy = 1; + panel_2.add(tseI0, gbc_tseI0); + + JLabel lblIntervall_1 = new JLabel("Intervall 1:"); + lblIntervall_1.setToolTipText("\nIntervall
\n
\nStellen Sie die gewünschten Intervalllängen ein.
\n
\nEinheiten: Tage, Stunden, Minuten, Sekunden\n"); + GridBagConstraints gbc_lblIntervall_1 = new GridBagConstraints(); + gbc_lblIntervall_1.fill = GridBagConstraints.HORIZONTAL; + gbc_lblIntervall_1.insets = new Insets(0, 0, 5, 5); + gbc_lblIntervall_1.gridx = 0; + gbc_lblIntervall_1.gridy = 2; + panel_2.add(lblIntervall_1, gbc_lblIntervall_1); + + tseI1 = new JTimeSpanEditor(); + tseI1.setToolTipText("\nIntervall
\n
\nStellen Sie die gewünschten Intervalllängen ein.
\n
\nEinheiten: Tage, Stunden, Minuten, Sekunden\n"); + tseI1.addFocusListener(new FocusAdapter() { + @Override + public void focusLost(FocusEvent e) { + + ServiceLink sl = PulsCounter2Application.getApplication().getServiceLink(); + try { + + sl.writeInt(13, 0, 0x1011, (Integer)tseI1.getValue()); + + } catch (ServiceLinkRequestFailedException e1) { + e1.printStackTrace(); + } catch (IOException e1) { + e1.printStackTrace(); + } catch (ServiceLinkException e1) { + e1.printStackTrace(); + } + } + }); + GridBagConstraints gbc_tseI1 = new GridBagConstraints(); + gbc_tseI1.anchor = GridBagConstraints.WEST; + gbc_tseI1.insets = new Insets(0, 0, 5, 0); + gbc_tseI1.gridx = 1; + gbc_tseI1.gridy = 2; + panel_2.add(tseI1, gbc_tseI1); + + JLabel lblIntervall_2 = new JLabel("Intervall 2:"); + lblIntervall_2.setToolTipText("\nIntervall
\n
\nStellen Sie die gewünschten Intervalllängen ein.
\n
\nEinheiten: Tage, Stunden, Minuten, Sekunden\n"); + GridBagConstraints gbc_lblIntervall_2 = new GridBagConstraints(); + gbc_lblIntervall_2.fill = GridBagConstraints.HORIZONTAL; + gbc_lblIntervall_2.insets = new Insets(0, 0, 5, 5); + gbc_lblIntervall_2.gridx = 0; + gbc_lblIntervall_2.gridy = 3; + panel_2.add(lblIntervall_2, gbc_lblIntervall_2); + + tseI2 = new JTimeSpanEditor(); + tseI2.setToolTipText("\nIntervall
\n
\nStellen Sie die gewünschten Intervalllängen ein.
\n
\nEinheiten: Tage, Stunden, Minuten, Sekunden\n"); + tseI2.addFocusListener(new FocusAdapter() { + @Override + public void focusLost(FocusEvent e) { + ServiceLink sl = PulsCounter2Application.getApplication().getServiceLink(); + try { + + sl.writeInt(13, 0, 0x1012, (Integer)tseI2.getValue()); + + } catch (ServiceLinkRequestFailedException e1) { + e1.printStackTrace(); + } catch (IOException e1) { + e1.printStackTrace(); + } catch (ServiceLinkException e1) { + e1.printStackTrace(); + } + } + }); + GridBagConstraints gbc_tseI2 = new GridBagConstraints(); + gbc_tseI2.anchor = GridBagConstraints.WEST; + gbc_tseI2.insets = new Insets(0, 0, 5, 0); + gbc_tseI2.gridx = 1; + gbc_tseI2.gridy = 3; + panel_2.add(tseI2, gbc_tseI2); + + JLabel lblIntervall_3 = new JLabel("Intervall 3:"); + lblIntervall_3.setToolTipText("\nIntervall
\n
\nStellen Sie die gewünschten Intervalllängen ein.
\n
\nEinheiten: Tage, Stunden, Minuten, Sekunden\n"); + GridBagConstraints gbc_lblIntervall_3 = new GridBagConstraints(); + gbc_lblIntervall_3.fill = GridBagConstraints.HORIZONTAL; + gbc_lblIntervall_3.insets = new Insets(0, 0, 0, 5); + gbc_lblIntervall_3.gridx = 0; + gbc_lblIntervall_3.gridy = 4; + panel_2.add(lblIntervall_3, gbc_lblIntervall_3); + + tseI3 = new JTimeSpanEditor(); + tseI3.setToolTipText("\nIntervall
\n
\nStellen Sie die gewünschten Intervalllängen ein.
\n
\nEinheiten: Tage, Stunden, Minuten, Sekunden\n"); + tseI3.addFocusListener(new FocusAdapter() { + @Override + public void focusLost(FocusEvent e) { + ServiceLink sl = PulsCounter2Application.getApplication().getServiceLink(); + try { + + sl.writeInt(13, 0, 0x1013, (Integer)tseI3.getValue()); + + } catch (ServiceLinkRequestFailedException e1) { + e1.printStackTrace(); + } catch (IOException e1) { + e1.printStackTrace(); + } catch (ServiceLinkException e1) { + e1.printStackTrace(); + } + } + }); + GridBagConstraints gbc_tseI3 = new GridBagConstraints(); + gbc_tseI3.anchor = GridBagConstraints.WEST; + gbc_tseI3.gridx = 1; + gbc_tseI3.gridy = 4; + panel_2.add(tseI3, gbc_tseI3); + + JPanel panel_1 = new JPanel(); + tabbedPane.addTab("Kanäle", null, panel_1, null); + GridBagLayout gbl_panel_1 = new GridBagLayout(); + gbl_panel_1.columnWidths = new int[] {100}; + gbl_panel_1.rowHeights = new int[] {30}; + gbl_panel_1.columnWeights = new double[]{1.0}; + gbl_panel_1.rowWeights = new double[]{1.0}; + 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); + + tSettings = new JTable(); + tSettings.setRowHeight(32); + tSettings.setFillsViewportHeight(true); + tSettings.setCellSelectionEnabled(true); + scrollPane.setViewportView(tSettings); + + JButton btnSchliessen = new JButton("abbrechen"); + btnSchliessen.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + setVisible(false); + } + }); + + JButton btnOk = new JButton("OK"); + btnOk.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + writeDevice(); + setVisible(false); + } + }); + GridBagConstraints gbc_btnOk = new GridBagConstraints(); + gbc_btnOk.fill = GridBagConstraints.BOTH; + gbc_btnOk.insets = new Insets(0, 0, 0, 5); + gbc_btnOk.gridx = 1; + gbc_btnOk.gridy = 1; + contentPane.add(btnOk, gbc_btnOk); + GridBagConstraints gbc_btnSchliessen = new GridBagConstraints(); + gbc_btnSchliessen.fill = GridBagConstraints.BOTH; + gbc_btnSchliessen.gridx = 2; + gbc_btnSchliessen.gridy = 1; + contentPane.add(btnSchliessen, gbc_btnSchliessen); + + this.initialize(); + } + + private Integer intOr0(Integer i){ + if (i==null) + return 0; + return i; + } + + private void initialize(){ + currentChannel = -1; + filter = new int[32]; + windows = new int[32]; + tmSettings = new TableMapper(ChannelConfiguration.class, tSettings); + + BitField bf = new BitField(); + bf.clear(); + bf.addField(new Field(bf, 0, 1, "Intervall 0 basiert auf Tageszeit")); + bf.addField(new Field(bf, 1, 1, "Intervall 1 basiert auf Tageszeit")); + bf.addField(new Field(bf, 2, 1, "Intervall 2 basiert auf Tageszeit")); + bf.addField(new Field(bf, 3, 1, "Intervall 3 basiert auf Tageszeit")); + bfeIntervall.setBitField(bf); + for (int i=0;i<32;i++){ + tmSettings.addRow(new ChannelConfiguration(i)); + } + + + readDevice(); + } + + private void readDevice(){ + Integer v; + + ServiceLink sl = PulsCounter2Application.getApplication().getServiceLink(); + + outputs = intOr0(sl.getServiceRegisterCache().getCachedInteger(13, 0, 0x1008)); + pullups = intOr0(sl.getServiceRegisterCache().getCachedInteger(13, 0, 0x1009)); + inverts = intOr0(sl.getServiceRegisterCache().getCachedInteger(13, 0, 0x100A)); + trigger = intOr0(sl.getServiceRegisterCache().getCachedInteger(13, 0, 0x100B)); + + bfeIntervall.setIntValue(sl.getServiceRegisterCache().getCachedInteger(13, 0, 0x1003)); + + for (int i=0;i<32;i++){ + filter[i] = intOr0( sl.getServiceRegisterCache().getCachedInteger(13, 0, 0x1020 + i)); + windows[i] = intOr0( sl.getServiceRegisterCache().getCachedInteger(13, 0, 0x1280 + i)); + } + + + v = sl.getServiceRegisterCache().getCachedInteger(13, 0, 0x1010); + if (v!=null){ + tseI0.setValue(v); + } + v = sl.getServiceRegisterCache().getCachedInteger(13, 0, 0x1011); + if (v!=null){ + tseI1.setValue(v); + } + v = sl.getServiceRegisterCache().getCachedInteger(13, 0, 0x1012); + if (v!=null){ + tseI2.setValue(v); + } + v = sl.getServiceRegisterCache().getCachedInteger(13, 0, 0x1013); + if (v!=null){ + tseI3.setValue(v); + } + + + + + } + + private void writeDevice(){ + ServiceLink sl = PulsCounter2Application.getApplication().getServiceLink(); + try { + sl.writeInt(13, 0, 0x1008, outputs); + sl.writeInt(13, 0, 0x1009, pullups); + sl.writeInt(13, 0, 0x100A, inverts); + sl.writeInt(13, 0, 0x100B, trigger); + + sl.writeInt(13, 0, 0x1003, bfeIntervall.getIntValue()); + + for (int i=0;i<32;i++){ + sl.writeInt(13, 0, 0x1020 + i, filter[i]); + sl.writeInt(13, 0, 0x1280 + i, windows[i]); + } + + + sl.writeInt(13, 0, 0x1010, tseI0.getValue()); + sl.writeInt(13, 0, 0x1011, tseI1.getValue()); + sl.writeInt(13, 0, 0x1012, tseI2.getValue()); + sl.writeInt(13, 0, 0x1013, tseI3.getValue()); + + /* Konfiguration auf Live-System übertragen */ + sl.writeInt(13, 0, 0x1001, 1); + } catch (Exception e){ + e.printStackTrace(); + } + } + + class ChannelConfiguration{ + + int channel; + + public ChannelConfiguration(int channel) { + this.channel = channel; + } + + @TableColumn(label="Channel",width=80,order=0) + public int getChannel(){ + return channel; + } + + @TableColumn(label="Ausgang",width=80,order=10) + public Boolean getOutput(){ + return (outputs & 1< messageListModel; + + + /** + * Create the frame. + */ + public DeviceTestFrame() { + 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 PulsCounter2Application application(){ + return PulsCounter2Application.getApplication(); + } + + private void initialize(){ + this.reconnectTimer = new Timer("Reconnection Timer"); + + messageListModel = new DefaultListModel(); + lMessages.setModel(messageListModel); + + application().addPulsCounterApplicationListener(this); + application().fireConnectionStateChanged(false); + + } + + @Override + public void serialPortChanged() { + // TODO Auto-generated method stub + + } + + @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){ + } + } + + } + +} diff --git a/src/org/hwo/pulscounter/ui/ExportFilesFrame.java b/src/org/hwo/pulscounter/ui/ExportFilesFrame.java new file mode 100644 index 0000000..b4961c0 --- /dev/null +++ b/src/org/hwo/pulscounter/ui/ExportFilesFrame.java @@ -0,0 +1,181 @@ +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 javax.swing.event.ListSelectionEvent; +import javax.swing.event.ListSelectionListener; + +import org.hwo.interactiveobjects.ObjectEditorUI; +import org.hwo.interactiveobjects.ObjectEditorUIHelper; +import org.hwo.models.TableMapper.TableMapper; +import org.hwo.pulscounter.ExportSetting; +import org.hwo.pulscounter.PulsCounter2Application; + +import java.awt.GridBagLayout; +import javax.swing.JButton; +import java.awt.GridBagConstraints; +import javax.swing.JScrollPane; +import java.awt.Insets; +import javax.swing.JTable; +import java.awt.event.ActionListener; +import java.awt.event.ActionEvent; +import javax.swing.JToolBar; +import javax.swing.ListSelectionModel; +import javax.swing.JSeparator; + +public class ExportFilesFrame extends JFrame { + + private JPanel contentPane; + private JTable tExportSettings; + + private TableMapper tmExportSettings; + private JButton bRemove; + private JButton bEdit; + private JButton bAdd; + + + private ExportSetting selectedExportSetting; + private JSeparator separator; + private JButton btnExec; + + /** + * Create the frame. + */ + public ExportFilesFrame() { + setTitle("Export Einstellungen..."); + setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); + setBounds(100, 100, 825, 433); + 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, 0}; + gbl_contentPane.rowHeights = new int[]{0, 0, 0, 0}; + gbl_contentPane.columnWeights = new double[]{1.0, 0.0, 0.0, Double.MIN_VALUE}; + gbl_contentPane.rowWeights = new double[]{0.0, 1.0, 0.0, Double.MIN_VALUE}; + contentPane.setLayout(gbl_contentPane); + + JToolBar toolBar = new JToolBar(); + toolBar.setFloatable(false); + GridBagConstraints gbc_toolBar = new GridBagConstraints(); + gbc_toolBar.fill = GridBagConstraints.BOTH; + gbc_toolBar.gridwidth = 3; + gbc_toolBar.insets = new Insets(0, 0, 5, 5); + gbc_toolBar.gridx = 0; + gbc_toolBar.gridy = 0; + contentPane.add(toolBar, gbc_toolBar); + + bAdd = new JButton("+"); + bAdd.setToolTipText("\nNeue Exportkonfiguration hinzufügen
\n"); + bAdd.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + ExportSetting es = new ExportSetting(); + tmExportSettings.addRow(es); + } + }); + toolBar.add(bAdd); + + bEdit = new JButton("e"); + bEdit.setToolTipText("\nAusgewählte Exportkonfiguration bearbeiten\n"); + bEdit.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + ExportSetting es = (ExportSetting)tmExportSettings.getSelectedRow(); + if (es != null){ + if (ObjectEditorUIHelper.edit(es)){ + tmExportSettings.fireTableDataChanged(); + } + } + } + }); + bEdit.setEnabled(false); + toolBar.add(bEdit); + + bRemove = new JButton("-"); + bRemove.setToolTipText("\nAusgewählte Exportkonfiguration entfernen\n"); + bRemove.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + if (selectedExportSetting != null){ + ExportSetting es = selectedExportSetting; + tmExportSettings.removeRow(es); + } + } + }); + bRemove.setEnabled(false); + toolBar.add(bRemove); + + separator = new JSeparator(); + toolBar.add(separator); + + btnExec = new JButton("EXEC"); + btnExec.setToolTipText("\nAusgewählte Exportkonfiguration jetzt ausführen
\n"); + btnExec.setEnabled(false); + btnExec.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + doExport(); + } + }); + toolBar.add(btnExec); + + JScrollPane scrollPane = new JScrollPane(); + scrollPane.setToolTipText("\nExportkonfigurationen
\nZeigt eine Übersicht über die aktuell vorhandenen Exportkonfigurationen\n"); + GridBagConstraints gbc_scrollPane = new GridBagConstraints(); + gbc_scrollPane.gridwidth = 3; + gbc_scrollPane.insets = new Insets(0, 0, 5, 0); + gbc_scrollPane.fill = GridBagConstraints.BOTH; + gbc_scrollPane.gridx = 0; + gbc_scrollPane.gridy = 1; + contentPane.add(scrollPane, gbc_scrollPane); + + tExportSettings = new JTable(); + tExportSettings.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); + tmExportSettings = new TableMapper(ExportSetting.class, tExportSettings); + tmExportSettings.addListSelectionListener(new ListSelectionListener() { + + @Override + public void valueChanged(ListSelectionEvent e) { + ExportSetting es = (ExportSetting)tmExportSettings.getSelectedRow(); + setSelectedExportSetting(es); + } + }); + tmExportSettings.setRows(PulsCounter2Application.getApplication().getExportSettings()); + scrollPane.setViewportView(tExportSettings); + + JButton btnSchliessen = new JButton("schliessen"); + btnSchliessen.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + setVisible(false); + PulsCounter2Application.getApplication().savePrefs(); + } + }); + GridBagConstraints gbc_btnSchliessen = new GridBagConstraints(); + gbc_btnSchliessen.gridx = 2; + gbc_btnSchliessen.gridy = 2; + contentPane.add(btnSchliessen, gbc_btnSchliessen); + } + + public ExportSetting getSelectedExportSetting() { + return selectedExportSetting; + } + public void setSelectedExportSetting(ExportSetting selectedExportSetting) { + this.selectedExportSetting = selectedExportSetting; + if (this.selectedExportSetting != null){ + bEdit.setEnabled(true); + bRemove.setEnabled(true); + btnExec.setEnabled(true); + } else { + bEdit.setEnabled(false); + bRemove.setEnabled(false); + btnExec.setEnabled(false); + } + } + + public void doExport(){ + ((ExportSetting)tmExportSettings.getSelectedRow()).export(); + } + + +} diff --git a/src/org/hwo/pulscounter/ui/ExportSettingsEditorDialog.java b/src/org/hwo/pulscounter/ui/ExportSettingsEditorDialog.java new file mode 100644 index 0000000..16840f2 --- /dev/null +++ b/src/org/hwo/pulscounter/ui/ExportSettingsEditorDialog.java @@ -0,0 +1,346 @@ +package org.hwo.pulscounter.ui; + +import java.awt.BorderLayout; +import java.awt.FlowLayout; + +import javax.swing.JButton; +import javax.swing.JDialog; +import javax.swing.JFileChooser; +import javax.swing.JPanel; +import javax.swing.border.EmptyBorder; + +import org.hwo.configuration.ConfigurableObject; +import org.hwo.configuration.ConfigurableObjects; +import org.hwo.interactiveobjects.IInteractiveObjectEditor; +import org.hwo.interactiveobjects.IObjectEditorUI; +import org.hwo.pulscounter.ExportSetting; +import org.hwo.pulscounter.TriggerType; + +import java.awt.GridBagLayout; +import javax.swing.JLabel; +import java.awt.GridBagConstraints; +import java.awt.Insets; +import javax.swing.JTextField; +import javax.swing.SpinnerNumberModel; +import javax.swing.JComboBox; +import javax.swing.JSpinner; +import java.awt.event.ActionListener; +import java.awt.event.ActionEvent; +import java.awt.event.ItemListener; +import java.io.File; +import java.awt.event.ItemEvent; +import javax.swing.JCheckBox; + +public class ExportSettingsEditorDialog extends JDialog implements IObjectEditorUI { + + private final JPanel contentPanel = new JPanel(); + + private ExportSetting exportSetting; + private JTextField tfBenennung; + private JComboBox cbTriggerType; + private JSpinner spSource; + private JTextField tfPath; + private JTextField tfFilename; + + private boolean accepted; + private JCheckBox cbExtended; + private JCheckBox cbAutostart; + private JCheckBox cbRecordDeltas; + + /** + * Create the dialog. + */ + public ExportSettingsEditorDialog() { + setBounds(100, 100, 620, 386); + getContentPane().setLayout(new BorderLayout()); + contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5)); + getContentPane().add(contentPanel, BorderLayout.CENTER); + GridBagLayout gbl_contentPanel = new GridBagLayout(); + gbl_contentPanel.columnWidths = new int[]{0, 0, 0, 0}; + gbl_contentPanel.rowHeights = new int[]{0, 0, 0, 0, 0, 0, 0, 0, 0}; + gbl_contentPanel.columnWeights = new double[]{0.0, 1.0, 0.0, Double.MIN_VALUE}; + gbl_contentPanel.rowWeights = new double[]{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, Double.MIN_VALUE}; + contentPanel.setLayout(gbl_contentPanel); + { + JLabel lblBenennung = new JLabel("Benennung:"); + GridBagConstraints gbc_lblBenennung = new GridBagConstraints(); + gbc_lblBenennung.anchor = GridBagConstraints.EAST; + gbc_lblBenennung.insets = new Insets(0, 0, 5, 5); + gbc_lblBenennung.gridx = 0; + gbc_lblBenennung.gridy = 0; + contentPanel.add(lblBenennung, gbc_lblBenennung); + } + { + tfBenennung = new JTextField(); + tfBenennung.setToolTipText("\nBezeichnung dieser Exportkonfiguration\n"); + GridBagConstraints gbc_tfBenennung = new GridBagConstraints(); + gbc_tfBenennung.gridwidth = 2; + gbc_tfBenennung.insets = new Insets(0, 0, 5, 0); + gbc_tfBenennung.fill = GridBagConstraints.HORIZONTAL; + gbc_tfBenennung.gridx = 1; + gbc_tfBenennung.gridy = 0; + contentPanel.add(tfBenennung, gbc_tfBenennung); + tfBenennung.setColumns(10); + } + { + JLabel lblAuslser = new JLabel("Auslöser:"); + GridBagConstraints gbc_lblAuslser = new GridBagConstraints(); + gbc_lblAuslser.anchor = GridBagConstraints.EAST; + gbc_lblAuslser.insets = new Insets(0, 0, 5, 5); + gbc_lblAuslser.gridx = 0; + gbc_lblAuslser.gridy = 1; + contentPanel.add(lblAuslser, gbc_lblAuslser); + } + { + cbTriggerType = new JComboBox(); + cbTriggerType.setToolTipText("\nAuslöser
\n
\nWählt aus, welche Snapshots in diesem Export übernommen werden sollen.
\n
\nALL alle Snapshots
\nINTERVALL alle Snapshots, welche aufgrund eines abgelaufenen Intervall aufgezeichnet wurden.
\n(nähere Auswahl durch Quelle)
\nTRIGGER alle Snapshots, welche aufgrund eines Impulses auf einem als Trigger konfigurierten Kanal aufgezeichnet wurden.
\n(nähere Auswahl durch Quelle)
\n"); + cbTriggerType.addItemListener(new ItemListener() { + public void itemStateChanged(ItemEvent e) { + if (exportSetting != null){ + exportSetting.setTriggerType((TriggerType)cbTriggerType.getSelectedItem()); + updateSourceEditor(); + } + } + }); + cbTriggerType.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + } + }); + cbTriggerType.addItem(TriggerType.ALL); + cbTriggerType.addItem(TriggerType.Intervall); + cbTriggerType.addItem(TriggerType.Timer); + cbTriggerType.addItem(TriggerType.Manual); + + GridBagConstraints gbc_cbTriggerType = new GridBagConstraints(); + gbc_cbTriggerType.insets = new Insets(0, 0, 5, 5); + gbc_cbTriggerType.fill = GridBagConstraints.HORIZONTAL; + gbc_cbTriggerType.gridx = 1; + gbc_cbTriggerType.gridy = 1; + contentPanel.add(cbTriggerType, gbc_cbTriggerType); + } + { + JLabel lblQuelle = new JLabel("Quelle:"); + GridBagConstraints gbc_lblQuelle = new GridBagConstraints(); + gbc_lblQuelle.insets = new Insets(0, 0, 5, 5); + gbc_lblQuelle.gridx = 0; + gbc_lblQuelle.gridy = 2; + contentPanel.add(lblQuelle, gbc_lblQuelle); + } + { + spSource = new JSpinner(); + spSource.setToolTipText("\nQuelle
\n
\nSchränkt den eingestellten Auslöser weiter ein.
\n
\nFür den Auslöser INTERVALL bezeichnet Quelle die Nummer des Intervalls. 0 bedeutet alle Intervalle.
\nFür den Auslöser TRIGGER bezeichnet Quelle die Nummer des Kanals. 0 bedeutet alle Kanäle.
\n"); + spSource.setModel(new SpinnerNumberModel(0, -1, 255, 1)); + GridBagConstraints gbc_spSource = new GridBagConstraints(); + gbc_spSource.insets = new Insets(0, 0, 5, 5); + gbc_spSource.anchor = GridBagConstraints.WEST; + gbc_spSource.gridx = 1; + gbc_spSource.gridy = 2; + contentPanel.add(spSource, gbc_spSource); + } + { + JLabel lblNewLabel = new JLabel("Verzeichnis:"); + GridBagConstraints gbc_lblNewLabel = new GridBagConstraints(); + gbc_lblNewLabel.anchor = GridBagConstraints.EAST; + gbc_lblNewLabel.insets = new Insets(0, 0, 5, 5); + gbc_lblNewLabel.gridx = 0; + gbc_lblNewLabel.gridy = 3; + contentPanel.add(lblNewLabel, gbc_lblNewLabel); + } + { + tfPath = new JTextField(); + tfPath.setToolTipText("\nExportverzeichnis
\n
\nWählen Sie ein Verzeichnis, in dem die exportierten Dateien erstellt werden sollen.\n"); + tfPath.setEditable(false); + GridBagConstraints gbc_tfPath = new GridBagConstraints(); + gbc_tfPath.insets = new Insets(0, 0, 5, 5); + gbc_tfPath.fill = GridBagConstraints.HORIZONTAL; + gbc_tfPath.gridx = 1; + gbc_tfPath.gridy = 3; + contentPanel.add(tfPath, gbc_tfPath); + tfPath.setColumns(10); + } + { + JButton btnDurchsuchen = new JButton("durchsuchen..."); + btnDurchsuchen.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + JFileChooser fc = new JFileChooser(); + fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); + fc.setCurrentDirectory(new File(tfPath.getText())); + if (fc.showOpenDialog(ExportSettingsEditorDialog.this)==JFileChooser.APPROVE_OPTION){ + tfPath.setText( fc.getSelectedFile().getAbsolutePath()); + } + } + }); + GridBagConstraints gbc_btnDurchsuchen = new GridBagConstraints(); + gbc_btnDurchsuchen.insets = new Insets(0, 0, 5, 0); + gbc_btnDurchsuchen.gridx = 2; + gbc_btnDurchsuchen.gridy = 3; + contentPanel.add(btnDurchsuchen, gbc_btnDurchsuchen); + } + { + JLabel lblDateiname = new JLabel("Dateiname:"); + GridBagConstraints gbc_lblDateiname = new GridBagConstraints(); + gbc_lblDateiname.anchor = GridBagConstraints.EAST; + gbc_lblDateiname.insets = new Insets(0, 0, 5, 5); + gbc_lblDateiname.gridx = 0; + gbc_lblDateiname.gridy = 4; + contentPanel.add(lblDateiname, gbc_lblDateiname); + } + { + tfFilename = new JTextField(); + tfFilename.setToolTipText("\nDateiname
\n
\nGibt den Dateinamen an, unter welchem die Daten gespeichert werden sollen.
\nHier können auch einige Platzhalter verwendet werden:
\n
\n%Y Die Jahreszahl des Snapshotdatums.
\n%M Der Monat des Snapshotdatums.
\n%D Das Tagesdatum des Snapshotdatums.
\n
\nDie Platzhalter werden beim exportieren durch die entsprechenden Werte ersetzt. Dadurch kann eine Exportkonfiguration
\ndie Daten auf mehrer Dateien verteilen.\n"); + GridBagConstraints gbc_tfFilename = new GridBagConstraints(); + gbc_tfFilename.insets = new Insets(0, 0, 5, 5); + gbc_tfFilename.fill = GridBagConstraints.HORIZONTAL; + gbc_tfFilename.gridx = 1; + gbc_tfFilename.gridy = 4; + contentPanel.add(tfFilename, gbc_tfFilename); + tfFilename.setColumns(10); + } + { + cbRecordDeltas = new JCheckBox("Veränderungen berechnen"); + cbRecordDeltas.setToolTipText("\nVeränderungen berechnen
\n
\nIn den Exportdateien wird die Differenz der Zählerstände zum jeweils davor liegenden Wert ausgegeben.\n"); + GridBagConstraints gbc_dbRecordDeltas = new GridBagConstraints(); + gbc_dbRecordDeltas.anchor = GridBagConstraints.WEST; + gbc_dbRecordDeltas.insets = new Insets(0, 0, 5, 5); + gbc_dbRecordDeltas.gridx = 1; + gbc_dbRecordDeltas.gridy = 5; + contentPanel.add(cbRecordDeltas, gbc_dbRecordDeltas); + } + { + cbExtended = new JCheckBox("Erweitertes Dateiformat"); + cbExtended.setToolTipText("\nErweitertes Dateiformat
\n
\nEs werden zusätzliche Spalten mit Momentandaten bei der Aufzeichnung des Zählerstandes ausgegeben.\n"); + GridBagConstraints gbc_cbExtended = new GridBagConstraints(); + gbc_cbExtended.anchor = GridBagConstraints.WEST; + gbc_cbExtended.insets = new Insets(0, 0, 5, 5); + gbc_cbExtended.gridx = 1; + gbc_cbExtended.gridy = 6; + contentPanel.add(cbExtended, gbc_cbExtended); + } + { + cbAutostart = new JCheckBox("Im Batch-Modus ausführen"); + cbAutostart.setToolTipText("\nIm Batch- Modus ausführen
\n
\nDieses Exportkonfiguration soll automatisch ausgeführt werden, wenn die Software
\nmit dem Kommandozeilenargument -b gestartet wurde.\n"); + GridBagConstraints gbc_cbAutostart = new GridBagConstraints(); + gbc_cbAutostart.anchor = GridBagConstraints.WEST; + gbc_cbAutostart.insets = new Insets(0, 0, 0, 5); + gbc_cbAutostart.gridx = 1; + gbc_cbAutostart.gridy = 7; + contentPanel.add(cbAutostart, gbc_cbAutostart); + } + { + JPanel buttonPane = new JPanel(); + buttonPane.setLayout(new FlowLayout(FlowLayout.RIGHT)); + getContentPane().add(buttonPane, BorderLayout.SOUTH); + { + JButton okButton = new JButton("OK"); + okButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + updateObject(); + accepted = true; + setVisible(false); + getParent().invalidate(); + + System.err.println(String.format("Configuration: %s",ConfigurableObjects.getConfiguration(exportSetting))); + + } + }); + okButton.setActionCommand("OK"); + buttonPane.add(okButton); + getRootPane().setDefaultButton(okButton); + } + { + JButton cancelButton = new JButton("Cancel"); + cancelButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + setVisible(false); + } + }); + cancelButton.setActionCommand("Cancel"); + buttonPane.add(cancelButton); + } + } + } + + + @Override + public boolean editObject(Object o) { + setExportSetting((ExportSetting)o); + setModal(true); + setVisible(true); + setModal(false); + + return accepted; + } + + public ExportSetting getExportSetting() { + return exportSetting; + } + public void setExportSetting(ExportSetting exportSetting) { + this.exportSetting = exportSetting; + updateEditor(); + } + + public boolean isAccepted() { + return accepted; + } + + private void updateObject(){ + exportSetting.setPath(tfPath.getText()); + exportSetting.setName(tfBenennung.getText()); + exportSetting.setFileName(tfFilename.getText()); + exportSetting.setTriggerSource((Integer)spSource.getValue()); + exportSetting.setTriggerType((TriggerType)cbTriggerType.getSelectedItem()); + exportSetting.setExtended(cbExtended.isSelected()); + exportSetting.setAutostart(cbAutostart.isSelected()); + exportSetting.setRecordDelta(cbRecordDeltas.isSelected()); + } + + private void updateEditor(){ + if (exportSetting == null){ + tfBenennung.setEnabled(false); + tfBenennung.setText(""); + cbTriggerType.setEnabled(false); + cbTriggerType.setSelectedIndex(-1); + spSource.setEnabled(false); + spSource.setValue(0); + tfPath.setEnabled(false); + tfPath.setText(""); + tfFilename.setEnabled(false); + tfFilename.setText(""); + cbExtended.setEnabled(false); + cbAutostart.setEnabled(false); + cbRecordDeltas.setEnabled(false); + + } else { + tfBenennung.setEnabled(true); + tfBenennung.setText(exportSetting.getName()); + cbTriggerType.setEnabled(true); + cbTriggerType.setSelectedItem(exportSetting.getTriggerType()); + + updateSourceEditor(); + + tfPath.setEnabled(true); + tfPath.setText(exportSetting.getPath()); + tfFilename.setEnabled(true); + tfFilename.setText(exportSetting.getFileName()); + + cbExtended.setEnabled(true); + cbExtended.setSelected(exportSetting.getExtended()); + + cbAutostart.setEnabled(true); + cbAutostart.setSelected(exportSetting.getAutostart()); + + cbRecordDeltas.setEnabled(true); + cbRecordDeltas.setSelected(exportSetting.getRecordDelta()); + } + } + + private void updateSourceEditor(){ + if ((exportSetting.getTriggerType()==TriggerType.ALL)||(exportSetting.getTriggerType()==TriggerType.Manual)){ + spSource.setValue(-1); + spSource.setEnabled(false); + } else { + spSource.setEnabled(true); + spSource.setValue(exportSetting.getTriggerSource()); + } + } +} diff --git a/src/org/hwo/pulscounter/ui/InspectionMainFrame.java b/src/org/hwo/pulscounter/ui/InspectionMainFrame.java deleted file mode 100644 index 4f21695..0000000 --- a/src/org/hwo/pulscounter/ui/InspectionMainFrame.java +++ /dev/null @@ -1,122 +0,0 @@ -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 actionListeners; + + + public JBitSetter() { + setLayout(new FlowLayout(FlowLayout.CENTER, 0, 5)); + + this.checkboxes = new JCheckBox[32]; + this.actionListeners = new LinkedList(); + + for (int i=0;i<32;i++){ + this.checkboxes[i] = new JCheckBox(); +// this.checkboxes[i].setText(String.format("%d", i)); + this.checkboxes[i].setInheritsPopupMenu(true); + this.checkboxes[i].setToolTipText(String.format("%d", i)); +/* this.checkboxes[i].addChangeListener(new ChangeListener() { + + @Override + public void stateChanged(ChangeEvent e) { + fireAction(); + } + }); +*/ + this.checkboxes[i].addActionListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent e) { + fireAction(); + } + }); + + this.add(this.checkboxes[i]); + } + + contextMenu = new JPopupMenu(); + JMenuItem mi = new JMenuItem("Keins"); + mi.addActionListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent e) { + for (int i=0;i<32;i++){ + checkboxes[i].setSelected(false); + } + fireAction(); + } + }); + contextMenu.add(mi); + mi = new JMenuItem("Alle"); + mi.addActionListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent e) { + for (int i=0;i<32;i++){ + checkboxes[i].setSelected(true); + } + fireAction(); + } + }); + contextMenu.add(mi); + + setComponentPopupMenu(contextMenu); + + invalidate(); + } + + public void addActionListener(ActionListener listener){ + this.actionListeners.add(listener); + } + public void removeActionListener(ActionListener listener){ + this.actionListeners.remove(listener); + } + + protected void fireAction(){ + for (ActionListener listener: this.actionListeners){ + listener.actionPerformed(new ActionEvent(this, 0, "")); + } + } + + public void setValue(Integer value){ + for (int i=0;i<32;i++){ + this.checkboxes[i].setSelected( (value & (1<()); + + inputButtons = new JLabel[32]; outputButtons = new JToggleButton[32]; pullupButtons = new JToggleButton[32]; for (int i=0;i<32;i++){ final int n = i; - inputButtons[i] = new JToggleButton(String.format("%d", i)); + inputButtons[i] = new JLabel(String.format("%d", i)); + inputButtons[i].setOpaque(true); + inputButtons[i].setHorizontalAlignment(SwingConstants.CENTER); + inputButtons[i].addMouseListener(new MousePopupListener() { + + @Override + public void popupTriggered(int x, int y) { + JPopupMenu popup = new JPopupMenu(); + JMenuItem mi = new JMenuItem(); + mi.setText("RESET"); + mi.addActionListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent arg0) { + if (serviceLink != null){ + try { + serviceLink.writeInt(13, 0, 0x0600 + n, 0); + } catch (ServiceLinkRequestFailedException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } catch (ServiceLinkException e) { + e.printStackTrace(); + } + } + } + }); + popup.add(mi); + + popup.show(inputButtons[n], x, y); + + } + }); GridBagConstraints gbc = new GridBagConstraints(); gbc.insets = new Insets(0, 0, 0, 0); @@ -196,7 +398,7 @@ public class LiveViewFrame extends JFrame implements AppSettingsListener { public void run() { updateLiveView(); } - }, 200, 250); + }, 200, 500); pc2a.addAppSettingsListener(this); @@ -206,6 +408,8 @@ public class LiveViewFrame extends JFrame implements AppSettingsListener { private synchronized void updateLiveView(){ System.err.println("LiveView Update"); + long startTime = System.currentTimeMillis(); + if (serviceLink != null){ System.err.println("ServiceLink exists."); try { @@ -214,10 +418,43 @@ public class LiveViewFrame extends JFrame implements AppSettingsListener { e.printStackTrace(); } - inputs = serviceLink.getServiceRegisterCache().getCachedInteger(13, 0, 0x84F0 ); - outputs = serviceLink.getServiceRegisterCache().getCachedInteger(13, 0, 0x81F9 ); - pullups = serviceLink.getServiceRegisterCache().getCachedInteger(13, 0, 0x81FA ); + Integer brkval,heapend; + + brkval = serviceLink.getServiceRegisterCache().getCachedInteger(13, 0, 0x0020 ); + if (brkval == null) + brkval = 0; + + heapend = serviceLink.getServiceRegisterCache().getCachedInteger(13, 0, 0x0021 ); + if (heapend == null) + heapend = 0; + + System.err.println(String.format("PC2-BRKVAL: 0x%04x",brkval)); + System.err.println(String.format("PC2-HEAPEND: 0x%04x",heapend)); + + Calendar calendar = Calendar.getInstance(); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + + Integer deviceUnixTime = serviceLink.getServiceRegisterCache().getCachedInteger(13, 0, 0x001C); + if (deviceUnixTime != null){ + calendar.setTimeInMillis(deviceUnixTime * 1000L); + + tfUnixTime.setText(String.format("%d",deviceUnixTime)); + tfHumanDateTime.setText(sdf.format(calendar.getTime())); + }; + + pinputs = serviceLink.getServiceRegisterCache().getCachedInteger(13, 0, 0x0680 ); + inputs = serviceLink.getServiceRegisterCache().getCachedInteger(13, 0, 0x0681 ); + outputs = serviceLink.getServiceRegisterCache().getCachedInteger(13, 0, 0x0682 ); + pullups = serviceLink.getServiceRegisterCache().getCachedInteger(13, 0, 0x0683 ); + + Integer[] values = new Integer[32]; + for (int i=0;i<32;i++){ + values[i] = serviceLink.getServiceRegisterCache().getCachedInteger(13, 0, 0x0600 + i); + }; + + if (pinputs == null) + pinputs = 0; if (inputs == null) inputs = 0; if (outputs == null) @@ -225,19 +462,25 @@ public class LiveViewFrame extends JFrame implements AppSettingsListener { if (pullups == null) pullups = 0; - System.err.println(String.format("Inputs State: 0x%08x",inputs)); - System.err.println(String.format("Outputs State: 0x%08x",outputs)); - System.err.println(String.format("PullUP State: 0x%08x",pullups)); + System.err.println(String.format("Inputs State (Phys.): 0x%08x",pinputs)); + System.err.println(String.format("Inputs State: 0x%08x",inputs)); + System.err.println(String.format("Outputs State: 0x%08x",outputs)); + System.err.println(String.format("PullUP State: 0x%08x",pullups)); for (int i=0;i<32;i++){ if ((inputs & (1<
%d
[%d]
", i, values[i])); + } else { + inputButtons[i].setText(String.format("
%d
N.A.
", i)); + }; + + if ((outputs & (1<= 0) + break; + + DefaultListModel lm = (DefaultListModel)lMessages.getModel(); + lm.addElement(String.format("Assertion: Error: 0x%08x (%d) Position: 0x%04x Mark: %d", assert_error,assert_error, assert_code & 0xffff, (assert_code >> 16) & 0xffff)); + lMessages.ensureIndexIsVisible(lm.size()-1); + + serviceLink.writeInt(13, 0, 0x0025, -1); + }; + } catch (Exception ex){ + System.err.println("Exception while checking for assertions..."); + ex.printStackTrace(); + } + + + + + } + long endTime = System.currentTimeMillis(); + + System.err.println(String.format("updateLiveView(): Time needed: %d", (endTime - startTime))); + } @Override @@ -294,7 +571,7 @@ public class LiveViewFrame extends JFrame implements AppSettingsListener { } try { - serviceLink.writeInt((byte)13, (byte)0, 0x81FA, pullups); + serviceLink.writeInt((byte)13, (byte)0, 0x0683, pullups); } catch (ServiceLinkRequestFailedException e) { e.printStackTrace(); } catch (IOException e) { @@ -305,5 +582,83 @@ public class LiveViewFrame extends JFrame implements AppSettingsListener { } } + private void syncUnixTime(){ + Calendar calendar = Calendar.getInstance(); + + if (this.serviceLink != null){ + try { + this.serviceLink.writeInt((byte)13, (byte)0, 0x001C, (int)(calendar.getTimeInMillis() / 1000L)); + } catch (ServiceLinkRequestFailedException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } catch (ServiceLinkException e) { + e.printStackTrace(); + } + } + + } + + private void manualSnapshot(){ + if (this.serviceLink != null){ + try { + Integer emask = this.serviceLink.getServiceRegisterCache().getCachedInteger(13, 0, 0x9001); + + System.err.println(String.format("EMASK: 0x%08x", emask)); + + + this.serviceLink.writeInt((byte)13, (byte)0, 0x1001, 2); + } catch (ServiceLinkRequestFailedException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } catch (ServiceLinkException e) { + e.printStackTrace(); + } + } + } + + private void message(String msg){ + ((DefaultListModel)lMessages.getModel()).addElement(msg); + } + + private void quartzCorrect(){ + long lStart,lEnd; + long rStart,rEnd; + long lDelta,rDelta; + long delta; + + if (this.serviceLink != null){ + try + { + + lStart = System.currentTimeMillis(); + rStart = serviceLink.readInt(13, 0, 0x0027); + + Thread.sleep(30000); + + lEnd = System.currentTimeMillis(); + rEnd = serviceLink.readInt(13, 0, 0x0027); + + lDelta = (lEnd - lStart)*1000; + rDelta = rEnd - rStart; + + delta = lDelta - rDelta; + + message(String.format("Local: %d Remote: %d Delta: %d", lDelta,rDelta,delta)); + + delta /= 30; + + message(String.format("Korrektur: %d", delta)); + + serviceLink.writeInt(13, 0, 0x1002, (int)delta); + + } catch (Exception e) + { + e.printStackTrace(); + } + }; + + } } diff --git a/src/org/hwo/pulscounter/ui/MainWindow.java b/src/org/hwo/pulscounter/ui/MainWindow.java deleted file mode 100644 index 2b5c301..0000000 --- a/src/org/hwo/pulscounter/ui/MainWindow.java +++ /dev/null @@ -1,98 +0,0 @@ -package org.hwo.pulscounter.ui; - -import java.awt.EventQueue; - -import javax.swing.JFrame; -import java.awt.GridBagLayout; -import javax.swing.JButton; -import java.awt.GridBagConstraints; -import java.awt.Insets; -import java.awt.event.ActionListener; -import java.awt.event.ActionEvent; - -public class MainWindow { - - private JFrame frame; - - /** - * Launch the application. - */ - public static void main(String[] args) { - EventQueue.invokeLater(new Runnable() { - public void run() { - try { - MainWindow window = new MainWindow(); - window.frame.setVisible(true); - } catch (Exception e) { - e.printStackTrace(); - } - } - }); - } - - /** - * Create the application. - */ - public MainWindow() { - initialize(); - } - - /** - * Initialize the contents of the frame. - */ - private void initialize() { - frame = new JFrame(); - frame.setBounds(100, 100, 655, 444); - frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - GridBagLayout gridBagLayout = new GridBagLayout(); - gridBagLayout.columnWidths = new int[]{0, 0, 0}; - gridBagLayout.rowHeights = new int[]{0, 0, 0}; - gridBagLayout.columnWeights = new double[]{1.0, 1.0, Double.MIN_VALUE}; - gridBagLayout.rowWeights = new double[]{1.0, 1.0, Double.MIN_VALUE}; - frame.getContentPane().setLayout(gridBagLayout); - - JButton btnNewButton = new JButton("Live Ansicht"); - btnNewButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - LiveViewFrame lvf = new LiveViewFrame(); - lvf.setVisible(true); - } - }); - GridBagConstraints gbc_btnNewButton = new GridBagConstraints(); - gbc_btnNewButton.fill = GridBagConstraints.BOTH; - gbc_btnNewButton.insets = new Insets(0, 0, 5, 5); - gbc_btnNewButton.gridx = 0; - gbc_btnNewButton.gridy = 0; - frame.getContentPane().add(btnNewButton, gbc_btnNewButton); - - JButton btnAuswertung = new JButton("Auswertung"); - GridBagConstraints gbc_btnAuswertung = new GridBagConstraints(); - gbc_btnAuswertung.fill = GridBagConstraints.BOTH; - gbc_btnAuswertung.insets = new Insets(0, 0, 5, 0); - gbc_btnAuswertung.gridx = 1; - gbc_btnAuswertung.gridy = 0; - frame.getContentPane().add(btnAuswertung, gbc_btnAuswertung); - - JButton btnZhlerKonfigurieren = new JButton("Zähler konfigurieren"); - GridBagConstraints gbc_btnZhlerKonfigurieren = new GridBagConstraints(); - gbc_btnZhlerKonfigurieren.fill = GridBagConstraints.BOTH; - gbc_btnZhlerKonfigurieren.insets = new Insets(0, 0, 0, 5); - gbc_btnZhlerKonfigurieren.gridx = 0; - gbc_btnZhlerKonfigurieren.gridy = 1; - frame.getContentPane().add(btnZhlerKonfigurieren, gbc_btnZhlerKonfigurieren); - - JButton btnEinstellungen = new JButton("Einstellungen"); - btnEinstellungen.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - AppSettingsFrame asf = new AppSettingsFrame(); - asf.setVisible(true); - } - }); - GridBagConstraints gbc_btnEinstellungen = new GridBagConstraints(); - gbc_btnEinstellungen.fill = GridBagConstraints.BOTH; - gbc_btnEinstellungen.gridx = 1; - gbc_btnEinstellungen.gridy = 1; - frame.getContentPane().add(btnEinstellungen, gbc_btnEinstellungen); - } - -} diff --git a/src/org/hwo/pulscounter/ui/NewMainWindow.java b/src/org/hwo/pulscounter/ui/NewMainWindow.java new file mode 100644 index 0000000..0b5bdeb --- /dev/null +++ b/src/org/hwo/pulscounter/ui/NewMainWindow.java @@ -0,0 +1,913 @@ +package org.hwo.pulscounter.ui; + +import java.awt.EventQueue; + +import javax.swing.JFrame; +import java.awt.GridBagLayout; +import java.awt.BorderLayout; +import javax.swing.JToolBar; +import javax.swing.JSplitPane; +import javax.swing.JPanel; +import java.awt.GridBagConstraints; +import javax.swing.border.TitledBorder; + +import org.hwo.Smoother; +import org.hwo.datetime.DateTime; +import org.hwo.io.NewSerialPort.NewSerialPort; +import org.hwo.logging.Logging; +import org.hwo.platform.Platform; +import org.hwo.pulscounter.PulsCounter2Application; +import org.hwo.pulscounter.PulsCounterApplicationListener; +import org.hwo.pulscounter.SnapshotManager.Notification; +import org.hwo.servicelink.ServiceLinkException; +import org.hwo.servicelink.ServiceLinkRequestFailedException; +import org.hwo.tasklet.Tasklet; +import org.hwo.tasklet.TaskletListener; +import org.hwo.tasklet.TaskletManager; +import org.hwo.ui.dialog.SerialPortChooser; +import org.omg.CORBA.Environment; + +import javax.swing.JLabel; +import javax.swing.JTextField; +import java.awt.Insets; + +import javax.swing.DefaultListModel; +import javax.swing.JButton; +import java.awt.event.ActionListener; +import java.awt.event.KeyEvent; +import java.awt.event.WindowEvent; +import java.awt.event.WindowListener; +import java.awt.event.WindowStateListener; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Calendar; +import java.util.Enumeration; +import java.util.Iterator; +import java.util.List; +import java.util.Timer; +import java.util.TimerTask; +import java.awt.event.ActionEvent; +import java.awt.Color; +import java.awt.Dialog.ModalityType; + +import javax.swing.JScrollPane; +import javax.swing.JList; +import java.awt.Font; +import javax.swing.SwingConstants; +import javax.swing.ToolTipManager; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; + +import java.awt.Dimension; +import javax.swing.BoxLayout; +import javax.swing.border.EmptyBorder; +import javax.swing.JCheckBox; +import javax.swing.event.ChangeListener; +import javax.swing.plaf.metal.MetalBorders.ToolBarBorder; +import javax.swing.event.ChangeEvent; +import static org.hwo.logging.Logging.log; + +public class NewMainWindow implements PulsCounterApplicationListener, TaskletListener{ + + private JFrame frmSynolog; + private JTextField tfSerialPortName; + private JSplitPane splitter; + private JButton btnNewButton; + private JTextField tfConnection; + private JButton btnSetup; + + private DefaultListModel messageListModel; + private JList lMessages; + + private Timer timerReconnect; + private JPanel pChannels; + + private ChannelDisplay[] channelDisplays; + private JButton btnC; + private JPanel panel_3; + private JScrollPane scrollPane_1; + private JList lTasklets; + + private DefaultListModel knownTasklets; + + private Boolean connected; + private JButton btnDatenExportieren; + + private Integer trimTicksOnConnect; + private Long trimTimeOnConnect; + private Integer trimDeviceTimeSlice; + private JCheckBox cbTrimDevice; + + private Smoother smoothTrim; + + + /** + * Launch the application. + */ + public static void main(String[] args) { + + boolean batchRun = false; + boolean deviceSetup = false; + String logFileName = "synololog.log"; + + Iterator aiter = Arrays.asList(args).iterator(); + + while (aiter.hasNext()){ + String opt = aiter.next(); + + switch (opt){ + case "-b": + batchRun = true; + break; + case "--device-setup": + deviceSetup = true; + batchRun = false; + break; + case "--log": + logFileName = aiter.next(); + break; + } + } + + Logging.setLogFileName(logFileName); + + logStartup(); + + if (deviceSetup){ + startDeviceSetup(); + } else if (batchRun){ + startBATCH(); + } else { + startGUI(); + } + } + + private static void logStartup(){ + log("%s.logStartup()",NewMainWindow.class.getCanonicalName()); + log("Synololog Java Software startup"); + + log("JAVA Environment: %s (%s)", System.getProperty("java.version"), + System.getProperty("java.vendor")); + + log("Operating System: %s [%s] %s", System.getProperty("os.name"), + System.getProperty("os.arch"), + System.getProperty("os.version")); + + log("User Environment: %s (%s) (CWD:%s)", System.getProperty("user.name"), + System.getProperty("user.home"), + System.getProperty("user.dir")); + + log("Hostname: %s",Platform.getHostName()); + log("OS Search Path: %s", System.getenv("PATH")); + } + + public static void startGUI(){ + + try { + // Set cross-platform Java L&F (also called "Metal") + UIManager.setLookAndFeel( + UIManager.getCrossPlatformLookAndFeelClassName()); + } + catch (UnsupportedLookAndFeelException e) { + // handle exception + } + catch (ClassNotFoundException e) { + // handle exception + } + catch (InstantiationException e) { + // handle exception + } + catch (IllegalAccessException e) { + // handle exception + } + + ToolTipManager.sharedInstance().setDismissDelay( 20000 ); + ToolTipManager.sharedInstance().setInitialDelay( 1250 ); + ToolTipManager.sharedInstance().setReshowDelay( 500 ); + + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + NewMainWindow window = new NewMainWindow(); + window.frmSynolog.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + public static void startBATCH(){ + + BatchRunner batchRunner = new BatchRunner(); + batchRunner.run(); + + } + + public static void startDeviceSetup(){ + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + DeviceTestFrame deviceTestFrame = new DeviceTestFrame(); + deviceTestFrame.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + + /** + * @wbp.parser.entryPoint + */ + public NewMainWindow() { + initialize(); + + this.connected = false; + + knownTasklets = new DefaultListModel(); + lTasklets.setModel(knownTasklets); + TaskletManager.instance().addTaskletListener(this); + + messageListModel = new DefaultListModel(); + lMessages.setModel(messageListModel); + + timerReconnect = new Timer("ReconnectThread",true); + + application().addPulsCounterApplicationListener(this); + + application().fireConnectionStateChanged(); + application().fireSerialPortChanged(); + + application().message("Synololog Applikation wurde gestartet."); + + channelDisplays = new ChannelDisplay[32]; + + for (int i=0;i<32;i++){ + channelDisplays[i] = new ChannelDisplay(); + channelDisplays[i].setChannelName(String.format("%02d",i)); + if (i > 7){ + channelDisplays[i].setAnalog(false); + } + GridBagConstraints gbc = new GridBagConstraints(); + gbc.insets = new Insets(2, 2, 2, 2); + gbc.anchor = GridBagConstraints.NORTHWEST; + gbc.fill = GridBagConstraints.HORIZONTAL; + gbc.weightx = 1; + gbc.weighty = 1; + gbc.gridx = i & 0x03; + gbc.gridy = i >> 2; + + channelDisplays[i].addChannelDisplayListener(new ChannelDisplayListener() { + + @Override + public void set(ChannelDisplay sender, int setValue) { + channelSet(sender, setValue); + } + + @Override + public void reset(ChannelDisplay sender) { + channelReset(sender); + } + }); + + pChannels.add(channelDisplays[i], gbc); + } + + timerReconnect.scheduleAtFixedRate(new TimerTask() { + + @Override + public void run() { + updateChannelView(); + } + }, 5000, 500); + + timerReconnect.schedule(new TimerTask() { + + @Override + public void run() { + if (application().getServiceLink().isOpen()){ + application().getSnapshotManager().notify(Notification.SYNC); + } + } + }, 15000, 15000); + + timerReconnect.schedule(new TimerTask() { + + @Override + public void run() { + if (application().getServiceLink().isOpen()){ + if (cbTrimDevice.isSelected()){ + trimDevice(); + } + syncClock(); + } + } + }, 52000, 15000); + + frmSynolog.addWindowListener(new WindowListener() { + + @Override + public void windowOpened(WindowEvent e) { + // TODO Auto-generated method stub + + } + + @Override + public void windowIconified(WindowEvent e) { + // TODO Auto-generated method stub + + } + + @Override + public void windowDeiconified(WindowEvent e) { + // TODO Auto-generated method stub + + } + + @Override + public void windowDeactivated(WindowEvent e) { + // TODO Auto-generated method stub + + } + + @Override + public void windowClosing(WindowEvent e) { + // TODO Auto-generated method stub + + } + + @Override + public void windowClosed(WindowEvent e) { + + } + + @Override + public void windowActivated(WindowEvent e) { + // TODO Auto-generated method stub + + } + }); + + } + + /** + * Initialize the contents of the frame. + */ + private void initialize() { + frmSynolog = new JFrame(); + frmSynolog.setTitle("Synololog"); + frmSynolog.setBounds(100, 100, 1000, 580); + frmSynolog.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + frmSynolog.getContentPane().setLayout(new BorderLayout(0, 0)); + frmSynolog.setBackground(Color.WHITE); + + JToolBar toolBar = new JToolBar(); + toolBar.setBorder(new EmptyBorder(3, 3, 3, 3)); + toolBar.setBackground(Color.WHITE); + toolBar.setFloatable(false); + frmSynolog.getContentPane().add(toolBar, BorderLayout.NORTH); + + btnSetup = new JButton("S"); + btnSetup.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + AppSettingsFrame asf = new AppSettingsFrame(); + asf.setModalityType(ModalityType.APPLICATION_MODAL); + + if ((e.getModifiers() & ActionEvent.CTRL_MASK) != 0) + asf.debugging(); + + asf.setVisible(true); + } + }); + btnSetup.setToolTipText("\nEinstellungen
\n
\nEinstellungen der Synololog PC Software ändern.\n"); + toolBar.add(btnSetup); + + btnC = new JButton("C"); + btnC.setToolTipText("\nKonfiguration
\n
\nKonfiguration des Synololog bearbeiten.\n"); + btnC.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + DeviceConfiguration cc = new DeviceConfiguration(); + cc.setVisible(true); + } + }); + toolBar.add(btnC); + + btnDatenExportieren = new JButton("Daten exportieren..."); + btnDatenExportieren.setToolTipText("\nDaten exportieren
\n
\nExport definitionen bearbeiten und ausführen.
\nHiermit können die Aufzeichnungsdaten in Textdateien exportiert werden.
\n"); + btnDatenExportieren.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + ExportFilesFrame eff = new ExportFilesFrame(); + eff.setVisible(true); + } + }); + toolBar.add(btnDatenExportieren); + + splitter = new JSplitPane(); + splitter.setBorder(null); + splitter.setOneTouchExpandable(true); + splitter.setResizeWeight(0.6); + frmSynolog.getContentPane().add(splitter, BorderLayout.CENTER); + + JPanel panel = new JPanel(); + panel.setBackground(Color.WHITE); + splitter.setRightComponent(panel); + GridBagLayout gbl_panel = new GridBagLayout(); + gbl_panel.columnWidths = new int[]{0, 0}; + gbl_panel.rowHeights = new int[]{0, 0, 0, 0, 0, 0, 0}; + gbl_panel.columnWeights = new double[]{1.0, Double.MIN_VALUE}; + gbl_panel.rowWeights = new double[]{0.0, 0.0, 0.0, 0.0, 1.0, 0.0, Double.MIN_VALUE}; + panel.setLayout(gbl_panel); + + JPanel panel_1 = new JPanel(); + panel_1.setBackground(Color.WHITE); + panel_1.setBorder(new TitledBorder(null, "Verbindung", TitledBorder.LEADING, TitledBorder.TOP, null, null)); + GridBagConstraints gbc_panel_1 = new GridBagConstraints(); + gbc_panel_1.insets = new Insets(0, 0, 5, 0); + gbc_panel_1.anchor = GridBagConstraints.NORTH; + gbc_panel_1.fill = GridBagConstraints.HORIZONTAL; + gbc_panel_1.gridx = 0; + gbc_panel_1.gridy = 0; + panel.add(panel_1, gbc_panel_1); + GridBagLayout gbl_panel_1 = new GridBagLayout(); + gbl_panel_1.columnWidths = new int[]{0, 0, 0, 0}; + gbl_panel_1.rowHeights = new int[]{0, 0, 0, 0, 0, 0}; + gbl_panel_1.columnWeights = new double[]{1.0, 1.0, 0.0, Double.MIN_VALUE}; + gbl_panel_1.rowWeights = new double[]{0.0, 0.0, 0.0, 0.0, 0.0, Double.MIN_VALUE}; + panel_1.setLayout(gbl_panel_1); + + JLabel lblAnschluss = new JLabel("Anschluss:"); + GridBagConstraints gbc_lblAnschluss = new GridBagConstraints(); + gbc_lblAnschluss.insets = new Insets(0, 0, 5, 5); + gbc_lblAnschluss.anchor = GridBagConstraints.WEST; + gbc_lblAnschluss.gridx = 0; + gbc_lblAnschluss.gridy = 0; + panel_1.add(lblAnschluss, gbc_lblAnschluss); + + tfSerialPortName = new JTextField(); + tfSerialPortName.setToolTipText("\nAusgewählter Anschluss
\n
\nHier wird der momentan gewählte Anschluss gezeigt,
\ndurch den die Software mit dem Synololog kommuniziert.\n"); + tfSerialPortName.setEditable(false); + GridBagConstraints gbc_tfSerialPortName = new GridBagConstraints(); + gbc_tfSerialPortName.gridwidth = 3; + gbc_tfSerialPortName.insets = new Insets(0, 0, 5, 0); + gbc_tfSerialPortName.fill = GridBagConstraints.HORIZONTAL; + gbc_tfSerialPortName.gridx = 0; + gbc_tfSerialPortName.gridy = 1; + panel_1.add(tfSerialPortName, gbc_tfSerialPortName); + tfSerialPortName.setColumns(10); + + btnNewButton = new JButton("auswählen..."); + btnNewButton.setToolTipText("\nAuswahl eines anderen Anschlusses\n"); + btnNewButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + chooseSerialPort(); + } + }); + + cbTrimDevice = new JCheckBox("Trimmung justieren"); + cbTrimDevice.setToolTipText("\nAbgleich der Zeitmessung
\n
\nDiese Funktion gleicht die Geschwindigkeit der Echtzeituhr des
\nSynololog mit der des Rechners ab und korrigiert diese Laufzeitdifferenz.
\n
\nHierdurch kann der Synololog auch ohne angeschlossenen Rechner über
\nmehrere Tage hinweg eine genaue Systemzeit vorhalten.
\n
\nDie Trimmung sollte vor allem dann ausgeführt werden, wenn die durchschnittliche
\nUmgebungstemperatur am Einsatzort des Synololog sich stark verändert.\n"); + cbTrimDevice.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + trimTicksOnConnect = null; + if (cbTrimDevice.isSelected()){ + trimDevice(); + } + } + }); + + GridBagConstraints gbc_cbTrimDevice = new GridBagConstraints(); + gbc_cbTrimDevice.anchor = GridBagConstraints.WEST; + gbc_cbTrimDevice.insets = new Insets(0, 0, 5, 5); + gbc_cbTrimDevice.gridx = 0; + gbc_cbTrimDevice.gridy = 2; + panel_1.add(cbTrimDevice, gbc_cbTrimDevice); + GridBagConstraints gbc_btnNewButton = new GridBagConstraints(); + gbc_btnNewButton.insets = new Insets(0, 0, 5, 0); + gbc_btnNewButton.gridx = 2; + gbc_btnNewButton.gridy = 2; + panel_1.add(btnNewButton, gbc_btnNewButton); + + tfConnection = new JTextField(); + tfConnection.setHorizontalAlignment(SwingConstants.CENTER); + tfConnection.setText("..."); + tfConnection.setBackground(Color.WHITE); + tfConnection.setEditable(false); + GridBagConstraints gbc_tfConnection = new GridBagConstraints(); + gbc_tfConnection.fill = GridBagConstraints.HORIZONTAL; + gbc_tfConnection.gridwidth = 3; + gbc_tfConnection.gridx = 0; + gbc_tfConnection.gridy = 4; + panel_1.add(tfConnection, gbc_tfConnection); + tfConnection.setColumns(10); + + JPanel panel_2 = new JPanel(); + panel_2.setBackground(Color.WHITE); + panel_2.setBorder(new TitledBorder(null, "Meldungen", 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 = 4; + panel.add(panel_2, gbc_panel_2); + GridBagLayout gbl_panel_2 = new GridBagLayout(); + gbl_panel_2.columnWidths = new int[]{142, 0}; + gbl_panel_2.rowHeights = new int[]{3, 0}; + gbl_panel_2.columnWeights = new double[]{1.0, Double.MIN_VALUE}; + gbl_panel_2.rowWeights = new double[]{1.0, Double.MIN_VALUE}; + panel_2.setLayout(gbl_panel_2); + + JScrollPane scrollPane = new JScrollPane(); + GridBagConstraints gbc_scrollPane = new GridBagConstraints(); + gbc_scrollPane.fill = GridBagConstraints.BOTH; + gbc_scrollPane.gridx = 0; + gbc_scrollPane.gridy = 0; + panel_2.add(scrollPane, gbc_scrollPane); + + lMessages = new JList(); + lMessages.setFont(new Font("Cantarell", Font.PLAIN, 10)); + scrollPane.setViewportView(lMessages); + + panel_3 = new JPanel(); + panel_3.setBackground(Color.WHITE); + panel_3.setBorder(new TitledBorder(null, "Aktive Aufgaben", TitledBorder.LEADING, TitledBorder.TOP, null, null)); + GridBagConstraints gbc_panel_3 = new GridBagConstraints(); + gbc_panel_3.fill = GridBagConstraints.BOTH; + gbc_panel_3.gridx = 0; + gbc_panel_3.gridy = 5; + panel.add(panel_3, gbc_panel_3); + panel_3.setLayout(new BoxLayout(panel_3, BoxLayout.X_AXIS)); + + scrollPane_1 = new JScrollPane(); + panel_3.add(scrollPane_1); + + lTasklets = new JList(); + scrollPane_1.setViewportView(lTasklets); + + pChannels = new JPanel(); + pChannels.setBorder(new EmptyBorder(10, 10, 10, 10)); + pChannels.setBackground(Color.WHITE); + pChannels.setMinimumSize(new Dimension(600, 10)); + splitter.setLeftComponent(pChannels); + GridBagLayout gbl_pChannels = new GridBagLayout(); + gbl_pChannels.columnWidths = new int[]{0}; + gbl_pChannels.rowHeights = new int[]{0}; + gbl_pChannels.columnWeights = new double[]{Double.MIN_VALUE}; + gbl_pChannels.rowWeights = new double[]{Double.MIN_VALUE}; + pChannels.setLayout(gbl_pChannels); + + } + + private PulsCounter2Application application(){ + return PulsCounter2Application.getApplication(); + } + + private void chooseSerialPort(){ + SerialPortChooser spc = new SerialPortChooser(); + NewSerialPort nsp = spc.execute( application().getSerialPort().getPortName() ); + if (nsp != null) + setSerialPort(nsp); + } + + private void setSerialPort(NewSerialPort serialPort){ + PulsCounter2Application.getApplication().setSerialPort(serialPort); + } + + @Override + public void serialPortChanged() { + tfSerialPortName.setText(application().getSerialPort().getPortName()); + } + + @Override + public void connectionStateChanged(Boolean connected) { + if (connected){ + Integer version = application().getServiceLink().getServiceRegisterCache().getCachedInteger(13, 0, 0x001A); + Integer uptime = application().getServiceLink().getServiceRegisterCache().getCachedInteger(13, 0, 0x0022); + Integer eesize = application().getServiceLink().getServiceRegisterCache().getCachedInteger(13, 0, 0x9000); + + if (version != null){ + tfConnection.setText(String.format("Version %d.%d.%d", version >> 16, (version >> 8) & 0xff, version & 0xff)); + tfConnection.setBackground(Color.GREEN); + tfConnection.setForeground(Color.BLACK); + + + + application().message(String.format("Synololog verbunden (Version %d.%d.%d) (Uptime: %d:%d:%d)", version >> 16, (version >> 8) & 0xff, version & 0xff, uptime / 3600, (uptime / 60)%60, uptime % 60)); + application().message(String.format("EEPROM Size: 0x%08x Bytes", eesize)); + + trimDeviceTimeSlice = application().getServiceLink().getServiceRegisterCache().getCachedInteger(13, 0, 0x1302); + + /* Trim helper initialisieren */ + trimTicksOnConnect = null; + + application().getSnapshotManager().notify(Notification.FULLSYNC); + + } else { + tfConnection.setText("Version unbekannt"); + tfConnection.setBackground(Color.YELLOW); + tfConnection.setForeground(Color.BLACK); + + application().getServiceLink().close(); + } + } else { + tfConnection.setText("Nicht verbunden"); + tfConnection.setBackground(Color.RED); + tfConnection.setForeground(Color.WHITE); + + trimTicksOnConnect = null; + + if (timerReconnect != null){ + timerReconnect.schedule(new TimerTask() { + + @Override + public void run() { + if (!application().getServiceLink().isOpen()){ + try { + application().getServiceLink().open(); + } catch (ServiceLinkException e) { + e.printStackTrace(); + } + } + } + }, 3000); + } + + if (this.connected) + application().message("Verbindung getrennt"); + } + this.connected = connected; + + } + + @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); + } + }); + } + } + + + private void updateChannelView(){ + Integer inputs,outputs,pullups; + + if (application().getServiceLink().isOpen()){ + + inputs = application().getServiceLink().getServiceRegisterCache().getCachedInteger(13, 0, 0x0681 ); + outputs = application().getServiceLink().getServiceRegisterCache().getCachedInteger(13, 0, 0x0682 ); + pullups = application().getServiceLink().getServiceRegisterCache().getCachedInteger(13, 0, 0x0683 ); + + if (inputs == null) + inputs = 0; + if (outputs == null) + outputs = 0; + if (pullups == null) + pullups = 0; + + Integer[] values = new Integer[32]; + Float[] analog = new Float[8]; + + for (int i=0;i<32;i++){ + values[i] = application().getServiceLink().getServiceRegisterCache().getCachedInteger(13, 0, 0x0600 + i); + + if (i<8){ + analog[i] = application().getServiceLink().getServiceRegisterCache().getCachedFloat(13, 0, 0x8000 + i ) * 10; + } + + }; + + for (int i=0;i<32;i++){ + channelDisplays[i].setInput( (inputs & 1< 1)){ + application().message(String.format("Abweichung ist %d Sekunde(-n)",delta)); + application().getServiceLink().writeInt((byte)13, (byte)0, 0x001C, (int)(calendar.getTimeInMillis() / 1000L)); + application().message("Uhr der Elektronik wurde korrigiert."); + + } + } catch (ServiceLinkRequestFailedException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } catch (ServiceLinkException e) { + e.printStackTrace(); + } + + checkForAssertions(); + + } + + } + + private Integer syncClock(){ + return null; + } + + private Integer trimDevice(){ + try { + + if (trimTicksOnConnect != null){ + long s1,s2,T; + Integer device_us; + + + s1 = System.currentTimeMillis(); + device_us = application().getServiceLink().readInt(13, 0, 0x1300); + s2 = System.currentTimeMillis(); + T = (s1+s2)>>1; + + if (device_us < 0){ + trimTicksOnConnect = null; + } else { + long elapsed_us; + long diff_us; + long trim_ns_per_slice; + + elapsed_us = (T - trimTimeOnConnect) * 1000; + diff_us = elapsed_us - device_us; + + System.err.println(String.format("Device Triming: Elapsed us: Dev: %d PC %d Diff: %d", device_us,elapsed_us,diff_us)); + + trim_ns_per_slice = (diff_us * 1000) * trimDeviceTimeSlice / elapsed_us; + + smoothTrim.cycle((int)trim_ns_per_slice); + + System.err.println(String.format("Device Triming: Trim %dns / %dus",smoothTrim.getWert(),trimDeviceTimeSlice)); + + application().getServiceLink().writeInt(13, 0, 0x1002, smoothTrim.getWert()); + + application().message(String.format("Trimmung wurde korrigiert auf %dns / %dus",smoothTrim.getWert(),trimDeviceTimeSlice)); + + } + } else { + long s1,s2,T; + + try { + trimTicksOnConnect = application().getServiceLink().getServiceRegisterCache().getCachedInteger(13, 0, 0x0027); + s1 = System.currentTimeMillis(); + application().getServiceLink().writeInt(13, 0, 0x1301, 0); + s2 = System.currentTimeMillis(); + trimTimeOnConnect = (s1+s2)>>1; + + smoothTrim = new Smoother(); + smoothTrim.setTn( 10 ); + smoothTrim.setWert( application().getServiceLink().readInt(13, 0, 0x1002) ); + + } catch (Exception e){ + System.err.println("trimDevice(): init failed"); + e.printStackTrace(); + trimTicksOnConnect = null; + } + } + + + } catch (Exception e){ + e.printStackTrace(); + } + return null; + } + + + private void checkForAssertions(){ + Integer assert_error,assert_code; + + try + { + assert_error = -1; + for (int i=0;i<8;i++){ + assert_error = application().getServiceLink().readInt(13, 0, 0x0026); + assert_code = application().getServiceLink().readInt(13, 0, 0x0025); + + if (assert_error >= 0) + break; + + application().message(String.format("Assertion: Error: 0x%08x (%d) Position: 0x%04x Mark: %d", assert_error,assert_error, assert_code & 0xffff, (assert_code >> 16) & 0xffff)); + application().getServiceLink().writeInt(13, 0, 0x0025, -1); + }; + } catch (Exception ex){ + System.err.println("Exception while checking for assertions..."); + ex.printStackTrace(); + } + } + + @Override + public synchronized void taskletQueued(final TaskletManager manager, final Tasklet tasklet) { + if (EventQueue.isDispatchThread()) + knownTasklets.addElement(tasklet); + else { + EventQueue.invokeLater(new Runnable() { + + @Override + public void run() { + taskletQueued(manager, tasklet); + } + }); + } + } + + @Override + public synchronized void taskletStarted(final TaskletManager manager, final Tasklet tasklet) { + if (EventQueue.isDispatchThread()) + lTasklets.repaint(); + else + EventQueue.invokeLater(new Runnable() { + + @Override + public void run() { + taskletStarted(manager, tasklet); + } + }); + } + + @Override + public synchronized void taskletFinished(final TaskletManager manager, final Tasklet tasklet) { + if (EventQueue.isDispatchThread()) + knownTasklets.removeElement(tasklet); + else + EventQueue.invokeLater(new Runnable() { + + @Override + public void run() { + taskletFinished(manager, tasklet); + } + }); + } + @Override + public synchronized void taskletProgressChanged(final TaskletManager manager, final Tasklet tasklet) { + if (EventQueue.isDispatchThread()) + lTasklets.repaint(); + else + EventQueue.invokeLater(new Runnable() { + + @Override + public void run() { + taskletProgressChanged(manager, tasklet); + } + }); + } + + private void channelReset(ChannelDisplay display){ + for (int n=0;n<32;n++){ + if (display == channelDisplays[n]){ + channelReset(n,0); + return; + } + } + } + + private void channelReset(int channel,int setValue){ + try { + + application().getServiceLink().writeInt(13, 0, 0x0600 + channel, setValue); + + } catch (ServiceLinkRequestFailedException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } catch (ServiceLinkException e) { + e.printStackTrace(); + } + } + + private void channelSet(ChannelDisplay display,int setValue){ + for (int n=0;n<32;n++){ + if (display == channelDisplays[n]){ + channelReset(n,setValue); + return; + } + } + } + +} + + + + diff --git a/src/org/hwo/pulscounter/ui/PulsCounterWindow.java b/src/org/hwo/pulscounter/ui/PulsCounterWindow.java deleted file mode 100644 index 3d1ea3e..0000000 --- a/src/org/hwo/pulscounter/ui/PulsCounterWindow.java +++ /dev/null @@ -1,1038 +0,0 @@ -package org.hwo.pulscounter.ui; - -import java.awt.EventQueue; - -import javax.swing.DesktopManager; -import javax.swing.JFileChooser; -import javax.swing.JFrame; -import javax.swing.JMenuItem; -import javax.swing.JPanel; -import javax.swing.JPopupMenu; -import javax.swing.Timer; - -import java.awt.BorderLayout; - -import javax.swing.JButton; - -import java.awt.Desktop; -import java.awt.GridBagLayout; -import java.awt.GridBagConstraints; - -import javax.swing.JLabel; -import javax.swing.JComboBox; - -import org.hwo.beacon.Beacon; -import org.hwo.beacon.Beacon.BeaconSender; -import org.hwo.bitfields.BitField; -import org.hwo.csv.CSV; -import org.hwo.io.SerialPort; -import org.hwo.io.SerialPortExeption; -import org.hwo.models.TableMapper.AbstractTableMapperListener; -import org.hwo.models.TableMapper.TableMapper; -import org.hwo.pulscounter.CounterChannel; -import org.hwo.pulscounter.IPulsCounter; -import org.hwo.pulscounter.NewPulsCounterDevice; -import org.hwo.pulscounter.PulsCounter; -import org.hwo.pulscounter.TimeBarrier; -import org.hwo.pulscounter.service.PulsCounterService; -import org.hwo.rpc.simple.SimpleRPCService; -import org.hwo.ui.JObjectSelector; -import org.hwo.ui.MousePopupListener; - -import java.awt.Insets; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; -import java.util.Properties; -import java.util.UUID; -import java.util.prefs.BackingStoreException; -import java.util.prefs.Preferences; - -import javax.swing.JTable; -import javax.swing.JScrollPane; - -import java.awt.event.ActionListener; -import java.awt.event.ActionEvent; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; - -import javax.swing.border.TitledBorder; -import javax.swing.JSpinner; -import javax.swing.SpinnerNumberModel; -import javax.swing.border.BevelBorder; -import javax.swing.SwingConstants; -import javax.swing.event.ChangeListener; -import javax.swing.event.ChangeEvent; -import javax.swing.JTabbedPane; -import javax.swing.BoxLayout; - -import java.awt.event.WindowAdapter; -import java.awt.event.WindowEvent; -import java.io.Console; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.net.InetAddress; -import java.net.UnknownHostException; - -import org.hwo.datetime.JTimeOfDay; - -import javax.swing.JTextField; -import javax.swing.JRadioButton; -import javax.swing.JCheckBox; - -public class PulsCounterWindow extends JFrame{ - - Beacon clientBeacon; - IPulsCounter connectedPulsCounter; - UUID selectedNetworkUUID; - - boolean useUSB; - boolean useNetwork; - - - private JTable tCounter; - - private TableMapper tmCounter; - private Preferences prefs; - private List counterChannels; - - private final JPanel panel_7 = new JPanel(); - private JLabel lDeviceType; - private JLabel lDeviceTime; - private JLabel lActivity; - - Thread threadUpdater; - Timer updateTimer; - private JSpinner spUpdateIntervall; - - boolean applicationExiting; - - private JComboBox cbTimeBarriers; - private JTable tTBChannels; - private JTimeOfDay todTimebarrier; - - private TableMapper tmTBChannels; - private JTextField tfWorkDir; - - private String workingDirectory; - private JTextField tfPhysicalInterface; - private JTextField tfNetworkNode; - private JRadioButton rbNetwork; - private JRadioButton rbUSB; - private JCheckBox cbUSBEnabled; - private JButton btnNetzwerk; - private JLabel lInputs; - - public PulsCounterWindow() { - addWindowListener(new WindowAdapter() { - @Override - public void windowClosing(WindowEvent arg0) { - applicationExiting = true; - try { - prefs.sync(); - } catch (Exception ex){ - System.err.print("Preferences could not be saved."); - ex.printStackTrace(); - } - } - }); - setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - setBounds(100, 100, 930, 592); - setTitle("PulsCounter"); - GridBagLayout gridBagLayout = new GridBagLayout(); - gridBagLayout.columnWidths = new int[]{0, 0}; - gridBagLayout.rowHeights = new int[]{0, 0, 0, 0}; - gridBagLayout.columnWeights = new double[]{1.0, Double.MIN_VALUE}; - gridBagLayout.rowWeights = new double[]{0.0, 1.0, 0.0, Double.MIN_VALUE}; - getContentPane().setLayout(gridBagLayout); - - 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; - getContentPane().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, 0, 0}; - gbl_panel.columnWeights = new double[]{1.0, 1.0, 0.0, 1.0, 0.0, Double.MIN_VALUE}; - gbl_panel.rowWeights = new double[]{1.0, 1.0, 1.0, 0.0, 1.0, Double.MIN_VALUE}; - panel.setLayout(gbl_panel); - - JPanel panel_1 = new JPanel(); - panel_1.setBorder(new TitledBorder(null, "Anschluss", TitledBorder.LEADING, TitledBorder.TOP, null, null)); - GridBagConstraints gbc_panel_1 = new GridBagConstraints(); - gbc_panel_1.gridwidth = 3; - gbc_panel_1.insets = new Insets(0, 0, 5, 5); - gbc_panel_1.fill = GridBagConstraints.BOTH; - gbc_panel_1.gridx = 0; - gbc_panel_1.gridy = 0; - panel.add(panel_1, gbc_panel_1); - GridBagLayout gbl_panel_1 = new GridBagLayout(); - gbl_panel_1.columnWidths = new int[]{0, 0, 0, 0}; - gbl_panel_1.rowHeights = new int[]{0, 0, 0, 0}; - gbl_panel_1.columnWeights = new double[]{0.0, 1.0, 0.0, Double.MIN_VALUE}; - gbl_panel_1.rowWeights = new double[]{0.0, 0.0, 0.0, Double.MIN_VALUE}; - panel_1.setLayout(gbl_panel_1); - - rbUSB = new JRadioButton("USB"); - rbUSB.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent arg0) { - selectUSBConnection(); - } - }); - GridBagConstraints gbc_rbUSB = new GridBagConstraints(); - gbc_rbUSB.anchor = GridBagConstraints.WEST; - gbc_rbUSB.insets = new Insets(0, 0, 5, 5); - gbc_rbUSB.gridx = 0; - gbc_rbUSB.gridy = 0; - panel_1.add(rbUSB, gbc_rbUSB); - - rbNetwork = new JRadioButton("Netzwerk"); - rbNetwork.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - selectNetworkConnection(); - } - }); - - cbUSBEnabled = new JCheckBox("USB Verbindung aktiv"); - cbUSBEnabled.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - switchUSBEnabled(); - } - }); - GridBagConstraints gbc_cbUSBEnabled = new GridBagConstraints(); - gbc_cbUSBEnabled.anchor = GridBagConstraints.EAST; - gbc_cbUSBEnabled.insets = new Insets(0, 0, 5, 5); - gbc_cbUSBEnabled.gridx = 1; - gbc_cbUSBEnabled.gridy = 0; - panel_1.add(cbUSBEnabled, gbc_cbUSBEnabled); - GridBagConstraints gbc_rbNetwork = new GridBagConstraints(); - gbc_rbNetwork.anchor = GridBagConstraints.WEST; - gbc_rbNetwork.insets = new Insets(0, 0, 5, 5); - gbc_rbNetwork.gridx = 0; - gbc_rbNetwork.gridy = 1; - panel_1.add(rbNetwork, gbc_rbNetwork); - - btnNetzwerk = new JButton("Netzwerk..."); - btnNetzwerk.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent arg0) { - } - }); - - tfNetworkNode = new JTextField(); - tfNetworkNode.setEditable(false); - GridBagConstraints gbc_tfNetworkNode = new GridBagConstraints(); - gbc_tfNetworkNode.insets = new Insets(0, 0, 5, 5); - gbc_tfNetworkNode.fill = GridBagConstraints.HORIZONTAL; - gbc_tfNetworkNode.gridx = 1; - gbc_tfNetworkNode.gridy = 1; - panel_1.add(tfNetworkNode, gbc_tfNetworkNode); - tfNetworkNode.setColumns(10); - GridBagConstraints gbc_btnNetzwerk = new GridBagConstraints(); - gbc_btnNetzwerk.insets = new Insets(0, 0, 5, 0); - gbc_btnNetzwerk.gridx = 2; - gbc_btnNetzwerk.gridy = 1; - panel_1.add(btnNetzwerk, gbc_btnNetzwerk); - - JLabel lblNewLabel = new JLabel("Schnittstelle:"); - GridBagConstraints gbc_lblNewLabel = new GridBagConstraints(); - gbc_lblNewLabel.anchor = GridBagConstraints.EAST; - gbc_lblNewLabel.insets = new Insets(0, 0, 0, 5); - gbc_lblNewLabel.gridx = 0; - gbc_lblNewLabel.gridy = 2; - panel_1.add(lblNewLabel, gbc_lblNewLabel); - - tfPhysicalInterface = new JTextField(); - tfPhysicalInterface.setEditable(false); - GridBagConstraints gbc_tfPhysicalInterface = new GridBagConstraints(); - gbc_tfPhysicalInterface.insets = new Insets(0, 0, 0, 5); - gbc_tfPhysicalInterface.anchor = GridBagConstraints.NORTH; - gbc_tfPhysicalInterface.fill = GridBagConstraints.HORIZONTAL; - gbc_tfPhysicalInterface.gridx = 1; - gbc_tfPhysicalInterface.gridy = 2; - panel_1.add(tfPhysicalInterface, gbc_tfPhysicalInterface); - tfPhysicalInterface.setColumns(10); - - JButton btnWhlen = new JButton("w\u00E4hlen..."); - btnWhlen.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - selectPhysicalInterface(); - } - }); - GridBagConstraints gbc_btnWhlen = new GridBagConstraints(); - gbc_btnWhlen.gridx = 2; - gbc_btnWhlen.gridy = 2; - panel_1.add(btnWhlen, gbc_btnWhlen); - - JPanel panel_2 = new JPanel(); - panel_2.setBorder(new TitledBorder(null, "Einstellungen", TitledBorder.LEADING, TitledBorder.TOP, null, null)); - GridBagConstraints gbc_panel_2 = new GridBagConstraints(); - gbc_panel_2.gridwidth = 2; - gbc_panel_2.insets = new Insets(0, 0, 5, 0); - gbc_panel_2.fill = GridBagConstraints.BOTH; - gbc_panel_2.gridx = 3; - gbc_panel_2.gridy = 0; - panel.add(panel_2, gbc_panel_2); - GridBagLayout gbl_panel_2 = new GridBagLayout(); - gbl_panel_2.columnWidths = new int[]{0, 0, 0, 0}; - gbl_panel_2.rowHeights = new int[]{0, 0, 0}; - gbl_panel_2.columnWeights = new double[]{0.0, 1.0, 0.0, Double.MIN_VALUE}; - gbl_panel_2.rowWeights = new double[]{0.0, 0.0, Double.MIN_VALUE}; - panel_2.setLayout(gbl_panel_2); - - JLabel lblAktualisierungsintervall = new JLabel("Aktualisierungsintervall:"); - GridBagConstraints gbc_lblAktualisierungsintervall = new GridBagConstraints(); - gbc_lblAktualisierungsintervall.anchor = GridBagConstraints.WEST; - gbc_lblAktualisierungsintervall.insets = new Insets(0, 0, 5, 5); - gbc_lblAktualisierungsintervall.gridx = 0; - gbc_lblAktualisierungsintervall.gridy = 0; - panel_2.add(lblAktualisierungsintervall, gbc_lblAktualisierungsintervall); - - spUpdateIntervall = new JSpinner(); - spUpdateIntervall.addChangeListener(new ChangeListener() { - public void stateChanged(ChangeEvent arg0) { - if (updateTimer != null) - { - Integer updateIntervall = (Integer)spUpdateIntervall.getValue(); - updateTimer.stop(); - updateTimer.setDelay(updateIntervall * 1000); - updateTimer.start(); - - prefs.putInt("update.intervall", updateIntervall); - try { - prefs.flush(); - } catch (BackingStoreException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - } - }); - spUpdateIntervall.setModel(new SpinnerNumberModel(15, 5, 3600, 1)); - GridBagConstraints gbc_spUpdateIntervall = new GridBagConstraints(); - gbc_spUpdateIntervall.gridwidth = 2; - gbc_spUpdateIntervall.insets = new Insets(0, 0, 5, 0); - gbc_spUpdateIntervall.anchor = GridBagConstraints.EAST; - gbc_spUpdateIntervall.gridx = 1; - gbc_spUpdateIntervall.gridy = 0; - panel_2.add(spUpdateIntervall, gbc_spUpdateIntervall); - - JLabel lblArbeitsverzeichnis = new JLabel("Arbeitsverzeichnis:"); - GridBagConstraints gbc_lblArbeitsverzeichnis = new GridBagConstraints(); - gbc_lblArbeitsverzeichnis.anchor = GridBagConstraints.EAST; - gbc_lblArbeitsverzeichnis.insets = new Insets(0, 0, 0, 5); - gbc_lblArbeitsverzeichnis.gridx = 0; - gbc_lblArbeitsverzeichnis.gridy = 1; - panel_2.add(lblArbeitsverzeichnis, gbc_lblArbeitsverzeichnis); - - tfWorkDir = new JTextField(); - tfWorkDir.setEditable(false); - GridBagConstraints gbc_tfWorkDir = new GridBagConstraints(); - gbc_tfWorkDir.insets = new Insets(0, 0, 0, 5); - gbc_tfWorkDir.anchor = GridBagConstraints.NORTH; - gbc_tfWorkDir.fill = GridBagConstraints.HORIZONTAL; - gbc_tfWorkDir.gridx = 1; - gbc_tfWorkDir.gridy = 1; - panel_2.add(tfWorkDir, gbc_tfWorkDir); - tfWorkDir.setColumns(10); - - JButton btnDurchsuchen = new JButton("durchsuchen..."); - btnDurchsuchen.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent arg0) { - - JFileChooser jfc = new JFileChooser(); - jfc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); - - if (jfc.showOpenDialog(PulsCounterWindow.this)==JFileChooser.APPROVE_OPTION) - { - workingDirectory = jfc.getSelectedFile().getAbsolutePath(); - tfWorkDir.setText(workingDirectory); - prefs.put("file.directory",workingDirectory); - try { - prefs.flush(); - } catch (BackingStoreException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - } - }); - GridBagConstraints gbc_btnDurchsuchen = new GridBagConstraints(); - gbc_btnDurchsuchen.gridx = 2; - gbc_btnDurchsuchen.gridy = 1; - panel_2.add(btnDurchsuchen, gbc_btnDurchsuchen); - - JPanel panel_3 = new JPanel(); - panel_3.setBorder(new TitledBorder(null, "Aktionen", TitledBorder.LEADING, TitledBorder.TOP, null, null)); - GridBagConstraints gbc_panel_3 = new GridBagConstraints(); - gbc_panel_3.gridwidth = 5; - gbc_panel_3.insets = new Insets(0, 0, 5, 5); - gbc_panel_3.fill = GridBagConstraints.BOTH; - gbc_panel_3.gridx = 0; - gbc_panel_3.gridy = 3; - panel.add(panel_3, gbc_panel_3); - GridBagLayout gbl_panel_3 = new GridBagLayout(); - gbl_panel_3.columnWidths = new int[]{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; - gbl_panel_3.rowHeights = new int[]{0, 0}; - gbl_panel_3.columnWeights = new double[]{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, Double.MIN_VALUE}; - gbl_panel_3.rowWeights = new double[]{0.0, Double.MIN_VALUE}; - panel_3.setLayout(gbl_panel_3); - - JButton btnNewButton = new JButton("Jetzt aktualisieren..."); - GridBagConstraints gbc_btnNewButton = new GridBagConstraints(); - gbc_btnNewButton.insets = new Insets(0, 0, 0, 5); - gbc_btnNewButton.gridx = 1; - gbc_btnNewButton.gridy = 0; - panel_3.add(btnNewButton, gbc_btnNewButton); - - JButton btnAlle = new JButton("Alle 0"); - btnAlle.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent arg0) { - - resetAllChannels(); - - synchronized (threadUpdater) { - threadUpdater.notifyAll(); - } - } - }); - GridBagConstraints gbc_btnAlle = new GridBagConstraints(); - gbc_btnAlle.insets = new Insets(0, 0, 0, 5); - gbc_btnAlle.gridx = 3; - gbc_btnAlle.gridy = 0; - panel_3.add(btnAlle, gbc_btnAlle); - - JButton btnInspektor = new JButton("Inspektor"); - btnInspektor.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - InspectionMainFrame f = new InspectionMainFrame(); - f.setVisible(true); - } - }); - GridBagConstraints gbc_btnInspektor = new GridBagConstraints(); - gbc_btnInspektor.insets = new Insets(0, 0, 0, 5); - gbc_btnInspektor.gridx = 17; - gbc_btnInspektor.gridy = 0; - panel_3.add(btnInspektor, gbc_btnInspektor); - btnNewButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent arg0) { - synchronized (threadUpdater) { - threadUpdater.notifyAll(); - } - } - }); - - JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.TOP); - GridBagConstraints gbc_tabbedPane = new GridBagConstraints(); - gbc_tabbedPane.insets = new Insets(0, 0, 5, 0); - gbc_tabbedPane.fill = GridBagConstraints.BOTH; - gbc_tabbedPane.gridx = 0; - gbc_tabbedPane.gridy = 1; - getContentPane().add(tabbedPane, gbc_tabbedPane); - - JPanel panel_8 = new JPanel(); - tabbedPane.addTab("Aktuelle Werte", null, panel_8, null); - panel_8.setLayout(new BoxLayout(panel_8, BoxLayout.X_AXIS)); - - JScrollPane scrollPane = new JScrollPane(); - panel_8.add(scrollPane); - - tCounter = new JTable(); - scrollPane.setViewportView(tCounter); - - JPanel panel_9 = new JPanel(); - tabbedPane.addTab("Tageszeiterfassung", null, panel_9, null); - GridBagLayout gbl_panel_9 = new GridBagLayout(); - gbl_panel_9.columnWidths = new int[]{0, 0, 0}; - gbl_panel_9.rowHeights = new int[]{0, 0, 0, 0}; - gbl_panel_9.columnWeights = new double[]{0.0, 1.0, Double.MIN_VALUE}; - gbl_panel_9.rowWeights = new double[]{0.0, 0.0, 1.0, Double.MIN_VALUE}; - panel_9.setLayout(gbl_panel_9); - - JLabel lblNewLabel_1 = new JLabel("Speicher:"); - GridBagConstraints gbc_lblNewLabel_1 = new GridBagConstraints(); - gbc_lblNewLabel_1.anchor = GridBagConstraints.WEST; - gbc_lblNewLabel_1.insets = new Insets(0, 0, 5, 5); - gbc_lblNewLabel_1.gridx = 0; - gbc_lblNewLabel_1.gridy = 0; - panel_9.add(lblNewLabel_1, gbc_lblNewLabel_1); - - cbTimeBarriers = new JComboBox(); - cbTimeBarriers.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent arg0) { - updateTimeBarrierView(); - } - }); - GridBagConstraints gbc_cbTimeBarriers = new GridBagConstraints(); - gbc_cbTimeBarriers.insets = new Insets(0, 0, 5, 0); - gbc_cbTimeBarriers.fill = GridBagConstraints.HORIZONTAL; - gbc_cbTimeBarriers.gridx = 1; - gbc_cbTimeBarriers.gridy = 0; - panel_9.add(cbTimeBarriers, gbc_cbTimeBarriers); - - JPanel panel_10 = new JPanel(); - panel_10.setBorder(new TitledBorder(null, "Einstellungen", TitledBorder.LEADING, TitledBorder.TOP, null, null)); - GridBagConstraints gbc_panel_10 = new GridBagConstraints(); - gbc_panel_10.insets = new Insets(0, 0, 5, 0); - gbc_panel_10.gridwidth = 2; - gbc_panel_10.fill = GridBagConstraints.BOTH; - gbc_panel_10.gridx = 0; - gbc_panel_10.gridy = 1; - panel_9.add(panel_10, gbc_panel_10); - GridBagLayout gbl_panel_10 = new GridBagLayout(); - gbl_panel_10.columnWidths = new int[]{0, 0, 0}; - gbl_panel_10.rowHeights = new int[]{0, 0}; - gbl_panel_10.columnWeights = new double[]{0.0, 1.0, Double.MIN_VALUE}; - gbl_panel_10.rowWeights = new double[]{1.0, Double.MIN_VALUE}; - panel_10.setLayout(gbl_panel_10); - - JLabel lblDdd = new JLabel("Werte erfassen bis:"); - GridBagConstraints gbc_lblDdd = new GridBagConstraints(); - gbc_lblDdd.anchor = GridBagConstraints.WEST; - gbc_lblDdd.insets = new Insets(0, 0, 0, 5); - gbc_lblDdd.fill = GridBagConstraints.VERTICAL; - gbc_lblDdd.gridx = 0; - gbc_lblDdd.gridy = 0; - panel_10.add(lblDdd, gbc_lblDdd); - - todTimebarrier = new JTimeOfDay(); - todTimebarrier.setSecondsHidden(true); - todTimebarrier.addChangeListener(new ChangeListener() { - public void stateChanged(ChangeEvent e) { - repaint(); - } - }); - GridBagConstraints gbc_todTimebarrier = new GridBagConstraints(); - gbc_todTimebarrier.anchor = GridBagConstraints.WEST; - gbc_todTimebarrier.fill = GridBagConstraints.VERTICAL; - gbc_todTimebarrier.gridx = 1; - gbc_todTimebarrier.gridy = 0; - panel_10.add(todTimebarrier, gbc_todTimebarrier); - - JPanel panel_11 = new JPanel(); - panel_11.setBorder(new TitledBorder(null, "Aktuelle Werte", TitledBorder.LEADING, TitledBorder.TOP, null, null)); - GridBagConstraints gbc_panel_11 = new GridBagConstraints(); - gbc_panel_11.gridwidth = 2; - gbc_panel_11.fill = GridBagConstraints.BOTH; - gbc_panel_11.gridx = 0; - gbc_panel_11.gridy = 2; - panel_9.add(panel_11, gbc_panel_11); - GridBagLayout gbl_panel_11 = new GridBagLayout(); - gbl_panel_11.columnWidths = new int[]{0, 0}; - gbl_panel_11.rowHeights = new int[]{0, 0}; - gbl_panel_11.columnWeights = new double[]{1.0, Double.MIN_VALUE}; - gbl_panel_11.rowWeights = new double[]{1.0, Double.MIN_VALUE}; - panel_11.setLayout(gbl_panel_11); - - JScrollPane scrollPane_1 = new JScrollPane(); - GridBagConstraints gbc_scrollPane_1 = new GridBagConstraints(); - gbc_scrollPane_1.fill = GridBagConstraints.BOTH; - gbc_scrollPane_1.gridx = 0; - gbc_scrollPane_1.gridy = 0; - panel_11.add(scrollPane_1, gbc_scrollPane_1); - - tTBChannels = new JTable(); - scrollPane_1.setViewportView(tTBChannels); - - JPanel panel_4 = new JPanel(); - GridBagConstraints gbc_panel_4 = new GridBagConstraints(); - gbc_panel_4.fill = GridBagConstraints.BOTH; - gbc_panel_4.gridx = 0; - gbc_panel_4.gridy = 2; - getContentPane().add(panel_4, gbc_panel_4); - GridBagLayout gbl_panel_4 = new GridBagLayout(); - gbl_panel_4.columnWidths = new int[]{0, 0, 0, 0, 0}; - gbl_panel_4.rowHeights = new int[]{0, 0}; - gbl_panel_4.columnWeights = new double[]{1.0, 0.0, 0.0, 0.0, Double.MIN_VALUE}; - gbl_panel_4.rowWeights = new double[]{0.0, Double.MIN_VALUE}; - panel_4.setLayout(gbl_panel_4); - - JPanel panel_6 = new JPanel(); - panel_6.setBorder(new BevelBorder(BevelBorder.LOWERED, null, null, null, null)); - GridBagConstraints gbc_panel_6 = new GridBagConstraints(); - gbc_panel_6.insets = new Insets(0, 0, 0, 5); - gbc_panel_6.fill = GridBagConstraints.BOTH; - gbc_panel_6.gridx = 0; - gbc_panel_6.gridy = 0; - panel_4.add(panel_6, gbc_panel_6); - GridBagLayout gbl_panel_6 = new GridBagLayout(); - gbl_panel_6.columnWidths = new int[]{348, 0}; - gbl_panel_6.rowHeights = new int[]{16, 0}; - gbl_panel_6.columnWeights = new double[]{1.0, Double.MIN_VALUE}; - gbl_panel_6.rowWeights = new double[]{1.0, Double.MIN_VALUE}; - panel_6.setLayout(gbl_panel_6); - - lActivity = new JLabel("Verbindungsaktivit\u00E4t"); - lActivity.setToolTipText("Aktuelle Aufgabe"); - lActivity.setHorizontalAlignment(SwingConstants.LEFT); - GridBagConstraints gbc_lActivity = new GridBagConstraints(); - gbc_lActivity.insets = new Insets(0, 5, 0, 0); - gbc_lActivity.anchor = GridBagConstraints.WEST; - gbc_lActivity.gridx = 0; - gbc_lActivity.gridy = 0; - panel_6.add(lActivity, gbc_lActivity); - - lInputs = new JLabel("Input State"); - GridBagConstraints gbc_lInputs = new GridBagConstraints(); - gbc_lInputs.insets = new Insets(0, 0, 0, 5); - gbc_lInputs.gridx = 1; - gbc_lInputs.gridy = 0; - panel_4.add(lInputs, gbc_lInputs); - - JPanel panel_5 = new JPanel(); - panel_5.setToolTipText("Angeschlossener Ger\u00E4tetyp"); - panel_5.setBorder(new BevelBorder(BevelBorder.LOWERED, null, null, null, null)); - GridBagConstraints gbc_panel_5 = new GridBagConstraints(); - gbc_panel_5.insets = new Insets(0, 0, 0, 5); - gbc_panel_5.fill = GridBagConstraints.VERTICAL; - gbc_panel_5.gridx = 2; - gbc_panel_5.gridy = 0; - panel_4.add(panel_5, gbc_panel_5); - - lDeviceType = new JLabel("----"); - panel_5.add(lDeviceType); - GridBagConstraints gbc_panel_7 = new GridBagConstraints(); - gbc_panel_7.gridx = 3; - gbc_panel_7.gridy = 0; - panel_7.setToolTipText("Ger\u00E4tezeit bei letztem Kontakt"); - panel_4.add(panel_7, gbc_panel_7); - panel_7.setBorder(new BevelBorder(BevelBorder.LOWERED, null, null, null, null)); - - lDeviceTime = new JLabel("----"); - panel_7.add(lDeviceTime); - - - initialize(); - } - - private void initialize() { - - clientBeacon = new Beacon(44556); - clientBeacon.setClientOnly(true); - clientBeacon.start(); - - applicationExiting = false; - - prefs = Preferences.userRoot(); - - workingDirectory = prefs.get("file.directory", (new File(".")).getAbsolutePath()); - tfWorkDir.setText(workingDirectory); - - counterChannels = new ArrayList(); - - tmCounter = new TableMapper(CounterChannel.class, tCounter); - tmCounter.getColumnInfo().get(0).setReadOnly(true); - tmCounter.getColumnInfo().get(2).setReadOnly(true); - tmCounter.getColumnInfo().get(4).setReadOnly(true); - - tmCounter.addTableMapperListener(new AbstractTableMapperListener() { - @Override - public void ValueChanged(int row, int column) { - switch (column) - { - case 1: - saveChannelName(row); - break; - case 3: - saveCorrection(row); - break; - } - } - - }); - - tCounter.addMouseListener(new MousePopupListener() { - - @Override - public void popupTriggered(int x, int y) { - JPopupMenu popup = new JPopupMenu(); - JMenuItem mi = new JMenuItem(); - mi.setText("RESET"); - mi.addActionListener(new ActionListener() { - - @Override - public void actionPerformed(ActionEvent arg0) { - CounterChannel cc = (CounterChannel)tmCounter.getSelectedRow(); - if (cc != null) - { - try { - connectedPulsCounter.setChannelCounter(cc.getChannel(), 0); - } catch (SerialPortExeption sex){ - System.err.println(sex); - sex.printStackTrace(); - } - - synchronized (threadUpdater) { - threadUpdater.notifyAll(); - } - } - - } - }); - popup.add(mi); - - popup.show(tCounter, x, y); - - } - }); - - tmTBChannels = new TableMapper(CounterChannel.class, tTBChannels); - tmTBChannels.getColumnInfo().get(0).setReadOnly(true); - tmTBChannels.getColumnInfo().get(1).setReadOnly(true); - tmTBChannels.getColumnInfo().get(3).setReadOnly(true); - - threadUpdater = new Thread(new Runnable() { - @Override - public void run() { - while (true) - { - if (applicationExiting) - return; - - try { - synchronized (threadUpdater) { - threadUpdater.wait(); - } - updateCounter(); -// updateLiveFile(); - } catch (InterruptedException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - } - }); - threadUpdater.start(); - - spUpdateIntervall.setValue(prefs.getInt("update.intervall", 15)); - updateTimer = new Timer(prefs.getInt("update.intervall", 15)*1000, new ActionListener() { - - @Override - public void actionPerformed(ActionEvent arg0) { - synchronized (threadUpdater) { - threadUpdater.notifyAll(); - } - - } - }); - updateTimer.setRepeats(true); - updateTimer.start(); - - - useUSB = prefs.getBoolean("pulscounter.ui.useUSB", false); - useNetwork = prefs.getBoolean("pulscounter.ui.useNetwork", false); - - - - updateUI(); - setupDeviceConnection(); - } - - private void updateCounter() - { - lActivity.setText("Werte aktualisieren..."); - System.err.println("Werte aktualisieren..."); - - if (counterChannels == null) - { - tmCounter.setRows(counterChannels); - } - - IPulsCounter ipc = connectedPulsCounter; - - if (ipc == null) - return; - - int nch = 0; - int[] counters = null; - Integer inputs = -1; - - try { - nch = ipc.getChannels(); - counters = ipc.getChannelCounters(); - inputs = ipc.getPhysicalInputs(); - } catch (SerialPortExeption sex){ - System.err.println("GUI: updateCounter(): SerialPortException: " + sex.toString()); - sex.printStackTrace(); - } - - System.err.println(String.format("GUI: updateCounter(): Channel Array Size: %d / %d",nch,counterChannels.size())); - - lInputs.setText(new BitField().toText(inputs)); - - if (nch != counterChannels.size()){ - counterChannels.clear(); - - for (int i=0;ie zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00I6Zlx1Z(O6M}z|Z6J`s9|A|!{I9<^^R} zfopLyPODQi*(F1o2^>5;8hj;1iX0C6@<+G9CoA;)BeBE+V=~Gc-ttpg9EisYUNb6L zmRK;lYnf&|P)ztj02y>e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00H|+L_t(Y$Gw)lj@m#Jg+CiZ zLke&M#ek4OO147^+hqH#7V#2P`v!TDt@09xt+wF-NWVmYFt%F^MQ9jXq#1|-V>>I9 zQ(1F8=l;yxb4Mcqp6BI(d*BIp1n!jS9e4v?fw2%mUgOXbi2J|`+3*bfh;yXHkbee# z0-yLd{02Hgh+ok~{fzt@F!=yEYR^P*TxOsmpKu#|Ib@Yb8x4p{c$)@%d(DZ ztyYWuexIpKh7zu?amMv}jqm#aj7FnVjnOoG-)FsEQ!baU@xSXz6%(V+lHnD+8A@`$ zpIfAq*tQKox7(#yES}i6+bzT45ZktCx7+0N`8Wr!Ixvp2ESF2dFr-?oUXTM6i$yAx z3Sk%~9rjpP8vdN+aL>_fHZQt7IwOP-GPBryU^e^}JC#L;+o5xqZpS`Q`u%VN@`vbD t`@bVIl8G62@F_#zJSV^Us<`E|cdx@v7EBgaR837^2cdsTl0EHw=Tq8=H^K)}k^GX<;i&7IyQd1Pl zGfOfQ+&z5*!W;R-85kJ(JY5_^JdW?3W-Zj@AmDO8XXQjeIj6IR7w?=%7ARCu?oWIo zY9h}6(9KOKV}rA2q|O7e?Dm>j^W>JLx0>ylWVnH;?0{IrtGU_*OnnC=H!kgWis~>< z@V9?*VBt&WOAdDIdIzT5|G*G*-tnKbY=5 zyld^s-g+J#_uBb9IYw^H+G6Y6f(^y|+?375`u4KxZZH>KEIH3TV7~IUH$1x?YFg*6 zR+0^cdx@v7EBgaR837@7_D-{{Kq1Kz*N775{M_8syb=cIqSVBa)D(sC z%#sWRcTeAd@J2py1_nkkPZ!4!kK=o%=}tT3AkeaZ=J7>g3vcWHNHCK-%2?E}LWToK zF^GiU_{t*R>m=Cx@Jdm$szjJn^TNEtM>n#m!thbL-x>}SM_q-*{hvJxNpz& zd!bNsR&GOH^4yR8jaPHtOm6f&mQ`@{(8(;VV}~wgJvnwL@yi0%Z)tg^hr2mm0S#n3 ztS4|jae1hU@GAdXZ@)!Y%)0-Q<;lw3SO1l#T20ltms7KF-hB7DTFY#<-C=aSn9RGT T_3RU1Ffw?$`njxgN@xNA5P_{~ literal 0 HcmV?d00001 diff --git a/src/org/hwo/pulscounter/ui/sym_p2_aktiv.png b/src/org/hwo/pulscounter/ui/sym_p2_aktiv.png new file mode 100644 index 0000000000000000000000000000000000000000..62c12d22454aaeffc207879f63683b2b9fafb940 GIT binary patch literal 380 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjY)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYYs>cdx@v7EBgZ`Mt(-+6=#|>fkKict`Q~9`MJ5Nc_j?aMX8A;sVNHO znI#zt?w-B@;f;LaKt)eHT^vI^j_;jjE5zt1(7Jz~(*hS6r_PCQ7+tD)I&J5l5S2Ng z>G6lftYXqKmO8fE`wF&wJNtU>%ew464nfj0m{bjz-Tq}TuW3--V77Ud|AZ^kwglL5 zn@?7?o3iEl^Eaxz_dCUZ&3!cW^RgYGN#*T3nX60=GrpJ|IkzTpo^l?K0h^`tml)yV z@6YFKU-u|!cC@GZPuu>aS$jGcX-qE95HX%y!m{i9zVfo~_IA^Qm1a!iUsu?-SU>Ng z+Ru=lq^UJe+&1>)oA7sQ9jHxB`&!>NH{3Au!rv!}J#B2~;+2e*zUcni{*)=t`@a$E SepgU9GkCiCxvX*qr literal 0 HcmV?d00001 diff --git a/src/org/hwo/pulscounter/ui/sym_p2_passiv.png b/src/org/hwo/pulscounter/ui/sym_p2_passiv.png new file mode 100644 index 0000000000000000000000000000000000000000..96ec2844ffb5ec0eb76efcf23105b83cdf07eeee GIT binary patch literal 390 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjY)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYYs>cdx@v7EBgZ`Mt(-^W#U}YKq1Kz*N775{M_8syb=cIqSVBa)D(sC z%#sWRcTeAd@J2pyprUu4E{-7{$M;S%%wsYXaJ}EN#n)x3x56uj!;C8|+@vzT%j8*d ziiY1a&+o{Q*Zw+BIV~ z&)y|-U)^k-sr7N^lFi48rt={q9qaUVGe{w$adY{(-|68v7RJ-d^~ydvcFw72~`t zvHI|@-M1CvYDQ`X>scdx@v7EBgaR837^DF9z;^fkKict`Q~9`MJ5Nc_j?aMX8A;sVNHO znI#zt?w-B@;f;La3=E9Co-U3d9>@1iGc0O05OBSpHAzG={E0y4YX{+~a62|pcCV?) zJ05ZQ@!PSik`Z61&^oR0B!jYXM|{`C^#9Ypt#7g1a#48#gZl%9H($LuMGkOUC~up& zXoBP;o*zf}EkBrkQOD!adrG}h z9_);b_&Ft3FlqL=MQ7UgEM2zr+g9yju9&a;?RHxgJvcdx@v7EBgaR837^5zir&tfI^Zbt`Q~9`MJ5Nc_j?aMX8A;sVNHO znI#zt?w-B@;f;La3=E9oo-U3d9>@1iQ!F}cAmBRRMEH^>SKK|Z>x#Vmrx5m1#4ktg)UKcJ73vHvg$_*Z)l|5AWk%@rvsPLv;eX&CSK-4>)8R z!d!l7@|HX9V3NADqVf6-H$A0)409T)pMB&MQ7V$t|7HJ3-=VzK;+t=})PLECC$gtM zSXdM;o>Lzq`7>nKHKj}ZnyZ42ICHcJ1YHhgtmxjCSSb}6TlxEZ@y3r~E<0~juf7oT zX3nZQ#`2BKbDblnZG4*VpEhUJyoTpfrn83&Up!Xv`I=~P;g@Sg#f2XnW*0VJi{@W% z+;Ls$(*0#OXLctYe9@h_>+iM3ukYV7J-YodWcS+>GM16&ZGPM;s`J|ws#BT!lhNyJ W`k72A(M(`CGI+ZBxvX literal 0 HcmV?d00001