ringbuffer.h 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. /*
  2. * Copyright (C) 2019-2020 Alibaba Group Holding Limited
  3. */
  4. #ifndef __RINGBUFFER__
  5. #define __RINGBUFFER__
  6. #include <stdio.h>
  7. #include <stdint.h>
  8. #ifdef __cplusplus
  9. extern "C" {
  10. #endif
  11. typedef struct {
  12. uint8_t *buffer;
  13. uint32_t length;
  14. uint32_t ridx;
  15. uint32_t widx;
  16. } dev_ringbuf_t;
  17. /**
  18. * @brief create a ring buffer
  19. * @param[in] length length space of the ring buffer
  20. * @return pointer to ring buffer
  21. */
  22. int ringbuffer_create(dev_ringbuf_t *ringbuffer, char *buffer, int length);
  23. /**
  24. * @brief destroy the ring buffer
  25. * @param[in] buffer pointer to the ring buffer
  26. * @return null
  27. */
  28. void ringbuffer_destroy(dev_ringbuf_t *buffer);
  29. /**
  30. * @brief read data from ring buffer.
  31. * @param[in] buffer pointer to the ring buffer
  32. * @param[in] target pointer to buffer for data to read from ring buffer
  33. * @param[in] amount amount of data items to read
  34. * @return number of actual read data
  35. */
  36. int ringbuffer_read(dev_ringbuf_t *buffer, uint8_t *target, uint32_t amount);
  37. /**
  38. * @brief write data to ring buffer
  39. * @param[in] buffer pointer to the ring buffer
  40. * @param[in] data pointer to buffer for data to write to ring buffer
  41. * @param[in] length length of data items to write
  42. * @return 0 for success
  43. */
  44. int ringbuffer_write(dev_ringbuf_t *buffer, uint8_t *data, uint32_t length);
  45. /**
  46. * @brief is the ring buffer empty?
  47. * @param[in] buffer pointer to the ring buffer
  48. * @return 0 for success
  49. */
  50. int ringbuffer_empty(dev_ringbuf_t *buffer);
  51. /**
  52. * @brief is the ring buffer full?
  53. * @param[in] buffer pointer to the ring buffer
  54. * @return 0 for success
  55. */
  56. int ringbuffer_full(dev_ringbuf_t *buffer);
  57. /**
  58. * @brief available write space to ring buffer
  59. * @param[in] buffer pointer to the ring buffer
  60. * @return number of write spcae
  61. */
  62. int ringbuffer_available_write_space(dev_ringbuf_t *buffer);
  63. /**
  64. * @brief available read space to ring buffer
  65. * @param[in] buffer pointer to the ring buffer
  66. * @return number of read spcae
  67. */
  68. int ringbuffer_available_read_space(dev_ringbuf_t *buffer);
  69. #define ringbuffer_available_write_space(B) (\
  70. (B)->length - ringbuffer_available_read_space(B))
  71. #define ringbuffer_full(B) (ringbuffer_available_write_space(B) == 0)
  72. #define ringbuffer_empty(B) (ringbuffer_available_read_space((B)) == 0)
  73. #define ringbuffer_clear(B) ((B)->widx = (B)->ridx = 0)
  74. #ifdef __cplusplus
  75. }
  76. #endif
  77. #endif