mc_error.c 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. #include "foc/mc_error.h"
  2. #include "libs/logger.h"
  3. #include "app/nv_storage.h"
  4. #include "libs/crc16.h"
  5. #include "libs/utils.h"
  6. static u8 page_buff[one_page_size];
  7. static u8 page_buff_runtime[one_page_size];
  8. static err_nv_t *_e_nv = NULL;
  9. static runtime_nv_t *_r_nv = NULL;
  10. static bool _w_pending = false;
  11. static bool _w_pending_rt = false;
  12. #define ERR_MAX_SIZE 255
  13. #define RUNTIME_MAX_SIZE 50
  14. void mc_err_block_init(void) {
  15. _e_nv = (err_nv_t *)page_buff;
  16. nv_read_crit_errblock(page_buff, one_page_size);
  17. u16 crc16 = crc16_get((u8 *)_e_nv->node, one_page_size - sizeof(err_nv_t));
  18. if (crc16 != _e_nv->crc) {
  19. memset(page_buff, 0, one_page_size);
  20. _e_nv->crc = crc16_get((u8 *)_e_nv->node, one_page_size - sizeof(err_nv_t));
  21. nv_write_crit_errblock(page_buff, one_page_size);
  22. sys_debug("mc crc\n");
  23. }
  24. _r_nv = (runtime_nv_t *)page_buff_runtime;
  25. nv_read_runtime_block(page_buff_runtime, one_page_size);
  26. crc16 = crc16_get((u8 *)_r_nv->node, one_page_size - sizeof(runtime_nv_t));
  27. if (crc16 != _r_nv->crc) {
  28. memset(page_buff_runtime, 0, one_page_size);
  29. _r_nv->crc = crc16_get((u8 *)_r_nv->node, one_page_size - sizeof(runtime_nv_t));
  30. nv_write_runtime_block(page_buff_runtime, one_page_size);
  31. sys_debug("mc rt crc\n");
  32. }
  33. sys_debug("mc err size %d -%d\n", sizeof(err_node_t) * ERR_MAX_SIZE + sizeof(err_nv_t), sizeof(runtime_node_t) * RUNTIME_MAX_SIZE+ sizeof(runtime_nv_t));
  34. }
  35. void mc_crit_err_add(u8 code, s16 value1, s16 value2) {
  36. err_node_t *node = _e_nv->node;
  37. node = node + _e_nv->tail;
  38. node->idx = _e_nv->tail;
  39. node->err_code = code;
  40. node->value1 = value1;
  41. node->value2 = value2;
  42. _e_nv->tail = (_e_nv->tail + 1) % ERR_MAX_SIZE; //next add index
  43. _e_nv->count++;
  44. if (_e_nv->count > ERR_MAX_SIZE) {
  45. _e_nv->count = ERR_MAX_SIZE;
  46. }
  47. _w_pending = true;
  48. }
  49. void mc_crit_err_add_s16(u8 code, s16 value) {
  50. mc_crit_err_add(code, value, -1);
  51. }
  52. void mc_err_runtime_add(runtime_node_t *rt) {
  53. runtime_node_t *node = _r_nv->node;
  54. node = node + _r_nv->tail;
  55. memcpy(node, rt, sizeof(runtime_node_t));
  56. node->idx = _r_nv->tail;
  57. _r_nv->tail = (_r_nv->tail + 1) % RUNTIME_MAX_SIZE; //next add index
  58. _r_nv->count++;
  59. if (_r_nv->count > RUNTIME_MAX_SIZE) {
  60. _r_nv->count = RUNTIME_MAX_SIZE;
  61. }
  62. _w_pending_rt = true;
  63. }
  64. void mc_err_block_save(void) {
  65. if (_w_pending) {
  66. _e_nv->crc = crc16_get((u8 *)_e_nv->node, one_page_size - sizeof(err_nv_t));
  67. nv_write_crit_errblock(page_buff, one_page_size);
  68. _w_pending = false;
  69. }
  70. if (_w_pending_rt) {
  71. _r_nv->crc = crc16_get((u8 *)_r_nv->node, one_page_size - sizeof(runtime_nv_t));
  72. nv_write_runtime_block(page_buff_runtime, one_page_size);
  73. _w_pending_rt = false;
  74. }
  75. }
  76. int mc_crit_err_get(s16 offset, u8 *buff, int len) {
  77. int count = (len - 1) / sizeof(err_node_t);
  78. int index = offset;
  79. u8 *p_remain = buff++;
  80. if (_e_nv->count == ERR_MAX_SIZE) {
  81. index = (index + _e_nv->tail) % ERR_MAX_SIZE;
  82. }
  83. int remain = (offset > _e_nv->count)?0:(_e_nv->count - offset);
  84. count = min(count, remain);
  85. err_node_t *node = _e_nv->node;
  86. len = 0;
  87. *p_remain = count;
  88. len ++;
  89. while (count--) {
  90. memcpy(buff, (u8 *)(node + index), sizeof(err_node_t));
  91. buff += sizeof(err_node_t);
  92. index = (index + 1) % ERR_MAX_SIZE;
  93. len += sizeof(err_node_t);
  94. }
  95. return len;
  96. }
  97. int mc_err_runtime_get(s16 offset, u8 *buff, int len) {
  98. int count = (len - 1) / sizeof(runtime_node_t);
  99. int index = offset;
  100. u8 *p_remain = buff++;
  101. if (_r_nv->count == RUNTIME_MAX_SIZE) {
  102. index = (index + _r_nv->tail) % RUNTIME_MAX_SIZE;
  103. }
  104. int remain = (offset > _r_nv->count)?0:(_r_nv->count - offset);
  105. count = min(count, remain);
  106. runtime_node_t *node = _r_nv->node;
  107. len = 0;
  108. *p_remain = count;
  109. len ++;
  110. while (count--) {
  111. memcpy(buff, (u8 *)(node + index), sizeof(runtime_node_t));
  112. buff += sizeof(runtime_node_t);
  113. index = (index + 1) % RUNTIME_MAX_SIZE;
  114. len += sizeof(runtime_node_t);
  115. }
  116. return len;
  117. }
  118. void mc_err_code_log(void) {
  119. if (_e_nv->count > 0) {
  120. sys_debug("mc err count %d, tail %d\n", _e_nv->count, _e_nv->tail);
  121. }
  122. if (_r_nv->count > 0) {
  123. sys_debug("mc rt count %d, tail %d\n", _r_nv->count, _r_nv->tail);
  124. }
  125. }