1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
| #ifndef DEBOUNCE_H
| #define DEBOUNCE_H
|
| #include <thread>
| #include <unordered_map>
| #include <functional>
| #include "Signal.hh"
|
| #define MIN_WAIT_TIME 50
| #define MAX_WAIT_TIME 500
|
| #ifdef __wasm32__
| extern "C" {
| int set_timeout(int ms, void *ctx);
| void clear_timeout(int timeout);
| void on_timeout(void *ctx);
| };
| #endif
|
| class Debounce {
| public:
| static std::shared_ptr<Debounce> getShared();
|
| Debounce();
| ~Debounce();
|
| void add(void *key, std::function<void()> cb);
| void remove(void *key);
| void trigger();
| void notify();
|
| private:
| bool mRunning;
| std::mutex mMutex;
| #ifdef __wasm32__
| int mTimeout;
| #else
| Signal mWaitSignal;
| std::thread mThread;
| #endif
| std::unordered_map<void *, std::function<void()>> mCallbacks;
| std::chrono::time_point<std::chrono::steady_clock> mLastTime;
|
| void loop();
| void notifyIfReady();
| void wait();
| };
|
| #endif
|
|