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