WPILibC++ 2027.0.0-alpha-2
Loading...
Searching...
No Matches
NetComm.h
Go to the documentation of this file.
1// Copyright (c) FIRST and other WPILib contributors.
2// Open Source Software; you can modify and/or share it under the terms of
3// the WPILib BSD license file in the root directory of this project.
4
5#pragma once
6
7#include <stdint.h>
8
9#include <array>
10#include <bit>
11#include <limits>
12#include <span>
13#include <string>
14#include <string_view>
15#include <utility>
16
17#include "mrc/NtNetComm.h"
18
19namespace mrc {
20
21struct OpModeHash {
22 uint64_t Hash : 56 = 0;
23 uint64_t IsAuto : 1 = 0;
24 uint64_t IsTest : 1 = 0;
25 uint64_t IsEnabled : 1 = 0;
26 uint64_t Reserved : 5 = 0;
27
28 static constexpr uint64_t AutoMask = 0x0100000000000000;
29 static constexpr uint64_t TestMask = 0x0200000000000000;
30 static constexpr uint64_t EnabledMask = 0x0400000000000000;
31 static constexpr uint64_t HashMask = 0x00FFFFFFFFFFFFFF;
32
33 constexpr static OpModeHash MakeTest(uint64_t Hash, bool Enabled = false) {
34 OpModeHash FullHash;
35 FullHash.Hash = Hash & HashMask;
36 FullHash.IsTest = 1;
37 FullHash.IsEnabled = Enabled ? 1 : 0;
38 return FullHash;
39 }
40
41 constexpr static OpModeHash MakeTele(uint64_t Hash, bool Enabled = false) {
42 OpModeHash FullHash;
43 FullHash.Hash = Hash & HashMask;
44 FullHash.IsEnabled = Enabled ? 1 : 0;
45 return FullHash;
46 }
47
48 constexpr static OpModeHash MakeAuto(uint64_t Hash, bool Enabled = false) {
49 OpModeHash FullHash;
50 FullHash.Hash = Hash & HashMask;
51 FullHash.IsAuto = 1;
52 FullHash.IsEnabled = Enabled ? 1 : 0;
53 return FullHash;
54 }
55
56 constexpr static OpModeHash FromValue(uint64_t Value) {
57 OpModeHash RetVal;
58 RetVal.Hash = Value & HashMask;
59 RetVal.IsAuto = (Value & AutoMask) != 0;
60 RetVal.IsTest = (Value & TestMask) != 0;
61 RetVal.IsEnabled = (Value & EnabledMask) != 0;
62 return RetVal;
63 }
64
65 constexpr uint64_t ToValue() const {
66 uint64_t RetVal = Hash & HashMask;
67 RetVal |= IsAuto ? AutoMask : 0;
68 RetVal |= IsTest ? TestMask : 0;
69 RetVal |= IsEnabled ? EnabledMask : 0;
70 return RetVal;
71 }
72};
73
75 uint32_t Enabled : 1 = 0;
76 uint32_t Auto : 1 = 0;
77 uint32_t Test : 1 = 0;
78 uint32_t EStop : 1 = 0;
79 uint32_t FmsConnected : 1 = 0;
80 uint32_t DsConnected : 1 = 0;
81 uint32_t WatchdogActive : 1 = 0;
82 uint32_t Alliance : 6 = 0;
83 uint32_t Reserved : 19 = 0;
84};
85
87 public:
88 std::span<int16_t> Axes() {
89 return std::span{AxesStore.data(), GetMaxAvailableCount()};
90 }
91
92 std::span<const int16_t> Axes() const {
93 return std::span{AxesStore.data(), GetMaxAvailableCount()};
94 }
95
96 void SetAvailable(uint16_t Available) {
97 AvailableAxes = Available & ((1 << MRC_MAX_NUM_AXES) - 1);
98 Count = static_cast<uint8_t>(16 - std::countl_zero(AvailableAxes));
99 }
100
101 uint16_t GetAvailable() const { return AvailableAxes; }
102
103 void SetMaxAvailableCount(size_t _Count) {
104 if (_Count > MRC_MAX_NUM_AXES) {
105 _Count = MRC_MAX_NUM_AXES;
106 }
107 AvailableAxes = (1 << _Count) - 1;
108 Count = static_cast<uint8_t>(_Count);
109 }
110
111 size_t GetMaxAvailableCount() const { return Count; }
112
113 private:
114 std::array<int16_t, MRC_MAX_NUM_AXES> AxesStore{};
115 uint16_t AvailableAxes{0};
116 uint8_t Count{0};
117};
118
120 public:
121 std::span<uint8_t> Povs() { return std::span{PovsStore.data(), GetCount()}; }
122
123 std::span<const uint8_t> Povs() const {
124 return std::span{PovsStore.data(), GetCount()};
125 }
126
127 void SetCount(uint8_t NewCount) {
128 Count = (std::min)(NewCount, static_cast<uint8_t>(MRC_MAX_NUM_POVS));
129 }
130
131 size_t GetCount() const { return Count; }
132
133 private:
134 std::array<uint8_t, MRC_MAX_NUM_POVS> PovsStore{};
135 uint8_t Count{0};
136};
137
139 uint64_t Buttons{0};
140
141 void SetAvailable(uint64_t Available) {
142 AvailableButtons = Available;
143 Count = static_cast<uint8_t>(64 - std::countl_zero(Available));
144 }
145
146 uint64_t GetAvailable() const { return AvailableButtons; }
147
148 void SetMaxAvailableCount(size_t _Count) {
149 if (_Count > 63) {
150 AvailableButtons = (std::numeric_limits<uint64_t>::max)();
151 Count = MRC_MAX_NUM_BUTTONS;
152 return;
153 }
154 AvailableButtons = (1ULL << _Count) - 1;
155 Count = static_cast<uint8_t>(_Count);
156 }
157
158 size_t GetMaxAvailableCount() const { return Count; }
159
160 private:
161 uint64_t AvailableButtons{0};
162 uint8_t Count{0};
163};
164
170
173 uint16_t MatchTime{0};
175
176 std::span<Joystick> Joysticks() {
177 return std::span{JoysticksStore.data(), GetJoystickCount()};
178 }
179
180 std::span<const Joystick> Joysticks() const {
181 return std::span{JoysticksStore.data(), GetJoystickCount()};
182 }
183
184 size_t GetJoystickCount() const { return JoystickCount; }
185
186 void SetJoystickCount(uint8_t NewCount) {
187 JoystickCount =
188 (std::min)(NewCount, static_cast<uint8_t>(MRC_MAX_NUM_JOYSTICKS));
189 }
190
191 private:
192 std::array<Joystick, MRC_MAX_NUM_JOYSTICKS> JoysticksStore;
193 uint8_t JoystickCount{0};
194};
195
197 public:
198 std::span<uint16_t> Rumbles() {
199 return std::span{RumbleStore.data(), GetCount()};
200 }
201
202 std::span<const uint16_t> Rumbles() const {
203 return std::span{RumbleStore.data(), GetCount()};
204 }
205
206 void SetCount(uint8_t NewCount) {
207 Count = (std::min)(NewCount, static_cast<uint8_t>(MRC_MAX_NUM_RUMBLE));
208 }
209
210 size_t GetCount() const { return Count; }
211
212 private:
213 std::array<uint16_t, MRC_MAX_NUM_RUMBLE> RumbleStore;
214 uint8_t Count{0};
215};
216
217enum class MatchType : uint8_t {
218 None = 0,
219 Practice = 1,
220 Qualification = 2,
221 Playoff = 3,
222 Test = 4,
223};
224
225struct MatchInfo {
226 uint16_t MatchNumber{0};
227 uint8_t ReplayNumber{0};
229
230 void SetEventName(std::string_view Name) {
231 if (Name.size() > MRC_MAX_EVENT_NAME_LEN) {
232 Name = Name.substr(0, MRC_MAX_EVENT_NAME_LEN);
233 }
234 EventName = Name;
235 }
236
237 void MoveEventName(std::string&& Name) {
238 EventName = std::move(Name);
239 if (EventName.size() > MRC_MAX_EVENT_NAME_LEN) {
240 EventName.resize(MRC_MAX_EVENT_NAME_LEN);
241 }
242 }
243
244 std::string_view GetEventName() const { return EventName; }
245
246 std::span<uint8_t> WritableNameBuffer(size_t Len) {
247 if (Len > MRC_MAX_EVENT_NAME_LEN) {
249 }
250 EventName.resize(Len);
251 return std::span<uint8_t>{reinterpret_cast<uint8_t*>(EventName.data()),
252 EventName.size()};
253 }
254
255 bool operator==(const MatchInfo& Other) const {
256 return MatchNumber == Other.MatchNumber &&
257 ReplayNumber == Other.ReplayNumber && Type == Other.Type &&
258 EventName == Other.EventName;
259 }
260
261 private:
262 std::string EventName;
263};
264
266 public:
267 bool IsGamepad{0};
268 uint8_t Type{0};
269 uint8_t RumbleCount{0};
270
271 std::span<uint8_t> AxesTypes() {
272 return std::span{AxesTypesStore.data(), GetAxesCount()};
273 }
274
275 std::span<const uint8_t> AxesTypes() const {
276 return std::span{AxesTypesStore.data(), GetAxesCount()};
277 }
278
279 void SetAxesCount(uint8_t NewCount) {
280 AxesCount = (std::min)(NewCount, static_cast<uint8_t>(MRC_MAX_NUM_AXES));
281 }
282
283 size_t GetAxesCount() const { return AxesCount; }
284
285 void SetPovsCount(uint8_t NewCount) {
286 PovCount = (std::min)(NewCount, static_cast<uint8_t>(MRC_MAX_NUM_POVS));
287 }
288
289 size_t GetPovsCount() const { return PovCount; }
290
291 void SetButtonsCount(uint8_t NewCount) {
292 ButtonCount =
293 (std::min)(NewCount, static_cast<uint8_t>(MRC_MAX_NUM_BUTTONS));
294 }
295
296 size_t GetButtonsCount() const { return ButtonCount; }
297
298 void SetName(std::string_view Name) {
299 if (Name.size() > MRC_MAX_JOYSTICK_NAME_LEN) {
300 Name = Name.substr(0, MRC_MAX_JOYSTICK_NAME_LEN);
301 }
302 JoystickName = Name;
303 }
304
305 void MoveName(std::string&& Name) {
306 JoystickName = std::move(Name);
307 if (JoystickName.size() > MRC_MAX_JOYSTICK_NAME_LEN) {
308 JoystickName.resize(MRC_MAX_JOYSTICK_NAME_LEN);
309 }
310 }
311
312 std::string_view GetName() const { return JoystickName; }
313
314 std::span<uint8_t> WritableNameBuffer(size_t Len) {
315 if (Len > MRC_MAX_JOYSTICK_NAME_LEN) {
317 }
318 JoystickName.resize(Len);
319 return std::span<uint8_t>{reinterpret_cast<uint8_t*>(JoystickName.data()),
320 JoystickName.size()};
321 }
322
323 private:
324 std::string JoystickName;
325 std::array<uint8_t, MRC_MAX_NUM_AXES> AxesTypesStore;
326 uint8_t AxesCount{0};
327 uint8_t ButtonCount{0};
328 uint8_t PovCount{0};
329};
330
331struct ErrorInfo {
332 bool IsError{false};
333 int32_t ErrorCode{0};
334
335 void SetDetails(std::string_view NewDetails) {
336 if (NewDetails.size() > MRC_MAX_ERROR_INFO_STR_LEN) {
337 NewDetails = NewDetails.substr(0, MRC_MAX_ERROR_INFO_STR_LEN);
338 }
339 Details = NewDetails;
340 }
341
342 void MoveDetails(std::string&& NewDetails) {
343 Details = std::move(NewDetails);
344 if (Details.size() > MRC_MAX_ERROR_INFO_STR_LEN) {
345 Details.resize(MRC_MAX_ERROR_INFO_STR_LEN);
346 }
347 }
348
349 std::string_view GetDetails() const { return Details; }
350
351 std::span<uint8_t> WritableDetailsBuffer(size_t Len) {
352 if (Len > MRC_MAX_ERROR_INFO_STR_LEN) {
354 }
355 Details.resize(Len);
356 return std::span<uint8_t>{reinterpret_cast<uint8_t*>(Details.data()),
357 Details.size()};
358 }
359
360 void SetLocation(std::string_view NewLocation) {
361 if (NewLocation.size() > MRC_MAX_ERROR_INFO_STR_LEN) {
362 NewLocation = NewLocation.substr(0, MRC_MAX_ERROR_INFO_STR_LEN);
363 }
364 Location = NewLocation;
365 }
366
367 void MoveLocation(std::string&& NewLocation) {
368 Location = std::move(NewLocation);
369 if (Location.size() > MRC_MAX_ERROR_INFO_STR_LEN) {
370 Location.resize(MRC_MAX_ERROR_INFO_STR_LEN);
371 }
372 }
373
374 std::string_view GetLocation() const { return Location; }
375
376 std::span<uint8_t> WritableLocationBuffer(size_t Len) {
377 if (Len > MRC_MAX_ERROR_INFO_STR_LEN) {
379 }
380 Location.resize(Len);
381 return std::span<uint8_t>{reinterpret_cast<uint8_t*>(Location.data()),
382 Location.size()};
383 }
384
385 void SetCallStack(std::string_view NewCallStack) {
386 if (NewCallStack.size() > MRC_MAX_ERROR_INFO_STR_LEN) {
387 NewCallStack = NewCallStack.substr(0, MRC_MAX_ERROR_INFO_STR_LEN);
388 }
389 CallStack = NewCallStack;
390 }
391
392 void MoveCallStack(std::string&& NewCallStack) {
393 CallStack = std::move(NewCallStack);
394 if (CallStack.size() > MRC_MAX_ERROR_INFO_STR_LEN) {
395 CallStack.resize(MRC_MAX_ERROR_INFO_STR_LEN);
396 }
397 }
398
399 std::string_view GetCallStack() const { return CallStack; }
400
401 std::span<uint8_t> WritableCallStackBuffer(size_t Len) {
402 if (Len > MRC_MAX_ERROR_INFO_STR_LEN) {
404 }
405 CallStack.resize(Len);
406 return std::span<uint8_t>{reinterpret_cast<uint8_t*>(CallStack.data()),
407 CallStack.size()};
408 }
409
410 private:
411 std::string Details;
412 std::string Location;
413 std::string CallStack;
414};
415
416struct OpMode {
417 OpMode(std::string_view _Name, OpModeHash _Hash) : Hash(_Hash) {
418 SetName(_Name);
419 }
420
421 OpMode() = default;
422
424
425 void SetName(std::string_view NewName) {
426 if (NewName.size() > MRC_MAX_OPMODE_LEN) {
427 NewName = NewName.substr(0, MRC_MAX_OPMODE_LEN);
428 }
429 Name = NewName;
430 }
431
432 void MoveName(std::string&& NewName) {
433 Name = std::move(NewName);
434 if (Name.size() > MRC_MAX_OPMODE_LEN) {
435 Name.resize(MRC_MAX_OPMODE_LEN);
436 }
437 }
438
439 std::string_view GetName() const { return Name; }
440
441 std::span<uint8_t> WritableNameBuffer(size_t Len) {
442 if (Len > MRC_MAX_OPMODE_LEN) {
443 Len = MRC_MAX_OPMODE_LEN;
444 }
445 Name.resize(Len);
446 return std::span<uint8_t>{reinterpret_cast<uint8_t*>(Name.data()),
447 Name.size()};
448 }
449
450 private:
451 std::string Name;
452};
453
454} // namespace mrc
#define MRC_MAX_OPMODE_LEN
Definition NtNetComm.h:63
#define MRC_MAX_NUM_RUMBLE
Definition NtNetComm.h:62
#define MRC_MAX_NUM_BUTTONS
Definition NtNetComm.h:61
#define MRC_MAX_ERROR_INFO_STR_LEN
Definition NtNetComm.h:68
#define MRC_MAX_NUM_POVS
Definition NtNetComm.h:60
#define MRC_MAX_NUM_AXES
Definition NtNetComm.h:59
#define MRC_MAX_JOYSTICK_NAME_LEN
Definition NtNetComm.h:66
#define MRC_MAX_NUM_JOYSTICKS
Definition NtNetComm.h:58
#define MRC_MAX_EVENT_NAME_LEN
Definition NtNetComm.h:65
Definition NetComm.h:19
MatchType
Definition NetComm.h:217
Definition NetComm.h:171
OpModeHash CurrentOpMode
Definition NetComm.h:174
uint16_t MatchTime
Definition NetComm.h:173
std::span< const Joystick > Joysticks() const
Definition NetComm.h:180
std::span< Joystick > Joysticks()
Definition NetComm.h:176
void SetJoystickCount(uint8_t NewCount)
Definition NetComm.h:186
size_t GetJoystickCount() const
Definition NetComm.h:184
ControlFlags ControlWord
Definition NetComm.h:172
Definition NetComm.h:74
uint32_t Alliance
Definition NetComm.h:82
uint32_t FmsConnected
Definition NetComm.h:79
uint32_t Auto
Definition NetComm.h:76
uint32_t Reserved
Definition NetComm.h:83
uint32_t Test
Definition NetComm.h:77
uint32_t EStop
Definition NetComm.h:78
uint32_t Enabled
Definition NetComm.h:75
uint32_t WatchdogActive
Definition NetComm.h:81
uint32_t DsConnected
Definition NetComm.h:80
Definition NetComm.h:331
std::string_view GetCallStack() const
Definition NetComm.h:399
bool IsError
Definition NetComm.h:332
std::span< uint8_t > WritableDetailsBuffer(size_t Len)
Definition NetComm.h:351
void MoveCallStack(std::string &&NewCallStack)
Definition NetComm.h:392
int32_t ErrorCode
Definition NetComm.h:333
std::string_view GetDetails() const
Definition NetComm.h:349
void MoveLocation(std::string &&NewLocation)
Definition NetComm.h:367
void MoveDetails(std::string &&NewDetails)
Definition NetComm.h:342
std::span< uint8_t > WritableCallStackBuffer(size_t Len)
Definition NetComm.h:401
std::span< uint8_t > WritableLocationBuffer(size_t Len)
Definition NetComm.h:376
void SetDetails(std::string_view NewDetails)
Definition NetComm.h:335
void SetLocation(std::string_view NewLocation)
Definition NetComm.h:360
void SetCallStack(std::string_view NewCallStack)
Definition NetComm.h:385
std::string_view GetLocation() const
Definition NetComm.h:374
Definition NetComm.h:86
uint16_t GetAvailable() const
Definition NetComm.h:101
size_t GetMaxAvailableCount() const
Definition NetComm.h:111
std::span< int16_t > Axes()
Definition NetComm.h:88
void SetAvailable(uint16_t Available)
Definition NetComm.h:96
void SetMaxAvailableCount(size_t _Count)
Definition NetComm.h:103
std::span< const int16_t > Axes() const
Definition NetComm.h:92
Definition NetComm.h:138
void SetAvailable(uint64_t Available)
Definition NetComm.h:141
size_t GetMaxAvailableCount() const
Definition NetComm.h:158
void SetMaxAvailableCount(size_t _Count)
Definition NetComm.h:148
uint64_t GetAvailable() const
Definition NetComm.h:146
uint64_t Buttons
Definition NetComm.h:139
Definition NetComm.h:265
size_t GetButtonsCount() const
Definition NetComm.h:296
uint8_t Type
Definition NetComm.h:268
std::string_view GetName() const
Definition NetComm.h:312
size_t GetAxesCount() const
Definition NetComm.h:283
void MoveName(std::string &&Name)
Definition NetComm.h:305
void SetName(std::string_view Name)
Definition NetComm.h:298
std::span< uint8_t > WritableNameBuffer(size_t Len)
Definition NetComm.h:314
bool IsGamepad
Definition NetComm.h:267
std::span< uint8_t > AxesTypes()
Definition NetComm.h:271
std::span< const uint8_t > AxesTypes() const
Definition NetComm.h:275
size_t GetPovsCount() const
Definition NetComm.h:289
uint8_t RumbleCount
Definition NetComm.h:269
void SetPovsCount(uint8_t NewCount)
Definition NetComm.h:285
void SetAxesCount(uint8_t NewCount)
Definition NetComm.h:279
void SetButtonsCount(uint8_t NewCount)
Definition NetComm.h:291
Definition NetComm.h:165
JoystickButtons Buttons
Definition NetComm.h:168
JoystickAxes Axes
Definition NetComm.h:166
JoystickPovs Povs
Definition NetComm.h:167
Definition NetComm.h:119
std::span< uint8_t > Povs()
Definition NetComm.h:121
size_t GetCount() const
Definition NetComm.h:131
void SetCount(uint8_t NewCount)
Definition NetComm.h:127
std::span< const uint8_t > Povs() const
Definition NetComm.h:123
Definition NetComm.h:196
std::span< uint16_t > Rumbles()
Definition NetComm.h:198
void SetCount(uint8_t NewCount)
Definition NetComm.h:206
std::span< const uint16_t > Rumbles() const
Definition NetComm.h:202
size_t GetCount() const
Definition NetComm.h:210
Definition NetComm.h:225
MatchType Type
Definition NetComm.h:228
uint8_t ReplayNumber
Definition NetComm.h:227
void SetEventName(std::string_view Name)
Definition NetComm.h:230
void MoveEventName(std::string &&Name)
Definition NetComm.h:237
std::string_view GetEventName() const
Definition NetComm.h:244
uint16_t MatchNumber
Definition NetComm.h:226
std::span< uint8_t > WritableNameBuffer(size_t Len)
Definition NetComm.h:246
bool operator==(const MatchInfo &Other) const
Definition NetComm.h:255
Definition NetComm.h:21
static constexpr OpModeHash MakeTest(uint64_t Hash, bool Enabled=false)
Definition NetComm.h:33
static constexpr OpModeHash FromValue(uint64_t Value)
Definition NetComm.h:56
static constexpr uint64_t EnabledMask
Definition NetComm.h:30
uint64_t IsAuto
Definition NetComm.h:23
static constexpr uint64_t AutoMask
Definition NetComm.h:28
uint64_t IsTest
Definition NetComm.h:24
constexpr uint64_t ToValue() const
Definition NetComm.h:65
static constexpr uint64_t HashMask
Definition NetComm.h:31
uint64_t Hash
Definition NetComm.h:22
uint64_t IsEnabled
Definition NetComm.h:25
uint64_t Reserved
Definition NetComm.h:26
static constexpr uint64_t TestMask
Definition NetComm.h:29
static constexpr OpModeHash MakeAuto(uint64_t Hash, bool Enabled=false)
Definition NetComm.h:48
static constexpr OpModeHash MakeTele(uint64_t Hash, bool Enabled=false)
Definition NetComm.h:41
Definition NetComm.h:416
void MoveName(std::string &&NewName)
Definition NetComm.h:432
OpMode()=default
OpMode(std::string_view _Name, OpModeHash _Hash)
Definition NetComm.h:417
OpModeHash Hash
Definition NetComm.h:423
std::span< uint8_t > WritableNameBuffer(size_t Len)
Definition NetComm.h:441
std::string_view GetName() const
Definition NetComm.h:439
void SetName(std::string_view NewName)
Definition NetComm.h:425