diff --git a/Main/pom.xml b/Main/pom.xml index 2f2659eea..fada5e01e 100644 --- a/Main/pom.xml +++ b/Main/pom.xml @@ -5,7 +5,7 @@ 4.0.0 org.chameleon-vision.main chameleon-vision - 1.1.3-BETA + 1.1.4-BETA diff --git a/Main/src/main/java/com/chameleonvision/Main.java b/Main/src/main/java/com/chameleonvision/Main.java index 825465612..5eb453739 100644 --- a/Main/src/main/java/com/chameleonvision/Main.java +++ b/Main/src/main/java/com/chameleonvision/Main.java @@ -24,7 +24,6 @@ public class Main { private static final int DEFAULT_PORT = 8888; - private static int webserverPort = DEFAULT_PORT; private static boolean ntServerMode = false; private static boolean manageNetwork = true; private static boolean ignoreRoot = false; @@ -43,7 +42,7 @@ public class Main { } } - public static final Platform CurrentPlatform = Platform.getCurrentPlatform(); + private static final Platform CurrentPlatform = Platform.getCurrentPlatform(); private static void handleArgs(String[] args) { for (int i = 0; i < args.length; i++) { @@ -127,12 +126,10 @@ public class Main { // Attempt to load the JNI Libraries try { - if (CurrentPlatform.equals(Platform.LINUX_ARM64)) CameraServerJNI.forceLoad(); CameraServerCvJNI.forceLoad(); } catch (IOException e) { - var errorStr = CurrentPlatform.equals(Platform.UNSUPPORTED) ? "Unsupported platform!" : "Failed to load JNI Libraries!"; - throw new RuntimeException(errorStr); + throw new RuntimeException("Failed to load JNI Libraries!"); } if (CameraManager.initializeCameras()) { @@ -152,6 +149,7 @@ public class Main { } } + int webserverPort = DEFAULT_PORT; System.out.printf("Starting Webserver at port %d\n", webserverPort); Server.main(webserverPort); } else { diff --git a/Main/src/main/java/com/chameleonvision/network/LinuxNetworking.java b/Main/src/main/java/com/chameleonvision/network/LinuxNetworking.java index 3e1d811de..42998a9a0 100644 --- a/Main/src/main/java/com/chameleonvision/network/LinuxNetworking.java +++ b/Main/src/main/java/com/chameleonvision/network/LinuxNetworking.java @@ -1,22 +1,13 @@ package com.chameleonvision.network; -import com.chameleonvision.settings.NetworkSettings; -import com.chameleonvision.settings.SettingsManager; -import com.chameleonvision.util.ShellExec; - -import java.io.BufferedOutputStream; import java.io.IOException; -import java.net.InetAddress; import java.net.SocketException; -import java.net.UnknownHostException; import java.util.ArrayList; import java.util.Collections; import java.util.List; public class LinuxNetworking extends SysNetworking { - private ShellExec shell = new ShellExec(true, true); - @Override public boolean setDHCP() { String[] clearArgs = { "addr", "flush", "dev", networkInterface.name }; diff --git a/Main/src/main/java/com/chameleonvision/network/NetworkInterface.java b/Main/src/main/java/com/chameleonvision/network/NetworkInterface.java index 75b5f7224..2c20abf44 100644 --- a/Main/src/main/java/com/chameleonvision/network/NetworkInterface.java +++ b/Main/src/main/java/com/chameleonvision/network/NetworkInterface.java @@ -1,10 +1,8 @@ package com.chameleonvision.network; -import com.chameleonvision.settings.GeneralSettings; - -import java.net.InetAddress; import java.net.InterfaceAddress; +@SuppressWarnings("WeakerAccess") public class NetworkInterface { public final String name; public final String displayName; @@ -43,9 +41,8 @@ public class NetworkInterface { } // Transform the resulting value in xxx.xxx.xxx.xxx format, like if /// it was a standard address... - String maskString = ((shiftby >> 24) & 255) + "." + ((shiftby >> 16) & 255) + "." + ((shiftby >> 8) & 255) + "." + (shiftby & 255); - // Return the address thus created... - return maskString; + // Return the address thus created... + return ((shiftby >> 24) & 255) + "." + ((shiftby >> 16) & 255) + "." + ((shiftby >> 8) & 255) + "." + (shiftby & 255); // return InetAddress.getByName(maskString); } catch(Exception e) { diff --git a/Main/src/main/java/com/chameleonvision/network/NetworkManager.java b/Main/src/main/java/com/chameleonvision/network/NetworkManager.java index c8c36d5e4..a6644d87c 100644 --- a/Main/src/main/java/com/chameleonvision/network/NetworkManager.java +++ b/Main/src/main/java/com/chameleonvision/network/NetworkManager.java @@ -1,20 +1,17 @@ package com.chameleonvision.network; -import com.chameleonvision.settings.NetworkSettings; import com.chameleonvision.settings.Platform; import com.chameleonvision.settings.SettingsManager; import java.net.SocketException; import java.util.ArrayList; -import java.util.Collections; import java.util.List; public class NetworkManager { private NetworkManager() {} - protected static SysNetworking networking; - protected static NetworkInterface botInterface = null; + private static SysNetworking networking; private static boolean isManaged = false; public static void initialize(boolean manage) { @@ -46,7 +43,7 @@ public class NetworkManager { e.printStackTrace(); } - var teamBytes = NetworkSettings.GetTeamNumberIPBytes(SettingsManager.GeneralSettings.team_number); + var teamBytes = NetworkManager.GetTeamNumberIPBytes(SettingsManager.GeneralSettings.team_number); if (interfaces.size() > 0) { for (var inetface : interfaces) { @@ -65,7 +62,7 @@ public class NetworkManager { return; } - botInterface = goodInterfaces.get(0); + NetworkInterface botInterface = goodInterfaces.get(0); networking.setNetworkInterface(botInterface); } else { isManaged = false; @@ -79,6 +76,10 @@ public class NetworkManager { } } + private static byte[] GetTeamNumberIPBytes(int teamNumber) { + return new byte[]{(byte) (teamNumber / 100), (byte) (teamNumber % 100)}; + } + private static boolean loadFromGeneralSettings() { if (!isManaged) { return true; diff --git a/Main/src/main/java/com/chameleonvision/network/SysNetworking.java b/Main/src/main/java/com/chameleonvision/network/SysNetworking.java index 91684e775..63a609984 100644 --- a/Main/src/main/java/com/chameleonvision/network/SysNetworking.java +++ b/Main/src/main/java/com/chameleonvision/network/SysNetworking.java @@ -5,7 +5,6 @@ import com.chameleonvision.util.ShellExec; import java.io.IOException; import java.net.SocketException; import java.util.List; -import java.util.Scanner; public abstract class SysNetworking { diff --git a/Main/src/main/java/com/chameleonvision/network/WindowsNetworking.java b/Main/src/main/java/com/chameleonvision/network/WindowsNetworking.java index d6ccd829b..d03da14e2 100644 --- a/Main/src/main/java/com/chameleonvision/network/WindowsNetworking.java +++ b/Main/src/main/java/com/chameleonvision/network/WindowsNetworking.java @@ -1,8 +1,5 @@ package com.chameleonvision.network; -import com.chameleonvision.settings.NetworkSettings; -import com.chameleonvision.settings.SettingsManager; - import java.net.SocketException; import java.util.ArrayList; import java.util.Collections; diff --git a/Main/src/main/java/com/chameleonvision/settings/NetworkSettings.java b/Main/src/main/java/com/chameleonvision/settings/NetworkSettings.java deleted file mode 100644 index 78c28e017..000000000 --- a/Main/src/main/java/com/chameleonvision/settings/NetworkSettings.java +++ /dev/null @@ -1,80 +0,0 @@ -package com.chameleonvision.settings; - -import java.net.*; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Enumeration; - -import com.chameleonvision.util.Utilities; -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.SystemUtils; - -public class NetworkSettings { - public String connectionType, ip, netmask, gateway, hostname; - - public void run() { -// String adapter = getAdapter(); - if (SystemUtils.IS_OS_LINUX) {//TODO check linux commands - String adapter = getAdapter(); - if (!adapter.equals("")) { - executeCommand("ifconfig " + adapter + " down"); - if (connectionType.equals("DHCP")) - executeCommand("dhclient -r " + adapter); - else if (connectionType.equals("Static")) { - executeCommand("ifconfig " + adapter + " " + this.ip + " netmask " + this.netmask); - executeCommand("route add default gw " + this.gateway + " " + adapter); - } - executeCommand("ifconfig " + adapter + " up"); - } - executeCommand("hostnamectl set-hostname " + this.hostname); - } -// //TODO check windows commands -// else if (SystemUtils.IS_OS_WINDOWS) { -// if (!adapter.equals("")) { -// if (connectionType.equals("DHCP")){ -// executeCommand("cmd /c interface ip set address \"" + adapter + "\" dhcp"); -// } -// else if (connectionType.equals("Static")) { -// executeCommand("cmd /c netsh interface ip set address \"" + adapter + "\" static " + this.ip + " " + this.netmask + " " + this.gateway + "1"); -// } -// } -// //TODO find a way to change hostname in windows -// } - } - - private void executeCommand(String command) { - try { - Process p = Runtime.getRuntime().exec(command); - System.out.println("Executing "+ command); - p.waitFor(); - p.destroy(); - } catch (Exception e) { - System.err.println("Error while executing command!"); - e.printStackTrace(); - } - } - - public static byte[] GetTeamNumberIPBytes(int teamNumber) { - return new byte[]{(byte) (teamNumber / 100), (byte) (teamNumber % 100)}; - } - - public static String getAdapter() { - try {//TODO fix windows get adapter - Enumeration nets = NetworkInterface.getNetworkInterfaces(); - for (NetworkInterface netint : Collections.list(nets)) { - Enumeration ee = netint.getInetAddresses(); - for (InetAddress addr : Collections.list(ee)) - if (addr instanceof Inet4Address) { - var addrString = addr.toString(); - if ((addr.getAddress()[0] & 0xFF) == 10 && (addr.getAddress()[1] & 0xFF) == 168) { - System.out.println("found robot network interface at " + netint.getName() + " ip: " + addr.getHostAddress()); - return netint.getName(); - } - } - } - } catch (SocketException e) { - System.err.println("Socket exception while trying to find current IP"); - } - return ""; - } -} diff --git a/Main/src/main/java/com/chameleonvision/settings/Platform.java b/Main/src/main/java/com/chameleonvision/settings/Platform.java index a018ffa73..64f70f1f7 100644 --- a/Main/src/main/java/com/chameleonvision/settings/Platform.java +++ b/Main/src/main/java/com/chameleonvision/settings/Platform.java @@ -45,7 +45,9 @@ public enum Platform { } catch (IOException e) { e.printStackTrace(); } - while (!shell.isOutputCompleted()) {} + while (!shell.isOutputCompleted()) { + // ignored + } if (shell.getExitCode() == 0) { var out = shell.getOutput(); out = out.split("\n")[0]; diff --git a/Main/src/main/java/com/chameleonvision/settings/SettingsManager.java b/Main/src/main/java/com/chameleonvision/settings/SettingsManager.java index 6a2a3c310..892a1a66a 100644 --- a/Main/src/main/java/com/chameleonvision/settings/SettingsManager.java +++ b/Main/src/main/java/com/chameleonvision/settings/SettingsManager.java @@ -1,6 +1,5 @@ package com.chameleonvision.settings; -import com.chameleonvision.network.NetworkManager; import com.chameleonvision.util.FileHelper; import com.chameleonvision.vision.camera.CameraManager; import com.google.gson.Gson; @@ -21,16 +20,6 @@ public class SettingsManager { public static void initialize() { initGeneralSettings(); -// 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/util/ShellExec.java b/Main/src/main/java/com/chameleonvision/util/ShellExec.java index a6347edba..f0fa0f1cd 100644 --- a/Main/src/main/java/com/chameleonvision/util/ShellExec.java +++ b/Main/src/main/java/com/chameleonvision/util/ShellExec.java @@ -101,7 +101,7 @@ public class ShellExec { * http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html?page=4 */ @SuppressWarnings("WeakerAccess") - private class StreamGobbler extends Thread { + private static class StreamGobbler extends Thread { private InputStream is; private StringBuilder output; private volatile boolean completed; // mark volatile to guarantee a thread safety diff --git a/Main/src/main/java/com/chameleonvision/util/Utilities.java b/Main/src/main/java/com/chameleonvision/util/Utilities.java index 800a80330..0be21374e 100644 --- a/Main/src/main/java/com/chameleonvision/util/Utilities.java +++ b/Main/src/main/java/com/chameleonvision/util/Utilities.java @@ -26,7 +26,7 @@ public class Utilities { } public static List getDigits(int num) { - List digits = new ArrayList(); + List digits = new ArrayList<>(); collectDigits(num, digits); return digits; } 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 4ced66d97..596993705 100644 --- a/Main/src/main/java/com/chameleonvision/vision/process/CVProcess.java +++ b/Main/src/main/java/com/chameleonvision/vision/process/CVProcess.java @@ -70,14 +70,13 @@ public class CVProcess { } var rect = Imgproc.minAreaRect(new MatOfPoint2f(Contour.toArray())); - var targetFullness = contourArea; - double minExtent = (double) (extent.get(0) * rect.size.area()) / 100; - double maxExtent = (double) (extent.get(1) * rect.size.area()) / 100; - if (targetFullness <= minExtent || contourArea >= maxExtent) { + double minExtent = (extent.get(0) * rect.size.area()) / 100; + double maxExtent = (extent.get(1) * rect.size.area()) / 100; + if (contourArea <= minExtent || contourArea >= maxExtent) { continue; } Rect bb = Imgproc.boundingRect(Contour); - double aspectRatio = (bb.width / bb.height); + double aspectRatio = ((double)bb.width / bb.height); if (aspectRatio < ratio.get(0) || aspectRatio > ratio.get(1)) { continue; } 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 fb96c13b2..f78f117b0 100644 --- a/Main/src/main/java/com/chameleonvision/vision/process/PipelineResult.java +++ b/Main/src/main/java/com/chameleonvision/vision/process/PipelineResult.java @@ -2,12 +2,33 @@ package com.chameleonvision.vision.process; import org.opencv.core.RotatedRect; +@SuppressWarnings("WeakerAccess") public class PipelineResult { - public boolean IsValid = false; - public double CalibratedX = 0.0; - public double CalibratedY = 0.0; - public double Pitch = 0.0; - public double Yaw = 0.0; - public double Area = 0.0; - RotatedRect RawPoint; + public final boolean IsValid; + public final double CalibratedX; + public final double CalibratedY; + public final double Pitch; + public final double Yaw; + public final double Area; + public final RotatedRect RawPoint; + + public PipelineResult() { + IsValid = false; + CalibratedX = 0.0; + CalibratedY = 0.0; + Pitch = 0.0; + Yaw = 0.0; + Area = 0.0; + RawPoint = new RotatedRect(); + } + + public PipelineResult(double calX, double calY, double pitch, double yaw, double area, RotatedRect rawPoint) { + IsValid = true; + CalibratedX = calX; + CalibratedY = calY; + Pitch = pitch; + Yaw = yaw; + Area = area; + RawPoint = 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 66c3208aa..6b1aa42c4 100644 --- a/Main/src/main/java/com/chameleonvision/vision/process/VisionProcess.java +++ b/Main/src/main/java/com/chameleonvision/vision/process/VisionProcess.java @@ -20,7 +20,7 @@ public class VisionProcess implements Runnable { private final CameraProcess cameraProcess; // NetworkTables public NetworkTableEntry ntPipelineEntry; - public NetworkTableEntry ntDriverModeEntry; + private NetworkTableEntry ntDriverModeEntry; private NetworkTableEntry ntYawEntry; private NetworkTableEntry ntPitchEntry; private NetworkTableEntry ntDistanceEntry; @@ -112,7 +112,11 @@ public class VisionProcess implements Runnable { Imgproc.rectangle(inputMat,new Point(box.x, box.y), new Point((box.x + box.width),(box.y + box.height)), BoxRectColor,2); } + private boolean wasValid = false; + private void updateNetworkTables(PipelineResult pipelineResult) { + boolean isValid = pipelineResult.IsValid; + if (pipelineResult.IsValid) { ntValidEntry.setBoolean(true); ntYawEntry.setNumber(pipelineResult.Yaw); @@ -127,20 +131,25 @@ public class VisionProcess implements Runnable { ntTimeStampEntry.setNumber(timeStamp); ntValidEntry.setBoolean(false); } + // on validity state change, force a flush + if (isValid != wasValid) { +// System.out.printf("Validity changed from %b to %b\n", wasValid, isValid); + NetworkTableInstance.getDefault().flush(); + wasValid = isValid; + } } private PipelineResult runVisionProcess(Mat inputImage, Mat outputImage) { - var pipelineResult = new PipelineResult(); if (currentPipeline == null) { - return pipelineResult; + return new PipelineResult(); } if (!currentPipeline.orientation.equals("Normal")) { Core.flip(inputImage, inputImage, -1); } if (ntDriverModeEntry.getBoolean(false)) { inputImage.copyTo(outputImage); - return pipelineResult; + return new PipelineResult(); } Scalar hsvLower = new Scalar(currentPipeline.hue.get(0), currentPipeline.saturation.get(0), currentPipeline.value.get(0)); Scalar hsvUpper = new Scalar(currentPipeline.hue.get(1), currentPipeline.saturation.get(1), currentPipeline.value.get(1)); @@ -159,25 +168,25 @@ public class VisionProcess implements Runnable { groupedContours = cvProcess.groupTargets(filteredContours, currentPipeline.target_intersection, currentPipeline.target_group); if (groupedContours.size() > 0) { var finalRect = cvProcess.sortTargetsToOne(groupedContours, currentPipeline.sort_mode); -// System.out.printf("Largest Contour Area: %.2f\n", finalRect.size.area()); - pipelineResult.RawPoint = finalRect; - pipelineResult.IsValid = true; + double calX, calY; + if (!currentPipeline.is_calibrated) { - pipelineResult.CalibratedX = camera.getCamVals().CenterX; - pipelineResult.CalibratedY = camera.getCamVals().CenterY; + calX = camera.getCamVals().CenterX; + calY = camera.getCamVals().CenterY; } else { - pipelineResult.CalibratedX = (finalRect.center.y - currentPipeline.B) / currentPipeline.M; - pipelineResult.CalibratedY = (finalRect.center.x * currentPipeline.M) + currentPipeline.B; + calX = (finalRect.center.y - currentPipeline.B) / currentPipeline.M; + calY = (finalRect.center.x * currentPipeline.M) + currentPipeline.B; } - 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(); + var pitch = camera.getCamVals().CalculatePitch(finalRect.center.y, calY); + var yaw = camera.getCamVals().CalculateYaw(finalRect.center.x, calX); + var area = finalRect.size.area(); drawContour(outputImage, finalRect); + return new PipelineResult(calX, calY, pitch, yaw, area, finalRect); } } } - return pipelineResult; + return new PipelineResult(); } @Override diff --git a/Main/src/main/java/com/chameleonvision/web/ServerHandler.java b/Main/src/main/java/com/chameleonvision/web/ServerHandler.java index 89a52c1dc..fe57bb3c3 100644 --- a/Main/src/main/java/com/chameleonvision/web/ServerHandler.java +++ b/Main/src/main/java/com/chameleonvision/web/ServerHandler.java @@ -13,10 +13,7 @@ import org.json.JSONObject; import org.springframework.beans.BeanUtils; import java.lang.reflect.Field; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; public class ServerHandler { @@ -175,7 +172,7 @@ public class ServerHandler { map.put(field.getName(), field.get(obj)); } } catch (IllegalAccessException e) { - System.err.println("Illegal Access error:" + e.getStackTrace()); + System.err.println("Illegal Access error:" + Arrays.toString(e.getStackTrace())); } return map; }