 163be139eb
			
		
	
	
		163be139eb
		
			
		
	
	
	
	
		
			
			* SubGhz: add protocol DataRAW (binarization of data quantized by the minimum correlated duration) * SubGhz: fix name history * SubGhz: add encoder Data_RAW protocol * SubGhz: decreasing the size of the LevelDuration structure * SubGhz: history, added check that there is free RAM * SubGhz: checking for free memory, support to pass without gap * SubGhz: add running average to average the result, auto cut noise at the end of a burst * SubGhz: support for repeating sequences * SubGhz: fix secplus_v2 decoder * SubGhz: bin_RAW fix add history * SubGhz: add debug * SubGhz: debug refactoring * FURI_LOG: add FURI_LOG_RAW_x formatted string output like printf * SubGhz: fix new FURI_LOG metod * FURI_LOG: fix unit test * SubGhz: add enable/disable BinRAW protocol decoding * SubGhz: fix PVS * SubGhz: forcibly turn off the speaker when exiting SubGhz * SubGhz: adaptive adjustment to the noise level Co-authored-by: Aleksandr Kutuzov <alleteam@gmail.com>
		
			
				
	
	
		
			120 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			120 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #include "log.h"
 | |
| #include "check.h"
 | |
| #include "mutex.h"
 | |
| #include <furi_hal.h>
 | |
| 
 | |
| #define FURI_LOG_LEVEL_DEFAULT FuriLogLevelInfo
 | |
| 
 | |
| typedef struct {
 | |
|     FuriLogLevel log_level;
 | |
|     FuriLogPuts puts;
 | |
|     FuriLogTimestamp timestamp;
 | |
|     FuriMutex* mutex;
 | |
| } FuriLogParams;
 | |
| 
 | |
| static FuriLogParams furi_log;
 | |
| 
 | |
| void furi_log_init() {
 | |
|     // Set default logging parameters
 | |
|     furi_log.log_level = FURI_LOG_LEVEL_DEFAULT;
 | |
|     furi_log.puts = furi_hal_console_puts;
 | |
|     furi_log.timestamp = furi_get_tick;
 | |
|     furi_log.mutex = furi_mutex_alloc(FuriMutexTypeNormal);
 | |
| }
 | |
| 
 | |
| void furi_log_print_format(FuriLogLevel level, const char* tag, const char* format, ...) {
 | |
|     if(level <= furi_log.log_level &&
 | |
|        furi_mutex_acquire(furi_log.mutex, FuriWaitForever) == FuriStatusOk) {
 | |
|         FuriString* string;
 | |
|         string = furi_string_alloc();
 | |
| 
 | |
|         const char* color = _FURI_LOG_CLR_RESET;
 | |
|         const char* log_letter = " ";
 | |
|         switch(level) {
 | |
|         case FuriLogLevelError:
 | |
|             color = _FURI_LOG_CLR_E;
 | |
|             log_letter = "E";
 | |
|             break;
 | |
|         case FuriLogLevelWarn:
 | |
|             color = _FURI_LOG_CLR_W;
 | |
|             log_letter = "W";
 | |
|             break;
 | |
|         case FuriLogLevelInfo:
 | |
|             color = _FURI_LOG_CLR_I;
 | |
|             log_letter = "I";
 | |
|             break;
 | |
|         case FuriLogLevelDebug:
 | |
|             color = _FURI_LOG_CLR_D;
 | |
|             log_letter = "D";
 | |
|             break;
 | |
|         case FuriLogLevelTrace:
 | |
|             color = _FURI_LOG_CLR_T;
 | |
|             log_letter = "T";
 | |
|             break;
 | |
|         default:
 | |
|             break;
 | |
|         }
 | |
| 
 | |
|         // Timestamp
 | |
|         furi_string_printf(
 | |
|             string,
 | |
|             "%lu %s[%s][%s] " _FURI_LOG_CLR_RESET,
 | |
|             furi_log.timestamp(),
 | |
|             color,
 | |
|             log_letter,
 | |
|             tag);
 | |
|         furi_log.puts(furi_string_get_cstr(string));
 | |
|         furi_string_reset(string);
 | |
| 
 | |
|         va_list args;
 | |
|         va_start(args, format);
 | |
|         furi_string_vprintf(string, format, args);
 | |
|         va_end(args);
 | |
| 
 | |
|         furi_log.puts(furi_string_get_cstr(string));
 | |
|         furi_string_free(string);
 | |
| 
 | |
|         furi_log.puts("\r\n");
 | |
| 
 | |
|         furi_mutex_release(furi_log.mutex);
 | |
|     }
 | |
| }
 | |
| 
 | |
| void furi_log_print_raw_format(FuriLogLevel level, const char* format, ...) {
 | |
|     if(level <= furi_log.log_level &&
 | |
|        furi_mutex_acquire(furi_log.mutex, FuriWaitForever) == FuriStatusOk) {
 | |
|         FuriString* string;
 | |
|         string = furi_string_alloc();
 | |
|         va_list args;
 | |
|         va_start(args, format);
 | |
|         furi_string_vprintf(string, format, args);
 | |
|         va_end(args);
 | |
| 
 | |
|         furi_log.puts(furi_string_get_cstr(string));
 | |
|         furi_string_free(string);
 | |
| 
 | |
|         furi_mutex_release(furi_log.mutex);
 | |
|     }
 | |
| }
 | |
| 
 | |
| void furi_log_set_level(FuriLogLevel level) {
 | |
|     if(level == FuriLogLevelDefault) {
 | |
|         level = FURI_LOG_LEVEL_DEFAULT;
 | |
|     }
 | |
|     furi_log.log_level = level;
 | |
| }
 | |
| 
 | |
| FuriLogLevel furi_log_get_level(void) {
 | |
|     return furi_log.log_level;
 | |
| }
 | |
| 
 | |
| void furi_log_set_puts(FuriLogPuts puts) {
 | |
|     furi_assert(puts);
 | |
|     furi_log.puts = puts;
 | |
| }
 | |
| 
 | |
| void furi_log_set_timestamp(FuriLogTimestamp timestamp) {
 | |
|     furi_assert(timestamp);
 | |
|     furi_log.timestamp = timestamp;
 | |
| }
 |