Log more info from the PDP

Change-Id: I9313b1ff1608d73be4589263950c9f0a6dc20737
diff --git a/aos/common/messages/robot_state.q b/aos/common/messages/robot_state.q
index 3ecb653..a99627e 100644
--- a/aos/common/messages/robot_state.q
+++ b/aos/common/messages/robot_state.q
@@ -59,6 +59,12 @@
   // From the DriverStation object, aka what FMS sees and what shows up on the
   // actual driver's station.
   double voltage_battery;
+
+  // From the PDP directly.
+  double pdp_voltage;
+  double pdp_temperature;
+  double pdp_power;
+  double[16] pdp_currents;
 };
 
 // Messages are sent out on this queue along with reading sensors. It contains
diff --git a/frc971/wpilib/wpilib_interface.cc b/frc971/wpilib/wpilib_interface.cc
index 7827041..68e0771 100644
--- a/frc971/wpilib/wpilib_interface.cc
+++ b/frc971/wpilib/wpilib_interface.cc
@@ -9,7 +9,8 @@
 namespace frc971 {
 namespace wpilib {
 
-void SendRobotState(int32_t my_pid, DriverStation *ds) {
+void SendRobotState(int32_t my_pid, DriverStation *ds,
+                    PowerDistributionPanel *pdp) {
   auto new_state = ::aos::robot_state.MakeMessage();
 
   new_state->reader_pid = my_pid;
@@ -24,6 +25,13 @@
   new_state->voltage_roborio_in = ControllerPower::GetInputVoltage();
   new_state->voltage_battery = ds->GetBatteryVoltage();
 
+  new_state->pdp_voltage = pdp->GetVoltage();
+  new_state->pdp_temperature = pdp->GetTemperature();
+  new_state->pdp_power = pdp->GetTotalPower();
+  for (int i = 0; i < 16; ++i) {
+    new_state->pdp_currents[i] = pdp->GetCurrent(i);
+  }
+
   LOG_STRUCT(DEBUG, "robot_state", *new_state);
 
   new_state.Send();
diff --git a/frc971/wpilib/wpilib_interface.h b/frc971/wpilib/wpilib_interface.h
index 216bf09..7d4b92d 100644
--- a/frc971/wpilib/wpilib_interface.h
+++ b/frc971/wpilib/wpilib_interface.h
@@ -3,13 +3,16 @@
 
 #include <stdint.h>
 
+#include "PowerDistributionPanel.h"
+
 class DriverStation;
 
 namespace frc971 {
 namespace wpilib {
 
 // Sends out a message on ::aos::robot_state.
-void SendRobotState(int32_t my_pid, DriverStation *ds);
+void SendRobotState(int32_t my_pid, DriverStation *ds,
+                    PowerDistributionPanel *pdp);
 
 }  // namespace wpilib
 }  // namespace frc971
diff --git a/y2014/wpilib/wpilib_interface.cc b/y2014/wpilib/wpilib_interface.cc
index 4352814..9d6b8b3 100644
--- a/y2014/wpilib/wpilib_interface.cc
+++ b/y2014/wpilib/wpilib_interface.cc
@@ -18,6 +18,7 @@
 #ifndef WPILIB2015
 #include "DigitalGlitchFilter.h"
 #endif
+#include "PowerDistributionPanel.h"
 #undef ERROR
 
 #include "aos/common/logging/logging.h"
@@ -245,6 +246,7 @@
 #else
         &DriverStation::GetInstance();
 #endif
+    pdp_.reset(new PowerDistributionPanel());
 
     top_reader_.Start();
     bottom_reader_.Start();
@@ -262,7 +264,7 @@
   }
 
   void RunIteration() {
-    ::frc971::wpilib::SendRobotState(my_pid_, ds_);
+    ::frc971::wpilib::SendRobotState(my_pid_, ds_, pdp_.get());
 
     const auto &values = constants::GetValues();
 
@@ -417,6 +419,7 @@
 
   int32_t my_pid_;
   DriverStation *ds_;
+  ::std::unique_ptr<PowerDistributionPanel> pdp_;
 
   ::std::unique_ptr<DMASynchronizer> dma_synchronizer_;
 
diff --git a/y2014_bot3/wpilib/wpilib_interface.cc b/y2014_bot3/wpilib/wpilib_interface.cc
index 096f526..5dcb838 100644
--- a/y2014_bot3/wpilib/wpilib_interface.cc
+++ b/y2014_bot3/wpilib/wpilib_interface.cc
@@ -16,6 +16,7 @@
 #include "RobotBase.h"
 #include "dma.h"
 #include "DigitalInput.h"
+#include "PowerDistributionPanel.h"
 #undef ERROR
 
 #include "aos/common/logging/logging.h"
@@ -88,6 +89,7 @@
 #else
         &DriverStation::GetInstance();
 #endif
+    pdp_.reset(new PowerDistributionPanel());
 
     LOG(INFO, "Things are now started\n");
 
@@ -99,7 +101,7 @@
   }
 
   void RunIteration() {
-    ::frc971::wpilib::SendRobotState(my_pid_, ds_);
+    ::frc971::wpilib::SendRobotState(my_pid_, ds_, pdp_.get());
 
     // Drivetrain
     {
@@ -127,6 +129,7 @@
 
   int32_t my_pid_;
   DriverStation *ds_;
+  ::std::unique_ptr<PowerDistributionPanel> pdp_;
 
   ::std::unique_ptr<Encoder> drivetrain_left_encoder_;
   ::std::unique_ptr<Encoder> drivetrain_right_encoder_;
diff --git a/y2015/wpilib/wpilib_interface.cc b/y2015/wpilib/wpilib_interface.cc
index c1d9628..fa7d14a 100644
--- a/y2015/wpilib/wpilib_interface.cc
+++ b/y2015/wpilib/wpilib_interface.cc
@@ -18,6 +18,7 @@
 #ifndef WPILIB2015
 #include "DigitalGlitchFilter.h"
 #endif
+#include "PowerDistributionPanel.h"
 #undef ERROR
 
 #include "aos/common/logging/logging.h"
@@ -229,6 +230,7 @@
 #else
         &DriverStation::GetInstance();
 #endif
+    pdp_.reset(new PowerDistributionPanel());
 
     wrist_encoder_.Start();
     dma_synchronizer_->Start();
@@ -244,7 +246,7 @@
   }
 
   void RunIteration() {
-    ::frc971::wpilib::SendRobotState(my_pid_, ds_);
+    ::frc971::wpilib::SendRobotState(my_pid_, ds_, pdp_.get());
 
     {
       auto drivetrain_message = drivetrain_queue.position.MakeMessage();
@@ -297,6 +299,7 @@
 
   int32_t my_pid_;
   DriverStation *ds_;
+  ::std::unique_ptr<PowerDistributionPanel> pdp_;
 
   void CopyPotAndIndexPosition(
       const DMAEncoderAndPotentiometer &encoder, PotAndIndexPosition *position,
diff --git a/y2015_bot3/wpilib/wpilib_interface.cc b/y2015_bot3/wpilib/wpilib_interface.cc
index 4dfae3f..554e0a6 100644
--- a/y2015_bot3/wpilib/wpilib_interface.cc
+++ b/y2015_bot3/wpilib/wpilib_interface.cc
@@ -19,6 +19,7 @@
 #include "DigitalGlitchFilter.h"
 #endif
 #include "DigitalInput.h"
+#include "PowerDistributionPanel.h"
 #undef ERROR
 
 #include "aos/common/logging/logging.h"
@@ -128,6 +129,7 @@
 #else
         &DriverStation::GetInstance();
 #endif
+    pdp_.reset(new PowerDistributionPanel());
 
     LOG(INFO, "Things are now started\n");
 
@@ -139,7 +141,7 @@
   }
 
   void RunIteration() {
-    ::frc971::wpilib::SendRobotState(my_pid_, ds_);
+    ::frc971::wpilib::SendRobotState(my_pid_, ds_, pdp_.get());
 
     // Drivetrain
     {
@@ -179,6 +181,7 @@
 
   int32_t my_pid_;
   DriverStation *ds_;
+  ::std::unique_ptr<PowerDistributionPanel> pdp_;
 
   ::std::unique_ptr<Encoder> left_encoder_, right_encoder_, elevator_encoder_;
   ::std::unique_ptr<DigitalInput> zeroing_hall_effect_;