Merge "Reshuffle Teensy frame queueing code to fix a bug"
diff --git a/y2019/jevois/teensy.cc b/y2019/jevois/teensy.cc
index 570892f..0f9f94d 100644
--- a/y2019/jevois/teensy.cc
+++ b/y2019/jevois/teensy.cc
@@ -308,6 +308,8 @@
     last_frames_.clear();
   }
 
+  bool HaveLatestFrames() const { return !last_frames_.empty(); }
+
  private:
   struct FrameData {
     aos::SizedArray<Target, 3> targets;
@@ -695,19 +697,26 @@
     }
     {
       bool made_transfer = false;
-      if (!first) {
+      const bool have_old_frames = frame_queue.HaveLatestFrames();
+      {
+        const auto new_transfer = frame_queue.MakeTransfer();
         DisableInterrupts disable_interrupts;
-        made_transfer =
-            !SpiQueue::global_instance->HaveTransfer(disable_interrupts);
+        if (!first) {
+          made_transfer =
+              !SpiQueue::global_instance->HaveTransfer(disable_interrupts);
+        }
+        // If we made a transfer just now, then new_transfer might contain
+        // duplicate targets, in which case don't use it.
+        if (!have_old_frames || !made_transfer) {
+          SpiQueue::global_instance->UpdateTransfer(new_transfer,
+                                                    disable_interrupts);
+        }
       }
+      // If we made a transfer, then make sure we aren't remembering any
+      // in-flight frames.
       if (made_transfer) {
         frame_queue.RemoveLatestFrames();
       }
-      const auto transfer = frame_queue.MakeTransfer();
-      {
-        DisableInterrupts disable_interrupts;
-        SpiQueue::global_instance->UpdateTransfer(transfer, disable_interrupts);
-      }
     }
     {
       const auto now = aos::monotonic_clock::now();