Hello, I'm a novice who just entered Nordic. I'm dealing with button input through bsp example now. And I am using sdk v17.
I succeeded in toggle LED by simply clicking button once, but I feel difficult in long press button.
I tried using the code from bsp.c, but I don't know how to modify it.
Is it correct to import and use the bsp_button_event_handler in bsp.c? For example, how do I modify the LED to toggle with the click of a button?
I'd really appreciate it if you could tell me in detail.
Thank you.
#include <stdbool.h> #include <stdint.h> #include "boards.h" #include "bsp.h" #include "app_timer.h" #include "nordic_common.h" #include "nrf_error.h" #include "nrf_log.h" #include "nrf_log_ctrl.h" #include "nrf_log_default_backends.h" //============================================================================================================================================================ #include "nrf_delay.h" //delay #include "bsp_config.h" //============================================================================================================================================================ APP_TIMER_DEF(m_bsp_button_tmr); static bsp_button_event_cfg_t m_events_list[BUTTONS_NUMBER] = {{BSP_EVENT_NOTHING, BSP_EVENT_NOTHING}}; static bsp_event_callback_t m_registered_callback = NULL; static void bsp_button_event_handler(uint8_t pin_no, uint8_t button_action) { bsp_event_t event = BSP_EVENT_NOTHING; uint32_t button = 0; //use button pin uint32_t err_code; static uint8_t current_long_push_pin_no; /**< Pin number of a currently pushed button, that could become a long push if held long enough. */ static bsp_event_t release_event_at_push[BUTTONS_NUMBER]; /**< Array of what the release event of each button was last time it was pushed, so that no release event is sent if the event was bound after the push of the button. */ button = bsp_board_pin_to_button_idx(pin_no); if (button < BUTTONS_NUMBER) { switch (button_action) { case APP_BUTTON_PUSH: event = m_events_list[button].push_event; if (m_events_list[button].long_push_event != BSP_EVENT_NOTHING) { err_code = app_timer_start(m_bsp_button_tmr, APP_TIMER_TICKS(BSP_LONG_PUSH_TIMEOUT_MS), (void*)¤t_long_push_pin_no); if (err_code == NRF_SUCCESS) { current_long_push_pin_no = pin_no; } } release_event_at_push[button] = m_events_list[button].release_event; break; case APP_BUTTON_RELEASE: (void)app_timer_stop(m_bsp_button_tmr); if (release_event_at_push[button] == m_events_list[button].release_event) { event = m_events_list[button].release_event; } break; case BSP_BUTTON_ACTION_LONG_PUSH: event = m_events_list[button].long_push_event; //LEDS_INVERT(BSP_LED_0_MASK); //LED1 Toggle } } if ((event != BSP_EVENT_NOTHING) && (m_registered_callback != NULL)) { m_registered_callback(event); } } /**@brief Function for initializing low frequency clock. */ void clock_initialization() { NRF_CLOCK->LFCLKSRC = (CLOCK_LFCLKSRC_SRC_Xtal << CLOCK_LFCLKSRC_SRC_Pos); NRF_CLOCK->EVENTS_LFCLKSTARTED = 0; NRF_CLOCK->TASKS_LFCLKSTART = 1; while (NRF_CLOCK->EVENTS_LFCLKSTARTED == 0) { // Do nothing. } } /**@brief Function for initializing bsp module. */ void bsp_configuration() { uint32_t err_code; //err_code = bsp_init(BSP_INIT_LEDS | BSP_INIT_BUTTONS, bsp_evt_handler); err_code = bsp_init(BSP_INIT_LEDS | BSP_INIT_BUTTONS, bsp_button_event_handler); APP_ERROR_CHECK(err_code); } /** * @brief Function for application main entry. */ int main(void) { clock_initialization(); err_code = app_timer_init(); APP_ERROR_CHECK(err_code); APP_ERROR_CHECK(NRF_LOG_INIT(NULL)); NRF_LOG_DEFAULT_BACKENDS_INIT(); NRF_LOG_INFO("BSP example started."); bsp_configuration(); while (true) { NRF_LOG_FLUSH(); __SEV(); __WFE(); __WFE(); // no implementation needed } }