mirror of
https://github.com/bluekitchen/btstack.git
synced 2025-04-25 09:02:30 +00:00
mesh: inline mesh_access_x getters for acknowledged messages
This commit is contained in:
parent
2ddfd9e22b
commit
e1c526dc32
@ -119,92 +119,14 @@ uint32_t mesh_access_acknowledged_message_timeout_ms(void){
|
|||||||
#define MESH_ACCESS_OPCODE_INVALID 0xFFFFFFFFu
|
#define MESH_ACCESS_OPCODE_INVALID 0xFFFFFFFFu
|
||||||
#define MESH_ACCESS_OPCODE_NOT_SET 0xFFFFFFFEu
|
#define MESH_ACCESS_OPCODE_NOT_SET 0xFFFFFFFEu
|
||||||
|
|
||||||
static uint32_t mesh_access_message_ack_opcode(mesh_pdu_t * pdu){
|
|
||||||
switch (pdu->pdu_type){
|
|
||||||
case MESH_PDU_TYPE_TRANSPORT:
|
|
||||||
return ((mesh_transport_pdu_t *)pdu)->ack_opcode;
|
|
||||||
case MESH_PDU_TYPE_SEGMENTED:
|
|
||||||
return ((mesh_segmented_pdu_t *)pdu)->ack_opcode;
|
|
||||||
default:
|
|
||||||
btstack_assert(0);
|
|
||||||
return MESH_ACCESS_OPCODE_INVALID;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void mesh_access_message_set_ack_opcode(mesh_pdu_t * pdu, uint32_t ack_opcode){
|
|
||||||
switch (pdu->pdu_type){
|
|
||||||
case MESH_PDU_TYPE_TRANSPORT:
|
|
||||||
((mesh_transport_pdu_t *)pdu)->ack_opcode = ack_opcode;
|
|
||||||
break;
|
|
||||||
case MESH_PDU_TYPE_SEGMENTED:
|
|
||||||
((mesh_segmented_pdu_t *)pdu)->ack_opcode = ack_opcode;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
btstack_assert(0);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static uint8_t mesh_access_message_retransmit_count(mesh_pdu_t * pdu){
|
|
||||||
switch (pdu->pdu_type){
|
|
||||||
case MESH_PDU_TYPE_TRANSPORT:
|
|
||||||
return ((mesh_transport_pdu_t *)pdu)->retransmit_count;
|
|
||||||
case MESH_PDU_TYPE_SEGMENTED:
|
|
||||||
return ((mesh_segmented_pdu_t *)pdu)->retransmit_count;
|
|
||||||
default:
|
|
||||||
btstack_assert(0);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void mesh_access_message_set_retransmit_count(mesh_pdu_t * pdu, uint8_t retransmit_count){
|
|
||||||
switch (pdu->pdu_type){
|
|
||||||
case MESH_PDU_TYPE_TRANSPORT:
|
|
||||||
((mesh_transport_pdu_t *)pdu)->retransmit_count = retransmit_count;
|
|
||||||
break;
|
|
||||||
case MESH_PDU_TYPE_SEGMENTED:
|
|
||||||
((mesh_segmented_pdu_t *)pdu)->retransmit_count = retransmit_count;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
btstack_assert(0);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static uint32_t mesh_access_message_retransmit_timeout_ms(mesh_pdu_t * pdu){
|
|
||||||
switch (pdu->pdu_type){
|
|
||||||
case MESH_PDU_TYPE_TRANSPORT:
|
|
||||||
return ((mesh_transport_pdu_t *)pdu)->retransmit_timeout_ms;
|
|
||||||
case MESH_PDU_TYPE_SEGMENTED:
|
|
||||||
return ((mesh_segmented_pdu_t *)pdu)->retransmit_timeout_ms;
|
|
||||||
default:
|
|
||||||
btstack_assert(0);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void mesh_access_message_set_retransmit_timeout_ms(mesh_pdu_t * pdu, uint32_t retransmit_timeout_ms){
|
|
||||||
switch (pdu->pdu_type){
|
|
||||||
case MESH_PDU_TYPE_TRANSPORT:
|
|
||||||
((mesh_transport_pdu_t *)pdu)->retransmit_timeout_ms = retransmit_timeout_ms;
|
|
||||||
break;
|
|
||||||
case MESH_PDU_TYPE_SEGMENTED:
|
|
||||||
((mesh_segmented_pdu_t *)pdu)->retransmit_timeout_ms = retransmit_timeout_ms;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
btstack_assert(0);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void mesh_access_send_unacknowledged_pdu(mesh_pdu_t * pdu){
|
void mesh_access_send_unacknowledged_pdu(mesh_pdu_t * pdu){
|
||||||
mesh_access_message_set_ack_opcode(pdu, MESH_ACCESS_OPCODE_INVALID);
|
((mesh_upper_transport_pdu_t *) pdu)->ack_opcode = MESH_ACCESS_OPCODE_INVALID;
|
||||||
mesh_upper_transport_send_access_pdu(pdu);
|
mesh_upper_transport_send_access_pdu(pdu);
|
||||||
}
|
}
|
||||||
|
|
||||||
void mesh_access_send_acknowledged_pdu(mesh_pdu_t * pdu, uint8_t retransmissions, uint32_t ack_opcode){
|
void mesh_access_send_acknowledged_pdu(mesh_pdu_t * pdu, uint8_t retransmissions, uint32_t ack_opcode){
|
||||||
mesh_access_message_set_retransmit_count(pdu, retransmissions);
|
((mesh_upper_transport_pdu_t *) pdu)->retransmit_count = retransmissions;
|
||||||
mesh_access_message_set_ack_opcode(pdu, ack_opcode);
|
((mesh_upper_transport_pdu_t *) pdu)->ack_opcode = ack_opcode;
|
||||||
|
|
||||||
mesh_upper_transport_send_access_pdu(pdu);
|
mesh_upper_transport_send_access_pdu(pdu);
|
||||||
}
|
}
|
||||||
@ -221,14 +143,14 @@ static void mesh_access_acknowledged_run(btstack_timer_source_t * ts){
|
|||||||
btstack_linked_list_iterator_init(&ack_it, &mesh_access_acknowledged_messages);
|
btstack_linked_list_iterator_init(&ack_it, &mesh_access_acknowledged_messages);
|
||||||
while (btstack_linked_list_iterator_has_next(&ack_it)){
|
while (btstack_linked_list_iterator_has_next(&ack_it)){
|
||||||
mesh_pdu_t * pdu = (mesh_pdu_t *) btstack_linked_list_iterator_next(&ack_it);
|
mesh_pdu_t * pdu = (mesh_pdu_t *) btstack_linked_list_iterator_next(&ack_it);
|
||||||
uint32_t retransmit_timeout_ms = mesh_access_message_retransmit_timeout_ms(pdu);
|
uint32_t retransmit_timeout_ms = ((mesh_upper_transport_pdu_t *) pdu)->retransmit_timeout_ms;
|
||||||
if (btstack_time_delta(now, retransmit_timeout_ms) >= 0) {
|
if (btstack_time_delta(now, retransmit_timeout_ms) >= 0) {
|
||||||
// remove from list
|
// remove from list
|
||||||
btstack_linked_list_remove(&mesh_access_acknowledged_messages, (btstack_linked_item_t*) pdu);
|
btstack_linked_list_remove(&mesh_access_acknowledged_messages, (btstack_linked_item_t*) pdu);
|
||||||
// retransmit or report failure
|
// retransmit or report failure
|
||||||
uint8_t retransmit_count = mesh_access_message_retransmit_count(pdu);
|
uint8_t retransmit_count = ((mesh_upper_transport_pdu_t *) pdu)->retransmit_count;
|
||||||
if (retransmit_count){
|
if (retransmit_count){
|
||||||
mesh_access_message_set_retransmit_count(pdu, retransmit_count - 1);
|
((mesh_upper_transport_pdu_t *) pdu)->retransmit_count = retransmit_count - 1;
|
||||||
mesh_upper_transport_send_access_pdu(pdu);
|
mesh_upper_transport_send_access_pdu(pdu);
|
||||||
} else {
|
} else {
|
||||||
// find correct model and emit error
|
// find correct model and emit error
|
||||||
@ -242,7 +164,7 @@ static void mesh_access_acknowledged_run(btstack_timer_source_t * ts){
|
|||||||
while (mesh_model_iterator_has_next(&model_it)){
|
while (mesh_model_iterator_has_next(&model_it)){
|
||||||
mesh_model_t * model = mesh_model_iterator_next(&model_it);
|
mesh_model_t * model = mesh_model_iterator_next(&model_it);
|
||||||
// find opcode in table
|
// find opcode in table
|
||||||
uint32_t ack_opcode = mesh_access_message_ack_opcode(pdu);
|
uint32_t ack_opcode = ((mesh_upper_transport_pdu_t *) pdu)->ack_opcode;
|
||||||
const mesh_operation_t * operation = mesh_model_lookup_operation_by_opcode(model, ack_opcode);
|
const mesh_operation_t * operation = mesh_model_lookup_operation_by_opcode(model, ack_opcode);
|
||||||
if (operation == NULL) continue;
|
if (operation == NULL) continue;
|
||||||
if (model->model_packet_handler == NULL) continue;
|
if (model->model_packet_handler == NULL) continue;
|
||||||
@ -271,7 +193,7 @@ static void mesh_access_acknowledged_run(btstack_timer_source_t * ts){
|
|||||||
int32_t next_timeout_ms = 0;
|
int32_t next_timeout_ms = 0;
|
||||||
while (btstack_linked_list_iterator_has_next(&ack_it)){
|
while (btstack_linked_list_iterator_has_next(&ack_it)){
|
||||||
mesh_pdu_t * pdu = (mesh_pdu_t *) btstack_linked_list_iterator_next(&ack_it);
|
mesh_pdu_t * pdu = (mesh_pdu_t *) btstack_linked_list_iterator_next(&ack_it);
|
||||||
uint32_t retransmit_timeout_ms = mesh_access_message_retransmit_timeout_ms(pdu);
|
uint32_t retransmit_timeout_ms = ((mesh_upper_transport_pdu_t *) pdu)->retransmit_timeout_ms;
|
||||||
int32_t timeout_delta_ms = btstack_time_delta(retransmit_timeout_ms, now);
|
int32_t timeout_delta_ms = btstack_time_delta(retransmit_timeout_ms, now);
|
||||||
if (next_timeout_ms == 0 || timeout_delta_ms < next_timeout_ms){
|
if (next_timeout_ms == 0 || timeout_delta_ms < next_timeout_ms){
|
||||||
next_timeout_ms = timeout_delta_ms;
|
next_timeout_ms = timeout_delta_ms;
|
||||||
@ -297,7 +219,7 @@ static void mesh_access_acknowledged_received(uint16_t rx_src, uint32_t opcode){
|
|||||||
mesh_pdu_t * tx_pdu = (mesh_pdu_t *) btstack_linked_list_iterator_next(&ack_it);
|
mesh_pdu_t * tx_pdu = (mesh_pdu_t *) btstack_linked_list_iterator_next(&ack_it);
|
||||||
uint16_t tx_dest = mesh_pdu_dst(tx_pdu);
|
uint16_t tx_dest = mesh_pdu_dst(tx_pdu);
|
||||||
if (tx_dest != rx_src) continue;
|
if (tx_dest != rx_src) continue;
|
||||||
if (mesh_access_message_ack_opcode(tx_pdu) != opcode) continue;
|
if (((mesh_upper_transport_pdu_t *) tx_pdu)->ack_opcode != opcode) continue;
|
||||||
// got expected response from dest, remove from outgoing messages
|
// got expected response from dest, remove from outgoing messages
|
||||||
mesh_upper_transport_pdu_free(tx_pdu);
|
mesh_upper_transport_pdu_free(tx_pdu);
|
||||||
return;
|
return;
|
||||||
@ -312,12 +234,16 @@ static void mesh_access_upper_transport_handler(mesh_transport_callback_type_t c
|
|||||||
break;
|
break;
|
||||||
case MESH_TRANSPORT_PDU_SENT:
|
case MESH_TRANSPORT_PDU_SENT:
|
||||||
// unacknowledged -> free
|
// unacknowledged -> free
|
||||||
if (mesh_access_message_ack_opcode(pdu) == MESH_ACCESS_OPCODE_INVALID){
|
{
|
||||||
|
if (((mesh_upper_transport_pdu_t *) pdu)->ack_opcode == MESH_ACCESS_OPCODE_INVALID){
|
||||||
mesh_upper_transport_pdu_free(pdu);
|
mesh_upper_transport_pdu_free(pdu);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
// setup timeout
|
// setup timeout
|
||||||
mesh_access_message_set_retransmit_timeout_ms(pdu, btstack_run_loop_get_time_ms() + mesh_access_acknowledged_message_timeout_ms());
|
uint32_t retransmitTimeoutMs =
|
||||||
|
btstack_run_loop_get_time_ms() + mesh_access_acknowledged_message_timeout_ms();
|
||||||
|
((mesh_upper_transport_pdu_t *) pdu)->retransmit_timeout_ms = retransmitTimeoutMs;
|
||||||
// add to mesh_access_acknowledged_messages
|
// add to mesh_access_acknowledged_messages
|
||||||
btstack_linked_list_add(&mesh_access_acknowledged_messages, (btstack_linked_item_t *) pdu);
|
btstack_linked_list_add(&mesh_access_acknowledged_messages, (btstack_linked_item_t *) pdu);
|
||||||
// update timer
|
// update timer
|
||||||
|
Loading…
x
Reference in New Issue
Block a user