1 /* 2 * Copyright (c) 2006-2023, 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 <rtdef.h> 13 #include <rtconfig.h> 14 15 #define RT_DATAQUEUE_EVENT_UNKNOWN 0x00 16 #define RT_DATAQUEUE_EVENT_POP 0x01 17 #define RT_DATAQUEUE_EVENT_PUSH 0x02 18 #define RT_DATAQUEUE_EVENT_LWM 0x03 19 20 struct rt_data_item; 21 22 /* data queue implementation */ 23 struct rt_data_queue 24 { 25 rt_uint32_t magic; 26 27 rt_uint16_t size; 28 rt_uint16_t lwm; 29 30 rt_uint16_t get_index : 15; 31 rt_uint16_t is_empty : 1; 32 rt_uint16_t put_index : 15; 33 rt_uint16_t is_full : 1; 34 35 struct rt_data_item *queue; 36 struct rt_spinlock spinlock; 37 38 rt_list_t suspended_push_list; 39 rt_list_t suspended_pop_list; 40 41 /* event notify */ 42 void (*evt_notify)(struct rt_data_queue *queue, rt_uint32_t event); 43 }; 44 45 /** 46 * DataQueue for DeviceDriver 47 */ 48 rt_err_t rt_data_queue_init(struct rt_data_queue *queue, 49 rt_uint16_t size, 50 rt_uint16_t lwm, 51 void (*evt_notify)(struct rt_data_queue *queue, rt_uint32_t event)); 52 rt_err_t rt_data_queue_push(struct rt_data_queue *queue, 53 const void *data_ptr, 54 rt_size_t data_size, 55 rt_int32_t timeout); 56 rt_err_t rt_data_queue_pop(struct rt_data_queue *queue, 57 const void **data_ptr, 58 rt_size_t *size, 59 rt_int32_t timeout); 60 rt_err_t rt_data_queue_peek(struct rt_data_queue *queue, 61 const void **data_ptr, 62 rt_size_t *size); 63 void rt_data_queue_reset(struct rt_data_queue *queue); 64 rt_err_t rt_data_queue_deinit(struct rt_data_queue *queue); 65 rt_uint16_t rt_data_queue_len(struct rt_data_queue *queue); 66 67 #endif 68