Actually call on_reset callback
[lsnes.git] / include / library / gamepad.hpp
blob83e7f4d3ace75eeb3364909be8bc02261237e65b
1 #ifndef _library__gamepad__hpp__included__
2 #define _library__gamepad__hpp__included__
4 #include <functional>
5 #include <cstdint>
6 #include <set>
7 #include "json.hpp"
8 #include "threads.hpp"
10 namespace gamepad
12 class pad
14 public:
15 pad(const JSON::node& state, unsigned jnum);
16 pad(const std::string& _name, unsigned jnum);
17 ~pad();
18 unsigned add_axis(uint64_t id, int64_t min, int64_t max, bool pressure, const std::string& name);
19 unsigned add_button(uint64_t id, const std::string& name);
20 unsigned add_hat(uint64_t id, const std::string& name);
21 unsigned add_hat(uint64_t idx, uint64_t idy, int64_t mindev, const std::string& namex,
22 const std::string& namey);
23 unsigned axes() { return next_axis; }
24 unsigned buttons() { return next_button; }
25 unsigned hats() { return next_hat; }
26 void calibrate_axis(unsigned num, int64_t minus, int64_t zero, int64_t plus, int64_t neutral,
27 double threshold, bool pressure, bool disabled);
28 void get_calibration(unsigned num, int64_t& minus, int64_t& zero, int64_t& plus, int64_t& neutral,
29 double& threshold, bool& pressure, bool& disabled);
30 double get_tolerance(unsigned num);
31 int get_mode(unsigned num);
32 std::set<unsigned> online_axes();
33 std::set<unsigned> online_buttons();
34 std::set<unsigned> online_hats();
35 void axis_status(unsigned num, int64_t& raw, int16_t& scaled);
36 int button_status(unsigned num);
37 int hat_status(unsigned num);
38 void report_axis(uint64_t id, int64_t val);
39 void report_button(uint64_t id, bool val);
40 void report_hat(uint64_t id, int angle);
41 void set_online(bool status);
42 bool online() { return online_flag; }
43 const std::string& name() { return _name; }
44 void set_axis_cb(std::function<void(unsigned jnum, unsigned num, int16_t val)> fn)
46 axis_fn = fn;
48 void set_button_cb(std::function<void(unsigned jnum, unsigned num, bool val)> fn) { button_fn = fn; }
49 void set_hat_cb(std::function<void(unsigned jnum, unsigned num, unsigned val)> fn) { hat_fn = fn; }
50 void set_axismode_cb(std::function<void(unsigned jnum, unsigned num, int mode, double tolerance)> fn)
52 amode_fn = fn;
54 void set_newitem_cb(std::function<void(unsigned jnum, unsigned num, int type)> fn) { newitem_fn = fn; }
55 void load(const JSON::node& state);
56 JSON::node save();
57 std::string get_summary();
58 private:
59 struct axis_info
61 uint64_t id;
62 unsigned num;
63 int64_t minus;
64 int64_t zero;
65 int64_t plus;
66 int64_t neutral;
67 double threshold;
68 bool pressure;
69 bool disabled;
70 bool online;
71 std::string name;
72 int16_t state;
73 int64_t rstate;
75 struct button_info
77 uint64_t id;
78 unsigned num;
79 std::string name;
80 bool online;
81 bool state;
83 struct hat_info
85 bool axis;
86 uint64_t id;
87 uint64_t id2;
88 unsigned num;
89 int64_t mindev;
90 std::string name;
91 std::string name2;
92 unsigned state;
93 bool online;
95 pad(const pad&);
96 pad& operator=(const pad&);
97 std::function<void(unsigned jnum, unsigned num, int16_t val)> axis_fn;
98 std::function<void(unsigned jnum, unsigned num, bool val)> button_fn;
99 std::function<void(unsigned jnum, unsigned num, unsigned val)> hat_fn;
100 std::function<void(unsigned jnum, unsigned num, int mode, double tolerance)> amode_fn;
101 std::function<void(unsigned jnum, unsigned num, int type)> newitem_fn;
102 bool online_flag;
103 std::string _name;
104 std::map<uint64_t, axis_info> _axes;
105 std::map<uint64_t, hat_info*> _axes_hat;
106 std::map<uint64_t, button_info> _buttons;
107 std::map<uint64_t, hat_info> _hats;
108 unsigned next_axis;
109 unsigned next_button;
110 unsigned next_hat;
111 unsigned jid;
112 threads::lock mlock;
115 class set
117 public:
118 set();
119 ~set();
120 void load(const JSON::node& state);
121 JSON::node save();
122 unsigned gamepads();
123 pad& operator[](unsigned gpnum);
124 unsigned add(const std::string& name);
125 void set_axis_cb(std::function<void(unsigned jnum, unsigned num, int16_t val)> fn);
126 void set_button_cb(std::function<void(unsigned jnum, unsigned num, bool val)> fn);
127 void set_hat_cb(std::function<void(unsigned jnum, unsigned num, unsigned val)> fn);
128 void set_axismode_cb(std::function<void(unsigned jnum, unsigned num, int mode, double tolerance)> fn);
129 void set_newitem_cb(std::function<void(unsigned jnum, unsigned num, int type)> fn);
130 std::string get_summary();
131 void offline_all();
132 private:
133 set(const set&);
134 set& operator=(const set&);
135 std::function<void(unsigned jnum, unsigned num, int16_t val)> axis_fn;
136 std::function<void(unsigned jnum, unsigned num, bool val)> button_fn;
137 std::function<void(unsigned jnum, unsigned num, unsigned val)> hat_fn;
138 std::function<void(unsigned jnum, unsigned num, int mode, double tolerance)> amode_fn;
139 std::function<void(unsigned jnum, unsigned num, int type)> newitem_fn;
140 std::vector<pad*> _gamepads;
141 threads::lock mlock;
145 #endif