From 86ea661ed9840afb36cb94c8302c6ba92ceae1cc Mon Sep 17 00:00:00 2001 From: Banks T Date: Sat, 8 Aug 2020 21:30:39 -0400 Subject: [PATCH] Fix camera matching (#87) * Add name matching * Remove index matching * Add name-only matching fallback * Fix debug log location, fix name matching * Apply LessSpot --- .../vision/processes/VisionSourceManager.java | 56 +++++++++++-------- 1 file changed, 33 insertions(+), 23 deletions(-) diff --git a/photon-server/src/main/java/org/photonvision/vision/processes/VisionSourceManager.java b/photon-server/src/main/java/org/photonvision/vision/processes/VisionSourceManager.java index 603e17533..a6744b962 100644 --- a/photon-server/src/main/java/org/photonvision/vision/processes/VisionSourceManager.java +++ b/photon-server/src/main/java/org/photonvision/vision/processes/VisionSourceManager.java @@ -21,7 +21,6 @@ import edu.wpi.cscore.UsbCamera; import edu.wpi.cscore.UsbCameraInfo; import java.util.*; import java.util.stream.Collectors; -import org.apache.commons.lang3.StringUtils; import org.photonvision.common.configuration.CameraConfiguration; import org.photonvision.common.logging.LogGroup; import org.photonvision.common.logging.Logger; @@ -100,27 +99,29 @@ public class VisionSourceManager { for (CameraConfiguration config : loadedUsbCamConfigs) { UsbCameraInfo cameraInfo; - // Load by path vs by index -- if the path is numeric we'll match by index - if (StringUtils.isNumeric(config.path)) { - // match by index - var index = Integer.parseInt(config.path); - logger.debug( - "Trying to find a match for loaded camera " + config.baseName + " with index " + index); + // attempt matching by path and basename + logger.debug( + "Trying to find a match for loaded camera " + + config.baseName + + " with path " + + config.path); + cameraInfo = + detectedCameraList.stream() + .filter( + usbCameraInfo -> + usbCameraInfo.path.equals(config.path) + && cameraNameToBaseName(usbCameraInfo.name).equals(config.baseName)) + .findFirst() + .orElse(null); + + // if path based fails, attempt basename only match + if (cameraInfo == null) { + logger.debug("Failed to match by path and name, falling back to name-only match"); cameraInfo = detectedCameraList.stream() - .filter(usbCameraInfo -> usbCameraInfo.dev == index) - .findFirst() - .orElse(null); - } else { - // matching by path - logger.debug( - "Trying to find a match for loaded camera " - + config.baseName - + " with path " - + config.path); - cameraInfo = - detectedCameraList.stream() - .filter(usbCameraInfo -> usbCameraInfo.path.equals(config.path)) + .filter( + usbCameraInfo -> + cameraNameToBaseName(usbCameraInfo.name).equals(config.baseName)) .findFirst() .orElse(null); } @@ -139,9 +140,8 @@ public class VisionSourceManager { "After matching loaded configs " + detectedCameraList.size() + " cameras were unmatched."); for (UsbCameraInfo info : detectedCameraList) { // create new camera config for all new cameras - String baseName = - info.name.replaceAll("[^\\x00-\\x7F]", ""); // Remove all non-ASCII characters - String uniqueName = baseName.replaceAll(" ", "_"); // Replace spaces with underscores; + String baseName = cameraNameToBaseName(info.name); + String uniqueName = baseNameToUniqueName(baseName); int suffix = 0; while (containsName(cameraConfigurations, uniqueName)) { @@ -160,6 +160,16 @@ public class VisionSourceManager { return cameraConfigurations; } + // Remove all non-ASCII characters + private static String cameraNameToBaseName(String cameraName) { + return cameraName.replaceAll("[^\\x00-\\x7F]", ""); + } + + // Replace spaces with underscores + private static String baseNameToUniqueName(String baseName) { + return baseName.replaceAll(" ", "_"); + } + private static List loadVisionSourcesFromCamConfigs( List camConfigs) { List usbCameraSources = new ArrayList<>();