filelogger.c 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. #include "filelogger.h"
  2. #include <core/check.h>
  3. #include <core/mutex.h>
  4. #include <furi_hal.h>
  5. #include <storage/storage.h>
  6. #define FURI_LOG_LEVEL_DEFAULT FuriLogLevelInfo
  7. typedef struct {
  8. FuriLogLevel log_level;
  9. FuriLogPuts puts;
  10. FuriLogTimestamp timestamp;
  11. FuriMutex* mutex;
  12. File *logFile;
  13. Storage *storage;
  14. } FuriLogParams;
  15. static FuriLogParams furi_log;
  16. void writeToLog(const char *msg) {
  17. furi_hal_console_puts(msg);
  18. // Storage *s = furi_record_open(RECORD_STORAGE);
  19. // File *f = storage_file_alloc(s);
  20. // storage_file_open(f, "/any/log.txt", FSAM_READ_WRITE, FSOM_OPEN_APPEND);
  21. storage_file_write(furi_log.logFile, msg, strlen(msg));
  22. // storage_file_close(f);
  23. // storage_file_free(f);
  24. // furi_record_close(RECORD_STORAGE);
  25. }
  26. void file_log_init() {
  27. // Set default logging parameters
  28. furi_log.log_level = FURI_LOG_LEVEL_DEFAULT;
  29. furi_log.puts = writeToLog;
  30. furi_log.timestamp = furi_get_tick;
  31. furi_log.mutex = furi_mutex_alloc(FuriMutexTypeNormal);
  32. furi_log.storage = furi_record_open(RECORD_STORAGE);
  33. furi_log.logFile = storage_file_alloc(furi_log.storage);
  34. storage_file_open(furi_log.logFile, "/any/log.txt", FSAM_READ_WRITE, FSOM_OPEN_APPEND);
  35. }
  36. void file_log_deinit() {
  37. storage_file_close(furi_log.logFile);
  38. storage_file_free(furi_log.logFile);
  39. furi_record_close(RECORD_STORAGE);
  40. furi_mutex_free(furi_log.mutex);
  41. }
  42. void file_log_print_format(FuriLogLevel level, const char* tag, const char* format, ...) {
  43. if(level <= furi_log_get_level() &&
  44. furi_mutex_acquire(furi_log.mutex, FuriWaitForever) == FuriStatusOk) {
  45. FuriString* string;
  46. string = furi_string_alloc();
  47. const char* log_letter = " ";
  48. switch(level) {
  49. case FuriLogLevelError:
  50. log_letter = "E";
  51. break;
  52. case FuriLogLevelWarn:
  53. log_letter = "W";
  54. break;
  55. case FuriLogLevelInfo:
  56. log_letter = "I";
  57. break;
  58. case FuriLogLevelDebug:
  59. log_letter = "D";
  60. break;
  61. case FuriLogLevelTrace:
  62. log_letter = "T";
  63. break;
  64. default:
  65. break;
  66. }
  67. // Timestamp
  68. furi_string_printf(
  69. string,
  70. "%lu [%s][%s] ",
  71. furi_log.timestamp(),
  72. log_letter,
  73. tag);
  74. furi_log.puts(furi_string_get_cstr(string));
  75. furi_string_reset(string);
  76. va_list args;
  77. va_start(args, format);
  78. furi_string_vprintf(string, format, args);
  79. va_end(args);
  80. furi_log.puts(furi_string_get_cstr(string));
  81. furi_string_free(string);
  82. furi_log.puts("\r\n");
  83. furi_mutex_release(furi_log.mutex);
  84. }
  85. }
  86. void file_log_set_timestamp(FuriLogTimestamp timestamp) {
  87. furi_assert(timestamp);
  88. furi_log.timestamp = timestamp;
  89. }