drv_ringbuffer.c 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. #include <stdio.h>
  2. #include <stdint.h>
  3. #include <stdlib.h>
  4. #include "rtthread.h"
  5. #include "drv_common.h"
  6. #include "drv_ringbuffer.h"
  7. #ifdef RT_USING_HEAP
  8. ringbuffer_t *ringbuffer_create (rt_uint32_t size)
  9. {
  10. ringbuffer_t *rb = rt_malloc (sizeof (ringbuffer_t));
  11. if (rb != NULL) {
  12. rb->buffer = rt_malloc (size);
  13. rb->buffer_size = size;
  14. /* initialize read and write index */
  15. rb->read_index = 0;
  16. rb->write_index = 0;
  17. rb->read_mirror = 0;
  18. rb->write_mirror = 0;
  19. return rb;
  20. } else
  21. return 0;
  22. }
  23. void ringbuffer_release (ringbuffer_t *rb)
  24. {
  25. if (rb != NULL) {
  26. rt_free (rb->buffer);
  27. rt_free (rb);
  28. }
  29. }
  30. #endif
  31. ringbuffer_t *ringbuffer_init (ringbuffer_t *rb, rt_uint8_t *buffer, rt_uint32_t size)
  32. {
  33. if (rb != NULL) {
  34. rb->buffer = buffer;
  35. rb->buffer_size = size;
  36. /* initialize read and write index */
  37. rb->read_index = 0;
  38. rb->write_index = 0;
  39. rb->read_mirror = 0;
  40. rb->write_mirror = 0;
  41. return rb;
  42. } else
  43. return RT_NULL;
  44. }
  45. ringbuffer_state_t ringbuffer_get_state (ringbuffer_t *rb)
  46. {
  47. ringbuffer_state_t state = RINGBUFFER_OK;
  48. rt_enter_critical();
  49. if (rb->read_index == rb->write_index) {
  50. if (rb->read_mirror == rb->write_mirror)
  51. state = RINGBUFFER_EMPTY;
  52. else
  53. state = RINGBUFFER_FULL;
  54. }
  55. rt_exit_critical ();
  56. return state;
  57. }
  58. rt_uint16_t ringbuffer_data_len (ringbuffer_t *rb)
  59. {
  60. rt_uint16_t len = 0;
  61. rt_enter_critical();
  62. switch (ringbuffer_get_state (rb)) {
  63. case RINGBUFFER_EMPTY:
  64. len = 0;
  65. break;
  66. case RINGBUFFER_FULL:
  67. len = rb->buffer_size;
  68. break;
  69. case RINGBUFFER_OK:
  70. default:
  71. if (rb->write_index > rb->read_index)
  72. len = rb->write_index - rb->read_index;
  73. else
  74. len = rb->buffer_size - (rb->read_index - rb->write_index);
  75. break;
  76. };
  77. rt_exit_critical ();
  78. return len;
  79. }
  80. /** return the size of empty space in rb */
  81. #define ringbuffer_space_len(rb) ((rb)->buffer_size - ringbuffer_data_len(rb))
  82. rt_uint8_t ringbuffer_getchar (ringbuffer_t *rb, rt_uint8_t *ch)
  83. {
  84. if (rb != NULL) {
  85. /* ringbuffer is empty */
  86. if (ringbuffer_data_len (rb) == 0)
  87. return 0;
  88. rt_enter_critical();
  89. /* put character */
  90. *ch = rb->buffer[rb->read_index];
  91. if (rb->read_index == rb->buffer_size - 1) {
  92. rb->read_mirror = ~rb->read_mirror;
  93. rb->read_index = 0;
  94. } else {
  95. rb->read_index++;
  96. }
  97. rt_exit_critical ();
  98. return 1;
  99. }
  100. return 0;
  101. }
  102. rt_uint8_t ringbuffer_putchar (ringbuffer_t *rb, rt_uint8_t ch)
  103. {
  104. if (rb != NULL) {
  105. /* whether has enough space */
  106. if (ringbuffer_space_len (rb) == 0)
  107. return 0;
  108. rt_enter_critical();
  109. rb->buffer[rb->write_index] = ch;
  110. /* flip mirror */
  111. if (rb->write_index == rb->buffer_size - 1) {
  112. rb->write_mirror = ~rb->write_mirror;
  113. rb->write_index = 0;
  114. } else {
  115. rb->write_index++;
  116. }
  117. rt_exit_critical ();
  118. return 1;
  119. }
  120. return 0;
  121. }