Browse Source

ringbuffer working
vue update

Martin Kunz 5 years ago
parent
commit
442c529d82
29 changed files with 3540 additions and 2587 deletions
  1. 3 0
      .idea/misc.xml
  2. 2 4
      src/main/java/at/acdp/urweb/Main.java
  3. 4 1
      src/main/java/at/acdp/urweb/ScReadThread.java
  4. 0 37
      src/main/java/at/acdp/urweb/sclient/Log.java
  5. 30 0
      src/main/java/at/acdp/urweb/sclient/LogEntries.java
  6. 10 11
      src/main/java/at/acdp/urweb/sclient/SecondaryClient.java
  7. 35 0
      src/main/java/at/acdp/urweb/sclient/URLog.java
  8. 8 12
      src/main/java/at/acdp/urweb/sclient/data/AdditionalInfo.java
  9. 17 16
      src/main/java/at/acdp/urweb/sclient/data/CartesianInfo.java
  10. 25 23
      src/main/java/at/acdp/urweb/sclient/data/ConfigurationData.java
  11. 12 11
      src/main/java/at/acdp/urweb/sclient/data/ForceModeData.java
  12. 7 0
      src/main/java/at/acdp/urweb/sclient/data/IJsonObject.java
  13. 0 4
      src/main/java/at/acdp/urweb/sclient/data/ILogentry.java
  14. 13 12
      src/main/java/at/acdp/urweb/sclient/data/JointData.java
  15. 15 1
      src/main/java/at/acdp/urweb/sclient/data/JointDataList.java
  16. 6 5
      src/main/java/at/acdp/urweb/sclient/data/KinematicsInfo.java
  17. 21 0
      src/main/java/at/acdp/urweb/sclient/data/LogHolder.java
  18. 32 30
      src/main/java/at/acdp/urweb/sclient/data/MasterBoardData.java
  19. 22 0
      src/main/java/at/acdp/urweb/sclient/data/Message.java
  20. 4 1
      src/main/java/at/acdp/urweb/sclient/data/MessageType.java
  21. 17 17
      src/main/java/at/acdp/urweb/sclient/data/ModeData.java
  22. 12 10
      src/main/java/at/acdp/urweb/sclient/data/ToolCommInfo.java
  23. 13 13
      src/main/java/at/acdp/urweb/sclient/data/ToolData.java
  24. 16 17
      src/main/java/at/acdp/urweb/sclient/data/VersionMessage.java
  25. 7 5
      src/main/java/at/acdp/urweb/web/WebServer.java
  26. 0 9
      src/main/resources/webroot/index.html
  27. 19 6
      webroot/index.html
  28. 3187 2339
      webroot/js/vue.js
  29. 3 3
      webroot/js/vue.min.js

+ 3 - 0
.idea/misc.xml

@@ -3,6 +3,9 @@
   <component name="FrameworkDetectionExcludesConfiguration">
     <file type="Osmorc" url="file://$PROJECT_DIR$" />
   </component>
+  <component name="JavaScriptSettings">
+    <option name="languageLevel" value="ES6" />
+  </component>
   <component name="MavenProjectsManager">
     <option name="originalFiles">
       <list>

+ 2 - 4
src/main/java/at/acdp/urweb/Main.java

@@ -8,16 +8,14 @@ import java.io.IOException;
 public class Main {
 
     public static void main(String [ ] args) {
-        ScReadThread rt=new ScReadThread("192.168.20.156");
-        new WebServer(8080,true,rt).start();
+        ScReadThread rt=new ScReadThread("192.168.20.159");
+        new WebServer(8080,true, rt).start();
         Thread t=new Thread(rt);
         t.start();
 
         // rde.writeCmd("set_digital_out(2,True)\n");
         // rde.writeCmd("movej([-1.95,-1.58,-1.16,-1.15,-1.55,1.25], a=1.0, v=0.1)\n");
         //rde.writeCmd("freedrive_mode()\n");
-
-
     }
 
 }

+ 4 - 1
src/main/java/at/acdp/urweb/ScReadThread.java

@@ -1,6 +1,8 @@
 package at.acdp.urweb;
 
 import at.acdp.urweb.sclient.SecondaryClient;
+import at.acdp.urweb.sclient.URLog;
+import at.acdp.urweb.sclient.data.Message;
 import at.acdp.urweb.sclient.data.VersionMessage;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -25,7 +27,8 @@ public class ScReadThread implements Runnable {
             try {
                 read();
             } catch (IOException e) {
-                e.printStackTrace();
+                log.warn("read thread terminated", e);
+                URLog.add(new Message("read thread terminated", e ));
             }
         }
     }

+ 0 - 37
src/main/java/at/acdp/urweb/sclient/Log.java

