Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- struct GPIODescriptor {
- GPIO &gpio;
- const GPIOHandler handler;
- const char *name;
- };
- const unsigned int number_of_gpios = 5;
- const GPIODescriptor gpio_descriptors[number_of_gpios] = {
- GPIODescriptor{my_gpios[0], joy_down_irq_handler, "joy_down"},
- GPIODescriptor{my_gpios[1], joy_left_irq_handler, "joy_left"},
- GPIODescriptor{my_gpios[2], joy_up_irq_handler, "joy_up"},
- GPIODescriptor{my_gpios[3], joy_button_irq_handler, "joy_button"},
- GPIODescriptor{my_gpios[4], joy_right_irq_handler, "joy_right"},
- };
- bool request_threaded_irq(const GPIODescriptor &gpio_descriptor) {
- const auto irq = gpio_to_irq(gpio_descriptor.gpio);
- const auto error_code = request_threaded_irq(
- irq, gpio_descriptor.handler, NULL,
- IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING, gpio_descriptor.name, NULL);
- const bool was_successful = error_code >= 0;
- return was_successful;
- }
- unsigned int try_to_initialize_gpios() {
- unsigned int successfully_initialized_gpios = 0;
- for (unsigned int index = 0; index < number_of_gpios; index++) {
- const auto was_successful = request_threaded_irq(gpio_descriptors[index]);
- if (not was_successful)
- break;
- else
- successfully_initialized_gpios = index + 1;
- }
- return successfully_initialized_gpios;
- }
- void free_gpios(unsigned int up_to_gpio) {
- for (unsigned int index = 0; index < up_to_gpio; index++) {
- const auto irq = gpio_to_irq(gpio_descriptors[index].gpio);
- free_irq(irq, NULL);
- }
- }
- int initialize_gpios() {
- auto successfully_initialized_gpios = try_to_initialize_gpios();
- if (successfully_initialized_gpios != number_of_gpios) {
- free_gpios(successfully_initialized_gpios);
- irq_error();
- return -1;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment