Make light change only when the message contents change.

Change-Id: If81caf2107227ecb527401136ca6f9fa261d52ac
diff --git a/y2018/BUILD b/y2018/BUILD
index 19284e8..67ad583 100644
--- a/y2018/BUILD
+++ b/y2018/BUILD
@@ -39,6 +39,7 @@
         "joystick_reader.cc",
     ],
     deps = [
+        ":status_light",
         "//aos/common:time",
         "//aos/common/actions:action_lib",
         "//aos/common/logging",
diff --git a/y2018/joystick_reader.cc b/y2018/joystick_reader.cc
index a5eaf14..81791e5 100644
--- a/y2018/joystick_reader.cc
+++ b/y2018/joystick_reader.cc
@@ -17,6 +17,7 @@
 #include "y2018/control_loops/drivetrain/drivetrain_base.h"
 #include "y2018/control_loops/superstructure/arm/generated_graph.h"
 #include "y2018/control_loops/superstructure/superstructure.q.h"
+#include "y2018/status_light.q.h"
 
 using ::frc971::control_loops::drivetrain_queue;
 using ::y2018::control_loops::superstructure_queue;
@@ -103,6 +104,17 @@
     drivetrain_input_reader_->HandleDrivetrain(data);
   }
 
+  void SendColors(float red, float green, float blue) {
+    auto new_status_light = status_light.MakeMessage();
+    new_status_light->red = red;
+    new_status_light->green = green;
+    new_status_light->blue = blue;
+
+    if (!new_status_light.Send()) {
+      LOG(ERROR, "Failed to send lights.\n");
+    }
+  }
+
   void HandleTeleop(const ::aos::input::driver_station::Data &data) {
     if (!data.GetControlBit(ControlBit::kEnabled)) {
       action_queue_.CancelAllActions();
diff --git a/y2018/wpilib_interface.cc b/y2018/wpilib_interface.cc
index 6fba1fe..4a7fe1d 100644
--- a/y2018/wpilib_interface.cc
+++ b/y2018/wpilib_interface.cc
@@ -660,17 +660,31 @@
         LOG_STRUCT(DEBUG, "pneumatics info", to_log);
       }
 
+      static double last_red = -1.0;
+      static double last_green = -1.0;
+      static double last_blue = -1.0;
       status_light.FetchLatest();
       if (status_light.get()) {
         LOG_STRUCT(DEBUG, "writing", *status_light);
         // Not sure which of these is red vs green. We're not ready to use
-        // either,
-        // so just turn them off.
-        canifier_.SetLEDOutput(1.0, ::ctre::phoenix::CANifier::LEDChannelA);
-        canifier_.SetLEDOutput(1.0, ::ctre::phoenix::CANifier::LEDChannelB);
-        // Red
-        canifier_.SetLEDOutput(1 - status_light->red,
-                               ::ctre::phoenix::CANifier::LEDChannelC);
+        // either, so just turn them off.
+        if (status_light->green != last_green) {
+          canifier_.SetLEDOutput(1.0 - status_light->green,
+                                 ::ctre::phoenix::CANifier::LEDChannelA);
+          last_green = status_light->green;
+        }
+
+        if (status_light->blue != last_blue) {
+          canifier_.SetLEDOutput(1.0 - status_light->blue,
+                                 ::ctre::phoenix::CANifier::LEDChannelB);
+          last_blue = status_light->blue;
+        }
+
+        if (status_light->red != last_red) {
+          canifier_.SetLEDOutput(1.0 - status_light->red,
+                                 ::ctre::phoenix::CANifier::LEDChannelC);
+          last_red = status_light->red;
+        }
       }
     }
   }