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