Provide offline version of foxglove

This may be useful at events and in places with bad internet, and also
lets me pull in https://github.com/foxglove/studio/pull/5323 a few hours
early.

Change-Id: I584dda8fe7903a9a8d2876fa3a0ea318fa319180
Signed-off-by: James Kuszmaul <jabukuszmaul+collab@gmail.com>
diff --git a/frc971/analysis/BUILD b/frc971/analysis/BUILD
index b50e84e..c1ae252 100644
--- a/frc971/analysis/BUILD
+++ b/frc971/analysis/BUILD
@@ -187,3 +187,15 @@
         "//frc971/input:joystick_state_fbs",
     ],
 )
+
+cc_binary(
+    name = "local_foxglove",
+    srcs = ["local_foxglove.cc"],
+    data = ["@foxglove_studio"],
+    deps = [
+        "//aos:init",
+        "//aos/network:gen_embedded",
+        "//aos/seasocks:seasocks_logger",
+        "//third_party/seasocks",
+    ],
+)
diff --git a/frc971/analysis/local_foxglove.cc b/frc971/analysis/local_foxglove.cc
new file mode 100644
index 0000000..33e5a8b
--- /dev/null
+++ b/frc971/analysis/local_foxglove.cc
@@ -0,0 +1,18 @@
+#include "aos/init.h"
+#include "aos/seasocks/seasocks_logger.h"
+#include "glog/logging.h"
+#include "internal/Embedded.h"
+#include "seasocks/Server.h"
+
+DEFINE_string(data_path, "external/foxglove_studio",
+              "Path to foxglove studio files to serve.");
+DEFINE_uint32(port, 8000, "Port to serve files at.");
+
+int main(int argc, char *argv[]) {
+  aos::InitGoogle(&argc, &argv);
+  // Magic for seasocks.
+  findEmbeddedContent("");
+  ::seasocks::Server server(std::make_shared<aos::seasocks::SeasocksLogger>(
+      ::seasocks::Logger::Level::Info));
+  server.serve(FLAGS_data_path.c_str(), FLAGS_port);
+}