logger.c 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. #include <stdio.h>
  2. #include <stdarg.h>
  3. #include "bsp/bsp_driver.h"
  4. #include "logger.h"
  5. #include "os/os_task.h"
  6. #include "libs/utils.h"
  7. #include "prot/can_message.h"
  8. static uint32_t level_data[2];
  9. static char log_cache[128];
  10. //static co_queue_t log_queue = NULL;
  11. int can_fputc(char c);
  12. void plot_3data16(s16 v1, s16 v2, s16 v3) {
  13. u8 data[6] = {0};
  14. encode_s16(data, v1);
  15. encode_s16(data + 2, v2);
  16. encode_s16(data + 4, v3);
  17. shark_uart_write_frame(SHARK_UART0, data, sizeof(data));
  18. }
  19. void plot_2data16(s16 v1, s16 v2) {
  20. u8 data[4] = {0};
  21. encode_s16(data, v1);
  22. encode_s16(data + 2, v2);
  23. shark_uart_write_frame(SHARK_UART0, data, sizeof(data));
  24. }
  25. void plot_1data16(s16 v1) {
  26. u8 data[2] = {0};
  27. encode_s16(data, v1);
  28. shark_uart_write_frame(SHARK_UART0, data, sizeof(data));
  29. }
  30. static int _get_level(int mod){
  31. int index = mod_bit_start(mod)/(32+1);
  32. mod = mod_bit_start(mod) % 32;
  33. return (level_data[index] >> mod) & LEVEL_MASK;
  34. }
  35. void set_log_level(int mod, int l){
  36. int index = mod_bit_start(mod)/(32+1);
  37. mod = mod_bit_start(mod) % 32;
  38. level_data[index] = (level_data[index] & (~(LEVEL_MASK<<mod))) | ((l & LEVEL_MASK)<<mod);
  39. }
  40. static void log_out(char *fmt, va_list args){
  41. int len = vsnprintf(log_cache, sizeof(log_cache), fmt, args);
  42. for (int i = 0; i < len; i++) {
  43. can_fputc(log_cache[i]);
  44. }
  45. }
  46. void log_debug(int mod, char *fmt, ...){
  47. if (_get_level(mod) >= L_debug){
  48. va_list args;
  49. va_start(args, fmt);
  50. log_out(fmt, args);
  51. va_end(args);
  52. }
  53. }
  54. void log_warning(int mod, char *fmt, ...){
  55. if (_get_level(mod) >= L_warning){
  56. va_list args;
  57. va_start(args, fmt);
  58. log_out(fmt, args);
  59. va_end(args);
  60. }
  61. }
  62. void log_error(int mod, char *fmt, ...){
  63. if (_get_level(mod) >= L_error){
  64. va_list args;
  65. va_start(args, fmt);
  66. log_out(fmt, args);
  67. va_end(args);
  68. }
  69. }
  70. #ifndef GD32_FOC_DEMO
  71. static char log_buffer[8];
  72. static int log_index = 0;
  73. int can_fputc(char c){
  74. can_id_t frame_id;
  75. frame_id.id=0;
  76. frame_id.src = CAN_MY_ADDRESS;
  77. frame_id.type = ptype_indicater;
  78. if (c == '\n'){ //don't send '\n'
  79. if (log_index != 0){
  80. frame_id.dest = 0x72;
  81. can_send_message(frame_id.id, (u8 *)log_buffer, log_index, 0);
  82. }
  83. log_index = 0;
  84. }else if (log_index == sizeof(log_buffer)){
  85. frame_id.dest = 0x70;
  86. can_send_message(frame_id.id, (u8 *)log_buffer, log_index, 0);
  87. log_index = 0;
  88. log_buffer[log_index++] = c;
  89. }else{
  90. log_buffer[log_index++] = c;
  91. }
  92. return 1;
  93. }
  94. #else
  95. int can_fputc(char c) {
  96. return 1;
  97. }
  98. #endif