Merge "Add python code for the superstructure."
diff --git a/y2016/actors/BUILD b/y2016/actors/BUILD
index 1cda783..e3de5fb 100644
--- a/y2016/actors/BUILD
+++ b/y2016/actors/BUILD
@@ -6,6 +6,7 @@
   name = 'binaries',
   srcs = [
     ':drivetrain_action',
+    ':superstructure_action',
   ],
 )
 
@@ -54,3 +55,42 @@
     '//aos/linux_code:init',
   ],
 )
+
+queue_library(
+  name = 'superstructure_action_queue',
+  srcs = [
+    'superstructure_action.q',
+  ],
+  deps = [
+    '//aos/common/actions:action_queue',
+  ],
+)
+
+cc_library(
+  name = 'superstructure_action_lib',
+  srcs = [
+    'superstructure_actor.cc',
+  ],
+  hdrs = [
+    'superstructure_actor.h',
+  ],
+  deps = [
+    ':superstructure_action_queue',
+    '//aos/common/util:phased_loop',
+    '//aos/common/logging',
+    '//aos/common/actions:action_lib',
+    '//y2016/control_loops/superstructure:superstructure_queue',
+  ],
+)
+
+cc_binary(
+  name = 'superstructure_action',
+  srcs = [
+    'superstructure_actor_main.cc',
+  ],
+  deps = [
+    ':superstructure_action_lib',
+    ':superstructure_action_queue',
+    '//aos/linux_code:init',
+  ],
+)
diff --git a/y2016/actors/superstructure_action.q b/y2016/actors/superstructure_action.q
new file mode 100644
index 0000000..72bd310
--- /dev/null
+++ b/y2016/actors/superstructure_action.q
@@ -0,0 +1,22 @@
+package y2016.actors;
+
+import "aos/common/actions/actions.q";
+
+// Parameters to send with start.
+struct SuperstructureActionParams {
+  double value;
+};
+
+queue_group SuperstructureActionQueueGroup {
+  implements aos.common.actions.ActionQueueGroup;
+
+  message Goal {
+    uint32_t run;
+    SuperstructureActionParams params;
+  };
+
+  queue Goal goal;
+  queue aos.common.actions.Status status;
+};
+
+queue_group SuperstructureActionQueueGroup superstructure_action;
diff --git a/y2016/actors/superstructure_actor.cc b/y2016/actors/superstructure_actor.cc
new file mode 100644
index 0000000..b8ad33a
--- /dev/null
+++ b/y2016/actors/superstructure_actor.cc
@@ -0,0 +1,37 @@
+#include "y2016/actors/superstructure_actor.h"
+
+#include "aos/common/util/phased_loop.h"
+#include "aos/common/logging/logging.h"
+#include "y2016/actors/superstructure_actor.h"
+#include "y2016/control_loops/superstructure/superstructure.q.h"
+
+namespace y2016 {
+namespace actors {
+
+SuperstructureActor::SuperstructureActor(
+    actors::SuperstructureActionQueueGroup* s)
+    : aos::common::actions::ActorBase<actors::SuperstructureActionQueueGroup>(
+          s) {}
+
+bool SuperstructureActor::RunAction(
+    const actors::SuperstructureActionParams& params) {
+  LOG(INFO, "Starting superstructure action with value %f", params.value);
+
+  while (true) {
+    control_loops::superstructure_queue.status.FetchLatest();
+    ::aos::time::PhasedLoop phased_loop(::aos::time::Time::InMS(5),
+                                       ::aos::time::Time::InMS(5) / 2);
+    break;
+  }
+
+  return true;
+}
+
+::std::unique_ptr<SuperstructureAction> MakeSuperstructureAction(
+    const ::y2016::actors::SuperstructureActionParams& params) {
+  return ::std::unique_ptr<SuperstructureAction>(new SuperstructureAction(
+      &::y2016::actors::superstructure_action, params));
+}
+
+}  // namespace actors
+}  // namespace y2016
diff --git a/y2016/actors/superstructure_actor.h b/y2016/actors/superstructure_actor.h
new file mode 100644
index 0000000..b882585
--- /dev/null
+++ b/y2016/actors/superstructure_actor.h
@@ -0,0 +1,31 @@
+#ifndef Y2016_ACTORS_SUPERSTRUCTURE_ACTOR_H_
+#define Y2016_ACTORS_SUPERSTRUCTURE_ACTOR_H_
+
+#include <memory>
+
+#include "aos/common/actions/actor.h"
+#include "aos/common/actions/actions.h"
+#include "y2016/actors/superstructure_action.q.h"
+
+namespace y2016 {
+namespace actors {
+
+class SuperstructureActor
+    : public ::aos::common::actions::ActorBase<SuperstructureActionQueueGroup> {
+ public:
+  explicit SuperstructureActor(SuperstructureActionQueueGroup* s);
+
+  bool RunAction(const actors::SuperstructureActionParams& params) override;
+};
+
+using SuperstructureAction =
+    ::aos::common::actions::TypedAction<SuperstructureActionQueueGroup>;
+
+// Makes a new SuperstructureActor action.
+::std::unique_ptr<SuperstructureAction> MakeSuperstructureAction(
+    const ::y2016::actors::SuperstructureActionParams& params);
+
+}  // namespace actors
+}  // namespace y2016
+
+#endif  // Y2016_ACTORS_SUPERSTRUCTURE_ACTOR_H_
diff --git a/y2016/actors/superstructure_actor_main.cc b/y2016/actors/superstructure_actor_main.cc
new file mode 100644
index 0000000..a6da2a2
--- /dev/null
+++ b/y2016/actors/superstructure_actor_main.cc
@@ -0,0 +1,18 @@
+#include <stdio.h>
+
+#include "aos/linux_code/init.h"
+#include "y2016/actors/superstructure_action.q.h"
+#include "y2016/actors/superstructure_actor.h"
+
+using ::aos::time::Time;
+
+int main(int /*argc*/, char* /*argv*/ []) {
+  ::aos::Init(-1);
+
+  ::y2016::actors::SuperstructureActor superstructure(
+      &::y2016::actors::superstructure_action);
+  superstructure.Run();
+
+  ::aos::Cleanup();
+  return 0;
+}