Print sendtime of messsages.

Change-Id: I42579bce6133a536df61da9355aed763a0b2e614
diff --git a/aos/build/queues/output/message_dec.rb b/aos/build/queues/output/message_dec.rb
index 20a0c9d..0f5694a 100644
--- a/aos/build/queues/output/message_dec.rb
+++ b/aos/build/queues/output/message_dec.rb
@@ -335,7 +335,7 @@
       args.push(["AOS_TIME_ARGS(static_cast<int32_t>(",
                  "::std::chrono::duration_cast<::std::chrono::seconds>(",
                  "#{parent}#{this_name}.time_since_epoch()).count()), ",
-                 "static_cast<int32_t>(::std::chrono::duration_cast<::std::chrono::nanoseconds>(",
+                 "static_cast<uint32_t>(::std::chrono::duration_cast<::std::chrono::nanoseconds>(",
                  "#{parent}#{this_name}.time_since_epoch() - ",
                  "::std::chrono::duration_cast<::std::chrono::seconds>(",
                  "#{parent}#{this_name}.time_since_epoch())).count()))"].join(''))
diff --git a/aos/build/queues/print_field.rb b/aos/build/queues/print_field.rb
index 0e27bf0..65837ee 100644
--- a/aos/build/queues/print_field.rb
+++ b/aos/build/queues/print_field.rb
@@ -1,7 +1,8 @@
 require_relative 'load.rb'
 
 # TODO(brians): Special-case Time too and float/double if we can find a good way to do it.
-GenericTypeNames = ['float', 'double', 'char', '::aos::monotonic_clock::time_point']
+GenericTypeNames = ['float', 'double', 'char']
+TimeTypeNames = ['::aos::monotonic_clock::time_point']
 IntegerSizes = [8, 16, 32, 64]
 
 WriteIffChanged.open(ARGV[0]) do |output|
@@ -47,6 +48,32 @@
       }
 END2
 end.join('')}
+#{TimeTypeNames.collect do |name|
+  message_element = Target::MessageElement.new(name, 'value')
+  statement = MessageElementStmt.new(name, 'value')
+  message_element.size = statement.size
+  print_args = []
+  message_element.fetchPrintArgs(print_args)
+  next <<END2
+    case #{message_element.getTypeID()}:
+      {
+        if (*input_bytes < #{statement.size}) return false;
+        *input_bytes -= #{statement.size};
+        int32_t upper;
+        uint32_t lower;
+        to_host(static_cast<const char *>(input), &upper);
+        to_host(static_cast<const char *>(input) + 4, &lower);
+        #{name} value(::std::chrono::seconds(upper) + ::std::chrono::nanoseconds(lower));
+        int ret = snprintf(output, *output_bytes,
+                           "#{statement.toPrintFormat()}",
+                           #{print_args[0]});
+        if (ret < 0) return false;
+        if (static_cast<unsigned int>(ret) >= *output_bytes) return false;
+        *output_bytes -= ret;
+        return true;
+      }
+END2
+end.join('')}
 #{IntegerSizes.collect do |size|
   [true, false].collect do |signed|
     size_bytes = size / 8