Add pi4 and laptop

Pi's on 3 sides + 1 on the turret.  laptop will be the logger node at
some point in the future.

To do this, we need to edit the log file header again for the test
data...

Change-Id: I7a39d6644882e4c96dca1d689183295534d3aab4
diff --git a/y2020/BUILD b/y2020/BUILD
index 58a99ce..ebb0a80 100644
--- a/y2020/BUILD
+++ b/y2020/BUILD
@@ -147,9 +147,11 @@
     ],
     visibility = ["//visibility:public"],
     deps = [
+        ":config_laptop",
         ":config_pi1",
         ":config_pi2",
         ":config_pi3",
+        ":config_pi4",
         ":config_roborio",
     ],
 )
@@ -169,6 +171,7 @@
         visibility = ["//visibility:public"],
         deps = [
             "//aos/events:config",
+            "//aos/robot_state:config",
             "//frc971/control_loops/drivetrain:config",
         ],
     )
@@ -176,6 +179,8 @@
         "pi1",
         "pi2",
         "pi3",
+        "pi4",
+        "laptop",
     ]
 ]
 
diff --git a/y2020/y2020.json b/y2020/y2020.json
index a0a465a..808a796 100644
--- a/y2020/y2020.json
+++ b/y2020/y2020.json
@@ -7,7 +7,7 @@
         "type": "aos.RobotState"
       },
       "rename": {
-        "name": "/aos/roborio"
+        "name": "/roborio/aos"
       }
     }
   ],
@@ -15,6 +15,8 @@
     "y2020_roborio.json",
     "y2020_pi1.json",
     "y2020_pi2.json",
-    "y2020_pi3.json"
+    "y2020_pi3.json",
+    "y2020_pi4.json",
+    "y2020_laptop.json"
   ]
 }
