diff --git a/photon-client/src/views/CamerasView.vue b/photon-client/src/views/CamerasView.vue
index e736789bb..6a18f6067 100644
--- a/photon-client/src/views/CamerasView.vue
+++ b/photon-client/src/views/CamerasView.vue
@@ -25,8 +25,8 @@
/>
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 e60294cd6..ff7dc5721 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
@@ -61,18 +61,25 @@ public class ZeroCopyPicamSource implements VisionSource {
*/
private static class FPSRatedVideoMode extends VideoMode {
public final int fpsActual;
+ public final double fovMultiplier;
public FPSRatedVideoMode(
- PixelFormat pixelFormat, int width, int height, int ratedFPS, int actualFPS) {
+ PixelFormat pixelFormat,
+ int width,
+ int height,
+ int ratedFPS,
+ int actualFPS,
+ double fovMultiplier) {
super(pixelFormat, width, height, ratedFPS);
this.fpsActual = actualFPS;
+ this.fovMultiplier = fovMultiplier;
}
}
public static class PicamSettables extends VisionSourceSettables {
- private VideoMode currentVideoMode;
+ private FPSRatedVideoMode currentVideoMode;
private double lastExposure;
private int lastBrightness;
private int lastGain;
@@ -81,28 +88,40 @@ public class ZeroCopyPicamSource implements VisionSource {
super(configuration);
videoModes = new HashMap<>();
- videoModes.put(
- 0,
- new FPSRatedVideoMode(
- VideoMode.PixelFormat.kUnknown, 320, 240, 90, 90)); // Was 120 on IMX219
- videoModes.put(
- 1,
- new FPSRatedVideoMode(
- VideoMode.PixelFormat.kUnknown, 640, 480, 85, 90)); // Was 65-70 on IMX219
- videoModes.put(
- 2,
- new FPSRatedVideoMode(
- VideoMode.PixelFormat.kUnknown, 960, 720, 45, 60)); // Was 45 on IMX219
- videoModes.put(
- 3,
- new FPSRatedVideoMode(
- VideoMode.PixelFormat.kUnknown, 1280, 720, 30, 45)); // Was 40 on IMX219
- videoModes.put(
- 4,
- new FPSRatedVideoMode(
- VideoMode.PixelFormat.kUnknown, 1920, 1080, 15, 20)); // Was 15 on IMX219
- currentVideoMode = videoModes.get(0);
+ // TODO add IMX219 detection to the picam driver
+ // if(PicamJNI.isIMX219()) {
+ if (false) {
+ // Settings for the Picam V2
+ // TODO determine multipliers
+ videoModes.put(
+ 0, new FPSRatedVideoMode(VideoMode.PixelFormat.kUnknown, 320, 240, 120, 120, .39));
+ videoModes.put(
+ 1, new FPSRatedVideoMode(VideoMode.PixelFormat.kUnknown, 640, 480, 65, 90, .39));
+ videoModes.put(
+ 2, new FPSRatedVideoMode(VideoMode.PixelFormat.kUnknown, 1280, 720, 40, 90, .72));
+ videoModes.put(
+ 3, new FPSRatedVideoMode(VideoMode.PixelFormat.kUnknown, 1920, 1080, 15, 20, .53));
+ } else {
+ // "High Quality" picam falls back on settings for OV sensor
+ videoModes.put(
+ 0, new FPSRatedVideoMode(VideoMode.PixelFormat.kUnknown, 320, 240, 90, 90, 1));
+ videoModes.put(
+ 1, new FPSRatedVideoMode(VideoMode.PixelFormat.kUnknown, 640, 480, 85, 90, 1));
+ videoModes.put(
+ 2, new FPSRatedVideoMode(VideoMode.PixelFormat.kUnknown, 960, 720, 45, 60, 1));
+ videoModes.put(
+ 3, new FPSRatedVideoMode(VideoMode.PixelFormat.kUnknown, 1280, 720, 30, 45, 0.92));
+ videoModes.put(
+ 4, new FPSRatedVideoMode(VideoMode.PixelFormat.kUnknown, 1920, 1080, 15, 20, 0.72));
+ }
+
+ currentVideoMode = (FPSRatedVideoMode) videoModes.get(0);
+ }
+
+ @Override
+ public double getFOV() {
+ return getCurrentVideoMode().fovMultiplier * getConfiguration().FOV;
}
@Override
@@ -124,15 +143,15 @@ public class ZeroCopyPicamSource implements VisionSource {
}
@Override
- public VideoMode getCurrentVideoMode() {
+ public FPSRatedVideoMode getCurrentVideoMode() {
return currentVideoMode;
}
@Override
protected void setVideoModeInternal(VideoMode videoMode) {
+ var mode = (FPSRatedVideoMode) videoMode;
PicamJNI.destroyCamera();
- PicamJNI.createCamera(
- videoMode.width, videoMode.height, ((FPSRatedVideoMode) videoMode).fpsActual);
+ PicamJNI.createCamera(mode.width, mode.height, mode.fpsActual);
// We don't store last settings on the native side, and when you change video mode these get
// reset on MMAL's end
@@ -140,7 +159,7 @@ public class ZeroCopyPicamSource implements VisionSource {
setBrightness(lastBrightness);
setGain(lastGain);
- currentVideoMode = videoMode;
+ currentVideoMode = mode;
}
@Override