Pico-Arduino
Interrupts.h
1 #ifndef W_INTERRUPTS_CPP
2 #define W_INTERRUPTS_CPP
3 #ifdef __cplusplus
4 
5 #include <stdlib.h>
6 #include <stdbool.h>
7 #include <stdint.h>
8 #include "Common.h"
9 
10 namespace arduino {
11 
12 template <typename T>
13 using voidTemplateFuncPtrParam = void (*)(T param);
14 
15 template<typename T> struct __container__ {
16  void* param;
17  voidTemplateFuncPtrParam<T> function;
18 };
19 
20 // C++ only overloaded version of attachInterrupt function
21 template<typename T> void attachInterrupt(pin_size_t interruptNum, voidTemplateFuncPtrParam<T> userFunc, PinStatus mode, T& param) {
22 
23  struct __container__<T> *cont = new __container__<T>();
24  cont->param = &param;
25  cont->function = userFunc;
26 
27  // TODO: check lambda scope
28  // TODO: add structure to delete(__container__) when detachInterrupt() is called
29  auto f = [](void* a) -> void
30  {
31  T param = *(T*)((struct __container__<T>*)a)->param;
32  (((struct __container__<T>*)a)->function)(param);
33  };
34 
35  attachInterruptParam(interruptNum, f, mode, cont);
36 }
37 
38 template<typename T> void attachInterrupt(pin_size_t interruptNum, voidTemplateFuncPtrParam<T*> userFunc, PinStatus mode, T* param) {
39  attachInterruptParam(interruptNum, (voidFuncPtrParam)userFunc, mode, (void*)param);
40 }
41 
42 }
43 #endif
44 #endif