mc_error.c 3.9 KB

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