From fa5d58147a74e5bdf99d2752ddce00c4ca1337de Mon Sep 17 00:00:00 2001 From: Matt Date: Mon, 18 Mar 2024 20:50:32 -0400 Subject: [PATCH] Recreate user pipeline on type change (#1290) * Recreate user pipeline on type change * Fix typo --------- Co-authored-by: shueja <32416547+shueja@users.noreply.github.com> --- .../vision/processes/PipelineManager.java | 81 ++++++++++--------- 1 file changed, 45 insertions(+), 36 deletions(-) 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 a10bfe6dc1..7cc6fff358 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 @@ -226,44 +226,10 @@ private void updatePipelineFromRequested() { return; } - // Cleanup potential old native resources before swapping over for user pipelines - if (currentUserPipeline != null && !(newIndex < 0)) { - currentUserPipeline.release(); - } - currentPipelineIndex = newIndex; + if (newIndex >= 0) { - var desiredPipelineSettings = userPipelineSettings.get(currentPipelineIndex); - switch (desiredPipelineSettings.pipelineType) { - case Reflective: - logger.debug("Creating Reflective pipeline"); - currentUserPipeline = - new ReflectivePipeline((ReflectivePipelineSettings) desiredPipelineSettings); - break; - case ColoredShape: - logger.debug("Creating ColoredShape pipeline"); - currentUserPipeline = - new ColoredShapePipeline((ColoredShapePipelineSettings) desiredPipelineSettings); - break; - case AprilTag: - logger.debug("Creating AprilTag pipeline"); - currentUserPipeline = - new AprilTagPipeline((AprilTagPipelineSettings) desiredPipelineSettings); - break; - - case Aruco: - logger.debug("Creating Aruco Pipeline"); - currentUserPipeline = new ArucoPipeline((ArucoPipelineSettings) desiredPipelineSettings); - break; - case ObjectDetection: - logger.debug("Creating ObjectDetection Pipeline"); - currentUserPipeline = - new ObjectDetectionPipeline( - (ObjectDetectionPipelineSettings) desiredPipelineSettings); - default: - // Can be calib3d or drivermode, both of which are special cases - break; - } + recreateUserPipeline(); } DataChangeService.getInstance() @@ -272,6 +238,48 @@ private void updatePipelineFromRequested() { "fullsettings", ConfigManager.getInstance().getConfig().toHashMap())); } + /** + * Recreate the current user pipeline with the current pipeline index. Useful to force a + * recreation after changing pipeline type + */ + private void recreateUserPipeline() { + // Cleanup potential old native resources before swapping over from a user pipeline + if (currentUserPipeline != null && !(currentPipelineIndex < 0)) { + currentUserPipeline.release(); + } + + var desiredPipelineSettings = userPipelineSettings.get(currentPipelineIndex); + switch (desiredPipelineSettings.pipelineType) { + case Reflective: + logger.debug("Creating Reflective pipeline"); + currentUserPipeline = + new ReflectivePipeline((ReflectivePipelineSettings) desiredPipelineSettings); + break; + case ColoredShape: + logger.debug("Creating ColoredShape pipeline"); + currentUserPipeline = + new ColoredShapePipeline((ColoredShapePipelineSettings) desiredPipelineSettings); + break; + case AprilTag: + logger.debug("Creating AprilTag pipeline"); + currentUserPipeline = + new AprilTagPipeline((AprilTagPipelineSettings) desiredPipelineSettings); + break; + + case Aruco: + logger.debug("Creating Aruco Pipeline"); + currentUserPipeline = new ArucoPipeline((ArucoPipelineSettings) desiredPipelineSettings); + break; + case ObjectDetection: + logger.debug("Creating ObjectDetection Pipeline"); + currentUserPipeline = + new ObjectDetectionPipeline((ObjectDetectionPipelineSettings) desiredPipelineSettings); + default: + // Can be calib3d or drivermode, both of which are special cases + break; + } + } + /** * Enters or exits calibration mode based on the parameter.
*
@@ -502,5 +510,6 @@ public void changePipelineType(int newType) { userPipelineSettings.set(idx, newSettings); setPipelineInternal(idx); reassignIndexes(); + recreateUserPipeline(); } }