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