From a3e32ad3e56b8fdb643573f9cdb58073cd7c04b9 Mon Sep 17 00:00:00 2001 From: Harald Christian Joachim Wolff Date: Thu, 27 Jul 2017 19:49:33 +0200 Subject: [PATCH] +SimpleLinkDeviceConnector --- missing-translation.txt | 18 +- .../pulscounter/PulsCounterApplication.java | 4 +- .../pulscounter/device/IDeviceConnector.java | 2 +- .../device/ServiceLinkDeviceConnector.java | 4 +- .../device/SimpleLinkDeviceConnector.java | 848 ++++++++++++++++++ .../pulscounter/device/SimulatedCounter.java | 2 +- 6 files changed, 865 insertions(+), 13 deletions(-) create mode 100644 src/org/hwo/pulscounter/device/SimpleLinkDeviceConnector.java diff --git a/missing-translation.txt b/missing-translation.txt index 3fc4d6c..853eaa0 100644 --- a/missing-translation.txt +++ b/missing-translation.txt @@ -36,11 +36,13 @@ warning.title.selftest ARITHEMTIK = B ARITHEMTIK = A -OK Alle Zähler zurücksetzen +OK Skripte Wählen Sie die Schnittstelle über die das Skript übertragen werden soll. tooltip.intervall +Snapshot Index zurücksetzen +<html>Diese Funktion sollte nur auf Aufforderung durch den Support ausgeführt werden.<br/>Soll der Snapshot Index auf dem Gerät wirklich zurückgesetzt werden?</html> Wollen Sie wirklich alle Zählerstände auf 0 zurücksetzen? Tageszeitabhängigkeit: Synololog einstellen @@ -48,25 +50,25 @@ Invertiert Intervall 3: ARITHEMTIK = 0 -Löst Snapshot aus bearbeiten... +Löst Snapshot aus auf Zähler übertragen.... Nur nach Rücksprache mit Support: Verbindung -Passiver Schalter Meldungen +Passiver Schalter tooltip.tagesbasierte.intervalle Kanal -warning.selftest -Daten exportieren Der Selbsttest für Zähler #%d ist fehlgeschlagen. +Daten exportieren +warning.selftest A == 0 SnapShot Speicher auf letzten bekannten SnapShot setzen entfernen -Intervall 2: -Formeln Schnittstelle wählen... -Alle Zählerstände zurücksetzen +Formeln +Intervall 2: Aufzeichnungen verwalten +Alle Zählerstände zurücksetzen Immer diff --git a/src/org/hwo/pulscounter/PulsCounterApplication.java b/src/org/hwo/pulscounter/PulsCounterApplication.java index 2e5dc14..dd4e8a6 100644 --- a/src/org/hwo/pulscounter/PulsCounterApplication.java +++ b/src/org/hwo/pulscounter/PulsCounterApplication.java @@ -37,6 +37,7 @@ import org.hwo.servicelink.ServiceLinkListener; import org.hwo.pulscounter.db.PulsCounterDatabase; import org.hwo.pulscounter.device.IDeviceConnector; import org.hwo.pulscounter.device.ServiceLinkDeviceConnector; +import org.hwo.pulscounter.device.SimpleLinkDeviceConnector; import org.hwo.pulscounter.device.SimulatedCounter; import org.hwo.pulscounter.ui.AppSettingsListener; import org.hwo.pulscounter.ui.BatchRunner; @@ -174,7 +175,8 @@ public class PulsCounterApplication implements ServiceLinkListener{ defaultConfiguration.setProperty("ui.class", NewMainWindow.class.getCanonicalName()); defaultConfiguration.setProperty("interface.classes", StringHelper.join(new String[]{ ServiceLinkDeviceConnector.class.getCanonicalName(), - SimulatedCounter.class.getCanonicalName() + SimulatedCounter.class.getCanonicalName(), + SimpleLinkDeviceConnector.class.getCanonicalName() }, ",")); return defaultConfiguration; diff --git a/src/org/hwo/pulscounter/device/IDeviceConnector.java b/src/org/hwo/pulscounter/device/IDeviceConnector.java index 2bf5eec..1483c53 100644 --- a/src/org/hwo/pulscounter/device/IDeviceConnector.java +++ b/src/org/hwo/pulscounter/device/IDeviceConnector.java @@ -62,7 +62,7 @@ public interface IDeviceConnector { public int getInterval(int iNo); public boolean isIntervalDailyBased(int iNo); - public void setInterval(int iNo,int intervall,boolean dailyBase); + public void setInterval(int iNo,Integer intervall,boolean dailyBase); public int getDailyBaseMask(); diff --git a/src/org/hwo/pulscounter/device/ServiceLinkDeviceConnector.java b/src/org/hwo/pulscounter/device/ServiceLinkDeviceConnector.java index 324daa5..c9b80e9 100644 --- a/src/org/hwo/pulscounter/device/ServiceLinkDeviceConnector.java +++ b/src/org/hwo/pulscounter/device/ServiceLinkDeviceConnector.java @@ -485,7 +485,7 @@ public class ServiceLinkDeviceConnector implements IDeviceConnector { } @Override - public void setInterval(int iNo, int intervall, boolean dailyBase) { + public void setInterval(int iNo, Integer intervall, boolean dailyBase) { checkOpen(); iNo %= 4; @@ -500,7 +500,7 @@ public class ServiceLinkDeviceConnector implements IDeviceConnector { } serviceLink.writeInt(13, 0, 0x1003, v); - serviceLink.writeInt(13, 0, 0x1010 + iNo , intervall); + serviceLink.writeInt(13, 0, 0x1010 + iNo , intervall == null ? 0 : intervall); } catch (IOException | ServiceLinkException e) { diff --git a/src/org/hwo/pulscounter/device/SimpleLinkDeviceConnector.java b/src/org/hwo/pulscounter/device/SimpleLinkDeviceConnector.java new file mode 100644 index 0000000..2f9c9d1 --- /dev/null +++ b/src/org/hwo/pulscounter/device/SimpleLinkDeviceConnector.java @@ -0,0 +1,848 @@ +package org.hwo.pulscounter.device; + +import java.awt.Component; +import java.io.IOException; +import java.text.DateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.LinkedList; +import java.util.List; + +import org.hwo.io.NewSerialPort.NewSerialPort; +import org.hwo.pulscounter.SnapShot; +import org.hwo.pulscounter.simplescript.SimpleScript.SimpleScriptElement; +import org.hwo.pulscounter.ui.DeviceConfiguration; +import org.hwo.servicelink.SimpleLink; +import org.hwo.servicelink.exceptions.*; +import org.hwo.ui.dialog.SerialPortChooser; +import static org.hwo.logging.Logging.*; +import static org.hwo.logging.LogLevel.*; + + +public class SimpleLinkDeviceConnector implements IDeviceConnector { + + private SimpleLink simpleLink; + private Integer deviceSerial; + + private int debugMode; + + public SimpleLinkDeviceConnector() { + simpleLink = new SimpleLink(new NewSerialPort("COM1:")); + + } + + private void checkOpen(){ + if (!simpleLink.isOpen()){ + try { + simpleLink.open(); + simpleLink.setTimeOut(1000); + } catch (IOException | ServiceLinkException e) { + throw new NoDeviceConnectionException(); + } + } + } + + + @Override + public String toString() { + return String.format("Serial [%s]", this.simpleLink.getSerialPort().getPortName()); + } + + public SimpleLink getSimpleLink() { + return simpleLink; + } + + private Integer readDeviceSerial(){ + checkOpen(); + + try { + Integer v = simpleLink.readInt(0x0001); + return v; + } catch (IOException | ServiceLinkException e) { + log(e); + throw new NoDeviceConnectionException(); + } + + } + + @Override + public Integer getDeviceSerial() { + Integer serial = readDeviceSerial(); + deviceSerial = serial; + return serial; + } + + public void setDeviceSerial(int serial) { + checkOpen(); + + try { + simpleLink.writeInt(0x0004, -1895890944); + simpleLink.writeInt(0x0001, serial ); + simpleLink.writeInt(0x0004, 0x0); + } catch (IOException | ServiceLinkException e) { + throw new NoDeviceConnectionException(); + } + } + + @Override + public boolean showConnctionSetup(Component parent) { + NewSerialPort newSerialPort = SerialPortChooser.execute(parent,simpleLink.getSerialPort().getPortName()); + if (newSerialPort != null){ + simpleLink.close(); + simpleLink.getSerialPort().setPortName(newSerialPort.getPortName()); + return true; + } + return false; + } + + @Override + public String getConnectionSettings() { + return simpleLink.getSerialPort().getPortName(); + } + + @Override + public void setConnectionSettings(String connectionSettings) { + simpleLink.close(); + simpleLink.getSerialPort().setPortName(connectionSettings); + } + + @Override + public String getConnectionSettingsText() { + return String.format("Port: %s",getConnectionSettings()); + } + + + @Override + public int[] getCounters() { + int[] values = new int[32]; + + for (int n=0;n<32;n++){ + values[n] = getCounter(n); + } + + checkRealTimeClock(); + + return values; + } + + @Override + public void setCounters(int[] values) { + for (int n=0;n<32;n++){ + setCounter(n, values[n]); + } + } + + @Override + public int getCounter(int channel) { + Integer v = null; + + checkOpen(); + + try { + v = simpleLink.readInt( 0x600 + channel ); + } catch (Exception e) { + throw new NoDeviceConnectionException(); + } + if (v != null){ + return v; + } else { + return 0; + } + } + + @Override + public void setCounter(int channel, int counter) { + checkOpen(); + try { + simpleLink.writeInt(0x0600 + channel, counter); + } catch (IOException | ServiceLinkException e) { + e.printStackTrace(); + } + } + + @Override + public int[] getSimpleScript() { + try { + Integer l = simpleLink.readInt(0x0700); + + log(DEBUG,"%d ScriptElements on Device.",l); + + if (l<=0) + return new int[0]; + + int[] script = new int[l]; + int p; + + simpleLink.writeInt(0x0701, 0); + for (p=0;p snapshots = new LinkedList<>(); + + if (s != null){ + Integer newest,sssize; + int ind; + Integer id; + + try { + Integer sbrk,stacklimit,cycletime,enginestate; + + sbrk = simpleLink.readInt(0x0020); + stacklimit = simpleLink.readInt(0x0021); + cycletime = simpleLink.readInt(0x1310); + enginestate = simpleLink.readInt(0x0703); + + log(INFO,"HEAP END: 0x%04x SYS-STACK: 0x%04x",sbrk,stacklimit); + log(INFO,"I/O cycle time: %dus",cycletime); + log(INFO,"Engine-State: 0x%08x",enginestate); + + newest = simpleLink.readInt(0x0581); + sssize = simpleLink.readInt(0x0582); + + if ((newest == null) || (sssize == null)){ + return null; + } + + + if (startIndex < (newest - sssize)){ + startIndex = newest - sssize; + } + if (startIndex < 0){ + startIndex = 0; + } + + log(INFO,"ServiceLinkDeviceConnector: reading snapshots [%d ... %d]",startIndex,newest); + + for (ind = startIndex; ind <= newest; ind++){ + try { + simpleLink.writeInt(0x0500, ind); + id = simpleLink.readInt(0x0500); + if (!id.equals(ind)){ + log(WARN,"Snapshot could not be selected [%d != %d]",ind,id); + } else { + Integer timestamp, + flags, + in, + out, + pu, + inv, + trigger; + + Integer[] counters, + analogs; + + timestamp = simpleLink.readInt(0x0501); + flags = simpleLink.readInt(0x0502); + in = simpleLink.readInt(0x0503); + out = simpleLink.readInt(0x0504); + pu = simpleLink.readInt(0x0505); + inv = simpleLink.readInt(0x0506); + trigger = simpleLink.readInt(0x0507); + id = simpleLink.readInt(0x0530); + + counters = new Integer[32]; + analogs = new Integer[8]; + + for (int n=0;n<32;n++){ + counters[n] = simpleLink.readInt(0x0510 + n); + } + for (int n=0;n<8;n++){ + analogs[n] = simpleLink.readInt(0x0508 + n); + } + + + SnapShot ss = new SnapShot(s); + ss.setTimestamp(timestamp); + ss.setIndex(id); + ss.setField0(flags); + ss.setInputmask(in); + ss.setOutputmask(out); + ss.setInvertmask(inv); + ss.setTriggermask(trigger); + ss.setPullupmask(pu); + for (int i=0;i<32;i++){ + ss.setValue(i, counters[i]); + } + for (int i=0;i<8;i++){ + ss.setAnalog(i, analogs[i]); + } + + log(INFO,"Snapshot read: %s",id); + snapshots.add(ss); + + }; + } catch (ServiceLinkRequestFailedException e){ + log(e); + } + + } + } catch (IOException | ServiceLinkException e) { + log(e); + } + + checkForAssertions(); + + } + return snapshots.toArray(new SnapShot[0]); + } + + @Override + public int getInterval(int iNo) { + checkOpen(); + + iNo %= 4; + + try { + Integer v = simpleLink.readInt( 0x1010 + iNo ); + return v; + } catch (IOException | ServiceLinkException e) { + throw new NoDeviceConnectionException(); + } + } + + @Override + public boolean isIntervalDailyBased(int iNo) { + iNo %= 4; + return ((getDailyBaseMask() & (1< 1)){ + log(INFO,"realtime clock has a %d seconds shift",delta); + simpleLink.writeInt(0x001C, (int)(calendar.getTimeInMillis() / 1000L)); + log(INFO,"realtime clock has been corrected."); + } + } else { + log(DEBUG,"SCHEDULER_DEBUG: DeviceTime is %s",DateFormat.getInstance().format(new Date(((long)deviceTime)*1000))); + } + } catch (ServiceLinkRequestFailedException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } catch (ServiceLinkException e) { + e.printStackTrace(); + } + + } + + private void checkForAssertions(){ + Integer assert_error,assert_code; + + try + { + assert_error = -1; + for (int i=0;i<8;i++){ + assert_error = simpleLink.readInt(0x0026); + assert_code = simpleLink.readInt(0x0025); + + if (assert_error >= 0) + break; + + log(WARN,"Assertion: Error: 0x%08x (%d) Position: 0x%04x Mark: %d", assert_error,assert_error, assert_code & 0xffff, (assert_code >> 16) & 0xffff); + simpleLink.writeInt(0x0025, -1); + }; + } catch (Exception ex){ + System.err.println("Exception while checking for assertions..."); + ex.printStackTrace(); + } + } + + @Override + public int escape(int escape, int parm) { + if ((escape & ESC_DEBUG_MASK)!=0){ + debugMode = escape; + } + + switch (escape){ + case ESC_DEBUG_SCHEDULER_BUG: + try { + Long currentTime = (System.currentTimeMillis()/1000); + currentTime -= currentTime % 86400; + currentTime += -920; + log(DEBUG,"ESC_DEBUG_SCHEDULER_BUG"); + simpleLink.writeInt(0x001C, (currentTime.intValue())); + } catch (ServiceLinkRequestFailedException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } catch (ServiceLinkException e) { + e.printStackTrace(); + } + + return 0; + case ESC_PREPARE_DEVICETEST: + log(DEBUG,"Prepare Device for testing."); + return 0; + case ESC_UNPREPARE_DEVICETEST: + log(DEBUG,"Un-Prepare Device after testing."); + return 0; + + } + return 0; + } + + @Override + public int[] getIncrements() { + int[] values = new int[32]; + + for (int n=0;n<32;n++){ + values[n] = getIncrement(n); + } + + return values; + } + + @Override + public void setIncrements(int[] increments) { + for (int n=0;n<32;n++){ + setIncrement(n, increments[n]); + } + } + + public int getIncrement(int channel) { + Integer v = null; + + checkOpen(); + + try { + v = simpleLink.readInt( 0x12A0 + channel ); + } catch (Exception e) { + throw new NoDeviceConnectionException(); + } + if (v != null){ + return v; + } else { + return 0; + } + } + + public void setIncrement(int channel, int increment) { + checkOpen(); + try { + simpleLink.writeInt(0x12A0 + channel, increment); + } catch (IOException | ServiceLinkException e) { + e.printStackTrace(); + } + } + + @Override + public void shutdown() { + simpleLink.close(); + } +} diff --git a/src/org/hwo/pulscounter/device/SimulatedCounter.java b/src/org/hwo/pulscounter/device/SimulatedCounter.java index 0a94aed..ca788cf 100644 --- a/src/org/hwo/pulscounter/device/SimulatedCounter.java +++ b/src/org/hwo/pulscounter/device/SimulatedCounter.java @@ -238,7 +238,7 @@ public class SimulatedCounter implements IDeviceConnector { } @Override - public void setInterval(int iNo, int intervall, boolean dailyBase) { + public void setInterval(int iNo, Integer intervall, boolean dailyBase) { // TODO Auto-generated method stub }