From e08c132175232aca748321be3fb76b309c281eb6 Mon Sep 17 00:00:00 2001
From: shinyquagsire23 <mtinc2@gmail.com>
Date: Mon, 15 Jan 2018 00:13:18 -0700
Subject: [PATCH] hid: Add sharedmem structs

---
 src/core/hle/service/hid/hid.h | 312 +++++++++++++++++++++++++++++++++
 1 file changed, 312 insertions(+)

diff --git a/src/core/hle/service/hid/hid.h b/src/core/hle/service/hid/hid.h
index f7621f62d1..7803778d47 100644
--- a/src/core/hle/service/hid/hid.h
+++ b/src/core/hle/service/hid/hid.h
@@ -9,6 +9,318 @@
 namespace Service {
 namespace HID {
 
+// Begin enums and output structs
+
+enum HIDControllerType : u32 {
+    ControllerType_ProController = 1 << 0,
+    ControllerType_Handheld = 1 << 1,
+    ControllerType_JoyconPair = 1 << 2,
+    ControllerType_JoyconLeft = 1 << 3,
+    ControllerType_JoyconRight = 1 << 4,
+};
+
+enum HIDControllerLayoutType : u32 {
+    Layout_ProController = 0, // Pro Controller or HID gamepad
+    Layout_Handheld = 1,      // Two Joy-Con docked to rails
+    Layout_Single = 2, // Horizontal single Joy-Con or pair of Joy-Con, adjusted for orientation
+    Layout_Left = 3,   // Only raw left Joy-Con state, no orientation adjustment
+    Layout_Right = 4,  // Only raw right Joy-Con state, no orientation adjustment
+    Layout_DefaultDigital = 5, // Same as next, but sticks have 8-direction values only
+    Layout_Default = 6, // Safe default, single Joy-Con have buttons/sticks rotated for orientation
+};
+
+enum HIDControllerColorDescription {
+    ColorDesc_ColorsNonexistent = 1 << 1,
+};
+
+enum HIDControllerConnectionState {
+    ConnectionState_Connected = 1 << 0,
+    ConnectionState_Wired = 1 << 1,
+};
+
+enum HIDControllerID {
+    Controller_Player1 = 0,
+    Controller_Player2 = 1,
+    Controller_Player3 = 2,
+    Controller_Player4 = 3,
+    Controller_Player5 = 4,
+    Controller_Player6 = 5,
+    Controller_Player7 = 6,
+    Controller_Player8 = 7,
+    Controller_Handheld = 8,
+    Controller_Unknown = 9,
+};
+
+// End enums and output structs
+
+// Begin HIDTouchScreen
+
+struct HIDTouchScreenHeader {
+    u64 timestampTicks;
+    u64 numEntries;
+    u64 latestEntry;
+    u64 maxEntryIndex;
+    u64 timestamp;
+};
+static_assert(sizeof(HIDTouchScreenHeader) == 0x28,
+              "HID touch screen header structure has incorrect size");
+
+struct HIDTouchScreenEntryHeader {
+    u64 timestamp;
+    u64 numTouches;
+};
+static_assert(sizeof(HIDTouchScreenEntryHeader) == 0x10,
+              "HID touch screen entry header structure has incorrect size");
+
+struct HIDTouchScreenEntryTouch {
+    u64 timestamp;
+    u32 padding;
+    u32 touchIndex;
+    u32 x;
+    u32 y;
+    u32 diameterX;
+    u32 diameterY;
+    u32 angle;
+    u32 padding_2;
+};
+static_assert(sizeof(HIDTouchScreenEntryTouch) == 0x28,
+              "HID touch screen touch structure has incorrect size");
+
+struct HIDTouchScreenEntry {
+    HIDTouchScreenEntryHeader header;
+    std::array<HIDTouchScreenEntryTouch, 16> touches;
+    u64 unk;
+};
+static_assert(sizeof(HIDTouchScreenEntry) == 0x298,
+              "HID touch screen entry structure has incorrect size");
+
+struct HIDTouchScreen {
+    HIDTouchScreenHeader header;
+    std::array<HIDTouchScreenEntry, 17> entries;
+    std::array<u8, 0x3c0> padding;
+};
+static_assert(sizeof(HIDTouchScreen) == 0x3000, "HID touch screen structure has incorrect size");
+
+// End HIDTouchScreen
+
+// Begin HIDMouse
+
+struct HIDMouseHeader {
+    u64 timestampTicks;
+    u64 numEntries;
+    u64 latestEntry;
+    u64 maxEntryIndex;
+};
+static_assert(sizeof(HIDMouseHeader) == 0x20, "HID mouse header structure has incorrect size");
+
+struct HIDMouseButtonState {
+    union {
+        u64 hex{};
+
+        // Buttons
+        BitField<0, 1, u64> left;
+        BitField<1, 1, u64> right;
+        BitField<2, 1, u64> middle;
+        BitField<3, 1, u64> forward;
+        BitField<4, 1, u64> back;
+    };
+};
+
+struct HIDMouseEntry {
+    u64 timestamp;
+    u64 timestamp_2;
+    u32 x;
+    u32 y;
+    u32 velocityX;
+    u32 velocityY;
+    u32 scrollVelocityX;
+    u32 scrollVelocityY;
+    HIDMouseButtonState buttons;
+};
+static_assert(sizeof(HIDMouseEntry) == 0x30, "HID mouse entry structure has incorrect size");
+
+struct HIDMouse {
+    HIDMouseHeader header;
+    std::array<HIDMouseEntry, 17> entries;
+    std::array<u8, 0xB0> padding;
+};
+static_assert(sizeof(HIDMouse) == 0x400, "HID mouse structure has incorrect size");
+
+// End HIDMouse
+
+// Begin HIDKeyboard
+
+struct HIDKeyboardHeader {
+    u64 timestampTicks;
+    u64 numEntries;
+    u64 latestEntry;
+    u64 maxEntryIndex;
+};
+static_assert(sizeof(HIDKeyboardHeader) == 0x20,
+              "HID keyboard header structure has incorrect size");
+
+struct HIDKeyboardModifierKeyState {
+    union {
+        u64 hex{};
+
+        // Buttons
+        BitField<0, 1, u64> lctrl;
+        BitField<1, 1, u64> lshift;
+        BitField<2, 1, u64> lalt;
+        BitField<3, 1, u64> lmeta;
+        BitField<4, 1, u64> rctrl;
+        BitField<5, 1, u64> rshift;
+        BitField<6, 1, u64> ralt;
+        BitField<7, 1, u64> rmeta;
+        BitField<8, 1, u64> capslock;
+        BitField<9, 1, u64> scrolllock;
+        BitField<10, 1, u64> numlock;
+    };
+};
+
+struct HIDKeyboardEntry {
+    u64 timestamp;
+    u64 timestamp_2;
+    HIDKeyboardModifierKeyState modifier;
+    u32 keys[8];
+};
+static_assert(sizeof(HIDKeyboardEntry) == 0x38, "HID keyboard entry structure has incorrect size");
+
+struct HIDKeyboard {
+    HIDKeyboardHeader header;
+    std::array<HIDKeyboardEntry, 17> entries;
+    std::array<u8, 0x28> padding;
+};
+static_assert(sizeof(HIDKeyboard) == 0x400, "HID keyboard structure has incorrect size");
+
+// End HIDKeyboard
+
+// Begin HIDController
+
+struct HIDControllerMAC {
+    u64 timestamp;
+    std::array<u8, 0x8> mac;
+    u64 unk;
+    u64 timestamp_2;
+};
+static_assert(sizeof(HIDControllerMAC) == 0x20, "HID controller MAC structure has incorrect size");
+
+struct HIDControllerHeader {
+    u32 type;
+    u32 isHalf;
+    u32 singleColorsDescriptor;
+    u32 singleColorBody;
+    u32 singleColorButtons;
+    u32 splitColorsDescriptor;
+    u32 leftColorBody;
+    u32 leftColorButtons;
+    u32 rightColorBody;
+    u32 rightColorbuttons;
+};
+static_assert(sizeof(HIDControllerHeader) == 0x28,
+              "HID controller header structure has incorrect size");
+
+struct HIDControllerLayoutHeader {
+    u64 timestampTicks;
+    u64 numEntries;
+    u64 latestEntry;
+    u64 maxEntryIndex;
+};
+static_assert(sizeof(HIDControllerLayoutHeader) == 0x20,
+              "HID controller layout header structure has incorrect size");
+
+struct HIDControllerPadState {
+    union {
+        u64 hex{};
+
+        // Buttons
+        BitField<0, 1, u64> a;
+        BitField<1, 1, u64> b;
+        BitField<2, 1, u64> x;
+        BitField<3, 1, u64> y;
+        BitField<4, 1, u64> lstick;
+        BitField<5, 1, u64> rstick;
+        BitField<6, 1, u64> l;
+        BitField<7, 1, u64> r;
+        BitField<8, 1, u64> zl;
+        BitField<9, 1, u64> zr;
+        BitField<10, 1, u64> plus;
+        BitField<11, 1, u64> minus;
+
+        // D-pad buttons
+        BitField<12, 1, u64> dleft;
+        BitField<13, 1, u64> dup;
+        BitField<14, 1, u64> dright;
+        BitField<15, 1, u64> ddown;
+
+        // Left stick directions
+        BitField<16, 1, u64> lstick_left;
+        BitField<17, 1, u64> lstick_up;
+        BitField<18, 1, u64> lstick_right;
+        BitField<19, 1, u64> lstick_down;
+
+        // Right stick directions
+        BitField<20, 1, u64> rstick_left;
+        BitField<21, 1, u64> rstick_up;
+        BitField<22, 1, u64> rstick_right;
+        BitField<23, 1, u64> rstick_down;
+
+        BitField<24, 1, u64> sl;
+        BitField<25, 1, u64> sr;
+    };
+};
+
+struct HIDControllerInputEntry {
+    u64 timestamp;
+    u64 timestamp_2;
+    HIDControllerPadState buttons;
+    u32 joystickLeftX;
+    u32 joystickLeftY;
+    u32 joystickRightX;
+    u32 joystickRightY;
+    u64 connectionState;
+};
+static_assert(sizeof(HIDControllerInputEntry) == 0x30,
+              "HID controller input entry structure has incorrect size");
+
+struct HIDControllerLayout {
+    HIDControllerLayoutHeader header;
+    std::array<HIDControllerInputEntry, 17> entries;
+};
+static_assert(sizeof(HIDControllerLayout) == 0x350,
+              "HID controller layout structure has incorrect size");
+
+struct HIDController {
+    HIDControllerHeader header;
+    std::array<HIDControllerLayout, 7> layouts;
+    std::array<u8, 0x2a70> unk_1;
+    HIDControllerMAC macLeft;
+    HIDControllerMAC macRight;
+    std::array<u8, 0xdf8> unk_2;
+};
+static_assert(sizeof(HIDController) == 0x5000, "HID controller structure has incorrect size");
+
+// End HIDController
+
+struct HIDSharedMemory {
+    std::array<u8, 0x400> header;
+    HIDTouchScreen touchscreen;
+    HIDMouse mouse;
+    HIDKeyboard keyboard;
+    std::array<u8, 0x400> unkSection1;
+    std::array<u8, 0x400> unkSection2;
+    std::array<u8, 0x400> unkSection3;
+    std::array<u8, 0x400> unkSection4;
+    std::array<u8, 0x200> unkSection5;
+    std::array<u8, 0x200> unkSection6;
+    std::array<u8, 0x200> unkSection7;
+    std::array<u8, 0x800> unkSection8;
+    std::array<u8, 0x4000> controllerSerials;
+    std::array<HIDController, 10> controllers;
+    std::array<u8, 0x4600> unkSection9;
+};
+static_assert(sizeof(HIDSharedMemory) == 0x40000, "HID Shared Memory structure has incorrect size");
+
 /// Reload input devices. Used when input configuration changed
 void ReloadInputDevices();