emoemu 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (213) hide show
  1. package/.claude/settings.local.json +77 -0
  2. package/.node-version +1 -0
  3. package/CLAUDE.md +435 -0
  4. package/README.md +404 -0
  5. package/TODO.md +655 -0
  6. package/dist/index.cjs +25108 -0
  7. package/dist/index.d.ts +1 -0
  8. package/dist/index.js +25085 -0
  9. package/docs/building-libretro-cores-arm-mac.md +237 -0
  10. package/docs/config-file-format.md +488 -0
  11. package/docs/cores-trd.md +425 -0
  12. package/docs/headless-hardware-rendering-trd.md +676 -0
  13. package/docs/libretro-cores-trd.md +997 -0
  14. package/docs/mupen64-software-rendering-trd.md +751 -0
  15. package/docs/n64-support-trd.md +306 -0
  16. package/docs/native-rendering-trd.md +540 -0
  17. package/docs/native-ui-rendering-trd.md +1195 -0
  18. package/docs/netplay-trd.md +665 -0
  19. package/docs/retroarch-netplay-docs.md +277 -0
  20. package/docs/save-state-format.md +666 -0
  21. package/eslint.config.js +111 -0
  22. package/icon/icon.png +0 -0
  23. package/icon/icon.pxd +0 -0
  24. package/package.json +63 -0
  25. package/pnpm-workspace.yaml +10 -0
  26. package/src/Emulator/consts.ts +14 -0
  27. package/src/Emulator/index.ts +2496 -0
  28. package/src/Emulator/saveState/index.ts +155 -0
  29. package/src/Emulator/screenshot/index.ts +160 -0
  30. package/src/Emulator/terminalDimensions/index.ts +79 -0
  31. package/src/Emulator/types.ts +83 -0
  32. package/src/cli/commands/consts.ts +10 -0
  33. package/src/cli/commands/index.ts +462 -0
  34. package/src/cli/parseArgs/consts.ts +17 -0
  35. package/src/cli/parseArgs/index.ts +457 -0
  36. package/src/cli/parseArgs/types.ts +61 -0
  37. package/src/cli/runEmulator/index.ts +406 -0
  38. package/src/cli/runEmulator/types.ts +7 -0
  39. package/src/consts.ts +19 -0
  40. package/src/core/button/consts.ts +35 -0
  41. package/src/core/button/index.ts +123 -0
  42. package/src/core/core.ts +300 -0
  43. package/src/core/index.ts +19 -0
  44. package/src/cores/libretro/api/index.ts +334 -0
  45. package/src/cores/libretro/api/types.ts +148 -0
  46. package/src/cores/libretro/callbacks/consts.ts +41 -0
  47. package/src/cores/libretro/callbacks/index.ts +456 -0
  48. package/src/cores/libretro/consts.ts +45 -0
  49. package/src/cores/libretro/coreOptions/consts.ts +36 -0
  50. package/src/cores/libretro/coreOptions/index.ts +222 -0
  51. package/src/cores/libretro/environment/consts.ts +118 -0
  52. package/src/cores/libretro/environment/index.ts +1095 -0
  53. package/src/cores/libretro/index.ts +937 -0
  54. package/src/cores/libretro/loader/index.ts +496 -0
  55. package/src/cores/libretro/pixelFormat/consts.ts +43 -0
  56. package/src/cores/libretro/pixelFormat/index.ts +397 -0
  57. package/src/cores/libretro/types.ts +339 -0
  58. package/src/frontend/AudioManager/index.ts +420 -0
  59. package/src/frontend/SettingsManager/index.ts +250 -0
  60. package/src/frontend/config/index.ts +608 -0
  61. package/src/frontend/config/tests.ts +354 -0
  62. package/src/frontend/config/types.ts +36 -0
  63. package/src/frontend/consts.ts +114 -0
  64. package/src/frontend/coreBuilder/index.ts +644 -0
  65. package/src/frontend/coreBuilder/types.ts +15 -0
  66. package/src/frontend/coreDownloader/index.ts +620 -0
  67. package/src/frontend/coreDownloader/types.ts +17 -0
  68. package/src/frontend/corePreferences/index.ts +69 -0
  69. package/src/frontend/coreRegistry/index.ts +276 -0
  70. package/src/frontend/directoryCache/index.ts +75 -0
  71. package/src/frontend/index.ts +79 -0
  72. package/src/frontend/notifications/consts.ts +14 -0
  73. package/src/frontend/notifications/index.ts +250 -0
  74. package/src/frontend/playlist/consts.ts +168 -0
  75. package/src/frontend/playlist/index.ts +899 -0
  76. package/src/frontend/playlist/labelFormatter/consts.ts +15 -0
  77. package/src/frontend/playlist/labelFormatter/index.ts +155 -0
  78. package/src/frontend/playlist/labelFormatter/tests.ts +153 -0
  79. package/src/frontend/playlist/reader/index.ts +559 -0
  80. package/src/frontend/playlist/sync/index.ts +511 -0
  81. package/src/frontend/playlist/systemLookup/index.ts +233 -0
  82. package/src/frontend/playlist/utils/index.ts +50 -0
  83. package/src/frontend/romScanner/consts.ts +348 -0
  84. package/src/frontend/romScanner/index.ts +1957 -0
  85. package/src/frontend/saveServices/consts.ts +2 -0
  86. package/src/frontend/saveServices/index.ts +313 -0
  87. package/src/frontend/serviceProvider/index.ts +108 -0
  88. package/src/frontend/serviceProvider/types.ts +13 -0
  89. package/src/index.ts +428 -0
  90. package/src/input/Controller/consts.ts +50 -0
  91. package/src/input/Controller/index.ts +81 -0
  92. package/src/input/GamepadManager/consts.ts +22 -0
  93. package/src/input/GamepadManager/index.ts +418 -0
  94. package/src/input/InputManager/consts.ts +86 -0
  95. package/src/input/InputManager/index.ts +593 -0
  96. package/src/input/InputMapper/consts.ts +33 -0
  97. package/src/input/InputMapper/index.ts +436 -0
  98. package/src/input/consts.ts +410 -0
  99. package/src/input/gamepadProfiles/index.ts +1100 -0
  100. package/src/input/index.ts +38 -0
  101. package/src/input/inputUtils/index.ts +31 -0
  102. package/src/netplay/FrameBuffer/consts.ts +2 -0
  103. package/src/netplay/FrameBuffer/index.ts +364 -0
  104. package/src/netplay/FrameBuffer/tests.ts +286 -0
  105. package/src/netplay/InputBuffer/consts.ts +7 -0
  106. package/src/netplay/InputBuffer/index.ts +347 -0
  107. package/src/netplay/InputBuffer/tests.ts +166 -0
  108. package/src/netplay/NetplayClient/index.ts +976 -0
  109. package/src/netplay/NetplayConnection/index.ts +536 -0
  110. package/src/netplay/NetplayDiscovery/consts.ts +41 -0
  111. package/src/netplay/NetplayDiscovery/index.ts +525 -0
  112. package/src/netplay/NetplayServer/index.ts +1407 -0
  113. package/src/netplay/SyncManager/index.ts +984 -0
  114. package/src/netplay/SyncManager/tests.ts +419 -0
  115. package/src/netplay/consts.ts +371 -0
  116. package/src/netplay/crc32/consts.ts +14 -0
  117. package/src/netplay/crc32/index.ts +97 -0
  118. package/src/netplay/crc32/tests.ts +40 -0
  119. package/src/netplay/index.ts +41 -0
  120. package/src/netplay/netplayLogger/consts.ts +30 -0
  121. package/src/netplay/netplayLogger/index.ts +345 -0
  122. package/src/netplay/protocol/consts.ts +86 -0
  123. package/src/netplay/protocol/index.ts +1280 -0
  124. package/src/netplay/protocol/tests.ts +606 -0
  125. package/src/netplay/protocol/types.ts +20 -0
  126. package/src/netplay/types.ts +395 -0
  127. package/src/rendering/KittyRenderer/index.ts +616 -0
  128. package/src/rendering/NativeRenderer/index.ts +279 -0
  129. package/src/rendering/NativeRenderer/tests.ts +133 -0
  130. package/src/rendering/TerminalRenderer/index.ts +770 -0
  131. package/src/rendering/consts.ts +401 -0
  132. package/src/rendering/fonts/CozetteVector.ttf +0 -0
  133. package/src/rendering/index.ts +26 -0
  134. package/src/rendering/nativeUi/NativeWindowManager/index.ts +158 -0
  135. package/src/rendering/nativeUi/NativeWindowManager/tests.ts +81 -0
  136. package/src/rendering/nativeUi/consts.ts +6 -0
  137. package/src/rendering/nativeUi/index.ts +20 -0
  138. package/src/rendering/postProcessing/consts.ts +38 -0
  139. package/src/rendering/postProcessing/index.ts +923 -0
  140. package/src/rendering/shared/ansi/consts.ts +12 -0
  141. package/src/rendering/shared/ansi/index.ts +104 -0
  142. package/src/rendering/shared/consts.ts +2 -0
  143. package/src/rendering/shared/fitToTerminal/index.ts +67 -0
  144. package/src/ui/AddRomsPrompt/consts.ts +13 -0
  145. package/src/ui/AddRomsPrompt/index.tsx +781 -0
  146. package/src/ui/App/consts.ts +2 -0
  147. package/src/ui/App/index.tsx +456 -0
  148. package/src/ui/AppCapabilities/index.tsx +67 -0
  149. package/src/ui/ConfigContext/index.tsx +56 -0
  150. package/src/ui/CoreManager/consts.ts +11 -0
  151. package/src/ui/CoreManager/index.tsx +779 -0
  152. package/src/ui/CoreSelector/consts.ts +2 -0
  153. package/src/ui/CoreSelector/index.tsx +251 -0
  154. package/src/ui/DialogContainer/index.tsx +42 -0
  155. package/src/ui/DialogOptionsList/index.tsx +61 -0
  156. package/src/ui/DuplicateCrcPrompt/consts.ts +5 -0
  157. package/src/ui/DuplicateCrcPrompt/index.tsx +146 -0
  158. package/src/ui/GamepadContext/consts.ts +15 -0
  159. package/src/ui/GamepadContext/index.tsx +295 -0
  160. package/src/ui/NativeDialog/index.tsx +120 -0
  161. package/src/ui/NetplayDisconnectedDialog/index.tsx +93 -0
  162. package/src/ui/NetplayPauseMenu/consts.ts +2 -0
  163. package/src/ui/NetplayPauseMenu/index.tsx +97 -0
  164. package/src/ui/RomBrowser/NetplayPanel/consts.ts +24 -0
  165. package/src/ui/RomBrowser/NetplayPanel/index.tsx +520 -0
  166. package/src/ui/RomBrowser/SettingsPanel/index.tsx +478 -0
  167. package/src/ui/RomBrowser/consts.ts +61 -0
  168. package/src/ui/RomBrowser/index.tsx +1164 -0
  169. package/src/ui/RomBrowser/settingsConfig/index.ts +320 -0
  170. package/src/ui/RomBrowser/types.ts +67 -0
  171. package/src/ui/SaveStateDialog/consts.ts +2 -0
  172. package/src/ui/SaveStateDialog/index.tsx +225 -0
  173. package/src/ui/WarningDialog/index.tsx +113 -0
  174. package/src/ui/consts.ts +27 -0
  175. package/src/ui/hooks/useClearTerminal/consts.ts +2 -0
  176. package/src/ui/hooks/useClearTerminal/index.ts +37 -0
  177. package/src/ui/hooks/useDialogNavigation/index.ts +99 -0
  178. package/src/ui/hooks/useGamepad/consts.ts +21 -0
  179. package/src/ui/hooks/useGamepad/index.ts +194 -0
  180. package/src/ui/index.ts +27 -0
  181. package/src/utils/buffer/consts.ts +17 -0
  182. package/src/utils/buffer/index.ts +129 -0
  183. package/src/utils/color/consts.ts +58 -0
  184. package/src/utils/color/index.ts +183 -0
  185. package/src/utils/compression/consts.ts +50 -0
  186. package/src/utils/compression/index.ts +101 -0
  187. package/src/utils/consts.ts +2 -0
  188. package/src/utils/crc32/consts.ts +22 -0
  189. package/src/utils/crc32/index.ts +83 -0
  190. package/src/utils/ensureDirectory/index.ts +10 -0
  191. package/src/utils/format/consts.ts +8 -0
  192. package/src/utils/format/index.ts +53 -0
  193. package/src/utils/getErrorMessage/index.ts +10 -0
  194. package/src/utils/index.ts +113 -0
  195. package/src/utils/ini/index.ts +200 -0
  196. package/src/utils/kitty/consts.ts +13 -0
  197. package/src/utils/kitty/index.ts +181 -0
  198. package/src/utils/logger/consts.ts +35 -0
  199. package/src/utils/logger/index.ts +217 -0
  200. package/src/utils/paths/consts.ts +18 -0
  201. package/src/utils/paths/index.ts +151 -0
  202. package/src/utils/png/consts.ts +34 -0
  203. package/src/utils/png/index.ts +131 -0
  204. package/src/utils/readJsonFile/index.ts +16 -0
  205. package/src/utils/rotateLogFile/index.ts +44 -0
  206. package/src/utils/safeClose/index.ts +10 -0
  207. package/src/utils/terminal/consts.ts +8 -0
  208. package/src/utils/terminal/index.ts +102 -0
  209. package/src/utils/thumbnailRenderer/consts.ts +2 -0
  210. package/src/utils/thumbnailRenderer/index.ts +147 -0
  211. package/src/utils/typedError/index.ts +26 -0
  212. package/tsconfig.json +31 -0
  213. package/vitest.config.ts +13 -0
