So I want to do something like this:
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);
}
but the compiler gives me this error
no matches converting function ‘rising’ to type ‘void (*)()’
Can I even do this, or do I have to write all the functions by myself?
2 Answers 2
Try this:
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);
}
The problem is actually the Arduino preprocessor. It adds illegal forward declarations if template functions are formated as your original code.
Please have a look implementation https://github.com/Yurik72/SimpleButton
There are implementation how to assign function with arguments to interrupt handler