dataqueue.h 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. #ifndef DATAQUEUE_H__
  2. #define DATAQUEUE_H__
  3. #include <rtthread.h>
  4. #define RT_DATAQUEUE_EVENT_UNKNOWN 0x00
  5. #define RT_DATAQUEUE_EVENT_POP 0x01
  6. #define RT_DATAQUEUE_EVENT_PUSH 0x02
  7. #define RT_DATAQUEUE_EVENT_LWM 0x03
  8. struct rt_data_item;
  9. #define RT_DATAQUEUE_SIZE(dq) ((dq)->put_index - (dq)->get_index)
  10. #define RT_DATAQUEUE_EMPTY(dq) ((dq)->size - RT_DATAQUEUE_SIZE(dq))
  11. /* data queue implementation */
  12. struct rt_data_queue
  13. {
  14. rt_uint16_t size;
  15. rt_uint16_t lwm;
  16. rt_bool_t waiting_lwm;
  17. rt_uint16_t get_index;
  18. rt_uint16_t put_index;
  19. struct rt_data_item *queue;
  20. rt_list_t suspended_push_list;
  21. rt_list_t suspended_pop_list;
  22. /* event notify */
  23. void (*evt_notify)(struct rt_data_queue *queue, rt_uint32_t event);
  24. };
  25. /**
  26. * DataQueue for DeviceDriver
  27. */
  28. rt_err_t rt_data_queue_init(struct rt_data_queue *queue,
  29. rt_uint16_t size,
  30. rt_uint16_t lwm,
  31. void (*evt_notify)(struct rt_data_queue *queue, rt_uint32_t event));
  32. rt_err_t rt_data_queue_push(struct rt_data_queue *queue,
  33. const void *data_ptr,
  34. rt_size_t data_size,
  35. rt_int32_t timeout);
  36. rt_err_t rt_data_queue_pop(struct rt_data_queue *queue,
  37. const void **data_ptr,
  38. rt_size_t *size,
  39. rt_int32_t timeout);
  40. rt_err_t rt_data_queue_peak(struct rt_data_queue *queue,
  41. const void **data_ptr,
  42. rt_size_t *size);
  43. void rt_data_queue_reset(struct rt_data_queue *queue);
  44. #endif