run control loops and write their output on new sensor values

This also includes sending solenoid values from their own thread at 50Hz
(formerly I613f95a6efb5efe428029e4825ba6caeb34ea326).

Change-Id: I3d3021cdbbf2ddf895e5ceebd4db299b4743e124
diff --git a/frc971/wpilib/buffered_pcm.cc b/frc971/wpilib/buffered_pcm.cc
new file mode 100644
index 0000000..084d4b5
--- /dev/null
+++ b/frc971/wpilib/buffered_pcm.cc
@@ -0,0 +1,29 @@
+#include "frc971/wpilib/buffered_pcm.h"
+
+#include <inttypes.h>
+
+#include "aos/common/logging/logging.h"
+
+namespace frc971 {
+namespace wpilib {
+
+::std::unique_ptr<BufferedSolenoid> BufferedPcm::MakeSolenoid(int number) {
+  return ::std::unique_ptr<BufferedSolenoid>(
+      new BufferedSolenoid(number, this));
+}
+
+void BufferedPcm::Set(int number, bool value) {
+  if (value) {
+    values_ |= 1 << number;
+  } else {
+    values_ &= ~(1 << number);
+  }
+}
+
+void BufferedPcm::Flush() {
+  LOG(DEBUG, "sending solenoids 0x%" PRIx8 "\n", values_);
+  SolenoidBase::Set(values_, 0xFF);
+}
+
+}  // namespace wpilib
+}  // namespace frc971