Add more FMS data to JoystickState

Specifically:
-Add a more generica game-data string so that we don't have to add new
 fields every year.
-Add the current alliance color.

Change-Id: Ic422ccaf1cddd448176dc59618e9f9a3d008ea23
diff --git a/frc971/wpilib/joystick_sender.cc b/frc971/wpilib/joystick_sender.cc
index c614cfe..d31d4a5 100644
--- a/frc971/wpilib/joystick_sender.cc
+++ b/frc971/wpilib/joystick_sender.cc
@@ -67,6 +67,18 @@
             joysticks_offset = builder.fbb()->CreateVector(joysticks.begin(),
                                                            joysticks.size());
 
+        flatbuffers::Offset<flatbuffers::String> game_data_offset;
+        if (status == 0) {
+          static_assert(sizeof(match_info.gameSpecificMessage) == 64,
+                        "Check that the match info game specific message size "
+                        "hasn't changed and is still sane.");
+          CHECK_LE(match_info.gameSpecificMessageSize,
+                   sizeof(match_info.gameSpecificMessage));
+          game_data_offset = builder.fbb()->CreateString(
+              reinterpret_cast<const char *>(match_info.gameSpecificMessage),
+              match_info.gameSpecificMessageSize);
+        }
+
         aos::JoystickState::Builder joystick_state_builder =
             builder.MakeBuilder<aos::JoystickState>();
 
@@ -79,12 +91,24 @@
           joystick_state_builder.add_scale_left(
               match_info.gameSpecificMessage[1] == 'L' ||
               match_info.gameSpecificMessage[1] == 'l');
+          joystick_state_builder.add_game_data(game_data_offset);
         }
 
         joystick_state_builder.add_test_mode(ds->IsTestMode());
         joystick_state_builder.add_fms_attached(ds->IsFmsAttached());
         joystick_state_builder.add_enabled(ds->IsEnabled());
         joystick_state_builder.add_autonomous(ds->IsAutonomous());
+        switch (ds->GetAlliance()) {
+          case frc::DriverStation::kRed:
+            joystick_state_builder.add_alliance(aos::Alliance::kRed);
+            break;
+          case frc::DriverStation::kBlue:
+            joystick_state_builder.add_alliance(aos::Alliance::kBlue);
+            break;
+          case frc::DriverStation::kInvalid:
+            joystick_state_builder.add_alliance(aos::Alliance::kInvalid);
+            break;
+        }
         joystick_state_builder.add_team_id(team_id_);
 
         if (!builder.Send(joystick_state_builder.Finish())) {