@@ -1,37 +0,0 @@
-package at.acdp.urweb.sclient;
-
-import at.acdp.urweb.sclient.data.ILogentry;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-
-public class Log {
-    private final static int LENGTH=100;
-    private static ILogentry[] list=new ILogentry[LENGTH];
-    private static int pos=0;
-
-
-
-    public static void add(ILogentry le) {
-        synchronized (list) {
-            list[pos++%LENGTH]=le;
-        }
-    }
-
-    public static void get(int from) {
-        synchronized (list){
-            int length=LENGTH-from+pos;
-            ILogentry[] ret=new ILogentry[length];
-            int upperPos=from+length;
-            if(upperPos>LENGTH){
-                int lowerLength=upperPos-LENGTH;
-                upperPos=LENGTH;
-                System.arraycopy(list,0,ret,0,lowerLength);
-            }
-            System.arraycopy(list,from,ret,0,upperPos-from);
-        }
-
-    }
-
-
-}

+ 30 - 0
src/main/java/at/acdp/urweb/sclient/LogEntries.java

@@ -0,0 +1,30 @@
+package at.acdp.urweb.sclient;
+
+import at.acdp.urweb.sclient.data.IJsonObject;
+import at.acdp.urweb.sclient.data.LogHolder;
+import com.eclipsesource.json.JsonArray;
+import com.eclipsesource.json.JsonObject;
+import com.ibm.jvm.Log;
+
+import java.util.Arrays;
+
+public class LogEntries implements IJsonObject {
+    public LogHolder[] entries;
+    public int lastID;
+
+    LogEntries(LogHolder[] entries, int lastID) {
+        this.entries=entries;
+        this.lastID=lastID;
+    }
+
+    @Override
+    public JsonObject toJSON() {
+        JsonObject jo=new JsonObject();
+        jo.add("lastID", lastID);
+        JsonArray ja=new JsonArray();
+        for(LogHolder h:entries)
+            ja.add(h.toJSON());
+        jo.add("entries", ja);
+        return jo;
+    }
+}

+ 10 - 11
src/main/java/at/acdp/urweb/sclient/SecondaryClient.java

@@ -2,7 +2,6 @@ package at.acdp.urweb.sclient;
 
 import at.acdp.urweb.CountDataInputStream;
 import at.acdp.urweb.sclient.data.*;
