copied everything over from 2012 and removed all of the actual robot code except the drivetrain stuff


git-svn-id: https://robotics.mvla.net/svn/frc971/2013/trunk/src@4078 f308d9b7-e957-4cde-b6ac-9a88185e7312
diff --git a/aos/atom_code/output/MotorOutput.h b/aos/atom_code/output/MotorOutput.h
new file mode 100644
index 0000000..925139a
--- /dev/null
+++ b/aos/atom_code/output/MotorOutput.h
@@ -0,0 +1,74 @@
+#ifndef AOS_ATOM_CODE_OUTPUT_MOTOR_OUTPUT_H_
+#define AOS_ATOM_CODE_OUTPUT_MOTOR_OUTPUT_H_
+
+#include <stdint.h>
+#include <string.h>
+#include <algorithm>
+#include <string>
+
+#include "aos/common/network/SendSocket.h"
+#include "aos/common/byteorder.h"
+#include "aos/common/type_traits.h"
+
+namespace aos {
+
+class MotorOutput {
+ public:
+  MotorOutput();
+  void Run();
+
+  // Constants for the first argument of AddMotor.
+  static const char VICTOR = 'v';
+  static const char TALON = 't';
+
+ protected:
+  // num is 1-indexed
+  int AddMotor(char type, uint8_t num, float value);
+  int AddSolenoid(uint8_t num, bool on);
+  int AddDSLine(uint8_t line, const char *data);
+  // loop_queuegroup is expected to be a control loop queue group.
+  // This function will fetch the latest goal and serve it.
+  template <class T>
+  int AddControlLoopGoal(T *loop_queuegroup);
+
+  virtual void RunIteration() = 0;
+
+ private:
+  SendSocket sock;
+};
+
+template <class T>
+int MotorOutput::AddControlLoopGoal(T *loop_queuegroup) {
+  typedef typename std::remove_reference<
+      decltype(*(loop_queuegroup->goal.MakeMessage().get()))>::type GoalType;
+  // TODO(aschuh): This assumes a static serialized message size.
+  const uint16_t size = GoalType::Size();
+  if (sock.hold_msg_len_ + 4 + 1 + size > sock.MAX_MSG) {
+    return -1;
+  }
+
+  const bool zero = !loop_queuegroup->goal.FetchLatest();
+
+  sock.hold_msg_[sock.hold_msg_len_ ++] = 'g';
+  const uint32_t hash = loop_queuegroup->hash();
+
+  // Place the loop hash at the front.
+  to_network(&hash, &sock.hold_msg_[sock.hold_msg_len_]);
+  sock.hold_msg_len_ += 4;
+
+  if (zero) {
+    GoalType zero_message;
+    zero_message.Zero();
+    zero_message.Serialize(&sock.hold_msg_[sock.hold_msg_len_]);
+    sock.hold_msg_len_ += size;
+    return -1;
+  } else {
+    loop_queuegroup->goal->Serialize(&sock.hold_msg_[sock.hold_msg_len_]);
+    sock.hold_msg_len_ += size;
+    return 0;
+  }
+}
+
+}  // namespace aos
+
+#endif