Add basic support for nodes

This adds the infrastructure and configuration language to describe a
multinode world.  This only checks that if there are multiple nodes
setup, everything is both configured for multiple nodes, and that we are
listening and sending data on the correct node per the configuration.

Change-Id: I658ba05620337a210d677c43e5eb840e05f96051
diff --git a/frc971/wpilib/ADIS16448.cc b/frc971/wpilib/ADIS16448.cc
index f364d56..57987e6 100644
--- a/frc971/wpilib/ADIS16448.cc
+++ b/frc971/wpilib/ADIS16448.cc
@@ -117,7 +117,7 @@
 
 }  // namespace
 
-ADIS16448::ADIS16448(::aos::EventLoop *event_loop, frc::SPI::Port port,
+ADIS16448::ADIS16448(::aos::ShmEventLoop *event_loop, frc::SPI::Port port,
                      frc::DigitalInput *dio1)
     : event_loop_(event_loop),
       robot_state_fetcher_(event_loop_->MakeFetcher<::aos::RobotState>("/aos")),
@@ -144,7 +144,7 @@
       system("ps -ef | grep '\\[spi0\\]' | awk '{print $1}' | xargs chrt -f -p "
              "33") == 0);
 
-  event_loop_->set_name("IMU");
+  event_loop->set_name("IMU");
   event_loop_->SetRuntimeRealtimePriority(33);
 
   event_loop_->OnRun([this]() { DoRun(); });
diff --git a/frc971/wpilib/ADIS16448.h b/frc971/wpilib/ADIS16448.h
index ce950df..8f6da89 100644
--- a/frc971/wpilib/ADIS16448.h
+++ b/frc971/wpilib/ADIS16448.h
@@ -11,7 +11,7 @@
 #include "frc971/wpilib/ahal/SPI.h"
 #undef ERROR
 
-#include "aos/events/event_loop.h"
+#include "aos/events/shm_event_loop.h"
 #include "aos/logging/logging.h"
 #include "aos/robot_state/robot_state_generated.h"
 #include "frc971/wpilib/imu_generated.h"
@@ -32,7 +32,7 @@
  public:
   // port is where to find the sensor over SPI.
   // dio1 must be connected to DIO1 on the sensor.
-  ADIS16448(::aos::EventLoop *event_loop, frc::SPI::Port port,
+  ADIS16448(::aos::ShmEventLoop *event_loop, frc::SPI::Port port,
             frc::DigitalInput *dio1);
 
   // Sets the dummy SPI port to send values on to make the roboRIO deassert the
diff --git a/frc971/wpilib/BUILD b/frc971/wpilib/BUILD
index c2cdb51..48fda81 100644
--- a/frc971/wpilib/BUILD
+++ b/frc971/wpilib/BUILD
@@ -110,6 +110,7 @@
         ":gyro_interface",
         "//aos:init",
         "//aos/events:event_loop",
+        "//aos/events:shm_event_loop",
         "//aos/logging",
         "//aos/robot_state:robot_state_fbs",
         "//aos/time",
@@ -238,6 +239,7 @@
         ":pdp_values_fbs",
         "//aos:init",
         "//aos/events:event_loop",
+        "//aos/events:shm_event_loop",
         "//aos/util:phased_loop",
         "//third_party:wpilib",
     ],
@@ -276,6 +278,7 @@
         ":spi_rx_clearer",
         "//aos:init",
         "//aos/events:event_loop",
+        "//aos/events:shm_event_loop",
         "//aos/logging",
         "//aos/robot_state:robot_state_fbs",
         "//aos/time",
@@ -327,6 +330,7 @@
         ":wpilib_interface",
         "//aos:init",
         "//aos/events:event_loop",
+        "//aos/events:shm_event_loop",
         "//aos/stl_mutex",
         "//aos/time",
         "//aos/util:phased_loop",
diff --git a/frc971/wpilib/gyro_sender.cc b/frc971/wpilib/gyro_sender.cc
index f5297c0..4f88f9e 100644
--- a/frc971/wpilib/gyro_sender.cc
+++ b/frc971/wpilib/gyro_sender.cc
@@ -7,7 +7,7 @@
 
 #include <chrono>
 
-#include "aos/events/event_loop.h"
+#include "aos/events/shm_event_loop.h"
 #include "aos/init.h"
 #include "aos/logging/logging.h"
 #include "aos/robot_state/robot_state_generated.h"
@@ -22,7 +22,7 @@
 namespace chrono = ::std::chrono;
 using ::aos::monotonic_clock;
 
-GyroSender::GyroSender(::aos::EventLoop *event_loop)
+GyroSender::GyroSender(::aos::ShmEventLoop *event_loop)
     : event_loop_(event_loop),
       joystick_state_fetcher_(
           event_loop_->MakeFetcher<aos::RobotState>("/aos")),
@@ -33,7 +33,7 @@
   AOS_PCHECK(
       system("ps -ef | grep '\\[spi0\\]' | awk '{print $1}' | xargs chrt -f -p "
              "33") == 0);
