예제 #1
0
uint32_t app_simple_timer_start(app_simple_timer_mode_t            mode,
                                app_simple_timer_timeout_handler_t timeout_handler,
                                uint16_t                           timeout_ticks,
                                void *                             p_context)
{
    uint32_t err_code = NRF_SUCCESS;
    nrf_timer_short_mask_t timer_short;

    VERIFY_PARAM_NOT_NULL(timeout_handler);

    if (APP_SIMPLE_TIMER_MODE_REPEATED == mode)
    {
        timer_short = NRF_TIMER_SHORT_COMPARE0_CLEAR_MASK;
    }
    else if (APP_SIMPLE_TIMER_MODE_SINGLE_SHOT == mode)
    {
        timer_short = NRF_TIMER_SHORT_COMPARE0_STOP_MASK;
    }
    else
    {
        return NRF_ERROR_INVALID_PARAM;
    }

    if (SIMPLE_TIMER_STATE_IDLE == m_simple_timer_state)
    {
        return NRF_ERROR_INVALID_STATE;
    }

    if (SIMPLE_TIMER_STATE_STARTED == m_simple_timer_state)
    {
        err_code = app_simple_timer_stop();
        APP_ERROR_CHECK(err_code);
    }

    if (SIMPLE_TIMER_STATE_STOPPED == m_simple_timer_state)
    {
        nrf_drv_timer_clear(&SIMPLE_TIMER);
    }

    m_mode                      = mode;
    m_timeout_handler           = timeout_handler;
    mp_timeout_handler_context  = p_context;

    nrf_drv_timer_extended_compare(
            &SIMPLE_TIMER, NRF_TIMER_CC_CHANNEL0, (uint32_t)timeout_ticks, timer_short, true);

    if (m_simple_timer_state == SIMPLE_TIMER_STATE_STOPPED)
    {
        nrf_drv_timer_resume(&SIMPLE_TIMER);
    }
    else
    {
        nrf_drv_timer_enable(&SIMPLE_TIMER);
    }


    m_simple_timer_state = SIMPLE_TIMER_STATE_STARTED;

    return NRF_SUCCESS;
}
예제 #2
0
void timeout_handler(void * p_context)
{
    switch (m_state)
    {
        uint32_t err_code;
        
        case APP_STATE_SINGLE_SHOT:
            if (--m_state_transit_counter != 0)
            {            
                if (--m_toggle_led_counter == 0)
                {
                    m_toggle_led_counter = TOGGLE_LED_COUNTER;    
                    LEDS_INVERT(BSP_LED_0_MASK);                 
                }
                
                err_code = app_simple_timer_start(APP_SIMPLE_TIMER_MODE_SINGLE_SHOT, 
                                       timeout_handler, 
                                       TIMEOUT_VALUE, 
                                       NULL);            
                APP_ERROR_CHECK(err_code);                                                                                          
            }
            else
            {
                state_machine_state_change(APP_STATE_REPEATED);
            }        
            break;
            
        case APP_STATE_REPEATED:            
            if (--m_state_transit_counter != 0)
            {            
                if (--m_toggle_led_counter == 0)
                {
                    m_toggle_led_counter = TOGGLE_LED_COUNTER;                    
                    LEDS_INVERT(BSP_LED_1_MASK);
                }                
            }
            else
            {
                LEDS_ON(BSP_LED_0_MASK | BSP_LED_1_MASK);
                
                err_code = app_simple_timer_stop();
                APP_ERROR_CHECK(err_code);     
                
                nrf_delay_ms(GENERIC_DELAY_TIME);
                
                state_machine_state_change(APP_STATE_SINGLE_SHOT);
            }     
            break;

        default:
            APP_ERROR_HANDLER(m_state);
            break;
    }    
}