UdonLibrary 1.0.0
機械システム研究部 C++ ライブラリ
読み取り中…
検索中…
一致する文字列を見つけられません
PadPS5.hpp
[詳解]
1//
2// PS5コントローラー受信クラス
3//
4// Copyright (c) 2022-2024 udonrobo
5//
6// Controller --> Sender --> Master
7// ^^^^^^
8//
9
10#pragma once
11
14#include <Udon/Com/Message.hpp>
17
18namespace Udon
19{
20
23 template <template <typename> class Reader>
24 class PadPS5
25 : public Reader<Message::PadPS5>
26 {
27 static_assert(Traits::IsReader<Reader>::value, "Reader type must meet recipient requirements.");
28
29 public:
32
34 using ReaderType = Reader<MessageType>;
35
37 using ReaderType::ReaderType;
38
40 explicit operator bool() const noexcept { return isConnected; }
41
46 bool isEmergencyStop() const noexcept
47 {
48 // パッドが接続されていない場合は非常停止
49 if (not *this)
50 {
51 return true;
52 }
53
54 if (getCross().toggle)
55 {
56 return false;
57 }
58 else
59 {
60 // 起動時は非常停止
61 return true;
62 }
63 }
64
70 bool isOperable() const noexcept
71 {
72 return not isEmergencyStop();
73 }
74
76 Input getTriangle() const noexcept { return triangle; }
77
79 Input getCircle() const noexcept { return circle; }
80
82 Input getCross() const noexcept { return cross; }
83
85 Input getSquare() const noexcept { return square; }
86
88 Input getUp() const noexcept { return up; }
89
91 Input getRight() const noexcept { return right; }
92
94 Input getDown() const noexcept { return down; }
95
97 Input getLeft() const noexcept { return left; }
98
100 Input getL1() const noexcept { return l1; }
101
103 Input getR1() const noexcept { return r1; }
104
106 Input getL2() const noexcept { return l2; }
107
109 Input getR2() const noexcept { return r2; }
110
112 Input getL3() const noexcept { return l3; }
113
115 Input getR3() const noexcept { return r3; }
116
118 Input getCreate() const noexcept { return create; }
119
121 Input getOption() const noexcept { return option; }
122
124 Input getTouch() const noexcept { return touch; }
125
127 Input getMic() const noexcept { return mic; }
128
130 Input getPs() const noexcept { return ps; }
131
133 Vec2 getLeftStick() const noexcept { return leftStick; }
134
136 Vec2 getRightStick() const noexcept { return rightStick; }
137
140 Stick getMoveInfo() const noexcept { return { leftStick, rightStick.x }; }
141
144 void update(int deadZone = 20) noexcept
145 {
147
148 if (const auto message = ReaderType::getMessage())
149 {
150 isConnected = true;
151
152 triangle.update(message->triangle);
153 circle.update(message->circle);
154 cross.update(message->cross);
155 square.update(message->square);
156
157 up.update(message->up);
158 right.update(message->right);
159 down.update(message->down);
160 left.update(message->left);
161
162 l1.update(message->l1);
163 r1.update(message->r1);
164 l2.update(message->l2);
165 r2.update(message->r2);
166 l3.update(message->l3);
167 r3.update(message->r3);
168
169 create.update(message->create);
170 option.update(message->option);
171 touch.update(message->touch);
172 mic.update(message->mic);
173 ps.update(message->ps);
174
175 // -128 ~ 127(int8_t) -> -255 ~ 255(int16_t)
176 const auto decodeStick = [](int8_t raw) -> int16_t
177 {
178 return raw * 2 + 1; // (raw + 128) * 2 - 255
179 };
180
181 leftStick = {
182 CutDeadZone(decodeStick(message->analogLeftX), deadZone),
183 CutDeadZone(decodeStick(message->analogLeftY), deadZone),
184 };
185 rightStick = {
186 CutDeadZone(decodeStick(message->analogRightX), deadZone),
187 CutDeadZone(decodeStick(message->analogRightY), deadZone),
188 };
189 }
190 else
191 {
192 isConnected = false;
193
194 triangle.update(false);
195 circle.update(false);
196 cross.update(false);
197 square.update(false);
198
199 up.update(false);
200 right.update(false);
201 down.update(false);
202 left.update(false);
203
204 l1.update(false);
205 r1.update(false);
206 l2.update(false);
207 r2.update(false);
208 l3.update(false);
209 r3.update(false);
210
211 create.update(false);
212 option.update(false);
213 touch.update(false);
214 mic.update(false);
215
216 leftStick.clear();
217 rightStick.clear();
218 }
219 }
220
223 {
224 return {
225 isConnected,
226 triangle.press,
227 circle.press,
228 cross.press,
229 square.press,
230
231 up.press,
232 right.press,
233 down.press,
234 left.press,
235
236 l1.press,
237 r1.press,
238 l2.press,
239 r2.press,
240 l3.press,
241 r3.press,
242
243 create.press,
244 option.press,
245 touch.press,
246 mic.press,
247 ps.press,
248
249 static_cast<int8_t>(rightStick.x / 2),
250 static_cast<int8_t>(rightStick.y / 2),
251 static_cast<int8_t>(leftStick.x / 2),
252 static_cast<int8_t>(leftStick.y / 2),
253 };
254 }
255
256 private:
257 // 接続状態
258 bool isConnected = false;
259
260 // ボタン
261 Input triangle;
262 Input circle;
263 Input cross;
264 Input square;
265 Input up;
266 Input right;
267 Input down;
268 Input left;
269 Input l1;
270 Input r1;
271 Input l2;
272 Input r2;
273 Input l3;
274 Input r3;
275 Input create;
276 Input option;
277 Input touch;
278 Input mic;
279 Input ps;
280
281 // アナログスティック [-255~255]
282 Vec2 rightStick;
283 Vec2 leftStick;
284
286 static double CutDeadZone(double value, uint8_t deadZone)
287 {
288 if (value > deadZone)
289 return 255 * (value - deadZone) / (255 - deadZone);
290 else if (value < -deadZone)
291 return 255 * (value + deadZone) / (255 - deadZone);
292 else
293 return 0.0;
294 };
295 };
296
297} // namespace Udon
通信経由PS5コントローラークラス
Definition PadPS5.hpp:26
Input getDown() const noexcept
十字キー下
Definition PadPS5.hpp:94
void update(int deadZone=20) noexcept
更新
Definition PadPS5.hpp:144
Input getPs() const noexcept
PSボタン
Definition PadPS5.hpp:130
Reader< MessageType > ReaderType
受信クラス型
Definition PadPS5.hpp:34
Stick getMoveInfo() const noexcept
ロボットの移動に必要なスティックの情報 Udon::Stick オブジェクト {{x,y},turn} を取得
Definition PadPS5.hpp:140
bool isEmergencyStop() const noexcept
非常停止を行うべきかを取得
Definition PadPS5.hpp:46
Input getCircle() const noexcept
○ボタン
Definition PadPS5.hpp:79
Input getRight() const noexcept
十字キー右
Definition PadPS5.hpp:91
Vec2 getRightStick() const noexcept
右スティック [x,y: -255~255]
Definition PadPS5.hpp:136
Input getLeft() const noexcept
十字キー左
Definition PadPS5.hpp:97
Vec2 getLeftStick() const noexcept
左スティック [x,y: -255~255]
Definition PadPS5.hpp:133
Input getMic() const noexcept
マイクボタン
Definition PadPS5.hpp:127
Input getR3() const noexcept
右スティック押し込み
Definition PadPS5.hpp:115
Input getL2() const noexcept
L2ボタン
Definition PadPS5.hpp:106
Input getCreate() const noexcept
クリエイトボタン(左上ボタン)
Definition PadPS5.hpp:118
Input getL3() const noexcept
左スティック押し込み
Definition PadPS5.hpp:112
Input getUp() const noexcept
十字キー上
Definition PadPS5.hpp:88
Input getSquare() const noexcept
□ボタン
Definition PadPS5.hpp:85
Input getTriangle() const noexcept
▵ボタン
Definition PadPS5.hpp:76
Input getR2() const noexcept
R2ボタン
Definition PadPS5.hpp:109
bool isOperable() const noexcept
動作可能であるか
Definition PadPS5.hpp:70
Input getOption() const noexcept
オプションボタン(右上ボタン)
Definition PadPS5.hpp:121
Input getCross() const noexcept
×ボタン
Definition PadPS5.hpp:82
Input getR1() const noexcept
R1ボタン
Definition PadPS5.hpp:103
MessageType getMessage() const
メッセージ構造体に変換
Definition PadPS5.hpp:222
Input getTouch() const noexcept
タッチパッドボタン
Definition PadPS5.hpp:124
Input getL1() const noexcept
L1ボタン
Definition PadPS5.hpp:100
void MaybeInvokeUpdate(HasMemberFunctionUpdate &rhs)
T に T::update 関数が存在する場合呼び出す。それ以外の場合何もしない。
Definition HasMemberFunction.hpp:111
Definition Bit.hpp:12
入力値
Definition Input.hpp:16
bool press
押されているか
Definition Input.hpp:46
void update(bool input) noexcept
更新
Definition Input.hpp:69
PS5コントローラーのボタン情報
Definition PadPS5.hpp:21
ロボットの位置
Definition Position.hpp:26
送信クラスであるか判定
Definition ReaderWriterTraits.hpp:42
二次元ベクトル
Definition Vector2D.hpp:22
ValueType y
Y成分
Definition Vector2D.hpp:31
ValueType x
X成分
Definition Vector2D.hpp:28
void clear() noexcept
値クリア
Definition Vector2D.hpp:107