mc_error.c 4.1 KB

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