Esempio n. 1
0
/**@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;
    }
}
Esempio n. 2
0
// 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);
}