xref: /nrf52832-nimble/rt-thread/components/drivers/include/ipc/dataqueue.h (revision 042d53a763ad75cb1465103098bb88c245d95138)
1 /*
2  * Copyright (c) 2006-2018, RT-Thread Development Team
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  *
6  * Change Logs:
7  * Date           Author       Notes
8  */
9 #ifndef DATAQUEUE_H__
10 #define DATAQUEUE_H__
11 
12 #include <rtthread.h>
13 
14 #define RT_DATAQUEUE_EVENT_UNKNOWN   0x00
15 #define RT_DATAQUEUE_EVENT_POP       0x01
16 #define RT_DATAQUEUE_EVENT_PUSH      0x02
17 #define RT_DATAQUEUE_EVENT_LWM       0x03
18 
19 struct rt_data_item;
20 #define RT_DATAQUEUE_SIZE(dq)        ((dq)->put_index - (dq)->get_index)
21 #define RT_DATAQUEUE_EMPTY(dq)       ((dq)->size - RT_DATAQUEUE_SIZE(dq))
22 /* data queue implementation */
23 struct rt_data_queue
24 {
25     rt_uint16_t size;
26     rt_uint16_t lwm;
27     rt_bool_t   waiting_lwm;
28 
29     rt_uint16_t get_index;
30     rt_uint16_t put_index;
31 
32     struct rt_data_item *queue;
33 
34     rt_list_t suspended_push_list;
35     rt_list_t suspended_pop_list;
36 
37     /* event notify */
38     void (*evt_notify)(struct rt_data_queue *queue, rt_uint32_t event);
39 };
40 
41 /**
42  * DataQueue for DeviceDriver
43  */
44 rt_err_t rt_data_queue_init(struct rt_data_queue *queue,
45                             rt_uint16_t           size,
46                             rt_uint16_t           lwm,
47                             void (*evt_notify)(struct rt_data_queue *queue, rt_uint32_t event));
48 rt_err_t rt_data_queue_push(struct rt_data_queue *queue,
49                             const void           *data_ptr,
50                             rt_size_t             data_size,
51                             rt_int32_t            timeout);
52 rt_err_t rt_data_queue_pop(struct rt_data_queue *queue,
53                            const void          **data_ptr,
54                            rt_size_t            *size,
55                            rt_int32_t            timeout);
56 rt_err_t rt_data_queue_peak(struct rt_data_queue *queue,
57                             const void          **data_ptr,
58                             rt_size_t            *size);
59 void rt_data_queue_reset(struct rt_data_queue *queue);
60 
61 #endif
62