Properly assign camera index when connecting new camera (#819)

This commit is contained in:
Matt
2023-03-01 16:05:30 -05:00
committed by GitHub
parent 2b8f900768
commit dcd917870c
2 changed files with 17 additions and 4 deletions

View File

@@ -19,9 +19,13 @@ package org.photonvision.vision.processes;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import org.photonvision.common.logging.LogGroup;
import org.photonvision.common.logging.Logger;
/** VisionModuleManager has many VisionModules, and provides camera configuration data to them. */ /** VisionModuleManager has many VisionModules, and provides camera configuration data to them. */
public class VisionModuleManager { public class VisionModuleManager {
private final Logger logger = new Logger(VisionModuleManager.class, LogGroup.VisionModule);
private static class ThreadSafeSingleton { private static class ThreadSafeSingleton {
private static final VisionModuleManager INSTANCE = new VisionModuleManager(); private static final VisionModuleManager INSTANCE = new VisionModuleManager();
} }
@@ -32,7 +36,7 @@ public class VisionModuleManager {
protected final List<VisionModule> visionModules = new ArrayList<>(); protected final List<VisionModule> visionModules = new ArrayList<>();
private VisionModuleManager() {} VisionModuleManager() {}
public List<VisionModule> getModules() { public List<VisionModule> getModules() {
return visionModules; return visionModules;
@@ -77,8 +81,15 @@ public class VisionModuleManager {
// The best we can do is try to avoid a case where the stream index runs away to infinity // The best we can do is try to avoid a case where the stream index runs away to infinity
// since we can only stream 5 cameras at once // since we can only stream 5 cameras at once
// Big list, which should contain every vision source (currently loaded plus the new ones being
// added)
var bigList = new ArrayList<VisionSource>();
bigList.addAll(
this.getModules().stream().map(it -> it.visionSource).collect(Collectors.toList()));
bigList.addAll(config);
for (var v : config) { for (var v : config) {
var listNoV = new ArrayList<>(config); var listNoV = new ArrayList<>(bigList);
listNoV.remove(v); listNoV.remove(v);
if (listNoV.stream() if (listNoV.stream()
.anyMatch( .anyMatch(
@@ -92,6 +103,7 @@ public class VisionModuleManager {
.contains(idx)) { .contains(idx)) {
idx++; idx++;
} }
logger.debug("Assigning idx " + idx);
v.getCameraConfiguration().streamIndex = idx; v.getCameraConfiguration().streamIndex = idx;
} }
} }

View File

@@ -137,6 +137,8 @@ public class VisionModuleManagerTest {
public void testMultipleStreamIndex() { public void testMultipleStreamIndex() {
ConfigManager.getInstance().load(); ConfigManager.getInstance().load();
var vmm = new VisionModuleManager();
var conf = new CameraConfiguration("Foo", "Bar"); var conf = new CameraConfiguration("Foo", "Bar");
conf.streamIndex = 1; conf.streamIndex = 1;
var ffp = var ffp =
@@ -161,8 +163,7 @@ public class VisionModuleManagerTest {
TestUtils.WPI2019Image.FOV); TestUtils.WPI2019Image.FOV);
var testSource3 = new TestSource(ffp3, conf3); var testSource3 = new TestSource(ffp3, conf3);
var modules = var modules = vmm.addSources(List.of(testSource, testSource2, testSource3));
VisionModuleManager.getInstance().addSources(List.of(testSource, testSource2, testSource3));
System.out.println( System.out.println(
Arrays.toString( Arrays.toString(