50 lines
883 B
C++
50 lines
883 B
C++
#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
|