logger.c 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. #include <stdio.h>
  2. #include <stdarg.h>
  3. #include "bsp/bsp.h"
  4. #include "logger.h"
  5. #include "os/co_task.h"
  6. #include "os/queue.h"
  7. static uint32_t level_data[2];
  8. static char log_cache[128];
  9. static co_queue_t log_queue = NULL;
  10. int can_fputc(char c);
  11. static void log_co_task(void *args) {
  12. log_chan_t log_v;
  13. while(1) {
  14. if (queue_get(log_queue, &log_v)){
  15. if (log_v.id != 1) {
  16. sys_debug("%d: %d\n", log_v.id, log_v.value);
  17. }else {
  18. extern void shark_uart_write_log(char *buffer);
  19. char buffer[128] = {0};
  20. sprintf(buffer, "$%d;", log_v.value);
  21. shark_uart_write_log(buffer);
  22. }
  23. }
  24. co_task_yield();
  25. }
  26. }
  27. void log_start_task(void) {
  28. log_queue = queue_create(5000, sizeof(log_chan_t));
  29. co_task_create(log_co_task, NULL, 512);
  30. }
  31. void log_chan_value(u16 id, s32 value) {
  32. log_chan_t log_v;
  33. log_v.id = id;
  34. log_v.value = value;
  35. queue_put(log_queue, &log_v);
  36. }
  37. static int _get_level(int mod){
  38. int index = mod_bit_start(mod)/(32+1);
  39. mod = mod_bit_start(mod) % 32;
  40. return (level_data[index] >> mod) & LEVEL_MASK;
  41. }
  42. void set_log_level(int mod, int l){
  43. int index = mod_bit_start(mod)/(32+1);
  44. mod = mod_bit_start(mod) % 32;
  45. level_data[index] = (level_data[index] & (~(LEVEL_MASK<<mod))) | ((l & LEVEL_MASK)<<mod);
  46. }
  47. static void log_out(char *fmt, va_list args){
  48. int len = vsnprintf(log_cache, sizeof(log_cache), fmt, args);
  49. for (int i = 0; i < len; i++) {
  50. can_fputc(log_cache[i]);
  51. }
  52. }
  53. void log_debug(int mod, char *fmt, ...){
  54. if (_get_level(mod) >= L_debug){
  55. va_list args;
  56. va_start(args, fmt);
  57. log_out(fmt, args);
  58. va_end(args);
  59. }
  60. }
  61. void log_warning(int mod, char *fmt, ...){
  62. if (_get_level(mod) >= L_warning){
  63. va_list args;
  64. va_start(args, fmt);
  65. log_out(fmt, args);
  66. va_end(args);
  67. }
  68. }
  69. void log_error(int mod, char *fmt, ...){
  70. if (_get_level(mod) >= L_error){
  71. va_list args;
  72. va_start(args, fmt);
  73. log_out(fmt, args);
  74. va_end(args);
  75. }
  76. }
  77. static char log_buffer[8];
  78. static int log_index = 0;
  79. int can_fputc(char c){
  80. can_id_t frame_id;
  81. frame_id.id=0;
  82. frame_id.src = CAN_MY_ADDRESS;
  83. frame_id.type = ptype_indicater;
  84. if (c == '\n'){ //don't send '\n'
  85. if (log_index != 0){
  86. frame_id.dest = 0x72;
  87. shark_can0_send_message(frame_id.id, log_buffer, log_index);
  88. }
  89. log_index = 0;
  90. }else if (log_index == sizeof(log_buffer)){
  91. frame_id.dest = 0x70;
  92. shark_can0_send_message(frame_id.id, log_buffer, log_index);
  93. log_index = 0;
  94. log_buffer[log_index++] = c;
  95. }else{
  96. log_buffer[log_index++] = c;
  97. }
  98. return 1;
  99. }