diff --git a/Main/pom.xml b/Main/pom.xml index 456b1a8bf..9fb3efa1b 100644 --- a/Main/pom.xml +++ b/Main/pom.xml @@ -5,7 +5,7 @@ 4.0.0 org.chameleon-vision.main chameleon-vision - 1.1.4-BETA + 1.1.3-BETA @@ -14,9 +14,7 @@ maven-compiler-plugin 3.8.0 - 12 - 12 - true + 12 diff --git a/Main/src/main/java/com/chameleonvision/Main.java b/Main/src/main/java/com/chameleonvision/Main.java index e24da500f..18f599a0b 100644 --- a/Main/src/main/java/com/chameleonvision/Main.java +++ b/Main/src/main/java/com/chameleonvision/Main.java @@ -24,6 +24,7 @@ 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; @@ -42,7 +43,7 @@ public class Main { } } - private static final Platform CurrentPlatform = Platform.getCurrentPlatform(); + public static final Platform CurrentPlatform = Platform.getCurrentPlatform(); private static void handleArgs(String[] args) { for (int i = 0; i < args.length; i++) { @@ -126,10 +127,12 @@ public class Main { // Attempt to load the JNI Libraries try { + if (CurrentPlatform.equals(Platform.LINUX_ARM64)) CameraServerJNI.forceLoad(); CameraServerCvJNI.forceLoad(); } catch (IOException e) { - throw new RuntimeException("Failed to load JNI Libraries!"); + var errorStr = CurrentPlatform.equals(Platform.UNSUPPORTED) ? "Unsupported platform!" : "Failed to load JNI Libraries!"; + throw new RuntimeException(errorStr); } if (CameraManager.initializeCameras()) { @@ -149,7 +152,6 @@ 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 42998a9a0..3e1d811de 100644 --- a/Main/src/main/java/com/chameleonvision/network/LinuxNetworking.java +++ b/Main/src/main/java/com/chameleonvision/network/LinuxNetworking.java @@ -1,13 +1,22 @@ 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 2c20abf44..75b5f7224 100644 --- a/Main/src/main/java/com/chameleonvision/network/NetworkInterface.java +++ b/Main/src/main/java/com/chameleonvision/network/NetworkInterface.java @@ -1,8 +1,10 @@ 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; @@ -41,8 +43,9 @@ public class NetworkInterface { } // Transform the resulting value in xxx.xxx.xxx.xxx format, like if /// it was a standard address... - // Return the address thus created... - return ((shiftby >> 24) & 255) + "." + ((shiftby >> 16) & 255) + "." + ((shiftby >> 8) & 255) + "." + (shiftby & 255); + String maskString = ((shiftby >> 24) & 255) + "." + ((shiftby >> 16) & 255) + "." + ((shiftby >> 8) & 255) + "." + (shiftby & 255); + // Return the address thus created... + return maskString; // 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 a724cf42a..359735f76 100644 --- a/Main/src/main/java/com/chameleonvision/network/NetworkManager.java +++ b/Main/src/main/java/com/chameleonvision/network/NetworkManager.java @@ -1,6 +1,7 @@ package com.chameleonvision.network; +import com.chameleonvision.settings.NetworkSettings; import com.chameleonvision.settings.Platform; import com.chameleonvision.settings.SettingsManager; @@ -11,7 +12,8 @@ import java.util.List; public class NetworkManager { private NetworkManager() {} - private static SysNetworking networking; + protected static SysNetworking networking; + protected static NetworkInterface botInterface = null; private static boolean isManaged = false; public static void initialize(boolean manage) { @@ -62,7 +64,7 @@ public class NetworkManager { return; } - NetworkInterface botInterface = goodInterfaces.get(0); + botInterface = goodInterfaces.get(0); networking.setNetworkInterface(botInterface); } else { isManaged = false; @@ -76,10 +78,6 @@ 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 63a609984..91684e775 100644 --- a/Main/src/main/java/com/chameleonvision/network/SysNetworking.java +++ b/Main/src/main/java/com/chameleonvision/network/SysNetworking.java @@ -5,6 +5,7 @@ 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 d03da14e2..d6ccd829b 100644 --- a/Main/src/main/java/com/chameleonvision/network/WindowsNetworking.java +++ b/Main/src/main/java/com/chameleonvision/network/WindowsNetworking.java @@ -1,5 +1,8 @@ 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 new file mode 100644 index 000000000..78c28e017 --- /dev/null +++ b/Main/src/main/java/com/chameleonvision/settings/NetworkSettings.java @@ -0,0 +1,80 @@ +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 64f70f1f7..a018ffa73 100644 --- a/Main/src/main/java/com/chameleonvision/settings/Platform.java +++ b/Main/src/main/java/com/chameleonvision/settings/Platform.java @@ -45,9 +45,7 @@ public enum Platform { } catch (IOException e) { e.printStackTrace(); } - while (!shell.isOutputCompleted()) { - // ignored - } + while (!shell.isOutputCompleted()) {} 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 d26444630..5cfa1eae8 100644 --- a/Main/src/main/java/com/chameleonvision/settings/SettingsManager.java +++ b/Main/src/main/java/com/chameleonvision/settings/SettingsManager.java @@ -1,5 +1,6 @@ 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; @@ -20,6 +21,16 @@ 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.currentCamera) && 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 f0fa0f1cd..a6347edba 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 static class StreamGobbler extends Thread { + private 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 0be21374e..800a80330 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 3d2c07f36..ca8f55fe3 100644 --- a/Main/src/main/java/com/chameleonvision/vision/process/CVProcess.java +++ b/Main/src/main/java/com/chameleonvision/vision/process/CVProcess.java @@ -24,7 +24,6 @@ public class CVProcess { private Mat binaryMat = new Mat(); private List filteredContours = new ArrayList<>(); private Comparator sortByCentermostComparator = Comparator.comparingDouble(this::calcDistance); - private List speckleRejectedContours = new ArrayList<>(); private Comparator sortByMomentsX = Comparator.comparingDouble(this::calcMomentsX); private List finalCountours = new ArrayList<>(); private MatOfPoint2f intersectMatA = new MatOfPoint2f(); @@ -87,20 +86,6 @@ public class CVProcess { return filteredContours; } - List rejectSpeckles(List inputContours, Double minimumPercentOfAverage) { - double averageArea = 0.0; - for(MatOfPoint c : inputContours) { - averageArea += Imgproc.contourArea(c); - } - averageArea /= inputContours.size(); - var minimumAllowableArea = minimumPercentOfAverage / 100.0 * averageArea; - speckleRejectedContours.clear(); - for(MatOfPoint c : inputContours) { - if(Imgproc.contourArea(c) >= minimumAllowableArea) speckleRejectedContours.add(c); - } - return speckleRejectedContours; - } - private double calcDistance(RotatedRect rect) { return FastMath.sqrt(FastMath.pow(cameraValues.CenterX - rect.center.x, 2) + FastMath.pow(cameraValues.CenterY - rect.center.y, 2)); } 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 f67249f01..bbb2dda82 100644 --- a/Main/src/main/java/com/chameleonvision/vision/process/PipelineResult.java +++ b/Main/src/main/java/com/chameleonvision/vision/process/PipelineResult.java @@ -2,7 +2,6 @@ package com.chameleonvision.vision.process; import org.opencv.core.RotatedRect; -@SuppressWarnings("WeakerAccess") public class PipelineResult { public boolean IsValid = false; public double CalibratedX = 0.0;