Added autogen code for queue_types.
diff --git a/aos/build/queues/compiler.rb b/aos/build/queues/compiler.rb
index ffee5d3..9c0270f 100644
--- a/aos/build/queues/compiler.rb
+++ b/aos/build/queues/compiler.rb
@@ -101,6 +101,7 @@
 	cpp_tree.add_cc_include((rel_path + ".h").inspect)
 	cpp_tree.add_cc_include("aos/common/byteorder.h".inspect)
 	cpp_tree.add_cc_include("aos/common/inttypes.h".inspect)
+	cpp_tree.add_cc_include("aos/common/queue_types.h".inspect)
 	cpp_tree.add_cc_using("::aos::to_network")
 	cpp_tree.add_cc_using("::aos::to_host")
 	cpp_tree.add_swig_header_include("aos/common/queue.h".inspect)
diff --git a/aos/build/queues/cpp_pretty_print/auto_gen.rb b/aos/build/queues/cpp_pretty_print/auto_gen.rb
index 633c7c0..515939c 100644
--- a/aos/build/queues/cpp_pretty_print/auto_gen.rb
+++ b/aos/build/queues/cpp_pretty_print/auto_gen.rb
@@ -18,6 +18,34 @@
 		@text = "TODO(#{owner}): #{text}"
 	end
 end
+class CPP::StaticVar
+	class ForwardDec
+		def initialize(func) ; @func = func ; end
+		def pp(state) ; @func.pp_forward_dec(state) ; end
+	end
+	attr_accessor :args, :static
+	def initialize(type_class, val_type, name, args = CPP::Args.new())
+		@type_class = type_class
+		@val_type = val_type
+		@name = name
+		@args = args
+		@static = true
+	end
+	def forward_dec() ; ForwardDec.new(self) ; end
+	def pp_forward_dec(state)
+    if (@static)
+      state.print("static ")
+		end
+		state.print("#{@val_type} #{@name}")
+	end
+	def pp(state)
+		state.print("#{@val_type} #{@type_class.chop_method_prefix}#{@name}(")
+		state.pp(@args)
+		state.print(")")
+	end
+	alias_method :pp_header_file, :pp_forward_dec
+	alias_method :pp_cc_file, :pp
+end
 class CPP::MemberFunc
 	class ForwardDec
 		def initialize(func) ; @func = func ; end
diff --git a/aos/build/queues/cpp_pretty_print/dep_file_pair.rb b/aos/build/queues/cpp_pretty_print/dep_file_pair.rb
index 571d9e0..ff6d2e7 100644
--- a/aos/build/queues/cpp_pretty_print/dep_file_pair.rb
+++ b/aos/build/queues/cpp_pretty_print/dep_file_pair.rb
@@ -391,6 +391,7 @@
 		end
 	end
 	class Struct < Type
+		attr_accessor :members
 		def add_member(member)
 			@members.push(member)
 			return member
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
diff --git a/aos/build/queues/output/q_struct.rb b/aos/build/queues/output/q_struct.rb
index 6ce1794..14ba385 100644
--- a/aos/build/queues/output/q_struct.rb
+++ b/aos/build/queues/output/q_struct.rb
@@ -1,4 +1,4 @@
-class Target::StructDec < Target::Node
+class Target::StructDec < Target::StructBase
 	attr_accessor :name,:loc,:parent, :extern
 	def initialize(name)
 		@name = name
@@ -7,6 +7,21 @@
 	def add_member(member)
 		@members << member
 	end
+	def add_TypeRegister(o_type, member_func)
+		type = cpp_tree.get(self)
+		if(@loc == o_type.loc) #use relative name
+			tName = type.name
+		else #use full name
+			tName = @loc.to_cpp_id(type.name)
+		end 
+		member_func.suite << "#{tName}::TypeGet()" 
+	end
+	def create_GetType(type_class, cpp_tree)
+		member_func = CPP::MemberFunc.new(type_class,"const ::aos::MessageType& ","GetType")
+		member_func.static = 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 create(cpp_tree)
 		return self if(@extern)
 		orig_namespace = namespace = cpp_tree.get(@loc)
@@ -20,16 +35,10 @@
 		@members.each do |elem|
 			type_class.add_member(elem.create_usage(cpp_tree))
 		end
+		create_DoGetType(type_class, cpp_tree)
+		create_GetType(type_class, cpp_tree)
 		return type_class
 	end
-	def size()
-		return @size if(@size)
-		@size = 0
-		@members.each do |elem|
-			@size += elem.size
-		end
-		return @size
-	end
 	def getPrintFormat()
 		return "{" + @members.collect { |elem| elem.toPrintFormat() }.join(", ") + "}"
 	end
@@ -97,5 +106,10 @@
 	def zeroCall(suite, parent = "")
 		@type.zeroCall(suite, parent + "#{@name}.")
 	end
-	
+	def simpleStr()
+		"#{@type.simpleStr()} #{@name}"
+	end
+	def getTypeID()
+		return @type.getTypeID()
+	end
 end