Browse Source

switch to sparkjava
add cmdline switches

Martin Kunz 5 years ago
parent
commit
6b2e377fcb

+ 2 - 1
.idea/compiler.xml

@@ -6,11 +6,12 @@
         <sourceOutputDir name="target/generated-sources/annotations" />
         <sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
         <outputRelativeToContentRoot value="true" />
-        <module name="pickorplaceswing" />
+        <module name="urweb" />
       </profile>
     </annotationProcessing>
     <bytecodeTargetLevel>
       <module name="pickorplaceswing" target="11" />
+      <module name="urweb" target="11" />
     </bytecodeTargetLevel>
   </component>
 </project>

+ 1 - 1
.idea/modules.xml

@@ -2,7 +2,7 @@
 <project version="4">
   <component name="ProjectModuleManager">
     <modules>
-      <module fileurl="file://$PROJECT_DIR$/pickorplaceswing.iml" filepath="$PROJECT_DIR$/pickorplaceswing.iml" />
+      <module fileurl="file://$PROJECT_DIR$/urweb.iml" filepath="$PROJECT_DIR$/urweb.iml" />
     </modules>
   </component>
 </project>

+ 10 - 10
pom.xml

@@ -77,11 +77,16 @@
 			<artifactId>minimal-json</artifactId>
 			<version>0.9.5</version>
 		</dependency>
-		<dependency>
-			<groupId>io.undertow</groupId>
-			<artifactId>undertow-core</artifactId>
-			<version>${undertow.version}</version>
-		</dependency>
+        <dependency>
+            <groupId>com.sparkjava</groupId>
+            <artifactId>spark-core</artifactId>
+            <version>2.8.0</version>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+            <version>1.7.26</version>
+        </dependency>
 		<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api -->
 		<dependency>
 			<groupId>org.junit.jupiter</groupId>
@@ -89,11 +94,6 @@
 			<version>5.3.1</version>
 			<scope>test</scope>
 		</dependency>
-		<dependency>
-			<groupId>org.slf4j</groupId>
-			<artifactId>slf4j-api</artifactId>
-			<version>1.7.25</version>
-		</dependency>
 		<!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-classic -->
 		<dependency>
 			<groupId>ch.qos.logback</groupId>

File diff suppressed because it is too large
+ 12601 - 0
src/main/java/at/acdp/urweb/CommandLine.java


+ 16 - 11
src/main/java/at/acdp/urweb/Main.java

@@ -1,19 +1,24 @@
 package at.acdp.urweb;
 
-import at.acdp.urweb.sclient.SecondaryClient;
 import at.acdp.urweb.web.WebServer;
