Update camera reader to work with new camera

We had a Rev. A version of arducam's imx462 lowlight camera, but they've
updated to Rev. C since then, and it needs a different driver.

This change relies on pull request #2 in frc971/linux which pulls in their arducam-pivariety driver

Signed-off-by: Ravago Jones <ravagojones@gmail.com>
Change-Id: Ib73f197125aaa7deef2e313d9fdca8b32d1cad73
diff --git a/frc971/rockpi/.config b/frc971/rockpi/.config
index 636a585..3860117 100644
--- a/frc971/rockpi/.config
+++ b/frc971/rockpi/.config
@@ -3358,6 +3358,7 @@
 # Camera sensor devices
 #
 # CONFIG_VIDEO_AR0521 is not set
+CONFIG_VIDEO_ARDUCAM_PIVARIETY=m
 # CONFIG_VIDEO_HI556 is not set
 # CONFIG_VIDEO_HI846 is not set
 # CONFIG_VIDEO_HI847 is not set
diff --git a/frc971/vision/v4l2_reader.cc b/frc971/vision/v4l2_reader.cc
index 053bfa1..a6bcb4d 100644
--- a/frc971/vision/v4l2_reader.cc
+++ b/frc971/vision/v4l2_reader.cc
@@ -366,16 +366,19 @@
   PCHECK(ImageSensorIoctl(VIDIOC_S_EXT_CTRLS, &controls) == 0);
 }
 
-void RockchipV4L2Reader::SetBlanking(size_t hblank, size_t vblank) {
-  v4l2_control hblank_control;
-  hblank_control.id = V4L2_CID_HBLANK;
-  hblank_control.value = static_cast<int>(hblank);
-  PCHECK(ImageSensorIoctl(VIDIOC_S_CTRL, &hblank_control) == 0);
+void RockchipV4L2Reader::SetVerticalBlanking(size_t vblank) {
+  struct v4l2_ext_controls controls;
+  memset(&controls, 0, sizeof(controls));
+  struct v4l2_ext_control control[1];
+  memset(&control, 0, sizeof(control));
 
-  v4l2_control vblank_control;
-  vblank_control.id = V4L2_CID_VBLANK;
-  vblank_control.value = static_cast<int>(vblank);
-  PCHECK(ImageSensorIoctl(VIDIOC_S_CTRL, &vblank_control) == 0);
+  controls.ctrl_class = V4L2_CTRL_CLASS_IMAGE_SOURCE;
+  controls.count = 1;
+  controls.controls = control;
+  control[0].id = V4L2_CID_VBLANK;
+  control[0].value = vblank;
+
+  PCHECK(ImageSensorIoctl(VIDIOC_S_EXT_CTRLS, &controls) == 0);
 }
 
 }  // namespace vision
diff --git a/frc971/vision/v4l2_reader.h b/frc971/vision/v4l2_reader.h
index e36fef8..669c157 100644
--- a/frc971/vision/v4l2_reader.h
+++ b/frc971/vision/v4l2_reader.h
@@ -80,7 +80,7 @@
                         aos::monotonic_clock::time_point monotonic_eof);
 
     void Send() {
-      (void)builder.Send(message_offset);
+      builder.CheckOk(builder.Send(message_offset));
       message_offset = flatbuffers::Offset<CameraImage>();
     }
 
@@ -154,7 +154,7 @@
   void SetGain(size_t gain);
   void SetGainExt(size_t gain);
 
-  void SetBlanking(size_t hblank, size_t vblank);
+  void SetVerticalBlanking(size_t vblank);
 
  private:
   void OnImageReady();
diff --git a/y2023/vision/camera_reader.cc b/y2023/vision/camera_reader.cc
index 560e9ee..fca5d53 100644
--- a/y2023/vision/camera_reader.cc
+++ b/y2023/vision/camera_reader.cc
@@ -30,7 +30,7 @@
     width = 1920;
     height = 1080;
     color_format = MEDIA_BUS_FMT_SRGGB10_1X10;
-    camera_device_string = "imx290 4-0036";
+    camera_device_string = "arducam-pivariety 4-000c";
   }
 
   media_device->Reset();
@@ -94,9 +94,9 @@
                                  rkisp1_selfpath->device(), camera->device());
 
   if (FLAGS_lowlight_camera) {
-    v4l2_reader.SetGain(72);
-    v4l2_reader.SetExposure(30);
-    v4l2_reader.SetBlanking(2480, 45);
+    v4l2_reader.SetGainExt(100);
+    v4l2_reader.SetVerticalBlanking(1000);
+    v4l2_reader.SetExposure(50);
   } else {
     v4l2_reader.SetGainExt(1000);
     v4l2_reader.SetExposure(1000);
diff --git a/y2023/y2023_pi_template.json b/y2023/y2023_pi_template.json
index ba8f3c0..fd3e97f 100644
--- a/y2023/y2023_pi_template.json
+++ b/y2023/y2023_pi_template.json
@@ -164,7 +164,7 @@
       "type": "frc971.vision.CameraImage",
       "source_node": "pi{{ NUM }}",
       "frequency": 40,
-      "max_size": 2600000,
+      "max_size": 4200000,
       "num_readers": 4,
       "read_method": "PIN",
       "num_senders": 18