#ifndef W_INTERRUPTS_CPP #define W_INTERRUPTS_CPP #ifdef __cplusplus #include #include #include #include "Common.h" namespace arduino { template using voidTemplateFuncPtrParam = void (*)(T param); template struct __container__ { void* param; voidTemplateFuncPtrParam function; }; // C++ only overloaded version of attachInterrupt function template void attachInterrupt(pin_size_t interruptNum, voidTemplateFuncPtrParam userFunc, PinStatus mode, T& param) { struct __container__ *cont = new __container__(); cont->param = ¶m; cont->function = userFunc; // TODO: check lambda scope // TODO: add structure to delete(__container__) when detachInterrupt() is called auto f = [](void* a) -> void { T param = *(T*)((struct __container__*)a)->param; (((struct __container__*)a)->function)(param); }; attachInterruptParam(interruptNum, f, mode, cont); } template void attachInterrupt(pin_size_t interruptNum, voidTemplateFuncPtrParam userFunc, PinStatus mode, T* param) { attachInterruptParam(interruptNum, (voidFuncPtrParam)userFunc, mode, (void*)param); } } #endif #endif