-
-import java.io.IOException;
+import org.slf4j.LoggerFactory;
 
 public class Main {
+    private final static org.slf4j.Logger logger = LoggerFactory.getLogger(Main.class);
 
-    public static void main(String [ ] args) {
-        URBot urbot=new URBot("127.0.0.1");
-        new WebServer(8080,true, urbot).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");
+    public static void main(String[] args) {
+        Params app = null;
+        try {
+            app = picocli.CommandLine.populateCommand(new Params(), args);
+        } catch (Exception e) {
+            System.out.println(e.getMessage());
+            picocli.CommandLine.usage(new Params(), System.out);
+            System.exit(1);
+        }
+        try {
+            new WebServer(app).start();
+        } catch (Exception e) {
+            logger.error("Server exited", e);
+        }
     }
-
 }

+ 13 - 0
src/main/java/at/acdp/urweb/Params.java

@@ -0,0 +1,13 @@
+package at.acdp.urweb;
+
+public class Params {
+    @picocli.CommandLine.Option(names = { "-p", "--port" }, description = "HTTP Server port", required = true)
+    public int port = 8080;
+
+    @picocli.CommandLine.Option(names = { "-w", "--webroot" }, description = "Use webroot from filesystem", defaultValue = "")
+    public String webroot = "";
+
+    @picocli.CommandLine.Option(names = { "-r", "--robotip" }, description = "Robot ip address", defaultValue = "")
+    public String robotIP = "";
+}
+

+ 2 - 1
src/main/java/at/acdp/urweb/sclient/URLog.java

@@ -10,7 +10,8 @@ public class URLog {
 
     public static void add(IJsonObject jo) {
         synchronized (list) {
-            list[pos++%LENGTH]=new LogHolder(jo);;
+            String type=jo.getClass().getSimpleName();
+            list[++pos%LENGTH]=new LogHolder(type, jo);;
         }
     }
 

+ 6 - 4
src/main/java/at/acdp/urweb/sclient/data/LogHolder.java

@@ -4,18 +4,20 @@ import com.eclipsesource.json.JsonObject;
 
 public class LogHolder implements IJsonObject{
     public long timestamp;
-
     public IJsonObject entry;
+    public String type;
 
-    public LogHolder(IJsonObject entry) {
+    public LogHolder(String type, IJsonObject entry) {
         this.entry=entry;
         this.timestamp=System.currentTimeMillis();
+        this.type=type;
     }
 
     @Override
     public JsonObject toJSON() {
         return new JsonObject()
-                .add("ts",timestamp)
-                .add("entry",entry.toJSON());
+                .add("type", type)
+                .add("ts", timestamp)
+                .add("entry", entry.toJSON());
     }
 }

+ 0 - 5
src/main/java/at/acdp/urweb/sclient/data/MessageType.java

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

+ 40 - 72
src/main/java/at/acdp/urweb/web/WebServer.java

@@ -2,90 +2,58 @@ package at.acdp.urweb.web;
 
 import java.nio.file.Paths;
 
+import at.acdp.urweb.Params;
 import at.acdp.urweb.URBot;
 import at.acdp.urweb.sclient.URLog;
-import io.undertow.Handlers;
-import io.undertow.Undertow;
-import io.undertow.server.HttpHandler;
-import io.undertow.server.HttpServerExchange;
-import io.undertow.server.handlers.HttpTraceHandler;
-import io.undertow.server.handlers.resource.PathResourceManager;
 import org.slf4j.LoggerFactory;
 
-import static io.undertow.Handlers.resource;
+import static spark.Spark.*;
 
 public class WebServer {
     private final static org.slf4j.Logger logger = LoggerFactory.getLogger(WebServer.class);
-    private final int port;
     private final URBot urbot;
-    private Undertow server;
+    private final Params params;
 
-    public WebServer(int port, boolean debug, URBot urbot) {
-        this.urbot = urbot;
-        this.port = port;
+    public WebServer(Params params) {
+        this.params = params;
+        this.urbot=new URBot(params.robotIP);
     }
 
     public void start() {
-        Undertow.Builder builder = Undertow.builder();
-        builder.addHttpListener(port, "0.0.0.0");
-        builder.setHandler(Handlers.routing()
-                .post("/cmd", new HttpHandler() {
-                    @Override
-                    public void handleRequest(HttpServerExchange ex) throws Exception {
-                        if(!dispatch(ex,this)) return;
-                        byte[] bytes = ex.getInputStream().readAllBytes();
-                        String cmd=new String(bytes);
-                        urbot.sendProgram(cmd);
-                    }
-                })
-                .post("/freedrive", new HttpHandler() {
-                    @Override
-                    public void handleRequest(HttpServerExchange ex) throws Exception {
-                        dispatch(ex, this);
-                        urbot.sendFreedrive(1);
-                    }
-                })
-                .post("/digital/{which}", new HttpHandler() {
-                    @Override
-                    public void handleRequest(HttpServerExchange ex) throws Exception {
-                        if(!dispatch(ex,this)) return;
-                        int which= Integer.parseInt(ex.getQueryParameters().get("which").getFirst());
-                        boolean val = Boolean.valueOf(new String(ex.getInputStream().readAllBytes()));
-                        urbot.setDigital(which, val);
-                    }
-                })
-                .get("/digital/{which}", new HttpHandler() {
-                    @Override
-                    public void handleRequest(HttpServerExchange ex) throws Exception {
-                        if(!dispatch(ex,this)) return;
-                        int which= Integer.parseInt(ex.getQueryParameters().get("which").getFirst());
-                        boolean res=urbot.getDigital(which);
-                        ex.getResponseSender().send(String.valueOf(res));
-                    }
-                })
-                .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());
-                })
-                .get("/*", resource(new PathResourceManager(Paths.get("webroot"), 100))
-                        .setDirectoryListingEnabled(true))
-        );
-        server = builder.build();
-        server.start();
-    }
+        port(params.port);
+        if (!params.webroot.isEmpty())
+            staticFileLocation(params.webroot);
+        else
+            staticFiles.location("/webroot");
 
-    private boolean dispatch(HttpServerExchange ex, HttpHandler handler) {
-        if (ex.isInIoThread()) {
-            ex.dispatch(handler);
-            return false;
-        }
-        ex.startBlocking();
-        return true;
+        post("/cmd", (req, res) -> {
+            byte[] bytes = req.raw().getInputStream().readAllBytes();
+            String cmd=new String(bytes);
+            urbot.sendProgram(cmd);
+            return "";
+        });
+        post("/freedrive",  (req, res) -> {
+                urbot.sendFreedrive(1);
+                return "";
+        });
+        post("/digital/:which", (req, res) -> {
+            int which=Integer.parseInt(req.params("which"));
+            boolean val = Boolean.valueOf(new String(req.raw().getInputStream().readAllBytes()));
+            urbot.setDigital(which, val);
+            return "";
+        });
+        get("/digital/:which", (req, res) -> {
+            int which=Integer.parseInt(req.params("which"));
+            boolean d=urbot.getDigital(which);
+            res.body(String.valueOf(d));
+            return "";
+        });
+        get("/log/:from",  (req, res) -> {
+            int from=Integer.parseInt(req.params("from"));
+            from=Integer.max(0,from);
+            var r = URLog.get(from);
+            res.body(String.valueOf(r.toJSON().toString()));
+            return "";
+        });
     }
 }

+ 68 - 4
webroot/index.html

@@ -12,8 +12,19 @@
 
 <div id="app">
     <textarea v-model="input" cols="80" rows="20"></textarea>
-    <button v-on:click="send">send</button>
+    <div id='example-3'>
+        <input type="checkbox" id="do1" value="1" v-model="doBits">
+        <input type="checkbox" id="do2" value="2" v-model="doBits">
+        <input type="checkbox" id="do3" value="3" v-model="doBits">
+        <input type="checkbox" id="do4" value="4" v-model="doBits">
+        <input type="checkbox" id="do5" value="5" v-model="doBits">
+        <input type="checkbox" id="do6" value="6" v-model="doBits">
+        <input type="checkbox" id="do7" value="7" v-model="doBits">
+        <input type="checkbox" id="do8" value="8" v-model="doBits">
+        <br>
+    </div>
 
+    <button v-on:click="send">send</button>
 
     <ul id="loglist">
         <li v-for="(item, index) in log.slice().reverse()">
@@ -34,11 +45,30 @@
                 ' set_digital_out(4, True) \n' +
                 'end',
             log: [],
-            lastID: -1
+            lastID: -1,
+            doBits: []
         },
         created: function() {
             setInterval(this.update, 200);
         },
