diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 64c7e264b..23093b203 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -416,35 +416,31 @@ jobs: fail-fast: false matrix: include: - - os: ubuntu-24.04 - artifact-name: LinuxArm64 - image_suffix: RaspberryPi + - image_suffix: RaspberryPi image_url: https://github.com/PhotonVision/photon-image-modifier/releases/download/$IMAGE_VERSION/photonvision_raspi.img.xz - cpu: cortex-a7 - image_additional_mb: 0 - extraOpts: -Djdk.lang.Process.launchMechanism=vfork + - image_suffix: rubikpi3 + image_url: https://github.com/PhotonVision/photon-image-modifier/releases/download/$IMAGE_VERSION/photonvision_rubikpi3.tar.xz + root_location: 'offset=569376768' + - image_suffix: orangepi5 + image_url: https://github.com/PhotonVision/photon-image-modifier/releases/download/$IMAGE_VERSION/photonvision_opi5.img.xz - runs-on: ${{ matrix.os }} + runs-on: ubuntu-24.04-arm name: smoketest-${{ matrix.image_suffix }} steps: - uses: actions/download-artifact@v4 with: - name: jar-${{ matrix.artifact-name }} + name: jar-LinuxArm64 - - uses: pguyot/arm-runner-action@v2 + - uses: photonvision/photon-image-runner@HEAD name: Run photon smoketest id: generate_image with: - base_image: ${{ matrix.image_url }} - image_additional_mb: ${{ matrix.image_additional_mb }} - optimize_image: yes - cpu: ${{ matrix.cpu }} - # We do _not_ wanna copy photon into the image. Bind mount instead - bind_mount_repository: true + image_url: ${{ matrix.image_url }} + root_location: ${{ matrix.root_location || 'partition=2' }} # our image better have java installed already commands: | - java -jar ${{ matrix.extraOpts }} *.jar --smoketest + java -jar *.jar --smoketest build-image: needs: [build-package] diff --git a/build.gradle b/build.gradle index e1b5cbaf9..15de76bd3 100644 --- a/build.gradle +++ b/build.gradle @@ -37,9 +37,9 @@ ext { openCVYear = "2025" openCVversion = "4.10.0-3" javalinVersion = "6.7.0" - libcameraDriverVersion = "v2025.0.4" - rknnVersion = "dev-v2025.0.0-5-g666c0c6" - rubikVersion = "dev-v2025.1.0-6-g4a5e508" + libcameraDriverVersion = "dev-v2025.0.4-2-gc91d4b7" + rknnVersion = "dev-v2025.0.0-7-g83c1bf3" + rubikVersion = "dev-v2025.1.0-7-g39588a8" frcYear = "2025" mrcalVersion = "dev-v2025.0.0-2-g2adb187"; diff --git a/photon-core/build.gradle b/photon-core/build.gradle index 0f013eb93..f2cec1d77 100644 --- a/photon-core/build.gradle +++ b/photon-core/build.gradle @@ -28,25 +28,31 @@ dependencies { wpilibNatives wpilibTools.deps.wpilib("hal") wpilibNatives wpilibTools.deps.wpilibOpenCv("frc" + openCVYear, wpi.versions.opencvVersion.get()) - // Zip + // These stay as implementation dependencies since they don't have native code that gets packaged implementation 'org.zeroturnaround:zt-zip:1.14' - implementation "org.xerial:sqlite-jdbc:3.41.0.0" - implementation("org.photonvision:rknn_jni-jni:$rknnVersion:linuxarm64") { - transitive = false + + // The JNI libraries use wpilibNatives, the java libraries use implementation + if (jniPlatform == "linuxarm64") { + wpilibNatives("org.photonvision:rknn_jni-jni:$rknnVersion:$wpilibNativeName") { + transitive = false + } + wpilibNatives("org.photonvision:rubik_jni-jni:$rubikVersion:$wpilibNativeName") { + transitive = false + } + wpilibNatives("org.photonvision:photon-libcamera-gl-driver-jni:$libcameraDriverVersion:$wpilibNativeName") { + transitive = false + } } + implementation("org.photonvision:rknn_jni-java:$rknnVersion") { transitive = false } - implementation("org.photonvision:rubik_jni-jni:$rubikVersion:linuxarm64") { - transitive = false - } + implementation("org.photonvision:rubik_jni-java:$rubikVersion") { transitive = false } - implementation("org.photonvision:photon-libcamera-gl-driver-jni:$libcameraDriverVersion:linuxarm64") { - transitive = false - } + implementation "org.photonvision:photon-libcamera-gl-driver-java:$libcameraDriverVersion" implementation "org.photonvision:photon-mrcal-java:$mrcalVersion" diff --git a/photon-core/src/main/java/org/photonvision/common/LoadJNI.java b/photon-core/src/main/java/org/photonvision/common/LoadJNI.java new file mode 100644 index 000000000..763b05184 --- /dev/null +++ b/photon-core/src/main/java/org/photonvision/common/LoadJNI.java @@ -0,0 +1,59 @@ +/* + * Copyright (C) Photon Vision. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package org.photonvision.common; + +import edu.wpi.first.util.CombinedRuntimeLoader; +import java.io.IOException; +import java.util.HashMap; +import org.photonvision.jni.LibraryLoader; + +public class LoadJNI { + private static HashMap loadedMap = new HashMap<>(); + + public enum JNITypes { + RUBIK_DETECTOR("tensorflowlite", "tensorflowlite_c", "external_delegate", "rubik_jni"), + RKNN_DETECTOR("rga", "rknnrt", "rknn_jni"), + MRCAL("mrcal_jni"), + LIBCAMERA("photonlibcamera"); + + public final String[] libraries; + + JNITypes(String... libraries) { + this.libraries = libraries; + } + } + + public static synchronized void forceLoad(JNITypes type) throws IOException { + loadLibraries(); + + if (loadedMap.getOrDefault(type, false)) { + return; + } + + CombinedRuntimeLoader.loadLibraries(LoadJNI.class, type.libraries); + loadedMap.put(type, true); + } + + public static boolean loadLibraries() { + return LibraryLoader.loadWpiLibraries() && LibraryLoader.loadTargeting(); + } + + public static boolean hasLoaded(JNITypes t) { + return loadedMap.getOrDefault(t, false); + } +} diff --git a/photon-core/src/main/java/org/photonvision/common/dataflow/websocket/UIPhotonConfiguration.java b/photon-core/src/main/java/org/photonvision/common/dataflow/websocket/UIPhotonConfiguration.java index 3373337e6..04e9a70db 100644 --- a/photon-core/src/main/java/org/photonvision/common/dataflow/websocket/UIPhotonConfiguration.java +++ b/photon-core/src/main/java/org/photonvision/common/dataflow/websocket/UIPhotonConfiguration.java @@ -19,14 +19,14 @@ package org.photonvision.common.dataflow.websocket; import java.util.List; import org.photonvision.PhotonVersion; +import org.photonvision.common.LoadJNI; +import org.photonvision.common.LoadJNI.JNITypes; import org.photonvision.common.configuration.NeuralNetworkModelManager; import org.photonvision.common.configuration.PhotonConfiguration; import org.photonvision.common.dataflow.networktables.NetworkTablesManager; import org.photonvision.common.hardware.Platform; import org.photonvision.common.networking.NetworkManager; import org.photonvision.common.networking.NetworkUtils; -import org.photonvision.common.util.TestUtils; -import org.photonvision.raspi.LibCameraJNILoader; import org.photonvision.vision.processes.VisionModule; import org.photonvision.vision.processes.VisionSourceManager; @@ -53,8 +53,8 @@ public class UIPhotonConfiguration { new UIGeneralSettings( PhotonVersion.versionString, // TODO add support for other types of GPU accel - LibCameraJNILoader.getInstance().isSupported() ? "Zerocopy Libcamera Working" : "", - TestUtils.isMrcalLoaded(), + LoadJNI.hasLoaded(JNITypes.LIBCAMERA) ? "Zerocopy Libcamera Working" : "", + LoadJNI.hasLoaded(JNITypes.MRCAL), c.neuralNetworkPropertyManager().getModels(), NeuralNetworkModelManager.getInstance().getSupportedBackends(), c.getHardwareConfig().deviceName.isEmpty() diff --git a/photon-core/src/main/java/org/photonvision/common/util/TestUtils.java b/photon-core/src/main/java/org/photonvision/common/util/TestUtils.java index 28e1c1a79..0b15c994d 100644 --- a/photon-core/src/main/java/org/photonvision/common/util/TestUtils.java +++ b/photon-core/src/main/java/org/photonvision/common/util/TestUtils.java @@ -20,41 +20,17 @@ package org.photonvision.common.util; import com.fasterxml.jackson.databind.ObjectMapper; import edu.wpi.first.math.geometry.Translation2d; import edu.wpi.first.math.util.Units; -import edu.wpi.first.util.CombinedRuntimeLoader; import java.awt.HeadlessException; import java.io.File; import java.io.IOException; import java.nio.file.Path; import org.opencv.core.Mat; import org.opencv.highgui.HighGui; -import org.photonvision.jni.LibraryLoader; import org.photonvision.vision.calibration.CameraCalibrationCoefficients; import org.photonvision.vision.pipeline.result.CVPipelineResult; import org.photonvision.vision.target.TrackedTarget; public class TestUtils { - private static boolean hasMrcalLoaded = false; - - public static boolean loadLibraries() { - return LibraryLoader.loadWpiLibraries() && LibraryLoader.loadTargeting(); - } - - public static boolean loadMrcal() { - if (hasMrcalLoaded) return true; - try { - CombinedRuntimeLoader.loadLibraries(TestUtils.class, "mrcal_jni"); - hasMrcalLoaded = true; - } catch (IOException e) { - e.printStackTrace(); - hasMrcalLoaded = false; - } - return hasMrcalLoaded; - } - - public static boolean isMrcalLoaded() { - return hasMrcalLoaded; - } - @SuppressWarnings("unused") public enum WPI2019Image { kCargoAngledDark48in(1.2192), diff --git a/photon-core/src/main/java/org/photonvision/jni/PhotonJNICommon.java b/photon-core/src/main/java/org/photonvision/jni/PhotonJNICommon.java deleted file mode 100644 index d9807f979..000000000 --- a/photon-core/src/main/java/org/photonvision/jni/PhotonJNICommon.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright (C) Photon Vision. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package org.photonvision.jni; - -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.StandardCopyOption; -import java.util.List; -import org.photonvision.common.hardware.Platform; -import org.photonvision.common.logging.LogGroup; -import org.photonvision.common.logging.Logger; - -public abstract class PhotonJNICommon { - public abstract boolean isLoaded(); - - public abstract void setLoaded(boolean state); - - protected static Logger logger = null; - - protected static synchronized void forceLoad( - PhotonJNICommon instance, Class clazz, List libraries) throws IOException { - if (instance.isLoaded()) return; - if (logger == null) logger = new Logger(clazz, LogGroup.General); - - for (var libraryName : libraries) { - logger.info("Loading " + libraryName); - // We always extract the shared object (we could hash each so, but that's a lot - // of work) - var arch_name = Platform.getNativeLibraryFolderName(); - var nativeLibName = System.mapLibraryName(libraryName); - try (var in = - clazz.getResourceAsStream("/nativelibraries/" + arch_name + "/" + nativeLibName)) { - if (in == null) { - logger.error("Could not find " + libraryName); - instance.setLoaded(false); - return; - } - - // It's important that we don't mangle the names of these files - var temp = Files.createTempDirectory("nativeExtract").resolve(nativeLibName); - Files.copy(in, temp, StandardCopyOption.REPLACE_EXISTING); - - try { - System.load(temp.toAbsolutePath().toString()); - logger.info("Successfully loaded shared object " + temp.getFileName()); - } catch (UnsatisfiedLinkError e) { - logger.error("Couldn't load shared object " + libraryName, e); - e.printStackTrace(); - instance.setLoaded(false); - return; - } - } - } - instance.setLoaded(true); - } - - protected static synchronized void forceLoad( - PhotonJNICommon instance, Class clazz, String libraryName) throws IOException { - forceLoad(instance, clazz, List.of(libraryName)); - } -} diff --git a/photon-core/src/main/java/org/photonvision/jni/RknnDetectorJNI.java b/photon-core/src/main/java/org/photonvision/jni/RknnDetectorJNI.java deleted file mode 100644 index 6ad21fd9c..000000000 --- a/photon-core/src/main/java/org/photonvision/jni/RknnDetectorJNI.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (C) Photon Vision. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package org.photonvision.jni; - -import java.io.IOException; -import java.util.List; -import org.photonvision.common.util.TestUtils; - -public class RknnDetectorJNI extends PhotonJNICommon { - private boolean isLoaded; - private static RknnDetectorJNI instance = null; - - private RknnDetectorJNI() { - isLoaded = false; - } - - public static RknnDetectorJNI getInstance() { - if (instance == null) instance = new RknnDetectorJNI(); - - return instance; - } - - public static synchronized void forceLoad() throws IOException { - TestUtils.loadLibraries(); - - forceLoad(getInstance(), RknnDetectorJNI.class, List.of("rga", "rknnrt", "rknn_jni")); - } - - @Override - public boolean isLoaded() { - return isLoaded; - } - - @Override - public void setLoaded(boolean state) { - isLoaded = state; - } -} diff --git a/photon-core/src/main/java/org/photonvision/jni/RubikDetectorJNI.java b/photon-core/src/main/java/org/photonvision/jni/RubikDetectorJNI.java deleted file mode 100644 index fa1e6dbda..000000000 --- a/photon-core/src/main/java/org/photonvision/jni/RubikDetectorJNI.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (C) Photon Vision. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package org.photonvision.jni; - -import java.io.IOException; -import java.util.List; -import org.photonvision.common.util.TestUtils; - -public class RubikDetectorJNI extends PhotonJNICommon { - private boolean isLoaded; - private static RubikDetectorJNI instance = null; - - private RubikDetectorJNI() { - isLoaded = false; - } - - public static RubikDetectorJNI getInstance() { - if (instance == null) instance = new RubikDetectorJNI(); - - return instance; - } - - public static synchronized void forceLoad() throws IOException { - TestUtils.loadLibraries(); - - forceLoad( - getInstance(), - RubikDetectorJNI.class, - List.of("tensorflowlite", "tensorflowlite_c", "external_delegate", "rubik_jni")); - } - - @Override - public boolean isLoaded() { - return isLoaded; - } - - @Override - public void setLoaded(boolean state) { - isLoaded = state; - } -} diff --git a/photon-core/src/main/java/org/photonvision/raspi/LibCameraJNILoader.java b/photon-core/src/main/java/org/photonvision/raspi/LibCameraJNILoader.java deleted file mode 100644 index a7f56634d..000000000 --- a/photon-core/src/main/java/org/photonvision/raspi/LibCameraJNILoader.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (C) Photon Vision. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package org.photonvision.raspi; - -import java.io.IOException; -import java.util.List; -import org.photonvision.jni.PhotonJNICommon; - -/** Helper for extracting photon-libcamera-gl-driver shared library files. */ -public class LibCameraJNILoader extends PhotonJNICommon { - private boolean libraryLoaded = false; - private static LibCameraJNILoader instance = null; - - public static synchronized LibCameraJNILoader getInstance() { - if (instance == null) instance = new LibCameraJNILoader(); - - return instance; - } - - public static synchronized void forceLoad() throws IOException { - forceLoad( - LibCameraJNILoader.getInstance(), LibCameraJNILoader.class, List.of("photonlibcamera")); - } - - @Override - public boolean isLoaded() { - return libraryLoaded; - } - - @Override - public void setLoaded(boolean state) { - libraryLoaded = state; - } - - public boolean isSupported() { - return libraryLoaded && LibCameraJNI.isSupported(); - } -} diff --git a/photon-core/src/main/java/org/photonvision/vision/objects/RknnObjectDetector.java b/photon-core/src/main/java/org/photonvision/vision/objects/RknnObjectDetector.java index 7f0799108..3f9ef1ebb 100644 --- a/photon-core/src/main/java/org/photonvision/vision/objects/RknnObjectDetector.java +++ b/photon-core/src/main/java/org/photonvision/vision/objects/RknnObjectDetector.java @@ -26,13 +26,12 @@ import org.opencv.core.Size; import org.photonvision.common.logging.LogGroup; import org.photonvision.common.logging.Logger; import org.photonvision.common.util.ColorHelper; -import org.photonvision.jni.RknnDetectorJNI; import org.photonvision.rknn.RknnJNI; import org.photonvision.vision.pipe.impl.NeuralNetworkPipeResult; /** Manages an object detector using the rknn backend. */ public class RknnObjectDetector implements ObjectDetector { - private static final Logger logger = new Logger(RknnDetectorJNI.class, LogGroup.General); + private static final Logger logger = new Logger(RknnObjectDetector.class, LogGroup.General); /** Cleaner instance to release the detector when it goes out of scope */ private final Cleaner cleaner = Cleaner.create(); diff --git a/photon-core/src/main/java/org/photonvision/vision/objects/RubikObjectDetector.java b/photon-core/src/main/java/org/photonvision/vision/objects/RubikObjectDetector.java index d94b27300..72662d4a4 100644 --- a/photon-core/src/main/java/org/photonvision/vision/objects/RubikObjectDetector.java +++ b/photon-core/src/main/java/org/photonvision/vision/objects/RubikObjectDetector.java @@ -26,13 +26,12 @@ import org.opencv.core.Size; import org.photonvision.common.logging.LogGroup; import org.photonvision.common.logging.Logger; import org.photonvision.common.util.ColorHelper; -import org.photonvision.jni.RubikDetectorJNI; import org.photonvision.rubik.RubikJNI; import org.photonvision.vision.pipe.impl.NeuralNetworkPipeResult; /** Manages an object detector using the rubik backend. */ public class RubikObjectDetector implements ObjectDetector { - private static final Logger logger = new Logger(RubikDetectorJNI.class, LogGroup.General); + private static final Logger logger = new Logger(RubikObjectDetector.class, LogGroup.General); /** Cleaner instance to release the detector when it goes out of scope */ private final Cleaner cleaner = Cleaner.create(); diff --git a/photon-core/src/main/java/org/photonvision/vision/pipe/impl/Calibrate3dPipe.java b/photon-core/src/main/java/org/photonvision/vision/pipe/impl/Calibrate3dPipe.java index aa7dbcadc..961251676 100644 --- a/photon-core/src/main/java/org/photonvision/vision/pipe/impl/Calibrate3dPipe.java +++ b/photon-core/src/main/java/org/photonvision/vision/pipe/impl/Calibrate3dPipe.java @@ -27,9 +27,10 @@ import org.apache.commons.io.FileUtils; import org.opencv.calib3d.Calib3d; import org.opencv.core.*; import org.opencv.imgcodecs.Imgcodecs; +import org.photonvision.common.LoadJNI; +import org.photonvision.common.LoadJNI.JNITypes; import org.photonvision.common.logging.LogGroup; import org.photonvision.common.logging.Logger; -import org.photonvision.common.util.TestUtils; import org.photonvision.common.util.math.MathUtils; import org.photonvision.mrcal.MrCalJNI; import org.photonvision.mrcal.MrCalJNI.MrCalResult; @@ -94,7 +95,7 @@ public class Calibrate3dPipe CameraCalibrationCoefficients ret; var start = System.nanoTime(); - if (TestUtils.isMrcalLoaded() && params.useMrCal) { + if (LoadJNI.hasLoaded(JNITypes.MRCAL) && params.useMrCal) { logger.debug("Calibrating with mrcal!"); ret = calibrateMrcal( diff --git a/photon-core/src/main/java/org/photonvision/vision/processes/VisionSourceManager.java b/photon-core/src/main/java/org/photonvision/vision/processes/VisionSourceManager.java index 329908258..b46e4d1a4 100644 --- a/photon-core/src/main/java/org/photonvision/vision/processes/VisionSourceManager.java +++ b/photon-core/src/main/java/org/photonvision/vision/processes/VisionSourceManager.java @@ -27,6 +27,8 @@ import java.util.Optional; import java.util.function.Predicate; import java.util.regex.Pattern; import java.util.stream.Stream; +import org.photonvision.common.LoadJNI; +import org.photonvision.common.LoadJNI.JNITypes; import org.photonvision.common.configuration.CameraConfiguration; import org.photonvision.common.configuration.ConfigManager; import org.photonvision.common.dataflow.DataChangeService; @@ -40,7 +42,6 @@ import org.photonvision.common.logging.LogGroup; import org.photonvision.common.logging.Logger; import org.photonvision.common.util.TimedTaskManager; import org.photonvision.raspi.LibCameraJNI; -import org.photonvision.raspi.LibCameraJNILoader; import org.photonvision.vision.camera.CameraType; import org.photonvision.vision.camera.FileVisionSource; import org.photonvision.vision.camera.PVCameraInfo; @@ -301,7 +302,7 @@ public class VisionSourceManager { .filter(c -> !(String.join("", c.otherPaths()).contains("csi-video"))) .filter(c -> !c.name().equals("unicam")) .forEach(cameraInfos::add); - if (LibCameraJNILoader.getInstance().isSupported()) { + if (LoadJNI.hasLoaded(JNITypes.LIBCAMERA)) { // find all CSI cameras (Raspberry Pi cameras) Stream.of(LibCameraJNI.getCameraNames()) .map( diff --git a/photon-core/src/test/java/org/photonvision/common/BenchmarkTest.java b/photon-core/src/test/java/org/photonvision/common/BenchmarkTest.java index bbf83c6e6..ae6e16a26 100644 --- a/photon-core/src/test/java/org/photonvision/common/BenchmarkTest.java +++ b/photon-core/src/test/java/org/photonvision/common/BenchmarkTest.java @@ -40,7 +40,7 @@ import org.photonvision.vision.pipeline.result.CVPipelineResult; public class BenchmarkTest { @BeforeAll public static void init() { - TestUtils.loadLibraries(); + LoadJNI.loadLibraries(); } @Test diff --git a/photon-core/src/test/java/org/photonvision/common/ShapeBenchmarkTest.java b/photon-core/src/test/java/org/photonvision/common/ShapeBenchmarkTest.java index 6ce478111..0530d4957 100644 --- a/photon-core/src/test/java/org/photonvision/common/ShapeBenchmarkTest.java +++ b/photon-core/src/test/java/org/photonvision/common/ShapeBenchmarkTest.java @@ -56,7 +56,7 @@ import org.photonvision.vision.pipeline.result.CVPipelineResult; public class ShapeBenchmarkTest { @BeforeAll public static void init() { - TestUtils.loadLibraries(); + LoadJNI.loadLibraries(); } @Test diff --git a/photon-core/src/test/java/org/photonvision/common/configuration/ConfigTest.java b/photon-core/src/test/java/org/photonvision/common/configuration/ConfigTest.java index 95262912a..ad5249e4f 100644 --- a/photon-core/src/test/java/org/photonvision/common/configuration/ConfigTest.java +++ b/photon-core/src/test/java/org/photonvision/common/configuration/ConfigTest.java @@ -28,10 +28,10 @@ import java.nio.file.Path; import java.nio.file.Paths; import org.apache.commons.io.FileUtils; import org.junit.jupiter.api.*; +import org.photonvision.common.LoadJNI; import org.photonvision.common.logging.LogGroup; import org.photonvision.common.logging.LogLevel; import org.photonvision.common.logging.Logger; -import org.photonvision.common.util.TestUtils; import org.photonvision.common.util.file.JacksonUtils; import org.photonvision.vision.camera.PVCameraInfo; import org.photonvision.vision.pipeline.AprilTagPipelineSettings; @@ -51,7 +51,7 @@ public class ConfigTest { @BeforeAll public static void init() { - TestUtils.loadLibraries(); + LoadJNI.loadLibraries(); var path = Path.of("testconfigdir"); configMgr = new ConfigManager(path, new LegacyConfigProvider(path)); configMgr.load(); @@ -79,7 +79,7 @@ public class ConfigTest { @Test @Order(1) public void serializeConfig() { - TestUtils.loadLibraries(); + LoadJNI.loadLibraries(); Logger.setLevel(LogGroup.General, LogLevel.TRACE); configMgr.getConfig().addCameraConfig(cameraConfig); diff --git a/photon-core/src/test/java/org/photonvision/common/configuration/SQLConfigTest.java b/photon-core/src/test/java/org/photonvision/common/configuration/SQLConfigTest.java index 3fd8802f4..642c09487 100644 --- a/photon-core/src/test/java/org/photonvision/common/configuration/SQLConfigTest.java +++ b/photon-core/src/test/java/org/photonvision/common/configuration/SQLConfigTest.java @@ -27,6 +27,7 @@ import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; +import org.photonvision.common.LoadJNI; import org.photonvision.common.util.TestUtils; import org.photonvision.vision.camera.CameraQuirk; import org.photonvision.vision.camera.PVCameraInfo; @@ -39,7 +40,7 @@ public class SQLConfigTest { @BeforeAll public static void init() { - TestUtils.loadLibraries(); + LoadJNI.loadLibraries(); } @Test diff --git a/photon-core/src/test/java/org/photonvision/common/util/CoordinateConversionTest.java b/photon-core/src/test/java/org/photonvision/common/util/CoordinateConversionTest.java index a452f517f..ae70fca0e 100644 --- a/photon-core/src/test/java/org/photonvision/common/util/CoordinateConversionTest.java +++ b/photon-core/src/test/java/org/photonvision/common/util/CoordinateConversionTest.java @@ -25,12 +25,13 @@ import edu.wpi.first.math.geometry.Transform3d; import edu.wpi.first.math.geometry.Translation3d; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; +import org.photonvision.common.LoadJNI; import org.photonvision.common.util.math.MathUtils; public class CoordinateConversionTest { @BeforeAll public static void Init() { - TestUtils.loadLibraries(); + LoadJNI.loadLibraries(); } @Test diff --git a/photon-core/src/test/java/org/photonvision/hardware/HardwareTest.java b/photon-core/src/test/java/org/photonvision/hardware/HardwareTest.java index 2d822f1f7..b85a7e1e9 100644 --- a/photon-core/src/test/java/org/photonvision/hardware/HardwareTest.java +++ b/photon-core/src/test/java/org/photonvision/hardware/HardwareTest.java @@ -21,17 +21,17 @@ import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; import org.junit.jupiter.api.Test; +import org.photonvision.common.LoadJNI; import org.photonvision.common.hardware.GPIO.CustomGPIO; import org.photonvision.common.hardware.GPIO.GPIOBase; import org.photonvision.common.hardware.GPIO.pi.PigpioPin; import org.photonvision.common.hardware.Platform; import org.photonvision.common.hardware.metrics.MetricsManager; -import org.photonvision.common.util.TestUtils; public class HardwareTest { @Test public void testHardware() { - TestUtils.loadLibraries(); + LoadJNI.loadLibraries(); MetricsManager mm = new MetricsManager(); if (!Platform.isRaspberryPi()) return; diff --git a/photon-core/src/test/java/org/photonvision/vision/frame/provider/FileFrameProviderTest.java b/photon-core/src/test/java/org/photonvision/vision/frame/provider/FileFrameProviderTest.java index 05cddeb9d..683c78cea 100644 --- a/photon-core/src/test/java/org/photonvision/vision/frame/provider/FileFrameProviderTest.java +++ b/photon-core/src/test/java/org/photonvision/vision/frame/provider/FileFrameProviderTest.java @@ -23,13 +23,14 @@ import java.nio.file.Files; import java.nio.file.Paths; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; +import org.photonvision.common.LoadJNI; import org.photonvision.common.util.TestUtils; import org.photonvision.vision.frame.Frame; public class FileFrameProviderTest { @BeforeAll public static void initPath() { - TestUtils.loadLibraries(); + LoadJNI.loadLibraries(); } @Test diff --git a/photon-core/src/test/java/org/photonvision/vision/opencv/ContourTest.java b/photon-core/src/test/java/org/photonvision/vision/opencv/ContourTest.java index 6e6c6fb17..8225c573b 100644 --- a/photon-core/src/test/java/org/photonvision/vision/opencv/ContourTest.java +++ b/photon-core/src/test/java/org/photonvision/vision/opencv/ContourTest.java @@ -25,12 +25,12 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.opencv.core.MatOfPoint; import org.opencv.core.Point; -import org.photonvision.common.util.TestUtils; +import org.photonvision.common.LoadJNI; public class ContourTest { @BeforeEach public void Init() { - TestUtils.loadLibraries(); + LoadJNI.loadLibraries(); } @Test diff --git a/photon-core/src/test/java/org/photonvision/vision/pipeline/AprilTagTest.java b/photon-core/src/test/java/org/photonvision/vision/pipeline/AprilTagTest.java index 14cdf1767..1a6cff75c 100644 --- a/photon-core/src/test/java/org/photonvision/vision/pipeline/AprilTagTest.java +++ b/photon-core/src/test/java/org/photonvision/vision/pipeline/AprilTagTest.java @@ -22,6 +22,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import edu.wpi.first.math.geometry.Translation3d; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.photonvision.common.LoadJNI; import org.photonvision.common.configuration.ConfigManager; import org.photonvision.common.util.TestUtils; import org.photonvision.vision.apriltag.AprilTagFamily; @@ -33,7 +34,7 @@ import org.photonvision.vision.target.TargetModel; public class AprilTagTest { @BeforeEach public void setup() { - TestUtils.loadLibraries(); + LoadJNI.loadLibraries(); ConfigManager.getInstance().load(); } diff --git a/photon-core/src/test/java/org/photonvision/vision/pipeline/ArucoPipelineTest.java b/photon-core/src/test/java/org/photonvision/vision/pipeline/ArucoPipelineTest.java index a145b503e..6bbb149eb 100644 --- a/photon-core/src/test/java/org/photonvision/vision/pipeline/ArucoPipelineTest.java +++ b/photon-core/src/test/java/org/photonvision/vision/pipeline/ArucoPipelineTest.java @@ -22,6 +22,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import edu.wpi.first.math.geometry.Translation3d; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.photonvision.common.LoadJNI; import org.photonvision.common.configuration.ConfigManager; import org.photonvision.common.util.TestUtils; import org.photonvision.vision.apriltag.AprilTagFamily; @@ -33,7 +34,7 @@ import org.photonvision.vision.target.TargetModel; public class ArucoPipelineTest { @BeforeEach public void setup() { - TestUtils.loadLibraries(); + LoadJNI.loadLibraries(); ConfigManager.getInstance().load(); } diff --git a/photon-core/src/test/java/org/photonvision/vision/pipeline/Calibrate3dPipeTest.java b/photon-core/src/test/java/org/photonvision/vision/pipeline/Calibrate3dPipeTest.java index 3442d68e0..1a694a1a7 100644 --- a/photon-core/src/test/java/org/photonvision/vision/pipeline/Calibrate3dPipeTest.java +++ b/photon-core/src/test/java/org/photonvision/vision/pipeline/Calibrate3dPipeTest.java @@ -32,6 +32,7 @@ import org.opencv.calib3d.Calib3d; import org.opencv.core.Mat; import org.opencv.core.Size; import org.opencv.imgcodecs.Imgcodecs; +import org.photonvision.common.LoadJNI; import org.photonvision.common.configuration.ConfigManager; import org.photonvision.common.logging.LogGroup; import org.photonvision.common.logging.LogLevel; @@ -50,8 +51,8 @@ import org.photonvision.vision.pipeline.UICalibrationData.TagFamily; public class Calibrate3dPipeTest { @BeforeAll public static void init() throws IOException { - TestUtils.loadLibraries(); - TestUtils.loadMrcal(); + LoadJNI.loadLibraries(); + LoadJNI.forceLoad(LoadJNI.JNITypes.MRCAL); var logLevel = LogLevel.DEBUG; Logger.setLevel(LogGroup.Camera, logLevel); diff --git a/photon-core/src/test/java/org/photonvision/vision/pipeline/CalibrationRotationPipeTest.java b/photon-core/src/test/java/org/photonvision/vision/pipeline/CalibrationRotationPipeTest.java index 16b0e6655..f0f9d482a 100644 --- a/photon-core/src/test/java/org/photonvision/vision/pipeline/CalibrationRotationPipeTest.java +++ b/photon-core/src/test/java/org/photonvision/vision/pipeline/CalibrationRotationPipeTest.java @@ -29,11 +29,11 @@ import org.junitpioneer.jupiter.cartesian.CartesianTest; import org.junitpioneer.jupiter.cartesian.CartesianTest.Enum; import org.opencv.core.Point; import org.opencv.core.Size; +import org.photonvision.common.LoadJNI; import org.photonvision.common.configuration.ConfigManager; import org.photonvision.common.logging.LogGroup; import org.photonvision.common.logging.LogLevel; import org.photonvision.common.logging.Logger; -import org.photonvision.common.util.TestUtils; import org.photonvision.estimation.OpenCVHelp; import org.photonvision.vision.calibration.CameraCalibrationCoefficients; import org.photonvision.vision.calibration.CameraLensModel; @@ -48,8 +48,8 @@ import org.photonvision.vision.target.TrackedTarget; public class CalibrationRotationPipeTest { @BeforeAll public static void init() throws IOException { - TestUtils.loadLibraries(); - TestUtils.loadMrcal(); + LoadJNI.loadLibraries(); + LoadJNI.forceLoad(LoadJNI.JNITypes.MRCAL); var logLevel = LogLevel.DEBUG; Logger.setLevel(LogGroup.Camera, logLevel); diff --git a/photon-core/src/test/java/org/photonvision/vision/pipeline/CirclePNPTest.java b/photon-core/src/test/java/org/photonvision/vision/pipeline/CirclePNPTest.java index 35f02fc90..f801d6507 100644 --- a/photon-core/src/test/java/org/photonvision/vision/pipeline/CirclePNPTest.java +++ b/photon-core/src/test/java/org/photonvision/vision/pipeline/CirclePNPTest.java @@ -22,6 +22,7 @@ import static org.junit.jupiter.api.Assertions.assertNotNull; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.photonvision.common.LoadJNI; import org.photonvision.common.util.TestUtils; import org.photonvision.vision.calibration.CameraCalibrationCoefficients; import org.photonvision.vision.camera.QuirkyCamera; @@ -40,7 +41,7 @@ public class CirclePNPTest { @BeforeEach public void Init() { - TestUtils.loadLibraries(); + LoadJNI.loadLibraries(); } @Test @@ -132,7 +133,7 @@ public class CirclePNPTest { // used to run VisualVM for profiling, which won't run on unit tests. public static void main(String[] args) { - TestUtils.loadLibraries(); + LoadJNI.loadLibraries(); var frameProvider = new FileFrameProvider( TestUtils.getWPIImagePath(TestUtils.WPI2019Image.kCargoStraightDark72in_HighRes, false), diff --git a/photon-core/src/test/java/org/photonvision/vision/pipeline/ColoredShapePipelineTest.java b/photon-core/src/test/java/org/photonvision/vision/pipeline/ColoredShapePipelineTest.java index 0e33c0fa3..9722ff141 100644 --- a/photon-core/src/test/java/org/photonvision/vision/pipeline/ColoredShapePipelineTest.java +++ b/photon-core/src/test/java/org/photonvision/vision/pipeline/ColoredShapePipelineTest.java @@ -18,6 +18,7 @@ package org.photonvision.vision.pipeline; import org.junit.jupiter.api.Test; +import org.photonvision.common.LoadJNI; import org.photonvision.common.util.TestUtils; import org.photonvision.vision.camera.QuirkyCamera; import org.photonvision.vision.frame.Frame; @@ -89,7 +90,7 @@ public class ColoredShapePipelineTest { } public static void main(String[] args) { - TestUtils.loadLibraries(); + LoadJNI.loadLibraries(); System.out.println( TestUtils.getWPIImagePath(TestUtils.WPI2020Image.kBlueGoal_108in_Center, false)); var frameProvider = diff --git a/photon-core/src/test/java/org/photonvision/vision/pipeline/ReflectivePipelineTest.java b/photon-core/src/test/java/org/photonvision/vision/pipeline/ReflectivePipelineTest.java index 5e10b56b1..6427a8636 100644 --- a/photon-core/src/test/java/org/photonvision/vision/pipeline/ReflectivePipelineTest.java +++ b/photon-core/src/test/java/org/photonvision/vision/pipeline/ReflectivePipelineTest.java @@ -21,6 +21,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; import org.junit.jupiter.api.Test; +import org.photonvision.common.LoadJNI; import org.photonvision.common.util.TestUtils; import org.photonvision.vision.camera.QuirkyCamera; import org.photonvision.vision.frame.Frame; @@ -34,7 +35,7 @@ import org.photonvision.vision.pipeline.result.CVPipelineResult; public class ReflectivePipelineTest { @Test public void test2019() { - TestUtils.loadLibraries(); + LoadJNI.loadLibraries(); var pipeline = new ReflectivePipeline(); pipeline.getSettings().hsvHue.set(60, 100); pipeline.getSettings().hsvSaturation.set(100, 255); @@ -72,7 +73,7 @@ public class ReflectivePipelineTest { @Test public void test2020() { - TestUtils.loadLibraries(); + LoadJNI.loadLibraries(); var pipeline = new ReflectivePipeline(); pipeline.getSettings().hsvHue.set(60, 100); @@ -108,7 +109,7 @@ public class ReflectivePipelineTest { // used to run VisualVM for profiling. It won't run on unit tests. public static void main(String[] args) { - TestUtils.loadLibraries(); + LoadJNI.loadLibraries(); var frameProvider = new FileFrameProvider( TestUtils.getWPIImagePath(TestUtils.WPI2019Image.kCargoStraightDark72in_HighRes, false), diff --git a/photon-core/src/test/java/org/photonvision/vision/pipeline/SolvePNPTest.java b/photon-core/src/test/java/org/photonvision/vision/pipeline/SolvePNPTest.java index fad273df4..3d7b4f014 100644 --- a/photon-core/src/test/java/org/photonvision/vision/pipeline/SolvePNPTest.java +++ b/photon-core/src/test/java/org/photonvision/vision/pipeline/SolvePNPTest.java @@ -26,6 +26,7 @@ import edu.wpi.first.math.geometry.Translation3d; import edu.wpi.first.math.util.Units; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.photonvision.common.LoadJNI; import org.photonvision.common.util.TestUtils; import org.photonvision.vision.calibration.CameraCalibrationCoefficients; import org.photonvision.vision.camera.QuirkyCamera; @@ -44,7 +45,7 @@ public class SolvePNPTest { @BeforeEach public void Init() { - TestUtils.loadLibraries(); + LoadJNI.loadLibraries(); } @Test @@ -213,7 +214,7 @@ public class SolvePNPTest { // used to run VisualVM for profiling, which won't run on unit tests. public static void main(String[] args) { - TestUtils.loadLibraries(); + LoadJNI.loadLibraries(); var frameProvider = new FileFrameProvider( TestUtils.getWPIImagePath(TestUtils.WPI2019Image.kCargoStraightDark72in_HighRes, false), diff --git a/photon-core/src/test/java/org/photonvision/vision/processes/PipelineManagerTest.java b/photon-core/src/test/java/org/photonvision/vision/processes/PipelineManagerTest.java index 3d229bdfe..f9e697ebd 100644 --- a/photon-core/src/test/java/org/photonvision/vision/processes/PipelineManagerTest.java +++ b/photon-core/src/test/java/org/photonvision/vision/processes/PipelineManagerTest.java @@ -23,15 +23,15 @@ import java.util.ArrayList; import java.util.List; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; +import org.photonvision.common.LoadJNI; import org.photonvision.common.configuration.ConfigManager; -import org.photonvision.common.util.TestUtils; import org.photonvision.vision.pipeline.DriverModePipelineSettings; import org.photonvision.vision.pipeline.PipelineType; public class PipelineManagerTest { @BeforeAll public static void init() { - TestUtils.loadLibraries(); + LoadJNI.loadLibraries(); } @Test diff --git a/photon-core/src/test/java/org/photonvision/vision/processes/VisionModuleManagerTest.java b/photon-core/src/test/java/org/photonvision/vision/processes/VisionModuleManagerTest.java index 355131da5..ba1025fb1 100644 --- a/photon-core/src/test/java/org/photonvision/vision/processes/VisionModuleManagerTest.java +++ b/photon-core/src/test/java/org/photonvision/vision/processes/VisionModuleManagerTest.java @@ -27,6 +27,7 @@ import java.util.HashMap; import java.util.List; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; +import org.photonvision.common.LoadJNI; import org.photonvision.common.configuration.CameraConfiguration; import org.photonvision.common.configuration.ConfigManager; import org.photonvision.common.dataflow.CVPipelineResultConsumer; @@ -46,7 +47,7 @@ public class VisionModuleManagerTest { String classpathStr = System.getProperty("java.class.path"); System.out.print(classpathStr); - TestUtils.loadLibraries(); + LoadJNI.loadLibraries(); if (!LibraryLoader.loadTargeting()) fail(); } diff --git a/photon-core/src/test/java/org/photonvision/vision/processes/VisionSourceManagerTest.java b/photon-core/src/test/java/org/photonvision/vision/processes/VisionSourceManagerTest.java index c3ec48d00..067345787 100644 --- a/photon-core/src/test/java/org/photonvision/vision/processes/VisionSourceManagerTest.java +++ b/photon-core/src/test/java/org/photonvision/vision/processes/VisionSourceManagerTest.java @@ -29,6 +29,7 @@ import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.photonvision.common.LoadJNI; import org.photonvision.common.configuration.CameraConfiguration; import org.photonvision.common.configuration.ConfigManager; import org.photonvision.common.util.TestUtils; @@ -58,7 +59,7 @@ public class VisionSourceManagerTest { @BeforeAll public static void loadLibraries() { - assertTrue(TestUtils.loadLibraries()); + assertTrue(LoadJNI.loadLibraries()); // Broadcast all still calls into configmanager (ew) so set that up here ConfigManager.getInstance().load(); diff --git a/photon-core/src/test/java/org/photonvision/vision/target/TargetCalculationsTest.java b/photon-core/src/test/java/org/photonvision/vision/target/TargetCalculationsTest.java index c6aad210c..5089e4e79 100644 --- a/photon-core/src/test/java/org/photonvision/vision/target/TargetCalculationsTest.java +++ b/photon-core/src/test/java/org/photonvision/vision/target/TargetCalculationsTest.java @@ -32,7 +32,7 @@ import org.junit.jupiter.params.provider.MethodSource; import org.opencv.calib3d.Calib3d; import org.opencv.core.*; import org.opencv.imgproc.Imgproc; -import org.photonvision.common.util.TestUtils; +import org.photonvision.common.LoadJNI; import org.photonvision.common.util.numbers.DoubleCouple; import org.photonvision.vision.calibration.CameraCalibrationCoefficients; import org.photonvision.vision.calibration.CameraLensModel; @@ -63,7 +63,7 @@ public class TargetCalculationsTest { @BeforeAll public static void setup() { - TestUtils.loadLibraries(); + LoadJNI.loadLibraries(); } @Test diff --git a/photon-core/src/test/java/org/photonvision/vision/target/TrackedTargetTest.java b/photon-core/src/test/java/org/photonvision/vision/target/TrackedTargetTest.java index 0311d309f..c373ef88f 100644 --- a/photon-core/src/test/java/org/photonvision/vision/target/TrackedTargetTest.java +++ b/photon-core/src/test/java/org/photonvision/vision/target/TrackedTargetTest.java @@ -25,14 +25,14 @@ import org.junit.jupiter.api.Test; import org.opencv.core.MatOfPoint; import org.opencv.core.Point; import org.opencv.core.Size; -import org.photonvision.common.util.TestUtils; +import org.photonvision.common.LoadJNI; import org.photonvision.vision.opencv.Contour; import org.photonvision.vision.opencv.DualOffsetValues; public class TrackedTargetTest { @BeforeEach public void Init() { - TestUtils.loadLibraries(); + LoadJNI.loadLibraries(); } @Test diff --git a/photon-server/src/main/java/org/photonvision/Main.java b/photon-server/src/main/java/org/photonvision/Main.java index 5d012d23f..3d134c2cd 100644 --- a/photon-server/src/main/java/org/photonvision/Main.java +++ b/photon-server/src/main/java/org/photonvision/Main.java @@ -23,6 +23,7 @@ import java.nio.file.Path; import java.util.ArrayList; import java.util.List; import org.apache.commons.cli.*; +import org.photonvision.common.LoadJNI; import org.photonvision.common.configuration.CameraConfiguration; import org.photonvision.common.configuration.ConfigManager; import org.photonvision.common.configuration.NeuralNetworkModelManager; @@ -38,9 +39,6 @@ import org.photonvision.common.logging.Logger; import org.photonvision.common.logging.PvCSCoreLogger; import org.photonvision.common.networking.NetworkManager; import org.photonvision.common.util.TestUtils; -import org.photonvision.jni.RknnDetectorJNI; -import org.photonvision.jni.RubikDetectorJNI; -import org.photonvision.raspi.LibCameraJNILoader; import org.photonvision.server.Server; import org.photonvision.vision.apriltag.AprilTagFamily; import org.photonvision.vision.camera.PVCameraInfo; @@ -194,7 +192,7 @@ public class Main { } try { - boolean success = TestUtils.loadLibraries(); + boolean success = LoadJNI.loadLibraries(); if (!success) { logger.error("Failed to load native libraries! Giving up :("); @@ -213,41 +211,35 @@ public class Main { try { if (Platform.isRaspberryPi()) { - LibCameraJNILoader.forceLoad(); + LoadJNI.forceLoad(LoadJNI.JNITypes.LIBCAMERA); + logger.info("Loaded libcamera-JNI"); } } catch (IOException e) { logger.error("Failed to load libcamera-JNI!", e); } try { if (Platform.isRK3588()) { - RknnDetectorJNI.forceLoad(); - if (RknnDetectorJNI.getInstance().isLoaded()) { - logger.info("RknnDetectorJNI loaded successfully."); - } else { - logger.error("Failed to load RknnDetectorJNI!"); - } + LoadJNI.forceLoad(LoadJNI.JNITypes.RKNN_DETECTOR); + logger.info("Loaded RKNN-JNI"); } else { logger.error("Platform does not support RKNN based machine learning!"); } } catch (IOException e) { - logger.error("Failed to load rknn-JNI!", e); + logger.error("Failed to load RKNN-JNI!", e); } try { if (Platform.isQCS6490()) { - RubikDetectorJNI.forceLoad(); - if (RubikDetectorJNI.getInstance().isLoaded()) { - logger.info("RubikDetectorJNI loaded successfully."); - } else { - logger.error("Failed to load RubikDetectorJNI!"); - } + LoadJNI.forceLoad(LoadJNI.JNITypes.RUBIK_DETECTOR); + logger.info("Loaded Rubik-JNI"); } else { logger.error("Platform does not support Rubik based machine learning!"); } } catch (IOException e) { - logger.error("Failed to load rubik-JNI!", e); + logger.error("Failed to load Rubik-JNI!", e); } try { - TestUtils.loadMrcal(); + LoadJNI.forceLoad(LoadJNI.JNITypes.MRCAL); + logger.info("mrcal-JNI loaded successfully."); } catch (Exception e) { logger.warn( "Failed to load mrcal-JNI! Camera calibration will fall back to opencv\n" diff --git a/photon-targeting/src/main/java/org/photonvision/common/hardware/Platform.java b/photon-targeting/src/main/java/org/photonvision/common/hardware/Platform.java index 1080f40ab..2887521cb 100644 --- a/photon-targeting/src/main/java/org/photonvision/common/hardware/Platform.java +++ b/photon-targeting/src/main/java/org/photonvision/common/hardware/Platform.java @@ -27,65 +27,50 @@ import java.util.function.Supplier; @SuppressWarnings("unused") public enum Platform { // WPILib Supported (JNI) - WINDOWS_64("Windows x64", Platform::getUnknownModel, "winx64", false, OSType.WINDOWS, true), - LINUX_32("Linux x86", Platform::getUnknownModel, "linuxx64", false, OSType.LINUX, true), - LINUX_64("Linux x64", Platform::getUnknownModel, "linuxx64", false, OSType.LINUX, true), + WINDOWS_64("Windows x64", Platform::getUnknownModel, false, OSType.WINDOWS, true), + LINUX_32("Linux x86", Platform::getUnknownModel, false, OSType.LINUX, true), + LINUX_64("Linux x64", Platform::getUnknownModel, false, OSType.LINUX, true), LINUX_RASPBIAN32( "Linux Raspbian 32-bit", Platform::getLinuxDeviceTreeModel, - "linuxarm32", true, OSType.LINUX, true), // Raspberry Pi 3/4 with a 32-bit image LINUX_RASPBIAN64( "Linux Raspbian 64-bit", Platform::getLinuxDeviceTreeModel, - "linuxarm64", true, OSType.LINUX, true), // Raspberry Pi 3/4 with a 64-bit image LINUX_RK3588_64( "Linux AARCH 64-bit with RK3588", Platform::getLinuxDeviceTreeModel, - "linuxarm64", false, OSType.LINUX, true), LINUX_QCS6490( "Linux AARCH 64-bit with QCS6490", Platform::getLinuxDeviceTreeModel, - "linuxarm64", false, OSType.LINUX, true), // QCS6490 SBCs LINUX_AARCH64( "Linux AARCH64", Platform::getLinuxDeviceTreeModel, - "linuxarm64", false, OSType.LINUX, true), // Jetson Nano, Jetson TX2 // PhotonVision Supported (Manual build/install) LINUX_ARM64( - "Linux ARM64", - Platform::getLinuxDeviceTreeModel, - "linuxarm64", - false, - OSType.LINUX, - true), // ODROID C2, N2 + "Linux ARM64", Platform::getLinuxDeviceTreeModel, false, OSType.LINUX, true), // ODROID C2, N2 // Completely unsupported - WINDOWS_32("Windows x86", Platform::getUnknownModel, "windowsx64", false, OSType.WINDOWS, false), - MACOS("Mac OS", Platform::getUnknownModel, "osxuniversal", false, OSType.MACOS, false), + WINDOWS_32("Windows x86", Platform::getUnknownModel, false, OSType.WINDOWS, false), + MACOS("Mac OS", Platform::getUnknownModel, false, OSType.MACOS, false), LINUX_ARM32( - "Linux ARM32", - Platform::getUnknownModel, - "linuxarm32", - false, - OSType.LINUX, - false), // ODROID XU4, C1+ - UNKNOWN("Unsupported Platform", Platform::getUnknownModel, "", false, OSType.UNKNOWN, false); + "Linux ARM32", Platform::getUnknownModel, false, OSType.LINUX, false), // ODROID XU4, C1+ + UNKNOWN("Unsupported Platform", Platform::getUnknownModel, false, OSType.UNKNOWN, false); public enum OSType { WINDOWS, @@ -96,7 +81,6 @@ public enum Platform { public final String description; public final String hardwareModel; - public final String nativeLibraryFolderName; public final boolean isPi; public final OSType osType; public final boolean isSupported; @@ -108,7 +92,6 @@ public enum Platform { Platform( String description, Supplier getHardwareModel, - String nativeLibFolderName, boolean isPi, OSType osType, boolean isSupported) { @@ -117,7 +100,6 @@ public enum Platform { this.isPi = isPi; this.osType = osType; this.isSupported = isSupported; - this.nativeLibraryFolderName = nativeLibFolderName; } public static void overridePlatform(Platform platform) { @@ -161,10 +143,6 @@ public enum Platform { return currentPlatform.hardwareModel; } - public static String getNativeLibraryFolderName() { - return currentPlatform.nativeLibraryFolderName; - } - public static boolean isSupported() { return currentPlatform.isSupported; }