mesh: inline mesh_access_x getters for acknowledged messages

This commit is contained in:
Matthias Ringwald 2020-03-28 22:30:02 +01:00
parent 2ddfd9e22b
commit e1c526dc32

View File

@ -119,92 +119,14 @@ uint32_t mesh_access_acknowledged_message_timeout_ms(void){
#define MESH_ACCESS_OPCODE_INVALID 0xFFFFFFFFu
#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){
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);
}
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_access_message_set_ack_opcode(pdu, ack_opcode);
((mesh_upper_transport_pdu_t *) pdu)->retransmit_count = retransmissions;
((mesh_upper_transport_pdu_t *) pdu)->ack_opcode = ack_opcode;
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);
while (btstack_linked_list_iterator_has_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) {
// remove from list
btstack_linked_list_remove(&mesh_access_acknowledged_messages, (btstack_linked_item_t*) pdu);
// 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){
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);
} else {
// 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)){
mesh_model_t * model = mesh_model_iterator_next(&model_it);
// 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);
if (operation == 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;
while (btstack_linked_list_iterator_has_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);
if (next_timeout_ms == 0 || timeout_delta_ms < next_timeout_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);
uint16_t tx_dest = mesh_pdu_dst(tx_pdu);
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
mesh_upper_transport_pdu_free(tx_pdu);
return;
@ -312,12 +234,16 @@ static void mesh_access_upper_transport_handler(mesh_transport_callback_type_t c
break;
case MESH_TRANSPORT_PDU_SENT:
// 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);
break;
}
}
// 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
btstack_linked_list_add(&mesh_access_acknowledged_messages, (btstack_linked_item_t *) pdu);
// update timer