@@ -0,0 +1,410 @@
1
+ // =============================================================================
2
+ // Keyboard Input Constants
3
+ // =============================================================================
4
+
5
+ /** Kitty keyboard protocol flags: 1=disambiguate, 2=event types, 8=all keys as CSI */
6
+ export const KITTY_PROTOCOL_FLAGS = 11;
7
+
8
+ /** Kitty protocol escape sequences */
9
+ export const KITTY_ENABLE = '\x1b[>11u';
10
+ export const KITTY_DISABLE = '\x1b[<u';
11
+ export const KITTY_QUERY = '\x1b[?u';
12
+
13
+ /** Time in ms to wait for Kitty protocol response */
14
+ export const KITTY_DETECT_TIMEOUT_MS = 100;
15
+
16
+ /** Time in ms before auto-releasing keys in legacy mode */
17
+ export const LEGACY_KEY_RELEASE_TIME_MS = 80;
18
+
19
+ /** Small delay in ms for clearing response data */
20
+ export const KITTY_RESPONSE_CLEAR_DELAY_MS = 10;
21
+
22
+ /** Maximum escape sequence buffer length before skipping */
23
+ export const MAX_ESCAPE_SEQUENCE_LENGTH = 10;
24
+
25
+ /** Length of legacy arrow key escape sequence (e.g., \x1b[A) */
26
+ export const LEGACY_ARROW_KEY_SEQUENCE_LENGTH = 3;
27
+
28
+ /** Kitty key event types */
29
+ export const KITTY_EVENT_PRESS = 1;
30
+ export const KITTY_EVENT_REPEAT = 2;
31
+ export const KITTY_EVENT_RELEASE = 3;
32
+
33
+ /** Kitty special key codes */
34
+ export const KITTY_KEY_ESCAPE = 27;
35
+ export const KITTY_KEY_ARROW_UP = 57352;
36
+ export const KITTY_KEY_ARROW_DOWN = 57353;
37
+ export const KITTY_KEY_ARROW_LEFT = 57350;
38
+ export const KITTY_KEY_ARROW_RIGHT = 57351;
39
+ export const KITTY_KEY_F8 = 57383;
40
+ export const KITTY_KEY_F12 = 57387;
41
+
42
+ /** Standard key codes (Unicode codepoints) */
43
+ export const KEY_CODE_W = 119;
44
+ export const KEY_CODE_S = 115;
45
+ export const KEY_CODE_A = 97;
46
+ export const KEY_CODE_D = 100;
47
+ export const KEY_CODE_K = 107;
48
+ export const KEY_CODE_Z = 122;
49
+ export const KEY_CODE_J = 106;
50
+ export const KEY_CODE_X = 120;
51
+ export const KEY_CODE_ENTER = 13;
52
+ export const KEY_CODE_SPACE = 32;
53
+ export const KEY_CODE_R_LOWER = 114;
54
+ export const KEY_CODE_R_UPPER = 82;
55
+ export const KEY_CODE_M_LOWER = 109;
56
+ export const KEY_CODE_M_UPPER = 77;
57
+ export const KEY_CODE_P_LOWER = 112;
58
+ export const KEY_CODE_P_UPPER = 80;
59
+ export const KEY_CODE_N_LOWER = 110;
60
+ export const KEY_CODE_N_UPPER = 78;
61
+
62
+ // =============================================================================
63
+ // NES Controller Constants
64
+ // =============================================================================
65
+
66
+ /** Number of buttons in an NES controller */
67
+ export const NES_BUTTON_COUNT = 8;
68
+
69
+ /** Total buttons including SNES extensions */
70
+ export const CONTROLLER_BUTTON_COUNT = 12;
71
+
72
+ /** High bit for shift register (fill with 1s after all bits read) */
73
+ export const CONTROLLER_SHIFT_REGISTER_HIGH_BIT = 0x80;
74
+
75
+ // =============================================================================
76
+ // Gamepad Manager Constants
77
+ // =============================================================================
78
+
79
+ /** Interval in ms for scanning for new gamepad devices (hotplug support) */
80
+ export const GAMEPAD_SCAN_INTERVAL_MS = 3000;
81
+
82
+ /** Maximum number of gamepads supported */
83
+ export const MAX_GAMEPADS = 2;
84
+
85
+ /** Hexadecimal base for formatting hex strings */
86
+ export const HEX_BASE = 16;
87
+
88
+ /** Maximum length for profile name display truncation */
89
+ export const PROFILE_NAME_DISPLAY_LENGTH = 15;
90
+
91
+ // =============================================================================
92
+ // Analog Input Constants
93
+ // =============================================================================
94
+
95
+ /** Maximum positive value for signed 16-bit analog values */
96
+ export const ANALOG_INT16_MAX = 32767;
97
+
98
+ /** Decimal places for analog debug value formatting */
99
+ export const ANALOG_DEBUG_DECIMALS = 3;
100
+
101
+ /** Center value for unsigned 16-bit analog (Xbox Series BT uses unsigned) */
102
+ export const ANALOG_UINT16_CENTER = 32768;
103
+
104
+ // =============================================================================
105
+ // HID Usage Constants
106
+ // =============================================================================
107
+
108
+ /** HID usage page for Generic Desktop Controls */
109
+ export const HID_USAGE_PAGE_GENERIC_DESKTOP = 0x01;
110
+
111
+ /** HID usage for Joystick */
112
+ export const HID_USAGE_JOYSTICK = 0x04;
113
+
114
+ /** HID usage for Gamepad */
115
+ export const HID_USAGE_GAMEPAD = 0x05;
116
+
117
+ // =============================================================================
118
+ // Gamepad Vendor IDs
119
+ // =============================================================================
120
+
121
+ export const VENDOR_MICROSOFT = 0x045e;
122
+ export const VENDOR_SONY = 0x054c;
123
+ export const VENDOR_NINTENDO = 0x057e;
124
+ export const VENDOR_8BITDO = 0x2dc8;
125
+ export const VENDOR_PDP = 0x0e6f;
126
+ export const VENDOR_HORI = 0x0f0d;
127
+ export const VENDOR_RAZER = 0x1532;
128
+ export const VENDOR_POWERA = 0x24c6;
129
+ export const VENDOR_VALVE = 0x28de;
130
+ export const VENDOR_LOGITECH = 0x046d;
131
+ export const VENDOR_DRAGONRISE = 0x0079;
132
+ export const VENDOR_GENERIC_0810 = 0x0810;
133
+ export const VENDOR_HONEYBEE = 0x12ab;
134
+ export const VENDOR_GENERIC_1A34 = 0x1a34;
135
+ export const VENDOR_POWERA_BDA = 0x20d6;
136
+
137
+ // =============================================================================
138
+ // Xbox Product IDs
139
+ // =============================================================================
140
+
141
+ // Xbox 360 Controllers
142
+ export const PRODUCT_XBOX_360 = 0x028e;
143
+ export const PRODUCT_XBOX_360_WIRELESS = 0x028f;
144
+ export const PRODUCT_XBOX_360_WIRELESS_RECEIVER = 0x0291;
145
+ export const PRODUCT_XBOX_360_WIRELESS_ALT = 0x02a1;
146
+ export const PRODUCT_XBOX_360_WIRELESS_RECEIVER_ALT = 0x0719;
147
+
148
+ // Xbox One/Series Controllers
149
+ export const PRODUCT_XBOX_ONE = 0x02d1;
150
+ export const PRODUCT_XBOX_ONE_2015 = 0x02dd;
151
+ export const PRODUCT_XBOX_ONE_ELITE = 0x02e3;
152
+ export const PRODUCT_XBOX_ONE_S = 0x02ea;
153
+ export const PRODUCT_XBOX_ONE_S_BT = 0x02fd;
154
+ export const PRODUCT_XBOX_ELITE_S2 = 0x0b00;
155
+ export const PRODUCT_XBOX_ELITE_S2_BT = 0x0b05;
156
+ export const PRODUCT_XBOX_SERIES = 0x0b12;
157
+ export const PRODUCT_XBOX_SERIES_BT = 0x0b13;
158
+ export const PRODUCT_XBOX_ADAPTIVE = 0x0b20;
159
+ export const PRODUCT_XBOX_ADAPTIVE_BT = 0x0b21;
160
+ export const PRODUCT_XBOX_ELITE_S2_V2 = 0x0b22;
161
+
162
+ // =============================================================================
163
+ // PlayStation Product IDs
164
+ // =============================================================================
165
+
166
+ export const PRODUCT_DUALSHOCK4_V1 = 0x05c4;
167
+ export const PRODUCT_DUALSHOCK4_V2 = 0x09cc;
168
+ export const PRODUCT_DUALSHOCK4_ADAPTER = 0x0ba0;
169
+ export const PRODUCT_DUALSENSE = 0x0ce6;
170
+ export const PRODUCT_DUALSENSE_EDGE = 0x0df2;
171
+
172
+ // =============================================================================
173
+ // Nintendo Product IDs
174
+ // =============================================================================
175
+
176
+ export const PRODUCT_SWITCH_PRO = 0x2009;
177
+ export const PRODUCT_SNES_CONTROLLER = 0x2017;
178
+ export const PRODUCT_N64_CONTROLLER = 0x2019;
179
+ export const PRODUCT_GENESIS_CONTROLLER = 0x201e;
180
+
181
+ // =============================================================================
182
+ // 8BitDo Product IDs
183
+ // =============================================================================
184
+
185
+ export const PRODUCT_8BITDO_SN30 = 0x2100;
186
+ export const PRODUCT_8BITDO_SN30_PRO = 0x2101;
187
+ export const PRODUCT_8BITDO_SN30_PRO_PLUS = 0x2109;
188
+ export const PRODUCT_8BITDO_PRO_2 = 0x3010;
189
+ export const PRODUCT_8BITDO_ULTIMATE = 0x3106;
190
+ export const PRODUCT_8BITDO_SF30 = 0x6001;
191
+ export const PRODUCT_8BITDO_SF30_PRO = 0x6100;
192
+
193
+ // =============================================================================
194
+ // Xbox HID Report Constants
195
+ // =============================================================================
196
+
197
+ /** Xbox wired controller report type marker */
198
+ export const XBOX_WIRED_REPORT_TYPE = 0x20;
199
+
200
+ /** Xbox wired controller minimum report length */
201
+ export const XBOX_WIRED_REPORT_LENGTH = 19;
202
+
203
+ /** Xbox Series Bluetooth report type marker */
204
+ export const XBOX_SERIES_BT_REPORT_TYPE = 0x01;
205
+
206
+ /** Xbox Series Bluetooth minimum report length */
207
+ export const XBOX_SERIES_BT_REPORT_LENGTH = 17;
208
+
209
+ // Xbox wired byte offsets
210
+ export const XBOX_WIRED_BUTTONS_BYTE = 4;
211
+ export const XBOX_WIRED_DPAD_BYTE = 5;
212
+ export const XBOX_WIRED_SHOULDERS_BYTE = 6;
213
+ export const XBOX_WIRED_LEFT_STICK_X_OFFSET = 10;
214
+ export const XBOX_WIRED_LEFT_STICK_Y_OFFSET = 12;
215
+ export const XBOX_WIRED_RIGHT_STICK_X_OFFSET = 14;
216
+ export const XBOX_WIRED_RIGHT_STICK_Y_OFFSET = 16;
217
+
218
+ // Xbox wired button masks
219
+ export const XBOX_WIRED_MASK_START = 0x04;
220
+ export const XBOX_WIRED_MASK_SELECT = 0x08;
221
+ export const XBOX_WIRED_MASK_A = 0x10;
222
+ export const XBOX_WIRED_MASK_B = 0x20;
223
+ export const XBOX_WIRED_MASK_X = 0x40;
224
+ export const XBOX_WIRED_MASK_Y = 0x80;
225
+ export const XBOX_WIRED_MASK_GUIDE_1 = 0x01;
226
+ export const XBOX_WIRED_MASK_GUIDE_2 = 0x02;
227
+
228
+ // Xbox Series Bluetooth byte offsets
229
+ export const XBOX_SERIES_BT_LEFT_X_OFFSET = 1;
230
+ export const XBOX_SERIES_BT_LEFT_Y_OFFSET = 3;
231
+ export const XBOX_SERIES_BT_RIGHT_X_OFFSET = 5;
232
+ export const XBOX_SERIES_BT_RIGHT_Y_OFFSET = 7;
233
+ export const XBOX_SERIES_BT_HAT_BYTE = 13;
234
+ export const XBOX_SERIES_BT_FACE_BUTTONS_BYTE = 14;
235
+ export const XBOX_SERIES_BT_MENU_BUTTONS_BYTE = 15;
236
+
237
+ // Xbox Series Bluetooth button masks
238
+ export const XBOX_SERIES_BT_MASK_A = 0x01;
239
+ export const XBOX_SERIES_BT_MASK_B = 0x02;
240
+ export const XBOX_SERIES_BT_MASK_X = 0x08;
241
+ export const XBOX_SERIES_BT_MASK_Y = 0x10;
242
+ export const XBOX_SERIES_BT_MASK_LB = 0x01;
243
+ export const XBOX_SERIES_BT_MASK_RB = 0x02;
244
+ export const XBOX_SERIES_BT_MASK_VIEW = 0x04;
245
+ export const XBOX_SERIES_BT_MASK_MENU = 0x08;
246
+ export const XBOX_SERIES_BT_MASK_XBOX = 0x10;
247
+
248
+ // Xbox Series Bluetooth analog thresholds (16-bit unsigned, center ~32768)
249
+ export const XBOX_SERIES_BT_ANALOG_LOW = 20000;
250
+ export const XBOX_SERIES_BT_ANALOG_HIGH = 45000;
251
+
252
+ // =============================================================================
253
+ // Xbox 360 HID Constants
254
+ // =============================================================================
255
+
256
+ export const XBOX_360_MIN_REPORT_LENGTH = 3;
257
+ export const XBOX_360_BUTTONS_BYTE_1 = 2;
258
+ export const XBOX_360_BUTTONS_BYTE_2 = 3;
259
+
260
+ // Xbox 360 byte 1 masks (D-pad and menu)
261
+ export const XBOX_360_MASK_DPAD_UP = 0x01;
262
+ export const XBOX_360_MASK_DPAD_DOWN = 0x02;
263
+ export const XBOX_360_MASK_DPAD_LEFT = 0x04;
264
+ export const XBOX_360_MASK_DPAD_RIGHT = 0x08;
265
+ export const XBOX_360_MASK_START = 0x10;
266
+ export const XBOX_360_MASK_BACK = 0x20;
267
+
268
+ // Xbox 360 byte 2 masks (face and shoulders)
269
+ export const XBOX_360_MASK_LB = 0x01;
270
+ export const XBOX_360_MASK_RB = 0x02;
271
+ export const XBOX_360_MASK_A = 0x10;
272
+ export const XBOX_360_MASK_B = 0x20;
273
+ export const XBOX_360_MASK_X = 0x40;
274
+ export const XBOX_360_MASK_Y = 0x80;
275
+
276
+ // =============================================================================
277
+ // D-pad Bit Masks (Common across controllers)
278
+ // =============================================================================
279
+
280
+ export const DPAD_MASK_UP = 0x01;
281
+ export const DPAD_MASK_DOWN = 0x02;
282
+ export const DPAD_MASK_LEFT = 0x04;
283
+ export const DPAD_MASK_RIGHT = 0x08;
284
+ export const DPAD_HAT_MASK = 0x0f;
285
+
286
+ // =============================================================================
287
+ // Shoulder Button Masks (Common)
288
+ // =============================================================================
289
+
290
+ export const SHOULDER_MASK_L = 0x01;
291
+ export const SHOULDER_MASK_R = 0x02;
292
+ export const SHOULDER_MASK_L2 = 0x04;
293
+ export const SHOULDER_MASK_R2 = 0x08;
294
+
295
+ // =============================================================================
296
+ // PlayStation HID Report Constants
297
+ // =============================================================================
298
+
299
+ export const PS_REPORT_ID = 0x01;
300
+ export const PS_MIN_REPORT_LENGTH = 8;
301
+ export const PS_ANALOG_CENTER = 128;
302
+ /** Divisor for normalizing 8-bit analog values (center 128) to -1.0 to 1.0 */
303
+ export const PS_ANALOG_RANGE = 127;
304
+
305
+ // DualShock 4 offsets (with report ID offset adjustment)
306
+ export const DS4_LEFT_X_OFFSET = 1;
307
+ export const DS4_LEFT_Y_OFFSET = 2;
308
+ export const DS4_RIGHT_X_OFFSET = 3;
309
+ export const DS4_RIGHT_Y_OFFSET = 4;
310
+ export const DS4_HAT_AND_BUTTONS_OFFSET = 5;
311
+ export const DS4_SHOULDERS_OFFSET = 6;
312
+ export const DS4_PS_BUTTON_OFFSET = 7;
313
+
314
+ // DualShock 4 button masks
315
+ export const DS4_MASK_SQUARE = 0x10;
316
+ export const DS4_MASK_CROSS = 0x20;
317
+ export const DS4_MASK_CIRCLE = 0x40;
318
+ export const DS4_MASK_TRIANGLE = 0x80;
319
+
320
+ // DualSense offsets
321
+ export const DUALSENSE_LEFT_X_OFFSET = 1;
322
+ export const DUALSENSE_LEFT_Y_OFFSET = 2;
323
+ export const DUALSENSE_RIGHT_X_OFFSET = 3;
324
+ export const DUALSENSE_RIGHT_Y_OFFSET = 4;
325
+ export const DUALSENSE_HAT_AND_BUTTONS_OFFSET = 7;
326
+ export const DUALSENSE_SHOULDERS_OFFSET = 8;
327
+ export const DUALSENSE_PS_BUTTON_OFFSET = 9;
328
+ export const DUALSENSE_PS_BUTTON_MASK = 0x01;
329
+ export const DUALSENSE_PS_BUTTON_MIN_LENGTH = 10;
330
+
331
+ // =============================================================================
332
+ // Nintendo Switch Pro Controller Constants
333
+ // =============================================================================
334
+
335
+ export const SWITCH_PRO_MIN_REPORT_LENGTH = 4;
336
+ export const SWITCH_PRO_BUTTONS_BYTE_1 = 1;
337
+ export const SWITCH_PRO_BUTTONS_BYTE_2 = 2;
338
+ export const SWITCH_PRO_BUTTONS_BYTE_3 = 3;
339
+
340
+ // Switch Pro button masks (byte 1)
341
+ export const SWITCH_PRO_MASK_B = 0x01;
342
+ export const SWITCH_PRO_MASK_Y = 0x02;
343
+ export const SWITCH_PRO_MASK_A = 0x04;
344
+ export const SWITCH_PRO_MASK_X = 0x08;
345
+ export const SWITCH_PRO_MASK_L = 0x10;
346
+ export const SWITCH_PRO_MASK_R = 0x20;
347
+ export const SWITCH_PRO_MASK_ZL = 0x40;
348
+ export const SWITCH_PRO_MASK_ZR = 0x80;
349
+
350
+ // Switch Pro button masks (byte 2)
351
+ export const SWITCH_PRO_MASK_MINUS = 0x01;
352
+ export const SWITCH_PRO_MASK_PLUS = 0x02;
353
+ export const SWITCH_PRO_MASK_HOME = 0x10;
354
+
355
+ // =============================================================================
356
+ // 8BitDo Controller Constants
357
+ // =============================================================================
358
+
359
+ export const EIGHTBITDO_MIN_REPORT_LENGTH = 6;
360
+ export const EIGHTBITDO_LEFT_X_OFFSET = 0;
361
+ export const EIGHTBITDO_LEFT_Y_OFFSET = 1;
362
+ export const EIGHTBITDO_BUTTONS_BYTE_1 = 4;
363
+ export const EIGHTBITDO_BUTTONS_BYTE_2 = 5;
364
+
365
+ // 8BitDo button masks (byte 1)
366
+ export const EIGHTBITDO_MASK_DPAD_UP = 0x01;
367
+ export const EIGHTBITDO_MASK_DPAD_DOWN = 0x02;
368
+ export const EIGHTBITDO_MASK_DPAD_LEFT = 0x04;
369
+ export const EIGHTBITDO_MASK_DPAD_RIGHT = 0x08;
370
+ export const EIGHTBITDO_MASK_L = 0x10;
371
+ export const EIGHTBITDO_MASK_R = 0x20;
372
+
373
+ // 8BitDo button masks (byte 2)
374
+ export const EIGHTBITDO_MASK_B = 0x01;
375
+ export const EIGHTBITDO_MASK_A = 0x02;
376
+ export const EIGHTBITDO_MASK_Y = 0x04;
377
+ export const EIGHTBITDO_MASK_X = 0x08;
378
+ export const EIGHTBITDO_MASK_SELECT = 0x10;
379
+ export const EIGHTBITDO_MASK_START = 0x20;
380
+
381
+ // =============================================================================
382
+ // Generic Gamepad Constants
383
+ // =============================================================================
384
+
385
+ export const GENERIC_MIN_REPORT_LENGTH = 2;
386
+ export const GENERIC_FORMAT_A_MIN_LENGTH = 6;
387
+ export const GENERIC_ANALOG_OFFSET_X = 0;
388
+ export const GENERIC_ANALOG_OFFSET_Y = 1;
389
+ export const GENERIC_HAT_BYTE = 4;
390
+ export const GENERIC_BUTTONS_BYTE_1 = 5;
391
+ export const GENERIC_BUTTONS_BYTE_2 = 6;
392
+ export const GENERIC_MAX_HAT_VALUE = 8;
393
+
394
+ // Generic button masks (format 1)
395
+ export const GENERIC_MASK_BUTTON_1 = 0x01;
396
+ export const GENERIC_MASK_BUTTON_2 = 0x02;
397
+ export const GENERIC_MASK_BUTTON_3 = 0x04;
398
+ export const GENERIC_MASK_BUTTON_4 = 0x08;
399
+ export const GENERIC_MASK_BUTTON_L = 0x10;
400
+ export const GENERIC_MASK_BUTTON_R = 0x20;
401
+ export const GENERIC_MASK_BUTTON_SELECT = 0x40;
402
+ export const GENERIC_MASK_BUTTON_START = 0x80;
403
+
404
+ // Generic fallback format masks
405
+ export const GENERIC_FALLBACK_MASK_SELECT = 0x04;
406
+ export const GENERIC_FALLBACK_MASK_START = 0x08;
407
+ export const GENERIC_FALLBACK_MASK_UP = 0x10;
408
+ export const GENERIC_FALLBACK_MASK_DOWN = 0x20;
409
+ export const GENERIC_FALLBACK_MASK_LEFT = 0x40;
410
+ export const GENERIC_FALLBACK_MASK_RIGHT = 0x80;