From 515faa182ff7a795e9ab37d2a4c7ab62a7379d1e Mon Sep 17 00:00:00 2001 From: Matt Date: Tue, 28 Jan 2020 10:44:52 -0800 Subject: [PATCH] 2.3 (#56) ### features - added auto install and update - added calibration status and accuracy message - added 2020 loading station pnp model ### bugs - fixed solve pnp model upload - fixed solve pnp draw --- .circleci/config.yml | 12 +-- chameleon-client/src/assets/FRCtargets.json | 6 ++ .../src/views/CameraViewes/3D.vue | 54 +++++++++++- chameleon-client/src/views/Settings.vue | 11 +-- .../src/views/SettingsViewes/Cameras.vue | 82 +++++++++++++++++-- .../src/views/SettingsViewes/General.vue | 78 ++++++++++++++++-- chameleon-server/chameleon-vision.iml | 41 +++++----- chameleon-server/pom.xml | 4 +- .../com/chameleonvision/config/JsonMat.java | 4 - .../scripting/ScriptEvent.java | 4 - .../com/chameleonvision/util/Helpers.java | 38 +++++++-- .../chameleonvision/util/JacksonHelper.java | 2 - .../com/chameleonvision/util/MathHandler.java | 3 - .../chameleonvision/vision/VisionProcess.java | 12 +-- .../vision/pipeline/PipelineManager.java | 5 +- .../pipeline/impl/Calibrate3dPipeline.java | 7 +- .../pipeline/impl/DriverVisionPipeline.java | 1 - .../pipeline/impl/StandardCVPipeline.java | 7 +- .../pipeline/pipes/Collect2dTargetsPipe.java | 5 +- .../pipeline/pipes/Draw2dContoursPipe.java | 2 +- .../pipeline/pipes/DrawSolvePNPPipe.java | 54 +++++------- .../pipeline/pipes/FilterContoursPipe.java | 2 +- .../pipeline/pipes/GroupContoursPipe.java | 1 - .../pipeline/pipes/SortContoursPipe.java | 1 - .../pipeline/pipes/SpeckleRejectPipe.java | 2 - .../chameleonvision/web/RequestHandler.java | 80 +++++++++++++----- .../java/com/chameleonvision/web/Server.java | 1 + .../chameleonvision/web/SocketHandler.java | 10 +-- 28 files changed, 368 insertions(+), 161 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 341ba55a0..2e8297d7e 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -54,20 +54,10 @@ workflows: version: 2 release: jobs: - - build_ui: - filters: - branches: - only: - - master - - dev + - build_ui - build_jar: requires: - build_ui - filters: - branches: - only: - - master - - dev - deploy: requires: - build_jar diff --git a/chameleon-client/src/assets/FRCtargets.json b/chameleon-client/src/assets/FRCtargets.json index 12a8babe4..55aa10fb6 100644 --- a/chameleon-client/src/assets/FRCtargets.json +++ b/chameleon-client/src/assets/FRCtargets.json @@ -5,6 +5,12 @@ [9.819867, -17], [19.625,0] ], + "2020 Loading Station": [ + [-3.54,5.5], + [-3.54,-5.5], + [3.54,-5.5], + [3.54,5.5] + ], "2019 Dual Target": [ [-7.75, 3], [-7.75, -3], diff --git a/chameleon-client/src/views/CameraViewes/3D.vue b/chameleon-client/src/views/CameraViewes/3D.vue index 5a76c92c1..339c7dc2c 100644 --- a/chameleon-client/src/views/CameraViewes/3D.vue +++ b/chameleon-client/src/views/CameraViewes/3D.vue @@ -17,10 +17,14 @@ - + Upload Premade + + {{snackbar.text}} + @@ -41,7 +45,12 @@ return { is3D: false, selectedModel: null, - FRCtargets: null + FRCtargets: null, + snackbar: { + color: "success", + text: "" + }, + snack: false } }, methods: { @@ -57,13 +66,50 @@ }); }, onParse(result) { - this.uploadModel(result.data); + if (result.data.length > 0) { + + + let data = []; + for (let item of result.data) { + let tmp = []; + tmp.push(Number(item[0])); + tmp.push(Number(item[1])); + if (isNaN(tmp[0]) || isNaN(tmp[1])) { + this.snackbar = { + color: "error", + text: "Error: cvs did parse correctly" + }; + this.snack = true; + return; + } + data.push(tmp); + } + this.uploadModel(data); + } else { + this.snackbar = { + color: "error", + text: "Error: cvs did not contain any data" + }; + this.snack = true; + } }, uploadPremade() { this.uploadModel(this.selectedModel); }, uploadModel(model) { - this.axios.post("http://" + this.$address + "/api/vision/pnpModel", model); + this.axios.post("http://" + this.$address + "/api/vision/pnpModel", model).then((response) => { + this.snackbar = { + color: "success", + text: "File uploaded successfully" + }; + this.snack = true; + }).catch((error) => { + this.snackbar = { + color: "error", + text: "An error occurred" + }; + this.snack = true; + }) } }, computed: { diff --git a/chameleon-client/src/views/Settings.vue b/chameleon-client/src/views/Settings.vue index c67e9db41..4f8a47796 100644 --- a/chameleon-client/src/views/Settings.vue +++ b/chameleon-client/src/views/Settings.vue @@ -11,7 +11,7 @@ - +
Camera Stream
@@ -34,18 +34,13 @@ data() { return { selectedTab: 0, + tabList:[General, Cameras] } }, computed: { selectedComponent: { get() { - switch (this.selectedTab) { - case 0: - return "General"; - case 1: - return "Cameras"; - } - return ""; + return this.tabList[this.selectedTab]; } }, streamAddress: { diff --git a/chameleon-client/src/views/SettingsViewes/Cameras.vue b/chameleon-client/src/views/SettingsViewes/Cameras.vue index ec8ae53ae..8dd9d1b18 100644 --- a/chameleon-client/src/views/SettingsViewes/Cameras.vue +++ b/chameleon-client/src/views/SettingsViewes/Cameras.vue @@ -48,9 +48,21 @@ Snapshot Amount: {{snapshotAmount}}
+
+ +
+ + + + +
+
- - Calibration Failed + + {{snackbar.text}} @@ -58,12 +70,14 @@ diff --git a/chameleon-client/src/views/SettingsViewes/General.vue b/chameleon-client/src/views/SettingsViewes/General.vue index fe655c19e..46e97426b 100644 --- a/chameleon-client/src/views/SettingsViewes/General.vue +++ b/chameleon-client/src/views/SettingsViewes/General.vue @@ -1,5 +1,9 @@ @@ -25,26 +53,64 @@ CVinput }, data() { - return {} + return { + file: undefined, + snackbar: { + color: "success", + text: "" + }, + snack: false, + isLoading: false + } }, methods: { sendGeneralSettings() { const self = this; this.axios.post("http://" + this.$address + "/api/settings/general", this.settings).then( function (response) { - if (response.status === 200){ + if (response.status === 200) { self.$store.state.saveBar = true; } } ) + }, + installOrUpdate() { + let formData = new FormData(); + formData.append('file', this.file); + if (this.file !== undefined) { + this.isLoading = true; + } + this.axios.post("http://" + this.$address + "/api/install", formData, { + headers: { + 'Content-Type': 'multipart/form-data' + } + }).then(() => { + this.snackbar = { + color: "success", + text: "Installation successful" + }; + this.isLoading = false; + this.snack = true; + }).catch(error => { + this.snackbar = { + color: "error", + text: error.response.data + }; + this.isLoading = false; + this.snack = true; + }) } }, computed: { - isDisabled() { - if (this.settings.connectionType === 0) { - return true; + fileUploadText() { + if (this.file !== undefined) { + return "Install and update" + } else { + return "Install current version" } - return false; + }, + isDisabled() { + return this.settings.connectionType === 0; }, settings: { get() { diff --git a/chameleon-server/chameleon-vision.iml b/chameleon-server/chameleon-vision.iml index 11b1a05d0..e863282a1 100644 --- a/chameleon-server/chameleon-vision.iml +++ b/chameleon-server/chameleon-vision.iml @@ -7,33 +7,32 @@ - - - - - + + + + - - - + + + - - - - - - - - - - - - - + + + + + + + + + + + + + diff --git a/chameleon-server/pom.xml b/chameleon-server/pom.xml index c5a1f3c64..d02cdfc4e 100644 --- a/chameleon-server/pom.xml +++ b/chameleon-server/pom.xml @@ -6,7 +6,7 @@ org.chameleon-vision.main chameleon-vision - 2.2-RELEASE + 2.3-RELEASE @@ -63,7 +63,7 @@ io.javalin javalin - 3.4.1 + RELEASE diff --git a/chameleon-server/src/main/java/com/chameleonvision/config/JsonMat.java b/chameleon-server/src/main/java/com/chameleonvision/config/JsonMat.java index df1fded86..fbdd6f1a4 100644 --- a/chameleon-server/src/main/java/com/chameleonvision/config/JsonMat.java +++ b/chameleon-server/src/main/java/com/chameleonvision/config/JsonMat.java @@ -4,11 +4,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import org.opencv.core.CvType; import org.opencv.core.Mat; -import java.lang.reflect.Array; -import java.util.ArrayList; import java.util.Arrays; -import java.util.LinkedList; -import java.util.List; public class JsonMat { diff --git a/chameleon-server/src/main/java/com/chameleonvision/scripting/ScriptEvent.java b/chameleon-server/src/main/java/com/chameleonvision/scripting/ScriptEvent.java index c117c73de..c2f987c5a 100644 --- a/chameleon-server/src/main/java/com/chameleonvision/scripting/ScriptEvent.java +++ b/chameleon-server/src/main/java/com/chameleonvision/scripting/ScriptEvent.java @@ -4,10 +4,6 @@ import com.chameleonvision.Debug; import com.chameleonvision.util.ShellExec; import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.LinkedList; -import java.util.List; public class ScriptEvent { private static final ShellExec executor = new ShellExec(true, true); diff --git a/chameleon-server/src/main/java/com/chameleonvision/util/Helpers.java b/chameleon-server/src/main/java/com/chameleonvision/util/Helpers.java index f63f5d1e7..02396a336 100644 --- a/chameleon-server/src/main/java/com/chameleonvision/util/Helpers.java +++ b/chameleon-server/src/main/java/com/chameleonvision/util/Helpers.java @@ -4,10 +4,28 @@ import edu.wpi.cscore.VideoMode; import org.opencv.core.Scalar; import java.awt.*; +import java.io.FileWriter; +import java.io.IOException; +import java.io.Writer; +import java.nio.file.Path; import java.util.HashMap; -import java.util.Map; public class Helpers { + private static final String kServicePath = "/etc/systemd/system/chameleonVision.service"; + private static final String kServiceString = "[Unit]\n" + + "Description=chameleon vision\n" + + "\n" + + "[Service]\n" + + "ExecStart=/usr/bin/java -jar %s \n" + + "StandardOutput=file:/var/log/something.out.txt\n" + + "StandardError=file:/var/log/something.err.txt\n" + + "Type=simple\n" + + "WorkingDirectory=/usr/local/bin\n" + + "\n" + + "[Install]\n" + + "WantedBy=multi-user.target\n" + + "\n"; + private Helpers() { } @@ -17,9 +35,19 @@ public class Helpers { public static HashMap VideoModeToHashMap(VideoMode videoMode) { return new HashMap() {{ - put("width", videoMode.width); - put("height", videoMode.height); - put("fps", videoMode.fps); - put("pixelFormat", videoMode.pixelFormat.toString());}}; + put("width", videoMode.width); + put("height", videoMode.height); + put("fps", videoMode.fps); + put("pixelFormat", videoMode.pixelFormat.toString()); + }}; + } + + public static void setService(Path filePath) throws IOException, InterruptedException { + String newService = String.format(kServiceString, filePath.toString()); + Writer writer = new FileWriter(kServicePath, false); + writer.write(newService); + writer.close(); + Process p = Runtime.getRuntime().exec("systemctl enable chameleonVision.service"); + p.waitFor(); } } diff --git a/chameleon-server/src/main/java/com/chameleonvision/util/JacksonHelper.java b/chameleon-server/src/main/java/com/chameleonvision/util/JacksonHelper.java index d6da705a7..65d4a55d0 100644 --- a/chameleon-server/src/main/java/com/chameleonvision/util/JacksonHelper.java +++ b/chameleon-server/src/main/java/com/chameleonvision/util/JacksonHelper.java @@ -1,7 +1,5 @@ package com.chameleonvision.util; -import com.chameleonvision.config.serializers.StandardCVPipelineSettingsDeserializer; -import com.chameleonvision.vision.pipeline.impl.StandardCVPipelineSettings; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.deser.std.StdDeserializer; import com.fasterxml.jackson.databind.json.JsonMapper; diff --git a/chameleon-server/src/main/java/com/chameleonvision/util/MathHandler.java b/chameleon-server/src/main/java/com/chameleonvision/util/MathHandler.java index f2bcbaa62..bf4433889 100644 --- a/chameleon-server/src/main/java/com/chameleonvision/util/MathHandler.java +++ b/chameleon-server/src/main/java/com/chameleonvision/util/MathHandler.java @@ -1,8 +1,5 @@ package com.chameleonvision.util; -import java.lang.Math; - -import edu.wpi.first.wpiutil.math.Num; import org.apache.commons.math3.util.FastMath; public class MathHandler { diff --git a/chameleon-server/src/main/java/com/chameleonvision/vision/VisionProcess.java b/chameleon-server/src/main/java/com/chameleonvision/vision/VisionProcess.java index a1776398c..f09019afc 100644 --- a/chameleon-server/src/main/java/com/chameleonvision/vision/VisionProcess.java +++ b/chameleon-server/src/main/java/com/chameleonvision/vision/VisionProcess.java @@ -4,17 +4,18 @@ import com.chameleonvision.Debug; import com.chameleonvision.config.CameraCalibrationConfig; import com.chameleonvision.config.CameraConfig; import com.chameleonvision.config.ConfigManager; +import com.chameleonvision.config.FullCameraConfiguration; import com.chameleonvision.networktables.NetworkTablesManager; import com.chameleonvision.scripting.ScriptEventType; import com.chameleonvision.scripting.ScriptManager; -import com.chameleonvision.config.FullCameraConfiguration; -import com.chameleonvision.util.LoopingRunnable; import com.chameleonvision.util.MathHandler; import com.chameleonvision.vision.camera.CameraStreamer; import com.chameleonvision.vision.camera.USBCameraCapture; -import com.chameleonvision.vision.pipeline.*; -import com.chameleonvision.vision.pipeline.impl.StandardCVPipeline; +import com.chameleonvision.vision.pipeline.CVPipelineResult; +import com.chameleonvision.vision.pipeline.CVPipelineSettings; +import com.chameleonvision.vision.pipeline.PipelineManager; import com.chameleonvision.vision.pipeline.impl.DriverVisionPipeline; +import com.chameleonvision.vision.pipeline.impl.StandardCVPipeline; import com.chameleonvision.vision.pipeline.impl.StandardCVPipelineSettings; import com.chameleonvision.web.SocketHandler; import com.fasterxml.jackson.core.JsonProcessingException; @@ -25,11 +26,10 @@ import edu.wpi.first.wpilibj.geometry.Pose2d; import edu.wpi.first.wpiutil.CircularBuffer; import org.apache.commons.lang3.tuple.Pair; import org.opencv.core.Mat; + import java.util.ArrayList; import java.util.HashMap; import java.util.List; -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.LinkedBlockingDeque; import java.util.stream.Collectors; diff --git a/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/PipelineManager.java b/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/PipelineManager.java index 144cea278..4ac6ef5ff 100644 --- a/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/PipelineManager.java +++ b/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/PipelineManager.java @@ -5,7 +5,10 @@ import com.chameleonvision.config.CameraConfig; import com.chameleonvision.config.ConfigManager; import com.chameleonvision.vision.VisionManager; import com.chameleonvision.vision.VisionProcess; -import com.chameleonvision.vision.pipeline.impl.*; +import com.chameleonvision.vision.pipeline.impl.Calibrate3dPipeline; +import com.chameleonvision.vision.pipeline.impl.DriverVisionPipeline; +import com.chameleonvision.vision.pipeline.impl.StandardCVPipeline; +import com.chameleonvision.vision.pipeline.impl.StandardCVPipelineSettings; import com.chameleonvision.web.SocketHandler; import edu.wpi.cscore.VideoMode; import edu.wpi.first.networktables.NetworkTableEntry; diff --git a/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/impl/Calibrate3dPipeline.java b/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/impl/Calibrate3dPipeline.java index f6e898145..69403df67 100644 --- a/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/impl/Calibrate3dPipeline.java +++ b/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/impl/Calibrate3dPipeline.java @@ -38,6 +38,7 @@ public class Calibrate3dPipeline extends CVPipeline tvecs = new ArrayList<>(); try { - Calib3d.calibrateCamera(objpoints, imgpoints, imageSize, cameraMatrix, distortionCoeffs, rvecs, tvecs); + calibrationAccuracy = Calib3d.calibrateCamera(objpoints, imgpoints, imageSize, cameraMatrix, distortionCoeffs, rvecs, tvecs); } catch(Exception e) { System.err.println("Camera calibration failed!"); initPipeline(cameraCapture); @@ -162,4 +163,8 @@ public class Calibrate3dPipeline extends CVPipeline { @@ -135,10 +135,11 @@ public class StandardCVPipeline extends CVPipeline, CaptureStaticProperties>, List> { diff --git a/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/pipes/Draw2dContoursPipe.java b/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/pipes/Draw2dContoursPipe.java index 4448ad09c..05c2f3329 100644 --- a/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/pipes/Draw2dContoursPipe.java +++ b/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/pipes/Draw2dContoursPipe.java @@ -1,7 +1,7 @@ package com.chameleonvision.vision.pipeline.pipes; -import com.chameleonvision.vision.camera.CaptureStaticProperties; import com.chameleonvision.util.Helpers; +import com.chameleonvision.vision.camera.CaptureStaticProperties; import com.chameleonvision.vision.pipeline.Pipe; import com.chameleonvision.vision.pipeline.impl.StandardCVPipeline; import org.apache.commons.lang3.tuple.Pair; diff --git a/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/pipes/DrawSolvePNPPipe.java b/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/pipes/DrawSolvePNPPipe.java index c5d75ad0b..8a8fed749 100644 --- a/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/pipes/DrawSolvePNPPipe.java +++ b/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/pipes/DrawSolvePNPPipe.java @@ -4,6 +4,7 @@ import com.chameleonvision.config.CameraCalibrationConfig; import com.chameleonvision.util.Helpers; import com.chameleonvision.vision.pipeline.Pipe; import com.chameleonvision.vision.pipeline.impl.StandardCVPipeline; +import com.chameleonvision.vision.pipeline.impl.StandardCVPipelineSettings; import org.apache.commons.lang3.tuple.Pair; import org.opencv.calib3d.Calib3d; import org.opencv.core.*; @@ -11,59 +12,44 @@ import org.opencv.core.Point; import org.opencv.imgproc.Imgproc; import java.awt.*; +import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; public class DrawSolvePNPPipe implements Pipe>, Mat> { private MatOfPoint3f boxCornerMat = new MatOfPoint3f(); - private MatOfPoint tempMatOfPoints = new MatOfPoint(); public Scalar green = Helpers.colorToScalar(Color.GREEN); public Scalar blue = Helpers.colorToScalar(Color.BLUE); public Scalar red = Helpers.colorToScalar(Color.RED); public Scalar orange = Helpers.colorToScalar(Color.orange); - public DrawSolvePNPPipe(CameraCalibrationConfig settings) { + public DrawSolvePNPPipe(StandardCVPipelineSettings standardCVPipelineSettings, CameraCalibrationConfig settings) { setConfig(settings); -// setObjectBox(14.5, 6, 2); - set2020Box(); + setBox(standardCVPipelineSettings.targetCornerMat); } - public void setObjectBox(double targetWidth, double targetHeight, double targetDepth) { - // implementation from 5190 Green Hope Falcons + private void setBox(MatOfPoint3f mat) { boxCornerMat.release(); - boxCornerMat = new MatOfPoint3f( - new Point3(-targetWidth/2d, -targetHeight/2d, 0), - new Point3(-targetWidth/2d, targetHeight/2d, 0), - new Point3(targetWidth/2d, targetHeight/2d, 0), - new Point3(targetWidth/2d, -targetHeight/2d, 0), - new Point3(-targetWidth/2d, -targetHeight/2d, -targetDepth), - new Point3(-targetWidth/2d, targetHeight/2d, -targetDepth), - new Point3(targetWidth/2d, targetHeight/2d, -targetDepth), - new Point3(targetWidth/2d, -targetHeight/2d, -targetDepth) - ); + var list = mat.toList(); + var auxList = list.stream().map(it -> new Point3(it.x, it.y, it.z - 6)).collect(Collectors.toList()); + var finalList = new ArrayList<>(list); + finalList.addAll(auxList); + boxCornerMat.fromList(finalList); } - public void set2020Box() { - boxCornerMat.release(); - boxCornerMat = new MatOfPoint3f( - new Point3(-19.625, 0, 0), - new Point3(-9.819867, -17, 0), - new Point3(9.819867, -17, 0), - new Point3(19.625, 0, 0), - new Point3(-19.625, 0, -6), - new Point3(-9.819867, -17, -6), - new Point3(9.819867, -17, -6), - new Point3(19.625, 0, -6) - ); + + public void setConfig(StandardCVPipelineSettings settings) { + setBox(settings.targetCornerMat); } private Mat cameraMatrix = new Mat(); private MatOfDouble distortionCoefficients = new MatOfDouble(); public void setConfig(CameraCalibrationConfig config) { - if(config == null) { + if (config == null) { System.err.println("got passed a null config! Returning..."); return; } @@ -82,17 +68,17 @@ public class DrawSolvePNPPipe implements Pipe tmp = new HashMap(); + tmp.put("accuracy", pipeManager.calib3dPipe.getCalibrationAccuracy()); + ctx.json(tmp); ctx.status(200); } else { System.err.println("CALFAIL"); ctx.status(500); } + } else { + ctx.status(201); } pipeManager.setCalibrationMode(false); - ctx.status(200); } public static void onPnpModel(Context ctx) throws JsonProcessingException { //noinspection unchecked List> points = kObjectMapper.readValue(ctx.body(), List.class); - - // each entry should be an xy pair - var pointsList = new ArrayList(); - for (List point : points) { - double x, y; - x = point.get(0).doubleValue(); - y = point.get(1).doubleValue(); - var pointToAdd = new Point3(x, y, 0.0); - pointsList.add(pointToAdd); + try { + // each entry should be an xy pair + var pointsList = new ArrayList(); + for (List point : points) { + double x, y; + x = point.get(0).doubleValue(); + y = point.get(1).doubleValue(); + var pointToAdd = new Point3(x, y, 0.0); + pointsList.add(pointToAdd); + } + System.out.println(pointsList.toString()); + if (VisionManager.getCurrentUIVisionProcess().pipelineManager.getCurrentPipeline().settings instanceof StandardCVPipelineSettings) { + var settings = (StandardCVPipelineSettings) VisionManager.getCurrentUIVisionProcess().pipelineManager.getCurrentPipeline().settings; + settings.targetCornerMat.fromList(pointsList); + } + } catch (Exception e) { + ctx.status(500); } - System.out.println(pointsList.toString()); - if (VisionManager.getCurrentUIVisionProcess().pipelineManager.getCurrentPipeline().settings instanceof StandardCVPipelineSettings) { - var settings = (StandardCVPipelineSettings) VisionManager.getCurrentUIVisionProcess().pipelineManager.getCurrentPipeline().settings; - settings.targetCornerMat.fromList(pointsList); + } + + public static void onInstallOrUpdate(Context ctx) { + Platform p = Platform.getCurrentPlatform(); + try { + if (p == Platform.LINUX_RASPBIAN || p == Platform.LINUX_64) { + UploadedFile file = ctx.uploadedFile("file"); + Path filePath; + if (file != null) { + filePath = Paths.get(ProgramDirectoryUtilities.getProgramDirectory(), file.getFilename()); + File target = new File(filePath.toString()); + OutputStream stream = new FileOutputStream(target); + file.getContent().transferTo(stream); + stream.close(); + } else { + filePath = Paths.get(new File(Main.class.getProtectionDomain().getCodeSource().getLocation().toURI()).getPath()); // quirk to get the current file directory + } + Helpers.setService(filePath); + ctx.status(200); + } else { + ctx.result("Only Linux Platforms Support this feature"); + ctx.status(500); + } + } catch (Exception e) { + ctx.result(e.toString()); + ctx.status(500); } } } diff --git a/chameleon-server/src/main/java/com/chameleonvision/web/Server.java b/chameleon-server/src/main/java/com/chameleonvision/web/Server.java index a9617edbb..1561302bf 100644 --- a/chameleon-server/src/main/java/com/chameleonvision/web/Server.java +++ b/chameleon-server/src/main/java/com/chameleonvision/web/Server.java @@ -35,6 +35,7 @@ public class Server { app.post("/api/settings/snapshot", RequestHandler::onSnapshot); app.post("/api/settings/endCalibration", RequestHandler::onCalibrationEnding); app.post("/api/vision/pnpModel", RequestHandler::onPnpModel); + app.post("/api/install", RequestHandler::onInstallOrUpdate); app.start(port); } } diff --git a/chameleon-server/src/main/java/com/chameleonvision/web/SocketHandler.java b/chameleon-server/src/main/java/com/chameleonvision/web/SocketHandler.java index d8b7b5302..5731fa6cf 100644 --- a/chameleon-server/src/main/java/com/chameleonvision/web/SocketHandler.java +++ b/chameleon-server/src/main/java/com/chameleonvision/web/SocketHandler.java @@ -11,7 +11,6 @@ import com.chameleonvision.vision.enums.ImageRotationMode; import com.chameleonvision.vision.enums.StreamDivisor; import com.chameleonvision.vision.pipeline.CVPipeline; import com.chameleonvision.vision.pipeline.impl.StandardCVPipeline; -import com.chameleonvision.vision.pipeline.CVPipelineSettings; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; @@ -26,7 +25,6 @@ import org.msgpack.jackson.dataformat.MessagePackFactory; import java.lang.reflect.Field; import java.nio.ByteBuffer; import java.util.*; -import java.util.List; import java.util.stream.Collectors; @@ -53,8 +51,8 @@ public class SocketHandler { @SuppressWarnings("unchecked") void onBinaryMessage(WsBinaryMessageContext context) throws Exception { - Map deserialized = objectMapper.readValue(ArrayUtils.toPrimitive(context.data()), new TypeReference<>() { - }); + Map deserialized = objectMapper.readValue((byte[]) ArrayUtils.toPrimitive(context.data()), + new TypeReference<>(){}); for (Map.Entry entry : deserialized.entrySet()) { try { VisionProcess currentProcess = VisionManager.getCurrentUIVisionProcess(); @@ -266,11 +264,11 @@ public class SocketHandler { tmp.put("streamDivisor", currentVisionProcess.cameraStreamer.getDivisor().ordinal()); tmp.put("resolution", currentVisionProcess.getCamera().getProperties().getCurrentVideoModeIndex()); tmp.put("tilt", currentVisionProcess.getCamera().getProperties().getTilt().getDegrees()); - + List calibrations = currentCamera.getAllCalibrationData().stream() .map(CameraCalibrationConfig.UICameraCalibrationConfig::new).collect(Collectors.toList()); tmp.put("calibration", calibrations); - + return tmp; }