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/build/act_builder.rb b/aos/build/act_builder.rb
new file mode 100644
index 0000000..d98549c
--- /dev/null
+++ b/aos/build/act_builder.rb
@@ -0,0 +1,242 @@
+require File.dirname(__FILE__) + "/parser.rb"
+
+module Contents
+	class HasEntry < SimpleField
+	end
+	class Priority < SimpleField
+		def initialize
+			super :is_number
+		end
+	end
+
+	class OutputFile
+		def fillin_initials
+			@args_struct = nil	# string
+			@status_struct = nil 	# string
+			@action_name = nil	# string
+			@actions = []
+			@has = []
+		end
+		def fillin_defaults
+			@action_name = @base unless @action_name
+			@actions.push @action_name if @actions.empty?
+			@args_struct.add_hidden_field 'timespec', 'set_time'
+			@status_struct.add_hidden_field 'timespec', 'set_time'
+		end
+		def parse_token token, tokenizer
+			case token
+			when 'args'
+				throw :syntax_error, '"args" redefined' if @args_struct
+				@args_struct = Struct.parse tokenizer
+			when 'status'
+				throw :syntax_error, '"status" redefined' if @status_struct
+				@status_struct = Struct.parse tokenizer
+			when 'action_name'
+				throw :syntax_error, '"action_name" redefined' if @action_name
+				@action_name = NameField.parse tokenizer
+			when 'async_queue'
+				@actions.push(NameField.parse tokenizer)
+			when 'has'
+				@has.push(HasEntry.parse tokenizer)
+			when 'priority'
+				throw :syntax_error, '"priority" redefined' if @priority
+				@priority = Priority.parse tokenizer
+			else
+				throw :syntax_error, "unsupported field \"#{token}\""
+			end
+		end
+		def check_format tokenizer
+			tokenizer.item_missing("args") unless @args_struct
+			tokenizer.item_missing("status") unless @status_struct
+			tokenizer.item_missing("priority") unless @priority
+		end
+
+		def superclass
+			"aos::AsyncAction<#{@args_struct.name}, #{@status_struct.name}>"
+		end
+		def impl_class
+			@action_name + '_t'
+		end
+		def handle_class
+			@action_name + 'Handle'
+		end
+		def write_header
+			f = File.open(filename('h'), "w+")
+			f.puts <<END
+#ifndef AOS_GENERATED_ASYNC_ACTION_#{impl_class}_H_
+#define AOS_GENERATED_ASYNC_ACTION_#{impl_class}_H_
+// This file is autogenerated.
+// Edit #{@filename} to change its contents.
+
+#include "aos/common/messages/QueueHolder.h"
+#include "aos/atom_code/async_action/AsyncAction.h"
+#include "aos/atom_code/async_action/AsyncActionHandle.h"
+
+namespace #{$namespace} {
+#{@args_struct.writer}
+#{@status_struct.writer}
+	class #{impl_class} : public #{superclass} {
+		virtual void DoAction(#{@args_struct.name} &args __attribute__((unused))){
+			DoAction(#{@args_struct.params_from 'args'});
+		}
+		void DoAction(#{@args_struct.params});
+#{@has.grep('OnStart').empty? ? '' : "virtual void OnStart();"}
+#{@has.grep('OnEnd').empty? ? '' : "virtual void OnEnd();"}
+		using #{superclass}::PostStatus;
+		inline void PostStatus(#{@status_struct.params}){
+			#{@status_struct.copy_params_into 'new_stat'}
+			PostStatus(new_stat);
+		}
+		public:
+		#{impl_class}(const std::string name) : #{superclass}(name) {}
+#ifdef AOS_#{impl_class}_HEADER_FRAG
+		AOS_#{impl_class}_HEADER_FRAG
+#endif
+	};
+
+	class #{handle_class} : public aos::AsyncActionHandle {
+		friend class ::AsyncActionTest;
+		private:
+			const std::string name;
+			#{superclass} *instance;
+			#{superclass} &GetInstance(){
+				if(instance == NULL){
+					instance = new #{superclass}(name);
+				}
+				return *instance;
+			}
+			#{@status_struct.name} temp_status;
+			void Free(){
+				if(instance != NULL){
+					delete instance;
+					instance = NULL;
+				}
+			}
+		public:
+			inline uint16_t Start(#{@args_struct.name} &args){
+				return GetInstance().Start(args);
+			}
+			inline uint16_t Start(#{@args_struct.params}){
+				#{@args_struct.copy_params_into 'args_struct'}
+				return Start(args_struct);
+			}
+			inline void Execute(#{@args_struct.name} &args){
+				GetInstance().Join(GetInstance().Start(args));
+			}
+			inline bool Execute(#{@args_struct.params}){
+				#{@args_struct.copy_params_into 'args_struct'}
+				Execute(args_struct);
+				return GetStatus();
+			}
+			inline bool IsDone(){
+				return GetInstance().IsDone();
+			}
+			inline bool IsDone(int32_t count){
+				return GetInstance().IsDone(count);
+			}
+			inline uint16_t Join(){
+				return GetInstance().Join();
+			}
+			inline uint16_t Join(int32_t count){
+				return GetInstance().Join(count);
+			}
+			inline bool GetStatus(#{@status_struct.name} &status_out) __attribute__ ((warn_unused_result)){
+				return GetInstance().GetStatus(status_out);
+			}
+			inline bool GetStatus(#{@status_struct.name} &status_out, int32_t count) __attribute__ ((warn_unused_result)){
+				return GetInstance().GetStatus(status_out, count);
+			}
+			inline bool GetStatus() __attribute__ ((warn_unused_result)){
+				return GetInstance().GetStatus(temp_status);
+			}
+			inline bool GetStatus(int32_t count) __attribute__ ((warn_unused_result)){
+				return GetInstance().GetStatus(temp_status, count);
+			}
+			inline bool GetNextStatus(#{@status_struct.name} &status_out) __attribute__ ((warn_unused_result)){
+				return GetInstance().GetNextStatus(status_out);
+			}
+			inline bool GetNextStatus(#{@status_struct.name} &status_out, int32_t count) __attribute__ ((warn_unused_result)){
+				return GetInstance().GetNextStatus(status_out, count);
+			}
+			inline bool GetNextStatus() __attribute__ ((warn_unused_result)){
+				return GetInstance().GetNextStatus(temp_status);
+			}
+			inline bool GetNextStatus(int32_t count) __attribute__ ((warn_unused_result)){
+				return GetInstance().GetNextStatus(temp_status, count);
+			}
+			inline const #{@status_struct.name} &GetLastStatus(){
+				return temp_status;
+			}
+			inline void Stop(){
+				GetInstance().Stop();
+			}
+			inline void Stop(int32_t count){
+				GetInstance().Stop(count);
+			}
+
+			#{handle_class}(const std::string name) : name(name), instance(NULL) {}
+	};
+#{(@actions.collect do |a|
+<<END2
+	extern #{handle_class} #{a};
+END2
+end).join('')}
+
+} // namespace #{$namespace}
+
+#endif
+END
+			f.close
+		end
+		def write_cpp
+			f = File.open(filename('cc'), "w+")
+f.puts <<END
+// This file is autogenerated.
+// Edit #{@filename} to change its contents.
+
+#include "#{filename 'h'}"
+
+namespace #{$namespace} {
+
+#{(@actions.collect do |a|
+<<END2
+#{handle_class} #{a}("#{a}");
+END2
+end).join("\n")}
+
+} // namespace #{$namespace}
+END
+			f.close
+		end
+		def write_main
+			f = File.open(filename('main'), "w+")
+f.puts <<END
+// This file is autogenerated.
+// Edit #{@filename} to change its contents.
+
+#include "#{filename 'h'}"
+#include "aos/atom_code/async_action/AsyncActionRunner.h"
+#include <string>
+#include <cstring>
+#include <iostream>
+
+int main(int argc, char **argv) {
+	aos::Init();
+
+	std::string name = "#{@action_name}";
+	if(argc > 1)
+		name = std::string(argv[1]);
+	#{$namespace}::#{impl_class} action(name);
+	int rv = aos::AsyncActionRunner::Run(action, #{@priority});
+
+	aos::Cleanup();
+	return rv;
+}
+END
+			f.close
+		end
+	end
+end
+
+write_file_out
+