2424#include "memfault/core/platform/overrides.h"
2525#include "memfault/util/circular_buffer.h"
2626#include "memfault/util/crc16_ccitt.h"
27+ #include "memfault/core/compact_log_serializer.h"
2728
2829#include "memfault/config.h"
2930
@@ -93,12 +94,6 @@ bool memfault_log_get_regions(sMemfaultLogRegions *regions) {
9394 return true;
9495}
9596
96- typedef enum {
97- kMemfaultLogRecordType_Preformatted = 0 ,
98-
99- kMemfaultLogRecordType_NumTypes ,
100- } eMemfaultLogRecordType ;
101-
10297static uint8_t prv_build_header (eMemfaultPlatformLogLevel level , eMemfaultLogRecordType type ) {
10398 MEMFAULT_STATIC_ASSERT (kMemfaultPlatformLogLevel_NumLevels <= 8 ,
10499 "Number of log levels exceed max number that log module can track" );
@@ -223,6 +218,7 @@ static bool prv_read_log_iter_callback(sMfltLogIterator *iter) {
223218
224219 ctx -> log -> msg [iter -> entry .len ] = '\0' ;
225220 ctx -> log -> level = memfault_log_get_level_from_hdr (iter -> entry .hdr );
221+ ctx -> log -> type = memfault_log_get_type_from_hdr (iter -> entry .hdr );
226222 ctx -> log -> msg_len = iter -> entry .len ;
227223 ctx -> has_log = true;
228224 return false;
@@ -234,6 +230,7 @@ static bool prv_read_log(sMemfaultLog *log) {
234230 const int rv = snprintf (log -> msg , sizeof (log -> msg ), "... %d messages dropped ..." ,
235231 (int )s_memfault_ram_logger .dropped_msg_count );
236232 log -> msg_len = (rv <= 0 ) ? 0 : MEMFAULT_MIN ((uint32_t )rv , sizeof (log -> msg ) - 1 );
233+ log -> type = kMemfaultLogRecordType_Preformatted ;
237234 s_memfault_ram_logger .dropped_msg_count = 0 ;
238235 return true;
239236 }
@@ -300,6 +297,7 @@ void memfault_vlog_save(eMemfaultPlatformLogLevel level, const char *fmt, va_lis
300297 if (bytes_written >= available_space ) {
301298 bytes_written = available_space - 1 ;
302299 }
300+
303301 memfault_log_save_preformatted (level , log_buf , bytes_written );
304302}
305303
@@ -310,8 +308,10 @@ void memfault_log_save(eMemfaultPlatformLogLevel level, const char *fmt, ...) {
310308 va_end (args );
311309}
312310
313- void memfault_log_save_preformatted (eMemfaultPlatformLogLevel level ,
314- const char * log , size_t log_len ) {
311+ static void prv_log_save (eMemfaultPlatformLogLevel level ,
312+ const void * log , size_t log_len ,
313+ eMemfaultLogRecordType log_type ) {
314+
315315 if (!prv_should_log (level )) {
316316 return ;
317317 }
@@ -326,7 +326,7 @@ void memfault_log_save_preformatted(eMemfaultPlatformLogLevel level,
326326 if (space_free ) {
327327 sMfltRamLogEntry entry = {
328328 .len = (uint8_t )truncated_log_len ,
329- .hdr = prv_build_header (level , kMemfaultLogRecordType_Preformatted ),
329+ .hdr = prv_build_header (level , log_type ),
330330 };
331331 memfault_circular_buffer_write (circ_bufp , & entry , sizeof (entry ));
332332 memfault_circular_buffer_write (circ_bufp , log , truncated_log_len );
@@ -340,6 +340,41 @@ void memfault_log_save_preformatted(eMemfaultPlatformLogLevel level,
340340 }
341341}
342342
343+ #if MEMFAULT_COMPACT_LOG_ENABLE
344+
345+ static void prv_fill_compact_log_cb (void * ctx , uint32_t offset , const void * buf , size_t buf_len ) {
346+ uint8_t * log = (uint8_t * )ctx ;
347+ memcpy (& log [offset ], buf , buf_len );
348+ }
349+
350+ void memfault_compact_log_save (eMemfaultPlatformLogLevel level , uint32_t log_id ,
351+ uint32_t compressed_fmt , ...) {
352+ char log_buf [MEMFAULT_LOG_MAX_LINE_SAVE_LEN + 1 ];
353+
354+ sMemfaultCborEncoder encoder ;
355+ memfault_cbor_encoder_init (& encoder , prv_fill_compact_log_cb , log_buf , sizeof (log_buf ));
356+
357+ va_list args ;
358+ va_start (args , compressed_fmt );
359+ bool success = memfault_vlog_compact_serialize (& encoder , log_id , compressed_fmt , args );
360+ va_end (args );
361+
362+ if (!success ) {
363+ return ;
364+ }
365+
366+ const size_t bytes_written = memfault_cbor_encoder_deinit (& encoder );
367+ prv_log_save (level , log_buf , bytes_written , kMemfaultLogRecordType_Compact );
368+ }
369+
370+ #endif /* MEMFAULT_COMPACT_LOG_ENABLE */
371+
372+
373+ void memfault_log_save_preformatted (eMemfaultPlatformLogLevel level ,
374+ const char * log , size_t log_len ) {
375+ prv_log_save (level , log , log_len , kMemfaultLogRecordType_Preformatted );
376+ }
377+
343378bool memfault_log_boot (void * storage_buffer , size_t buffer_len ) {
344379 if (storage_buffer == NULL || buffer_len == 0 || s_memfault_ram_logger .enabled ) {
345380 return false;
0 commit comments