diff --git a/y2020/y2020_laptop.json b/y2020/y2020_laptop.json
new file mode 100644
index 0000000..f220ef6
--- /dev/null
+++ b/y2020/y2020_laptop.json
@@ -0,0 +1,298 @@
+{
+  "channels":
+  [
+    {
+      "name": "/roborio/aos",
+      "type": "aos.RobotState",
+      "source_node": "roborio",
+      "logger": "LOCAL_AND_REMOTE_LOGGER",
+      "logger_nodes": ["laptop"],
+      "destination_nodes": [
+        {
+          "name": "laptop",
+          "priority": 2,
+          "timestamp_logger": "LOCAL_LOGGER",
+          "time_to_live": 10000000
+        }
+      ]
+    },
+    {
+      "name": "/roborio/aos",
+      "type": "aos.message_bridge.Timestamp",
+      "source_node": "roborio",
+      "destination_nodes": [
+        {
+          "name": "laptop",
+          "priority": 1,
+          "time_to_live": 5000000
+        }
+      ]
+    },
+    {
+      "name": "/drivetrain",
+      "type": "frc971.IMUValuesBatch",
+      "source_node": "roborio",
+      "logger": "LOCAL_AND_REMOTE_LOGGER",
+      "logger_nodes": ["laptop"],
+      "destination_nodes": [
+        {
+          "name": "laptop",
+          "priority": 2,
+          "time_to_live": 50000000
+        }
+      ]
+    },
+    {
+      "name": "/pi1/aos",
+      "type": "aos.message_bridge.Timestamp",
+      "source_node": "pi1",
+      "destination_nodes": [
+        {
+          "name": "laptop",
+          "priority": 1,
+          "time_to_live": 5000000
+        }
+      ]
+    },
+    {
+      "name": "/pi2/aos",
+      "type": "aos.message_bridge.Timestamp",
+      "source_node": "pi2",
+      "destination_nodes": [
+        {
+          "name": "laptop",
+          "priority": 1,
+          "time_to_live": 5000000
+        }
+      ]
+    },
+    {
+      "name": "/pi3/aos",
+      "type": "aos.message_bridge.Timestamp",
+      "source_node": "pi3",
+      "destination_nodes": [
+        {
+          "name": "laptop",
+          "priority": 1,
+          "time_to_live": 5000000
+        }
+      ]
+    },
+    {
+      "name": "/pi4/aos",
+      "type": "aos.message_bridge.Timestamp",
+      "source_node": "pi4",
+      "destination_nodes": [
+        {
+          "name": "laptop",
+          "priority": 1,
+          "time_to_live": 5000000
+        }
+      ]
+    },
+    {
+      "name": "/laptop/aos",
+      "type": "aos.timing.Report",
+      "source_node": "laptop",
+      "frequency": 50,
+      "num_senders": 20,
+      "max_size": 2048
+    },
+    {
+      "name": "/laptop/aos",
+      "type": "aos.logging.LogMessageFbs",
+      "source_node": "laptop",
+      "frequency": 400,
+      "num_senders": 20
+    },
+    {
+      "name": "/laptop/aos",
+      "type": "aos.message_bridge.ServerStatistics",
+      "source_node": "laptop",
+      "frequency": 2,
+      "num_senders": 2
+    },
+    {
+      "name": "/laptop/aos",
+      "type": "aos.message_bridge.ClientStatistics",
+      "source_node": "laptop",
+      "frequency": 10,
+      "num_senders": 2
+    },
+    {
+      "name": "/laptop/aos",
+      "type": "aos.message_bridge.Timestamp",
+      "source_node": "laptop",
+      "frequency": 10,
+      "num_senders": 2,
+      "max_size": 300,
+      "destination_nodes": [
+        {
+          "name": "pi1",
+          "priority": 1,
+          "time_to_live": 5000000
+        },
+        {
+          "name": "pi2",
+          "priority": 1,
+          "time_to_live": 5000000
+        },
+        {
+          "name": "pi3",
+          "priority": 1,
+          "time_to_live": 5000000
+        },
+        {
+          "name": "pi4",
+          "priority": 1,
+          "time_to_live": 5000000
+        },
+        {
+          "name": "roborio",
+          "priority": 1,
+          "time_to_live": 5000000
+        }
+      ]
+    },
+    {
+      "name": "/pi1/camera",
+      "type": "frc971.vision.CameraImage",
+      "source_node": "pi1",
+      "logger": "LOCAL_AND_REMOTE_LOGGER",
+      "logger_nodes": ["laptop"],
+      "destination_nodes": [
+        {
+          "name": "laptop",
+          "priority": 1,
+          "time_to_live": 5000000
+        }
+      ]
+    },
+    {
+      "name": "/pi1/camera",
+      "type": "frc971.vision.sift.ImageMatchResult",
+      "source_node": "pi1",
+      "destination_nodes": [
+        {
+          "name": "laptop",
+          "priority": 1,
+          "time_to_live": 5000000
+        }
+      ]
+    },
+    {
+      "name": "/pi2/camera",
+      "type": "frc971.vision.CameraImage",
+      "source_node": "pi2",
+      "logger": "LOCAL_AND_REMOTE_LOGGER",
+      "logger_nodes": ["laptop"],
+      "destination_nodes": [
+        {
+          "name": "laptop",
+          "priority": 1,
+          "time_to_live": 5000000
+        }
+      ]
+    },
+    {
+      "name": "/pi2/camera",
+      "type": "frc971.vision.sift.ImageMatchResult",
+      "source_node": "pi2",
+      "destination_nodes": [
+        {
+          "name": "laptop",
+          "priority": 1,
+          "time_to_live": 5000000
+        }
+      ]
+    },
+    {
+      "name": "/pi3/camera",
+      "type": "frc971.vision.CameraImage",
+      "source_node": "pi3",
+      "logger": "LOCAL_AND_REMOTE_LOGGER",
+      "logger_nodes": ["laptop"],
+      "destination_nodes": [
+        {
+          "name": "laptop",
+          "priority": 1,
+          "time_to_live": 5000000
+        }
+      ]
+    },
+    {
+      "name": "/pi3/camera",
+      "type": "frc971.vision.sift.ImageMatchResult",
+      "source_node": "pi3",
+      "destination_nodes": [
+        {
+          "name": "laptop",
+          "priority": 1,
+          "time_to_live": 5000000
+        }
+      ]
+    },
+    {
+      "name": "/pi4/camera",
+      "type": "frc971.vision.CameraImage",
+      "source_node": "pi4",
+      "logger": "LOCAL_AND_REMOTE_LOGGER",
+      "logger_nodes": ["laptop"],
+      "destination_nodes": [
+        {
+          "name": "laptop",
+          "priority": 1,
+          "time_to_live": 5000000
+        }
+      ]
+    },
+    {
+      "name": "/pi4/camera",
+      "type": "frc971.vision.sift.ImageMatchResult",
+      "source_node": "pi4",
+      "destination_nodes": [
+        {
+          "name": "laptop",
+          "priority": 1,
+          "time_to_live": 5000000
+        }
+      ]
+    }
+  ],
+  "maps": [
+    {
+      "match": {
+        "name": "/aos*",
+        "source_node": "laptop"
+      },
+      "rename": {
+        "name": "/laptop/aos"
+      }
+    }
+  ],
+  "nodes": [
+    {
+      "name": "laptop",
+      "hostname": "laptop",
+      "hostnames": [
+        "ASchuh-T480s"
+      ],
+      "port": 9971
+    },
+    {
+      "name": "roborio"
+    },
+    {
+      "name": "pi1"
+    },
+    {
+      "name": "pi2"
+    },
+    {
+      "name": "pi3"
+    },
+    {
+      "name": "pi4"
+    }
+  ]
+}
diff --git a/y2020/y2020_pi1.json b/y2020/y2020_pi1.json
index 93d3ba9..6974796 100644
--- a/y2020/y2020_pi1.json
+++ b/y2020/y2020_pi1.json
@@ -2,7 +2,7 @@
   "channels":
   [
     {
-      "name": "/aos/pi1",
+      "name": "/pi1/aos",
       "type": "aos.timing.Report",
       "source_node": "pi1",
       "frequency": 50,
@@ -10,28 +10,28 @@
       "max_size": 2048
     },
     {
-      "name": "/aos/pi1",
+      "name": "/pi1/aos",
       "type": "aos.logging.LogMessageFbs",
       "source_node": "pi1",
       "frequency": 200,
       "num_senders": 20
     },
     {
-      "name": "/aos/pi1",
+      "name": "/pi1/aos",
       "type": "aos.message_bridge.ServerStatistics",
       "source_node": "pi1",
       "frequency": 2,
       "num_senders": 2
     },
     {
-      "name": "/aos/pi1",
+      "name": "/pi1/aos",
       "type": "aos.message_bridge.ClientStatistics",
       "source_node": "pi1",
       "frequency": 10,
       "num_senders": 2
     },
     {
-      "name": "/aos/pi1",
+      "name": "/pi1/aos",
       "type": "aos.message_bridge.Timestamp",
       "source_node": "pi1",
       "frequency": 10,
@@ -87,30 +87,21 @@
   "maps": [
     {
       "match": {
-        "name": "/aos",
+        "name": "/aos*",
         "source_node": "pi1"
       },
       "rename": {
-        "name": "/aos/pi1"
+        "name": "/pi1/aos"
       }
     },
     {
       "match": {
-        "name": "/camera",
+        "name": "/camera*",
         "source_node": "pi1"
       },
       "rename": {
         "name": "/pi1/camera"
       }
-    },
-    {
-      "match": {
-        "name": "/camera/detailed",
-        "source_node": "pi1"
-      },
-      "rename": {
-        "name": "/pi1/camera/detailed"
-      }
     }
   ],
   "nodes": [
diff --git a/y2020/y2020_pi2.json b/y2020/y2020_pi2.json
index 2046666..facc010 100644
--- a/y2020/y2020_pi2.json
+++ b/y2020/y2020_pi2.json
@@ -2,7 +2,7 @@
   "channels":
   [
     {
-      "name": "/aos/pi2",
+      "name": "/pi2/aos",
       "type": "aos.timing.Report",
       "source_node": "pi2",
       "frequency": 50,
@@ -10,28 +10,28 @@
       "max_size": 2048
     },
     {
-      "name": "/aos/pi2",
+      "name": "/pi2/aos",
       "type": "aos.logging.LogMessageFbs",
       "source_node": "pi2",
       "frequency": 200,
       "num_senders": 20
     },
     {
-      "name": "/aos/pi2",
+      "name": "/pi2/aos",
       "type": "aos.message_bridge.ServerStatistics",
       "source_node": "pi2",
       "frequency": 2,
       "num_senders": 2
     },
     {
-      "name": "/aos/pi2",
+      "name": "/pi2/aos",
       "type": "aos.message_bridge.ClientStatistics",
       "source_node": "pi2",
       "frequency": 10,
       "num_senders": 2
     },
     {
-      "name": "/aos/pi2",
+      "name": "/pi2/aos",
       "type": "aos.message_bridge.Timestamp",
       "source_node": "pi2",
       "frequency": 10,
@@ -87,30 +87,21 @@
   "maps": [
     {
       "match": {
-        "name": "/aos",
+        "name": "/aos*",
         "source_node": "pi2"
       },
       "rename": {
-        "name": "/aos/pi2"
+        "name": "/pi2/aos"
       }
     },
     {
       "match": {
-        "name": "/camera",
+        "name": "/camera*",
         "source_node": "pi2"
       },
       "rename": {
         "name": "/pi2/camera"
       }
-    },
-    {
-      "match": {
-        "name": "/camera/detailed",
-        "source_node": "pi2"
-      },
-      "rename": {
-        "name": "/pi2/camera/detailed"
-      }
     }
   ],
   "nodes": [
diff --git a/y2020/y2020_pi3.json b/y2020/y2020_pi3.json
index fe8f980..9d9c839 100644
--- a/y2020/y2020_pi3.json
+++ b/y2020/y2020_pi3.json
@@ -2,7 +2,7 @@
   "channels":
   [
     {
-      "name": "/aos/pi3",
+      "name": "/pi3/aos",
       "type": "aos.timing.Report",
       "source_node": "pi3",
       "frequency": 50,
@@ -10,28 +10,28 @@
       "max_size": 2048
     },
     {
-      "name": "/aos/pi3",
+      "name": "/pi3/aos",
       "type": "aos.logging.LogMessageFbs",
       "source_node": "pi3",
       "frequency": 200,
       "num_senders": 20
     },
     {
-      "name": "/aos/pi3",
+      "name": "/pi3/aos",
       "type": "aos.message_bridge.ServerStatistics",
       "source_node": "pi3",
       "frequency": 2,
       "num_senders": 2
     },
     {
-      "name": "/aos/pi3",
+      "name": "/pi3/aos",
       "type": "aos.message_bridge.ClientStatistics",
       "source_node": "pi3",
       "frequency": 10,
       "num_senders": 2
     },
     {
-      "name": "/aos/pi3",
+      "name": "/pi3/aos",
       "type": "aos.message_bridge.Timestamp",
       "source_node": "pi3",
       "frequency": 10,
@@ -87,30 +87,21 @@
   "maps": [
     {
       "match": {
-        "name": "/aos",
+        "name": "/aos*",
         "source_node": "pi3"
       },
       "rename": {
-        "name": "/aos/pi3"
+        "name": "/pi3/aos"
       }
     },
     {
       "match": {
-        "name": "/camera",
+        "name": "/camera*",
         "source_node": "pi3"
       },
       "rename": {
         "name": "/pi3/camera"
       }
-    },
-    {
-      "match": {
-        "name": "/camera/detailed",
-        "source_node": "pi3"
-      },
-      "rename": {
-        "name": "/pi3/camera/detailed"
-      }
     }
   ],
   "nodes": [
diff --git a/y2020/y2020_pi4.json b/y2020/y2020_pi4.json
new file mode 100644
index 0000000..ce11ded
--- /dev/null
+++ b/y2020/y2020_pi4.json
@@ -0,0 +1,123 @@
+{
+  "channels":
+  [
+    {
+      "name": "/pi4/aos",
+      "type": "aos.timing.Report",
+      "source_node": "pi4",
+      "frequency": 50,
+      "num_senders": 20,
+      "max_size": 2048
+    },
+    {
+      "name": "/pi4/aos",
+      "type": "aos.logging.LogMessageFbs",
+      "source_node": "pi4",
+      "frequency": 200,
+      "num_senders": 20
+    },
+    {
+      "name": "/pi4/aos",
+      "type": "aos.message_bridge.ServerStatistics",
+      "source_node": "pi4",
+      "frequency": 2,
+      "num_senders": 2
+    },
+    {
+      "name": "/pi4/aos",
+      "type": "aos.message_bridge.ClientStatistics",
+      "source_node": "pi4",
+      "frequency": 10,
+      "num_senders": 2
+    },
+    {
+      "name": "/pi4/aos",
+      "type": "aos.message_bridge.Timestamp",
+      "source_node": "pi4",
+      "frequency": 10,
+      "num_senders": 2,
+      "max_size": 200,
+      "destination_nodes": [
+        {
+          "name": "roborio",
+          "priority": 1,
+          "time_to_live": 5000000
+        }
+      ]
+    },
+    {
+      "name": "/pi4/camera",
+      "type": "frc971.vision.CameraImage",
+      "source_node": "pi4",
+      "frequency": 25,
+      "max_size": 620000,
+      "num_senders": 18
+    },
+    {
+      "name": "/pi4/camera",
+      "type": "frc971.vision.sift.ImageMatchResult",
+      "source_node": "pi4",
+      "logger": "LOCAL_AND_REMOTE_LOGGER",
+      "logger_nodes": ["roborio"],
+      "frequency": 25,
+      "max_size": 10000,
+      "destination_nodes": [
+        {
+          "name": "roborio",
+          "priority": 1,
+          "time_to_live": 5000000
+        }
+      ]
+    },
+    {
+      "name": "/pi4/camera/detailed",
+      "type": "frc971.vision.sift.ImageMatchResult",
+      "source_node": "pi4",
+      "frequency": 25,
+      "max_size": 1000000
+    },
+    {
+      "name": "/pi4/camera",
+      "type": "frc971.vision.sift.TrainingData",
+      "source_node": "pi4",
+      "frequency": 2,
+      "max_size": 2000000
+    }
+  ],
+  "maps": [
+    {
+      "match": {
+        "name": "/aos*",
+        "source_node": "pi4"
+      },
+      "rename": {
+        "name": "/pi4/aos"
+      }
+    },
+    {
+      "match": {
+        "name": "/camera*",
+        "source_node": "pi4"
+      },
+      "rename": {
+        "name": "/pi4/camera"
+      }
+    }
+  ],
+  "nodes": [
+    {
+      "name": "pi4",
+      "hostname": "pi4",
+      "hostnames": [
+        "pi-971-4",
+        "pi-7971-4",
+        "pi-8971-4",
+        "pi-9971-4"
+      ],
+      "port": 9971
+    },
+    {
+      "name": "roborio"
+    }
+  ]
+}
diff --git a/y2020/y2020_roborio.json b/y2020/y2020_roborio.json
index 0ab7c36..7de7f51 100644
--- a/y2020/y2020_roborio.json
+++ b/y2020/y2020_roborio.json
@@ -2,13 +2,13 @@
   "channels":
   [
     {
-      "name": "/aos/roborio",
+      "name": "/roborio/aos",
       "type": "aos.JoystickState",
       "source_node": "roborio",
       "frequency": 75
     },
     {
-      "name": "/aos/roborio",
+      "name": "/roborio/aos",
       "type": "aos.RobotState",
       "source_node": "roborio",
       "frequency": 200,
@@ -30,11 +30,17 @@
           "priority": 2,
           "timestamp_logger": "LOCAL_LOGGER",
           "time_to_live": 10000000
+        },
+        {
+          "name": "pi4",
+          "priority": 2,
+          "timestamp_logger": "LOCAL_LOGGER",
+          "time_to_live": 10000000
         }
       ]
     },
     {
-      "name": "/aos/roborio",
+      "name": "/roborio/aos",
       "type": "aos.timing.Report",
       "source_node": "roborio",
       "frequency": 50,
@@ -42,33 +48,33 @@
       "max_size": 2048
     },
     {
-      "name": "/aos/roborio",
+      "name": "/roborio/aos",
       "type": "aos.logging.LogMessageFbs",
       "source_node": "roborio",
       "frequency": 400,
       "num_senders": 20
     },
     {
-      "name": "/aos/roborio",
+      "name": "/roborio/aos",
       "type": "aos.message_bridge.ServerStatistics",
       "source_node": "roborio",
       "frequency": 2,
       "num_senders": 2
     },
     {
-      "name": "/aos/roborio",
+      "name": "/roborio/aos",
       "type": "aos.message_bridge.ClientStatistics",
       "source_node": "roborio",
       "frequency": 10,
       "num_senders": 2
     },
     {
-      "name": "/aos/roborio",
+      "name": "/roborio/aos",
       "type": "aos.message_bridge.Timestamp",
       "source_node": "roborio",
       "frequency": 10,
       "num_senders": 2,
-      "max_size": 200,
+      "max_size": 300,
       "destination_nodes": [
         {
           "name": "pi1",
@@ -84,6 +90,11 @@
           "name": "pi3",
           "priority": 1,
           "time_to_live": 5000000
+        },
+        {
+          "name": "pi4",
+          "priority": 1,
+          "time_to_live": 5000000
         }
       ]
     },
@@ -215,13 +226,13 @@
       "frequency": 200
     },
     {
-      "name": "/aos/roborio",
+      "name": "/roborio/aos",
       "type": "frc971.PDPValues",
       "source_node": "roborio",
       "frequency": 50
     },
     {
-      "name": "/aos/roborio",
+      "name": "/roborio/aos",
       "type": "frc971.wpilib.PneumaticsToLog",
       "source_node": "roborio",
       "frequency": 50
@@ -238,11 +249,11 @@
   "maps": [
     {
       "match": {
-        "name": "/aos",
+        "name": "/aos*",
         "source_node": "roborio"
       },
       "rename": {
-        "name": "/aos/roborio"
+        "name": "/roborio/aos"
       }
     }
   ],
@@ -266,6 +277,9 @@
     },
     {
       "name": "pi3"
+    },
+    {
+      "name": "pi4"
     }
   ]
 }