From 326701b74fab580064e437172be8360a2b7564c8 Mon Sep 17 00:00:00 2001 From: Chris Gerth Date: Tue, 3 Jan 2023 21:53:04 -0600 Subject: [PATCH] Bug Fix Grab Bag (#688) * Reordered ov video modes to be lowest-to-highest res * Save off sensor model on init. Guard against low, crashy exposures. * Pulled in matt's fixups from https://github.com/PhotonVision/photon-libcamera-gl-driver/suites/10144555465/artifacts/495489276 * Further autoexposure tweaks for picam v1 * Allow undercores in camera rename * Additional guarding against output images being empty * lock out auto-exposure on ov9281's * Guarding stream pipelines against empty frames from cameras. Rearranged driver stream to resize first, then draw crosshairs (matchces with other pipelines now). * NT Priority fixup - if client is sending commands on NT, its nt value should win over anything done from the UI * Synchronous pipline adjustmet fix, method cleanup * lint * circle pipe and data publish bugfixes * lint * Pulled in matt's latest .so and re-enabled auto exposure on 9281's --- .../pipeline/CameraAndPipelineSelect.vue | 2 +- .../networktables/NTDataPublisher.java | 4 +- .../vision/camera/LibcameraGpuSettables.java | 64 +++++++---- .../vision/pipe/impl/FindCirclesPipe.java | 2 +- .../vision/pipeline/DriverModePipeline.java | 22 ++-- .../vision/pipeline/OutputStreamPipeline.java | 104 +++++++++--------- .../vision/processes/PipelineManager.java | 49 ++++----- .../vision/processes/VisionModule.java | 4 +- .../VisionModuleChangeSubscriber.java | 2 +- .../nativelibraries/libphotonlibcamera.so | Bin 145784 -> 141664 bytes 10 files changed, 139 insertions(+), 114 deletions(-) diff --git a/photon-client/src/components/pipeline/CameraAndPipelineSelect.vue b/photon-client/src/components/pipeline/CameraAndPipelineSelect.vue index 80a801161..2619e38af 100644 --- a/photon-client/src/components/pipeline/CameraAndPipelineSelect.vue +++ b/photon-client/src/components/pipeline/CameraAndPipelineSelect.vue @@ -257,7 +257,7 @@ export default { }, data: () => { return { - re: RegExp("^[A-Za-z0-9 \\-)(]*[A-Za-z0-9][A-Za-z0-9 \\-)(.]*$"), + re: RegExp("^[A-Za-z0-9_ \\-)(]*[A-Za-z0-9][A-Za-z0-9_ \\-)(.]*$"), isCameraNameEdit: false, newCameraName: "", cameraNameError: "", diff --git a/photon-core/src/main/java/org/photonvision/common/dataflow/networktables/NTDataPublisher.java b/photon-core/src/main/java/org/photonvision/common/dataflow/networktables/NTDataPublisher.java index c42bf33dc..f7a0aaf8a 100644 --- a/photon-core/src/main/java/org/photonvision/common/dataflow/networktables/NTDataPublisher.java +++ b/photon-core/src/main/java/org/photonvision/common/dataflow/networktables/NTDataPublisher.java @@ -142,8 +142,8 @@ public class NTDataPublisher implements CVPipelineResultConsumer { ts.rawBytesEntry.set(packet.getData()); - ts.pipelineIndexPublisher.set(pipelineIndexSupplier.get()); - ts.driverModePublisher.set(driverModeSupplier.getAsBoolean()); + ts.pipelineIndexPublisher.setDefault(pipelineIndexSupplier.get()); + ts.driverModePublisher.setDefault(driverModeSupplier.getAsBoolean()); ts.latencyMillisEntry.set(result.getLatencyMillis()); ts.hasTargetEntry.set(result.hasTargets()); diff --git a/photon-core/src/main/java/org/photonvision/vision/camera/LibcameraGpuSettables.java b/photon-core/src/main/java/org/photonvision/vision/camera/LibcameraGpuSettables.java index 33341e72b..f3b32d44c 100644 --- a/photon-core/src/main/java/org/photonvision/vision/camera/LibcameraGpuSettables.java +++ b/photon-core/src/main/java/org/photonvision/vision/camera/LibcameraGpuSettables.java @@ -29,13 +29,15 @@ import org.photonvision.vision.processes.VisionSourceSettables; public class LibcameraGpuSettables extends VisionSourceSettables { private FPSRatedVideoMode currentVideoMode; - private double lastExposure = 50; + private double lastManualExposure = 50; private int lastBrightness = 50; - private boolean lastExposureMode; + private boolean lastAutoExposureActive; private int lastGain = 50; private Pair lastAwbGains = new Pair<>(18, 18); private boolean m_initialized = false; + private final LibCameraJNI.SensorModel sensorModel; + private ImageRotationMode m_rotationMode; public void setRotation(ImageRotationMode rotationMode) { @@ -51,7 +53,7 @@ public class LibcameraGpuSettables extends VisionSourceSettables { videoModes = new HashMap<>(); - LibCameraJNI.SensorModel sensorModel = LibCameraJNI.getSensorModel(); + sensorModel = LibCameraJNI.getSensorModel(); if (sensorModel == LibCameraJNI.SensorModel.IMX219) { // Settings for the IMX219 sensor, which is used on the Pi Camera Module v2 @@ -72,13 +74,14 @@ public class LibcameraGpuSettables extends VisionSourceSettables { 6, new FPSRatedVideoMode(VideoMode.PixelFormat.kUnknown, 3280 / 4, 2464 / 4, 15, 20, 1)); } else if (sensorModel == LibCameraJNI.SensorModel.OV9281) { videoModes.put( - 0, new FPSRatedVideoMode(VideoMode.PixelFormat.kUnknown, 1280, 800, 60, 60, 1)); + 0, new FPSRatedVideoMode(VideoMode.PixelFormat.kUnknown, 320, 240, 30, 30, .39)); videoModes.put( 1, new FPSRatedVideoMode(VideoMode.PixelFormat.kUnknown, 1280 / 2, 800 / 2, 60, 60, 1)); videoModes.put( - 2, new FPSRatedVideoMode(VideoMode.PixelFormat.kUnknown, 320, 240, 30, 30, .39)); + 2, new FPSRatedVideoMode(VideoMode.PixelFormat.kUnknown, 640, 480, 65, 90, .39)); videoModes.put( - 3, new FPSRatedVideoMode(VideoMode.PixelFormat.kUnknown, 640, 480, 65, 90, .39)); + 3, new FPSRatedVideoMode(VideoMode.PixelFormat.kUnknown, 1280, 800, 60, 60, 1)); + } else { if (sensorModel == LibCameraJNI.SensorModel.IMX477) { LibcameraGpuSource.logger.warn( @@ -114,20 +117,33 @@ public class LibcameraGpuSettables extends VisionSourceSettables { @Override public void setAutoExposure(boolean cameraAutoExposure) { - lastExposureMode = cameraAutoExposure; - // TODO (Matt) -- call LibCameraJNI's auto exposure function, when that exists + lastAutoExposureActive = cameraAutoExposure; LibCameraJNI.setAutoExposure(cameraAutoExposure); } @Override public void setExposure(double exposure) { - // Todo (Chris) - for now, handle auto exposure by using -1 - if (exposure < 0.0) { - exposure = -1; + if (exposure < 0.0 || lastAutoExposureActive) { + // Auto-exposure is active right now, don't set anything. + return; } - // TODO convert to uS - lastExposure = exposure; + // HACKS! + // If we set exposure too low, libcamera crashes or slows down + // Very weird and smelly + // For now, band-aid this by just not setting it lower than the "it breaks" limit + // Limit is different depending on camera. + if (sensorModel == LibCameraJNI.SensorModel.OV9281) { + if (exposure < 6.0) { + exposure = 6.0; + } + } else if (sensorModel == LibCameraJNI.SensorModel.OV5647) { + if (exposure < 0.7) { + exposure = 0.7; + } + } + + lastManualExposure = exposure; var success = LibCameraJNI.setExposure((int) Math.round(exposure) * 800); if (!success) LibcameraGpuSource.logger.warn("Couldn't set Pi Camera exposure"); } @@ -150,19 +166,25 @@ public class LibcameraGpuSettables extends VisionSourceSettables { @Override public void setRedGain(int red) { - lastAwbGains = Pair.of(red, lastAwbGains.getSecond()); - setAwbGain(lastAwbGains.getFirst(), lastAwbGains.getSecond()); + if (sensorModel != LibCameraJNI.SensorModel.OV9281) { + lastAwbGains = Pair.of(red, lastAwbGains.getSecond()); + setAwbGain(lastAwbGains.getFirst(), lastAwbGains.getSecond()); + } } @Override public void setBlueGain(int blue) { - lastAwbGains = Pair.of(lastAwbGains.getFirst(), blue); - setAwbGain(lastAwbGains.getFirst(), lastAwbGains.getSecond()); + if (sensorModel != LibCameraJNI.SensorModel.OV9281) { + lastAwbGains = Pair.of(lastAwbGains.getFirst(), blue); + setAwbGain(lastAwbGains.getFirst(), lastAwbGains.getSecond()); + } } public void setAwbGain(int red, int blue) { - var success = LibCameraJNI.setAwbGain(red / 10.0, blue / 10.0); - if (!success) LibcameraGpuSource.logger.warn("Couldn't set Pi Camera AWB gains"); + if (sensorModel != LibCameraJNI.SensorModel.OV9281) { + var success = LibCameraJNI.setAwbGain(red / 10.0, blue / 10.0); + if (!success) LibcameraGpuSource.logger.warn("Couldn't set Pi Camera AWB gains"); + } } @Override @@ -202,8 +224,8 @@ public class LibcameraGpuSettables extends VisionSourceSettables { // We don't store last settings on the native side, and when you change video mode these get // reset on MMAL's end - setExposure(lastExposure); - setAutoExposure(lastExposureMode); + setExposure(lastManualExposure); + setAutoExposure(lastAutoExposureActive); setBrightness(lastBrightness); setGain(lastGain); setAwbGain(lastAwbGains.getFirst(), lastAwbGains.getSecond()); diff --git a/photon-core/src/main/java/org/photonvision/vision/pipe/impl/FindCirclesPipe.java b/photon-core/src/main/java/org/photonvision/vision/pipe/impl/FindCirclesPipe.java index 706c5ac39..ec321daa1 100644 --- a/photon-core/src/main/java/org/photonvision/vision/pipe/impl/FindCirclesPipe.java +++ b/photon-core/src/main/java/org/photonvision/vision/pipe/impl/FindCirclesPipe.java @@ -66,7 +66,7 @@ public class FindCirclesPipe 1.0, params.minDist, params.maxCannyThresh, - params.accuracy, + Math.max(1.0, params.accuracy), minRadius, maxRadius); // Great, we now found the center point of the circle and it's radius, but we have no idea what diff --git a/photon-core/src/main/java/org/photonvision/vision/pipeline/DriverModePipeline.java b/photon-core/src/main/java/org/photonvision/vision/pipeline/DriverModePipeline.java index a665f6415..f29cb2be3 100644 --- a/photon-core/src/main/java/org/photonvision/vision/pipeline/DriverModePipeline.java +++ b/photon-core/src/main/java/org/photonvision/vision/pipeline/DriverModePipeline.java @@ -77,18 +77,22 @@ public class DriverModePipeline // apply pipes var inputMat = frame.colorImage.getMat(); - totalNanos += resizeImagePipe.run(inputMat).nanosElapsed; + boolean emptyIn = inputMat.empty(); - if (!accelerated) { - var rotateImageResult = rotateImagePipe.run(inputMat); - totalNanos += rotateImageResult.nanosElapsed; + if (!emptyIn) { + if (!accelerated) { + var rotateImageResult = rotateImagePipe.run(inputMat); + totalNanos += rotateImageResult.nanosElapsed; + } + + totalNanos += resizeImagePipe.run(inputMat).nanosElapsed; + + var draw2dCrosshairResult = draw2dCrosshairPipe.run(Pair.of(inputMat, List.of())); + + // calculate elapsed nanoseconds + totalNanos += draw2dCrosshairResult.nanosElapsed; } - var draw2dCrosshairResult = draw2dCrosshairPipe.run(Pair.of(inputMat, List.of())); - - // calculate elapsed nanoseconds - totalNanos += draw2dCrosshairResult.nanosElapsed; - var fpsResult = calculateFPSPipe.run(null); var fps = fpsResult.output; diff --git a/photon-core/src/main/java/org/photonvision/vision/pipeline/OutputStreamPipeline.java b/photon-core/src/main/java/org/photonvision/vision/pipeline/OutputStreamPipeline.java index 7a625f9ab..2c61f45d8 100644 --- a/photon-core/src/main/java/org/photonvision/vision/pipeline/OutputStreamPipeline.java +++ b/photon-core/src/main/java/org/photonvision/vision/pipeline/OutputStreamPipeline.java @@ -110,65 +110,71 @@ public class OutputStreamPipeline { boolean inEmpty = inMat.empty(); if (!inEmpty) sumPipeNanosElapsed += pipeProfileNanos[0] = resizeImagePipe.run(inMat).nanosElapsed; - sumPipeNanosElapsed += pipeProfileNanos[1] = resizeImagePipe.run(outMat).nanosElapsed; - // Convert single-channel HSV output mat to 3-channel BGR in preparation for streaming - if (outMat.channels() == 1) { - var outputMatPipeResult = outputMatPipe.run(outMat); - sumPipeNanosElapsed += pipeProfileNanos[2] = outputMatPipeResult.nanosElapsed; - } else { - pipeProfileNanos[2] = 0; - } + boolean outEmpty = outMat.empty(); + if (!outEmpty) + sumPipeNanosElapsed += pipeProfileNanos[1] = resizeImagePipe.run(outMat).nanosElapsed; - // Draw 2D Crosshair on output - var draw2dCrosshairResultOnInput = draw2dCrosshairPipe.run(Pair.of(outMat, targetsToDraw)); - sumPipeNanosElapsed += pipeProfileNanos[3] = draw2dCrosshairResultOnInput.nanosElapsed; - - if (!(settings instanceof AprilTagPipelineSettings)) { - // If we're processing anything other than Apriltags... - - var draw2dCrosshairResultOnOutput = draw2dCrosshairPipe.run(Pair.of(outMat, targetsToDraw)); - sumPipeNanosElapsed += pipeProfileNanos[4] = draw2dCrosshairResultOnOutput.nanosElapsed; - - if (settings.solvePNPEnabled) { - // Draw 3D Targets on input and output if possible - pipeProfileNanos[5] = 0; - pipeProfileNanos[6] = 0; - pipeProfileNanos[7] = 0; - - var drawOnOutputResult = draw3dTargetsPipe.run(Pair.of(outMat, targetsToDraw)); - sumPipeNanosElapsed += pipeProfileNanos[8] = drawOnOutputResult.nanosElapsed; + // Only attempt drawing on a non-empty frame + if (!outEmpty) { + // Convert single-channel HSV output mat to 3-channel BGR in preparation for streaming + if (outMat.channels() == 1) { + var outputMatPipeResult = outputMatPipe.run(outMat); + sumPipeNanosElapsed += pipeProfileNanos[2] = outputMatPipeResult.nanosElapsed; } else { - // Only draw 2d targets - pipeProfileNanos[5] = 0; - - var draw2dTargetsOnOutput = draw2dTargetsPipe.run(Pair.of(outMat, targetsToDraw)); - sumPipeNanosElapsed += pipeProfileNanos[6] = draw2dTargetsOnOutput.nanosElapsed; - - pipeProfileNanos[7] = 0; - pipeProfileNanos[8] = 0; + pipeProfileNanos[2] = 0; } - } else { - // If we are doing apriltags... - if (settings.solvePNPEnabled) { - // Draw 3d Apriltag markers (camera is calibrated and running in 3d mode) - pipeProfileNanos[5] = 0; - pipeProfileNanos[6] = 0; + // Draw 2D Crosshair on output + var draw2dCrosshairResultOnInput = draw2dCrosshairPipe.run(Pair.of(outMat, targetsToDraw)); + sumPipeNanosElapsed += pipeProfileNanos[3] = draw2dCrosshairResultOnInput.nanosElapsed; - var drawOnInputResult = draw3dAprilTagsPipe.run(Pair.of(outMat, targetsToDraw)); - sumPipeNanosElapsed += pipeProfileNanos[7] = drawOnInputResult.nanosElapsed; + if (!(settings instanceof AprilTagPipelineSettings)) { + // If we're processing anything other than Apriltags... - pipeProfileNanos[8] = 0; + var draw2dCrosshairResultOnOutput = draw2dCrosshairPipe.run(Pair.of(outMat, targetsToDraw)); + sumPipeNanosElapsed += pipeProfileNanos[4] = draw2dCrosshairResultOnOutput.nanosElapsed; + + if (settings.solvePNPEnabled) { + // Draw 3D Targets on input and output if possible + pipeProfileNanos[5] = 0; + pipeProfileNanos[6] = 0; + pipeProfileNanos[7] = 0; + + var drawOnOutputResult = draw3dTargetsPipe.run(Pair.of(outMat, targetsToDraw)); + sumPipeNanosElapsed += pipeProfileNanos[8] = drawOnOutputResult.nanosElapsed; + } else { + // Only draw 2d targets + pipeProfileNanos[5] = 0; + + var draw2dTargetsOnOutput = draw2dTargetsPipe.run(Pair.of(outMat, targetsToDraw)); + sumPipeNanosElapsed += pipeProfileNanos[6] = draw2dTargetsOnOutput.nanosElapsed; + + pipeProfileNanos[7] = 0; + pipeProfileNanos[8] = 0; + } } else { - // Draw 2d apriltag markers - var draw2dTargetsOnInput = draw2dAprilTagsPipe.run(Pair.of(outMat, targetsToDraw)); - sumPipeNanosElapsed += pipeProfileNanos[5] = draw2dTargetsOnInput.nanosElapsed; + // If we are doing apriltags... + if (settings.solvePNPEnabled) { + // Draw 3d Apriltag markers (camera is calibrated and running in 3d mode) + pipeProfileNanos[5] = 0; + pipeProfileNanos[6] = 0; - pipeProfileNanos[6] = 0; - pipeProfileNanos[7] = 0; - pipeProfileNanos[8] = 0; + var drawOnInputResult = draw3dAprilTagsPipe.run(Pair.of(outMat, targetsToDraw)); + sumPipeNanosElapsed += pipeProfileNanos[7] = drawOnInputResult.nanosElapsed; + + pipeProfileNanos[8] = 0; + + } else { + // Draw 2d apriltag markers + var draw2dTargetsOnInput = draw2dAprilTagsPipe.run(Pair.of(outMat, targetsToDraw)); + sumPipeNanosElapsed += pipeProfileNanos[5] = draw2dTargetsOnInput.nanosElapsed; + + pipeProfileNanos[6] = 0; + pipeProfileNanos[7] = 0; + pipeProfileNanos[8] = 0; + } } } 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 840b34e5a..aadc3e4da 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 @@ -22,6 +22,9 @@ import java.util.Arrays; import java.util.Comparator; import java.util.List; import org.photonvision.common.configuration.CameraConfiguration; +import org.photonvision.common.configuration.ConfigManager; +import org.photonvision.common.dataflow.DataChangeService; +import org.photonvision.common.dataflow.events.OutgoingUIEvent; import org.photonvision.common.logging.LogGroup; import org.photonvision.common.logging.Logger; import org.photonvision.vision.pipeline.*; @@ -48,7 +51,7 @@ public class PipelineManager { *
* Used only when switching from any of the built-in pipelines back to a user-created pipeline. */ - private int lastPipelineIndex; + private int lastUserPipelineIdx; /** * Creates a PipelineManager with a DriverModePipeline, a Calibration3dPipeline, and all provided @@ -141,7 +144,7 @@ public class PipelineManager { * * @return The currently active pipeline. */ - public CVPipeline getCurrentUserPipeline() { + public CVPipeline getCurrentPipeline() { if (currentPipelineIndex < 0) { switch (currentPipelineIndex) { case CAL_3D_INDEX: @@ -151,23 +154,7 @@ public class PipelineManager { } } - var desiredPipelineSettings = userPipelineSettings.get(currentPipelineIndex); - // if (currentPipeline.getSettings().pipelineIndex != - // desiredPipelineSettings.pipelineIndex) { - // switch (desiredPipelineSettings.pipelineType) { - // case Reflective: - // currentPipeline = - // new ReflectivePipeline((ReflectivePipelineSettings) - // desiredPipelineSettings); - // break; - // case ColoredShape: - // currentPipeline = - // new ColoredShapePipeline((ColoredShapePipelineSettings) - // desiredPipelineSettings); - // break; - // } - // } - + // Just return the current user pipeline, we're not on aa built-in one return currentUserPipeline; } @@ -186,20 +173,21 @@ public class PipelineManager { * All externally accessible methods that intend to change the active pipeline MUST go through * here to ensure all proper steps are taken. * - * @param index Index of pipeline to be active + * @param newIndex Index of pipeline to be active */ - private void setPipelineInternal(int index) { - if (index < 0) { - lastPipelineIndex = currentPipelineIndex; + private void setPipelineInternal(int newIndex) { + if (newIndex < 0 && currentPipelineIndex >= 0) { + // Transitioning to a built-in pipe, save off the current user one + lastUserPipelineIdx = currentPipelineIndex; } - if (userPipelineSettings.size() - 1 < index) { + if (userPipelineSettings.size() - 1 < newIndex) { logger.warn("User attempted to set index to non-existent pipeline!"); return; } - currentPipelineIndex = index; - if (index >= 0) { + currentPipelineIndex = newIndex; + if (newIndex >= 0) { var desiredPipelineSettings = userPipelineSettings.get(currentPipelineIndex); switch (desiredPipelineSettings.pipelineType) { case Reflective: @@ -222,6 +210,11 @@ public class PipelineManager { break; } } + + DataChangeService.getInstance() + .publishEvent( + new OutgoingUIEvent<>( + "fullsettings", ConfigManager.getInstance().getConfig().toHashMap())); } /** @@ -233,7 +226,7 @@ public class PipelineManager { */ public void setCalibrationMode(boolean wantsCalibration) { if (!wantsCalibration) calibration3dPipeline.finishCalibration(); - setPipelineInternal(wantsCalibration ? CAL_3D_INDEX : lastPipelineIndex); + setPipelineInternal(wantsCalibration ? CAL_3D_INDEX : lastUserPipelineIdx); } /** @@ -244,7 +237,7 @@ public class PipelineManager { * @param state True to enter driver mode, false to exit driver mode. */ public void setDriverMode(boolean state) { - setPipelineInternal(state ? DRIVERMODE_INDEX : lastPipelineIndex); + setPipelineInternal(state ? DRIVERMODE_INDEX : lastUserPipelineIdx); } /** 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 3a9f2df47..631424e65 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 @@ -120,7 +120,7 @@ public class VisionModule { this.visionRunner = new VisionRunner( this.visionSource.getFrameProvider(), - this.pipelineManager::getCurrentUserPipeline, + this.pipelineManager::getCurrentPipeline, this::consumeResult, this.cameraQuirks); this.streamRunnable = new StreamRunnable(new OutputStreamPipeline()); @@ -578,7 +578,7 @@ public class VisionModule { } public void setTargetModel(TargetModel targetModel) { - var settings = pipelineManager.getCurrentUserPipeline().getSettings(); + var settings = pipelineManager.getCurrentPipeline().getSettings(); if (settings instanceof ReflectivePipelineSettings) { ((ReflectivePipelineSettings) settings).targetModel = targetModel; saveAndBroadcastAll(); 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 0e679431a..e1d605d36 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 @@ -59,7 +59,7 @@ public class VisionModuleChangeSubscriber extends DataChangeSubscriber { var propName = wsEvent.propertyName; var newPropValue = wsEvent.data; - var currentSettings = parentModule.pipelineManager.getCurrentUserPipeline().getSettings(); + var currentSettings = parentModule.pipelineManager.getCurrentPipeline().getSettings(); // special case for non-PipelineSetting changes switch (propName) { diff --git a/photon-server/src/main/resources/nativelibraries/libphotonlibcamera.so b/photon-server/src/main/resources/nativelibraries/libphotonlibcamera.so index f11ed7338aa36b6de39128cbd96cbdc37587015e..13bcbc05b5bcdf387d4ff496be19585b0672ec03 100644 GIT binary patch delta 43782 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