diff --git a/src/mesh/mesh_access.c b/src/mesh/mesh_access.c index 9343b12bc..77aaf804a 100644 --- a/src/mesh/mesh_access.c +++ b/src/mesh/mesh_access.c @@ -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