chan_tcpservcan_ringbuffer.h 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. #ifndef __CHAN_TCPSERVCAN_RINGBUFFER_H__
  2. #define __CHAN_TCPSERVCAN_RINGBUFFER_H__
  3. #include <pthread.h>
  4. #include "can_frame.h"
  5. /** * The size of a ring buffer.
  6. * Due to the design only <tt> RING_BUFFER_SIZE-1 </tt> items
  7. * can be contained in the buffer.
  8. * The buffer size must be a power of two.
  9. */
  10. #define CHAN_TCPSERVCAN_RINGBUFFER_SIZE 0x80
  11. #if (CHAN_TCPSERVCAN_RINGBUFFER_SIZE & (CHAN_TCPSERVCAN_RINGBUFFER_SIZE - 1)) != 0
  12. #error "RING_BUFFER_SIZE must be a power of two"
  13. #endif
  14. /**
  15. * Used as a modulo operator
  16. * as <tt> a % b = (a & (b ? 1)) </tt>
  17. * where \c a is a positive index in the buffer and
  18. * \c b is the (power of two) size of the buffer.
  19. */
  20. #define CHAN_TCPSERVCAN_RINGBUFFER_MASK (CHAN_TCPSERVCAN_RINGBUFFER_SIZE-1)
  21. /** * The type which is used to hold the size
  22. * and the indicies of the buffer.
  23. * Must be able to fit \c RING_BUFFER_SIZE .
  24. */
  25. //typedef uint8_t ring_buffer_size_t;
  26. typedef int chan_tcpservcan_ringbuffer_size_t;
  27. typedef struct tag_chan_tcpservcan_ringbuffer_element{
  28. struct can_frame frame;
  29. }chan_tcpservcan_ringbuffer_element_t;
  30. /**
  31. * Simplifies the use of <tt>struct ring_buffer_t</tt>.
  32. */
  33. typedef struct chan_tcpservcan_ringbuffer_t chan_tcpservcan_ringbuffer_t;
  34. /**
  35. * Structure which holds a ring buffer.
  36. * The buffer contains a buffer array
  37. * as well as metadata for the ring buffer.
  38. */
  39. struct chan_tcpservcan_ringbuffer_t {
  40. /** Buffer memory. */
  41. chan_tcpservcan_ringbuffer_element_t buffer[CHAN_TCPSERVCAN_RINGBUFFER_SIZE];
  42. /** Index of tail. */
  43. chan_tcpservcan_ringbuffer_size_t tail_index;
  44. /** Index of head. */
  45. chan_tcpservcan_ringbuffer_size_t head_index;
  46. };
  47. chan_tcpservcan_ringbuffer_size_t chan_tcpservcan_ringbuffer_is_empty(chan_tcpservcan_ringbuffer_t *buffer);
  48. chan_tcpservcan_ringbuffer_size_t chan_tcpservcan_ringbuffer_is_full(chan_tcpservcan_ringbuffer_t *buffer);
  49. void chan_tcpservcan_ringbuffer_init(chan_tcpservcan_ringbuffer_t *buffer);
  50. void chan_tcpservcan_ringbuffer_queue(chan_tcpservcan_ringbuffer_t *buffer, chan_tcpservcan_ringbuffer_element_t data);
  51. void chan_tcpservcan_ringbuffer_queue_arr(chan_tcpservcan_ringbuffer_t *buffer, const chan_tcpservcan_ringbuffer_element_t*data, chan_tcpservcan_ringbuffer_size_t size);
  52. chan_tcpservcan_ringbuffer_size_t chan_tcpservcan_ringbuffer_dequeue(chan_tcpservcan_ringbuffer_t *buffer, chan_tcpservcan_ringbuffer_element_t* data);
  53. chan_tcpservcan_ringbuffer_size_t chan_tcpservcan_ringbuffer_dequeue_arr(chan_tcpservcan_ringbuffer_t *buffer, chan_tcpservcan_ringbuffer_element_t* data, chan_tcpservcan_ringbuffer_size_t len);
  54. chan_tcpservcan_ringbuffer_size_t chan_tcpservcan_ringbuffer_peek(chan_tcpservcan_ringbuffer_t *buffer, chan_tcpservcan_ringbuffer_element_t* data, chan_tcpservcan_ringbuffer_size_t index);
  55. chan_tcpservcan_ringbuffer_size_t chan_tcpservcan_ringbuffer_num_items(chan_tcpservcan_ringbuffer_t *buffer);
  56. #endif