Added autogen code for queue_types.
diff --git a/aos/build/queues/output/message_dec.rb b/aos/build/queues/output/message_dec.rb
index 579ce0c..92e32e5 100644
--- a/aos/build/queues/output/message_dec.rb
+++ b/aos/build/queues/output/message_dec.rb
@@ -4,7 +4,50 @@
   require "digest/sha1"
 end
 
-class Target::MessageDec < Target::Node
+class Target::StructBase < Target::Node
+	def create_DoGetType(type_class, cpp_tree)
+		member_func = CPP::MemberFunc.new(type_class,"const ::aos::MessageType* ","DoGetType")
+		member_func.static = true
+#		member_func.const = true
+		fields = []
+		@members.each do |member|
+			tId = member.getTypeID()
+			fieldName = member.name.inspect
+			if(member.respond_to?(:add_TypeRegister))
+				member.add_TypeRegister(type_class, member_func)
+			end
+			fields << "new ::aos::MessageType::Field{#{tId}, #{fieldName}}"
+		end
+		id = getTypeID()
+		member_func.suite << ("static const ::aos::MessageType kMsgMessageType(#{id}, #{@name.inspect}, {" +
+		  "#{fields.join(", ")}})");
+		type_class.add_member(member_func)
+#		val = CPP::StaticVar.new(type_class, "const int", "asdf")
+#		val.args << 0
+#		type_class.add_member(val)
+		member_func.suite << "::type_cache::Add(&kMsgMessageType)"
+		member_func.suite << CPP::Return.new("&kMsgMessageType")
+	end
+	def simpleStr()
+		return "{\n" + @members.collect() { |elem| elem.simpleStr() + "\n"}.join("") + "}"
+	end
+	def getTypeID()
+		return "0x" + (((Digest::SHA1.hexdigest(simpleStr())[0..3].to_i(16)) << 16) + size).to_s(16)
+	end
+	def add_member(member)
+		@members << member
+	end
+	def size()
+		return @size if(@size)
+		@size = 0
+		@members.each do |elem|
+			@size += elem.size
+		end
+		return @size
+	end
+end
+
+class Target::MessageDec < Target::StructBase
 	attr_accessor :name,:loc,:parent,:msg_hash
 	def initialize(name)
 		@name = name
@@ -20,9 +63,6 @@
 			return "#{@name}"
 		end
 	end
-	def add_member(member)
-		@members << member
-	end
 	def create_Print(type_class,cpp_tree)
 		member_func = CPP::MemberFunc.new(type_class,"size_t","Print")
 		type_class.add_member(member_func)
@@ -91,6 +131,12 @@
 		member_func.suite << CPP::Return.new(CPP::Add.new(size,
 							"::aos::Message::Size()"))
 	end
+	def create_GetType(type_class, cpp_tree)
+		member_func = CPP::MemberFunc.new(type_class,"const ::aos::MessageType& ","GetType")
+		member_func.const = true
+		member_func.suite << "static ::aos::Once<const ::aos::MessageType> getter(#{type_class.name}::DoGetType)"
+		member_func.suite << CPP::Return.new("*getter.Get()")
+	end
 	def self.builder_loc(loc)
 		return @builder_loc if(@builder_loc)
 		return @builder_loc = loc.root.get_make("aos")
@@ -116,9 +162,7 @@
 		end
 		cpp_tree.set(self,type_class)
 		type_class.set_parent("public ::aos::Message")
-		ts = (@members.collect { |elem|
-			elem.type + " " + elem.name
-		}).join(";")
+		ts = self.simpleStr()
 		self.msg_hash = "0x#{Digest::SHA1.hexdigest(ts)[-8..-1]}"
 		type_class.add_member("enum {kQueueLength = 1234, kHash = #{self.msg_hash}}")
 		@members.each do |elem|
@@ -130,6 +174,8 @@
 		create_Zero(type_class,cpp_tree)
 		create_Size(type_class,cpp_tree)
 		create_Print(type_class,cpp_tree)
+		create_GetType(type_class, cpp_tree)
+		create_DoGetType(type_class, cpp_tree)
 
 		b_namespace = cpp_tree.get(b_loc = self.class.builder_loc(@loc))
 
@@ -231,6 +277,12 @@
 									 "&#{parent}#{@name}")
 		f_call.args.dont_wrap = true
 	end
+	def getTypeID()
+		Digest::SHA1.hexdigest(@type)[0..7].to_i(16) & 0x4000 #ensures is primative
+	end
+	def simpleStr()
+		"#{@type} #{@name}"
+	end
 	def set_message_builder(suite)
 		suite << "msg_ptr_->#{@name} = #{@name}"
 	end