From 06f0f7d66f68f43e7e461bce672b07e9d2954cda Mon Sep 17 00:00:00 2001 From: Drew Williams Date: Tue, 3 Sep 2024 22:17:10 -0400 Subject: [PATCH] Fixes windows not allowing auto exposure prop for the ov2311 (#1407) --- .../USBCameras/ArduOV2311CameraSettables.java | 3 + .../ArduOV2311WindowsCameraSettables.java | 74 +++++++++++++++++++ .../camera/USBCameras/USBCameraSource.java | 9 ++- 3 files changed, 84 insertions(+), 2 deletions(-) create mode 100644 photon-core/src/main/java/org/photonvision/vision/camera/USBCameras/ArduOV2311WindowsCameraSettables.java diff --git a/photon-core/src/main/java/org/photonvision/vision/camera/USBCameras/ArduOV2311CameraSettables.java b/photon-core/src/main/java/org/photonvision/vision/camera/USBCameras/ArduOV2311CameraSettables.java index 1f04948f0..70af64f4b 100644 --- a/photon-core/src/main/java/org/photonvision/vision/camera/USBCameras/ArduOV2311CameraSettables.java +++ b/photon-core/src/main/java/org/photonvision/vision/camera/USBCameras/ArduOV2311CameraSettables.java @@ -20,6 +20,9 @@ import edu.wpi.first.cscore.UsbCamera; import org.photonvision.common.configuration.CameraConfiguration; +/* + * This class holds the non-windows camera quirks for the Arducam OV2311. This version supports auto-exposure, while windows does not. + */ public class ArduOV2311CameraSettables extends GenericUSBCameraSettables { public ArduOV2311CameraSettables(CameraConfiguration configuration, UsbCamera camera) { super(configuration, camera); diff --git a/photon-core/src/main/java/org/photonvision/vision/camera/USBCameras/ArduOV2311WindowsCameraSettables.java b/photon-core/src/main/java/org/photonvision/vision/camera/USBCameras/ArduOV2311WindowsCameraSettables.java new file mode 100644 index 000000000..51cfd6ba5 --- /dev/null +++ b/photon-core/src/main/java/org/photonvision/vision/camera/USBCameras/ArduOV2311WindowsCameraSettables.java @@ -0,0 +1,74 @@ +/* + * Copyright (C) Photon Vision. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package org.photonvision.vision.camera.USBCameras; + +import edu.wpi.first.cscore.UsbCamera; +import edu.wpi.first.cscore.VideoException; +import edu.wpi.first.math.MathUtil; +import org.photonvision.common.configuration.CameraConfiguration; + +/* + * This class holds the windows specific camera quirks for the Arducam ov2311. A windows version is needed because windows doesn't expose the auto exposure properties of the arducam. + */ +public class ArduOV2311WindowsCameraSettables extends GenericUSBCameraSettables { + public ArduOV2311WindowsCameraSettables(CameraConfiguration configuration, UsbCamera camera) { + super(configuration, camera); + } + + @Override + protected void setUpExposureProperties() { + var expProp = + findProperty( + "raw_exposure_absolute", + "raw_exposure_time_absolute", + "exposure", + "raw_Exposure", + "Exposure"); + + exposureAbsProp = expProp.get(); + autoExposureProp = null; + this.minExposure = 1; + this.maxExposure = 140; + } + + @Override + public void setExposureRaw(double exposureRaw) { + if (exposureRaw >= 0.0) { + try { + int propVal = (int) MathUtil.clamp(exposureRaw, minExposure, maxExposure); + camera.setExposureManual(propVal); + this.lastExposureRaw = exposureRaw; + } catch (VideoException e) { + logger.error("Failed to set camera exposure!", e); + } + } + } + + public void setAutoExposure(boolean cameraAutoExposure) { + logger.debug("Setting auto exposure to " + cameraAutoExposure); + + if (!cameraAutoExposure) { + // Most cameras leave exposure time absolute at the last value from their AE + // algorithm. + // Set it back to the exposure slider value + camera.setExposureManual((int) this.lastExposureRaw); + } else { + camera.setExposureAuto(); + } + } +} diff --git a/photon-core/src/main/java/org/photonvision/vision/camera/USBCameras/USBCameraSource.java b/photon-core/src/main/java/org/photonvision/vision/camera/USBCameras/USBCameraSource.java index 0eb69b373..aefb092a4 100644 --- a/photon-core/src/main/java/org/photonvision/vision/camera/USBCameras/USBCameraSource.java +++ b/photon-core/src/main/java/org/photonvision/vision/camera/USBCameras/USBCameraSource.java @@ -124,8 +124,13 @@ protected GenericUSBCameraSettables createSettables( logger.debug("Using PlayStation Eye Camera Settables"); settables = new PsEyeCameraSettables(config, camera); } else if (quirks.hasQuirk(CameraQuirk.ArduOV2311Controls)) { - logger.debug("Using Arducam OV2311 Settables"); - settables = new ArduOV2311CameraSettables(config, camera); + if (RuntimeDetector.isWindows()) { + logger.debug("Using Arducam OV2311 Windows-Specific Settables"); + settables = new ArduOV2311WindowsCameraSettables(config, camera); + } else { + logger.debug("Using Arducam OV2311 Settables"); + settables = new ArduOV2311CameraSettables(config, camera); + } } else if (quirks.hasQuirk(CameraQuirk.ArduOV9281Controls)) { logger.debug("Using Arducam OV9281 Settables"); settables = new InnoOV9281CameraSettables(config, camera);