GPIO event, App button

Hi there,

I have the configuration that I have a motion detector connected to a GPIO-PIN of the BM833. Now, when the motion detector detects motion, it will set the GPIO PIN's line to high, else it will be low. I want an interrupt to be issued when this happens.

As I already use the "button app" (because the device also has a button), I thought to add a second button. This works after starting to get a motion event once, but fails after that to detect motion ever after again (until reset).

I also tried handling with GPIO event (MOTACTIVE), but then, this event handler is never called.

Here relevant code pieces:


#ifdef MOTACTIVE    //be a GPIO PIN
#define NUM_OF_BUTTONS 1
//Configure 1 button with pullup and detection on low state
static const app_button_cfg_t app_buttons[NUM_OF_BUTTONS] = 
{
    {__bt1, false, BUTTON_PULL, button_event_handler},
};

//static void mot_handler(nrfx_gpiote_pin_t pin, nrf_gpiote_polarity_t action)
{
	NRF_LOG_INFO("GPIO input event callback");
        //sd_nvic_SystemReset();
        //NVIC_SystemReset();
        //nrf_gpio_cfg_output(pin_no);
        //nrf_gpio_pin_clear(pin_no);
        //nrf_delay_ms(50);
        //nrf_gpio_cfg_input(pin_no, NRF_GPIO_PIN_PULLDOWN );
        //APP_ERROR_CHECK(err_code);
}
#else   //be a button
#define NUM_OF_BUTTONS 2
static const app_button_cfg_t app_buttons[NUM_OF_BUTTONS] = 
{
    {__bt1, false, BUTTON_PULL, button_event_handler},
    {__mot, APP_BUTTON_ACTIVE_LOW, NRF_GPIO_PIN_PULLDOWN , mot_handler}
};

static void mot_handler(uint8_t pin_no, uint8_t button_action)
{
	NRF_LOG_INFO("GPIO input event callback");
        //sd_nvic_SystemReset();
        //NVIC_SystemReset();
        //app_button_disable();
        //nrf_gpio_cfg_output(pin_no);
        //nrf_gpio_pin_clear(pin_no);
        //nrf_delay_ms(50);
        //nrf_gpio_cfg_input(pin_no, NRF_GPIO_PIN_PULLDOWN );
        //APP_ERROR_CHECK(err_code);
        //app_button_enable();
}
#endif


int main(void)
{

    (...)

    //init app_button module, 50ms detection delay (button debouncing)
    err_code = app_button_init((app_button_cfg_t *)app_buttons, NUM_OF_BUTTONS, APP_TIMER_TICKS(50));
    APP_ERROR_CHECK(err_code);

    err_code = app_button_enable();
    APP_ERROR_CHECK(err_code);

    
    #ifdef MOTACTIVE
    //err_code=nrfx_gpiote_init();
    //APP_ERROR_CHECK(err_code);

    nrfx_gpiote_in_config_t p_config;
    p_config.hi_accuracy=0;
    p_config.is_watcher=0;
    p_config.pull=NRF_GPIO_PIN_PULLDOWN;
    p_config.skip_gpio_setup=1;
    p_config.sense=NRF_GPIOTE_POLARITY_TOGGLE;

    err_code=nrfx_gpiote_in_init(__mot, &p_config, mot_handler);
    APP_ERROR_CHECK(err_code);
    nrfx_gpiote_in_event_enable(__mot, true);
    #endif
    
    (...)
}
    

How could I achieve to get the event to be "ready" again without doing a reset?

Best regards,

Richard

Related