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; }
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; } }