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