mirror of
https://github.com/bluekitchen/btstack.git
synced 2025-01-07 09:55:45 +00:00
99 lines
2.4 KiB
C
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();
|
|
}
|