circle_buffer.c 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. #include <string.h>
  2. #include "circle_buffer.h"
  3. static int circle_get_write_space(c_buffer_t *cbuff);
  4. static int circle_get_read_space(c_buffer_t *cbuff);
  5. c_buffer_t *circle_buffer_init(c_buffer_t *cbuff, u8 *buffer, int16_t max_len){
  6. memset(cbuff, 0, sizeof(c_buffer_t));
  7. cbuff->buffer = buffer;
  8. cbuff->buffer_len = max_len;
  9. return cbuff;
  10. }
  11. void circle_reset(c_buffer_t *cbuff){
  12. cbuff->r_pos = cbuff->w_pos = 0;
  13. }
  14. int circle_put_data(c_buffer_t *cbuff, u8 *data, int16_t len){
  15. int16_t size = circle_get_write_space(cbuff);
  16. int16_t w_len = len;
  17. int16_t w1_len = len;
  18. if (size < 0){
  19. return size;
  20. }
  21. w_len = min(len, size);
  22. while(w_len > 0){
  23. //wrapper
  24. if (cbuff->w_pos + w_len > cbuff->buffer_len){
  25. w1_len = cbuff->buffer_len - cbuff->w_pos;
  26. }else{
  27. w1_len = w_len;
  28. }
  29. memcpy(cbuff->buffer + cbuff->w_pos, data, w1_len);
  30. cbuff->w_pos = (cbuff->w_pos + w1_len);
  31. if (cbuff->w_pos == cbuff->buffer_len){
  32. cbuff->w_pos = 0;
  33. }
  34. w_len -= w1_len;
  35. data += w1_len;
  36. }
  37. return min(len, size);
  38. }
  39. int circle_put_one_data(c_buffer_t *cbuff, u8 data){
  40. int16_t size = circle_get_write_space(cbuff);
  41. if (size < 0){
  42. return size;
  43. }
  44. cbuff->buffer[cbuff->w_pos] = data;
  45. cbuff->w_pos = cbuff->w_pos + 1;
  46. if (cbuff->w_pos == cbuff->buffer_len){
  47. cbuff->w_pos = 0;
  48. }
  49. return 1;
  50. }
  51. int circle_get_data(c_buffer_t *cbuff, u8 *data, int16_t len){
  52. int16_t size = circle_get_read_space(cbuff);
  53. int16_t r_len = len;
  54. int16_t r1_len = 0;
  55. if (size <= 0){
  56. return size;
  57. }
  58. r_len = min(size, len);
  59. while(r_len > 0){
  60. if (cbuff->r_pos + r_len > cbuff->buffer_len){
  61. r1_len = cbuff->buffer_len - cbuff->r_pos;
  62. }else{
  63. r1_len = r_len;
  64. }
  65. memcpy(data, cbuff->buffer + cbuff->r_pos, r1_len);
  66. cbuff->r_pos = (cbuff->r_pos + r1_len);
  67. if (cbuff->r_pos == cbuff->buffer_len){
  68. cbuff->r_pos = 0;
  69. }
  70. r_len -= r1_len;
  71. data += r1_len;
  72. }
  73. return min(size, len);
  74. }
  75. int circle_get_one_data(c_buffer_t *cbuff, u8 *data){
  76. int16_t size = circle_get_read_space(cbuff);
  77. if (size <= 0){
  78. return size;
  79. }
  80. *data = cbuff->buffer[cbuff->r_pos];
  81. cbuff->r_pos = cbuff->r_pos + 1;
  82. if (cbuff->r_pos == cbuff->buffer_len){
  83. cbuff->r_pos = 0;
  84. }
  85. return 1;
  86. }
  87. static __inline__ int circle_get_write_space(c_buffer_t *cbuff){
  88. int16_t size = (cbuff->w_pos >= cbuff->r_pos)?(cbuff->buffer_len - cbuff->w_pos + cbuff->r_pos):(cbuff->r_pos - cbuff->w_pos);
  89. size -= 1;
  90. if (size <= 0){
  91. return CBUFF_FULL;
  92. }
  93. return size;
  94. }
  95. static __inline__ int circle_get_read_space(c_buffer_t *cbuff){
  96. int16_t size = (cbuff->r_pos > cbuff->w_pos) ? (cbuff->buffer_len - cbuff->r_pos + cbuff->w_pos) : (cbuff->w_pos - cbuff->r_pos);
  97. if (size <= 0){
  98. return CBUFF_EMPTY;
  99. }
  100. return size;
  101. }