luat_log_win32.c 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. #include "luat_base.h"
  2. #include "luat_log.h"
  3. #include "luat_uart.h"
  4. #include "luat_malloc.h"
  5. #include "printf.h"
  6. #include <stdio.h>
  7. #include "FreeRTOS.h"
  8. #include "queue.h"
  9. #include "task.h"
  10. typedef struct log_msg {
  11. char* buff;
  12. }log_msg_t;
  13. static QueueHandle_t xQueue = NULL;
  14. static uint8_t luat_log_uart_port = 0;
  15. static uint8_t luat_log_level_cur = LUAT_LOG_DEBUG;
  16. void luat_log_thread_task(void* args) {
  17. log_msg_t msg = {0};
  18. while (1) {
  19. if (pdTRUE == xQueueReceive(xQueue, &msg, -1)) {
  20. printf("%s", msg.buff);
  21. luat_heap_free(msg.buff);
  22. };
  23. }
  24. }
  25. void luat_log_init_win32(void) {
  26. xQueue = xQueueCreate(1024, sizeof(void*));
  27. xTaskCreate( luat_log_thread_task, "log", 1024*2, NULL, 23, NULL );
  28. }
  29. void luat_log_set_uart_port(int port) {
  30. luat_log_uart_port = port;
  31. }
  32. void luat_print(const char* _str) {
  33. luat_nprint((char*)_str, strlen(_str));
  34. }
  35. void luat_nprint(char *s, size_t l) {
  36. //luat_uart_write(luat_log_uart_port, s, l);
  37. #if LUAT_USE_LOG_ASYNC_THREAD
  38. char* buff = luat_heap_malloc(l + 1);
  39. if (buff == NULL)
  40. return;
  41. memcpy(buff, s, l);
  42. buff[l] = 0x00;
  43. log_msg_t msg = {
  44. .buff = buff
  45. };
  46. xQueueSendFromISR(xQueue, &msg, NULL);
  47. #else
  48. printf("%s", s);
  49. #endif
  50. }
  51. void luat_log_set_level(int level) {
  52. luat_log_level_cur = level;
  53. }
  54. int luat_log_get_level() {
  55. return luat_log_level_cur;
  56. }
  57. #define LOGLOG_SIZE 1024
  58. void luat_log_log(int level, const char* tag, const char* _fmt, ...) {
  59. if (luat_log_level_cur > level) return;
  60. char buff[LOGLOG_SIZE] = {0};
  61. char *tmp = (char *)buff;
  62. switch (level)
  63. {
  64. case LUAT_LOG_DEBUG:
  65. buff[0] = 'D';
  66. break;
  67. case LUAT_LOG_INFO:
  68. buff[0] = 'I';
  69. break;
  70. case LUAT_LOG_WARN:
  71. buff[0] = 'W';
  72. break;
  73. case LUAT_LOG_ERROR:
  74. buff[0] = 'E';
  75. break;
  76. default:
  77. buff[0] = '?';
  78. break;
  79. }
  80. buff[1] = '/';
  81. tmp += 2;
  82. memcpy(tmp, tag, strlen(tag));
  83. buff[2+strlen(tag)] = ' ';
  84. tmp += strlen(tag) + 1;
  85. va_list args;
  86. va_start(args, _fmt);
  87. size_t len = vsnprintf_(tmp, LOGLOG_SIZE, _fmt, args);
  88. va_end(args);
  89. if (len > 0) {
  90. len = strlen(buff);
  91. // if (len > LOGLOG_SIZE - 2)
  92. // len = LOGLOG_SIZE - 2;
  93. // buff[len] = '\r';
  94. // buff[len+1] = '\n';
  95. // luat_nprint(buff, len+2);
  96. if (len > LOGLOG_SIZE - 1)
  97. len = LOGLOG_SIZE - 1;
  98. buff[len] = '\n';
  99. luat_nprint(buff, len+1);
  100. }
  101. }