Refactor typescript message handler

This makes it so that, to register a handler on a given topic, you just
need to call a single function, rather than assembling the entire
flatbuffer request message by yourself.

Change-Id: I540f475d9650ab27efe715a05d7586719045aeed
diff --git a/y2020/www/field_handler.ts b/y2020/www/field_handler.ts
index d3bafa2..b2daea1 100644
--- a/y2020/www/field_handler.ts
+++ b/y2020/www/field_handler.ts
@@ -59,37 +59,6 @@
 const ROBOT_WIDTH = 28 * IN_TO_M;
 const ROBOT_LENGTH = 30 * IN_TO_M;
 
-/**
- * All the messages that are required to display camera information on the field.
- * Messages not readable on the server node are ignored.
- */
-const REQUIRED_CHANNELS = [
-  {
-    name: '/pi1/camera',
-    type: 'frc971.vision.sift.ImageMatchResult',
-  },
-  {
-    name: '/pi2/camera',
-    type: 'frc971.vision.sift.ImageMatchResult',
-  },
-  {
-    name: '/pi3/camera',
-    type: 'frc971.vision.sift.ImageMatchResult',
-  },
-  {
-    name: '/pi4/camera',
-    type: 'frc971.vision.sift.ImageMatchResult',
-  },
-  {
-    name: '/pi5/camera',
-    type: 'frc971.vision.sift.ImageMatchResult',
-  },
-  {
-    name: '/drivetrain',
-    type: 'frc971.control_loops.drivetrain.Status',
-  },
-];
-
 export class FieldHandler {
   private canvas = document.createElement('canvas');
   private imageMatchResult: ImageMatchResult|null = null;
@@ -99,16 +68,15 @@
     document.body.appendChild(this.canvas);
 
     this.connection.addConfigHandler(() => {
-      this.sendConnect();
+      this.connection.addHandler(
+          '/camera', ImageMatchResult.getFullyQualifiedName(), (res) => {
+            this.handleImageMatchResult(res);
+          });
+      this.connection.addHandler(
+          '/drivetrain', DrivetrainStatus.getFullyQualifiedName(), (data) => {
+            this.handleDrivetrainStatus(data);
+          });
     });
-    this.connection.addHandler(
-        ImageMatchResult.getFullyQualifiedName(), (res) => {
-          this.handleImageMatchResult(res);
-        });
-    this.connection.addHandler(
-        DrivetrainStatus.getFullyQualifiedName(), (data) => {
-          this.handleDrivetrainStatus(data);
-        });
   }
 
   private handleImageMatchResult(data: Uint8Array): void {
@@ -123,32 +91,6 @@
         fbBuffer as unknown as flatbuffers.ByteBuffer);
   }
 
-  private sendConnect(): void {
-    const builder =
-        new flatbuffers_builder.Builder(512) as unknown as flatbuffers.Builder;
-    const channels: flatbuffers.Offset[] = [];
-    for (const channel of REQUIRED_CHANNELS) {
-      const nameFb = builder.createString(channel.name);
-      const typeFb = builder.createString(channel.type);
-      Channel.startChannel(builder);
-      Channel.addName(builder, nameFb);
-      Channel.addType(builder, typeFb);
-      const channelFb = Channel.endChannel(builder);
-      ChannelRequest.startChannelRequest(builder);
-      ChannelRequest.addChannel(builder, channelFb);
-      ChannelRequest.addMethod(builder, TransferMethod.SUBSAMPLE);
-      channels.push(ChannelRequest.endChannelRequest(builder));
-    }
-
-    const channelsFb =
-        SubscriberRequest.createChannelsToTransferVector(builder, channels);
-    SubscriberRequest.startSubscriberRequest(builder);
-    SubscriberRequest.addChannelsToTransfer(builder, channelsFb);
-    const connect = SubscriberRequest.endSubscriberRequest(builder);
-    builder.finish(connect);
-    this.connection.sendConnectMessage(builder);
-  }
-
   drawField(): void {
     const MY_COLOR = 'red';
     const OTHER_COLOR = 'blue';