Repository navigation
Expand file tree
/
Copy pathSysbotBase3_ProController.h
More file actions
239 lines (203 loc) · 7.54 KB
/
Copy pathSysbotBase3_ProController.h
File metadata and controls
239 lines (203 loc) · 7.54 KB
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
/* Nintendo Switch Pro Controller (SysbotBase 3)
*
* From: https://github.com/PokemonAutomation/
*
*/
#ifndef PokemonAutomation_NintendoSwitch_ProController_SysbotBase3_H
#define PokemonAutomation_NintendoSwitch_ProController_SysbotBase3_H
#include "Common/Cpp/Concurrency/ConditionVariable.h"
#include "NintendoSwitch/NintendoSwitch_Settings.h"
//#include "NintendoSwitch/Controllers/NintendoSwitch_VirtualControllerState.h"
#include "NintendoSwitch/Controllers/Procon/NintendoSwitch_ProController.h"
#include "NintendoSwitch/Controllers/NintendoSwitch_ControllerWithScheduler.h"
#include "SysbotBase_Connection.h"
namespace PokemonAutomation{
namespace NintendoSwitch{
class ProController_SysbotBase3 final :
public ProController,
public ControllerWithScheduler,
private SysbotBase::TcpSysbotBase_Connection::Listener
{
public:
using ContextType = ProControllerContext;
static constexpr size_t QUEUE_SIZE = 64;
public:
ProController_SysbotBase3(
Logger& logger,
SysbotBase::TcpSysbotBase_Connection& connection
);
~ProController_SysbotBase3();
public:
// virtual ControllerType controller_type() const override{
// return ControllerType::NintendoSwitch_WiredController;
// }
virtual ControllerPerformanceClass performance_class() const override{
return ControllerPerformanceClass::SerialPABotBase_Wired;
}
virtual Milliseconds ticksize() const override{
return Milliseconds::zero();
}
virtual Milliseconds cooldown() const override{
return Milliseconds(8);
}
virtual Milliseconds timing_variation() const override{
return ConsoleSettings::instance().TIMING_OPTIONS.WIRED;
}
virtual bool atomic_multibutton() const override{
return true;
}
public:
virtual void cancel_all_commands() override;
virtual void replace_on_next_command() override;
virtual void wait_for_all(Cancellable* cancellable) override;
public:
// Superscalar Commands (the "ssf" framework)
virtual void issue_barrier(Cancellable* cancellable) override{
ControllerWithScheduler::issue_barrier(cancellable);
}
virtual void issue_nop(Cancellable* cancellable, Milliseconds duration) override{
ControllerWithScheduler::issue_nop(cancellable, duration);
}
virtual void issue_buttons(
Cancellable* cancellable,
Milliseconds delay, Milliseconds hold, Milliseconds cooldown,
Button button
) override{
ControllerWithScheduler::issue_buttons(cancellable, delay, hold, cooldown, button);
}
virtual void issue_dpad(
Cancellable* cancellable,
Milliseconds delay, Milliseconds hold, Milliseconds cooldown,
DpadPosition position
) override{
ControllerWithScheduler::issue_dpad(cancellable, delay, hold, cooldown, position);
}
virtual void issue_left_joystick(
Cancellable* cancellable,
Milliseconds delay, Milliseconds hold, Milliseconds cooldown,
const JoystickPosition& position
) override{
ControllerWithScheduler::issue_left_joystick(cancellable, delay, hold, cooldown, position);
}
virtual void issue_right_joystick(
Cancellable* cancellable,
Milliseconds delay, Milliseconds hold, Milliseconds cooldown,
const JoystickPosition& position
) override{
ControllerWithScheduler::issue_right_joystick(cancellable, delay, hold, cooldown, position);
}
virtual void issue_gyro_accel_x(
Cancellable* cancellable,
Milliseconds delay, Milliseconds hold, Milliseconds cooldown,
int16_t value
) override{
ControllerWithScheduler::issue_gyro_accel_x(cancellable, delay, hold, cooldown, value);
}
virtual void issue_gyro_accel_y(
Cancellable* cancellable,
Milliseconds delay, Milliseconds hold, Milliseconds cooldown,
int16_t value
) override{
ControllerWithScheduler::issue_gyro_accel_y(cancellable, delay, hold, cooldown, value);
}
virtual void issue_gyro_accel_z(
Cancellable* cancellable,
Milliseconds delay, Milliseconds hold, Milliseconds cooldown,
int16_t value
) override{
ControllerWithScheduler::issue_gyro_accel_z(cancellable, delay, hold, cooldown, value);
}
virtual void issue_gyro_rotate_x(
Cancellable* cancellable,
Milliseconds delay, Milliseconds hold, Milliseconds cooldown,
int16_t value
) override{
ControllerWithScheduler::issue_gyro_rotate_x(cancellable, delay, hold, cooldown, value);
}
virtual void issue_gyro_rotate_y(
Cancellable* cancellable,
Milliseconds delay, Milliseconds hold, Milliseconds cooldown,
int16_t value
) override{
ControllerWithScheduler::issue_gyro_rotate_y(cancellable, delay, hold, cooldown, value);
}
virtual void issue_gyro_rotate_z(
Cancellable* cancellable,
Milliseconds delay, Milliseconds hold, Milliseconds cooldown,
int16_t value
) override{
ControllerWithScheduler::issue_gyro_rotate_z(cancellable, delay, hold, cooldown, value);
}
virtual void issue_full_controller_state(
Cancellable* cancellable,
bool enable_logging,
Milliseconds duration,
Button button,
DpadPosition dpad,
const JoystickPosition& left_joystick,
const JoystickPosition& right_joystick
) override{
ControllerWithScheduler::issue_full_controller_state(
cancellable,
enable_logging,
duration,
button,
dpad,
left_joystick,
right_joystick
);
}
public:
// High speed RPCs.
virtual void issue_mash_button(
Cancellable* cancellable,
Milliseconds duration,
Button button,
Milliseconds delay, Milliseconds hold, Milliseconds cooldown
) override{
ControllerWithScheduler::issue_mash_button(cancellable, duration, button, delay, hold, cooldown);
}
virtual void issue_mash_button(
Cancellable* cancellable,
Milliseconds duration,
Button button0, Button button1
) override{
ControllerWithScheduler::issue_mash_button(cancellable, duration, button0, button1);
}
virtual void issue_mash_AZs(
Cancellable* cancellable,
Milliseconds duration
) override{
ControllerWithScheduler::issue_mash_AZs(cancellable, duration);
}
virtual void issue_system_scroll(
Cancellable* cancellable,
Milliseconds delay, Milliseconds hold, Milliseconds cooldown,
DpadPosition direction // Diagonals not allowed.
) override{
ControllerWithScheduler::issue_system_scroll(cancellable, delay, hold, cooldown, direction);
}
public:
virtual Logger& logger() override{
return m_logger;
}
virtual bool is_ready() const override{
return m_connection.is_ready();
}
private:
virtual void on_message(const std::string& message) override;
virtual void execute_state(
Cancellable* cancellable,
const SuperscalarScheduler::ScheduleEntry& entry
) override;
private:
SysbotBase::TcpSysbotBase_Connection& m_connection;
bool m_stopping;
bool m_pending_replace;
uint64_t m_next_seqnum;
uint64_t m_next_expected_seqnum_ack;
ConditionVariable m_cv;
};
}
}
#endif