-import io.undertow.util.FileUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -64,47 +63,47 @@ public class SecondaryClient {
         switch (pType) {
             case PackageType.ROBOT_MODE_DATA:
                 var md=readRobotModeData(di, size);
-                Log.add(md);
+                URLog.add(md);
                 log.info(md.toString());
                 break;
             case PackageType.JOINT_DATA:
                 var jd=readJointData(di, size);
-                Log.add(jd);
+                URLog.add(jd);
                 log.info(jd.toString());
                 break;
             case PackageType.TOOL_DATA:
                 var td=readToolData(di, size);
-                Log.add(td);
+                URLog.add(td);
                 log.info(td.toString());
                 break;
             case PackageType.MASTERBOARD_DATA:
                 var mb=readMasterBoardData(di, size);
-                Log.add(mb);
+                URLog.add(mb);
                 log.info(mb.toString());
                 break;
             case PackageType.CARTESIAN_INFO:
                 var c=readCartesianInfo(di, size);
-                Log.add(c);
+                URLog.add(c);
                 log.info(c.toString());
                 break;
             case PackageType.KINEMATICS_INFO:
                 var ki=readKinemsticsInfo(di, size);
-                Log.add(ki);
+                URLog.add(ki);
                 log.info(ki.toString());
                 break;
             case PackageType.CONFIGURATION_DATA:
                 var cd=readConfigurationData(di, size);
-                Log.add(cd);
+                URLog.add(cd);
                 log.info(cd.toString());
                 break;
             case PackageType.FORCE_MODE_DATA:
                 var fmd=readForceModeData(di, size);
-                Log.add(fmd);
+                URLog.add(fmd);
                 log.info(fmd.toString());
                 break;
             case PackageType.ADDITIONAL_INFO:
                 var ai=readAdditionalInfo(di, size);
-                Log.add(ai);
+                URLog.add(ai);
                 log.info(ai.toString());
                 break;
             case PackageType.NEEDED_FOR_CALIB_DATA:
@@ -115,7 +114,7 @@ public class SecondaryClient {
                 break;
             case PackageType.TOOL_COMM_INFO:
                 var tci=readToolCommInfo(di, size);
-                Log.add(tci);
+                URLog.add(tci);
                 log.info(tci.toString());
                 break;
             default:

+ 35 - 0
src/main/java/at/acdp/urweb/sclient/URLog.java

@@ -0,0 +1,35 @@
+package at.acdp.urweb.sclient;
+
+import at.acdp.urweb.sclient.data.IJsonObject;
+import at.acdp.urweb.sclient.data.LogHolder;
+
+public class URLog {
+    private final static int LENGTH=100;
+    private static LogHolder[] list=new LogHolder[LENGTH];
+    private static int pos=0;
+
+    public static void add(IJsonObject jo) {
+        synchronized (list) {
+            list[pos++%LENGTH]=new LogHolder(jo);;
+        }
+    }
+
+    public static LogEntries get(int from) {
+        from%=LENGTH;
+        int to=pos%LENGTH;
+        synchronized (list){
+            int length=to-from;
+            if(from > to) {
+                var ret=new LogHolder[LENGTH-from+to];
+                System.arraycopy(list, from, ret,0,LENGTH-from);
+                System.arraycopy(list, 0, ret,LENGTH-from,to);
+                return new LogEntries(ret, pos);
+            }
+            else {
+                var ret=new LogHolder[length];
+                System.arraycopy(list, from, ret,0,length);
+                return new LogEntries(ret, pos);
+            }
+        }
+    }
+}

+ 8 - 12
src/main/java/at/acdp/urweb/sclient/data/AdditionalInfo.java

@@ -1,30 +1,26 @@
 package at.acdp.urweb.sclient.data;
 
 import at.acdp.urweb.CountDataInputStream;
-
-import java.io.DataInputStream;
+import com.eclipsesource.json.JsonObject;
 import java.io.IOException;
 
-public class AdditionalInfo implements IRead, ILogentry{
+public class AdditionalInfo implements IRead, IJsonObject{
     public boolean freeDriveButtonPressed;
     public boolean freeDriveButtonEnabled;
     public boolean ioEnabledFreeDrive;
 
-
-
     public void read(CountDataInputStream di, int size) throws IOException {
         freeDriveButtonPressed = di.readBoolean();
         freeDriveButtonEnabled = di.readBoolean();
         ioEnabledFreeDrive = di.readBoolean();
-
     }
 
     @Override
-    public String toString() {
-        return "AdditionalInfo{" +
-                "freeDriveButtonPressed=" + freeDriveButtonPressed +
-                ", freeDriveButtonEnabled=" + freeDriveButtonEnabled +
-                ", ioEnabledFreeDrive=" + ioEnabledFreeDrive +
-                '}';
+    public JsonObject toJSON() {
+        return new JsonObject()
+                .add("freeDriveButtonPressed", freeDriveButtonPressed)
+                .add("freeDriveButtonEnabled", freeDriveButtonEnabled)
+                .add("ioEnabledFreeDrive", ioEnabledFreeDrive)
+                ;
     }
 }

+ 17 - 16
src/main/java/at/acdp/urweb/sclient/data/CartesianInfo.java

@@ -1,11 +1,12 @@
 package at.acdp.urweb.sclient.data;
 
 import at.acdp.urweb.CountDataInputStream;
+import com.eclipsesource.json.JsonObject;
 
 import java.io.DataInputStream;
 import java.io.IOException;
 
-public class CartesianInfo implements IRead, ILogentry {
+public class CartesianInfo implements IRead, IJsonObject {
     public double x,y,z;
     public double rx,ry,rz;
     public double tcpOffsetX,tcpOffsetY, tcpOffsetZ;
@@ -28,20 +29,20 @@ public class CartesianInfo implements IRead, ILogentry {
     }
 
     @Override
-    public String toString() {
-        return "CartesianInfo{" +
-                "x=" + x +
-                ", y=" + y +
-                ", z=" + z +
-                ", rx=" + rx +
-                ", ry=" + ry +
-                ", rz=" + rz +
-                ", tcpOffsetX=" + tcpOffsetX +
-                ", tcpOffsetY=" + tcpOffsetY +
-                ", tcpOffsetZ=" + tcpOffsetZ +
-                ", tcpOffsetRX=" + tcpOffsetRX +
-                ", tcpOffsetRY=" + tcpOffsetRY +
-                ", tcpOffsetRZ=" + tcpOffsetRZ +
-                '}';
+    public JsonObject toJSON() {
+        return new JsonObject()
+                .add("x", x)
+                .add("y", y)
+                .add("z", z)
+                .add("rx", rx)
+                .add("ry", ry)
+                .add("rz", rz)
+                .add("tcpOffsetX", tcpOffsetX)
+                .add("tcpOffsetY", tcpOffsetY)
+                .add("tcpOffsetZ", tcpOffsetZ)
+                .add("tcpOffsetRX", tcpOffsetRX)
+                .add("tcpOffsetRY", tcpOffsetRY)
+                .add("tcpOffsetRZ", tcpOffsetRZ)
+                ;
     }
 }

+ 25 - 23
src/main/java/at/acdp/urweb/sclient/data/ConfigurationData.java

@@ -1,12 +1,13 @@
 package at.acdp.urweb.sclient.data;
 
 import at.acdp.urweb.CountDataInputStream;
+import com.eclipsesource.json.JsonObject;
 
 import java.io.DataInputStream;
 import java.io.IOException;
 import java.util.Arrays;
 
-public class ConfigurationData implements IRead, ILogentry {
+public class ConfigurationData implements IRead, IJsonObject {
 
     double[] jointMinLimit=new double[6];
     double[] jointMaxLimit=new double[6];
@@ -26,6 +27,29 @@ public class ConfigurationData implements IRead, ILogentry {
     int robotType;
     int robotSubType;
 
+    @Override
+    public JsonObject toJSON() {
+        return new JsonObject()
+                .add("jointMinLimit", Arrays.toString(jointMinLimit))
+                .add("jointMaxLimit", Arrays.toString(jointMaxLimit))
+                .add("jointMaxSpeed", Arrays.toString(jointMaxSpeed))
+                .add("jointMaxAcceleration", Arrays.toString(jointMaxAcceleration))
+                .add("vJointDefault", vJointDefault)
+                .add("aJointDefault", aJointDefault)
+                .add("vToolDefault", vToolDefault)
+                .add("aToolDefault", aToolDefault)
+                .add("eqRadius", eqRadius)
+                .add("dha", Arrays.toString(dha))
+                .add("dhd", Arrays.toString(dhd))
+                .add("dhAlpha", Arrays.toString(dhAlpha))
+                .add("dhTheta", Arrays.toString(dhTheta))
+                .add("masterboardVersion", masterboardVersion)
+                .add("controllerBoxType", controllerBoxType)
+                .add("robotType", robotType)
+                .add("robotSubType", robotSubType)
+                ;
+    }
+
     public void read(CountDataInputStream di, int size) throws IOException {
         for(int i=0; i<jointMinLimit.length; i++)
             jointMinLimit[i] = di.readDouble();
@@ -54,26 +78,4 @@ public class ConfigurationData implements IRead, ILogentry {
         robotSubType = di.readInt();
     }
 
-    @Override
-    public String toString() {
-        return "ConfigurationData{" +
-                "jointMinLimit=" + Arrays.toString(jointMinLimit) +
-                ", jointMaxLimit=" + Arrays.toString(jointMaxLimit) +
-                ", jointMaxSpeed=" + Arrays.toString(jointMaxSpeed) +
-                ", jointMaxAcceleration=" + Arrays.toString(jointMaxAcceleration) +
-                ", vJointDefault=" + vJointDefault +
-                ", aJointDefault=" + aJointDefault +
-                ", vToolDefault=" + vToolDefault +
-                ", aToolDefault=" + aToolDefault +
-                ", eqRadius=" + eqRadius +
-                ", dha=" + Arrays.toString(dha) +
-                ", dhd=" + Arrays.toString(dhd) +
-                ", dhAlpha=" + Arrays.toString(dhAlpha) +
-                ", dhTheta=" + Arrays.toString(dhTheta) +
-                ", masterboardVersion=" + masterboardVersion +
-                ", controllerBoxType=" + controllerBoxType +
-                ", robotType=" + robotType +
-                ", robotSubType=" + robotSubType +
-                '}';
-    }
 }

+ 12 - 11
src/main/java/at/acdp/urweb/sclient/data/ForceModeData.java

@@ -1,11 +1,12 @@
 package at.acdp.urweb.sclient.data;
 
 import at.acdp.urweb.CountDataInputStream;
+import com.eclipsesource.json.JsonObject;
 
 import java.io.DataInputStream;
 import java.io.IOException;
 
-public class ForceModeData implements IRead, ILogentry {
+public class ForceModeData implements IRead, IJsonObject {
     public double x,y,z;
     public double rx, ry, rz;
     public double robotDexterity;
@@ -21,15 +22,15 @@ public class ForceModeData implements IRead, ILogentry {
     }
 
     @Override
-    public String toString() {
-        return "ForceModeData{" +
-                "x=" + x +
-                ", y=" + y +
-                ", z=" + z +
-                ", rx=" + rx +
-                ", ry=" + ry +
-                ", rz=" + rz +
-                ", robotDexterity=" + robotDexterity +
-                '}';
+    public JsonObject toJSON() {
+        return new JsonObject()
+                .add("x", x)
+                .add("y", y)
+                .add("z", z)
+                .add("rx", rx)
+                .add("ry", ry)
+                .add("rz", rz)
+                .add("robotDexterity", robotDexterity)
+                ;
     }
 }

+ 7 - 0
src/main/java/at/acdp/urweb/sclient/data/IJsonObject.java

@@ -0,0 +1,7 @@
+package at.acdp.urweb.sclient.data;
+
+import com.eclipsesource.json.JsonObject;
+
+public interface IJsonObject {
+    JsonObject toJSON();
+}

+ 0 - 4
src/main/java/at/acdp/urweb/sclient/data/ILogentry.java

@@ -1,4 +0,0 @@
-package at.acdp.urweb.sclient.data;
-
-public interface ILogentry {
-}

+ 13 - 12
src/main/java/at/acdp/urweb/sclient/data/JointData.java

@@ -1,12 +1,13 @@
 package at.acdp.urweb.sclient.data;
 
 import at.acdp.urweb.CountDataInputStream;
+import com.eclipsesource.json.JsonObject;
 
 import java.io.DataInputStream;
 import java.io.IOException;
 
 //49 byte
-public class JointData implements IRead, ILogentry{
+public class JointData implements IRead, IJsonObject{
     double qActual;
     double qTarget;
     double qdActual;
@@ -30,16 +31,16 @@ public class JointData implements IRead, ILogentry{
     }
 
     @Override
-    public String toString() {
-        return "JointData{" +
-                "qActual=" + qActual +
-                ", qTarget=" + qTarget +
-                ", qdActual=" + qdActual +
-                ", lActual=" + lActual +
-                ", vActual=" + vActual +
-                ", tMotor=" + tMotor +
-                ", tMicro=" + tMicro +
-                ", jointMode=" + jointMode +
-                '}';
+    public JsonObject toJSON() {
+        return new JsonObject()
+                .add("qActual", qActual)
+                .add("qTarget", qTarget)
+                .add("qdActual", qdActual)
+                .add("lActual", lActual)
+                .add("vActual", vActual)
+                .add("tMotor", tMotor)
+                .add("tMicro", tMicro)
+                .add("jointMode", jointMode);
+
     }
 }

+ 15 - 1
src/main/java/at/acdp/urweb/sclient/data/JointDataList.java

@@ -1,11 +1,13 @@
 package at.acdp.urweb.sclient.data;
 
 import at.acdp.urweb.CountDataInputStream;
+import com.eclipsesource.json.JsonObject;
 
 import java.io.IOException;
+import java.util.Arrays;
 
 //49 byte
-public class JointDataList implements IRead, ILogentry{
+public class JointDataList implements IRead, IJsonObject{
     JointData[] jds;
 
     //TODO: float/double propably wrong
@@ -20,4 +22,16 @@ public class JointDataList implements IRead, ILogentry{
         }
         this.jds=jds;
     }
+
+    @Override
+    public String toString() {
+        return "{\"JointDataList\":{"
+                + "                        \"jds\":" + Arrays.toString(jds)
+                + "}}";
+    }
+
+    @Override
+    public JsonObject toJSON() {
+        return new JsonObject().add("jds",Arrays.toString(jds));
+    }
 }

+ 6 - 5
src/main/java/at/acdp/urweb/sclient/data/KinematicsInfo.java

@@ -1,12 +1,13 @@
 package at.acdp.urweb.sclient.data;
 
 import at.acdp.urweb.CountDataInputStream;
+import com.eclipsesource.json.JsonObject;
 
 import java.io.DataInputStream;
 import java.io.IOException;
 import java.util.Arrays;
 
-public class KinematicsInfo implements IRead, ILogentry {
+public class KinematicsInfo implements IRead, IJsonObject {
 
     public byte[] internalData;
     public void read(CountDataInputStream di, int size) throws IOException {
@@ -15,9 +16,9 @@ public class KinematicsInfo implements IRead, ILogentry {
     }
 
     @Override
-    public String toString() {
-        return "KinematicsInfo{" +
-                "internalData=" + Arrays.toString(internalData) +
-                '}';
+    public JsonObject toJSON() {
+        return new JsonObject()
+                .add("internalData", Arrays.toString(internalData))
+                ;
     }
 }

+ 21 - 0
src/main/java/at/acdp/urweb/sclient/data/LogHolder.java

@@ -0,0 +1,21 @@
+package at.acdp.urweb.sclient.data;
+
+import com.eclipsesource.json.JsonObject;
+
+public class LogHolder implements IJsonObject{
+    public long timestamp;
+
+    public IJsonObject entry;
+
+    public LogHolder(IJsonObject entry) {
+        this.entry=entry;
+        this.timestamp=System.currentTimeMillis();
+    }
+
+    @Override
+    public JsonObject toJSON() {
+        return new JsonObject()
+                .add("ts",timestamp)
+                .add("entry",entry.toJSON());
+    }
+}

+ 32 - 30
src/main/java/at/acdp/urweb/sclient/data/MasterBoardData.java

@@ -1,10 +1,11 @@
 package at.acdp.urweb.sclient.data;
 
 import at.acdp.urweb.CountDataInputStream;
+import com.eclipsesource.json.JsonObject;
 
 import java.io.IOException;
 
-public class MasterBoardData implements IRead, ILogentry {
+public class MasterBoardData implements IRead, IJsonObject {
     int digitalInputBits;
     int digitalOutputBits;
     int analogInputRange0;
@@ -30,6 +31,36 @@ public class MasterBoardData implements IRead, ILogentry {
     int operationalModeSelectorInput;
     int threePositionEnablingDeviceInput;
 
+    @Override
+    public JsonObject toJSON() {
+        return new JsonObject()
+                .add("digitalInputBits", digitalInputBits)
+                .add("digitalOutputBits", digitalOutputBits)
+                .add("analogInputRange0", analogInputRange0)
+                .add("analogInputRange1", analogInputRange1)
+                .add("analogInput0", analogInput0)
+                .add("analogInput1", analogInput1)
+                .add("analogOutputDomain0", analogOutputDomain0)
+                .add("analogOutputDomain1", analogOutputDomain1)
+                .add("analogOutput0", analogOutput0)
+                .add("analogOutput1", analogOutput1)
+                .add("masterboardTemperature", masterboardTemperature)
+                .add("robotVoltage48V", robotVoltage48V)
+                .add("robotCurrent", robotCurrent)
+                .add("masterIOCurrent", masterIOCurrent)
+                .add("safetymode", safetymode)
+                .add("inReducedMode", inReducedMode)
+                .add("euromap67Installed", euromap67Installed)
+                .add("euromapInputBits", euromapInputBits)
+                .add("euromapOutputBits", euromapOutputBits)
+                .add("euromapVoltage", euromapVoltage)
+                .add("euromapCurrent", euromapCurrent)
+                .add("internal", internal)
+                .add("operationalModeSelectorInput", operationalModeSelectorInput)
+                .add("threePositionEnablingDeviceInput", threePositionEnablingDeviceInput)
+                ;
+    }
+
     @Override
     public void read(CountDataInputStream di, int size) throws IOException {
 
@@ -62,33 +93,4 @@ public class MasterBoardData implements IRead, ILogentry {
         threePositionEnablingDeviceInput = di.readUnsignedByte();
     }
 
-    @Override
-    public String toString() {
-        return "MasterBoardData{" +
-                "digitalInputBits=" + digitalInputBits +
-                ", digitalOutputBits=" + digitalOutputBits +
-                ", analogInputRange0=" + analogInputRange0 +
-                ", analogInputRange1=" + analogInputRange1 +
-                ", analogInput0=" + analogInput0 +
-                ", analogInput1=" + analogInput1 +
-                ", analogOutputDomain0=" + analogOutputDomain0 +
-                ", analogOutputDomain1=" + analogOutputDomain1 +
-                ", analogOutput0=" + analogOutput0 +
-                ", analogOutput1=" + analogOutput1 +
-                ", masterboardTemperature=" + masterboardTemperature +
-                ", robotVoltage48V=" + robotVoltage48V +
-                ", robotCurrent=" + robotCurrent +
-                ", masterIOCurrent=" + masterIOCurrent +
-                ", safetymode=" + safetymode +
-                ", inReducedMode=" + inReducedMode +
-                ", euromap67Installed=" + euromap67Installed +
-                ", euromapInputBits=" + euromapInputBits +
-                ", euromapOutputBits=" + euromapOutputBits +
-                ", euromapVoltage=" + euromapVoltage +
-                ", euromapCurrent=" + euromapCurrent +
-                ", internal=" + internal +
-                ", operationalModeSelectorInput=" + operationalModeSelectorInput +
-                ", threePositionEnablingDeviceInput=" + threePositionEnablingDeviceInput +
-                '}';
-    }
 }

+ 22 - 0
src/main/java/at/acdp/urweb/sclient/data/Message.java

@@ -0,0 +1,22 @@
+package at.acdp.urweb.sclient.data;
+
+import com.eclipsesource.json.JsonObject;
+
+import java.io.IOException;
+
+public class Message implements IJsonObject {
+    String message;
+    Throwable e;
+
+    public Message(String message, Throwable e) {
+        this.message=message;
+        this.e=e;
+    }
+
+    @Override
+    public JsonObject toJSON() {
+        return new JsonObject()
+            .add("message", message)
+            .add("exception", e.toString());
+    }
+}

+ 4 - 1
src/main/java/at/acdp/urweb/sclient/data/MessageType.java

@@ -9,5 +9,8 @@ public class MessageType {
     public static final int SAFETY_COMPLIANCE_TOLERANCES_MESSAGE=24;
     public static final int PROGRAM_STATE_MESSAGE=25;
 
-
+    @Override
+    public String toString() {
+        return "{MessageType}";
+    }
 }

+ 17 - 17
src/main/java/at/acdp/urweb/sclient/data/ModeData.java

@@ -1,10 +1,11 @@
 package at.acdp.urweb.sclient.data;
 
 import at.acdp.urweb.CountDataInputStream;
+import com.eclipsesource.json.JsonObject;
 
 import java.io.IOException;
 
-public class ModeData implements IRead, ILogentry {
+public class ModeData implements IRead, IJsonObject {
     public boolean realRobotConnected;
     public boolean realRobotEnabled;
     public boolean robotPoweredOn;
@@ -25,21 +26,20 @@ public class ModeData implements IRead, ILogentry {
     }
 
     @Override
-    public String toString() {
-        return "ModeData{" +
-                "realRobotConnected=" + realRobotConnected +
-                ", realRobotEnabled=" + realRobotEnabled +
-                ", robotPoweredOn=" + robotPoweredOn +
-                ", emergencyStopped=" + emergencyStopped +
-                ", protectiveStopped=" + protectiveStopped +
-                ", isProgramRunning=" + isProgramRunning +
-                ", isProgramPaused=" + isProgramPaused +
-                ", robotMode=" + robotMode +
-                ", controlMode=" + controlMode +
-                ", targetSpeedFraction=" + targetSpeedFraction +
-                ", speedScaling=" + speedScaling +
-                ", targetSpeedFractionLimit=" + targetSpeedFractionLimit +
-                ", internal=" + internal +
-                '}';
+    public JsonObject toJSON() {
+        return new JsonObject()
+                .add("realRobotConnected", realRobotConnected)
+                .add("realRobotEnabled", realRobotEnabled)
+                .add("robotPoweredOn", robotPoweredOn)
+                .add("emergencyStopped", emergencyStopped)
+                .add("protectiveStopped", protectiveStopped)
+                .add("isProgramRunning", isProgramRunning)
+                .add("isProgramPaused", isProgramPaused)
+                .add("robotMode", robotMode)
+                .add("controlMode", controlMode)
+                .add("targetSpeedFraction", targetSpeedFraction)
+                .add("speedScaling", speedScaling)
+                .add("targetSpeedFractionLimit", targetSpeedFractionLimit)
+                .add("internal", internal);
     }
 }

+ 12 - 10
src/main/java/at/acdp/urweb/sclient/data/ToolCommInfo.java

@@ -1,11 +1,12 @@
 package at.acdp.urweb.sclient.data;
 
 import at.acdp.urweb.CountDataInputStream;
+import com.eclipsesource.json.JsonObject;
 
 import java.io.DataInputStream;
 import java.io.IOException;
 
-public class ToolCommInfo implements IRead, ILogentry {
+public class ToolCommInfo implements IRead, IJsonObject {
     public boolean toolCommunicationEnabled;
     public int baudrate;
     public int parity;
@@ -22,15 +23,16 @@ public class ToolCommInfo implements IRead, ILogentry {
         whatever=di.readInt();
     }
 
+
     @Override
-    public String toString() {
-        return "ToolCommInfo{" +
-                "toolCommunicationEnabled=" + toolCommunicationEnabled +
-                ", baudrate=" + baudrate +
-                ", parity=" + parity +
-                ", rxIdleChars=" + rxIdleChars +
-                ", txIdleChars=" + txIdleChars +
-                ", whatever=" + whatever +
-                '}';
+    public JsonObject toJSON() {
+        return new JsonObject()
+                .add("toolCommunicationEnabled", toolCommunicationEnabled)
+                .add("baudrate", baudrate)
+                .add("parity", parity)
+                .add("rxIdleChars", rxIdleChars)
+                .add("txIdleChars", txIdleChars)
+                .add("whatever", whatever)
+                ;
     }
 }

+ 13 - 13
src/main/java/at/acdp/urweb/sclient/data/ToolData.java

@@ -1,10 +1,11 @@
 package at.acdp.urweb.sclient.data;
 
 import at.acdp.urweb.CountDataInputStream;
+import com.eclipsesource.json.JsonObject;
 
 import java.io.IOException;
 
-public class ToolData implements IRead, ILogentry {
+public class ToolData implements IRead, IJsonObject {
 
     int		analogInputRange0;
     int		analogInputRange1;
@@ -30,17 +31,16 @@ public class ToolData implements IRead, ILogentry {
     }
 
     @Override
-    public String toString() {
-        return "ToolData{" +
-                "analogInputRange0=" + analogInputRange0 +
-                ", analogInputRange1=" + analogInputRange1 +
-                ", analogInput0=" + analogInput0 +
-                ", analogInput1=" + analogInput1 +
-                ", toolVoltage48V=" + toolVoltage48V +
-                ", toolOutputVoltage=" + toolOutputVoltage +
-                ", toolCurrent=" + toolCurrent +
-                ", toolTemperature=" + toolTemperature +
-                ", toolMode=" + toolMode +
-                '}';
+    public JsonObject toJSON() {
+        return new JsonObject()
+                .add("analogInputRange0", analogInputRange0)
+                .add("analogInputRange1", analogInputRange1)
+                .add("analogInput0", analogInput0)
+                .add("analogInput1", analogInput1)
+                .add("toolVoltage48V", toolVoltage48V)
+                .add("toolOutputVoltage", toolOutputVoltage)
+                .add("toolCurrent", toolCurrent)
+                .add("toolTemperature", toolTemperature)
+                .add("toolMode", toolMode);
     }
 }

+ 16 - 17
src/main/java/at/acdp/urweb/sclient/data/VersionMessage.java

@@ -2,7 +2,6 @@ package at.acdp.urweb.sclient.data;
 
 import at.acdp.urweb.CountDataInputStream;
 
-import java.io.DataInputStream;
 import java.io.IOException;
 
 public class VersionMessage implements IRead {
@@ -19,6 +18,22 @@ public class VersionMessage implements IRead {
     public int buildNumber;
     public String buildDate;
 
+    @Override
+    public String toString() {
+        return "{\"VersionMessage\":{"
+                + "                        \"msgType\":\"" + msgType + "\""
+                + ",                         \"tstamp\":\"" + tstamp + "\""
+                + ",                         \"source\":\"" + source + "\""
+                + ",                         \"robotMsgType\":\"" + robotMsgType + "\""
+                + ",                         \"name\":\"" + name + "\""
+                + ",                         \"majorVersion\":\"" + majorVersion + "\""
+                + ",                         \"minorVersion\":\"" + minorVersion + "\""
+                + ",                         \"bugFixVersion\":\"" + bugFixVersion + "\""
+                + ",                         \"buildNumber\":\"" + buildNumber + "\""
+                + ",                         \"buildDate\":\"" + buildDate + "\""
+                + "}}";
+    }
+
     public void read(CountDataInputStream in, int size) throws IOException {
         int before=in.getCount();
         int msgSize = in.readInt();
@@ -42,20 +57,4 @@ public class VersionMessage implements IRead {
             throw new RuntimeException("Versionmessage length mismatch: "+diff);
         }
     }
-
-    @Override
-    public String toString() {
-        return "VersionMessage{" +
-                "msgType=" + msgType +
-                ", tstamp=" + tstamp +
-                ", source=" + source +
-                ", robotMsgType=" + robotMsgType +
-                ", name='" + name + '\'' +
-                ", majorVersion=" + majorVersion +
-                ", minorVersion=" + minorVersion +
-                ", bugFixVersion=" + bugFixVersion +
-                ", buildNumber=" + buildNumber +
-                ", buildDate='" + buildDate + '\'' +
-                '}';
-    }
 }

+ 7 - 5
src/main/java/at/acdp/urweb/web/WebServer.java

@@ -3,6 +3,7 @@ package at.acdp.urweb.web;
 import java.nio.file.Paths;
 
 import at.acdp.urweb.ScReadThread;
+import at.acdp.urweb.sclient.URLog;
 import io.undertow.Handlers;
 import io.undertow.Undertow;
 import io.undertow.server.HttpHandler;
@@ -50,16 +51,17 @@ public class WebServer {
 
                             res+=line;
                         }
-
                         if(!cmd.endsWith("\n"))
                             cmd+="\n";
                         sc.writeCmd(cmd);
                     }
                 })
-                .get("/log",  ex -> {
-                    //ex.getOutputStream().
-
-                    // System.out.println(ex.getQueryParameters().get("id").getFirst());
+                .get("/log/{from}",  ex -> {
+                    var x=ex.getQueryParameters().get("from").getFirst();
+                    int from= Integer.parseInt(ex.getQueryParameters().get("from").getFirst());
+                    from=Integer.max(0,from);
+                    var r = URLog.get(from);
+                    ex.getResponseSender().send(r.toJSON().toString());
                 })
                 .get("/test/{id}", ex -> {
                     System.out.println(ex.getQueryParameters().get("id").getFirst());

+ 0 - 9
src/main/resources/webroot/index.html

@@ -1,9 +0,0 @@
-<html>
-jo!
-
-<form action="/cmd">
-    cmd:<br>
-    <input type="text" name="cmd" value=""><br>
-    <input type="submit" value="Submit">
-</form>
-</html>

+ 19 - 6
webroot/index.html

@@ -13,9 +13,16 @@
 <div id="app">
     <textarea v-model="input" cols="80" rows="20"></textarea>
     <button v-on:click="send">send</button>
+
+
+    <ul id="loglist">
+        <li v-for="(item, index) in log.slice().reverse()">
+            {{ index }} - {{ item.entry.message }}
+        </li>
+    </ul>
 </div>
 
-<script type="text/ecmascript">
+<script type="application/javascript">
     new Vue({
         el: '#app',
         data: {
@@ -26,10 +33,11 @@
                 ' set_digital_out(3, True) \n' +
                 ' set_digital_out(4, True) \n' +
                 'end',
-            log: null
+            log: [],
+            lastID: -1
         },
         created: function() {
-            setTimeout(this.update, 1000);
+            setInterval(this.update, 200);
         },
         methods: {
             send: function (event) {
@@ -39,10 +47,15 @@
                     });
             },
             update: function (event) {
-                fetch('/log', {method: "GET"})
-                    .then((value) => {
-                        this.$data.log=value;
+                fetch('/log/'+this.lastID, {method: "GET"})
+                    .then((response) => {
+                        return response.json();
                     })
+                    .then((myJson) => {
+                        console.log(JSON.stringify(myJson));
+                        this.$data.log=this.$data.log.concat(myJson.entries);
+                        this.$data.lastID=myJson.lastID;
+                    });
             }
         }
     })

File diff suppressed because it is too large
+ 3187 - 2339
webroot/js/vue.js


File diff suppressed because it is too large
+ 3 - 3
webroot/js/vue.min.js