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.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. */
public class VisionModuleManager {
private final Logger logger = new Logger(VisionModuleManager.class, LogGroup.VisionModule);
private static class ThreadSafeSingleton {
private static final VisionModuleManager INSTANCE = new VisionModuleManager();
}
@@ -32,7 +36,7 @@ public class VisionModuleManager {
protected final List<VisionModule> visionModules = new ArrayList<>();
private VisionModuleManager() {}
VisionModuleManager() {}
public List<VisionModule> getModules() {
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
// 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) {
var listNoV = new ArrayList<>(config);
var listNoV = new ArrayList<>(bigList);
listNoV.remove(v);
if (listNoV.stream()
.anyMatch(
@@ -92,6 +103,7 @@ public class VisionModuleManager {
.contains(idx)) {
idx++;
}
logger.debug("Assigning idx " + idx);
v.getCameraConfiguration().streamIndex = idx;
}
}

View File

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