/**@brief Function for TX state machine event processing in a state centric manner. * * @param[in] event Type of event occurred. */ static void tx_sm_event_handle(tx_event_t event) { uint32_t err_code; switch (m_tx_state) { case TX_STATE_IDLE: if (event == TX_EVENT_STATE_ENTRY) { err_code = app_timer_stop(m_app_timer_id); APP_ERROR_CHECK(err_code); // Send TX-done event if registered handler exists. if (m_transport_tx_done_handle != NULL) { m_transport_tx_done_handle(m_tx_done_result_code); } } break; case TX_STATE_PENDING: if (event == TX_EVENT_SLIP_TX_DONE) { // @note: this call should always succeed as called from HCI_SLIP_TX_DONE context // and error cases are managed by dedicated error event from the slip layer. err_code = hci_slip_write(mp_tx_buffer, (m_tx_buffer_length + PKT_HDR_SIZE + PKT_CRC_SIZE)); APP_ERROR_CHECK(err_code); tx_sm_state_change(TX_STATE_ACTIVE); } break; case TX_STATE_ACTIVE: switch (event) { case TX_EVENT_VALID_RX_ACK: // Tx sequence number counter incremented as packet transmission // acknowledged by peer transport entity. packet_number_tx_inc(); tx_sm_state_change(TX_STATE_IDLE); break; case TX_EVENT_STATE_ENTRY: m_tx_retry_counter = 0; err_code = app_timer_start(m_app_timer_id, RETRANSMISSION_TIMEOUT_IN_TICKS, NULL); APP_ERROR_CHECK(err_code); break; case TX_EVENT_TIMEOUT: if (m_tx_retry_counter != MAX_RETRY_COUNT) { ++m_tx_retry_counter; // @note: no return value check done for hci_slip_write(...) call as current // system design allows use case where retransmission is not accepted by the // slip layer due to existing acknowledgement packet transmission in the // slip layer. UNUSED_VARIABLE(hci_slip_write(mp_tx_buffer, (m_tx_buffer_length + PKT_HDR_SIZE + PKT_CRC_SIZE))); } else { // Application packet retransmission count reached: // - set correct TX done event callback function result code // - execute state change // @note: m_tx_retry_counter is reset in TX_STATE_ACTIVE state entry. m_tx_done_result_code = HCI_TRANSPORT_TX_DONE_FAILURE; tx_sm_state_change(TX_STATE_IDLE); } break; default: // No implementation needed. break; } break; default: // No implementation needed. break; } }
// Start the timers static void timers_start(void) { uint32_t err_code = app_timer_start(test_timer, BLINK_RATE, NULL); APP_ERROR_CHECK(err_code); }