mirror of
https://github.com/bluekitchen/btstack.git
synced 2025-01-26 03:35:20 +00:00
stm32-sx1280: handle PDU_DATA_LLCTRL_TYPE_CONN_UPDATE_IND, free tx packets on disconnect
This commit is contained in:
parent
2992f73460
commit
05dbef54c8
@ -488,6 +488,8 @@ static void radio_set_timer(uint32_t anchor_offset_us){
|
||||
|
||||
static void ll_terminate(void){
|
||||
ll_state = LL_STATE_STANDBY;
|
||||
ctx.conn_param_update_pending = false;
|
||||
ctx.channel_map_update_pending = false;
|
||||
// stop sync hop timer
|
||||
radio_stop_timer();
|
||||
// free outgoing tx packet
|
||||
@ -495,6 +497,15 @@ static void ll_terminate(void){
|
||||
btstack_memory_ll_pdu_free(ctx.tx_pdu);
|
||||
ctx.tx_pdu = NULL;
|
||||
}
|
||||
// free queued tx packets
|
||||
while (true){
|
||||
ll_pdu_t * tx_packet = (ll_pdu_t *) btstack_linked_queue_dequeue(&ctx.tx_queue);
|
||||
if (tx_packet != NULL) {
|
||||
btstack_memory_ll_pdu_free(tx_packet);
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
// disable auto tx
|
||||
Radio.StopAutoTx();
|
||||
// notify host stack
|
||||
@ -527,20 +538,27 @@ static void radio_timer_handler(void){
|
||||
ctx.channel_map_update_pending = false;
|
||||
}
|
||||
|
||||
if ( ctx.conn_param_update_pending && ((ctx.conn_param_update_instant) == ctx.connection_event) ) {
|
||||
if (ctx.conn_param_update_pending && ((ctx.conn_param_update_instant) == ctx.connection_event) ) {
|
||||
ctx.conn_interval_us = ctx.conn_param_update_interval_us;
|
||||
ctx.conn_latency = ctx.conn_param_update_latency;
|
||||
ctx.supervision_timeout_us = ctx.conn_param_update_timeout_us;
|
||||
ctx.conn_param_update_pending = false;
|
||||
|
||||
log_info("Conn param update now");
|
||||
|
||||
radio_stop_timer();
|
||||
ctx.synced = false;
|
||||
}
|
||||
|
||||
// restart radio timer (might get overwritten by first packet)
|
||||
radio_set_timer(ctx.conn_interval_us - SYNC_HOP_DELAY_US);
|
||||
if (ctx.synced){
|
||||
// restart radio timer (might get overwritten by first packet)
|
||||
radio_set_timer(ctx.conn_interval_us - SYNC_HOP_DELAY_US);
|
||||
|
||||
receive_master();
|
||||
receive_master();
|
||||
} else {
|
||||
// just wait longer
|
||||
receive_first_master();
|
||||
}
|
||||
|
||||
printf("--SYNC-Ch %02u-Event %04u - t %08u--\n", ctx.channel, ctx.connection_event, t0);
|
||||
break;
|
||||
@ -862,10 +880,21 @@ static void ll_handle_control(ll_pdu_t * rx_packet){
|
||||
printf("Queue Feature Rsp\n");
|
||||
break;
|
||||
case PDU_DATA_LLCTRL_TYPE_CHAN_MAP_IND:
|
||||
memcpy((uint8_t *) ctx.channel_map_update_map, &tx_packet->payload[1], 5);
|
||||
ctx.channel_map_update_instant = little_endian_read_16(tx_packet->payload, 6);
|
||||
memcpy((uint8_t *) ctx.channel_map_update_map, &rx_packet->payload[1], 5);
|
||||
ctx.channel_map_update_instant = little_endian_read_16(rx_packet->payload, 6);
|
||||
ctx.channel_map_update_pending = true;
|
||||
break;
|
||||
case PDU_DATA_LLCTRL_TYPE_CONN_UPDATE_IND:
|
||||
ctx.conn_param_update_win_size = tx_packet->payload[1];
|
||||
ctx.conn_param_update_win_offset = little_endian_read_16(rx_packet->payload, 2);
|
||||
ctx.conn_param_update_interval_us = little_endian_read_16(rx_packet->payload, 4) * 1250;
|
||||
ctx.conn_param_update_latency = little_endian_read_16(rx_packet->payload, 6);
|
||||
ctx.conn_param_update_timeout_us = little_endian_read_16(rx_packet->payload, 8) * 10000;
|
||||
ctx.conn_param_update_instant = little_endian_read_16(rx_packet->payload, 10);
|
||||
ctx.conn_param_update_pending = true;
|
||||
log_info("PDU_DATA_LLCTRL_TYPE_CONN_UPDATE_IND, conn interval %u us at instant %u",
|
||||
(unsigned int) ctx.conn_param_update_interval_us, ctx.conn_param_update_instant);
|
||||
break;
|
||||
case PDU_DATA_LLCTRL_TYPE_TERMINATE_IND:
|
||||
printf("Terminate!\n");
|
||||
ll_terminate();
|
||||
|
Loading…
x
Reference in New Issue
Block a user