-  event_loop_->set_name("Gyro");
+  event_loop->set_name("Gyro");
   event_loop_->SetRuntimeRealtimePriority(33);
 
   // TODO(austin): This should be synchronized with SensorReader...  Pull out
diff --git a/frc971/wpilib/gyro_sender.h b/frc971/wpilib/gyro_sender.h
index ec39264..8125598 100644
--- a/frc971/wpilib/gyro_sender.h
+++ b/frc971/wpilib/gyro_sender.h
@@ -6,6 +6,7 @@
 #include <atomic>
 
 #include "aos/events/event_loop.h"
+#include "aos/events/shm_event_loop.h"
 #include "aos/robot_state/robot_state_generated.h"
 #include "frc971/queues/gyro_generated.h"
 #include "frc971/wpilib/gyro_interface.h"
@@ -20,7 +21,7 @@
 // as a separate thread.
 class GyroSender {
  public:
-  GyroSender(::aos::EventLoop *event_loop);
+  GyroSender(::aos::ShmEventLoop *event_loop);
 
   enum class State { INITIALIZING, RUNNING };
 
diff --git a/frc971/wpilib/pdp_fetcher.cc b/frc971/wpilib/pdp_fetcher.cc
index cd17d89..62e0e37 100644
--- a/frc971/wpilib/pdp_fetcher.cc
+++ b/frc971/wpilib/pdp_fetcher.cc
@@ -3,6 +3,7 @@
 #include <chrono>
 
 #include "aos/events/event_loop.h"
+#include "aos/events/shm_event_loop.h"
 #include "aos/logging/logging.h"
 #include "frc971/wpilib/ahal/PowerDistributionPanel.h"
 #include "frc971/wpilib/pdp_values_generated.h"
@@ -12,11 +13,11 @@
 
 namespace chrono = ::std::chrono;
 
-PDPFetcher::PDPFetcher(::aos::EventLoop *event_loop)
+PDPFetcher::PDPFetcher(::aos::ShmEventLoop *event_loop)
     : event_loop_(event_loop),
       pdp_values_sender_(event_loop_->MakeSender<::frc971::PDPValues>("/aos")),
       pdp_(new frc::PowerDistributionPanel()) {
-  event_loop_->set_name("PDPFetcher");
+  event_loop->set_name("PDPFetcher");
 
   // SCHED_OTHER on purpose.
   event_loop_->AddPhasedLoop([this](int iterations) { Loop(iterations); },
diff --git a/frc971/wpilib/pdp_fetcher.h b/frc971/wpilib/pdp_fetcher.h
index d034473..72f6745 100644
--- a/frc971/wpilib/pdp_fetcher.h
+++ b/frc971/wpilib/pdp_fetcher.h
@@ -5,6 +5,7 @@
 #include <memory>
 
 #include "aos/events/event_loop.h"
+#include "aos/events/shm_event_loop.h"
 #include "frc971/wpilib/pdp_values_generated.h"
 
 namespace frc {
@@ -17,7 +18,7 @@
 // Handles fetching values from the PDP.
 class PDPFetcher {
  public:
-  PDPFetcher(::aos::EventLoop *event_loop);
+  PDPFetcher(::aos::ShmEventLoop *event_loop);
 
   ~PDPFetcher();
 
diff --git a/frc971/wpilib/sensor_reader.cc b/frc971/wpilib/sensor_reader.cc
index d4ea66e..5bcb84a 100644
--- a/frc971/wpilib/sensor_reader.cc
+++ b/frc971/wpilib/sensor_reader.cc
@@ -15,10 +15,9 @@
 namespace frc971 {
 namespace wpilib {
 
-SensorReader::SensorReader(::aos::EventLoop *event_loop)
+SensorReader::SensorReader(::aos::ShmEventLoop *event_loop)
     : event_loop_(event_loop),
-      robot_state_sender_(
-          event_loop_->MakeSender<::aos::RobotState>("/aos")),
+      robot_state_sender_(event_loop_->MakeSender<::aos::RobotState>("/aos")),
       my_pid_(getpid()) {
   // Set some defaults.  We don't tend to exceed these, so old robots should
   // just work with them.
diff --git a/frc971/wpilib/sensor_reader.h b/frc971/wpilib/sensor_reader.h
index ae1d580..3e24fd7 100644
--- a/frc971/wpilib/sensor_reader.h
+++ b/frc971/wpilib/sensor_reader.h
@@ -5,6 +5,7 @@
 #include <chrono>
 
 #include "aos/events/event_loop.h"
+#include "aos/events/shm_event_loop.h"
 #include "aos/robot_state/robot_state_generated.h"
 #include "aos/stl_mutex/stl_mutex.h"
 #include "aos/time/time.h"
@@ -24,7 +25,7 @@
 
 class SensorReader {
  public:
-  SensorReader(::aos::EventLoop *event_loop);
+  SensorReader(::aos::ShmEventLoop *event_loop);
   virtual ~SensorReader() {}
 
   // Updates the fast and medium encoder filter frequencies.