Button detection in callback

nRF52840, nRF Connect 

I was looking at the button example and it is apparently a little different then in the nRF5 SDK kit. In the SDK you had a callback and inside that you had pressed and released options. The button example does not go into details on how to implement this. Also i would like to use 1 callback for multiple buttons without hardcoding in values.

I am using the basic button example in nordic. Only difference is I adapted for 2 buttons. So if you see button in the example, i copy and pasted everything and made button1 and button 2. used SW0 and SW1

Right now I got it working by having a separate callback function per button. I know pins is a mask that has bit set of pin number associated with the button. So this following code would  work if the fact i get an error when i call button1.pin saying it needs to be a constant. If i exchange button1.pin and button2.pin with 11 and 12, then it works fine. but i am looking for a more dynamic method.

int mask_to_pin(uint32_t mask, int *pin){
	uint32_t val = mask;
	*pin = 0;

	while(val % 2 == 0){
		val /= 2;
		*pin = *pin + 1;
	}

	if(val == 1) return 0;
	return 1;
}

void button_pressed(const struct device *dev, struct gpio_callback *cb,
		    uint32_t pins){
	int err;
	int pin;

	err = mask_to_pin(pins, &pin);

	if(err){
		printk("pins is not a power of 2\n");
		return;
	}
	
	switch(pin){
		case button1.pin:		// button 1. hardcoded as i do not know how ot get this form info
			printk("Button 1 %d pressed at %" PRIu32 "\n", button1.pin, k_cycle_get_32());
			status_flags.bit.request_pair = 1;
			break;
		case button2.pin:		// button 2
			printk("Button 2 %d pressed at %" PRIu32 "\n", button2.pin, k_cycle_get_32());
			status_flags.bit.request_disconnect = 1;
			break;
	}
}

Related