[hal,wpilib] Add Touchpad support (#8401)

This commit is contained in:
Thad House
2025-11-21 13:57:11 -08:00
committed by GitHub
parent 8546d301e3
commit 32fc543dc8
34 changed files with 1319 additions and 437 deletions

View File

@@ -138,6 +138,6 @@ jobs:
- uses: actions/upload-artifact@v4
with:
name: ${{ matrix.platform }}-robotpy-pregeneration-fixes
path: robotpy-pregeneration-fixes.patch
name: robotpy-pregeneration-fixes
path: robotpy-pregeneration.patch
if: ${{ failure() }}

View File

@@ -331,6 +331,9 @@ def wpihal_extension(srcs = [], header_to_dat_deps = [], extra_hdrs = [], includ
("HAL_JoystickButtons", "__HAL_JoystickButtons.hpp"),
("HAL_JoystickDescriptor", "__HAL_JoystickDescriptor.hpp"),
("HAL_MatchInfo", "__HAL_MatchInfo.hpp"),
("HAL_JoystickTouchpadFinger", "__HAL_JoystickTouchpadFinger.hpp"),
("HAL_JoystickTouchpad", "__HAL_JoystickTouchpad.hpp"),
("HAL_JoystickTouchpads", "__HAL_JoystickTouchpads.hpp"),
],
),
struct(

View File

@@ -14,438 +14,507 @@
static const uint8_t file_descriptor[] {
0x0a,0x0d,0x4d,0x72,0x63,0x43,0x6f,0x6d,0x6d,0x2e,
0x70,0x72,0x6f,0x74,0x6f,0x12,0x09,0x6d,0x72,0x63,
0x2e,0x70,0x72,0x6f,0x74,0x6f,0x22,0xc6,0x01,0x0a,
0x14,0x50,0x72,0x6f,0x74,0x6f,0x62,0x75,0x66,0x4a,
0x2e,0x70,0x72,0x6f,0x74,0x6f,0x22,0x44,0x0a,0x12,
0x50,0x72,0x6f,0x74,0x6f,0x62,0x75,0x66,0x46,0x69,
0x6e,0x67,0x65,0x72,0x44,0x61,0x74,0x61,0x12,0x0c,
0x0a,0x01,0x58,0x18,0x01,0x20,0x01,0x28,0x0d,0x52,
0x01,0x58,0x12,0x0c,0x0a,0x01,0x59,0x18,0x02,0x20,
0x01,0x28,0x0d,0x52,0x01,0x59,0x12,0x12,0x0a,0x04,
0x44,0x6f,0x77,0x6e,0x18,0x03,0x20,0x01,0x28,0x08,
0x52,0x04,0x44,0x6f,0x77,0x6e,0x22,0x4f,0x0a,0x14,
0x50,0x72,0x6f,0x74,0x6f,0x62,0x75,0x66,0x54,0x6f,
0x75,0x63,0x68,0x70,0x61,0x64,0x44,0x61,0x74,0x61,
0x12,0x37,0x0a,0x07,0x46,0x69,0x6e,0x67,0x65,0x72,
0x73,0x18,0x01,0x20,0x03,0x28,0x0b,0x32,0x1d,0x2e,
0x6d,0x72,0x63,0x2e,0x70,0x72,0x6f,0x74,0x6f,0x2e,
0x50,0x72,0x6f,0x74,0x6f,0x62,0x75,0x66,0x46,0x69,
0x6e,0x67,0x65,0x72,0x44,0x61,0x74,0x61,0x52,0x07,
0x46,0x69,0x6e,0x67,0x65,0x72,0x73,0x22,0x85,0x02,
0x0a,0x14,0x50,0x72,0x6f,0x74,0x6f,0x62,0x75,0x66,
0x4a,0x6f,0x79,0x73,0x74,0x69,0x63,0x6b,0x44,0x61,
0x74,0x61,0x12,0x2a,0x0a,0x10,0x41,0x76,0x61,0x69,
0x6c,0x61,0x62,0x6c,0x65,0x42,0x75,0x74,0x74,0x6f,
0x6e,0x73,0x18,0x01,0x20,0x01,0x28,0x04,0x52,0x10,
0x41,0x76,0x61,0x69,0x6c,0x61,0x62,0x6c,0x65,0x42,
0x75,0x74,0x74,0x6f,0x6e,0x73,0x12,0x18,0x0a,0x07,
0x42,0x75,0x74,0x74,0x6f,0x6e,0x73,0x18,0x02,0x20,
0x01,0x28,0x04,0x52,0x07,0x42,0x75,0x74,0x74,0x6f,
0x6e,0x73,0x12,0x24,0x0a,0x0d,0x41,0x76,0x61,0x69,
0x6c,0x61,0x62,0x6c,0x65,0x41,0x78,0x65,0x73,0x18,
0x03,0x20,0x01,0x28,0x0d,0x52,0x0d,0x41,0x76,0x61,
0x69,0x6c,0x61,0x62,0x6c,0x65,0x41,0x78,0x65,0x73,
0x12,0x12,0x0a,0x04,0x41,0x78,0x65,0x73,0x18,0x04,
0x20,0x03,0x28,0x11,0x52,0x04,0x41,0x78,0x65,0x73,
0x12,0x1a,0x0a,0x08,0x50,0x4f,0x56,0x43,0x6f,0x75,
0x6e,0x74,0x18,0x05,0x20,0x01,0x28,0x0d,0x52,0x08,
0x50,0x4f,0x56,0x43,0x6f,0x75,0x6e,0x74,0x12,0x12,
0x0a,0x04,0x50,0x4f,0x56,0x73,0x18,0x06,0x20,0x01,
0x28,0x0d,0x52,0x04,0x50,0x4f,0x56,0x73,0x12,0x3d,
0x0a,0x09,0x54,0x6f,0x75,0x63,0x68,0x70,0x61,0x64,
0x73,0x18,0x07,0x20,0x03,0x28,0x0b,0x32,0x1f,0x2e,
0x6d,0x72,0x63,0x2e,0x70,0x72,0x6f,0x74,0x6f,0x2e,
0x50,0x72,0x6f,0x74,0x6f,0x62,0x75,0x66,0x54,0x6f,
0x75,0x63,0x68,0x70,0x61,0x64,0x44,0x61,0x74,0x61,
0x52,0x09,0x54,0x6f,0x75,0x63,0x68,0x70,0x61,0x64,
0x73,0x22,0xba,0x01,0x0a,0x13,0x50,0x72,0x6f,0x74,
0x6f,0x62,0x75,0x66,0x43,0x6f,0x6e,0x74,0x72,0x6f,
0x6c,0x44,0x61,0x74,0x61,0x12,0x20,0x0a,0x0b,0x43,
0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x57,0x6f,0x72,0x64,
0x18,0x01,0x20,0x01,0x28,0x0d,0x52,0x0b,0x43,0x6f,
0x6e,0x74,0x72,0x6f,0x6c,0x57,0x6f,0x72,0x64,0x12,
0x1c,0x0a,0x09,0x4d,0x61,0x74,0x63,0x68,0x54,0x69,
0x6d,0x65,0x18,0x02,0x20,0x01,0x28,0x05,0x52,0x09,
0x4d,0x61,0x74,0x63,0x68,0x54,0x69,0x6d,0x65,0x12,
0x3d,0x0a,0x09,0x4a,0x6f,0x79,0x73,0x74,0x69,0x63,
0x6b,0x73,0x18,0x03,0x20,0x03,0x28,0x0b,0x32,0x1f,
0x2e,0x6d,0x72,0x63,0x2e,0x70,0x72,0x6f,0x74,0x6f,
0x2e,0x50,0x72,0x6f,0x74,0x6f,0x62,0x75,0x66,0x4a,
0x6f,0x79,0x73,0x74,0x69,0x63,0x6b,0x44,0x61,0x74,
0x61,0x12,0x2a,0x0a,0x10,0x41,0x76,0x61,0x69,0x6c,
0x61,0x62,0x6c,0x65,0x42,0x75,0x74,0x74,0x6f,0x6e,
0x73,0x18,0x01,0x20,0x01,0x28,0x04,0x52,0x10,0x41,
0x76,0x61,0x69,0x6c,0x61,0x62,0x6c,0x65,0x42,0x75,
0x74,0x74,0x6f,0x6e,0x73,0x12,0x18,0x0a,0x07,0x42,
0x75,0x74,0x74,0x6f,0x6e,0x73,0x18,0x02,0x20,0x01,
0x28,0x04,0x52,0x07,0x42,0x75,0x74,0x74,0x6f,0x6e,
0x73,0x12,0x24,0x0a,0x0d,0x41,0x76,0x61,0x69,0x6c,
0x61,0x62,0x6c,0x65,0x41,0x78,0x65,0x73,0x18,0x03,
0x20,0x01,0x28,0x0d,0x52,0x0d,0x41,0x76,0x61,0x69,
0x6c,0x61,0x62,0x6c,0x65,0x41,0x78,0x65,0x73,0x12,
0x12,0x0a,0x04,0x41,0x78,0x65,0x73,0x18,0x04,0x20,
0x03,0x28,0x11,0x52,0x04,0x41,0x78,0x65,0x73,0x12,
0x1a,0x0a,0x08,0x50,0x4f,0x56,0x43,0x6f,0x75,0x6e,
0x74,0x18,0x05,0x20,0x01,0x28,0x0d,0x52,0x08,0x50,
0x4f,0x56,0x43,0x6f,0x75,0x6e,0x74,0x12,0x12,0x0a,
0x04,0x50,0x4f,0x56,0x73,0x18,0x06,0x20,0x01,0x28,
0x0d,0x52,0x04,0x50,0x4f,0x56,0x73,0x22,0xba,0x01,
0x0a,0x13,0x50,0x72,0x6f,0x74,0x6f,0x62,0x75,0x66,
0x43,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x44,0x61,0x74,
0x61,0x12,0x20,0x0a,0x0b,0x43,0x6f,0x6e,0x74,0x72,
0x6f,0x6c,0x57,0x6f,0x72,0x64,0x18,0x01,0x20,0x01,
0x28,0x0d,0x52,0x0b,0x43,0x6f,0x6e,0x74,0x72,0x6f,
0x6c,0x57,0x6f,0x72,0x64,0x12,0x1c,0x0a,0x09,0x4d,
0x61,0x74,0x63,0x68,0x54,0x69,0x6d,0x65,0x18,0x02,
0x20,0x01,0x28,0x05,0x52,0x09,0x4d,0x61,0x74,0x63,
0x68,0x54,0x69,0x6d,0x65,0x12,0x3d,0x0a,0x09,0x4a,
0x6f,0x79,0x73,0x74,0x69,0x63,0x6b,0x73,0x18,0x03,
0x20,0x03,0x28,0x0b,0x32,0x1f,0x2e,0x6d,0x72,0x63,
0x2e,0x70,0x72,0x6f,0x74,0x6f,0x2e,0x50,0x72,0x6f,
0x74,0x6f,0x62,0x75,0x66,0x4a,0x6f,0x79,0x73,0x74,
0x69,0x63,0x6b,0x44,0x61,0x74,0x61,0x52,0x09,0x4a,
0x6f,0x79,0x73,0x74,0x69,0x63,0x6b,0x73,0x12,0x24,
0x0a,0x0d,0x43,0x75,0x72,0x72,0x65,0x6e,0x74,0x4f,
0x70,0x4d,0x6f,0x64,0x65,0x18,0x04,0x20,0x01,0x28,
0x06,0x52,0x0d,0x43,0x75,0x72,0x72,0x65,0x6e,0x74,
0x4f,0x70,0x4d,0x6f,0x64,0x65,0x22,0xac,0x01,0x0a,
0x1a,0x50,0x72,0x6f,0x74,0x6f,0x62,0x75,0x66,0x4a,
0x6f,0x79,0x73,0x74,0x69,0x63,0x6b,0x44,0x65,0x73,
0x63,0x72,0x69,0x70,0x74,0x6f,0x72,0x12,0x22,0x0a,
0x0c,0x4a,0x6f,0x79,0x73,0x74,0x69,0x63,0x6b,0x4e,
0x61,0x6d,0x65,0x18,0x01,0x20,0x01,0x28,0x09,0x52,
0x0c,0x4a,0x6f,0x79,0x73,0x74,0x69,0x63,0x6b,0x4e,
0x61,0x6d,0x65,0x12,0x1c,0x0a,0x09,0x49,0x73,0x47,
0x61,0x6d,0x65,0x70,0x61,0x64,0x18,0x02,0x20,0x01,
0x28,0x08,0x52,0x09,0x49,0x73,0x47,0x61,0x6d,0x65,
0x70,0x61,0x64,0x12,0x20,0x0a,0x0b,0x47,0x61,0x6d,
0x65,0x70,0x61,0x64,0x54,0x79,0x70,0x65,0x18,0x03,
0x20,0x01,0x28,0x0d,0x52,0x0b,0x47,0x61,0x6d,0x65,
0x70,0x61,0x64,0x54,0x79,0x70,0x65,0x12,0x2a,0x0a,
0x10,0x53,0x75,0x70,0x70,0x6f,0x72,0x74,0x65,0x64,
0x4f,0x75,0x74,0x70,0x75,0x74,0x73,0x18,0x04,0x20,
0x01,0x28,0x0d,0x52,0x10,0x53,0x75,0x70,0x70,0x6f,
0x72,0x74,0x65,0x64,0x4f,0x75,0x74,0x70,0x75,0x74,
0x73,0x22,0x66,0x0a,0x1b,0x50,0x72,0x6f,0x74,0x6f,
0x61,0x52,0x09,0x4a,0x6f,0x79,0x73,0x74,0x69,0x63,
0x6b,0x73,0x12,0x24,0x0a,0x0d,0x43,0x75,0x72,0x72,
0x65,0x6e,0x74,0x4f,0x70,0x4d,0x6f,0x64,0x65,0x18,
0x04,0x20,0x01,0x28,0x06,0x52,0x0d,0x43,0x75,0x72,
0x72,0x65,0x6e,0x74,0x4f,0x70,0x4d,0x6f,0x64,0x65,
0x22,0xac,0x01,0x0a,0x1a,0x50,0x72,0x6f,0x74,0x6f,
0x62,0x75,0x66,0x4a,0x6f,0x79,0x73,0x74,0x69,0x63,
0x6b,0x44,0x65,0x73,0x63,0x72,0x69,0x70,0x74,0x6f,
0x72,0x73,0x12,0x47,0x0a,0x0b,0x44,0x65,0x73,0x63,
0x72,0x69,0x70,0x74,0x6f,0x72,0x73,0x18,0x01,0x20,
0x03,0x28,0x0b,0x32,0x25,0x2e,0x6d,0x72,0x63,0x2e,
0x70,0x72,0x6f,0x74,0x6f,0x2e,0x50,0x72,0x6f,0x74,
0x6f,0x62,0x75,0x66,0x4a,0x6f,0x79,0x73,0x74,0x69,
0x63,0x6b,0x44,0x65,0x73,0x63,0x72,0x69,0x70,0x74,
0x6f,0x72,0x52,0x0b,0x44,0x65,0x73,0x63,0x72,0x69,
0x70,0x74,0x6f,0x72,0x73,0x22,0x6a,0x0a,0x16,0x50,
0x72,0x12,0x22,0x0a,0x0c,0x4a,0x6f,0x79,0x73,0x74,
0x69,0x63,0x6b,0x4e,0x61,0x6d,0x65,0x18,0x01,0x20,
0x01,0x28,0x09,0x52,0x0c,0x4a,0x6f,0x79,0x73,0x74,
0x69,0x63,0x6b,0x4e,0x61,0x6d,0x65,0x12,0x1c,0x0a,
0x09,0x49,0x73,0x47,0x61,0x6d,0x65,0x70,0x61,0x64,
0x18,0x02,0x20,0x01,0x28,0x08,0x52,0x09,0x49,0x73,
0x47,0x61,0x6d,0x65,0x70,0x61,0x64,0x12,0x20,0x0a,
0x0b,0x47,0x61,0x6d,0x65,0x70,0x61,0x64,0x54,0x79,
0x70,0x65,0x18,0x03,0x20,0x01,0x28,0x0d,0x52,0x0b,
0x47,0x61,0x6d,0x65,0x70,0x61,0x64,0x54,0x79,0x70,
0x65,0x12,0x2a,0x0a,0x10,0x53,0x75,0x70,0x70,0x6f,
0x72,0x74,0x65,0x64,0x4f,0x75,0x74,0x70,0x75,0x74,
0x73,0x18,0x04,0x20,0x01,0x28,0x0d,0x52,0x10,0x53,
0x75,0x70,0x70,0x6f,0x72,0x74,0x65,0x64,0x4f,0x75,
0x74,0x70,0x75,0x74,0x73,0x22,0x66,0x0a,0x1b,0x50,
0x72,0x6f,0x74,0x6f,0x62,0x75,0x66,0x4a,0x6f,0x79,
0x73,0x74,0x69,0x63,0x6b,0x4f,0x75,0x74,0x70,0x75,
0x74,0x12,0x12,0x0a,0x04,0x4c,0x45,0x44,0x73,0x18,
0x01,0x20,0x01,0x28,0x0d,0x52,0x04,0x4c,0x45,0x44,
0x73,0x12,0x16,0x0a,0x06,0x52,0x75,0x6d,0x62,0x6c,
0x65,0x18,0x02,0x20,0x01,0x28,0x0d,0x52,0x06,0x52,
0x75,0x6d,0x62,0x6c,0x65,0x12,0x24,0x0a,0x0d,0x54,
0x72,0x69,0x67,0x67,0x65,0x72,0x52,0x75,0x6d,0x62,
0x6c,0x65,0x18,0x03,0x20,0x01,0x28,0x0d,0x52,0x0d,
0x54,0x72,0x69,0x67,0x67,0x65,0x72,0x52,0x75,0x6d,
0x62,0x6c,0x65,0x22,0x56,0x0a,0x17,0x50,0x72,0x6f,
0x74,0x6f,0x62,0x75,0x66,0x4a,0x6f,0x79,0x73,0x74,
0x69,0x63,0x6b,0x4f,0x75,0x74,0x70,0x75,0x74,0x73,
0x12,0x3b,0x0a,0x07,0x4f,0x75,0x74,0x70,0x75,0x74,
0x73,0x18,0x01,0x20,0x03,0x28,0x0b,0x32,0x21,0x2e,
0x73,0x74,0x69,0x63,0x6b,0x44,0x65,0x73,0x63,0x72,
0x69,0x70,0x74,0x6f,0x72,0x73,0x12,0x47,0x0a,0x0b,
0x44,0x65,0x73,0x63,0x72,0x69,0x70,0x74,0x6f,0x72,
0x73,0x18,0x01,0x20,0x03,0x28,0x0b,0x32,0x25,0x2e,
0x6d,0x72,0x63,0x2e,0x70,0x72,0x6f,0x74,0x6f,0x2e,
0x50,0x72,0x6f,0x74,0x6f,0x62,0x75,0x66,0x4a,0x6f,
0x79,0x73,0x74,0x69,0x63,0x6b,0x4f,0x75,0x74,0x70,
0x75,0x74,0x52,0x07,0x4f,0x75,0x74,0x70,0x75,0x74,
0x73,0x22,0x95,0x01,0x0a,0x11,0x50,0x72,0x6f,0x74,
0x6f,0x62,0x75,0x66,0x4d,0x61,0x74,0x63,0x68,0x49,
0x6e,0x66,0x6f,0x12,0x1c,0x0a,0x09,0x45,0x76,0x65,
0x6e,0x74,0x4e,0x61,0x6d,0x65,0x18,0x01,0x20,0x01,
0x28,0x09,0x52,0x09,0x45,0x76,0x65,0x6e,0x74,0x4e,
0x61,0x6d,0x65,0x12,0x20,0x0a,0x0b,0x4d,0x61,0x74,
0x63,0x68,0x4e,0x75,0x6d,0x62,0x65,0x72,0x18,0x02,
0x20,0x01,0x28,0x05,0x52,0x0b,0x4d,0x61,0x74,0x63,
0x68,0x4e,0x75,0x6d,0x62,0x65,0x72,0x12,0x22,0x0a,
0x0c,0x52,0x65,0x70,0x6c,0x61,0x79,0x4e,0x75,0x6d,
0x62,0x65,0x72,0x18,0x03,0x20,0x01,0x28,0x05,0x52,
0x0c,0x52,0x65,0x70,0x6c,0x61,0x79,0x4e,0x75,0x6d,
0x62,0x65,0x72,0x12,0x1c,0x0a,0x09,0x4d,0x61,0x74,
0x63,0x68,0x54,0x79,0x70,0x65,0x18,0x04,0x20,0x01,
0x28,0x05,0x52,0x09,0x4d,0x61,0x74,0x63,0x68,0x54,
0x79,0x70,0x65,0x22,0x9f,0x01,0x0a,0x11,0x50,0x72,
0x6f,0x74,0x6f,0x62,0x75,0x66,0x45,0x72,0x72,0x6f,
0x72,0x49,0x6e,0x66,0x6f,0x12,0x18,0x0a,0x07,0x49,
0x73,0x45,0x72,0x72,0x6f,0x72,0x18,0x01,0x20,0x01,
0x28,0x08,0x52,0x07,0x49,0x73,0x45,0x72,0x72,0x6f,
0x72,0x12,0x1c,0x0a,0x09,0x45,0x72,0x72,0x6f,0x72,
0x43,0x6f,0x64,0x65,0x18,0x02,0x20,0x01,0x28,0x11,
0x52,0x09,0x45,0x72,0x72,0x6f,0x72,0x43,0x6f,0x64,
0x65,0x12,0x18,0x0a,0x07,0x44,0x65,0x74,0x61,0x69,
0x6c,0x73,0x18,0x03,0x20,0x01,0x28,0x09,0x52,0x07,
0x44,0x65,0x74,0x61,0x69,0x6c,0x73,0x12,0x1a,0x0a,
0x08,0x4c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x18,
0x04,0x20,0x01,0x28,0x09,0x52,0x08,0x4c,0x6f,0x63,
0x61,0x74,0x69,0x6f,0x6e,0x12,0x1c,0x0a,0x09,0x43,
0x61,0x6c,0x6c,0x53,0x74,0x61,0x63,0x6b,0x18,0x05,
0x20,0x01,0x28,0x09,0x52,0x09,0x43,0x61,0x6c,0x6c,
0x53,0x74,0x61,0x63,0x6b,0x22,0x38,0x0a,0x0e,0x50,
0x72,0x6f,0x74,0x6f,0x62,0x75,0x66,0x4f,0x70,0x4d,
0x6f,0x64,0x65,0x12,0x12,0x0a,0x04,0x48,0x61,0x73,
0x68,0x18,0x01,0x20,0x01,0x28,0x06,0x52,0x04,0x48,
0x61,0x73,0x68,0x12,0x12,0x0a,0x04,0x4e,0x61,0x6d,
0x65,0x18,0x02,0x20,0x01,0x28,0x09,0x52,0x04,0x4e,
0x61,0x6d,0x65,0x22,0x4b,0x0a,0x18,0x50,0x72,0x6f,
0x74,0x6f,0x62,0x75,0x66,0x41,0x76,0x61,0x69,0x6c,
0x61,0x62,0x6c,0x65,0x4f,0x70,0x4d,0x6f,0x64,0x65,
0x73,0x12,0x2f,0x0a,0x05,0x4d,0x6f,0x64,0x65,0x73,
0x18,0x01,0x20,0x03,0x28,0x0b,0x32,0x19,0x2e,0x6d,
0x72,0x63,0x2e,0x70,0x72,0x6f,0x74,0x6f,0x2e,0x50,
0x72,0x6f,0x74,0x6f,0x62,0x75,0x66,0x4f,0x70,0x4d,
0x6f,0x64,0x65,0x52,0x05,0x4d,0x6f,0x64,0x65,0x73,
0x22,0xc4,0x01,0x0a,0x1a,0x50,0x72,0x6f,0x74,0x6f,
0x62,0x75,0x66,0x45,0x72,0x72,0x6f,0x72,0x49,0x6e,
0x66,0x6f,0x54,0x69,0x6d,0x65,0x73,0x74,0x61,0x6d,
0x70,0x12,0x3a,0x0a,0x09,0x45,0x72,0x72,0x6f,0x72,
0x49,0x6e,0x66,0x6f,0x18,0x01,0x20,0x01,0x28,0x0b,
0x32,0x1c,0x2e,0x6d,0x72,0x63,0x2e,0x70,0x72,0x6f,
0x79,0x73,0x74,0x69,0x63,0x6b,0x44,0x65,0x73,0x63,
0x72,0x69,0x70,0x74,0x6f,0x72,0x52,0x0b,0x44,0x65,
0x73,0x63,0x72,0x69,0x70,0x74,0x6f,0x72,0x73,0x22,
0x6a,0x0a,0x16,0x50,0x72,0x6f,0x74,0x6f,0x62,0x75,
0x66,0x4a,0x6f,0x79,0x73,0x74,0x69,0x63,0x6b,0x4f,
0x75,0x74,0x70,0x75,0x74,0x12,0x12,0x0a,0x04,0x4c,
0x45,0x44,0x73,0x18,0x01,0x20,0x01,0x28,0x0d,0x52,
0x04,0x4c,0x45,0x44,0x73,0x12,0x16,0x0a,0x06,0x52,
0x75,0x6d,0x62,0x6c,0x65,0x18,0x02,0x20,0x01,0x28,
0x0d,0x52,0x06,0x52,0x75,0x6d,0x62,0x6c,0x65,0x12,
0x24,0x0a,0x0d,0x54,0x72,0x69,0x67,0x67,0x65,0x72,
0x52,0x75,0x6d,0x62,0x6c,0x65,0x18,0x03,0x20,0x01,
0x28,0x0d,0x52,0x0d,0x54,0x72,0x69,0x67,0x67,0x65,
0x72,0x52,0x75,0x6d,0x62,0x6c,0x65,0x22,0x56,0x0a,
0x17,0x50,0x72,0x6f,0x74,0x6f,0x62,0x75,0x66,0x4a,
0x6f,0x79,0x73,0x74,0x69,0x63,0x6b,0x4f,0x75,0x74,
0x70,0x75,0x74,0x73,0x12,0x3b,0x0a,0x07,0x4f,0x75,
0x74,0x70,0x75,0x74,0x73,0x18,0x01,0x20,0x03,0x28,
0x0b,0x32,0x21,0x2e,0x6d,0x72,0x63,0x2e,0x70,0x72,
0x6f,0x74,0x6f,0x2e,0x50,0x72,0x6f,0x74,0x6f,0x62,
0x75,0x66,0x4a,0x6f,0x79,0x73,0x74,0x69,0x63,0x6b,
0x4f,0x75,0x74,0x70,0x75,0x74,0x52,0x07,0x4f,0x75,
0x74,0x70,0x75,0x74,0x73,0x22,0x95,0x01,0x0a,0x11,
0x50,0x72,0x6f,0x74,0x6f,0x62,0x75,0x66,0x4d,0x61,
0x74,0x63,0x68,0x49,0x6e,0x66,0x6f,0x12,0x1c,0x0a,
0x09,0x45,0x76,0x65,0x6e,0x74,0x4e,0x61,0x6d,0x65,
0x18,0x01,0x20,0x01,0x28,0x09,0x52,0x09,0x45,0x76,
0x65,0x6e,0x74,0x4e,0x61,0x6d,0x65,0x12,0x20,0x0a,
0x0b,0x4d,0x61,0x74,0x63,0x68,0x4e,0x75,0x6d,0x62,
0x65,0x72,0x18,0x02,0x20,0x01,0x28,0x05,0x52,0x0b,
0x4d,0x61,0x74,0x63,0x68,0x4e,0x75,0x6d,0x62,0x65,
0x72,0x12,0x22,0x0a,0x0c,0x52,0x65,0x70,0x6c,0x61,
0x79,0x4e,0x75,0x6d,0x62,0x65,0x72,0x18,0x03,0x20,
0x01,0x28,0x05,0x52,0x0c,0x52,0x65,0x70,0x6c,0x61,
0x79,0x4e,0x75,0x6d,0x62,0x65,0x72,0x12,0x1c,0x0a,
0x09,0x4d,0x61,0x74,0x63,0x68,0x54,0x79,0x70,0x65,
0x18,0x04,0x20,0x01,0x28,0x05,0x52,0x09,0x4d,0x61,
0x74,0x63,0x68,0x54,0x79,0x70,0x65,0x22,0x9f,0x01,
0x0a,0x11,0x50,0x72,0x6f,0x74,0x6f,0x62,0x75,0x66,
0x45,0x72,0x72,0x6f,0x72,0x49,0x6e,0x66,0x6f,0x12,
0x18,0x0a,0x07,0x49,0x73,0x45,0x72,0x72,0x6f,0x72,
0x18,0x01,0x20,0x01,0x28,0x08,0x52,0x07,0x49,0x73,
0x45,0x72,0x72,0x6f,0x72,0x12,0x1c,0x0a,0x09,0x45,
0x72,0x72,0x6f,0x72,0x43,0x6f,0x64,0x65,0x18,0x02,
0x20,0x01,0x28,0x11,0x52,0x09,0x45,0x72,0x72,0x6f,
0x72,0x43,0x6f,0x64,0x65,0x12,0x18,0x0a,0x07,0x44,
0x65,0x74,0x61,0x69,0x6c,0x73,0x18,0x03,0x20,0x01,
0x28,0x09,0x52,0x07,0x44,0x65,0x74,0x61,0x69,0x6c,
0x73,0x12,0x1a,0x0a,0x08,0x4c,0x6f,0x63,0x61,0x74,
0x69,0x6f,0x6e,0x18,0x04,0x20,0x01,0x28,0x09,0x52,
0x08,0x4c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x12,
0x1c,0x0a,0x09,0x43,0x61,0x6c,0x6c,0x53,0x74,0x61,
0x63,0x6b,0x18,0x05,0x20,0x01,0x28,0x09,0x52,0x09,
0x43,0x61,0x6c,0x6c,0x53,0x74,0x61,0x63,0x6b,0x22,
0x38,0x0a,0x0e,0x50,0x72,0x6f,0x74,0x6f,0x62,0x75,
0x66,0x4f,0x70,0x4d,0x6f,0x64,0x65,0x12,0x12,0x0a,
0x04,0x48,0x61,0x73,0x68,0x18,0x01,0x20,0x01,0x28,
0x06,0x52,0x04,0x48,0x61,0x73,0x68,0x12,0x12,0x0a,
0x04,0x4e,0x61,0x6d,0x65,0x18,0x02,0x20,0x01,0x28,
0x09,0x52,0x04,0x4e,0x61,0x6d,0x65,0x22,0x4b,0x0a,
0x18,0x50,0x72,0x6f,0x74,0x6f,0x62,0x75,0x66,0x41,
0x76,0x61,0x69,0x6c,0x61,0x62,0x6c,0x65,0x4f,0x70,
0x4d,0x6f,0x64,0x65,0x73,0x12,0x2f,0x0a,0x05,0x4d,
0x6f,0x64,0x65,0x73,0x18,0x01,0x20,0x03,0x28,0x0b,
0x32,0x19,0x2e,0x6d,0x72,0x63,0x2e,0x70,0x72,0x6f,
0x74,0x6f,0x2e,0x50,0x72,0x6f,0x74,0x6f,0x62,0x75,
0x66,0x45,0x72,0x72,0x6f,0x72,0x49,0x6e,0x66,0x6f,
0x52,0x09,0x45,0x72,0x72,0x6f,0x72,0x49,0x6e,0x66,
0x6f,0x12,0x1c,0x0a,0x09,0x54,0x69,0x6d,0x65,0x73,
0x74,0x61,0x6d,0x70,0x18,0x02,0x20,0x01,0x28,0x04,
0x52,0x09,0x54,0x69,0x6d,0x65,0x73,0x74,0x61,0x6d,
0x70,0x12,0x26,0x0a,0x0e,0x53,0x65,0x71,0x75,0x65,
0x6e,0x63,0x65,0x4e,0x75,0x6d,0x62,0x65,0x72,0x18,
0x03,0x20,0x01,0x28,0x05,0x52,0x0e,0x53,0x65,0x71,
0x75,0x65,0x6e,0x63,0x65,0x4e,0x75,0x6d,0x62,0x65,
0x72,0x12,0x24,0x0a,0x0d,0x4e,0x75,0x6d,0x4f,0x63,
0x63,0x75,0x72,0x61,0x6e,0x63,0x65,0x73,0x18,0x04,
0x20,0x01,0x28,0x05,0x52,0x0d,0x4e,0x75,0x6d,0x4f,
0x63,0x63,0x75,0x72,0x61,0x6e,0x63,0x65,0x73,0x22,
0x86,0x01,0x0a,0x1c,0x50,0x72,0x6f,0x74,0x6f,0x62,
0x75,0x66,0x43,0x6f,0x6e,0x73,0x6f,0x6c,0x65,0x4c,
0x69,0x6e,0x65,0x54,0x69,0x6d,0x65,0x73,0x74,0x61,
0x6d,0x70,0x12,0x20,0x0a,0x0b,0x43,0x6f,0x6e,0x73,
0x6f,0x6c,0x65,0x4c,0x69,0x6e,0x65,0x18,0x01,0x20,
0x01,0x28,0x09,0x52,0x0b,0x43,0x6f,0x6e,0x73,0x6f,
0x6c,0x65,0x4c,0x69,0x6e,0x65,0x12,0x1c,0x0a,0x09,
0x54,0x69,0x6d,0x65,0x73,0x74,0x61,0x6d,0x70,0x18,
0x02,0x20,0x01,0x28,0x04,0x52,0x09,0x54,0x69,0x6d,
0x65,0x73,0x74,0x61,0x6d,0x70,0x12,0x26,0x0a,0x0e,
0x53,0x65,0x71,0x75,0x65,0x6e,0x63,0x65,0x4e,0x75,
0x6d,0x62,0x65,0x72,0x18,0x03,0x20,0x01,0x28,0x05,
0x52,0x0e,0x53,0x65,0x71,0x75,0x65,0x6e,0x63,0x65,
0x4e,0x75,0x6d,0x62,0x65,0x72,0x42,0x0f,0x0a,0x0d,
0x63,0x6f,0x6d,0x2e,0x6d,0x72,0x63,0x2e,0x70,0x72,
0x6f,0x74,0x6f,0x4a,0xb4,0x14,0x0a,0x06,0x12,0x04,
0x00,0x00,0x50,0x01,0x0a,0x08,0x0a,0x01,0x0c,0x12,
0x03,0x00,0x00,0x12,0x0a,0x08,0x0a,0x01,0x02,0x12,
0x03,0x02,0x00,0x12,0x0a,0x08,0x0a,0x01,0x08,0x12,
0x03,0x04,0x00,0x26,0x0a,0x09,0x0a,0x02,0x08,0x01,
0x12,0x03,0x04,0x00,0x26,0x0a,0x0a,0x0a,0x02,0x04,
0x00,0x12,0x04,0x06,0x00,0x0f,0x01,0x0a,0x0a,0x0a,
0x03,0x04,0x00,0x01,0x12,0x03,0x06,0x08,0x1c,0x0a,
0x0b,0x0a,0x04,0x04,0x00,0x02,0x00,0x12,0x03,0x07,
0x04,0x20,0x0a,0x0c,0x0a,0x05,0x04,0x00,0x02,0x00,
0x05,0x12,0x03,0x07,0x04,0x0a,0x0a,0x0c,0x0a,0x05,
0x04,0x00,0x02,0x00,0x01,0x12,0x03,0x07,0x0b,0x1b,
0x0a,0x0c,0x0a,0x05,0x04,0x00,0x02,0x00,0x03,0x12,
0x03,0x07,0x1e,0x1f,0x0a,0x0b,0x0a,0x04,0x04,0x00,
0x02,0x01,0x12,0x03,0x08,0x04,0x17,0x0a,0x0c,0x0a,
0x05,0x04,0x00,0x02,0x01,0x05,0x12,0x03,0x08,0x04,
0x0a,0x0a,0x0c,0x0a,0x05,0x04,0x00,0x02,0x01,0x01,
0x12,0x03,0x08,0x0b,0x12,0x0a,0x0c,0x0a,0x05,0x04,
0x00,0x02,0x01,0x03,0x12,0x03,0x08,0x15,0x16,0x0a,
0x0b,0x0a,0x04,0x04,0x00,0x02,0x02,0x12,0x03,0x09,
0x04,0x1d,0x0a,0x0c,0x0a,0x05,0x04,0x00,0x02,0x02,
0x05,0x12,0x03,0x09,0x04,0x0a,0x0a,0x0c,0x0a,0x05,
0x04,0x00,0x02,0x02,0x01,0x12,0x03,0x09,0x0b,0x18,
0x0a,0x0c,0x0a,0x05,0x04,0x00,0x02,0x02,0x03,0x12,
0x03,0x09,0x1b,0x1c,0x0a,0x0b,0x0a,0x04,0x04,0x00,
0x02,0x03,0x12,0x03,0x0a,0x04,0x1d,0x0a,0x0c,0x0a,
0x05,0x04,0x00,0x02,0x03,0x04,0x12,0x03,0x0a,0x04,
0x0c,0x0a,0x0c,0x0a,0x05,0x04,0x00,0x02,0x03,0x05,
0x12,0x03,0x0a,0x0d,0x13,0x0a,0x0c,0x0a,0x05,0x04,
0x00,0x02,0x03,0x01,0x12,0x03,0x0a,0x14,0x18,0x0a,
0x0c,0x0a,0x05,0x04,0x00,0x02,0x03,0x03,0x12,0x03,
0x0a,0x1b,0x1c,0x0a,0x3e,0x0a,0x04,0x04,0x00,0x02,
0x04,0x12,0x03,0x0d,0x04,0x18,0x1a,0x31,0x20,0x45,
0x61,0x63,0x68,0x20,0x50,0x4f,0x56,0x20,0x74,0x61,
0x6b,0x65,0x73,0x20,0x75,0x70,0x20,0x34,0x20,0x62,
0x69,0x74,0x73,0x0a,0x20,0x57,0x65,0x20,0x63,0x61,
0x6e,0x20,0x66,0x69,0x74,0x20,0x38,0x20,0x69,0x6e,
0x20,0x68,0x65,0x72,0x65,0x2e,0x0a,0x0a,0x0c,0x0a,
0x05,0x04,0x00,0x02,0x04,0x05,0x12,0x03,0x0d,0x04,
0x0a,0x0a,0x0c,0x0a,0x05,0x04,0x00,0x02,0x04,0x01,
0x12,0x03,0x0d,0x0b,0x13,0x0a,0x0c,0x0a,0x05,0x04,
0x00,0x02,0x04,0x03,0x12,0x03,0x0d,0x16,0x17,0x0a,
0x0b,0x0a,0x04,0x04,0x00,0x02,0x05,0x12,0x03,0x0e,
0x04,0x14,0x0a,0x0c,0x0a,0x05,0x04,0x00,0x02,0x05,
0x05,0x12,0x03,0x0e,0x04,0x0a,0x0a,0x0c,0x0a,0x05,
0x04,0x00,0x02,0x05,0x01,0x12,0x03,0x0e,0x0b,0x0f,
0x0a,0x0c,0x0a,0x05,0x04,0x00,0x02,0x05,0x03,0x12,
0x03,0x0e,0x12,0x13,0x0a,0x0a,0x0a,0x02,0x04,0x01,
0x12,0x04,0x11,0x00,0x16,0x01,0x0a,0x0a,0x0a,0x03,
0x04,0x01,0x01,0x12,0x03,0x11,0x08,0x1b,0x0a,0x0b,
0x0a,0x04,0x04,0x01,0x02,0x00,0x12,0x03,0x12,0x04,
0x1b,0x0a,0x0c,0x0a,0x05,0x04,0x01,0x02,0x00,0x05,
0x12,0x03,0x12,0x04,0x0a,0x0a,0x0c,0x0a,0x05,0x04,
0x01,0x02,0x00,0x01,0x12,0x03,0x12,0x0b,0x16,0x0a,
0x0c,0x0a,0x05,0x04,0x01,0x02,0x00,0x03,0x12,0x03,
0x12,0x19,0x1a,0x0a,0x0b,0x0a,0x04,0x04,0x01,0x02,
0x01,0x12,0x03,0x13,0x04,0x18,0x0a,0x0c,0x0a,0x05,
0x04,0x01,0x02,0x01,0x05,0x12,0x03,0x13,0x04,0x09,
0x0a,0x0c,0x0a,0x05,0x04,0x01,0x02,0x01,0x01,0x12,
0x03,0x13,0x0a,0x13,0x0a,0x0c,0x0a,0x05,0x04,0x01,
0x02,0x01,0x03,0x12,0x03,0x13,0x16,0x17,0x0a,0x0b,
0x0a,0x04,0x04,0x01,0x02,0x02,0x12,0x03,0x14,0x04,
0x30,0x0a,0x0c,0x0a,0x05,0x04,0x01,0x02,0x02,0x04,
0x12,0x03,0x14,0x04,0x0c,0x0a,0x0c,0x0a,0x05,0x04,
0x01,0x02,0x02,0x06,0x12,0x03,0x14,0x0d,0x21,0x0a,
0x0c,0x0a,0x05,0x04,0x01,0x02,0x02,0x01,0x12,0x03,
0x14,0x22,0x2b,0x0a,0x0c,0x0a,0x05,0x04,0x01,0x02,
0x02,0x03,0x12,0x03,0x14,0x2e,0x2f,0x0a,0x0b,0x0a,
0x04,0x04,0x01,0x02,0x03,0x12,0x03,0x15,0x04,0x1e,
0x0a,0x0c,0x0a,0x05,0x04,0x01,0x02,0x03,0x05,0x12,
0x03,0x15,0x04,0x0b,0x0a,0x0c,0x0a,0x05,0x04,0x01,
0x02,0x03,0x01,0x12,0x03,0x15,0x0c,0x19,0x0a,0x0c,
0x0a,0x05,0x04,0x01,0x02,0x03,0x03,0x12,0x03,0x15,
0x1c,0x1d,0x0a,0x0a,0x0a,0x02,0x04,0x02,0x12,0x04,
0x18,0x00,0x1d,0x01,0x0a,0x0a,0x0a,0x03,0x04,0x02,
0x01,0x12,0x03,0x18,0x08,0x22,0x0a,0x0b,0x0a,0x04,
0x04,0x02,0x02,0x00,0x12,0x03,0x19,0x04,0x1c,0x0a,
0x0c,0x0a,0x05,0x04,0x02,0x02,0x00,0x05,0x12,0x03,
0x19,0x04,0x0a,0x0a,0x0c,0x0a,0x05,0x04,0x02,0x02,
0x00,0x01,0x12,0x03,0x19,0x0b,0x17,0x0a,0x0c,0x0a,
0x05,0x04,0x02,0x02,0x00,0x03,0x12,0x03,0x19,0x1a,
0x1b,0x0a,0x0b,0x0a,0x04,0x04,0x02,0x02,0x01,0x12,
0x03,0x1a,0x04,0x17,0x0a,0x0c,0x0a,0x05,0x04,0x02,
0x02,0x01,0x05,0x12,0x03,0x1a,0x04,0x08,0x0a,0x0c,
0x0a,0x05,0x04,0x02,0x02,0x01,0x01,0x12,0x03,0x1a,
0x09,0x12,0x0a,0x0c,0x0a,0x05,0x04,0x02,0x02,0x01,
0x03,0x12,0x03,0x1a,0x15,0x16,0x0a,0x0b,0x0a,0x04,
0x04,0x02,0x02,0x02,0x12,0x03,0x1b,0x04,0x1b,0x0a,
0x0c,0x0a,0x05,0x04,0x02,0x02,0x02,0x05,0x12,0x03,
0x1b,0x04,0x0a,0x0a,0x0c,0x0a,0x05,0x04,0x02,0x02,
0x02,0x01,0x12,0x03,0x1b,0x0b,0x16,0x0a,0x0c,0x0a,
0x05,0x04,0x02,0x02,0x02,0x03,0x12,0x03,0x1b,0x19,
0x1a,0x0a,0x0b,0x0a,0x04,0x04,0x02,0x02,0x03,0x12,
0x03,0x1c,0x04,0x20,0x0a,0x0c,0x0a,0x05,0x04,0x02,
0x02,0x03,0x05,0x12,0x03,0x1c,0x04,0x0a,0x0a,0x0c,
0x0a,0x05,0x04,0x02,0x02,0x03,0x01,0x12,0x03,0x1c,
0x0b,0x1b,0x0a,0x0c,0x0a,0x05,0x04,0x02,0x02,0x03,
0x03,0x12,0x03,0x1c,0x1e,0x1f,0x0a,0x0a,0x0a,0x02,
0x04,0x03,0x12,0x04,0x1f,0x00,0x21,0x01,0x0a,0x0a,
0x0a,0x03,0x04,0x03,0x01,0x12,0x03,0x1f,0x08,0x23,
0x0a,0x0b,0x0a,0x04,0x04,0x03,0x02,0x00,0x12,0x03,
0x20,0x04,0x38,0x0a,0x0c,0x0a,0x05,0x04,0x03,0x02,
0x00,0x04,0x12,0x03,0x20,0x04,0x0c,0x0a,0x0c,0x0a,
0x05,0x04,0x03,0x02,0x00,0x06,0x12,0x03,0x20,0x0d,
0x27,0x0a,0x0c,0x0a,0x05,0x04,0x03,0x02,0x00,0x01,
0x12,0x03,0x20,0x28,0x33,0x0a,0x0c,0x0a,0x05,0x04,
0x03,0x02,0x00,0x03,0x12,0x03,0x20,0x36,0x37,0x0a,
0x0a,0x0a,0x02,0x04,0x04,0x12,0x04,0x23,0x00,0x27,
0x01,0x0a,0x0a,0x0a,0x03,0x04,0x04,0x01,0x12,0x03,
0x23,0x08,0x1e,0x0a,0x0b,0x0a,0x04,0x04,0x04,0x02,
0x00,0x12,0x03,0x24,0x04,0x14,0x0a,0x0c,0x0a,0x05,
0x04,0x04,0x02,0x00,0x05,0x12,0x03,0x24,0x04,0x0a,
0x0a,0x0c,0x0a,0x05,0x04,0x04,0x02,0x00,0x01,0x12,
0x03,0x24,0x0b,0x0f,0x0a,0x0c,0x0a,0x05,0x04,0x04,
0x02,0x00,0x03,0x12,0x03,0x24,0x12,0x13,0x0a,0x2b,
0x0a,0x04,0x04,0x04,0x02,0x01,0x12,0x03,0x25,0x04,
0x16,0x22,0x1e,0x20,0x31,0x36,0x20,0x62,0x69,0x74,
0x73,0x2c,0x20,0x6c,0x65,0x66,0x74,0x20,0x6d,0x73,
0x62,0x2c,0x20,0x72,0x69,0x67,0x68,0x74,0x20,0x6c,
0x73,0x62,0x0a,0x0a,0x0c,0x0a,0x05,0x04,0x04,0x02,
0x01,0x05,0x12,0x03,0x25,0x04,0x0a,0x0a,0x0c,0x0a,
0x05,0x04,0x04,0x02,0x01,0x01,0x12,0x03,0x25,0x0b,
0x11,0x0a,0x0c,0x0a,0x05,0x04,0x04,0x02,0x01,0x03,
0x12,0x03,0x25,0x14,0x15,0x0a,0x2b,0x0a,0x04,0x04,
0x04,0x02,0x02,0x12,0x03,0x26,0x04,0x1d,0x22,0x1e,
0x20,0x31,0x36,0x20,0x62,0x69,0x74,0x73,0x2c,0x20,
0x6c,0x65,0x66,0x74,0x20,0x6d,0x73,0x62,0x2c,0x20,
0x72,0x69,0x67,0x68,0x74,0x20,0x6c,0x73,0x62,0x0a,
0x0a,0x0c,0x0a,0x05,0x04,0x04,0x02,0x02,0x05,0x12,
0x03,0x26,0x04,0x0a,0x0a,0x0c,0x0a,0x05,0x04,0x04,
0x02,0x02,0x01,0x12,0x03,0x26,0x0b,0x18,0x0a,0x0c,
0x0a,0x05,0x04,0x04,0x02,0x02,0x03,0x12,0x03,0x26,
0x1b,0x1c,0x0a,0x0a,0x0a,0x02,0x04,0x05,0x12,0x04,
0x29,0x00,0x2b,0x01,0x0a,0x0a,0x0a,0x03,0x04,0x05,
0x01,0x12,0x03,0x29,0x08,0x1f,0x0a,0x0b,0x0a,0x04,
0x04,0x05,0x02,0x00,0x12,0x03,0x2a,0x04,0x30,0x0a,
0x0c,0x0a,0x05,0x04,0x05,0x02,0x00,0x04,0x12,0x03,
0x2a,0x04,0x0c,0x0a,0x0c,0x0a,0x05,0x04,0x05,0x02,
0x00,0x06,0x12,0x03,0x2a,0x0d,0x23,0x0a,0x0c,0x0a,
0x05,0x04,0x05,0x02,0x00,0x01,0x12,0x03,0x2a,0x24,
0x2b,0x0a,0x0c,0x0a,0x05,0x04,0x05,0x02,0x00,0x03,
0x12,0x03,0x2a,0x2e,0x2f,0x0a,0x0a,0x0a,0x02,0x04,
0x06,0x12,0x04,0x2d,0x00,0x32,0x01,0x0a,0x0a,0x0a,
0x03,0x04,0x06,0x01,0x12,0x03,0x2d,0x08,0x19,0x0a,
0x0b,0x0a,0x04,0x04,0x06,0x02,0x00,0x12,0x03,0x2e,
0x04,0x19,0x0a,0x0c,0x0a,0x05,0x04,0x06,0x02,0x00,
0x05,0x12,0x03,0x2e,0x04,0x0a,0x0a,0x0c,0x0a,0x05,
0x04,0x06,0x02,0x00,0x01,0x12,0x03,0x2e,0x0b,0x14,
0x0a,0x0c,0x0a,0x05,0x04,0x06,0x02,0x00,0x03,0x12,
0x03,0x2e,0x17,0x18,0x0a,0x0b,0x0a,0x04,0x04,0x06,
0x02,0x01,0x12,0x03,0x2f,0x04,0x1a,0x0a,0x0c,0x0a,
0x05,0x04,0x06,0x02,0x01,0x05,0x12,0x03,0x2f,0x04,
0x09,0x0a,0x0c,0x0a,0x05,0x04,0x06,0x02,0x01,0x01,
0x12,0x03,0x2f,0x0a,0x15,0x0a,0x0c,0x0a,0x05,0x04,
0x06,0x02,0x01,0x03,0x12,0x03,0x2f,0x18,0x19,0x0a,
0x0b,0x0a,0x04,0x04,0x06,0x02,0x02,0x12,0x03,0x30,
0x04,0x1b,0x0a,0x0c,0x0a,0x05,0x04,0x06,0x02,0x02,
0x05,0x12,0x03,0x30,0x04,0x09,0x0a,0x0c,0x0a,0x05,
0x04,0x06,0x02,0x02,0x01,0x12,0x03,0x30,0x0a,0x16,
0x0a,0x0c,0x0a,0x05,0x04,0x06,0x02,0x02,0x03,0x12,
0x03,0x30,0x19,0x1a,0x0a,0x0b,0x0a,0x04,0x04,0x06,
0x02,0x03,0x12,0x03,0x31,0x04,0x18,0x0a,0x0c,0x0a,
0x05,0x04,0x06,0x02,0x03,0x05,0x12,0x03,0x31,0x04,
0x09,0x0a,0x0c,0x0a,0x05,0x04,0x06,0x02,0x03,0x01,
0x12,0x03,0x31,0x0a,0x13,0x0a,0x0c,0x0a,0x05,0x04,
0x06,0x02,0x03,0x03,0x12,0x03,0x31,0x16,0x17,0x0a,
0x0a,0x0a,0x02,0x04,0x07,0x12,0x04,0x34,0x00,0x3a,
0x01,0x0a,0x0a,0x0a,0x03,0x04,0x07,0x01,0x12,0x03,
0x34,0x08,0x19,0x0a,0x0b,0x0a,0x04,0x04,0x07,0x02,
0x00,0x12,0x03,0x35,0x04,0x15,0x0a,0x0c,0x0a,0x05,
0x04,0x07,0x02,0x00,0x05,0x12,0x03,0x35,0x04,0x08,
0x0a,0x0c,0x0a,0x05,0x04,0x07,0x02,0x00,0x01,0x12,
0x03,0x35,0x09,0x10,0x0a,0x0c,0x0a,0x05,0x04,0x07,
0x02,0x00,0x03,0x12,0x03,0x35,0x13,0x14,0x0a,0x0b,
0x0a,0x04,0x04,0x07,0x02,0x01,0x12,0x03,0x36,0x04,
0x19,0x0a,0x0c,0x0a,0x05,0x04,0x07,0x02,0x01,0x05,
0x12,0x03,0x36,0x04,0x0a,0x0a,0x0c,0x0a,0x05,0x04,
0x07,0x02,0x01,0x01,0x12,0x03,0x36,0x0b,0x14,0x0a,
0x0c,0x0a,0x05,0x04,0x07,0x02,0x01,0x03,0x12,0x03,
0x36,0x17,0x18,0x0a,0x0b,0x0a,0x04,0x04,0x07,0x02,
0x02,0x12,0x03,0x37,0x04,0x17,0x0a,0x0c,0x0a,0x05,
0x04,0x07,0x02,0x02,0x05,0x12,0x03,0x37,0x04,0x0a,
0x0a,0x0c,0x0a,0x05,0x04,0x07,0x02,0x02,0x01,0x12,
0x03,0x37,0x0b,0x12,0x0a,0x0c,0x0a,0x05,0x04,0x07,
0x02,0x02,0x03,0x12,0x03,0x37,0x15,0x16,0x0a,0x0b,
0x0a,0x04,0x04,0x07,0x02,0x03,0x12,0x03,0x38,0x04,
0x18,0x0a,0x0c,0x0a,0x05,0x04,0x07,0x02,0x03,0x05,
0x12,0x03,0x38,0x04,0x0a,0x0a,0x0c,0x0a,0x05,0x04,
0x07,0x02,0x03,0x01,0x12,0x03,0x38,0x0b,0x13,0x0a,
0x0c,0x0a,0x05,0x04,0x07,0x02,0x03,0x03,0x12,0x03,
0x38,0x16,0x17,0x0a,0x0b,0x0a,0x04,0x04,0x07,0x02,
0x04,0x12,0x03,0x39,0x04,0x19,0x0a,0x0c,0x0a,0x05,
0x04,0x07,0x02,0x04,0x05,0x12,0x03,0x39,0x04,0x0a,
0x0a,0x0c,0x0a,0x05,0x04,0x07,0x02,0x04,0x01,0x12,
0x03,0x39,0x0b,0x14,0x0a,0x0c,0x0a,0x05,0x04,0x07,
0x02,0x04,0x03,0x12,0x03,0x39,0x17,0x18,0x0a,0x0a,
0x0a,0x02,0x04,0x08,0x12,0x04,0x3c,0x00,0x3f,0x01,
0x0a,0x0a,0x0a,0x03,0x04,0x08,0x01,0x12,0x03,0x3c,
0x08,0x16,0x0a,0x0b,0x0a,0x04,0x04,0x08,0x02,0x00,
0x12,0x03,0x3d,0x04,0x15,0x0a,0x0c,0x0a,0x05,0x04,
0x08,0x02,0x00,0x05,0x12,0x03,0x3d,0x04,0x0b,0x0a,
0x0c,0x0a,0x05,0x04,0x08,0x02,0x00,0x01,0x12,0x03,
0x3d,0x0c,0x10,0x0a,0x0c,0x0a,0x05,0x04,0x08,0x02,
0x00,0x03,0x12,0x03,0x3d,0x13,0x14,0x0a,0x0b,0x0a,
0x04,0x04,0x08,0x02,0x01,0x12,0x03,0x3e,0x04,0x14,
0x0a,0x0c,0x0a,0x05,0x04,0x08,0x02,0x01,0x05,0x12,
0x03,0x3e,0x04,0x0a,0x0a,0x0c,0x0a,0x05,0x04,0x08,
0x02,0x01,0x01,0x12,0x03,0x3e,0x0b,0x0f,0x0a,0x0c,
0x0a,0x05,0x04,0x08,0x02,0x01,0x03,0x12,0x03,0x3e,
0x12,0x13,0x0a,0x0a,0x0a,0x02,0x04,0x09,0x12,0x04,
0x41,0x00,0x43,0x01,0x0a,0x0a,0x0a,0x03,0x04,0x09,
0x01,0x12,0x03,0x41,0x08,0x20,0x0a,0x0b,0x0a,0x04,
0x04,0x09,0x02,0x00,0x12,0x03,0x42,0x04,0x26,0x0a,
0x0c,0x0a,0x05,0x04,0x09,0x02,0x00,0x04,0x12,0x03,
0x42,0x04,0x0c,0x0a,0x0c,0x0a,0x05,0x04,0x09,0x02,
0x00,0x06,0x12,0x03,0x42,0x0d,0x1b,0x0a,0x0c,0x0a,
0x05,0x04,0x09,0x02,0x00,0x01,0x12,0x03,0x42,0x1c,
0x21,0x0a,0x0c,0x0a,0x05,0x04,0x09,0x02,0x00,0x03,
0x12,0x03,0x42,0x24,0x25,0x0a,0x0a,0x0a,0x02,0x04,
0x0a,0x12,0x04,0x45,0x00,0x4a,0x01,0x0a,0x0a,0x0a,
0x03,0x04,0x0a,0x01,0x12,0x03,0x45,0x08,0x22,0x0a,
0x0b,0x0a,0x04,0x04,0x0a,0x02,0x00,0x12,0x03,0x46,
0x04,0x24,0x0a,0x0c,0x0a,0x05,0x04,0x0a,0x02,0x00,
0x06,0x12,0x03,0x46,0x04,0x15,0x0a,0x0c,0x0a,0x05,
0x04,0x0a,0x02,0x00,0x01,0x12,0x03,0x46,0x16,0x1f,
0x0a,0x0c,0x0a,0x05,0x04,0x0a,0x02,0x00,0x03,0x12,
0x03,0x46,0x22,0x23,0x0a,0x0b,0x0a,0x04,0x04,0x0a,
0x02,0x01,0x12,0x03,0x47,0x04,0x19,0x0a,0x0c,0x0a,
0x05,0x04,0x0a,0x02,0x01,0x05,0x12,0x03,0x47,0x04,
0x0a,0x0a,0x0c,0x0a,0x05,0x04,0x0a,0x02,0x01,0x01,
0x12,0x03,0x47,0x0b,0x14,0x0a,0x0c,0x0a,0x05,0x04,
0x0a,0x02,0x01,0x03,0x12,0x03,0x47,0x17,0x18,0x0a,
0x0b,0x0a,0x04,0x04,0x0a,0x02,0x02,0x12,0x03,0x48,
0x04,0x1d,0x0a,0x0c,0x0a,0x05,0x04,0x0a,0x02,0x02,
0x05,0x12,0x03,0x48,0x04,0x09,0x0a,0x0c,0x0a,0x05,
0x04,0x0a,0x02,0x02,0x01,0x12,0x03,0x48,0x0a,0x18,
0x0a,0x0c,0x0a,0x05,0x04,0x0a,0x02,0x02,0x03,0x12,
0x03,0x48,0x1b,0x1c,0x0a,0x0b,0x0a,0x04,0x04,0x0a,
0x02,0x03,0x12,0x03,0x49,0x04,0x1c,0x0a,0x0c,0x0a,
0x05,0x04,0x0a,0x02,0x03,0x05,0x12,0x03,0x49,0x04,
0x09,0x0a,0x0c,0x0a,0x05,0x04,0x0a,0x02,0x03,0x01,
0x12,0x03,0x49,0x0a,0x17,0x0a,0x0c,0x0a,0x05,0x04,
0x0a,0x02,0x03,0x03,0x12,0x03,0x49,0x1a,0x1b,0x0a,
0x0a,0x0a,0x02,0x04,0x0b,0x12,0x04,0x4c,0x00,0x50,
0x01,0x0a,0x0a,0x0a,0x03,0x04,0x0b,0x01,0x12,0x03,
0x4c,0x08,0x24,0x0a,0x0b,0x0a,0x04,0x04,0x0b,0x02,
0x00,0x12,0x03,0x4d,0x04,0x1b,0x0a,0x0c,0x0a,0x05,
0x04,0x0b,0x02,0x00,0x05,0x12,0x03,0x4d,0x04,0x0a,
0x0a,0x0c,0x0a,0x05,0x04,0x0b,0x02,0x00,0x01,0x12,
0x03,0x4d,0x0b,0x16,0x0a,0x0c,0x0a,0x05,0x04,0x0b,
0x02,0x00,0x03,0x12,0x03,0x4d,0x19,0x1a,0x0a,0x0b,
0x0a,0x04,0x04,0x0b,0x02,0x01,0x12,0x03,0x4e,0x04,
0x19,0x0a,0x0c,0x0a,0x05,0x04,0x0b,0x02,0x01,0x05,
0x12,0x03,0x4e,0x04,0x0a,0x0a,0x0c,0x0a,0x05,0x04,
0x0b,0x02,0x01,0x01,0x12,0x03,0x4e,0x0b,0x14,0x0a,
0x0c,0x0a,0x05,0x04,0x0b,0x02,0x01,0x03,0x12,0x03,
0x4e,0x17,0x18,0x0a,0x0b,0x0a,0x04,0x04,0x0b,0x02,
0x02,0x12,0x03,0x4f,0x04,0x1d,0x0a,0x0c,0x0a,0x05,
0x04,0x0b,0x02,0x02,0x05,0x12,0x03,0x4f,0x04,0x09,
0x0a,0x0c,0x0a,0x05,0x04,0x0b,0x02,0x02,0x01,0x12,
0x03,0x4f,0x0a,0x18,0x0a,0x0c,0x0a,0x05,0x04,0x0b,
0x02,0x02,0x03,0x12,0x03,0x4f,0x1b,0x1c,0x62,0x06,
0x70,0x72,0x6f,0x74,0x6f,0x33,
0x66,0x4f,0x70,0x4d,0x6f,0x64,0x65,0x52,0x05,0x4d,
0x6f,0x64,0x65,0x73,0x22,0xc4,0x01,0x0a,0x1a,0x50,
0x72,0x6f,0x74,0x6f,0x62,0x75,0x66,0x45,0x72,0x72,
0x6f,0x72,0x49,0x6e,0x66,0x6f,0x54,0x69,0x6d,0x65,
0x73,0x74,0x61,0x6d,0x70,0x12,0x3a,0x0a,0x09,0x45,
0x72,0x72,0x6f,0x72,0x49,0x6e,0x66,0x6f,0x18,0x01,
0x20,0x01,0x28,0x0b,0x32,0x1c,0x2e,0x6d,0x72,0x63,
0x2e,0x70,0x72,0x6f,0x74,0x6f,0x2e,0x50,0x72,0x6f,
0x74,0x6f,0x62,0x75,0x66,0x45,0x72,0x72,0x6f,0x72,
0x49,0x6e,0x66,0x6f,0x52,0x09,0x45,0x72,0x72,0x6f,
0x72,0x49,0x6e,0x66,0x6f,0x12,0x1c,0x0a,0x09,0x54,
0x69,0x6d,0x65,0x73,0x74,0x61,0x6d,0x70,0x18,0x02,
0x20,0x01,0x28,0x04,0x52,0x09,0x54,0x69,0x6d,0x65,
0x73,0x74,0x61,0x6d,0x70,0x12,0x26,0x0a,0x0e,0x53,
0x65,0x71,0x75,0x65,0x6e,0x63,0x65,0x4e,0x75,0x6d,
0x62,0x65,0x72,0x18,0x03,0x20,0x01,0x28,0x05,0x52,
0x0e,0x53,0x65,0x71,0x75,0x65,0x6e,0x63,0x65,0x4e,
0x75,0x6d,0x62,0x65,0x72,0x12,0x24,0x0a,0x0d,0x4e,
0x75,0x6d,0x4f,0x63,0x63,0x75,0x72,0x61,0x6e,0x63,
0x65,0x73,0x18,0x04,0x20,0x01,0x28,0x05,0x52,0x0d,
0x4e,0x75,0x6d,0x4f,0x63,0x63,0x75,0x72,0x61,0x6e,
0x63,0x65,0x73,0x22,0x86,0x01,0x0a,0x1c,0x50,0x72,
0x6f,0x74,0x6f,0x62,0x75,0x66,0x43,0x6f,0x6e,0x73,
0x6f,0x6c,0x65,0x4c,0x69,0x6e,0x65,0x54,0x69,0x6d,
0x65,0x73,0x74,0x61,0x6d,0x70,0x12,0x20,0x0a,0x0b,
0x43,0x6f,0x6e,0x73,0x6f,0x6c,0x65,0x4c,0x69,0x6e,
0x65,0x18,0x01,0x20,0x01,0x28,0x09,0x52,0x0b,0x43,
0x6f,0x6e,0x73,0x6f,0x6c,0x65,0x4c,0x69,0x6e,0x65,
0x12,0x1c,0x0a,0x09,0x54,0x69,0x6d,0x65,0x73,0x74,
0x61,0x6d,0x70,0x18,0x02,0x20,0x01,0x28,0x04,0x52,
0x09,0x54,0x69,0x6d,0x65,0x73,0x74,0x61,0x6d,0x70,
0x12,0x26,0x0a,0x0e,0x53,0x65,0x71,0x75,0x65,0x6e,
0x63,0x65,0x4e,0x75,0x6d,0x62,0x65,0x72,0x18,0x03,
0x20,0x01,0x28,0x05,0x52,0x0e,0x53,0x65,0x71,0x75,
0x65,0x6e,0x63,0x65,0x4e,0x75,0x6d,0x62,0x65,0x72,
0x42,0x0f,0x0a,0x0d,0x63,0x6f,0x6d,0x2e,0x6d,0x72,
0x63,0x2e,0x70,0x72,0x6f,0x74,0x6f,0x4a,0x93,0x17,
0x0a,0x06,0x12,0x04,0x00,0x00,0x5b,0x01,0x0a,0x08,
0x0a,0x01,0x0c,0x12,0x03,0x00,0x00,0x12,0x0a,0x08,
0x0a,0x01,0x02,0x12,0x03,0x02,0x00,0x12,0x0a,0x08,
0x0a,0x01,0x08,0x12,0x03,0x04,0x00,0x26,0x0a,0x09,
0x0a,0x02,0x08,0x01,0x12,0x03,0x04,0x00,0x26,0x0a,
0x0a,0x0a,0x02,0x04,0x00,0x12,0x04,0x06,0x00,0x0a,
0x01,0x0a,0x0a,0x0a,0x03,0x04,0x00,0x01,0x12,0x03,
0x06,0x08,0x1a,0x0a,0x0b,0x0a,0x04,0x04,0x00,0x02,
0x00,0x12,0x03,0x07,0x04,0x11,0x0a,0x0c,0x0a,0x05,
0x04,0x00,0x02,0x00,0x05,0x12,0x03,0x07,0x04,0x0a,
0x0a,0x0c,0x0a,0x05,0x04,0x00,0x02,0x00,0x01,0x12,
0x03,0x07,0x0b,0x0c,0x0a,0x0c,0x0a,0x05,0x04,0x00,
0x02,0x00,0x03,0x12,0x03,0x07,0x0f,0x10,0x0a,0x0b,
0x0a,0x04,0x04,0x00,0x02,0x01,0x12,0x03,0x08,0x04,
0x11,0x0a,0x0c,0x0a,0x05,0x04,0x00,0x02,0x01,0x05,
0x12,0x03,0x08,0x04,0x0a,0x0a,0x0c,0x0a,0x05,0x04,
0x00,0x02,0x01,0x01,0x12,0x03,0x08,0x0b,0x0c,0x0a,
0x0c,0x0a,0x05,0x04,0x00,0x02,0x01,0x03,0x12,0x03,
0x08,0x0f,0x10,0x0a,0x0b,0x0a,0x04,0x04,0x00,0x02,
0x02,0x12,0x03,0x09,0x04,0x12,0x0a,0x0c,0x0a,0x05,
0x04,0x00,0x02,0x02,0x05,0x12,0x03,0x09,0x04,0x08,
0x0a,0x0c,0x0a,0x05,0x04,0x00,0x02,0x02,0x01,0x12,
0x03,0x09,0x09,0x0d,0x0a,0x0c,0x0a,0x05,0x04,0x00,
0x02,0x02,0x03,0x12,0x03,0x09,0x10,0x11,0x0a,0x0a,
0x0a,0x02,0x04,0x01,0x12,0x04,0x0c,0x00,0x0e,0x01,
0x0a,0x0a,0x0a,0x03,0x04,0x01,0x01,0x12,0x03,0x0c,
0x08,0x1c,0x0a,0x0b,0x0a,0x04,0x04,0x01,0x02,0x00,
0x12,0x03,0x0d,0x04,0x2c,0x0a,0x0c,0x0a,0x05,0x04,
0x01,0x02,0x00,0x04,0x12,0x03,0x0d,0x04,0x0c,0x0a,
0x0c,0x0a,0x05,0x04,0x01,0x02,0x00,0x06,0x12,0x03,
0x0d,0x0d,0x1f,0x0a,0x0c,0x0a,0x05,0x04,0x01,0x02,
0x00,0x01,0x12,0x03,0x0d,0x20,0x27,0x0a,0x0c,0x0a,
0x05,0x04,0x01,0x02,0x00,0x03,0x12,0x03,0x0d,0x2a,
0x2b,0x0a,0x0a,0x0a,0x02,0x04,0x02,0x12,0x04,0x10,
0x00,0x1a,0x01,0x0a,0x0a,0x0a,0x03,0x04,0x02,0x01,
0x12,0x03,0x10,0x08,0x1c,0x0a,0x0b,0x0a,0x04,0x04,
0x02,0x02,0x00,0x12,0x03,0x11,0x04,0x20,0x0a,0x0c,
0x0a,0x05,0x04,0x02,0x02,0x00,0x05,0x12,0x03,0x11,
0x04,0x0a,0x0a,0x0c,0x0a,0x05,0x04,0x02,0x02,0x00,
0x01,0x12,0x03,0x11,0x0b,0x1b,0x0a,0x0c,0x0a,0x05,
0x04,0x02,0x02,0x00,0x03,0x12,0x03,0x11,0x1e,0x1f,
0x0a,0x0b,0x0a,0x04,0x04,0x02,0x02,0x01,0x12,0x03,
0x12,0x04,0x17,0x0a,0x0c,0x0a,0x05,0x04,0x02,0x02,
0x01,0x05,0x12,0x03,0x12,0x04,0x0a,0x0a,0x0c,0x0a,
0x05,0x04,0x02,0x02,0x01,0x01,0x12,0x03,0x12,0x0b,
0x12,0x0a,0x0c,0x0a,0x05,0x04,0x02,0x02,0x01,0x03,
0x12,0x03,0x12,0x15,0x16,0x0a,0x0b,0x0a,0x04,0x04,
0x02,0x02,0x02,0x12,0x03,0x13,0x04,0x1d,0x0a,0x0c,
0x0a,0x05,0x04,0x02,0x02,0x02,0x05,0x12,0x03,0x13,
0x04,0x0a,0x0a,0x0c,0x0a,0x05,0x04,0x02,0x02,0x02,
0x01,0x12,0x03,0x13,0x0b,0x18,0x0a,0x0c,0x0a,0x05,
0x04,0x02,0x02,0x02,0x03,0x12,0x03,0x13,0x1b,0x1c,
0x0a,0x0b,0x0a,0x04,0x04,0x02,0x02,0x03,0x12,0x03,
0x14,0x04,0x1d,0x0a,0x0c,0x0a,0x05,0x04,0x02,0x02,
0x03,0x04,0x12,0x03,0x14,0x04,0x0c,0x0a,0x0c,0x0a,
0x05,0x04,0x02,0x02,0x03,0x05,0x12,0x03,0x14,0x0d,
0x13,0x0a,0x0c,0x0a,0x05,0x04,0x02,0x02,0x03,0x01,
0x12,0x03,0x14,0x14,0x18,0x0a,0x0c,0x0a,0x05,0x04,
0x02,0x02,0x03,0x03,0x12,0x03,0x14,0x1b,0x1c,0x0a,
0x3e,0x0a,0x04,0x04,0x02,0x02,0x04,0x12,0x03,0x17,
0x04,0x18,0x1a,0x31,0x20,0x45,0x61,0x63,0x68,0x20,
0x50,0x4f,0x56,0x20,0x74,0x61,0x6b,0x65,0x73,0x20,
0x75,0x70,0x20,0x34,0x20,0x62,0x69,0x74,0x73,0x0a,
0x20,0x57,0x65,0x20,0x63,0x61,0x6e,0x20,0x66,0x69,
0x74,0x20,0x38,0x20,0x69,0x6e,0x20,0x68,0x65,0x72,
0x65,0x2e,0x0a,0x0a,0x0c,0x0a,0x05,0x04,0x02,0x02,
0x04,0x05,0x12,0x03,0x17,0x04,0x0a,0x0a,0x0c,0x0a,
0x05,0x04,0x02,0x02,0x04,0x01,0x12,0x03,0x17,0x0b,
0x13,0x0a,0x0c,0x0a,0x05,0x04,0x02,0x02,0x04,0x03,
0x12,0x03,0x17,0x16,0x17,0x0a,0x0b,0x0a,0x04,0x04,
0x02,0x02,0x05,0x12,0x03,0x18,0x04,0x14,0x0a,0x0c,
0x0a,0x05,0x04,0x02,0x02,0x05,0x05,0x12,0x03,0x18,
0x04,0x0a,0x0a,0x0c,0x0a,0x05,0x04,0x02,0x02,0x05,
0x01,0x12,0x03,0x18,0x0b,0x0f,0x0a,0x0c,0x0a,0x05,
0x04,0x02,0x02,0x05,0x03,0x12,0x03,0x18,0x12,0x13,
0x0a,0x0b,0x0a,0x04,0x04,0x02,0x02,0x06,0x12,0x03,
0x19,0x04,0x30,0x0a,0x0c,0x0a,0x05,0x04,0x02,0x02,
0x06,0x04,0x12,0x03,0x19,0x04,0x0c,0x0a,0x0c,0x0a,
0x05,0x04,0x02,0x02,0x06,0x06,0x12,0x03,0x19,0x0d,
0x21,0x0a,0x0c,0x0a,0x05,0x04,0x02,0x02,0x06,0x01,
0x12,0x03,0x19,0x22,0x2b,0x0a,0x0c,0x0a,0x05,0x04,
0x02,0x02,0x06,0x03,0x12,0x03,0x19,0x2e,0x2f,0x0a,
0x0a,0x0a,0x02,0x04,0x03,0x12,0x04,0x1c,0x00,0x21,
0x01,0x0a,0x0a,0x0a,0x03,0x04,0x03,0x01,0x12,0x03,
0x1c,0x08,0x1b,0x0a,0x0b,0x0a,0x04,0x04,0x03,0x02,
0x00,0x12,0x03,0x1d,0x04,0x1b,0x0a,0x0c,0x0a,0x05,
0x04,0x03,0x02,0x00,0x05,0x12,0x03,0x1d,0x04,0x0a,
0x0a,0x0c,0x0a,0x05,0x04,0x03,0x02,0x00,0x01,0x12,
0x03,0x1d,0x0b,0x16,0x0a,0x0c,0x0a,0x05,0x04,0x03,
0x02,0x00,0x03,0x12,0x03,0x1d,0x19,0x1a,0x0a,0x0b,
0x0a,0x04,0x04,0x03,0x02,0x01,0x12,0x03,0x1e,0x04,
0x18,0x0a,0x0c,0x0a,0x05,0x04,0x03,0x02,0x01,0x05,
0x12,0x03,0x1e,0x04,0x09,0x0a,0x0c,0x0a,0x05,0x04,
0x03,0x02,0x01,0x01,0x12,0x03,0x1e,0x0a,0x13,0x0a,
0x0c,0x0a,0x05,0x04,0x03,0x02,0x01,0x03,0x12,0x03,
0x1e,0x16,0x17,0x0a,0x0b,0x0a,0x04,0x04,0x03,0x02,
0x02,0x12,0x03,0x1f,0x04,0x30,0x0a,0x0c,0x0a,0x05,
0x04,0x03,0x02,0x02,0x04,0x12,0x03,0x1f,0x04,0x0c,
0x0a,0x0c,0x0a,0x05,0x04,0x03,0x02,0x02,0x06,0x12,
0x03,0x1f,0x0d,0x21,0x0a,0x0c,0x0a,0x05,0x04,0x03,
0x02,0x02,0x01,0x12,0x03,0x1f,0x22,0x2b,0x0a,0x0c,
0x0a,0x05,0x04,0x03,0x02,0x02,0x03,0x12,0x03,0x1f,
0x2e,0x2f,0x0a,0x0b,0x0a,0x04,0x04,0x03,0x02,0x03,
0x12,0x03,0x20,0x04,0x1e,0x0a,0x0c,0x0a,0x05,0x04,
0x03,0x02,0x03,0x05,0x12,0x03,0x20,0x04,0x0b,0x0a,
0x0c,0x0a,0x05,0x04,0x03,0x02,0x03,0x01,0x12,0x03,
0x20,0x0c,0x19,0x0a,0x0c,0x0a,0x05,0x04,0x03,0x02,
0x03,0x03,0x12,0x03,0x20,0x1c,0x1d,0x0a,0x0a,0x0a,
0x02,0x04,0x04,0x12,0x04,0x23,0x00,0x28,0x01,0x0a,
0x0a,0x0a,0x03,0x04,0x04,0x01,0x12,0x03,0x23,0x08,
0x22,0x0a,0x0b,0x0a,0x04,0x04,0x04,0x02,0x00,0x12,
0x03,0x24,0x04,0x1c,0x0a,0x0c,0x0a,0x05,0x04,0x04,
0x02,0x00,0x05,0x12,0x03,0x24,0x04,0x0a,0x0a,0x0c,
0x0a,0x05,0x04,0x04,0x02,0x00,0x01,0x12,0x03,0x24,
0x0b,0x17,0x0a,0x0c,0x0a,0x05,0x04,0x04,0x02,0x00,
0x03,0x12,0x03,0x24,0x1a,0x1b,0x0a,0x0b,0x0a,0x04,
0x04,0x04,0x02,0x01,0x12,0x03,0x25,0x04,0x17,0x0a,
0x0c,0x0a,0x05,0x04,0x04,0x02,0x01,0x05,0x12,0x03,
0x25,0x04,0x08,0x0a,0x0c,0x0a,0x05,0x04,0x04,0x02,
0x01,0x01,0x12,0x03,0x25,0x09,0x12,0x0a,0x0c,0x0a,
0x05,0x04,0x04,0x02,0x01,0x03,0x12,0x03,0x25,0x15,
0x16,0x0a,0x0b,0x0a,0x04,0x04,0x04,0x02,0x02,0x12,
0x03,0x26,0x04,0x1b,0x0a,0x0c,0x0a,0x05,0x04,0x04,
0x02,0x02,0x05,0x12,0x03,0x26,0x04,0x0a,0x0a,0x0c,
0x0a,0x05,0x04,0x04,0x02,0x02,0x01,0x12,0x03,0x26,
0x0b,0x16,0x0a,0x0c,0x0a,0x05,0x04,0x04,0x02,0x02,
0x03,0x12,0x03,0x26,0x19,0x1a,0x0a,0x0b,0x0a,0x04,
0x04,0x04,0x02,0x03,0x12,0x03,0x27,0x04,0x20,0x0a,
0x0c,0x0a,0x05,0x04,0x04,0x02,0x03,0x05,0x12,0x03,
0x27,0x04,0x0a,0x0a,0x0c,0x0a,0x05,0x04,0x04,0x02,
0x03,0x01,0x12,0x03,0x27,0x0b,0x1b,0x0a,0x0c,0x0a,
0x05,0x04,0x04,0x02,0x03,0x03,0x12,0x03,0x27,0x1e,
0x1f,0x0a,0x0a,0x0a,0x02,0x04,0x05,0x12,0x04,0x2a,
0x00,0x2c,0x01,0x0a,0x0a,0x0a,0x03,0x04,0x05,0x01,
0x12,0x03,0x2a,0x08,0x23,0x0a,0x0b,0x0a,0x04,0x04,
0x05,0x02,0x00,0x12,0x03,0x2b,0x04,0x38,0x0a,0x0c,
0x0a,0x05,0x04,0x05,0x02,0x00,0x04,0x12,0x03,0x2b,
0x04,0x0c,0x0a,0x0c,0x0a,0x05,0x04,0x05,0x02,0x00,
0x06,0x12,0x03,0x2b,0x0d,0x27,0x0a,0x0c,0x0a,0x05,
0x04,0x05,0x02,0x00,0x01,0x12,0x03,0x2b,0x28,0x33,
0x0a,0x0c,0x0a,0x05,0x04,0x05,0x02,0x00,0x03,0x12,
0x03,0x2b,0x36,0x37,0x0a,0x0a,0x0a,0x02,0x04,0x06,
0x12,0x04,0x2e,0x00,0x32,0x01,0x0a,0x0a,0x0a,0x03,
0x04,0x06,0x01,0x12,0x03,0x2e,0x08,0x1e,0x0a,0x0b,
0x0a,0x04,0x04,0x06,0x02,0x00,0x12,0x03,0x2f,0x04,
0x14,0x0a,0x0c,0x0a,0x05,0x04,0x06,0x02,0x00,0x05,
0x12,0x03,0x2f,0x04,0x0a,0x0a,0x0c,0x0a,0x05,0x04,
0x06,0x02,0x00,0x01,0x12,0x03,0x2f,0x0b,0x0f,0x0a,
0x0c,0x0a,0x05,0x04,0x06,0x02,0x00,0x03,0x12,0x03,
0x2f,0x12,0x13,0x0a,0x2b,0x0a,0x04,0x04,0x06,0x02,
0x01,0x12,0x03,0x30,0x04,0x16,0x22,0x1e,0x20,0x31,
0x36,0x20,0x62,0x69,0x74,0x73,0x2c,0x20,0x6c,0x65,
0x66,0x74,0x20,0x6d,0x73,0x62,0x2c,0x20,0x72,0x69,
0x67,0x68,0x74,0x20,0x6c,0x73,0x62,0x0a,0x0a,0x0c,
0x0a,0x05,0x04,0x06,0x02,0x01,0x05,0x12,0x03,0x30,
0x04,0x0a,0x0a,0x0c,0x0a,0x05,0x04,0x06,0x02,0x01,
0x01,0x12,0x03,0x30,0x0b,0x11,0x0a,0x0c,0x0a,0x05,
0x04,0x06,0x02,0x01,0x03,0x12,0x03,0x30,0x14,0x15,
0x0a,0x2b,0x0a,0x04,0x04,0x06,0x02,0x02,0x12,0x03,
0x31,0x04,0x1d,0x22,0x1e,0x20,0x31,0x36,0x20,0x62,
0x69,0x74,0x73,0x2c,0x20,0x6c,0x65,0x66,0x74,0x20,
0x6d,0x73,0x62,0x2c,0x20,0x72,0x69,0x67,0x68,0x74,
0x20,0x6c,0x73,0x62,0x0a,0x0a,0x0c,0x0a,0x05,0x04,
0x06,0x02,0x02,0x05,0x12,0x03,0x31,0x04,0x0a,0x0a,
0x0c,0x0a,0x05,0x04,0x06,0x02,0x02,0x01,0x12,0x03,
0x31,0x0b,0x18,0x0a,0x0c,0x0a,0x05,0x04,0x06,0x02,
0x02,0x03,0x12,0x03,0x31,0x1b,0x1c,0x0a,0x0a,0x0a,
0x02,0x04,0x07,0x12,0x04,0x34,0x00,0x36,0x01,0x0a,
0x0a,0x0a,0x03,0x04,0x07,0x01,0x12,0x03,0x34,0x08,
0x1f,0x0a,0x0b,0x0a,0x04,0x04,0x07,0x02,0x00,0x12,
0x03,0x35,0x04,0x30,0x0a,0x0c,0x0a,0x05,0x04,0x07,
0x02,0x00,0x04,0x12,0x03,0x35,0x04,0x0c,0x0a,0x0c,
0x0a,0x05,0x04,0x07,0x02,0x00,0x06,0x12,0x03,0x35,
0x0d,0x23,0x0a,0x0c,0x0a,0x05,0x04,0x07,0x02,0x00,
0x01,0x12,0x03,0x35,0x24,0x2b,0x0a,0x0c,0x0a,0x05,
0x04,0x07,0x02,0x00,0x03,0x12,0x03,0x35,0x2e,0x2f,
0x0a,0x0a,0x0a,0x02,0x04,0x08,0x12,0x04,0x38,0x00,
0x3d,0x01,0x0a,0x0a,0x0a,0x03,0x04,0x08,0x01,0x12,
0x03,0x38,0x08,0x19,0x0a,0x0b,0x0a,0x04,0x04,0x08,
0x02,0x00,0x12,0x03,0x39,0x04,0x19,0x0a,0x0c,0x0a,
0x05,0x04,0x08,0x02,0x00,0x05,0x12,0x03,0x39,0x04,
0x0a,0x0a,0x0c,0x0a,0x05,0x04,0x08,0x02,0x00,0x01,
0x12,0x03,0x39,0x0b,0x14,0x0a,0x0c,0x0a,0x05,0x04,
0x08,0x02,0x00,0x03,0x12,0x03,0x39,0x17,0x18,0x0a,
0x0b,0x0a,0x04,0x04,0x08,0x02,0x01,0x12,0x03,0x3a,
0x04,0x1a,0x0a,0x0c,0x0a,0x05,0x04,0x08,0x02,0x01,
0x05,0x12,0x03,0x3a,0x04,0x09,0x0a,0x0c,0x0a,0x05,
0x04,0x08,0x02,0x01,0x01,0x12,0x03,0x3a,0x0a,0x15,
0x0a,0x0c,0x0a,0x05,0x04,0x08,0x02,0x01,0x03,0x12,
0x03,0x3a,0x18,0x19,0x0a,0x0b,0x0a,0x04,0x04,0x08,
0x02,0x02,0x12,0x03,0x3b,0x04,0x1b,0x0a,0x0c,0x0a,
0x05,0x04,0x08,0x02,0x02,0x05,0x12,0x03,0x3b,0x04,
0x09,0x0a,0x0c,0x0a,0x05,0x04,0x08,0x02,0x02,0x01,
0x12,0x03,0x3b,0x0a,0x16,0x0a,0x0c,0x0a,0x05,0x04,
0x08,0x02,0x02,0x03,0x12,0x03,0x3b,0x19,0x1a,0x0a,
0x0b,0x0a,0x04,0x04,0x08,0x02,0x03,0x12,0x03,0x3c,
0x04,0x18,0x0a,0x0c,0x0a,0x05,0x04,0x08,0x02,0x03,
0x05,0x12,0x03,0x3c,0x04,0x09,0x0a,0x0c,0x0a,0x05,
0x04,0x08,0x02,0x03,0x01,0x12,0x03,0x3c,0x0a,0x13,
0x0a,0x0c,0x0a,0x05,0x04,0x08,0x02,0x03,0x03,0x12,
0x03,0x3c,0x16,0x17,0x0a,0x0a,0x0a,0x02,0x04,0x09,
0x12,0x04,0x3f,0x00,0x45,0x01,0x0a,0x0a,0x0a,0x03,
0x04,0x09,0x01,0x12,0x03,0x3f,0x08,0x19,0x0a,0x0b,
0x0a,0x04,0x04,0x09,0x02,0x00,0x12,0x03,0x40,0x04,
0x15,0x0a,0x0c,0x0a,0x05,0x04,0x09,0x02,0x00,0x05,
0x12,0x03,0x40,0x04,0x08,0x0a,0x0c,0x0a,0x05,0x04,
0x09,0x02,0x00,0x01,0x12,0x03,0x40,0x09,0x10,0x0a,
0x0c,0x0a,0x05,0x04,0x09,0x02,0x00,0x03,0x12,0x03,
0x40,0x13,0x14,0x0a,0x0b,0x0a,0x04,0x04,0x09,0x02,
0x01,0x12,0x03,0x41,0x04,0x19,0x0a,0x0c,0x0a,0x05,
0x04,0x09,0x02,0x01,0x05,0x12,0x03,0x41,0x04,0x0a,
0x0a,0x0c,0x0a,0x05,0x04,0x09,0x02,0x01,0x01,0x12,
0x03,0x41,0x0b,0x14,0x0a,0x0c,0x0a,0x05,0x04,0x09,
0x02,0x01,0x03,0x12,0x03,0x41,0x17,0x18,0x0a,0x0b,
0x0a,0x04,0x04,0x09,0x02,0x02,0x12,0x03,0x42,0x04,
0x17,0x0a,0x0c,0x0a,0x05,0x04,0x09,0x02,0x02,0x05,
0x12,0x03,0x42,0x04,0x0a,0x0a,0x0c,0x0a,0x05,0x04,
0x09,0x02,0x02,0x01,0x12,0x03,0x42,0x0b,0x12,0x0a,
0x0c,0x0a,0x05,0x04,0x09,0x02,0x02,0x03,0x12,0x03,
0x42,0x15,0x16,0x0a,0x0b,0x0a,0x04,0x04,0x09,0x02,
0x03,0x12,0x03,0x43,0x04,0x18,0x0a,0x0c,0x0a,0x05,
0x04,0x09,0x02,0x03,0x05,0x12,0x03,0x43,0x04,0x0a,
0x0a,0x0c,0x0a,0x05,0x04,0x09,0x02,0x03,0x01,0x12,
0x03,0x43,0x0b,0x13,0x0a,0x0c,0x0a,0x05,0x04,0x09,
0x02,0x03,0x03,0x12,0x03,0x43,0x16,0x17,0x0a,0x0b,
0x0a,0x04,0x04,0x09,0x02,0x04,0x12,0x03,0x44,0x04,
0x19,0x0a,0x0c,0x0a,0x05,0x04,0x09,0x02,0x04,0x05,
0x12,0x03,0x44,0x04,0x0a,0x0a,0x0c,0x0a,0x05,0x04,
0x09,0x02,0x04,0x01,0x12,0x03,0x44,0x0b,0x14,0x0a,
0x0c,0x0a,0x05,0x04,0x09,0x02,0x04,0x03,0x12,0x03,
0x44,0x17,0x18,0x0a,0x0a,0x0a,0x02,0x04,0x0a,0x12,
0x04,0x47,0x00,0x4a,0x01,0x0a,0x0a,0x0a,0x03,0x04,
0x0a,0x01,0x12,0x03,0x47,0x08,0x16,0x0a,0x0b,0x0a,
0x04,0x04,0x0a,0x02,0x00,0x12,0x03,0x48,0x04,0x15,
0x0a,0x0c,0x0a,0x05,0x04,0x0a,0x02,0x00,0x05,0x12,
0x03,0x48,0x04,0x0b,0x0a,0x0c,0x0a,0x05,0x04,0x0a,
0x02,0x00,0x01,0x12,0x03,0x48,0x0c,0x10,0x0a,0x0c,
0x0a,0x05,0x04,0x0a,0x02,0x00,0x03,0x12,0x03,0x48,
0x13,0x14,0x0a,0x0b,0x0a,0x04,0x04,0x0a,0x02,0x01,
0x12,0x03,0x49,0x04,0x14,0x0a,0x0c,0x0a,0x05,0x04,
0x0a,0x02,0x01,0x05,0x12,0x03,0x49,0x04,0x0a,0x0a,
0x0c,0x0a,0x05,0x04,0x0a,0x02,0x01,0x01,0x12,0x03,
0x49,0x0b,0x0f,0x0a,0x0c,0x0a,0x05,0x04,0x0a,0x02,
0x01,0x03,0x12,0x03,0x49,0x12,0x13,0x0a,0x0a,0x0a,
0x02,0x04,0x0b,0x12,0x04,0x4c,0x00,0x4e,0x01,0x0a,
0x0a,0x0a,0x03,0x04,0x0b,0x01,0x12,0x03,0x4c,0x08,
0x20,0x0a,0x0b,0x0a,0x04,0x04,0x0b,0x02,0x00,0x12,
0x03,0x4d,0x04,0x26,0x0a,0x0c,0x0a,0x05,0x04,0x0b,
0x02,0x00,0x04,0x12,0x03,0x4d,0x04,0x0c,0x0a,0x0c,
0x0a,0x05,0x04,0x0b,0x02,0x00,0x06,0x12,0x03,0x4d,
0x0d,0x1b,0x0a,0x0c,0x0a,0x05,0x04,0x0b,0x02,0x00,
0x01,0x12,0x03,0x4d,0x1c,0x21,0x0a,0x0c,0x0a,0x05,
0x04,0x0b,0x02,0x00,0x03,0x12,0x03,0x4d,0x24,0x25,
0x0a,0x0a,0x0a,0x02,0x04,0x0c,0x12,0x04,0x50,0x00,
0x55,0x01,0x0a,0x0a,0x0a,0x03,0x04,0x0c,0x01,0x12,
0x03,0x50,0x08,0x22,0x0a,0x0b,0x0a,0x04,0x04,0x0c,
0x02,0x00,0x12,0x03,0x51,0x04,0x24,0x0a,0x0c,0x0a,
0x05,0x04,0x0c,0x02,0x00,0x06,0x12,0x03,0x51,0x04,
0x15,0x0a,0x0c,0x0a,0x05,0x04,0x0c,0x02,0x00,0x01,
0x12,0x03,0x51,0x16,0x1f,0x0a,0x0c,0x0a,0x05,0x04,
0x0c,0x02,0x00,0x03,0x12,0x03,0x51,0x22,0x23,0x0a,
0x0b,0x0a,0x04,0x04,0x0c,0x02,0x01,0x12,0x03,0x52,
0x04,0x19,0x0a,0x0c,0x0a,0x05,0x04,0x0c,0x02,0x01,
0x05,0x12,0x03,0x52,0x04,0x0a,0x0a,0x0c,0x0a,0x05,
0x04,0x0c,0x02,0x01,0x01,0x12,0x03,0x52,0x0b,0x14,
0x0a,0x0c,0x0a,0x05,0x04,0x0c,0x02,0x01,0x03,0x12,
0x03,0x52,0x17,0x18,0x0a,0x0b,0x0a,0x04,0x04,0x0c,
0x02,0x02,0x12,0x03,0x53,0x04,0x1d,0x0a,0x0c,0x0a,
0x05,0x04,0x0c,0x02,0x02,0x05,0x12,0x03,0x53,0x04,
0x09,0x0a,0x0c,0x0a,0x05,0x04,0x0c,0x02,0x02,0x01,
0x12,0x03,0x53,0x0a,0x18,0x0a,0x0c,0x0a,0x05,0x04,
0x0c,0x02,0x02,0x03,0x12,0x03,0x53,0x1b,0x1c,0x0a,
0x0b,0x0a,0x04,0x04,0x0c,0x02,0x03,0x12,0x03,0x54,
0x04,0x1c,0x0a,0x0c,0x0a,0x05,0x04,0x0c,0x02,0x03,
0x05,0x12,0x03,0x54,0x04,0x09,0x0a,0x0c,0x0a,0x05,
0x04,0x0c,0x02,0x03,0x01,0x12,0x03,0x54,0x0a,0x17,
0x0a,0x0c,0x0a,0x05,0x04,0x0c,0x02,0x03,0x03,0x12,
0x03,0x54,0x1a,0x1b,0x0a,0x0a,0x0a,0x02,0x04,0x0d,
0x12,0x04,0x57,0x00,0x5b,0x01,0x0a,0x0a,0x0a,0x03,
0x04,0x0d,0x01,0x12,0x03,0x57,0x08,0x24,0x0a,0x0b,
0x0a,0x04,0x04,0x0d,0x02,0x00,0x12,0x03,0x58,0x04,
0x1b,0x0a,0x0c,0x0a,0x05,0x04,0x0d,0x02,0x00,0x05,
0x12,0x03,0x58,0x04,0x0a,0x0a,0x0c,0x0a,0x05,0x04,
0x0d,0x02,0x00,0x01,0x12,0x03,0x58,0x0b,0x16,0x0a,
0x0c,0x0a,0x05,0x04,0x0d,0x02,0x00,0x03,0x12,0x03,
0x58,0x19,0x1a,0x0a,0x0b,0x0a,0x04,0x04,0x0d,0x02,
0x01,0x12,0x03,0x59,0x04,0x19,0x0a,0x0c,0x0a,0x05,
0x04,0x0d,0x02,0x01,0x05,0x12,0x03,0x59,0x04,0x0a,
0x0a,0x0c,0x0a,0x05,0x04,0x0d,0x02,0x01,0x01,0x12,
0x03,0x59,0x0b,0x14,0x0a,0x0c,0x0a,0x05,0x04,0x0d,
0x02,0x01,0x03,0x12,0x03,0x59,0x17,0x18,0x0a,0x0b,
0x0a,0x04,0x04,0x0d,0x02,0x02,0x12,0x03,0x5a,0x04,
0x1d,0x0a,0x0c,0x0a,0x05,0x04,0x0d,0x02,0x02,0x05,
0x12,0x03,0x5a,0x04,0x09,0x0a,0x0c,0x0a,0x05,0x04,
0x0d,0x02,0x02,0x01,0x12,0x03,0x5a,0x0a,0x18,0x0a,
0x0c,0x0a,0x05,0x04,0x0d,0x02,0x02,0x03,0x12,0x03,
0x5a,0x1b,0x1c,0x62,0x06,0x70,0x72,0x6f,0x74,0x6f,
0x33,
};
static const char file_name[] = "MrcComm.proto";
static const char mrc_proto_ProtobufFingerData_name[] = "mrc.proto.ProtobufFingerData";
std::string_view mrc_proto_ProtobufFingerData::msg_name(void) noexcept { return mrc_proto_ProtobufFingerData_name; }
pb_filedesc_t mrc_proto_ProtobufFingerData::file_descriptor(void) noexcept { return {::file_name, ::file_descriptor}; }
PB_BIND(mrc_proto_ProtobufFingerData, mrc_proto_ProtobufFingerData, AUTO)
static const char mrc_proto_ProtobufTouchpadData_name[] = "mrc.proto.ProtobufTouchpadData";
std::string_view mrc_proto_ProtobufTouchpadData::msg_name(void) noexcept { return mrc_proto_ProtobufTouchpadData_name; }
pb_filedesc_t mrc_proto_ProtobufTouchpadData::file_descriptor(void) noexcept { return {::file_name, ::file_descriptor}; }
PB_BIND(mrc_proto_ProtobufTouchpadData, mrc_proto_ProtobufTouchpadData, AUTO)
static const char mrc_proto_ProtobufJoystickData_name[] = "mrc.proto.ProtobufJoystickData";
std::string_view mrc_proto_ProtobufJoystickData::msg_name(void) noexcept { return mrc_proto_ProtobufJoystickData_name; }
pb_filedesc_t mrc_proto_ProtobufJoystickData::file_descriptor(void) noexcept { return {::file_name, ::file_descriptor}; }

View File

@@ -15,6 +15,24 @@
#endif
/* Struct definitions */
typedef struct _mrc_proto_ProtobufFingerData {
static const pb_msgdesc_t* msg_descriptor(void) noexcept;
static std::string_view msg_name(void) noexcept;
static pb_filedesc_t file_descriptor(void) noexcept;
uint32_t X;
uint32_t Y;
bool Down;
} mrc_proto_ProtobufFingerData;
typedef struct _mrc_proto_ProtobufTouchpadData {
static const pb_msgdesc_t* msg_descriptor(void) noexcept;
static std::string_view msg_name(void) noexcept;
static pb_filedesc_t file_descriptor(void) noexcept;
pb_callback_t Fingers;
} mrc_proto_ProtobufTouchpadData;
typedef struct _mrc_proto_ProtobufJoystickData {
static const pb_msgdesc_t* msg_descriptor(void) noexcept;
static std::string_view msg_name(void) noexcept;
@@ -28,6 +46,7 @@ typedef struct _mrc_proto_ProtobufJoystickData {
We can fit 8 in here. */
uint32_t POVCount;
uint32_t POVs;
pb_callback_t Touchpads;
} mrc_proto_ProtobufJoystickData;
typedef struct _mrc_proto_ProtobufControlData {
@@ -141,7 +160,9 @@ typedef struct _mrc_proto_ProtobufConsoleLineTimestamp {
/* Initializer values for message structs */
#define mrc_proto_ProtobufJoystickData_init_default {0, 0, 0, {{NULL}, NULL}, 0, 0}
#define mrc_proto_ProtobufFingerData_init_default {0, 0, 0}
#define mrc_proto_ProtobufTouchpadData_init_default {{{NULL}, NULL}}
#define mrc_proto_ProtobufJoystickData_init_default {0, 0, 0, {{NULL}, NULL}, 0, 0, {{NULL}, NULL}}
#define mrc_proto_ProtobufControlData_init_default {0, 0, {{NULL}, NULL}, 0}
#define mrc_proto_ProtobufJoystickDescriptor_init_default {{{NULL}, NULL}, 0, 0, 0}
#define mrc_proto_ProtobufJoystickDescriptors_init_default {{{NULL}, NULL}}
@@ -153,7 +174,9 @@ typedef struct _mrc_proto_ProtobufConsoleLineTimestamp {
#define mrc_proto_ProtobufAvailableOpModes_init_default {{{NULL}, NULL}}
#define mrc_proto_ProtobufErrorInfoTimestamp_init_default {{{NULL}, NULL}, 0, 0, 0}
#define mrc_proto_ProtobufConsoleLineTimestamp_init_default {{{NULL}, NULL}, 0, 0}
#define mrc_proto_ProtobufJoystickData_init_zero {0, 0, 0, {{NULL}, NULL}, 0, 0}
#define mrc_proto_ProtobufFingerData_init_zero {0, 0, 0}
#define mrc_proto_ProtobufTouchpadData_init_zero {{{NULL}, NULL}}
#define mrc_proto_ProtobufJoystickData_init_zero {0, 0, 0, {{NULL}, NULL}, 0, 0, {{NULL}, NULL}}
#define mrc_proto_ProtobufControlData_init_zero {0, 0, {{NULL}, NULL}, 0}
#define mrc_proto_ProtobufJoystickDescriptor_init_zero {{{NULL}, NULL}, 0, 0, 0}
#define mrc_proto_ProtobufJoystickDescriptors_init_zero {{{NULL}, NULL}}
@@ -167,12 +190,17 @@ typedef struct _mrc_proto_ProtobufConsoleLineTimestamp {
#define mrc_proto_ProtobufConsoleLineTimestamp_init_zero {{{NULL}, NULL}, 0, 0}
/* Field tags (for use in manual encoding/decoding) */
#define mrc_proto_ProtobufFingerData_X_tag 1
#define mrc_proto_ProtobufFingerData_Y_tag 2
#define mrc_proto_ProtobufFingerData_Down_tag 3
#define mrc_proto_ProtobufTouchpadData_Fingers_tag 1
#define mrc_proto_ProtobufJoystickData_AvailableButtons_tag 1
#define mrc_proto_ProtobufJoystickData_Buttons_tag 2
#define mrc_proto_ProtobufJoystickData_AvailableAxes_tag 3
#define mrc_proto_ProtobufJoystickData_Axes_tag 4
#define mrc_proto_ProtobufJoystickData_POVCount_tag 5
#define mrc_proto_ProtobufJoystickData_POVs_tag 6
#define mrc_proto_ProtobufJoystickData_Touchpads_tag 7
#define mrc_proto_ProtobufControlData_ControlWord_tag 1
#define mrc_proto_ProtobufControlData_MatchTime_tag 2
#define mrc_proto_ProtobufControlData_Joysticks_tag 3
@@ -207,15 +235,30 @@ typedef struct _mrc_proto_ProtobufConsoleLineTimestamp {
#define mrc_proto_ProtobufConsoleLineTimestamp_SequenceNumber_tag 3
/* Struct field encoding specification for nanopb */
#define mrc_proto_ProtobufFingerData_FIELDLIST(X_, a) \
X_(a, STATIC, SINGULAR, UINT32, X, 1) \
X_(a, STATIC, SINGULAR, UINT32, Y, 2) \
X_(a, STATIC, SINGULAR, BOOL, Down, 3)
#define mrc_proto_ProtobufFingerData_CALLBACK NULL
#define mrc_proto_ProtobufFingerData_DEFAULT NULL
#define mrc_proto_ProtobufTouchpadData_FIELDLIST(X, a) \
X(a, CALLBACK, REPEATED, MESSAGE, Fingers, 1)
#define mrc_proto_ProtobufTouchpadData_CALLBACK pb_default_field_callback
#define mrc_proto_ProtobufTouchpadData_DEFAULT NULL
#define mrc_proto_ProtobufTouchpadData_Fingers_MSGTYPE mrc_proto_ProtobufFingerData
#define mrc_proto_ProtobufJoystickData_FIELDLIST(X, a) \
X(a, STATIC, SINGULAR, UINT64, AvailableButtons, 1) \
X(a, STATIC, SINGULAR, UINT64, Buttons, 2) \
X(a, STATIC, SINGULAR, UINT32, AvailableAxes, 3) \
X(a, CALLBACK, REPEATED, SINT32, Axes, 4) \
X(a, STATIC, SINGULAR, UINT32, POVCount, 5) \
X(a, STATIC, SINGULAR, UINT32, POVs, 6)
X(a, STATIC, SINGULAR, UINT32, POVs, 6) \
X(a, CALLBACK, REPEATED, MESSAGE, Touchpads, 7)
#define mrc_proto_ProtobufJoystickData_CALLBACK pb_default_field_callback
#define mrc_proto_ProtobufJoystickData_DEFAULT NULL
#define mrc_proto_ProtobufJoystickData_Touchpads_MSGTYPE mrc_proto_ProtobufTouchpadData
#define mrc_proto_ProtobufControlData_FIELDLIST(X, a) \
X(a, STATIC, SINGULAR, UINT32, ControlWord, 1) \
@@ -299,6 +342,7 @@ X(a, STATIC, SINGULAR, INT32, SequenceNumber, 3)
#define mrc_proto_ProtobufConsoleLineTimestamp_DEFAULT NULL
/* Maximum encoded size of messages (where known) */
/* mrc_proto_ProtobufTouchpadData_size depends on runtime parameters */
/* mrc_proto_ProtobufJoystickData_size depends on runtime parameters */
/* mrc_proto_ProtobufControlData_size depends on runtime parameters */
/* mrc_proto_ProtobufJoystickDescriptor_size depends on runtime parameters */
@@ -311,6 +355,7 @@ X(a, STATIC, SINGULAR, INT32, SequenceNumber, 3)
/* mrc_proto_ProtobufErrorInfoTimestamp_size depends on runtime parameters */
/* mrc_proto_ProtobufConsoleLineTimestamp_size depends on runtime parameters */
#define MRC_PROTO_MRCCOMM_NPB_H_MAX_SIZE mrc_proto_ProtobufJoystickOutput_size
#define mrc_proto_ProtobufFingerData_size 14
#define mrc_proto_ProtobufJoystickOutput_size 18

View File

@@ -148,6 +148,12 @@ public class DriverStationJNI extends JNIWrapper {
/** The maximum number of joysticks. */
public static final int kMaxJoysticks = 6;
/** The maximum number of touchpads. */
public static final int kMaxJoystickTouchpads = 2;
/** The maximum number of fingers per touchpad. */
public static final int kMaxJoystickTouchpadFingers = 2;
/**
* Get all joystick data.
*
@@ -155,8 +161,11 @@ public class DriverStationJNI extends JNIWrapper {
* @param axesArray all joystick axes
* @param rawAxesArray all joystick axes as int
* @param povsArray all povs
* @param touchpadFingersArray all touchpad fingers
* @param buttonsAndMetadata array of long joystick axes count, long joystick povs count, long
* joystick buttons count, long joystick buttons values
* joystick buttons count, long joystick buttons values, long joystick touchpad count, long
* pad 0 finger0 down 0x1, finger1 down 0x2, fingerCount 0xC, long pad 1 finger0 down 0x1,
* finger1 down 0x2, fingerCount 0xC
* @see "HAL_GetAllJoystickData"
*/
public static native void getAllJoystickData(
@@ -164,6 +173,7 @@ public class DriverStationJNI extends JNIWrapper {
float[] axesArray,
short[] rawAxesArray,
byte[] povsArray,
float[] touchpadFingersArray,
long[] buttonsAndMetadata);
/**

View File

@@ -119,6 +119,11 @@ public class DriverStationDataJNI extends JNIWrapper {
public static native void setJoystickButtonsAvailable(int stick, long available);
public static native void setTouchpadCounts(int stick, int touchpadCount, int[] fingerCounts);
public static native void setTouchpadFinger(
int stick, int touchpadIndex, int fingerIndex, boolean down, float x, float y);
public static native void setJoystickIsGamepad(int stick, boolean isGamepad);
public static native void setJoystickGamepadType(int stick, int type);

View File

@@ -36,6 +36,11 @@ static_assert(org_wpilib_hardware_hal_DriverStationJNI_kMaxJoystickPOVs ==
HAL_kMaxJoystickPOVs);
static_assert(org_wpilib_hardware_hal_DriverStationJNI_kMaxJoysticks ==
HAL_kMaxJoysticks);
static_assert(org_wpilib_hardware_hal_DriverStationJNI_kMaxJoystickTouchpads ==
HAL_kMaxJoystickTouchpads);
static_assert(
org_wpilib_hardware_hal_DriverStationJNI_kMaxJoystickTouchpadFingers ==
HAL_kMaxJoystickTouchpadFingers);
using namespace wpi::hal;
using namespace wpi::util::java;
@@ -137,36 +142,55 @@ Java_org_wpilib_hardware_hal_DriverStationJNI_nativeGetAllianceStation
/*
* Class: org_wpilib_hardware_hal_DriverStationJNI
* Method: getAllJoystickData
* Signature: (I[F[S[B[J)V
* Signature: (I[F[S[B[F[J)V
*/
JNIEXPORT void JNICALL
Java_org_wpilib_hardware_hal_DriverStationJNI_getAllJoystickData
(JNIEnv* env, jclass cls, jint stick, jfloatArray axesArray,
jshortArray rawAxesArray, jbyteArray povsArray,
jlongArray buttonsAndMetadataArray)
jfloatArray touchpadFingersData, jlongArray buttonsAndMetadataArray)
{
HAL_JoystickAxes axes;
HAL_JoystickPOVs povs;
HAL_JoystickButtons buttons;
HAL_JoystickTouchpads touchpads;
HAL_GetAllJoystickData(stick, &axes, &povs, &buttons);
HAL_GetAllJoystickData(stick, &axes, &povs, &buttons, &touchpads);
CriticalJSpan<jfloat> jAxes(env, axesArray);
CriticalJSpan<jshort> jRawAxes(env, rawAxesArray);
CriticalJSpan<jbyte> jPovs(env, povsArray);
CriticalJSpan<jfloat> jTouchpadFingers(env, touchpadFingersData);
CriticalJSpan<jlong> jButtons(env, buttonsAndMetadataArray);
static_assert(sizeof(jAxes[0]) == sizeof(axes.axes[0]));
static_assert(sizeof(jRawAxes[0]) == sizeof(axes.raw[0]));
static_assert(sizeof(jPovs[0]) == sizeof(povs.povs[0]));
static_assert(sizeof(jTouchpadFingers[0]) ==
sizeof(touchpads.touchpads[0].fingers[0].x));
std::memcpy(&jAxes[0], axes.axes, sizeof(axes.axes));
std::memcpy(&jRawAxes[0], axes.raw, sizeof(axes.raw));
std::memcpy(&jPovs[0], povs.povs, sizeof(povs.povs));
jTouchpadFingers[0] = touchpads.touchpads[0].fingers[0].x;
jTouchpadFingers[1] = touchpads.touchpads[0].fingers[0].y;
jTouchpadFingers[2] = touchpads.touchpads[0].fingers[1].x;
jTouchpadFingers[3] = touchpads.touchpads[0].fingers[1].y;
jTouchpadFingers[4] = touchpads.touchpads[1].fingers[0].x;
jTouchpadFingers[5] = touchpads.touchpads[1].fingers[0].y;
jTouchpadFingers[6] = touchpads.touchpads[1].fingers[1].x;
jTouchpadFingers[7] = touchpads.touchpads[1].fingers[1].y;
jButtons[0] = axes.available;
jButtons[1] = povs.available;
jButtons[2] = buttons.available;
jButtons[3] = buttons.buttons;
jButtons[4] = touchpads.count;
jButtons[5] = (touchpads.touchpads[0].fingers[0].down ? 1 : 0) |
(touchpads.touchpads[0].fingers[1].down ? 2 : 0) |
(touchpads.touchpads[0].count << 2);
jButtons[6] = (touchpads.touchpads[1].fingers[0].down ? 1 : 0) |
(touchpads.touchpads[1].fingers[1].down ? 2 : 0) |
(touchpads.touchpads[1].count << 2);
}
/*

View File

@@ -710,6 +710,38 @@ Java_org_wpilib_hardware_hal_simulation_DriverStationDataJNI_setJoystickButtonsA
HALSIM_SetJoystickButtonsAvailable(stick, available);
}
/*
* Class: org_wpilib_hardware_hal_simulation_DriverStationDataJNI
* Method: setTouchpadCounts
* Signature: (II[I)V
*/
JNIEXPORT void JNICALL
Java_org_wpilib_hardware_hal_simulation_DriverStationDataJNI_setTouchpadCounts
(JNIEnv* env, jclass, jint stick, jint touchpadCount, jintArray fingerCounts)
{
JSpan<const jint> jArrayRef(env, fingerCounts);
uint8_t fingerCountsLocal[2];
size_t toCopy = (std::min)(jArrayRef.size(), static_cast<size_t>(2));
for (size_t i = 0; i < toCopy; ++i) {
fingerCountsLocal[i] = static_cast<uint8_t>(jArrayRef[i]);
}
HALSIM_SetJoystickTouchpadCounts(stick, touchpadCount, fingerCountsLocal);
}
/*
* Class: org_wpilib_hardware_hal_simulation_DriverStationDataJNI
* Method: setTouchpadFinger
* Signature: (IIIZFF)V
*/
JNIEXPORT void JNICALL
Java_org_wpilib_hardware_hal_simulation_DriverStationDataJNI_setTouchpadFinger
(JNIEnv*, jclass, jint stick, jint touchpadIndex, jint fingerIndex,
jboolean down, jfloat x, jfloat y)
{
HALSIM_SetJoystickTouchpadFinger(stick, touchpadIndex, fingerIndex, down, x,
y);
}
/*
* Class: org_wpilib_hardware_hal_simulation_DriverStationDataJNI
* Method: setJoystickIsGamepad

View File

@@ -111,6 +111,7 @@ bool wpi::util::Protobuf<mrc::ControlData>::Pack(
std::optional<mrc::Joystick> wpi::util::Protobuf<mrc::Joystick>::Unpack(
InputStream& Stream) {
wpi::util::UnpackCallback<int16_t, MRC_MAX_NUM_AXES> AxesCb;
wpi::util::UnpackCallback<mrc::Touchpad, MRC_MAX_NUM_TOUCHPADS> TouchpadCb;
mrc_proto_ProtobufJoystickData Msg{
.AvailableButtons = 0,
@@ -119,6 +120,7 @@ std::optional<mrc::Joystick> wpi::util::Protobuf<mrc::Joystick>::Unpack(
.Axes = AxesCb.Callback(),
.POVCount = 0,
.POVs = 0,
.Touchpads = TouchpadCb.Callback(),
};
if (!Stream.Decode(Msg)) {
@@ -126,6 +128,7 @@ std::optional<mrc::Joystick> wpi::util::Protobuf<mrc::Joystick>::Unpack(
}
auto Axes = AxesCb.Items();
auto Touchpads = TouchpadCb.Items();
mrc::Joystick Joystick;
Joystick.Axes.SetAvailable(Msg.AvailableAxes);
@@ -147,12 +150,18 @@ std::optional<mrc::Joystick> wpi::util::Protobuf<mrc::Joystick>::Unpack(
Joystick.Povs.Povs()[i] = Val;
}
Joystick.Touchpads.SetTouchpadCount(static_cast<uint8_t>(Touchpads.size()));
for (size_t i = 0; i < Joystick.Touchpads.GetTouchpadCount(); i++) {
Joystick.Touchpads.Touchpads()[i] = std::move(Touchpads[i]);
}
return Joystick;
}
bool wpi::util::Protobuf<mrc::Joystick>::Pack(OutputStream& Stream,
const mrc::Joystick& Value) {
wpi::util::PackCallback AxesCb{Value.Axes.Axes()};
wpi::util::PackCallback TouchpadCb{Value.Touchpads.Touchpads()};
uint32_t PovsStore = 0;
for (int i = static_cast<int>(Value.Povs.GetCount()) - 1; i >= 0; i--) {
@@ -167,6 +176,72 @@ bool wpi::util::Protobuf<mrc::Joystick>::Pack(OutputStream& Stream,
.Axes = AxesCb.Callback(),
.POVCount = static_cast<uint32_t>(Value.Povs.GetCount()),
.POVs = PovsStore,
.Touchpads = TouchpadCb.Callback(),
};
return Stream.Encode(Msg);
}
std::optional<mrc::TouchpadFinger>
wpi::util::Protobuf<mrc::TouchpadFinger>::Unpack(InputStream& Stream) {
mrc_proto_ProtobufFingerData Msg{
.X = 0,
.Y = 0,
.Down = false,
};
if (!Stream.Decode(Msg)) {
return {};
}
return mrc::TouchpadFinger{
.Down = Msg.Down,
.X = static_cast<uint16_t>(Msg.X),
.Y = static_cast<uint16_t>(Msg.Y),
};
}
bool wpi::util::Protobuf<mrc::TouchpadFinger>::Pack(
OutputStream& Stream, const mrc::TouchpadFinger& Value) {
mrc_proto_ProtobufFingerData Msg{
.X = Value.X,
.Y = Value.Y,
.Down = Value.Down,
};
return Stream.Encode(Msg);
}
std::optional<mrc::Touchpad> wpi::util::Protobuf<mrc::Touchpad>::Unpack(
InputStream& Stream) {
wpi::util::UnpackCallback<mrc::TouchpadFinger, MRC_MAX_NUM_TOUCHPAD_FINGERS>
FingersCb;
mrc_proto_ProtobufTouchpadData Msg{
.Fingers = FingersCb.Callback(),
};
if (!Stream.Decode(Msg)) {
return {};
}
auto Fingers = FingersCb.Items();
mrc::Touchpad Touchpad;
Touchpad.SetFingerCount(Fingers.size());
for (size_t i = 0; i < Touchpad.GetFingerCount(); i++) {
Touchpad.Fingers()[i] = Fingers[i];
}
return Touchpad;
}
bool wpi::util::Protobuf<mrc::Touchpad>::Pack(OutputStream& Stream,
const mrc::Touchpad& Value) {
wpi::util::PackCallback FingersCb{Value.Fingers()};
mrc_proto_ProtobufTouchpadData Msg{
.Fingers = FingersCb.Callback(),
};
return Stream.Encode(Msg);

View File

@@ -100,9 +100,28 @@ int32_t HAL_GetJoystickPOVs(int32_t joystickNum, HAL_JoystickPOVs* povs);
int32_t HAL_GetJoystickButtons(int32_t joystickNum,
HAL_JoystickButtons* buttons);
/**
* Gets the touchpads of a specific joystick.
* @param joystickNum the joystick number
* @param touchpads the touchpad values (output)
* @return the error code, or 0 for success
*/
int32_t HAL_GetJoystickTouchpads(int32_t joystickNum,
HAL_JoystickTouchpads* touchpads);
/**
* Gets all the data of a specific joystick.
*
* @param joystickNum the joystick number
* @param axes the axes values (output)
* @param povs the POV values (output)
* @param buttons the button values (output)
* @param touchpads the touchpad values (output)
*/
void HAL_GetAllJoystickData(int32_t joystickNum, HAL_JoystickAxes* axes,
HAL_JoystickPOVs* povs,
HAL_JoystickButtons* buttons);
HAL_JoystickButtons* buttons,
HAL_JoystickTouchpads* touchpads);
/**
* Retrieves the Joystick Descriptor for particular slot.

View File

@@ -50,6 +50,20 @@ HAL_ENUM(HAL_MatchType) {
HAL_kMatchType_elimination,
};
/**
* The maximum number of touchpads that will be stored in a single
* HAL_JoystickTouchpads struct. This is used for allocating buffers, not
* bounds checking, since there are usually less touchpads in practice.
*/
#define HAL_kMaxJoystickTouchpads 2
/**
* The maximum number of fingers that will be stored in a single
* HAL_JoystickTouchpad struct. This is used for allocating buffers, not
* bounds checking, since there are usually less fingers in practice.
*/
#define HAL_kMaxJoystickTouchpadFingers 2
/**
* The maximum number of axes that will be stored in a single HAL_JoystickAxes
* struct. This is used for allocating buffers, not bounds checking, since there
@@ -107,6 +121,25 @@ struct HAL_JoystickButtons {
};
typedef struct HAL_JoystickButtons HAL_JoystickButtons;
struct HAL_JoystickTouchpadFinger {
uint8_t down;
float x;
float y;
};
typedef struct HAL_JoystickTouchpadFinger HAL_JoystickTouchpadFinger;
struct HAL_JoystickTouchpad {
uint8_t count;
HAL_JoystickTouchpadFinger fingers[HAL_kMaxJoystickTouchpadFingers];
};
typedef struct HAL_JoystickTouchpad HAL_JoystickTouchpad;
struct HAL_JoystickTouchpads {
uint8_t count;
HAL_JoystickTouchpad touchpads[HAL_kMaxJoystickTouchpads];
};
typedef struct HAL_JoystickTouchpads HAL_JoystickTouchpads;
struct HAL_JoystickDescriptor {
uint8_t isGamepad;
uint8_t gamepadType;

View File

@@ -27,3 +27,21 @@ struct wpi::util::Protobuf<mrc::Joystick> {
static std::optional<mrc::Joystick> Unpack(InputStream& Stream);
static bool Pack(OutputStream& Stream, const mrc::Joystick& Value);
};
template <>
struct wpi::util::Protobuf<mrc::TouchpadFinger> {
using MessageStruct = mrc_proto_ProtobufFingerData;
using InputStream = wpi::util::ProtoInputStream<mrc::TouchpadFinger>;
using OutputStream = wpi::util::ProtoOutputStream<mrc::TouchpadFinger>;
static std::optional<mrc::TouchpadFinger> Unpack(InputStream& Stream);
static bool Pack(OutputStream& Stream, const mrc::TouchpadFinger& Value);
};
template <>
struct wpi::util::Protobuf<mrc::Touchpad> {
using MessageStruct = mrc_proto_ProtobufTouchpadData;
using InputStream = wpi::util::ProtoInputStream<mrc::Touchpad>;
using OutputStream = wpi::util::ProtoOutputStream<mrc::Touchpad>;
static std::optional<mrc::Touchpad> Unpack(InputStream& Stream);
static bool Pack(OutputStream& Stream, const mrc::Touchpad& Value);
};

View File

@@ -20,6 +20,9 @@ typedef void (*HAL_JoystickPOVsCallback)(const char* name, void* param,
typedef void (*HAL_JoystickButtonsCallback)(const char* name, void* param,
int32_t joystickNum,
const HAL_JoystickButtons* buttons);
typedef void (*HAL_JoystickTouchpadsCallback)(
const char* name, void* param, int32_t joystickNum,
const HAL_JoystickTouchpads* touchpads);
typedef void (*HAL_JoystickDescriptorCallback)(
const char* name, void* param, int32_t joystickNum,
const HAL_JoystickDescriptor* descriptor);
@@ -113,6 +116,15 @@ void HALSIM_GetJoystickButtons(int32_t joystickNum,
void HALSIM_SetJoystickButtons(int32_t joystickNum,
const HAL_JoystickButtons* buttons);
int32_t HALSIM_RegisterJoystickTouchpadsCallback(
int32_t joystickNum, HAL_JoystickTouchpadsCallback callback, void* param,
HAL_Bool initialNotify);
void HALSIM_CancelJoystickTouchpadsCallback(int32_t uid);
void HALSIM_GetJoystickTouchpads(int32_t joystickNum,
HAL_JoystickTouchpads* touchpads);
void HALSIM_SetJoystickTouchpads(int32_t joystickNum,
const HAL_JoystickTouchpads* touchpads);
int32_t HALSIM_RegisterJoystickDescriptorCallback(
int32_t joystickNum, HAL_JoystickDescriptorCallback callback, void* param,
HAL_Bool initialNotify);
@@ -157,6 +169,11 @@ void HALSIM_SetJoystickButtonsAvailable(int32_t stick, uint64_t available);
void HALSIM_GetJoystickAvailables(int32_t stick, uint16_t* axesAvailable,
uint64_t* buttonsAvailable,
uint8_t* povsAvailable);
void HALSIM_SetJoystickTouchpadCounts(int32_t stick, uint8_t touchpadCount,
const uint8_t* fingerCount);
void HALSIM_SetJoystickTouchpadFinger(int32_t stick, int32_t touchpad,
int32_t finger, HAL_Bool down, double x,
double y);
void HALSIM_SetJoystickIsGamepad(int32_t stick, HAL_Bool isGamepad);
void HALSIM_SetJoystickGamepadType(int32_t stick, int32_t type);

View File

@@ -42,6 +42,7 @@ struct JoystickDataCache {
HAL_JoystickAxes axes[kJoystickPorts];
HAL_JoystickPOVs povs[kJoystickPorts];
HAL_JoystickButtons buttons[kJoystickPorts];
HAL_JoystickTouchpads touchpads[kJoystickPorts];
HAL_AllianceStationID allianceStation;
double matchTime;
HAL_ControlWord controlWord;
@@ -64,6 +65,7 @@ void JoystickDataCache::Update() {
SimDriverStationData->GetJoystickAxes(i, &axes[i]);
SimDriverStationData->GetJoystickPOVs(i, &povs[i]);
SimDriverStationData->GetJoystickButtons(i, &buttons[i]);
SimDriverStationData->GetJoystickTouchpads(i, &touchpads[i]);
}
allianceStation = SimDriverStationData->allianceStationId;
matchTime = SimDriverStationData->matchTime;
@@ -266,9 +268,21 @@ int32_t HAL_GetJoystickButtons(int32_t joystickNum,
return 0;
}
int32_t HAL_GetJoystickTouchpads(int32_t joystickNum,
HAL_JoystickTouchpads* touchpads) {
if (gShutdown) {
return INCOMPATIBLE_STATE;
}
CHECK_JOYSTICK_NUMBER(joystickNum);
std::scoped_lock lock{driverStation->cacheMutex};
*touchpads = currentRead->touchpads[joystickNum];
return 0;
}
void HAL_GetAllJoystickData(int32_t joystickNum, HAL_JoystickAxes* axes,
HAL_JoystickPOVs* povs,
HAL_JoystickButtons* buttons) {
HAL_JoystickButtons* buttons,
HAL_JoystickTouchpads* touchpads) {
if (gShutdown) {
return;
}
@@ -276,6 +290,7 @@ void HAL_GetAllJoystickData(int32_t joystickNum, HAL_JoystickAxes* axes,
*axes = currentRead->axes[joystickNum];
*povs = currentRead->povs[joystickNum];
*buttons = currentRead->buttons[joystickNum];
*touchpads = currentRead->touchpads[joystickNum];
}
int32_t HAL_GetJoystickDescriptor(int32_t joystickNum,

View File

@@ -44,6 +44,7 @@ void DriverStationData::ResetData() {
m_joystickData[i].povs = HAL_JoystickPOVs{};
m_joystickData[i].buttons = HAL_JoystickButtons{};
m_joystickData[i].descriptor = HAL_JoystickDescriptor{};
m_joystickData[i].touchpads = HAL_JoystickTouchpads{};
m_joystickData[i].outputs.leds = 0;
m_joystickData[i].outputs.leftRumble = 0;
m_joystickData[i].outputs.rightRumble = 0;
@@ -105,6 +106,7 @@ void DriverStationData::ResetData() {
DEFINE_CPPAPI(Axes, axes, )
DEFINE_CPPAPI(POVs, povs, )
DEFINE_CPPAPI(Buttons, buttons, )
DEFINE_CPPAPI(Touchpads, touchpads, )
DEFINE_CPPAPI_CALLBACKS(Descriptor, descriptor, )
@@ -372,6 +374,42 @@ void DriverStationData::GetJoystickAvailables(int32_t stick,
*povsAvailable = m_joystickData[stick].povs.available;
}
void DriverStationData::SetJoystickTouchpadCounts(int32_t stick,
uint8_t touchpadCount,
const uint8_t* fingerCount) {
if (stick < 0 || stick >= kNumJoysticks) {
return;
}
std::scoped_lock lock(m_joystickDataMutex);
m_joystickData[stick].touchpads.count = touchpadCount;
for (uint8_t i = 0; i < touchpadCount; i++) {
m_joystickData[stick].touchpads.touchpads[i].count = fingerCount[i];
}
m_joystickTouchpadsCallbacks(stick, &m_joystickData[stick].touchpads);
}
void DriverStationData::SetJoystickTouchpadFinger(int32_t stick,
int32_t touchpad,
int32_t finger, HAL_Bool down,
double x, double y) {
if (stick < 0 || stick >= kNumJoysticks) {
return;
}
if (touchpad < 0 || touchpad >= HAL_kMaxJoystickTouchpads) {
return;
}
if (finger < 0 || finger >= HAL_kMaxJoystickTouchpadFingers) {
return;
}
std::scoped_lock lock(m_joystickDataMutex);
HAL_JoystickTouchpad& tp =
m_joystickData[stick].touchpads.touchpads[touchpad];
tp.fingers[finger].down = down;
tp.fingers[finger].x = x;
tp.fingers[finger].y = y;
m_joystickTouchpadsCallbacks(stick, &m_joystickData[stick].touchpads);
}
void DriverStationData::SetJoystickIsGamepad(int32_t stick,
HAL_Bool isGamepad) {
if (stick < 0 || stick >= kNumJoysticks) {
@@ -490,6 +528,7 @@ DEFINE_CAPI(double, MatchTime, matchTime)
DEFINE_CAPI(Axes, axes)
DEFINE_CAPI(POVs, povs)
DEFINE_CAPI(Buttons, buttons)
DEFINE_CAPI(Touchpads, touchpads)
DEFINE_CAPI(Descriptor, descriptor)
int32_t HALSIM_RegisterJoystickLedsCallback(int32_t joystickNum,
@@ -607,6 +646,19 @@ void HALSIM_GetJoystickAvailables(int32_t stick, uint16_t* axesAvailable,
buttonsAvailable, povsAvailable);
}
void HALSIM_SetJoystickTouchpadCounts(int32_t stick, uint8_t touchpadCount,
const uint8_t* fingerCount) {
SimDriverStationData->SetJoystickTouchpadCounts(stick, touchpadCount,
fingerCount);
}
void HALSIM_SetJoystickTouchpadFinger(int32_t stick, int32_t touchpad,
int32_t finger, HAL_Bool down, double x,
double y) {
SimDriverStationData->SetJoystickTouchpadFinger(stick, touchpad, finger, down,
x, y);
}
void HALSIM_SetJoystickIsGamepad(int32_t stick, HAL_Bool isGamepad) {
SimDriverStationData->SetJoystickIsGamepad(stick, isGamepad);
}

View File

@@ -28,6 +28,7 @@ class DriverStationData {
HAL_SIMCALLBACKREGISTRY_DEFINE_NAME(JoystickDescriptor)
HAL_SIMCALLBACKREGISTRY_DEFINE_NAME(JoystickLeds)
HAL_SIMCALLBACKREGISTRY_DEFINE_NAME(JoystickRumbles)
HAL_SIMCALLBACKREGISTRY_DEFINE_NAME(JoystickTouchpads)
HAL_SIMCALLBACKREGISTRY_DEFINE_NAME(MatchInfo)
HAL_SIMCALLBACKREGISTRY_DEFINE_NAME(NewData)
@@ -62,6 +63,15 @@ class DriverStationData {
void SetJoystickButtons(int32_t joystickNum,
const HAL_JoystickButtons* buttons);
int32_t RegisterJoystickTouchpadsCallback(
int32_t joystickNum, HAL_JoystickTouchpadsCallback callback, void* param,
HAL_Bool initialNotify);
void CancelJoystickTouchpadsCallback(int32_t uid);
void GetJoystickTouchpads(int32_t joystickNum,
HAL_JoystickTouchpads* touchpads);
void SetJoystickTouchpads(int32_t joystickNum,
const HAL_JoystickTouchpads* touchpads);
int32_t RegisterJoystickDescriptorCallback(
int32_t joystickNum, HAL_JoystickDescriptorCallback callback, void* param,
HAL_Bool initialNotify);
@@ -113,6 +123,11 @@ class DriverStationData {
void GetJoystickAvailables(int32_t stick, uint16_t* axesAvailable,
uint64_t* buttonsAvailable,
uint8_t* povsAvailable);
void SetJoystickTouchpadCounts(int32_t stick, uint8_t touchpadCount,
const uint8_t* fingerCount);
void SetJoystickTouchpadFinger(int32_t stick, int32_t touchpad,
int32_t finger, HAL_Bool down, double x,
double y);
void SetJoystickIsGamepad(int32_t stick, HAL_Bool isGamepad);
void SetJoystickGamepadType(int32_t stick, int32_t type);
@@ -144,6 +159,8 @@ class DriverStationData {
m_joystickPOVsCallbacks;
SimCallbackRegistry<HAL_JoystickButtonsCallback, GetJoystickButtonsName>
m_joystickButtonsCallbacks;
SimCallbackRegistry<HAL_JoystickTouchpadsCallback, GetJoystickTouchpadsName>
m_joystickTouchpadsCallbacks;
SimCallbackRegistry<HAL_JoystickLedsCallback, GetJoystickLedsName>
m_joystickLedsCallbacks;
SimCallbackRegistry<HAL_JoystickRumblesCallback, GetJoystickRumblesName>
@@ -166,6 +183,7 @@ class DriverStationData {
HAL_JoystickAxes axes;
HAL_JoystickPOVs povs;
HAL_JoystickButtons buttons;
HAL_JoystickTouchpads touchpads;
JoystickOutputStore outputs;
HAL_JoystickDescriptor descriptor;
};

View File

@@ -45,6 +45,8 @@ static_assert(sizeof(int32_t) >= sizeof(int),
static_assert(MRC_MAX_NUM_AXES == HAL_kMaxJoystickAxes);
static_assert(MRC_MAX_NUM_POVS == HAL_kMaxJoystickPOVs);
static_assert(MRC_MAX_NUM_JOYSTICKS == HAL_kMaxJoysticks);
static_assert(MRC_MAX_NUM_TOUCHPADS == HAL_kMaxJoystickTouchpads);
static_assert(MRC_MAX_NUM_TOUCHPAD_FINGERS == HAL_kMaxJoystickTouchpadFingers);
namespace {
struct JoystickDataCache {
@@ -54,6 +56,7 @@ struct JoystickDataCache {
HAL_JoystickAxes axes[HAL_kMaxJoysticks];
HAL_JoystickPOVs povs[HAL_kMaxJoysticks];
HAL_JoystickButtons buttons[HAL_kMaxJoysticks];
HAL_JoystickTouchpads touchpads[HAL_kMaxJoysticks];
HAL_AllianceStationID allianceStation;
float matchTime;
HAL_ControlWord controlWord;
@@ -275,6 +278,19 @@ void JoystickDataCache::Update(const mrc::ControlData& data) {
buttons[count].available = newStick.Buttons.GetAvailable();
buttons[count].buttons = newStick.Buttons.Buttons;
touchpads[count].count = newStick.Touchpads.GetTouchpadCount();
const auto& newTouchpads = newStick.Touchpads.Touchpads();
for (size_t i = 0; i < newTouchpads.size(); i++) {
const auto& touchpadFingers = newTouchpads[i].Fingers();
touchpads[count].touchpads[i].count = touchpadFingers.size();
for (size_t j = 0; j < touchpadFingers.size(); j++) {
auto& finger = touchpadFingers[j];
touchpads[count].touchpads[i].fingers[j].down = finger.Down ? 1 : 0;
touchpads[count].touchpads[i].fingers[j].x = finger.X;
touchpads[count].touchpads[i].fingers[j].y = finger.Y;
}
}
}
}
@@ -484,13 +500,23 @@ int32_t HAL_GetJoystickButtons(int32_t joystickNum,
return 0;
}
int32_t HAL_GetJoystickTouchpads(int32_t joystickNum,
HAL_JoystickTouchpads* touchpads) {
CHECK_JOYSTICK_NUMBER(joystickNum);
std::scoped_lock lock{cacheMutex};
*touchpads = currentRead->touchpads[joystickNum];
return 0;
}
void HAL_GetAllJoystickData(int32_t joystickNum, HAL_JoystickAxes* axes,
HAL_JoystickPOVs* povs,
HAL_JoystickButtons* buttons) {
HAL_JoystickButtons* buttons,
HAL_JoystickTouchpads* touchpads) {
std::scoped_lock lock{cacheMutex};
*axes = currentRead->axes[joystickNum];
*povs = currentRead->povs[joystickNum];
*buttons = currentRead->buttons[joystickNum];
*touchpads = currentRead->touchpads[joystickNum];
}
int32_t HAL_GetJoystickDescriptor(int32_t joystickNum,

View File

@@ -41,6 +41,7 @@ DEFINE_CAPI(double, MatchTime, 0)
DEFINE_CAPI(Axes, axes)
DEFINE_CAPI(POVs, povs)
DEFINE_CAPI(Buttons, buttons)
DEFINE_CAPI(Touchpads, touchpads)
DEFINE_CAPI(Descriptor, descriptor)
int32_t HALSIM_RegisterJoystickLedsCallback(int32_t joystickNum,
@@ -115,6 +116,13 @@ void HALSIM_GetJoystickAvailables(int32_t stick, uint16_t* axesAvailable,
*povsAvailable = 0;
}
void HALSIM_SetJoystickTouchpadCounts(int32_t stick, uint8_t touchpadCount,
const uint8_t* fingerCount) {}
void HALSIM_SetJoystickTouchpadFinger(int32_t stick, int32_t touchpad,
int32_t finger, HAL_Bool down, double x,
double y) {}
void HALSIM_SetJoystickIsGamepad(int32_t stick, HAL_Bool isGamepad) {}
void HALSIM_SetJoystickGamepadType(int32_t stick, int32_t type) {}

View File

@@ -13,4 +13,18 @@ struct format_descriptor<HAL_JoystickPOV> {
static std::string format() { return std::string(1, c); }
};
}
template <>
struct format_descriptor<HAL_JoystickTouchpad> {
static constexpr const char c = 'B';
static constexpr const char value[2] = {c, '\0'};
static std::string format() { return std::string(1, c); }
};
template <>
struct format_descriptor<HAL_JoystickTouchpadFinger> {
static constexpr const char c = 'B';
static constexpr const char value[2] = {c, '\0'};
static std::string format() { return std::string(1, c); }
};
}

View File

@@ -41,3 +41,4 @@ functions:
HAL_ObserveUserProgramTeleop:
HAL_ObserveUserProgramTest:
HAL_GetJoystickIsGamepad:
HAL_GetJoystickTouchpads:

View File

@@ -49,3 +49,16 @@ classes:
replayNumber:
gameSpecificMessage:
gameSpecificMessageSize:
HAL_JoystickTouchpadFinger:
attributes:
down:
x:
y:
HAL_JoystickTouchpad:
attributes:
count:
fingers:
HAL_JoystickTouchpads:
attributes:
count:
touchpads:

View File

@@ -116,3 +116,10 @@ functions:
HALSIM_SetJoystickPOVsAvailable:
HALSIM_SetJoystickButtonsAvailable:
HALSIM_GetJoystickAvailables:
HALSIM_RegisterJoystickTouchpadsCallback:
ignore: true
HALSIM_CancelJoystickTouchpadsCallback:
HALSIM_GetJoystickTouchpads:
HALSIM_SetJoystickTouchpads:
HALSIM_SetJoystickTouchpadCounts:
HALSIM_SetJoystickTouchpadFinger:

View File

@@ -186,10 +186,60 @@ struct JoystickButtons {
uint8_t Count{0};
};
struct TouchpadFinger {
bool Down{false};
uint16_t X{0};
uint16_t Y{0};
};
struct Touchpad {
std::span<TouchpadFinger> Fingers() {
return std::span{FingersStore.data(), GetFingerCount()};
}
std::span<const TouchpadFinger> Fingers() const {
return std::span{FingersStore.data(), GetFingerCount()};
}
size_t GetFingerCount() const { return FingerCount; }
void SetFingerCount(uint8_t NewCount) {
FingerCount =
(std::min)(NewCount,
static_cast<uint8_t>(MRC_MAX_NUM_TOUCHPAD_FINGERS));
}
private:
std::array<TouchpadFinger, MRC_MAX_NUM_TOUCHPAD_FINGERS> FingersStore{};
uint8_t FingerCount{0};
};
struct JoystickTouchpads {
std::span<Touchpad> Touchpads() {
return std::span{TouchpadsStore.data(), GetTouchpadCount()};
}
std::span<const Touchpad> Touchpads() const {
return std::span{TouchpadsStore.data(), GetTouchpadCount()};
}
size_t GetTouchpadCount() const { return TouchpadCount; }
void SetTouchpadCount(uint8_t NewCount) {
TouchpadCount =
(std::min)(NewCount, static_cast<uint8_t>(MRC_MAX_NUM_TOUCHPADS));
}
private:
std::array<Touchpad, MRC_MAX_NUM_TOUCHPADS> TouchpadsStore{};
uint8_t TouchpadCount{0};
};
struct Joystick {
JoystickAxes Axes;
JoystickPovs Povs;
JoystickButtons Buttons;
JoystickTouchpads Touchpads;
};
struct ControlData {

View File

@@ -66,3 +66,5 @@
#define MRC_MAX_JOYSTICK_NAME_LEN 256
#define MRC_MAX_VERSION_SIZE 256
#define MRC_MAX_ERROR_INFO_STR_LEN 10000
#define MRC_MAX_NUM_TOUCHPAD_FINGERS 2
#define MRC_MAX_NUM_TOUCHPADS 2

View File

@@ -4,6 +4,16 @@ package mrc.proto;
option java_package = "com.mrc.proto";
message ProtobufFingerData {
uint32 X = 1;
uint32 Y = 2;
bool Down = 3;
}
message ProtobufTouchpadData {
repeated ProtobufFingerData Fingers = 1;
}
message ProtobufJoystickData {
uint64 AvailableButtons = 1;
uint64 Buttons = 2;
@@ -13,6 +23,7 @@ message ProtobufJoystickData {
// We can fit 8 in here.
uint32 POVCount = 5;
uint32 POVs = 6;
repeated ProtobufTouchpadData Touchpads = 7;
}
message ProtobufControlData {

View File

@@ -208,6 +208,7 @@ def wpilib_extension(srcs = [], header_to_dat_deps = [], extra_hdrs = [], includ
tmpl_class_names = [],
trampolines = [
("wpi::DriverStation", "wpi__DriverStation.hpp"),
("wpi::DriverStation::TouchpadFinger", "wpi__DriverStation__TouchpadFinger.hpp"),
],
),
struct(

View File

@@ -350,6 +350,71 @@ double DriverStation::GetStickAxis(int stick, int axis) {
return axes.axes[axis];
}
DriverStation::TouchpadFinger DriverStation::GetStickTouchpadFinger(
int stick, int touchpad, int finger) {
if (stick < 0 || stick >= kJoystickPorts) {
WPILIB_ReportError(warn::BadJoystickIndex, "stick {} out of range", stick);
return TouchpadFinger{false, 0.0f, 0.0f};
}
if (touchpad < 0 || touchpad >= HAL_kMaxJoystickTouchpads) {
WPILIB_ReportError(warn::BadJoystickAxis, "touchpad {} out of range",
touchpad);
return TouchpadFinger{false, 0.0f, 0.0f};
}
if (finger < 0 || finger >= HAL_kMaxJoystickTouchpadFingers) {
WPILIB_ReportError(warn::BadJoystickAxis, "finger {} out of range", finger);
return TouchpadFinger{false, 0.0f, 0.0f};
}
HAL_JoystickTouchpads touchpads;
HAL_GetJoystickTouchpads(stick, &touchpads);
auto touchpadCount = touchpads.count;
if (touchpad < touchpadCount) {
if (finger < touchpads.touchpads[touchpad].count) {
return TouchpadFinger{
touchpads.touchpads[touchpad].fingers[finger].down != 0,
touchpads.touchpads[touchpad].fingers[finger].x,
touchpads.touchpads[touchpad].fingers[finger].y};
}
}
ReportJoystickUnpluggedWarning(
"Joystick Touchpad Finger {} missing, check if all controllers are "
"plugged in",
touchpad);
return TouchpadFinger{false, 0.0f, 0.0f};
}
bool DriverStation::GetStickTouchpadFingerAvailable(int stick, int touchpad,
int finger) {
if (stick < 0 || stick >= kJoystickPorts) {
WPILIB_ReportError(warn::BadJoystickIndex, "stick {} out of range", stick);
return false;
}
if (touchpad < 0 || touchpad >= HAL_kMaxJoystickTouchpads) {
WPILIB_ReportError(warn::BadJoystickAxis, "touchpad {} out of range",
touchpad);
return false;
}
if (finger < 0 || finger >= HAL_kMaxJoystickTouchpadFingers) {
WPILIB_ReportError(warn::BadJoystickAxis, "finger {} out of range", finger);
return false;
}
HAL_JoystickTouchpads touchpads;
HAL_GetJoystickTouchpads(stick, &touchpads);
auto touchpadCount = touchpads.count;
if (touchpad < touchpadCount) {
if (finger < touchpads.touchpads[touchpad].count) {
return true;
}
}
return false;
}
std::optional<double> DriverStation::GetStickAxisIfAvailable(int stick,
int axis) {
if (stick < 0 || stick >= kJoystickPorts) {

View File

@@ -176,3 +176,13 @@ void GenericHID::SetRumble(RumbleType type, double value) {
HAL_SetJoystickRumble(m_port, m_leftRumble, m_rightRumble,
m_leftTriggerRumble, m_rightTriggerRumble);
}
bool GenericHID::GetTouchpadFingerAvailable(int touchpad, int finger) const {
return DriverStation::GetStickTouchpadFingerAvailable(m_port, touchpad,
finger);
}
DriverStation::TouchpadFinger GenericHID::GetTouchpadFinger(int touchpad,
int finger) const {
return DriverStation::GetStickTouchpadFinger(m_port, touchpad, finger);
}

View File

@@ -72,6 +72,12 @@ class DriverStation final {
kUpLeft = HAL_JoystickPOV_kLeftUp,
};
struct TouchpadFinger final {
bool down = false;
float x = 0.0f;
float y = 0.0f;
};
/**
* Gets the angle of a POVDirection.
*
@@ -159,6 +165,28 @@ class DriverStation final {
*/
static double GetStickAxis(int stick, int axis);
/**
* Get the finger data of a touchpad on a joystick, if available.
*
* @param stick The joystick to read.
* @param touchpad The touchpad index to read from the joystick.
* @param finger The finger index to read from the touchpad.
* @return The finger data of the touchpad on the joystick.
*/
static TouchpadFinger GetStickTouchpadFinger(int stick, int touchpad,
int finger);
/**
* Whether a finger on a touchpad is available.
*
* @param stick The joystick to read.
* @param touchpad The touchpad index to read from the joystick.
* @param finger The finger index to read from the touchpad.
* @return True if the finger data is available.
*/
static bool GetStickTouchpadFingerAvailable(int stick, int touchpad,
int finger);
/**
* Get the value of the axis on a joystick, if available.
*

View File

@@ -370,6 +370,23 @@ class GenericHID {
*/
void SetRumble(RumbleType type, double value);
/**
* Check if a touchpad finger is available.
* @param touchpad The touchpad to check.
* @param finger The finger to check.
* @return true if the touchpad finger is available.
*/
bool GetTouchpadFingerAvailable(int touchpad, int finger) const;
/**
* Get the touchpad finger data.
* @param touchpad The touchpad to read.
* @param finger The finger to read.
* @return The touchpad finger data.
*/
DriverStation::TouchpadFinger GetTouchpadFinger(int touchpad,
int finger) const;
private:
int m_port;
uint16_t m_leftRumble = 0;

View File

@@ -57,6 +57,8 @@ classes:
GetStickPOVsAvailable:
GetStickButtonsMaximumIndex:
GetStickButtonsAvailable:
GetStickTouchpadFinger:
GetStickTouchpadFingerAvailable:
inline_code: |
.def("getControlState",
[](DriverStation *self) -> std::tuple<bool, bool, bool> {
@@ -70,3 +72,8 @@ classes:
".. versionadded:: 2019.2.1\n"
"\n"
".. note:: This function only exists in RobotPy\n"))
wpi::DriverStation::TouchpadFinger:
attributes:
down:
x:
y:

View File

@@ -47,6 +47,8 @@ classes:
GetPOVsAvailable:
GetButtonsMaximumIndex:
GetButtonsAvailable:
GetTouchpadFingerAvailable:
GetTouchpadFinger:
inline_code: |
cls_GenericHID

View File

@@ -34,7 +34,8 @@ public final class DriverStation {
/** Number of Joystick ports. */
public static final int kJoystickPorts = 6;
private static final long[] m_metadataCache = new long[4];
private static final long[] m_metadataCache = new long[7];
private static final float[] m_touchpadFingersCache = new float[8];
private static int availableToCount(long available) {
// Top bit has to be set
@@ -52,6 +53,36 @@ public final class DriverStation {
return count;
}
private static final class HALJoystickTouchpadFinger {
public float m_x;
public float m_y;
public boolean m_down;
}
private static class HALJoystickTouchpad {
public final HALJoystickTouchpadFinger[] m_fingers =
new HALJoystickTouchpadFinger[DriverStationJNI.kMaxJoystickTouchpadFingers];
public int m_count;
HALJoystickTouchpad() {
for (int i = 0; i < m_fingers.length; i++) {
m_fingers[i] = new HALJoystickTouchpadFinger();
}
}
}
private static class HALJoystickTouchpads {
public final HALJoystickTouchpad[] m_touchpads =
new HALJoystickTouchpad[DriverStationJNI.kMaxJoystickTouchpads];
public int m_count;
HALJoystickTouchpads() {
for (int i = 0; i < m_touchpads.length; i++) {
m_touchpads[i] = new HALJoystickTouchpad();
}
}
}
private static final class HALJoystickButtons {
public long m_buttons;
public long m_available;
@@ -109,6 +140,32 @@ public final class DriverStation {
Elimination
}
/** Represents a finger on a touchpad. */
@SuppressWarnings("MemberName")
public static class TouchpadFinger {
/** Whether the finger is touching the touchpad. */
public final boolean down;
/** The x position of the finger. 0 is at top left. */
public final float x;
/** The y position of the finger. 0 is at top left. */
public final float y;
/**
* Creates a TouchpadFinger object.
*
* @param down Whether the finger is touching the touchpad.
* @param x The x position of the finger.
* @param y The y position of the finger.
*/
public TouchpadFinger(boolean down, float x, float y) {
this.x = x;
this.y = y;
this.down = down;
}
}
/** A controller POV direction. */
public enum POVDirection {
/** POV center. */
@@ -480,6 +537,8 @@ public final class DriverStation {
private static HALJoystickAxesRaw[] m_joystickAxesRaw = new HALJoystickAxesRaw[kJoystickPorts];
private static HALJoystickPOVs[] m_joystickPOVs = new HALJoystickPOVs[kJoystickPorts];
private static HALJoystickButtons[] m_joystickButtons = new HALJoystickButtons[kJoystickPorts];
private static HALJoystickTouchpads[] m_joystickTouchpads =
new HALJoystickTouchpads[kJoystickPorts];
private static MatchInfoData m_matchInfo = new MatchInfoData();
private static ControlWord m_controlWord = new ControlWord();
private static EventVector m_refreshEvents = new EventVector();
@@ -491,6 +550,8 @@ public final class DriverStation {
private static HALJoystickPOVs[] m_joystickPOVsCache = new HALJoystickPOVs[kJoystickPorts];
private static HALJoystickButtons[] m_joystickButtonsCache =
new HALJoystickButtons[kJoystickPorts];
private static HALJoystickTouchpads[] m_joystickTouchpadsCache =
new HALJoystickTouchpads[kJoystickPorts];
private static MatchInfoData m_matchInfoCache = new MatchInfoData();
private static ControlWord m_controlWordCache = new ControlWord();
@@ -521,11 +582,13 @@ public final class DriverStation {
m_joystickAxes[i] = new HALJoystickAxes(DriverStationJNI.kMaxJoystickAxes);
m_joystickAxesRaw[i] = new HALJoystickAxesRaw(DriverStationJNI.kMaxJoystickAxes);
m_joystickPOVs[i] = new HALJoystickPOVs(DriverStationJNI.kMaxJoystickPOVs);
m_joystickTouchpads[i] = new HALJoystickTouchpads();
m_joystickButtonsCache[i] = new HALJoystickButtons();
m_joystickAxesCache[i] = new HALJoystickAxes(DriverStationJNI.kMaxJoystickAxes);
m_joystickAxesRawCache[i] = new HALJoystickAxesRaw(DriverStationJNI.kMaxJoystickAxes);
m_joystickPOVsCache[i] = new HALJoystickPOVs(DriverStationJNI.kMaxJoystickPOVs);
m_joystickTouchpadsCache[i] = new HALJoystickTouchpads();
}
m_matchDataSender = new MatchDataSender();
@@ -791,6 +854,87 @@ public final class DriverStation {
return 0.0;
}
/**
* Get the state of a touchpad finger on the joystick.
*
* @param stick The joystick to read.
* @param touchpad The touchpad to read.
* @param finger The finger to read.
* @return the state of the touchpad finger.
*/
public static TouchpadFinger getStickTouchpadFinger(int stick, int touchpad, int finger) {
if (stick < 0 || stick >= kJoystickPorts) {
throw new IllegalArgumentException("Joystick index is out of range, should be 0-5");
}
if (touchpad < 0 || touchpad >= DriverStationJNI.kMaxJoystickTouchpads) {
throw new IllegalArgumentException("Joystick touchpad is out of range");
}
if (finger < 0 || finger >= DriverStationJNI.kMaxJoystickTouchpadFingers) {
throw new IllegalArgumentException("Joystick touchpad finger is out of range");
}
int touchpadCount;
m_cacheDataMutex.lock();
try {
touchpadCount = m_joystickTouchpads[stick].m_count;
if (touchpad < touchpadCount) {
HALJoystickTouchpad tp = m_joystickTouchpads[stick].m_touchpads[touchpad];
if (finger < tp.m_count) {
return new TouchpadFinger(
tp.m_fingers[finger].m_down, tp.m_fingers[finger].m_x, tp.m_fingers[finger].m_y);
}
}
} finally {
m_cacheDataMutex.unlock();
}
reportJoystickUnpluggedWarning(
"Joystick touchpad finger "
+ finger
+ " on touchpad "
+ touchpad
+ " on port "
+ stick
+ " not available, check if controller is plugged in");
return new TouchpadFinger(false, 0.0f, 0.0f);
}
/**
* Get whether a touchpad finger on the joystick is available.
*
* @param stick The joystick to read.
* @param touchpad The touchpad to read.
* @param finger The finger to read.
* @return whether the touchpad finger is available.
*/
public static boolean getStickTouchpadFingerAvailable(int stick, int touchpad, int finger) {
if (stick < 0 || stick >= kJoystickPorts) {
throw new IllegalArgumentException("Joystick index is out of range, should be 0-5");
}
if (touchpad < 0 || touchpad >= DriverStationJNI.kMaxJoystickTouchpads) {
throw new IllegalArgumentException("Joystick touchpad is out of range");
}
if (finger < 0 || finger >= DriverStationJNI.kMaxJoystickTouchpadFingers) {
throw new IllegalArgumentException("Joystick touchpad finger is out of range");
}
int touchpadCount;
m_cacheDataMutex.lock();
try {
touchpadCount = m_joystickTouchpads[stick].m_count;
if (touchpad < touchpadCount) {
HALJoystickTouchpad tp = m_joystickTouchpads[stick].m_touchpads[touchpad];
if (finger < tp.m_count) {
return true;
}
}
} finally {
m_cacheDataMutex.unlock();
}
return false;
}
/**
* Get the value of the axis on a joystick if available. This depends on the mapping of the
* joystick connected to the specified port.
@@ -1399,12 +1543,26 @@ public final class DriverStation {
m_joystickAxesCache[stick].m_axes,
m_joystickAxesRawCache[stick].m_axes,
m_joystickPOVsCache[stick].m_povs,
m_touchpadFingersCache,
m_metadataCache);
m_joystickAxesCache[stick].m_available = (int) m_metadataCache[0];
m_joystickAxesRawCache[stick].m_available = (int) m_metadataCache[0];
m_joystickPOVsCache[stick].m_available = (int) m_metadataCache[1];
m_joystickButtonsCache[stick].m_available = m_metadataCache[2];
m_joystickButtonsCache[stick].m_buttons = m_metadataCache[3];
m_joystickTouchpadsCache[stick].m_count = (int) m_metadataCache[4];
for (int i = 0; i < m_joystickTouchpadsCache[stick].m_count; i++) {
long metadata = m_metadataCache[5 + i];
m_joystickTouchpadsCache[stick].m_touchpads[i].m_fingers[0].m_down = (metadata & 0x1) != 0;
m_joystickTouchpadsCache[stick].m_touchpads[i].m_fingers[1].m_down = (metadata & 0x2) != 0;
m_joystickTouchpadsCache[stick].m_touchpads[i].m_count = (int) (metadata >> 2 & 0x3);
for (int j = 0; j < m_joystickTouchpadsCache[stick].m_touchpads[i].m_count; j++) {
m_joystickTouchpadsCache[stick].m_touchpads[i].m_fingers[j].m_x =
m_touchpadFingersCache[i * 4 + j * 2 + 0];
m_joystickTouchpadsCache[stick].m_touchpads[i].m_fingers[j].m_y =
m_touchpadFingersCache[i * 4 + j * 2 + 1];
}
}
}
DriverStationJNI.getMatchInfo(m_matchInfoCache);
@@ -1442,6 +1600,10 @@ public final class DriverStation {
m_joystickPOVs = m_joystickPOVsCache;
m_joystickPOVsCache = currentPOVs;
HALJoystickTouchpads[] currentTouchpads = m_joystickTouchpads;
m_joystickTouchpads = m_joystickTouchpadsCache;
m_joystickTouchpadsCache = currentTouchpads;
MatchInfoData currentInfo = m_matchInfo;
m_matchInfo = m_matchInfoCache;
m_matchInfoCache = currentInfo;

View File

@@ -7,6 +7,7 @@ package org.wpilib.driverstation;
import java.util.HashMap;
import java.util.Map;
import org.wpilib.driverstation.DriverStation.POVDirection;
import org.wpilib.driverstation.DriverStation.TouchpadFinger;
import org.wpilib.event.BooleanEvent;
import org.wpilib.event.EventLoop;
import org.wpilib.hardware.hal.DriverStationJNI;
@@ -501,4 +502,26 @@ public class GenericHID {
this.m_leftTriggerRumble,
this.m_rightTriggerRumble);
}
/**
* Check if a touchpad finger is available.
*
* @param touchpad The touchpad to check.
* @param finger The finger to check.
* @return true if the touchpad finger is available.
*/
public boolean getTouchpadFingerAvailable(int touchpad, int finger) {
return DriverStation.getStickTouchpadFingerAvailable(m_port, touchpad, finger);
}
/**
* Get the touchpad finger data.
*
* @param touchpad The touchpad to read.
* @param finger The finger to read.
* @return The touchpad finger data.
*/
public TouchpadFinger getTouchpadFinger(int touchpad, int finger) {
return DriverStation.getStickTouchpadFinger(m_port, touchpad, finger);
}
}