btstack/test/fifo/fifo.c
2017-11-04 21:41:53 +01:00

99 lines
2.4 KiB
C

#include <stdint.h>
#include <string.h>
#include <stdio.h>
#define L2CAP_FIXED_CHANNEL_TABLE_SIZE 3
#define FIXED_CHANNEL_FIFO_INVALID_INDEX 0xff
typedef struct l2cap_fixed_channel {
uint8_t waiting_for_can_send_now;
uint8_t next_request;
} l2cap_fixed_channel_t;
static l2cap_fixed_channel_t fixed_channels[L2CAP_FIXED_CHANNEL_TABLE_SIZE];
static uint8_t fixed_channel_head_index = FIXED_CHANNEL_FIFO_INVALID_INDEX;
static uint8_t fixed_channel_tail_index = FIXED_CHANNEL_FIFO_INVALID_INDEX;
static void fifo_init(void){
printf("\ninit\n");
memset(fixed_channels, 0, sizeof(fixed_channels));
int i;
for (i=0;i<L2CAP_FIXED_CHANNEL_TABLE_SIZE;i++){
fixed_channels[i].next_request = FIXED_CHANNEL_FIFO_INVALID_INDEX;
}
}
static void fifo_add(int index){
printf("add index %u\n", index);
// insert into queue
if (fixed_channel_tail_index == FIXED_CHANNEL_FIFO_INVALID_INDEX){
fixed_channel_head_index = index;
} else {
fixed_channels[fixed_channel_tail_index].next_request = index;
}
fixed_channel_tail_index = index;
fixed_channels[index].next_request = FIXED_CHANNEL_FIFO_INVALID_INDEX;
fixed_channels[index].waiting_for_can_send_now = 1;
}
static int fifo_get_next(void){
if (fixed_channel_head_index == FIXED_CHANNEL_FIFO_INVALID_INDEX) return -1;
int can_send = 0;
uint8_t i = fixed_channel_head_index;
if (fixed_channels[i].waiting_for_can_send_now){
can_send = 1;
}
fixed_channels[i].waiting_for_can_send_now = 0;
fixed_channel_head_index = fixed_channels[i].next_request;
fixed_channels[i].next_request = FIXED_CHANNEL_FIFO_INVALID_INDEX;
if (fixed_channel_head_index == FIXED_CHANNEL_FIFO_INVALID_INDEX){
fixed_channel_tail_index = FIXED_CHANNEL_FIFO_INVALID_INDEX;
}
if (can_send) {
return i;
}
return -1;
}
static void fifo_dump(void){
while (1){
int i = fifo_get_next();
if (i < 0) break;
printf("got index %u\n", i);
}
}
static void test1(void){
fifo_init();
fifo_add(1);
fifo_dump();
}
static void test2(void){
fifo_init();
fifo_add(1);
fifo_add(2);
fifo_dump();
}
static void test3(void){
fifo_init();
fifo_add(1);
int index;
index = fifo_get_next();
printf("got %u\n", index);
fifo_add(2);
fifo_add(1);
fifo_add(0);
fifo_dump();
}
int main(int argc, const char ** argv){
(void) argc;
(void) argv;
test1();
test2();
test3();
}