From c46ec3066d5a05bdba6c257fd5164529343bd723 Mon Sep 17 00:00:00 2001 From: Banks Troutman Date: Thu, 26 Sep 2019 01:52:20 -0400 Subject: [PATCH 01/18] Update OpenCV to new WPI Maven Repo Adds support for Linux AARCH64 --- Main/pom.xml | 57 ++++++++++++++++--- .../chameleonvision/vision/camera/Camera.java | 13 +++-- 2 files changed, 59 insertions(+), 11 deletions(-) diff --git a/Main/pom.xml b/Main/pom.xml index 25a606544..78a85b50a 100644 --- a/Main/pom.xml +++ b/Main/pom.xml @@ -49,6 +49,11 @@ WPI Maven repo https://first.wpi.edu/FRC/roborio/maven/release + + WPIArtifactory + WPILib Artifactory Server-releases + https://frcmaven.wpi.edu:443/artifactory/release + @@ -84,7 +89,6 @@ gson 2.8.5 - org.springframework spring-beans @@ -95,11 +99,17 @@ commons-lang3 3.9 + + com.fasterxml.jackson.core + jackson-databind + 2.10.0.pr1 + @@ -182,6 +192,43 @@ + + + edu.wpi.first.thirdparty.frc2020.opencv + opencv-java + 3.4.7-1 + + + edu.wpi.first.thirdparty.frc2020.opencv + opencv-jni + 3.4.7-1 + linuxaarch64bionic + + + edu.wpi.first.thirdparty.frc2020.opencv + opencv-jni + 3.4.7-1 + linuxraspbian + + + edu.wpi.first.thirdparty.frc2020.opencv + opencv-jni + 3.4.7-1 + linuxx86-64 + + + edu.wpi.first.thirdparty.frc2020.opencv + opencv-jni + 3.4.7-1 + osxx86-64 + + + edu.wpi.first.thirdparty.frc2020.opencv + opencv-jni + 3.4.7-1 + windowsx86-64 + + diff --git a/Main/src/main/java/com/chameleonvision/vision/camera/Camera.java b/Main/src/main/java/com/chameleonvision/vision/camera/Camera.java index 6e2af5d8f..709f07a18 100644 --- a/Main/src/main/java/com/chameleonvision/vision/camera/Camera.java +++ b/Main/src/main/java/com/chameleonvision/vision/camera/Camera.java @@ -1,11 +1,13 @@ package com.chameleonvision.vision.camera; +import com.chameleonvision.CameraException; import com.chameleonvision.settings.SettingsManager; import com.chameleonvision.vision.Pipeline; import com.chameleonvision.web.ServerHandler; import edu.wpi.cscore.*; import edu.wpi.first.cameraserver.CameraServer; import org.opencv.core.Mat; +import org.springframework.core.env.Environment; import java.util.Arrays; import java.util.HashMap; @@ -80,7 +82,12 @@ public class Camera { var initTimeMs = (System.nanoTime() - initTimeout) / 1e6; System.out.printf("Camera initialized in %.2fms\n", initTimeMs); } - availableVideoModes = Arrays.stream(UsbCam.enumerateVideoModes()).filter(v -> v.fps >= MINIMUM_FPS && v.width >= MINIMUM_WIDTH && v.height >= MINIMUM_HEIGHT).toArray(VideoMode[]::new); + var trueVideoModes = UsbCam.enumerateVideoModes(); + availableVideoModes = Arrays.stream(trueVideoModes).filter(v -> v.fps >= MINIMUM_FPS && v.width >= MINIMUM_WIDTH && v.height >= MINIMUM_HEIGHT && v.pixelFormat == VideoMode.PixelFormat.kYUYV).toArray(VideoMode[]::new); + if (availableVideoModes.length == 0) { + System.err.println("Camera not supported!"); + throw new RuntimeException(new CameraException(CameraException.CameraExceptionType.BAD_CAMERA)); + } if (videoModeIndex <= availableVideoModes.length - 1) { setCamVideoMode(videoModeIndex, false); } else { @@ -109,9 +116,7 @@ public class Camera { private void setCamVideoMode(CamVideoMode newVideoMode, boolean updateCvSource) { var prevVideoMode = this.camVideoMode; this.camVideoMode = newVideoMode; - UsbCam.setPixelFormat(newVideoMode.getActualPixelFormat()); - UsbCam.setFPS(newVideoMode.fps); - UsbCam.setResolution(newVideoMode.width, newVideoMode.height); + UsbCam.setVideoMode(newVideoMode.getActualPixelFormat(), newVideoMode.width, newVideoMode.height, newVideoMode.fps); // update camera values camVals = new CameraValues(this); From c5de2f8f5ed0c032a4b2eb8a5e01876d1c35a994 Mon Sep 17 00:00:00 2001 From: Banks Troutman Date: Thu, 26 Sep 2019 14:19:30 -0400 Subject: [PATCH 02/18] Updated Maven Deps to the new WPILib Artifactory, added AARCH64-Bionic support (Jetson) --- Main/pom.xml | 78 +++++++------------ .../main/java/com/chameleonvision/Main.java | 14 ++++ .../chameleonvision/vision/camera/Camera.java | 6 +- .../vision/camera/CameraManager.java | 1 - 4 files changed, 41 insertions(+), 58 deletions(-) diff --git a/Main/pom.xml b/Main/pom.xml index 78a85b50a..0e088f7c3 100644 --- a/Main/pom.xml +++ b/Main/pom.xml @@ -44,15 +44,15 @@ + + + + + WPI - WPI Maven repo - https://first.wpi.edu/FRC/roborio/maven/release - - - WPIArtifactory WPILib Artifactory Server-releases - https://frcmaven.wpi.edu:443/artifactory/release + https://frcmaven.wpi.edu:443/artifactory/development @@ -116,31 +116,37 @@ edu.wpi.first.cscore cscore-java - 2019.4.1 + 2019.4.1-176-ga5650b9 edu.wpi.first.cscore cscore-jni - 2019.4.1 - linuxathena + 2019.4.1-176-ga5650b9 + linuxaarch64bionic edu.wpi.first.cscore cscore-jni - 2019.4.1 + 2019.4.1-176-ga5650b9 linuxraspbian edu.wpi.first.cscore cscore-jni - 2019.4.1 + 2019.4.1-176-ga5650b9 linuxx86-64 edu.wpi.first.cscore cscore-jni - 2019.4.1 + 2019.4.1-176-ga5650b9 + osxx86-64 + + + edu.wpi.first.cscore + cscore-jni + 2019.4.1-176-ga5650b9 windowsx86-64 @@ -148,39 +154,39 @@ edu.wpi.first.cameraserver cameraserver-java - 2019.4.1 + 2019.4.1-176-ga5650b9 edu.wpi.first.ntcore ntcore-java - 2019.4.1 + 2019.4.1-176-ga5650b9 edu.wpi.first.ntcore ntcore-jni - 2019.4.1 - linuxathena + 2019.4.1-176-ga5650b9 + osxx86-64 edu.wpi.first.ntcore ntcore-jni - 2019.4.1 + 2019.4.1-176-ga5650b9 linuxraspbian edu.wpi.first.ntcore ntcore-jni - 2019.4.1 + 2019.4.1-176-ga5650b9 linuxx86-64 edu.wpi.first.ntcore ntcore-jni - 2019.4.1 + 2019.4.1-176-ga5650b9 windowsx86-64 @@ -188,11 +194,10 @@ edu.wpi.first.wpiutil wpiutil-java - 2019.4.1 + 2019.4.1-176-ga5650b9 - edu.wpi.first.thirdparty.frc2020.opencv opencv-java @@ -228,36 +233,5 @@ 3.4.7-1 windowsx86-64 - diff --git a/Main/src/main/java/com/chameleonvision/Main.java b/Main/src/main/java/com/chameleonvision/Main.java index 5f1ba3330..ea276512e 100644 --- a/Main/src/main/java/com/chameleonvision/Main.java +++ b/Main/src/main/java/com/chameleonvision/Main.java @@ -4,15 +4,29 @@ import com.chameleonvision.settings.SettingsManager; import com.chameleonvision.vision.camera.CameraManager; import com.chameleonvision.vision.process.VisionProcess; import com.chameleonvision.web.Server; +import edu.wpi.cscore.CameraServerCvJNI; +import edu.wpi.cscore.CameraServerJNI; import edu.wpi.first.networktables.NetworkTableInstance; +import java.io.IOException; + public class Main { public static void main(String[] args) { + // Attempt to load the JNI Libraries + try { + CameraServerJNI.forceLoad(); + CameraServerCvJNI.forceLoad(); + } catch (IOException e) { + var errorStr = SettingsManager.getCurrentPlatform().equals(SettingsManager.Platform.UNSUPPORTED) ? "Unsupported platform!" : "Failed to load JNI Libraries!"; + throw new RuntimeException(errorStr); + } + if (CameraManager.initializeCameras()) { SettingsManager.initialize(); for (var camSet : CameraManager.getAllCamerasByName().entrySet()) { new Thread(new VisionProcess(camSet.getValue())).start(); } + NetworkTableInstance.getDefault().startClientTeam(SettingsManager.GeneralSettings.team_number); // NetworkTableInstance.getDefault().startClient("localhost"); Server.main(8888); diff --git a/Main/src/main/java/com/chameleonvision/vision/camera/Camera.java b/Main/src/main/java/com/chameleonvision/vision/camera/Camera.java index 709f07a18..fd9fd3105 100644 --- a/Main/src/main/java/com/chameleonvision/vision/camera/Camera.java +++ b/Main/src/main/java/com/chameleonvision/vision/camera/Camera.java @@ -36,8 +36,6 @@ public class Camera { private CamVideoMode camVideoMode; private int currentPipelineIndex; private HashMap pipelines; - private long initTimeout; - public Camera(String cameraName) { this(cameraName, DEFAULT_FOV); @@ -71,7 +69,7 @@ public class Camera { // set up video modes according to minimums if (SettingsManager.getCurrentPlatform() == SettingsManager.Platform.WINDOWS_64 && !UsbCam.isConnected()) { System.out.print("Waiting on camera... "); - initTimeout = System.nanoTime(); + long initTimeout = System.nanoTime(); while(!UsbCam.isConnected()) { //TODO add a time sleep, can wait only so long before giving up @@ -96,8 +94,6 @@ public class Camera { cvSink = cs.getVideo(UsbCam); cvSource = cs.putVideo(name, camVals.ImageWidth, camVals.ImageHeight); - var s = (MjpegServer) cs.getServer("serve_" + name); - CameraManager.CameraPorts.put(name, s.getPort()); } VideoMode[] getAvailableVideoModes() { diff --git a/Main/src/main/java/com/chameleonvision/vision/camera/CameraManager.java b/Main/src/main/java/com/chameleonvision/vision/camera/CameraManager.java index 1ea46c803..03f1a8f53 100644 --- a/Main/src/main/java/com/chameleonvision/vision/camera/CameraManager.java +++ b/Main/src/main/java/com/chameleonvision/vision/camera/CameraManager.java @@ -20,7 +20,6 @@ import java.util.List; public class CameraManager { private static final Path CamConfigPath = Paths.get(SettingsManager.SettingsPath.toString(), "Cams"); - public static HashMap CameraPorts = new HashMap<>(); private static HashMap AllCamerasByName = new HashMap<>(); From d3083cceb13a486ec8d72ff93fb08d52eba1cac2 Mon Sep 17 00:00:00 2001 From: Banks Troutman Date: Thu, 26 Sep 2019 14:20:17 -0400 Subject: [PATCH 03/18] Version number fix --- Main/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Main/pom.xml b/Main/pom.xml index 0e088f7c3..92da18925 100644 --- a/Main/pom.xml +++ b/Main/pom.xml @@ -5,7 +5,7 @@ 4.0.0 org.chameleon-vision.main chameleon-vision - 1.0.2-BETA + 1.0.3-BETA From 7a49541d45cb19a7eb7cefa12442b600e63210c2 Mon Sep 17 00:00:00 2001 From: Banks Troutman Date: Thu, 26 Sep 2019 15:01:51 -0400 Subject: [PATCH 04/18] Fix settings paths for Unix systems --- .../java/com/chameleonvision/settings/SettingsManager.java | 4 ++-- .../java/com/chameleonvision/vision/camera/CameraManager.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Main/src/main/java/com/chameleonvision/settings/SettingsManager.java b/Main/src/main/java/com/chameleonvision/settings/SettingsManager.java index 79b759405..95840fe10 100644 --- a/Main/src/main/java/com/chameleonvision/settings/SettingsManager.java +++ b/Main/src/main/java/com/chameleonvision/settings/SettingsManager.java @@ -14,7 +14,7 @@ import java.nio.file.Path; import java.nio.file.Paths; public class SettingsManager { - public static final Path SettingsPath = Paths.get(System.getProperty("user.dir"), "Settings"); + public static final Path SettingsPath = Paths.get(System.getProperty("user.dir"), "settings"); public static com.chameleonvision.vision.GeneralSettings GeneralSettings; private SettingsManager() {} @@ -79,7 +79,7 @@ public class SettingsManager { private static void initGeneralSettings() { FileHelper.CheckPath(SettingsPath); try { - GeneralSettings = new Gson().fromJson(new FileReader(Paths.get(SettingsPath.toString(), "Settings.json").toString()), com.chameleonvision.vision.GeneralSettings.class); + GeneralSettings = new Gson().fromJson(new FileReader(Paths.get(SettingsPath.toString(), "settings.json").toString()), com.chameleonvision.vision.GeneralSettings.class); } catch (FileNotFoundException e) { GeneralSettings = new GeneralSettings(); } diff --git a/Main/src/main/java/com/chameleonvision/vision/camera/CameraManager.java b/Main/src/main/java/com/chameleonvision/vision/camera/CameraManager.java index 03f1a8f53..098ecf457 100644 --- a/Main/src/main/java/com/chameleonvision/vision/camera/CameraManager.java +++ b/Main/src/main/java/com/chameleonvision/vision/camera/CameraManager.java @@ -19,7 +19,7 @@ import java.util.List; public class CameraManager { - private static final Path CamConfigPath = Paths.get(SettingsManager.SettingsPath.toString(), "Cams"); + private static final Path CamConfigPath = Paths.get(SettingsManager.SettingsPath.toString(), "cameras"); private static HashMap AllCamerasByName = new HashMap<>(); From 055194f9a7e2c2561f19f8e285937ef9996bf0b8 Mon Sep 17 00:00:00 2001 From: ori agranat Date: Sun, 29 Sep 2019 00:05:20 +0300 Subject: [PATCH 05/18] added sigmoid function --- .../com/chameleonvision/Handler/MathHandler.java | 15 +++++++++++++++ .../chameleonvision/vision/process/CVProcess.java | 6 +++--- 2 files changed, 18 insertions(+), 3 deletions(-) create mode 100644 Main/src/main/java/com/chameleonvision/Handler/MathHandler.java diff --git a/Main/src/main/java/com/chameleonvision/Handler/MathHandler.java b/Main/src/main/java/com/chameleonvision/Handler/MathHandler.java new file mode 100644 index 000000000..6bfe73377 --- /dev/null +++ b/Main/src/main/java/com/chameleonvision/Handler/MathHandler.java @@ -0,0 +1,15 @@ +package com.chameleonvision.Handler; +import java.lang.Math; +public class MathHandler { + MathHandler(){} + public static double sigmoid(double x){ + double bias = 0; + double a = 5; + double b = -0.05; + double k = 200; + if (x < 50){ + bias = -1.339; + } + return ((k / (1 + Math.pow(Math.E,(a + (b * x))))) + bias); + } +} diff --git a/Main/src/main/java/com/chameleonvision/vision/process/CVProcess.java b/Main/src/main/java/com/chameleonvision/vision/process/CVProcess.java index 52b9d7f23..d701efbf5 100644 --- a/Main/src/main/java/com/chameleonvision/vision/process/CVProcess.java +++ b/Main/src/main/java/com/chameleonvision/vision/process/CVProcess.java @@ -1,11 +1,11 @@ package com.chameleonvision.vision.process; import com.chameleonvision.vision.camera.CameraValues; +import com.chameleonvision.Handler.MathHandler; import org.apache.commons.math3.util.FastMath; import org.jetbrains.annotations.NotNull; import org.opencv.core.*; import org.opencv.imgproc.Imgproc; - import java.util.*; @SuppressWarnings("WeakerAccess") @@ -57,8 +57,8 @@ public class CVProcess { for (MatOfPoint Contour : InputContours) { try { double contourArea = Imgproc.contourArea(Contour); - double minArea = (area.get(0) * CamVals.ImageArea) / 100; - double maxArea = (area.get(1) * CamVals.ImageArea) / 100; + double minArea = (MathHandler.sigmoid(area.get(0)) * CamVals.ImageArea) / 100; + double maxArea = (MathHandler.sigmoid(area.get(1)) * CamVals.ImageArea) / 100; if (contourArea <= minArea || contourArea >= maxArea) { continue; } From eb495284a57f4ed59407083f245441545973c725 Mon Sep 17 00:00:00 2001 From: ori agranat Date: Sat, 28 Sep 2019 14:26:11 -0700 Subject: [PATCH 06/18] Update MathHandler.java --- Main/src/main/java/com/chameleonvision/Handler/MathHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Main/src/main/java/com/chameleonvision/Handler/MathHandler.java b/Main/src/main/java/com/chameleonvision/Handler/MathHandler.java index 6bfe73377..40971fffc 100644 --- a/Main/src/main/java/com/chameleonvision/Handler/MathHandler.java +++ b/Main/src/main/java/com/chameleonvision/Handler/MathHandler.java @@ -8,7 +8,7 @@ public class MathHandler { double b = -0.05; double k = 200; if (x < 50){ - bias = -1.339; + bias = -1.338; } return ((k / (1 + Math.pow(Math.E,(a + (b * x))))) + bias); } From 54412657ecca20066a42e7b3c94ab9e0dd87aedb Mon Sep 17 00:00:00 2001 From: ori agranat Date: Sat, 28 Sep 2019 14:27:05 -0700 Subject: [PATCH 07/18] Revert "Update MathHandler.java" This reverts commit eb495284a57f4ed59407083f245441545973c725. --- Main/src/main/java/com/chameleonvision/Handler/MathHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Main/src/main/java/com/chameleonvision/Handler/MathHandler.java b/Main/src/main/java/com/chameleonvision/Handler/MathHandler.java index 40971fffc..6bfe73377 100644 --- a/Main/src/main/java/com/chameleonvision/Handler/MathHandler.java +++ b/Main/src/main/java/com/chameleonvision/Handler/MathHandler.java @@ -8,7 +8,7 @@ public class MathHandler { double b = -0.05; double k = 200; if (x < 50){ - bias = -1.338; + bias = -1.339; } return ((k / (1 + Math.pow(Math.E,(a + (b * x))))) + bias); } From 55902c45e7cefc4b57375abce7777115778feb3e Mon Sep 17 00:00:00 2001 From: ori agranat Date: Sat, 28 Sep 2019 14:27:50 -0700 Subject: [PATCH 08/18] fixed value going under 0 --- Main/src/main/java/com/chameleonvision/Handler/MathHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Main/src/main/java/com/chameleonvision/Handler/MathHandler.java b/Main/src/main/java/com/chameleonvision/Handler/MathHandler.java index 6bfe73377..40971fffc 100644 --- a/Main/src/main/java/com/chameleonvision/Handler/MathHandler.java +++ b/Main/src/main/java/com/chameleonvision/Handler/MathHandler.java @@ -8,7 +8,7 @@ public class MathHandler { double b = -0.05; double k = 200; if (x < 50){ - bias = -1.339; + bias = -1.338; } return ((k / (1 + Math.pow(Math.E,(a + (b * x))))) + bias); } From 1548d3aa14e8add86d95a9a386d950eae15436cf Mon Sep 17 00:00:00 2001 From: ori agranat Date: Sun, 29 Sep 2019 15:56:26 +0300 Subject: [PATCH 09/18] added default webserver port change from arguments --- .../main/java/com/chameleonvision/Main.java | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/Main/src/main/java/com/chameleonvision/Main.java b/Main/src/main/java/com/chameleonvision/Main.java index ea276512e..57c0c8c4b 100644 --- a/Main/src/main/java/com/chameleonvision/Main.java +++ b/Main/src/main/java/com/chameleonvision/Main.java @@ -11,7 +11,22 @@ import edu.wpi.first.networktables.NetworkTableInstance; import java.io.IOException; public class Main { + private static final String PORT_KEY = "-port"; public static void main(String[] args) { + int port = 8888; + for(int i=0; i Date: Sun, 29 Sep 2019 17:39:58 +0300 Subject: [PATCH 10/18] initial pipeline update --- .../src/main/java/com/chameleonvision/Main.java | 5 +---- .../vision/camera/CameraManager.java | 17 +++++++++++++++++ .../vision/process/VisionProcess.java | 4 ++-- .../com/chameleonvision/web/ServerHandler.java | 3 ++- 4 files changed, 22 insertions(+), 7 deletions(-) diff --git a/Main/src/main/java/com/chameleonvision/Main.java b/Main/src/main/java/com/chameleonvision/Main.java index 57c0c8c4b..36e91cb36 100644 --- a/Main/src/main/java/com/chameleonvision/Main.java +++ b/Main/src/main/java/com/chameleonvision/Main.java @@ -38,10 +38,7 @@ public class Main { if (CameraManager.initializeCameras()) { SettingsManager.initialize(); - for (var camSet : CameraManager.getAllCamerasByName().entrySet()) { - new Thread(new VisionProcess(camSet.getValue())).start(); - } - + CameraManager.initializeThreads(); NetworkTableInstance.getDefault().startClientTeam(SettingsManager.GeneralSettings.team_number); // NetworkTableInstance.getDefault().startClient("localhost"); System.out.println("Starting WebServer At Port:" + port); diff --git a/Main/src/main/java/com/chameleonvision/vision/camera/CameraManager.java b/Main/src/main/java/com/chameleonvision/vision/camera/CameraManager.java index 098ecf457..891e0e6e6 100644 --- a/Main/src/main/java/com/chameleonvision/vision/camera/CameraManager.java +++ b/Main/src/main/java/com/chameleonvision/vision/camera/CameraManager.java @@ -3,7 +3,9 @@ package com.chameleonvision.vision.camera; import com.chameleonvision.CameraException; import com.chameleonvision.FileHelper; import com.chameleonvision.settings.SettingsManager; +import com.chameleonvision.vision.GeneralSettings; import com.chameleonvision.vision.Pipeline; +import com.chameleonvision.vision.process.VisionProcess; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import edu.wpi.cscore.UsbCamera; @@ -22,6 +24,7 @@ public class CameraManager { private static final Path CamConfigPath = Paths.get(SettingsManager.SettingsPath.toString(), "cameras"); private static HashMap AllCamerasByName = new HashMap<>(); + private static HashMap AllVisionProcessesByName = new HashMap<>(); static HashMap AllUsbCameraInfosByName = new HashMap<>() {{ var suffix = 0; @@ -67,6 +70,14 @@ public class CameraManager { return true; } + public static void initializeThreads(){ + for (var camSet : AllCamerasByName.entrySet()) { + VisionProcess visionProcess = new VisionProcess(camSet.getValue()); + AllVisionProcessesByName.put(camSet.getKey(),visionProcess); + new Thread(visionProcess).start(); + } + } + private static boolean addCamera(Camera camera, String cameraName) { if (AllCamerasByName.containsKey(cameraName)) return false; for (int i = 0; i < 10;i++){ @@ -115,6 +126,12 @@ public class CameraManager { } throw new CameraException(CameraException.CameraExceptionType.NO_CAMERA); } + public static VisionProcess getCurrentCameraProcess() throws CameraException{ + if (!SettingsManager.GeneralSettings.curr_camera.equals("")){ + return AllVisionProcessesByName.get(SettingsManager.GeneralSettings.curr_camera); + } + throw new CameraException(CameraException.CameraExceptionType.NO_CAMERA); + } public static void saveCameras() { for (var entry : AllCamerasByName.entrySet()) { diff --git a/Main/src/main/java/com/chameleonvision/vision/process/VisionProcess.java b/Main/src/main/java/com/chameleonvision/vision/process/VisionProcess.java index fbb04a1b9..20fe45b7f 100644 --- a/Main/src/main/java/com/chameleonvision/vision/process/VisionProcess.java +++ b/Main/src/main/java/com/chameleonvision/vision/process/VisionProcess.java @@ -20,8 +20,8 @@ public class VisionProcess implements Runnable { private final String cameraName; private final CameraProcess cameraProcess; // NetworkTables - private NetworkTableEntry ntPipelineEntry; - private NetworkTableEntry ntDriverModeEntry; + public NetworkTableEntry ntPipelineEntry; + public NetworkTableEntry ntDriverModeEntry; private NetworkTableEntry ntYawEntry; private NetworkTableEntry ntPitchEntry; private NetworkTableEntry ntDistanceEntry; diff --git a/Main/src/main/java/com/chameleonvision/web/ServerHandler.java b/Main/src/main/java/com/chameleonvision/web/ServerHandler.java index 453d6d6c7..3ccc992c2 100644 --- a/Main/src/main/java/com/chameleonvision/web/ServerHandler.java +++ b/Main/src/main/java/com/chameleonvision/web/ServerHandler.java @@ -103,7 +103,8 @@ public class ServerHandler { var pipelineNumber = Integer.parseInt(newPipeline.replace("pipeline", "")); System.out.printf("Changing pipeline to %s\n", newPipeline); CameraManager.setCurrentPipeline(pipelineNumber); -// broadcastMessage(allFieldsToMap(CameraManager.getCurrentPipeline())); + var Proccess = CameraManager.getCurrentCameraProcess(); + Proccess.ntPipelineEntry.setString(newPipeline); broadcastMessage(allFieldsToMap(CameraManager.getCurrentPipeline())); break; From 4e6bd3e75a5f5d492ef8eef80f1a9ab87d1029cb Mon Sep 17 00:00:00 2001 From: ori agranat Date: Sun, 29 Sep 2019 08:01:00 -0700 Subject: [PATCH 11/18] bug fixed the sync and bug fixed the pipe change from nt --- .../chameleonvision/vision/process/VisionProcess.java | 11 +++++++---- .../java/com/chameleonvision/web/ServerHandler.java | 2 +- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/Main/src/main/java/com/chameleonvision/vision/process/VisionProcess.java b/Main/src/main/java/com/chameleonvision/vision/process/VisionProcess.java index 20fe45b7f..feae97ead 100644 --- a/Main/src/main/java/com/chameleonvision/vision/process/VisionProcess.java +++ b/Main/src/main/java/com/chameleonvision/vision/process/VisionProcess.java @@ -87,11 +87,14 @@ public class VisionProcess implements Runnable { System.err.println(e.toString()); } camera.setBrightness(pipeline.brightness); - HashMap pipeChange = new HashMap<>(); - pipeChange.put("curr_pipeline", ntPipelineIndex); - ServerHandler.broadcastMessage(pipeChange); - ServerHandler.sendFullSettings(); + if (SettingsManager.GeneralSettings.curr_camera.equals(cameraName)){ + SettingsManager.GeneralSettings.curr_pipeline = ntPipelineIndex; + HashMap pipeChange = new HashMap<>(); + pipeChange.put("curr_pipeline", ntPipelineIndex); + ServerHandler.broadcastMessage(pipeChange); + ServerHandler.sendFullSettings(); + } } else { ntPipelineEntry.setString("pipeline" + camera.getCurrentPipelineIndex()); } diff --git a/Main/src/main/java/com/chameleonvision/web/ServerHandler.java b/Main/src/main/java/com/chameleonvision/web/ServerHandler.java index 3ccc992c2..40c113c77 100644 --- a/Main/src/main/java/com/chameleonvision/web/ServerHandler.java +++ b/Main/src/main/java/com/chameleonvision/web/ServerHandler.java @@ -104,7 +104,7 @@ public class ServerHandler { System.out.printf("Changing pipeline to %s\n", newPipeline); CameraManager.setCurrentPipeline(pipelineNumber); var Proccess = CameraManager.getCurrentCameraProcess(); - Proccess.ntPipelineEntry.setString(newPipeline); + Proccess.ntPipelineEntry.setString("pipeline"+pipelineNumber); broadcastMessage(allFieldsToMap(CameraManager.getCurrentPipeline())); break; From 74d5b4388f4ffa7e09e4914f378e0a0f034741ee Mon Sep 17 00:00:00 2001 From: Banks Troutman Date: Mon, 30 Sep 2019 19:37:47 -0400 Subject: [PATCH 12/18] Update to latest cscore build for PS3Eye support --- Main/pom.xml | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/Main/pom.xml b/Main/pom.xml index 92da18925..e704db61a 100644 --- a/Main/pom.xml +++ b/Main/pom.xml @@ -116,37 +116,39 @@ edu.wpi.first.cscore cscore-java - 2019.4.1-176-ga5650b9 + 2019.4.1-136-gb2861f8 + edu.wpi.first.cscore cscore-jni - 2019.4.1-176-ga5650b9 + 2019.4.1-136-gb2861f8 linuxraspbian edu.wpi.first.cscore cscore-jni - 2019.4.1-176-ga5650b9 + 2019.4.1-136-gb2861f8 linuxx86-64 edu.wpi.first.cscore cscore-jni - 2019.4.1-176-ga5650b9 + 2019.4.1-136-gb2861f8 osxx86-64 edu.wpi.first.cscore cscore-jni - 2019.4.1-176-ga5650b9 + 2019.4.1-136-gb2861f8 windowsx86-64 From 030a089d6bde4fbbce68da4a904f7f6e07ae1495 Mon Sep 17 00:00:00 2001 From: Banks Troutman Date: Mon, 30 Sep 2019 19:43:42 -0400 Subject: [PATCH 13/18] Fix for cscore version --- Main/pom.xml | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/Main/pom.xml b/Main/pom.xml index e704db61a..572bc373d 100644 --- a/Main/pom.xml +++ b/Main/pom.xml @@ -116,39 +116,37 @@ edu.wpi.first.cscore cscore-java - 2019.4.1-136-gb2861f8 + 2019.4.1-200-g2271570 - edu.wpi.first.cscore cscore-jni - 2019.4.1-136-gb2861f8 + 2019.4.1-200-g2271570 linuxraspbian edu.wpi.first.cscore cscore-jni - 2019.4.1-136-gb2861f8 + 2019.4.1-200-g2271570 linuxx86-64 edu.wpi.first.cscore cscore-jni - 2019.4.1-136-gb2861f8 + 2019.4.1-200-g2271570 osxx86-64 edu.wpi.first.cscore cscore-jni - 2019.4.1-136-gb2861f8 + 2019.4.1-200-g2271570 windowsx86-64 From 507592735c010f8f55deac915996864be4ccb452 Mon Sep 17 00:00:00 2001 From: Banks Troutman Date: Tue, 1 Oct 2019 02:18:55 -0400 Subject: [PATCH 14/18] Changed all pipeline sets to integer --- Main/chameleon-vision.iml | 53 +++++++++++++------ .../vision/camera/CameraManager.java | 29 +++++----- .../vision/process/PipelineResult.java | 1 + .../vision/process/VisionProcess.java | 23 ++++---- .../chameleonvision/web/ServerHandler.java | 8 ++- 5 files changed, 66 insertions(+), 48 deletions(-) diff --git a/Main/chameleon-vision.iml b/Main/chameleon-vision.iml index d298ab873..d285b15a4 100644 --- a/Main/chameleon-vision.iml +++ b/Main/chameleon-vision.iml @@ -10,6 +10,23 @@ + + + + + + + + + + + + + + + + + @@ -40,25 +57,27 @@ - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Main/src/main/java/com/chameleonvision/vision/camera/CameraManager.java b/Main/src/main/java/com/chameleonvision/vision/camera/CameraManager.java index 891e0e6e6..ebbb08bef 100644 --- a/Main/src/main/java/com/chameleonvision/vision/camera/CameraManager.java +++ b/Main/src/main/java/com/chameleonvision/vision/camera/CameraManager.java @@ -16,8 +16,10 @@ import java.io.*; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; import java.util.List; +import java.util.stream.Collectors; public class CameraManager { @@ -49,38 +51,38 @@ public class CameraManager { public static boolean initializeCameras() { if (AllUsbCameraInfosByName.size() == 0) return false; FileHelper.CheckPath(CamConfigPath); - for (var entry : AllUsbCameraInfosByName.entrySet()) { - var camPath = Paths.get(CamConfigPath.toString(), String.format("%s.json", entry.getKey())); + AllUsbCameraInfosByName.forEach((key, value) -> { + var camPath = Paths.get(CamConfigPath.toString(), String.format("%s.json", key)); File camJsonFile = new File(camPath.toString()); if (camJsonFile.exists() && camJsonFile.length() != 0) { try { Gson gson = new GsonBuilder().registerTypeAdapter(Camera.class, new CameraDeserializer()).create(); var camJsonFileReader = new FileReader(camPath.toString()); var gsonRead = gson.fromJson(camJsonFileReader, Camera.class); - AllCamerasByName.put(entry.getKey(), gsonRead); + AllCamerasByName.put(key, gsonRead); } catch (FileNotFoundException ex) { ex.printStackTrace(); } } else { - if (!addCamera(new Camera(entry.getKey()), entry.getKey())) { + if (!addCamera(new Camera(key), key)) { System.err.println("Failed to add camera! Already exists!"); } } - } + }); return true; } public static void initializeThreads(){ - for (var camSet : AllCamerasByName.entrySet()) { - VisionProcess visionProcess = new VisionProcess(camSet.getValue()); - AllVisionProcessesByName.put(camSet.getKey(),visionProcess); + AllCamerasByName.forEach((key, value) -> { + VisionProcess visionProcess = new VisionProcess(value); + AllVisionProcessesByName.put(key, visionProcess); new Thread(visionProcess).start(); - } + }); } private static boolean addCamera(Camera camera, String cameraName) { if (AllCamerasByName.containsKey(cameraName)) return false; - for (int i = 0; i < 10;i++){ + for (int i = 0; i < 10; i++){ camera.addPipeline(); // simple fix to create more pipelines for now } AllCamerasByName.put(cameraName, camera); @@ -118,11 +120,8 @@ public class CameraManager { public static List getResolutionList() throws CameraException { if (!SettingsManager.GeneralSettings.curr_camera.equals("")) { - List list = new ArrayList<>(); - for (var res : CameraManager.getCamera(SettingsManager.GeneralSettings.curr_camera).getAvailableVideoModes()) { - list.add(String.format("%s X %s at %s fps", res.width, res.height, res.fps)); - } - return list; + return Arrays.stream(CameraManager.getCamera(SettingsManager.GeneralSettings.curr_camera).getAvailableVideoModes()) + .map(res -> String.format("%s X %s at %s fps", res.width, res.height, res.fps)).collect(Collectors.toList()); } throw new CameraException(CameraException.CameraExceptionType.NO_CAMERA); } diff --git a/Main/src/main/java/com/chameleonvision/vision/process/PipelineResult.java b/Main/src/main/java/com/chameleonvision/vision/process/PipelineResult.java index 47c7bbe1a..fb96c13b2 100644 --- a/Main/src/main/java/com/chameleonvision/vision/process/PipelineResult.java +++ b/Main/src/main/java/com/chameleonvision/vision/process/PipelineResult.java @@ -8,5 +8,6 @@ public class PipelineResult { public double CalibratedY = 0.0; public double Pitch = 0.0; public double Yaw = 0.0; + public double Area = 0.0; RotatedRect RawPoint; } diff --git a/Main/src/main/java/com/chameleonvision/vision/process/VisionProcess.java b/Main/src/main/java/com/chameleonvision/vision/process/VisionProcess.java index feae97ead..ebe8cc58b 100644 --- a/Main/src/main/java/com/chameleonvision/vision/process/VisionProcess.java +++ b/Main/src/main/java/com/chameleonvision/vision/process/VisionProcess.java @@ -46,17 +46,17 @@ public class VisionProcess implements Runnable { // NetworkTables NetworkTable ntTable = NetworkTableInstance.getDefault().getTable("/chameleon-vision/" + cameraName); - ntPipelineEntry = ntTable.getEntry("Pipeline"); - ntDriverModeEntry = ntTable.getEntry("Driver_Mode"); - ntPitchEntry = ntTable.getEntry("Pitch"); - ntYawEntry = ntTable.getEntry("Yaw"); - ntDistanceEntry = ntTable.getEntry("Distance"); - ntTimeStampEntry = ntTable.getEntry("TimeStamp"); - ntValidEntry = ntTable.getEntry("Valid"); + ntPipelineEntry = ntTable.getEntry("pipeline"); + ntDriverModeEntry = ntTable.getEntry("driver_mode"); + ntPitchEntry = ntTable.getEntry("pitch"); + ntYawEntry = ntTable.getEntry("yaw"); + ntDistanceEntry = ntTable.getEntry("distance"); + ntTimeStampEntry = ntTable.getEntry("timestamp"); + ntValidEntry = ntTable.getEntry("is_valid"); ntDriverModeEntry.addListener(this::DriverModeListener, EntryListenerFlags.kUpdate); ntPipelineEntry.addListener(this::PipelineListener, EntryListenerFlags.kUpdate); ntDriverModeEntry.setBoolean(false); - ntPipelineEntry.setString("pipeline" + camera.getCurrentPipelineIndex()); + ntPipelineEntry.setNumber(camera.getCurrentPipelineIndex()); // camera settings cvProcess = new CVProcess(camera.getCamVals()); @@ -75,7 +75,7 @@ public class VisionProcess implements Runnable { } private void PipelineListener(EntryNotification entryNotification) { - var ntPipelineIndex = Integer.parseInt(entryNotification.value.getString().replace("pipeline", "")); + var ntPipelineIndex = (int) entryNotification.value.getDouble(); if (camera.getPipelines().containsKey(ntPipelineIndex)) { // camera.setEntryNotification.value.getString()); var pipeline = camera.getCurrentPipeline(); @@ -93,10 +93,9 @@ public class VisionProcess implements Runnable { pipeChange.put("curr_pipeline", ntPipelineIndex); ServerHandler.broadcastMessage(pipeChange); ServerHandler.sendFullSettings(); - } } else { - ntPipelineEntry.setString("pipeline" + camera.getCurrentPipelineIndex()); + ntPipelineEntry.setNumber(camera.getCurrentPipelineIndex()); } } @@ -115,6 +114,7 @@ public class VisionProcess implements Runnable { if (pipelineResult.IsValid) { ntYawEntry.setNumber(pipelineResult.Yaw); ntPitchEntry.setNumber(pipelineResult.Pitch); + ntDistanceEntry.setNumber(pipelineResult.Area); } ntTimeStampEntry.setNumber(TimeStamp); } @@ -161,6 +161,7 @@ public class VisionProcess implements Runnable { } pipelineResult.Pitch = camera.getCamVals().CalculatePitch(finalRect.center.y, pipelineResult.CalibratedY); pipelineResult.Yaw = camera.getCamVals().CalculateYaw(finalRect.center.x, pipelineResult.CalibratedX); + pipelineResult.Area = finalRect.size.area(); drawContour(outputImage, finalRect); } } diff --git a/Main/src/main/java/com/chameleonvision/web/ServerHandler.java b/Main/src/main/java/com/chameleonvision/web/ServerHandler.java index 40c113c77..698f5bb45 100644 --- a/Main/src/main/java/com/chameleonvision/web/ServerHandler.java +++ b/Main/src/main/java/com/chameleonvision/web/ServerHandler.java @@ -99,12 +99,10 @@ public class ServerHandler { sendFullSettings(); break; case "curr_pipeline": - String newPipeline = value.toString(); - var pipelineNumber = Integer.parseInt(newPipeline.replace("pipeline", "")); + int newPipeline = (int) value; System.out.printf("Changing pipeline to %s\n", newPipeline); - CameraManager.setCurrentPipeline(pipelineNumber); - var Proccess = CameraManager.getCurrentCameraProcess(); - Proccess.ntPipelineEntry.setString("pipeline"+pipelineNumber); + CameraManager.setCurrentPipeline(newPipeline); + CameraManager.getCurrentCameraProcess().ntPipelineEntry.setNumber(newPipeline); broadcastMessage(allFieldsToMap(CameraManager.getCurrentPipeline())); break; From b87d31e4659298b7a572d986bd4e3ee7b7a931f8 Mon Sep 17 00:00:00 2001 From: Banks Troutman Date: Tue, 1 Oct 2019 02:19:32 -0400 Subject: [PATCH 15/18] Added method for arg handling, added NT server mode and NT server host args --- .../main/java/com/chameleonvision/Main.java | 129 +++++++++++++----- .../com/chameleonvision/util/Utilities.java | 11 ++ 2 files changed, 105 insertions(+), 35 deletions(-) create mode 100644 Main/src/main/java/com/chameleonvision/util/Utilities.java diff --git a/Main/src/main/java/com/chameleonvision/Main.java b/Main/src/main/java/com/chameleonvision/Main.java index 36e91cb36..e01a5eb72 100644 --- a/Main/src/main/java/com/chameleonvision/Main.java +++ b/Main/src/main/java/com/chameleonvision/Main.java @@ -1,6 +1,7 @@ package com.chameleonvision; import com.chameleonvision.settings.SettingsManager; +import com.chameleonvision.util.Utilities; import com.chameleonvision.vision.camera.CameraManager; import com.chameleonvision.vision.process.VisionProcess; import com.chameleonvision.web.Server; @@ -11,40 +12,98 @@ import edu.wpi.first.networktables.NetworkTableInstance; import java.io.IOException; public class Main { - private static final String PORT_KEY = "-port"; - public static void main(String[] args) { - int port = 8888; - for(int i=0; i Date: Tue, 1 Oct 2019 03:00:42 -0400 Subject: [PATCH 16/18] Temp fix for port setting, add `flush` to NetworkTables, add `--manage-network` argument --- .../main/java/com/chameleonvision/Main.java | 23 ++++++++++++------- .../settings/SettingsManager.java | 19 +++++++-------- .../vision/process/VisionProcess.java | 1 + 3 files changed, 26 insertions(+), 17 deletions(-) diff --git a/Main/src/main/java/com/chameleonvision/Main.java b/Main/src/main/java/com/chameleonvision/Main.java index e01a5eb72..dc0ebc7cb 100644 --- a/Main/src/main/java/com/chameleonvision/Main.java +++ b/Main/src/main/java/com/chameleonvision/Main.java @@ -14,13 +14,15 @@ import java.io.IOException; public class Main { private static final String PORT_KEY = "--port"; // expects integer - private static final String NT_SERVERMODE_KEY = "--ntservermode"; // no args for this setting - private static final String NT_CLIENTMODESERVER_KEY = "--ntclientserver"; // expects String representing an IP address (hostnames will be rejected!) + private static final String NT_SERVERMODE_KEY = "--nt-servermode"; // no args for this setting + private static final String NT_CLIENTMODESERVER_KEY = "--nt-client-server"; // expects String representing an IP address (hostnames will be rejected!) + private static final String NETWORK_MANAGE_KEY = "--manage-network"; // no args for this setting private static final int DEFAULT_PORT = 8888; private static int webserverPort = DEFAULT_PORT; private static boolean ntServerMode = false; + private static boolean manageNetwork = false; private static String ntClientModeServer = null; private static void handleArgs(String[] args) { @@ -40,18 +42,20 @@ public class Main { i++; // increment to skip an 'arg' next go-around of for loop, as that would be this value break; case NT_SERVERMODE_KEY: + case NETWORK_MANAGE_KEY: // nothing } // this switch actually handles the arguments. switch (key) { case PORT_KEY: - try { - if (value == null) throw new Exception("Bad or No argument value"); - webserverPort = Integer.parseInt(value); - } catch (Exception ex) { - System.err.printf("Argument for port was invalid, starting server at port %d\n", DEFAULT_PORT); - } + System.out.println("INFO - The \"--port\" argument is currently disabled."); +// try { +// if (value == null) throw new Exception("Bad or No argument value"); +// webserverPort = Integer.parseInt(value); +// } catch (Exception ex) { +// System.err.printf("Argument for port was invalid, starting server at port %d\n", DEFAULT_PORT); +// } break; case NT_SERVERMODE_KEY: ntServerMode = true; @@ -70,6 +74,9 @@ public class Main { } System.err.println("Argument for NT Server Host was invalid, defaulting to team number host"); break; + case NETWORK_MANAGE_KEY: + manageNetwork = true; + break; } } } diff --git a/Main/src/main/java/com/chameleonvision/settings/SettingsManager.java b/Main/src/main/java/com/chameleonvision/settings/SettingsManager.java index 95840fe10..221b2974e 100644 --- a/Main/src/main/java/com/chameleonvision/settings/SettingsManager.java +++ b/Main/src/main/java/com/chameleonvision/settings/SettingsManager.java @@ -19,16 +19,17 @@ public class SettingsManager { private SettingsManager() {} - public static void initialize() { + public static void initialize(boolean manageNetwork) { initGeneralSettings(); - NetworkSettings netSettings = new NetworkSettings(); - netSettings.hostname = GeneralSettings.hostname; - netSettings.gateway = GeneralSettings.gateway; - netSettings.netmask = GeneralSettings.netmask; - netSettings.connectionType = GeneralSettings.connection_type; - netSettings.ip = GeneralSettings.ip; - netSettings.run(); - + if (manageNetwork) { + NetworkSettings netSettings = new NetworkSettings(); + netSettings.hostname = GeneralSettings.hostname; + netSettings.gateway = GeneralSettings.gateway; + netSettings.netmask = GeneralSettings.netmask; + netSettings.connectionType = GeneralSettings.connection_type; + netSettings.ip = GeneralSettings.ip; + netSettings.run(); + } var allCameras = CameraManager.getAllCamerasByName(); if (!allCameras.containsKey(GeneralSettings.curr_camera) && allCameras.size() > 0) { var cam = allCameras.entrySet().stream().findFirst().get().getValue(); diff --git a/Main/src/main/java/com/chameleonvision/vision/process/VisionProcess.java b/Main/src/main/java/com/chameleonvision/vision/process/VisionProcess.java index ebe8cc58b..96c95fcf0 100644 --- a/Main/src/main/java/com/chameleonvision/vision/process/VisionProcess.java +++ b/Main/src/main/java/com/chameleonvision/vision/process/VisionProcess.java @@ -115,6 +115,7 @@ public class VisionProcess implements Runnable { ntYawEntry.setNumber(pipelineResult.Yaw); ntPitchEntry.setNumber(pipelineResult.Pitch); ntDistanceEntry.setNumber(pipelineResult.Area); + NetworkTableInstance.getDefault().flush(); } ntTimeStampEntry.setNumber(TimeStamp); } From 532231341fa11a4175e82c381168c24d7826b462 Mon Sep 17 00:00:00 2001 From: ori agranat Date: Tue, 1 Oct 2019 19:12:29 +0300 Subject: [PATCH 17/18] changed args key name --- Main/src/main/java/com/chameleonvision/Main.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Main/src/main/java/com/chameleonvision/Main.java b/Main/src/main/java/com/chameleonvision/Main.java index dc0ebc7cb..3b2674dba 100644 --- a/Main/src/main/java/com/chameleonvision/Main.java +++ b/Main/src/main/java/com/chameleonvision/Main.java @@ -16,13 +16,13 @@ public class Main { private static final String PORT_KEY = "--port"; // expects integer private static final String NT_SERVERMODE_KEY = "--nt-servermode"; // no args for this setting private static final String NT_CLIENTMODESERVER_KEY = "--nt-client-server"; // expects String representing an IP address (hostnames will be rejected!) - private static final String NETWORK_MANAGE_KEY = "--manage-network"; // no args for this setting + private static final String NETWORK_MANAGE_KEY = "--unmanage-network"; // no args for this setting private static final int DEFAULT_PORT = 8888; private static int webserverPort = DEFAULT_PORT; private static boolean ntServerMode = false; - private static boolean manageNetwork = false; + private static boolean manageNetwork = true; private static String ntClientModeServer = null; private static void handleArgs(String[] args) { @@ -75,7 +75,7 @@ public class Main { System.err.println("Argument for NT Server Host was invalid, defaulting to team number host"); break; case NETWORK_MANAGE_KEY: - manageNetwork = true; + manageNetwork = false; break; } } @@ -93,7 +93,7 @@ public class Main { } if (CameraManager.initializeCameras()) { - SettingsManager.initialize(); + SettingsManager.initialize(manageNetwork); CameraManager.initializeThreads(); if (ntServerMode) { From 2d32fa21ceccbd99837bba7d4f97cc08d3faaaff Mon Sep 17 00:00:00 2001 From: ori agranat Date: Tue, 1 Oct 2019 19:57:46 +0300 Subject: [PATCH 18/18] v1.1.0-BETA --- Main/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Main/pom.xml b/Main/pom.xml index 572bc373d..14fd310b4 100644 --- a/Main/pom.xml +++ b/Main/pom.xml @@ -5,7 +5,7 @@ 4.0.0 org.chameleon-vision.main chameleon-vision - 1.0.3-BETA + 1.1.0-BETA