utils_ring_buffer.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. #include "include.h"
  2. #include "utils_ring_buffer.h"
  3. void utils_ring_buffer_init(ring_buffer_t *ring_buf, uint8_t *buffer, uint32_t size)
  4. {
  5. memset(ring_buf, 0, sizeof(ring_buffer_t));
  6. ring_buf->buf = buffer;
  7. ring_buf->total_len = size;
  8. }
  9. void utils_ring_buffer_clear(ring_buffer_t *ring_buf)
  10. {
  11. if(ring_buf){
  12. ring_buf->data_len = 0;
  13. ring_buf->buf_read = 0;
  14. ring_buf->buf_write = 0;
  15. }
  16. }
  17. AT(.com_text.ring_buf.write)
  18. uint32_t utils_ring_buffer_write(ring_buffer_t *ring_buf, uint8_t *buffer, uint32_t size)
  19. {
  20. uint32_t len = 0;
  21. uint32_t total_len = ring_buf->total_len;
  22. uint8_t *ring_buf_source = ring_buf->buf;
  23. if((ring_buf->data_len + size) < total_len){
  24. uint32_t ring_buf_bw = ring_buf->buf_write;
  25. if((ring_buf_bw + size) <= total_len) {
  26. memcpy(ring_buf_source + ring_buf_bw, buffer, size);
  27. } else {
  28. len = total_len - ring_buf_bw;
  29. memcpy(ring_buf_source + ring_buf_bw, buffer, len);
  30. memcpy(ring_buf_source, buffer + len, size - len);
  31. }
  32. {
  33. GLOBAL_INT_DISABLE();
  34. ring_buf->buf_write = (ring_buf->buf_write + size) % total_len;
  35. ring_buf->data_len += size;
  36. GLOBAL_INT_RESTORE();
  37. }
  38. return size;
  39. }else {
  40. return 0;
  41. }
  42. }
  43. AT(.com_text.ring_buf.read)
  44. uint32_t utils_ring_buffer_read(ring_buffer_t *ring_buf, uint8_t *buffer, uint32_t size)
  45. {
  46. uint32_t len = 0;
  47. uint32_t total_len = ring_buf->total_len;
  48. uint8_t *ring_buf_source = ring_buf->buf;
  49. if(ring_buf->data_len >= size){
  50. GLOBAL_INT_DISABLE();
  51. uint32_t ring_buf_br = ring_buf->buf_read;
  52. ring_buf->buf_read = (ring_buf->buf_read + size) % total_len;
  53. ring_buf->data_len -= size;
  54. GLOBAL_INT_RESTORE();
  55. if((ring_buf_br + size) <= total_len) {
  56. memcpy(buffer, ring_buf_source + ring_buf_br, size);
  57. } else {
  58. len = total_len - ring_buf_br;
  59. memcpy(buffer, ring_buf_source + ring_buf_br, len);
  60. memcpy(buffer + len, ring_buf_source, size - len);
  61. }
  62. return size;
  63. }
  64. return 0;
  65. }
  66. AT(.com_text.ring_buf.get)
  67. uint8_t* utils_ring_buffer_get(ring_buffer_t *ring_buf, uint32_t size)
  68. {
  69. uint32_t total_len = ring_buf->total_len;
  70. uint8_t *ring_buf_source = ring_buf->buf;
  71. if(ring_buf->data_len >= size){
  72. uint32_t ring_buf_br = ring_buf->buf_read;
  73. if((ring_buf_br + size) <= total_len) {
  74. GLOBAL_INT_DISABLE();
  75. ring_buf->buf_read = (ring_buf->buf_read + size) % total_len;
  76. ring_buf->data_len -= size;
  77. GLOBAL_INT_RESTORE();
  78. return ring_buf_source + ring_buf_br;
  79. }
  80. }
  81. return NULL;
  82. }
  83. AT(.com_text.ring_buf.dl_get)
  84. uint32_t utils_ring_buffer_data_len_get(ring_buffer_t *ring_buf)
  85. {
  86. return ring_buf->data_len;
  87. }
  88. AT(.com_text.ring_buf.tl_get)
  89. uint32_t utils_ring_buffer_total_len_get(ring_buffer_t *ring_buf)
  90. {
  91. return ring_buf->total_len;
  92. }