xref: /btstack/test/fifo/fifo.c (revision 08dc63945249b1bf0b8808b94cb8e2e2cd1868ca)
1*08dc6394SMatthias Ringwald #include <stdint.h>
2*08dc6394SMatthias Ringwald #include <string.h>
3*08dc6394SMatthias Ringwald #include <stdio.h>
4*08dc6394SMatthias Ringwald 
5*08dc6394SMatthias Ringwald #define L2CAP_FIXED_CHANNEL_TABLE_SIZE 3
6*08dc6394SMatthias Ringwald #define FIXED_CHANNEL_FIFO_INVALID_INDEX 0xff
7*08dc6394SMatthias Ringwald 
8*08dc6394SMatthias Ringwald typedef struct l2cap_fixed_channel {
9*08dc6394SMatthias Ringwald     uint8_t waiting_for_can_send_now;
10*08dc6394SMatthias Ringwald     uint8_t next_request;
11*08dc6394SMatthias Ringwald } l2cap_fixed_channel_t;
12*08dc6394SMatthias Ringwald 
13*08dc6394SMatthias Ringwald static l2cap_fixed_channel_t fixed_channels[L2CAP_FIXED_CHANNEL_TABLE_SIZE];
14*08dc6394SMatthias Ringwald static uint8_t fixed_channel_head_index = FIXED_CHANNEL_FIFO_INVALID_INDEX;
15*08dc6394SMatthias Ringwald static uint8_t fixed_channel_tail_index = FIXED_CHANNEL_FIFO_INVALID_INDEX;
16*08dc6394SMatthias Ringwald 
fifo_init(void)17*08dc6394SMatthias Ringwald static void fifo_init(void){
18*08dc6394SMatthias Ringwald 	printf("\ninit\n");
19*08dc6394SMatthias Ringwald     memset(fixed_channels, 0, sizeof(fixed_channels));
20*08dc6394SMatthias Ringwald     int i;
21*08dc6394SMatthias Ringwald     for (i=0;i<L2CAP_FIXED_CHANNEL_TABLE_SIZE;i++){
22*08dc6394SMatthias Ringwald         fixed_channels[i].next_request = FIXED_CHANNEL_FIFO_INVALID_INDEX;
23*08dc6394SMatthias Ringwald     }
24*08dc6394SMatthias Ringwald }
25*08dc6394SMatthias Ringwald 
fifo_add(int index)26*08dc6394SMatthias Ringwald static void fifo_add(int index){
27*08dc6394SMatthias Ringwald 	printf("add index %u\n", index);
28*08dc6394SMatthias Ringwald     // insert into queue
29*08dc6394SMatthias Ringwald     if (fixed_channel_tail_index == FIXED_CHANNEL_FIFO_INVALID_INDEX){
30*08dc6394SMatthias Ringwald         fixed_channel_head_index = index;
31*08dc6394SMatthias Ringwald     } else {
32*08dc6394SMatthias Ringwald         fixed_channels[fixed_channel_tail_index].next_request = index;
33*08dc6394SMatthias Ringwald     }
34*08dc6394SMatthias Ringwald     fixed_channel_tail_index = index;
35*08dc6394SMatthias Ringwald     fixed_channels[index].next_request = FIXED_CHANNEL_FIFO_INVALID_INDEX;
36*08dc6394SMatthias Ringwald     fixed_channels[index].waiting_for_can_send_now = 1;
37*08dc6394SMatthias Ringwald }
38*08dc6394SMatthias Ringwald 
fifo_get_next(void)39*08dc6394SMatthias Ringwald static int fifo_get_next(void){
40*08dc6394SMatthias Ringwald     if (fixed_channel_head_index == FIXED_CHANNEL_FIFO_INVALID_INDEX) return -1;
41*08dc6394SMatthias Ringwald 
42*08dc6394SMatthias Ringwald     int can_send = 0;
43*08dc6394SMatthias Ringwald     uint8_t i = fixed_channel_head_index;
44*08dc6394SMatthias Ringwald     if (fixed_channels[i].waiting_for_can_send_now){
45*08dc6394SMatthias Ringwald     	can_send = 1;
46*08dc6394SMatthias Ringwald     }
47*08dc6394SMatthias Ringwald     fixed_channels[i].waiting_for_can_send_now = 0;
48*08dc6394SMatthias Ringwald     fixed_channel_head_index = fixed_channels[i].next_request;
49*08dc6394SMatthias Ringwald     fixed_channels[i].next_request = FIXED_CHANNEL_FIFO_INVALID_INDEX;
50*08dc6394SMatthias Ringwald     if (fixed_channel_head_index == FIXED_CHANNEL_FIFO_INVALID_INDEX){
51*08dc6394SMatthias Ringwald         fixed_channel_tail_index = FIXED_CHANNEL_FIFO_INVALID_INDEX;
52*08dc6394SMatthias Ringwald     }
53*08dc6394SMatthias Ringwald     if (can_send) {
54*08dc6394SMatthias Ringwald     	return i;
55*08dc6394SMatthias Ringwald     }
56*08dc6394SMatthias Ringwald     return -1;
57*08dc6394SMatthias Ringwald }
58*08dc6394SMatthias Ringwald 
fifo_dump(void)59*08dc6394SMatthias Ringwald static void fifo_dump(void){
60*08dc6394SMatthias Ringwald 	while (1){
61*08dc6394SMatthias Ringwald 		int i = fifo_get_next();
62*08dc6394SMatthias Ringwald 		if (i < 0) break;
63*08dc6394SMatthias Ringwald 		printf("got index %u\n", i);
64*08dc6394SMatthias Ringwald 	}
65*08dc6394SMatthias Ringwald }
66*08dc6394SMatthias Ringwald 
test1(void)67*08dc6394SMatthias Ringwald static void test1(void){
68*08dc6394SMatthias Ringwald 	fifo_init();
69*08dc6394SMatthias Ringwald 	fifo_add(1);
70*08dc6394SMatthias Ringwald 	fifo_dump();
71*08dc6394SMatthias Ringwald }
72*08dc6394SMatthias Ringwald 
test2(void)73*08dc6394SMatthias Ringwald static void test2(void){
74*08dc6394SMatthias Ringwald 	fifo_init();
75*08dc6394SMatthias Ringwald 	fifo_add(1);
76*08dc6394SMatthias Ringwald 	fifo_add(2);
77*08dc6394SMatthias Ringwald 	fifo_dump();
78*08dc6394SMatthias Ringwald }
79*08dc6394SMatthias Ringwald 
test3(void)80*08dc6394SMatthias Ringwald static void test3(void){
81*08dc6394SMatthias Ringwald 	fifo_init();
82*08dc6394SMatthias Ringwald 	fifo_add(1);
83*08dc6394SMatthias Ringwald 	int index;
84*08dc6394SMatthias Ringwald 	index = fifo_get_next();
85*08dc6394SMatthias Ringwald 	printf("got %u\n", index);
86*08dc6394SMatthias Ringwald 	fifo_add(2);
87*08dc6394SMatthias Ringwald 	fifo_add(1);
88*08dc6394SMatthias Ringwald 	fifo_add(0);
89*08dc6394SMatthias Ringwald 	fifo_dump();
90*08dc6394SMatthias Ringwald }
91*08dc6394SMatthias Ringwald 
main(int argc,const char ** argv)92*08dc6394SMatthias Ringwald int main(int argc, const char ** argv){
93*08dc6394SMatthias Ringwald 	(void) argc;
94*08dc6394SMatthias Ringwald 	(void) argv;
95*08dc6394SMatthias Ringwald 	test1();
96*08dc6394SMatthias Ringwald 	test2();
97*08dc6394SMatthias Ringwald 	test3();
98*08dc6394SMatthias Ringwald }
99