+        watch: {
+            doBits: (newValue, oldValue) => {
+                let diff1 = newValue.filter(x => !oldValue.includes(x));
+                let diff2 = oldValue.filter(x => !newValue.includes(x));
+                for(const x of diff1) {
+                    fetch('/digital/' + x, {method: "POST", body: 'True'})
+                        .then(function (response) {
+                            return response;
+                        });
+                }
+                for(const x of diff2) {
+                    fetch('/digital/' + x, {method: "POST", body: 'False'})
+                        .then(function (response) {
+                            return response;
+                        });
+                }
+            }
+        },
         methods: {
             send: function (event) {
                 fetch('/cmd', {method: "POST", body: this.input})
@@ -49,6 +79,38 @@
             ts2txt: function (ts) {
                 return moment(ts).format('YYYY-MM-DD hh:mm ss.SSS ')
             },
+            handlePackage: function(package) {
+                switch (package.type) {
+                    case 'Message':
+                        break;
+                    case 'MasterBoardData':
+                        let bits=package.entry.digitalOutputBits;
+                        for(let i=0;i<8;i++) {
+                            if(bits& (1<<i)) {
+                                this.doBits.push(''+(i+1));
+                            }
+                        }
+                        break;
+                    case 'ModeData':
+                        break;
+                    case 'ToolData':
+                        break;
+                    case 'ToolCommInfo':
+                        break;
+                    case 'JointDataList':
+                        break;
+                    case 'CartesianInfo':
+                        break;
+                    case 'ForceModeData':
+                        break;
+                    case 'AdditionalInfo':
+                        break;
+                    default:
+                        console.log('unknown package:' + package.type);
+                    
+                }
+                
+            },
             update: function (event) {
                 fetch('/log/'+this.lastID, {method: "GET"})
                     .then(handleErrors)
@@ -56,11 +118,13 @@
                         return response.json();
                     })
                     .then((myJson) => {
-                        console.log(JSON.stringify(myJson));
+                        for(const entry of myJson.entries) {
+                            this.handlePackage(entry);
+                        }
                         this.$data.log=this.$data.log.concat(myJson.entries);
                         this.$data.lastID=myJson.lastID;
                         let len=this.$data.log.length;
-                        this.$data.log.splice(0,len-200);
+                        this.$data.log.splice(0, len-200);
                     })
                     .catch(error => {
                         this.$data.lastID=0;