Передать шаблонную функцию в качестве параметра attachInterrupt

Итак, я хочу сделать что-то вроде этого:

template<int PIN, int CHANNEL>
void initPin() {
    attachInterrupt(PIN, rising<PIN, CHANNEL>, RISING);
}


template<int PIN, int CHANNEL>
void rising() {
    startTimes[CHANNEL] = micros();
    attachInterrupt(PIN, falling<PIN, CHANNEL>, FALLING);
}

template<int PIN, int CHANNEL>
void falling() {
    values[CHANNEL] = micros() - startTimes[CHANNEL];
    attachInterrupt(PIN, rising<PIN, CHANNEL>, RISING);
}

но компилятор выдает эту ошибку

no matches converting function ‘rising’ to type ‘void (*)()’

Можно ли это сделать, или мне придется писать все функции самому?

, 👍0


2 ответа


1

Попробуйте это:

template<int PIN, int CHANNEL> void initPin() {
    attachInterrupt(PIN, rising<PIN, CHANNEL>, RISING);
}


template<int PIN, int CHANNEL> void rising() {
    startTimes[CHANNEL] = micros();
    attachInterrupt(PIN, falling<PIN, CHANNEL>, FALLING);
}

template<int PIN, int CHANNEL> void falling() {
    values[CHANNEL] = micros() - startTimes[CHANNEL];
    attachInterrupt(PIN, rising<PIN, CHANNEL>, RISING);
}

На самом деле проблема заключается в препроцессоре Arduino. Он добавляет недопустимые предварительные объявления, если шаблонные функции отформатированы как исходный код.

,

1

Пожалуйста, посмотрите реализацию https://github.com/Yurik72/SimpleButton

Есть реализация, как назначить функцию с аргументами обработчику прерывания

,