From 5597f5acd93745cb7b21e02c1b0bd8a29b17f60b Mon Sep 17 00:00:00 2001 From: Matt Date: Mon, 18 Mar 2024 13:21:41 -0400 Subject: [PATCH] Set default pipeline idx in PipelineManager constructor (#1286) Addresses #1285 --- .../src/components/dashboard/CamerasCard.vue | 6 +---- .../stores/settings/CameraSettingsStore.ts | 7 ++++++ .../vision/processes/PipelineManager.java | 22 +++++++++++++++++-- .../vision/processes/VisionModule.java | 17 +++++++------- .../VisionModuleChangeSubscriber.java | 7 ++++-- .../vision/processes/PipelineManagerTest.java | 2 +- .../server/DataSocketHandler.java | 16 ++++++-------- 7 files changed, 49 insertions(+), 28 deletions(-) diff --git a/photon-client/src/components/dashboard/CamerasCard.vue b/photon-client/src/components/dashboard/CamerasCard.vue index 9796d2505..cd52f51d1 100644 --- a/photon-client/src/components/dashboard/CamerasCard.vue +++ b/photon-client/src/components/dashboard/CamerasCard.vue @@ -13,11 +13,7 @@ defineProps<{ const driverMode = computed({ get: () => useCameraSettingsStore().isDriverMode, - set: (v) => - useCameraSettingsStore().changeCurrentPipelineIndex( - v ? -1 : useCameraSettingsStore().currentCameraSettings.lastPipelineIndex || 0, - true - ) + set: (v) => useCameraSettingsStore().setDriverMode(v) }); const fpsTooLow = computed(() => { diff --git a/photon-client/src/stores/settings/CameraSettingsStore.ts b/photon-client/src/stores/settings/CameraSettingsStore.ts index ca7907043..286893209 100644 --- a/photon-client/src/stores/settings/CameraSettingsStore.ts +++ b/photon-client/src/stores/settings/CameraSettingsStore.ts @@ -236,6 +236,13 @@ export const useCameraSettingsStore = defineStore("cameraSettings", { } useStateStore().websocket?.send(payload, true); }, + setDriverMode(isDriverMode: boolean, cameraIndex: number = useStateStore().currentCameraIndex) { + const payload = { + driverMode: isDriverMode, + cameraIndex: cameraIndex + }; + useStateStore().websocket?.send(payload, true); + }, /** * Change the currently selected pipeline of the provided camera. * diff --git a/photon-core/src/main/java/org/photonvision/vision/processes/PipelineManager.java b/photon-core/src/main/java/org/photonvision/vision/processes/PipelineManager.java index b968fb2b4..a10bfe6dc 100644 --- a/photon-core/src/main/java/org/photonvision/vision/processes/PipelineManager.java +++ b/photon-core/src/main/java/org/photonvision/vision/processes/PipelineManager.java @@ -61,7 +61,8 @@ public class PipelineManager { PipelineManager( DriverModePipelineSettings driverSettings, List userPipelines, - String uniqueName) { + String uniqueName, + int defaultIndex) { this.userPipelineSettings = new ArrayList<>(userPipelines); // This is to respect the default res idx for vendor cameras @@ -70,10 +71,19 @@ public class PipelineManager { if (userPipelines.isEmpty()) addPipeline(PipelineType.Reflective); calibration3dPipeline = new Calibrate3dPipeline(uniqueName); + + // We know that at this stage, VisionRunner hasn't yet started so we're good to do this from + // this thread + this.setIndex(defaultIndex); + updatePipelineFromRequested(); } public PipelineManager(CameraConfiguration config) { - this(config.driveModeSettings, config.pipelineSettings, config.uniqueName); + this( + config.driveModeSettings, + config.pipelineSettings, + config.uniqueName, + config.currentPipelineIndex); } /** @@ -173,6 +183,14 @@ public class PipelineManager { private volatile int requestedIndex = 0; + /** + * Grab the currently requested pipeline index. The VisionRunner may not have changed over to this + * pipeline yet. + */ + public int getRequestedIndex() { + return requestedIndex; + } + /** * Internal method for setting the active pipeline.
*
diff --git a/photon-core/src/main/java/org/photonvision/vision/processes/VisionModule.java b/photon-core/src/main/java/org/photonvision/vision/processes/VisionModule.java index 7dfae0cf2..4a33b7235 100644 --- a/photon-core/src/main/java/org/photonvision/vision/processes/VisionModule.java +++ b/photon-core/src/main/java/org/photonvision/vision/processes/VisionModule.java @@ -143,7 +143,7 @@ public class VisionModule { ntConsumer = new NTDataPublisher( visionSource.getSettables().getConfiguration().nickname, - pipelineManager::getCurrentPipelineIndex, + pipelineManager::getRequestedIndex, this::setPipeline, pipelineManager::getDriverMode, this::setDriverMode); @@ -156,6 +156,7 @@ public class VisionModule { (result) -> lastPipelineResultBestTarget = result.hasTargets() ? result.targets.get(0) : null); + // Sync VisionModule state with the first pipeline index setPipeline(visionSource.getSettables().getConfiguration().currentPipelineIndex); // Set vendor FOV @@ -321,7 +322,7 @@ public class VisionModule { void changePipelineType(int newType) { pipelineManager.changePipelineType(newType); - setPipeline(pipelineManager.getCurrentPipelineIndex()); + setPipeline(pipelineManager.getRequestedIndex()); saveAndBroadcastAll(); } @@ -329,9 +330,7 @@ public class VisionModule { pipelineManager.setDriverMode(isDriverMode); setVisionLEDs(!isDriverMode); setPipeline( - isDriverMode - ? PipelineManager.DRIVERMODE_INDEX - : pipelineManager.getCurrentPipelineIndex()); + isDriverMode ? PipelineManager.DRIVERMODE_INDEX : pipelineManager.getRequestedIndex()); saveAndBroadcastAll(); } @@ -385,7 +384,7 @@ public class VisionModule { var ret = pipelineManager.calibration3dPipeline.tryCalibration(); pipelineManager.setCalibrationMode(false); - setPipeline(pipelineManager.getCurrentPipelineIndex()); + setPipeline(pipelineManager.getRequestedIndex()); if (ret != null) { logger.debug("Saving calibration..."); @@ -447,7 +446,7 @@ public class VisionModule { setVisionLEDs(pipelineSettings.ledMode); visionSource.getSettables().getConfiguration().currentPipelineIndex = - pipelineManager.getCurrentPipelineIndex(); + pipelineManager.getRequestedIndex(); return true; } @@ -511,7 +510,7 @@ public class VisionModule { ret.uniqueName = visionSource.getSettables().getConfiguration().uniqueName; ret.currentPipelineSettings = SerializationUtils.objectToHashMap(pipelineManager.getCurrentPipelineSettings()); - ret.currentPipelineIndex = pipelineManager.getCurrentPipelineIndex(); + ret.currentPipelineIndex = pipelineManager.getRequestedIndex(); ret.pipelineNicknames = pipelineManager.getPipelineNicknames(); ret.cameraQuirks = visionSource.getSettables().getConfiguration().cameraQuirks; @@ -553,7 +552,7 @@ public class VisionModule { var config = visionSource.getSettables().getConfiguration(); config.setPipelineSettings(pipelineManager.userPipelineSettings); config.driveModeSettings = pipelineManager.driverModePipeline.getSettings(); - config.currentPipelineIndex = Math.max(pipelineManager.getCurrentPipelineIndex(), -1); + config.currentPipelineIndex = Math.max(pipelineManager.getRequestedIndex(), -1); return config; } diff --git a/photon-core/src/main/java/org/photonvision/vision/processes/VisionModuleChangeSubscriber.java b/photon-core/src/main/java/org/photonvision/vision/processes/VisionModuleChangeSubscriber.java index 0904d59fd..2e0310569 100644 --- a/photon-core/src/main/java/org/photonvision/vision/processes/VisionModuleChangeSubscriber.java +++ b/photon-core/src/main/java/org/photonvision/vision/processes/VisionModuleChangeSubscriber.java @@ -88,7 +88,7 @@ public class VisionModuleChangeSubscriber extends DataChangeSubscriber { parentModule.saveAndBroadcastAll(); return; case "deleteCurrPipeline": - var indexToDelete = parentModule.pipelineManager.getCurrentPipelineIndex(); + var indexToDelete = parentModule.pipelineManager.getRequestedIndex(); logger.info("Deleting current pipe at index " + indexToDelete); int newIndex = parentModule.pipelineManager.removePipeline(indexToDelete); parentModule.setPipeline(newIndex); @@ -96,7 +96,7 @@ public class VisionModuleChangeSubscriber extends DataChangeSubscriber { return; case "changePipeline": // change active pipeline var index = (Integer) newPropValue; - if (index == parentModule.pipelineManager.getCurrentPipelineIndex()) { + if (index == parentModule.pipelineManager.getRequestedIndex()) { logger.debug("Skipping pipeline change, index " + index + " already active"); return; } @@ -181,6 +181,9 @@ public class VisionModuleChangeSubscriber extends DataChangeSubscriber { parentModule.changePipelineType((Integer) newPropValue); parentModule.saveAndBroadcastAll(); return; + case "isDriverMode": + parentModule.setDriverMode((Boolean) newPropValue); + return; } // special case for camera settables 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 7072c802a..9ae44c205 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 @@ -30,7 +30,7 @@ public class PipelineManagerTest { public void testUniqueName() { TestUtils.loadLibraries(); PipelineManager manager = - new PipelineManager(new DriverModePipelineSettings(), List.of(), "meme_name"); + new PipelineManager(new DriverModePipelineSettings(), List.of(), "meme_name", -1); manager.addPipeline(PipelineType.Reflective, "Another"); // We now have ["New Pipeline", "Another"] diff --git a/photon-server/src/main/java/org/photonvision/server/DataSocketHandler.java b/photon-server/src/main/java/org/photonvision/server/DataSocketHandler.java index d2f6f07b2..cb5bbc277 100644 --- a/photon-server/src/main/java/org/photonvision/server/DataSocketHandler.java +++ b/photon-server/src/main/java/org/photonvision/server/DataSocketHandler.java @@ -131,18 +131,16 @@ public class DataSocketHandler { case SMT_DRIVERMODE: { // TODO: what is this event? - var data = (HashMap) entryValue; - var dmExpEvent = - new IncomingWebSocketEvent( - DataChangeDestination.DCD_ACTIVEMODULE, "driverExposure", data); - var dmBrightEvent = - new IncomingWebSocketEvent( - DataChangeDestination.DCD_ACTIVEMODULE, "driverBrightness", data); + var data = (Boolean) entryValue; var dmIsDriverEvent = new IncomingWebSocketEvent( - DataChangeDestination.DCD_ACTIVEMODULE, "isDriver", data); + DataChangeDestination.DCD_ACTIVEMODULE, + "isDriverMode", + data, + cameraIndex, + context); - dcService.publishEvents(dmExpEvent, dmBrightEvent, dmIsDriverEvent); + dcService.publishEvents(dmIsDriverEvent); break; } case SMT_CHANGECAMERANAME: