diff --git a/photon-client/src/views/SettingsViews/General.vue b/photon-client/src/views/SettingsViews/General.vue index 67b7ceb57..6ff78cf35 100644 --- a/photon-client/src/views/SettingsViews/General.vue +++ b/photon-client/src/views/SettingsViews/General.vue @@ -205,7 +205,7 @@ export default { return `${this.settings.hardwarePlatform}`; }, gpuAccel() { - return `${this.settings.gpuAcceleration ? "Enabled" : "Unsupported"}${this.settings.gpuAcceleration ? " (" + this.settings.gpuAcceleration + " mode)" : ""}` + return `${this.settings.gpuAcceleration ? "Enabled" : "Unsupported"} ${this.settings.gpuAcceleration ? "(" + this.settings.gpuAcceleration + ")" : ""}` }, metrics() { console.log(this.$store.state.metrics); diff --git a/photon-server/src/main/java/org/photonvision/common/configuration/PhotonConfiguration.java b/photon-server/src/main/java/org/photonvision/common/configuration/PhotonConfiguration.java index 6d64be5d0..6c04ea1b6 100644 --- a/photon-server/src/main/java/org/photonvision/common/configuration/PhotonConfiguration.java +++ b/photon-server/src/main/java/org/photonvision/common/configuration/PhotonConfiguration.java @@ -111,7 +111,7 @@ public class PhotonConfiguration { generalSubmap.put( "gpuAcceleration", PicamJNI.isSupported() - ? "Zerocopy MMAL" + ? "Zerocopy MMAL on " + PicamJNI.getSensorModel().getFriendlyName() : ""); // TODO add support for other types of GPU accel generalSubmap.put("hardwareModel", hardwareConfig.deviceName); generalSubmap.put("hardwarePlatform", Platform.getCurrentPlatform().toString()); diff --git a/photon-server/src/main/java/org/photonvision/raspi/PicamJNI.java b/photon-server/src/main/java/org/photonvision/raspi/PicamJNI.java index 2d8d4fdeb..b0af4b35b 100644 --- a/photon-server/src/main/java/org/photonvision/raspi/PicamJNI.java +++ b/photon-server/src/main/java/org/photonvision/raspi/PicamJNI.java @@ -32,6 +32,30 @@ public class PicamJNI { private static boolean libraryLoaded = false; private static Logger logger = new Logger(PicamJNI.class, LogGroup.Camera); + public enum SensorModel { + Disconnected, + OV5647, // Picam v1 + IMX219, // Picam v2 + IMX477, // Picam HQ + Unknown; + + public String getFriendlyName() { + switch (this) { + case Disconnected: + return "Disconnected Camera"; + case OV5647: + return "Camera Module v1"; + case IMX219: + return "Camera Module v2"; + case IMX477: + return "HQ Camera"; + case Unknown: + default: + return "Unknown Camera"; + } + } + } + public static synchronized void forceLoad() throws IOException { if (libraryLoaded || !Platform.isRaspberryPi()) return; @@ -61,9 +85,26 @@ public class PicamJNI { } public static boolean isSupported() { - return libraryLoaded; + return libraryLoaded && getSensorModel() != SensorModel.Disconnected; } + public static SensorModel getSensorModel() { + switch (getSensorModelRaw().toLowerCase()) { + case "": + return SensorModel.Disconnected; + case "ov5647": + return SensorModel.OV5647; + case "imx219": + return SensorModel.IMX219; + case "imx477": + return SensorModel.IMX477; + default: + return SensorModel.Unknown; + } + } + + private static native String getSensorModelRaw(); + // Everything here is static because multiple picams are unsupported at the hardware level /** diff --git a/photon-server/src/main/java/org/photonvision/vision/camera/ZeroCopyPicamSource.java b/photon-server/src/main/java/org/photonvision/vision/camera/ZeroCopyPicamSource.java index ff7dc5721..b84d6fa8e 100644 --- a/photon-server/src/main/java/org/photonvision/vision/camera/ZeroCopyPicamSource.java +++ b/photon-server/src/main/java/org/photonvision/vision/camera/ZeroCopyPicamSource.java @@ -21,6 +21,8 @@ import edu.wpi.cscore.VideoMode; import java.util.HashMap; import org.photonvision.common.configuration.CameraConfiguration; import org.photonvision.common.configuration.ConfigManager; +import org.photonvision.common.logging.LogGroup; +import org.photonvision.common.logging.Logger; import org.photonvision.raspi.PicamJNI; import org.photonvision.vision.frame.FrameProvider; import org.photonvision.vision.frame.provider.AcceleratedPicamFrameProvider; @@ -28,6 +30,7 @@ import org.photonvision.vision.processes.VisionSource; import org.photonvision.vision.processes.VisionSourceSettables; public class ZeroCopyPicamSource implements VisionSource { + private static final Logger logger = new Logger(ZeroCopyPicamSource.class, LogGroup.Camera); private final VisionSourceSettables settables; private final AcceleratedPicamFrameProvider frameProvider; @@ -88,12 +91,10 @@ public class ZeroCopyPicamSource implements VisionSource { super(configuration); videoModes = new HashMap<>(); + PicamJNI.SensorModel sensorModel = PicamJNI.getSensorModel(); - // TODO add IMX219 detection to the picam driver - // if(PicamJNI.isIMX219()) { - if (false) { - // Settings for the Picam V2 - // TODO determine multipliers + if (sensorModel == PicamJNI.SensorModel.IMX219) { + // Settings for the IMX219 sensor, which is used on the Pi Camera Module v2 videoModes.put( 0, new FPSRatedVideoMode(VideoMode.PixelFormat.kUnknown, 320, 240, 120, 120, .39)); videoModes.put( @@ -103,7 +104,15 @@ public class ZeroCopyPicamSource implements VisionSource { videoModes.put( 3, new FPSRatedVideoMode(VideoMode.PixelFormat.kUnknown, 1920, 1080, 15, 20, .53)); } else { - // "High Quality" picam falls back on settings for OV sensor + if (sensorModel == PicamJNI.SensorModel.IMX477) { + logger.warn( + "It appears you are using a Pi HQ Camera. This camera is not officially supported. You will have to set your camera FOV differently based on resolution."); + } else if (sensorModel == PicamJNI.SensorModel.Unknown) { + logger.warn( + "You have an unknown sensor connected to your Pi over CSI! This is likely a bug. If it is not, then you will have to set your camera FOV differently based on resolution."); + } + + // Settings for the OV5647 sensor, which is used by the Pi Camera Module v1 videoModes.put( 0, new FPSRatedVideoMode(VideoMode.PixelFormat.kUnknown, 320, 240, 90, 90, 1)); videoModes.put( diff --git a/photon-server/src/main/resources/nativelibraries/libpicam.so b/photon-server/src/main/resources/nativelibraries/libpicam.so index b595f32e0..696fa1bc2 100755 Binary files a/photon-server/src/main/resources/nativelibraries/libpicam.so and b/photon-server/src/main/resources/nativelibraries/libpicam.so differ