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