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