circle_buffer.c 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. #include "circle_buffer.h"
  2. /**
  3. * 初始化环形缓冲区
  4. */
  5. void circle_buf_init(p_circle_buf pCircleBuf, uint32_t len, uint8_t *buf)
  6. {
  7. if (!pCircleBuf || !buf || len == 0) {
  8. return; // 避免非法初始化
  9. }
  10. pCircleBuf->r = pCircleBuf->w = 0;
  11. pCircleBuf->len = len;
  12. pCircleBuf->buf = buf;
  13. }
  14. /**
  15. * 读取数据
  16. * @return 0 成功, -1 失败(缓冲区为空)
  17. */
  18. int circle_buf_read(p_circle_buf pCircleBuf, uint8_t *pVal)
  19. {
  20. if (!pCircleBuf || !pVal) {
  21. return -1; // 空指针检查
  22. }
  23. if (pCircleBuf->r == pCircleBuf->w) {
  24. return -1; // 缓冲区为空
  25. }
  26. *pVal = pCircleBuf->buf[pCircleBuf->r]; // 读取数据
  27. pCircleBuf->r = (pCircleBuf->r + 1) % pCircleBuf->len; // 更新读指针
  28. return 0;
  29. }
  30. /*
  31. int circle_buf_read_2(p_circle_buf_2 pCircleBuf, uint8_t *pVal)
  32. {
  33. if (!pCircleBuf || !pVal) {
  34. return -1; // 空指针检查
  35. }
  36. if (pCircleBuf->r == pCircleBuf->w) {
  37. return -1; // 缓冲区为空
  38. }
  39. *pVal = pCircleBuf->buf[pCircleBuf->r]; // 读取数据
  40. pCircleBuf->r = (pCircleBuf->r + 1) % pCircleBuf->len; // 更新读指针
  41. return 0;
  42. }
  43. */
  44. /**
  45. * 写入数据(支持覆盖最旧数据)
  46. * @return 0 成功
  47. */
  48. int circle_buf_write(p_circle_buf pCircleBuf, uint8_t val)
  49. {
  50. if (!pCircleBuf || !pCircleBuf->buf || pCircleBuf->len == 0) {
  51. return -1; // 空指针/长度检查
  52. }
  53. uint32_t next_w = (pCircleBuf->w + 1) % pCircleBuf->len;
  54. if (next_w == pCircleBuf->r) {
  55. // 缓冲区满,覆盖最旧的数据
  56. pCircleBuf->r = (pCircleBuf->r + 1) % pCircleBuf->len;
  57. }
  58. pCircleBuf->buf[pCircleBuf->w] = val;
  59. pCircleBuf->w = next_w;
  60. return 0;
  61. }
  62. /**
  63. * 获取当前缓冲区中的数据长度
  64. */
  65. uint32_t circle_buf_size(p_circle_buf pCircleBuf)
  66. {
  67. if (!pCircleBuf) {
  68. return 0;
  69. }
  70. if (pCircleBuf->w >= pCircleBuf->r) {
  71. return pCircleBuf->w - pCircleBuf->r;
  72. } else {
  73. return pCircleBuf->len - (pCircleBuf->r - pCircleBuf->w);
  74. }
  75. }
  76. /**
  77. * 清空缓冲区
  78. */
  79. void circle_buf_clear(p_circle_buf pCircleBuf)
  80. {
  81. if (pCircleBuf) {
  82. pCircleBuf->r = pCircleBuf->w = 0;
  83. }
  84. }
  85. /**
  86. * 复制环形缓冲区
  87. */
  88. /*
  89. void copy_circle_buf(circle_buf_t *src, circle_buf_t_2 *dst)
  90. {
  91. uint32_t readable_len;
  92. if (src->w >= src->r)
  93. {
  94. readable_len = src->w - src->r;
  95. memcpy(dst->buf, &src->buf[src->r], readable_len);
  96. }
  97. else
  98. {
  99. readable_len = src->len - src->r + src->w;
  100. memcpy(dst->buf, &src->buf[src->r], src->len - src->r);
  101. memcpy(dst->buf + (src->len - src->r), src->buf, src->w);
  102. }
  103. dst->r = 0;
  104. dst->w = readable_len;
  105. dst->len = src->len;
  106. }
  107. */