mirror of
https://github.com/bluekitchen/btstack.git
synced 2025-03-25 16:43:28 +00:00
esp32: use semaphore to let VHCI task pause until packet is processed by btstack
This commit is contained in:
parent
17b3e0b8c9
commit
8d8a3c37fb
@ -53,6 +53,7 @@
|
|||||||
|
|
||||||
#include "freertos/FreeRTOS.h"
|
#include "freertos/FreeRTOS.h"
|
||||||
#include "freertos/task.h"
|
#include "freertos/task.h"
|
||||||
|
#include "freertos/semphr.h"
|
||||||
|
|
||||||
uint32_t esp_log_timestamp();
|
uint32_t esp_log_timestamp();
|
||||||
|
|
||||||
@ -71,6 +72,8 @@ static int _can_send_packet_now = 1;
|
|||||||
static uint8_t * received_packet_data;
|
static uint8_t * received_packet_data;
|
||||||
static uint16_t received_packet_len;
|
static uint16_t received_packet_len;
|
||||||
|
|
||||||
|
static SemaphoreHandle_t packet_handled_notify;
|
||||||
|
|
||||||
static void (*transport_packet_handler)(uint8_t packet_type, uint8_t *packet, uint16_t size);
|
static void (*transport_packet_handler)(uint8_t packet_type, uint8_t *packet, uint16_t size);
|
||||||
|
|
||||||
// executed on main run loop
|
// executed on main run loop
|
||||||
@ -78,6 +81,9 @@ static void transport_deliver_packet(void *arg){
|
|||||||
log_info("transport_deliver_packet len %u", received_packet_len);
|
log_info("transport_deliver_packet len %u", received_packet_len);
|
||||||
// deliver packet
|
// deliver packet
|
||||||
transport_packet_handler(received_packet_data[0], &received_packet_data[1], received_packet_len-1);
|
transport_packet_handler(received_packet_data[0], &received_packet_data[1], received_packet_len-1);
|
||||||
|
log_info("transport_deliver_packet done");
|
||||||
|
// signal bluetooth task to continue
|
||||||
|
xSemaphoreGive(packet_handled_notify);
|
||||||
}
|
}
|
||||||
|
|
||||||
// executed on main run loop
|
// executed on main run loop
|
||||||
@ -87,19 +93,23 @@ static void transport_notify_packet_send(void *arg){
|
|||||||
transport_packet_handler(HCI_EVENT_PACKET, &event[0], sizeof(event));
|
transport_packet_handler(HCI_EVENT_PACKET, &event[0], sizeof(event));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// run from VHCI Task
|
||||||
static void host_send_pkt_available_cb(void){
|
static void host_send_pkt_available_cb(void){
|
||||||
_can_send_packet_now = 1;
|
_can_send_packet_now = 1;
|
||||||
log_debug("host_send_pkt_available_cb, setting _can_send_packet_now = %u", _can_send_packet_now);
|
// log_debug("host_send_pkt_available_cb, setting _can_send_packet_now = %u", _can_send_packet_now);
|
||||||
// notify upper stack that provided buffer can be used again
|
// notify upper stack that provided buffer can be used again
|
||||||
btstack_run_loop_freertos_single_threaded_execute_code_on_main_thread(&transport_notify_packet_send, NULL);
|
btstack_run_loop_freertos_single_threaded_execute_code_on_main_thread(&transport_notify_packet_send, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// run from VHCI Task
|
||||||
static int host_recv_pkt_cb(uint8_t *data, uint16_t len){
|
static int host_recv_pkt_cb(uint8_t *data, uint16_t len){
|
||||||
printf("host_recv_pkt_cb: %u bytes\n", len);
|
// log_info("host_recv_pkt_cb: %u bytes, type %u, begins %02x %02x", len, data[0], data[1], data[2]);
|
||||||
received_packet_data = data;
|
received_packet_data = data;
|
||||||
received_packet_len = len;
|
received_packet_len = len;
|
||||||
// probably will need mutex here
|
// probably will need mutex here
|
||||||
btstack_run_loop_freertos_single_threaded_execute_code_on_main_thread(&transport_deliver_packet, NULL);
|
btstack_run_loop_freertos_single_threaded_execute_code_on_main_thread(&transport_deliver_packet, NULL);
|
||||||
|
// wait until processed
|
||||||
|
xSemaphoreTake(packet_handled_notify, portMAX_DELAY);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -124,6 +134,9 @@ static int transport_open(void){
|
|||||||
|
|
||||||
log_info("transport_open");
|
log_info("transport_open");
|
||||||
|
|
||||||
|
// create
|
||||||
|
packet_handled_notify = xSemaphoreCreateBinary();
|
||||||
|
|
||||||
esp_bt_controller_init();
|
esp_bt_controller_init();
|
||||||
|
|
||||||
ret = esp_bt_controller_enable(ESP_BT_MODE_BTDM);
|
ret = esp_bt_controller_enable(ESP_BT_MODE_BTDM);
|
||||||
@ -153,7 +166,7 @@ static void transport_register_packet_handler(void (*handler)(uint8_t packet_typ
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int transport_can_send_packet_now(uint8_t packet_type) {
|
static int transport_can_send_packet_now(uint8_t packet_type) {
|
||||||
log_debug("transport_can_send_packet_now %u, esp_vhci_host_check_send_available %u\n", _can_send_packet_now, esp_vhci_host_check_send_available());
|
log_debug("transport_can_send_packet_now %u, esp_vhci_host_check_send_available %u", _can_send_packet_now, esp_vhci_host_check_send_available());
|
||||||
return _can_send_packet_now;
|
return _can_send_packet_now;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user