void Gpio::interruptFunction(uint32_t groupId, uint32_t groupMask) { int8_t groupIndex = groupId2groupIndex(groupId); int8_t pinId = __builtin_ctz(groupMask); int8_t pinIndex = pinId | (groupIndex << 5); if (groupIndex < 0) { return; } if (_callback[pinIndex] != NULL) { _callback[pinIndex](_user[pinIndex]); } }
void Gpio::enableInterrupt(IGpio_Callback_t callback, void *user) { int groupIndex = groupId2groupIndex(pio_get_pin_group_id(_pin)); if (groupIndex < 0) { return; } _callback[groupIndex][_pin] = callback; _user[groupIndex][_pin] = user; // Todo: // pio_handler_set_pin(_pin, (PIO_PULLUP | PIO_DEBOUNCE | PIO_IT_RISE_EDGE), staticISR); pio_handler_set_pin(_pin, PIO_IT_FALL_EDGE, staticISR); pio_enable_pin_interrupt(_pin); }
void Gpio::staticISR(uint32_t groupId, uint32_t groupMask) { int groupIndex = groupId2groupIndex(groupId); uint8_t pinIndex = 0; if (groupIndex < 0) { return; } if (groupMask > 0) { while (groupMask >>= 1) { pinIndex++; } } if (_callback[groupIndex][pinIndex]) { _callback[groupIndex][pinIndex](_user[groupIndex][pinIndex]); } }