@@ -100,31 +100,48 @@ __attribute__((no_sanitize_undefined))
100100 #endif
101101 #endif
102102static bool
103- prv_copy_msg_callback (sMfltLogIterator * iter , MEMFAULT_UNUSED size_t offset , const char * buf ,
104- size_t buf_len ) {
103+ prv_serialize_msg_callback (sMfltLogIterator * iter , MEMFAULT_UNUSED size_t offset , const char * buf ,
104+ size_t buf_len ) {
105105 sMfltLogEncodingCtx * const ctx = (sMfltLogEncodingCtx * )iter -> user_ctx ;
106- return memfault_cbor_join (& ctx -> encoder , buf , buf_len );
107- }
108106
109- static bool prv_encode_current_log (sMemfaultCborEncoder * encoder , sMfltLogIterator * iter ) {
110- if (!memfault_cbor_encode_unsigned_integer (encoder ,
107+ #if MEMFAULT_LOG_TIMESTAMPS_ENABLE
108+ // Encode the timestamp value, if it's present, otherwise insert a 0
109+ uint32_t timestamp ;
110+ if (memfault_log_hdr_is_timestamped (iter -> entry .hdr )) {
111+ if (buf_len < sizeof (timestamp )) {
112+ return false;
113+ }
114+ memcpy (& timestamp , buf , sizeof (timestamp ));
115+ buf += sizeof (timestamp );
116+ buf_len -= sizeof (timestamp );
117+ } else {
118+ timestamp = 0 ;
119+ }
120+
121+ if (!memfault_cbor_encode_unsigned_integer (& ctx -> encoder , timestamp )) {
122+ return false;
123+ }
124+ #endif
125+
126+ // Encode the log level
127+ if (!memfault_cbor_encode_unsigned_integer (& ctx -> encoder ,
111128 memfault_log_get_level_from_hdr (iter -> entry .hdr ))) {
112129 return false;
113130 }
114131
115132 eMemfaultLogRecordType type = memfault_log_get_type_from_hdr (iter -> entry .hdr );
116- bool success ;
117133
118134 // Note: We encode "preformatted" logs (i.e logs that have run through printf) as cbor text
119135 // string and "compact" logs as a cbor byte array so we can differentiate between the two while
120136 // decoding
121137 if (type == kMemfaultLogRecordType_Preformatted ) {
122- success = memfault_cbor_encode_string_begin (encoder , iter -> entry .len );
138+ // The message is not null-terminated, so we can't use
139+ // memfault_cbor_encode_string() directly.
140+ bool success = memfault_cbor_encode_string_begin (& ctx -> encoder , buf_len );
141+ return success && memfault_cbor_join (& ctx -> encoder , buf , buf_len );
123142 } else { // kMemfaultLogRecordType_Compact
124- success = memfault_cbor_encode_byte_string_begin ( encoder , iter -> entry . len );
143+ return memfault_cbor_encode_byte_string ( & ctx -> encoder , buf , buf_len );
125144 }
126-
127- return (success && memfault_log_iter_copy_msg (iter , prv_copy_msg_callback ));
128145}
129146
130147static bool prv_log_iterate_encode_callback (sMfltLogIterator * iter ) {
@@ -133,7 +150,7 @@ static bool prv_log_iterate_encode_callback(sMfltLogIterator *iter) {
133150 return false;
134151 }
135152 if (!prv_log_is_sent (iter -> entry .hdr )) {
136- ctx -> has_encoding_error |= !prv_encode_current_log ( & ctx -> encoder , iter );
153+ ctx -> has_encoding_error |= !memfault_log_iter_copy_msg ( iter , prv_serialize_msg_callback );
137154 // It's possible more logs have been added to the buffer
138155 // after the memfault_log_data_source_has_been_triggered() call. They cannot be included,
139156 // because the total message size has already been communicated to the packetizer.
@@ -146,16 +163,24 @@ static bool prv_log_iterate_encode_callback(sMfltLogIterator *iter) {
146163
147164static bool prv_encode (sMemfaultCborEncoder * encoder , void * iter ) {
148165 sMfltLogEncodingCtx * ctx = (sMfltLogEncodingCtx * )((sMfltLogIterator * )iter )-> user_ctx ;
149- if (!memfault_serializer_helper_encode_metadata_with_time (encoder , kMemfaultEventType_Logs ,
166+ #if MEMFAULT_LOG_TIMESTAMPS_ENABLE
167+ eMemfaultEventType event_type = kMemfaultEventType_LogsTimestamped ;
168+ // To save space, all logs are encoded into a single array (as opposed to using a map or
169+ // array per log):
170+ const size_t elements_per_log = 3 ; // timestamp, lvl, msg
171+ #else
172+ eMemfaultEventType event_type = kMemfaultEventType_Logs ;
173+ const size_t elements_per_log = 2 ; // lvl, msg
174+ #endif
175+
176+ if (!memfault_serializer_helper_encode_metadata_with_time (encoder , event_type ,
150177 & ctx -> trigger_time )) {
151178 return false;
152179 }
153180 if (!memfault_cbor_encode_unsigned_integer (encoder , kMemfaultEventKey_EventInfo )) {
154181 return false;
155182 }
156- // To save space, all logs are encoded into a single array (as opposed to using a map or
157- // array per log):
158- const size_t elements_per_log = 2 ; // hdr, msg
183+
159184 if (!memfault_cbor_encode_array_begin (encoder , elements_per_log * ctx -> num_logs )) {
160185 return false;
161186 }
0 commit comments