Example #1
0
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]);
    }
}
Example #2
0
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);
}
Example #3
0
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]);
    }
}