Comment: | OFGameController: Use different subclasses |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | gamecontroller |
Files: | files | file ages | folders |
SHA3-256: |
4ecdef74917586572418ec429865367a |
User & Date: | js on 2024-05-15 22:50:43 |
Other Links: | branch diff | manifest | tags |
2024-05-18
| ||
11:37 | OFGameController: More code reuse check-in: 764fe0bac3 user: js tags: gamecontroller | |
2024-05-15
| ||
22:50 | OFGameController: Use different subclasses check-in: 4ecdef7491 user: js tags: gamecontroller | |
21:34 | OFGameController: Add mapping for DualShock 4 check-in: 13c7749eed user: js tags: gamecontroller | |
Added src/hid/OFEvdevGameController.h version [8ab70e7289].
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | /* * Copyright (c) 2008-2024 Jonathan Schleifer <js@nil.im> * * All rights reserved. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License version 3.0 only, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * version 3.0 for more details. * * You should have received a copy of the GNU Lesser General Public License * version 3.0 along with this program. If not, see * <https://www.gnu.org/licenses/>. */ #import "OFGameController.h" OF_ASSUME_NONNULL_BEGIN @interface OFEvdevGameController: OFGameController { OFString *_path; int _fd; uint16_t _vendorID, _productID; OFString *_name; OFMutableSet *_buttons, *_pressedButtons; bool _hasLeftAnalogStick, _hasRightAnalogStick; bool _hasLeftTriggerPressure, _hasRightTriggerPressure; unsigned int _leftTriggerPressureBit, _rightTriggerPressureBit; OFPoint _leftAnalogStickPosition, _rightAnalogStickPosition; float _leftTriggerPressure, _rightTriggerPressure; int32_t _leftAnalogStickMinX, _leftAnalogStickMaxX; int32_t _leftAnalogStickMinY, _leftAnalogStickMaxY; unsigned int _rightAnalogStickXBit, _rightAnalogStickYBit; int32_t _rightAnalogStickMinX, _rightAnalogStickMaxX; int32_t _rightAnalogStickMinY, _rightAnalogStickMaxY; int32_t _leftTriggerMinPressure, _leftTriggerMaxPressure; int32_t _rightTriggerMinPressure, _rightTriggerMaxPressure; } - (instancetype)of_initWithPath: (OFString *)path OF_METHOD_FAMILY(init); @end OF_ASSUME_NONNULL_END |
Renamed and modified src/hid/platform/Linux/OFGameController.m [9e75f36cc8] to src/hid/OFEvdevGameController.m [7d8e2879a0].
︙ | ︙ | |||
19 20 21 22 23 24 25 | #include "config.h" #include <errno.h> #include <fcntl.h> #include <unistd.h> | | | 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | #include "config.h" #include <errno.h> #include <fcntl.h> #include <unistd.h> #import "OFEvdevGameController.h" #import "OFArray.h" #import "OFFileManager.h" #import "OFLocale.h" #import "OFNumber.h" #import "OFSet.h" #include <sys/ioctl.h> |
︙ | ︙ | |||
68 69 70 71 72 73 74 | /* Sony controllers */ static const uint16_t productIDDualSense = 0x0CE6; static const uint16_t productIDDualShock4 = 0x09CC; /* Google controllers */ static const uint16_t productIDStadia = 0x9400; | < < < < | 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | /* Sony controllers */ static const uint16_t productIDDualSense = 0x0CE6; static const uint16_t productIDDualShock4 = 0x09CC; /* Google controllers */ static const uint16_t productIDStadia = 0x9400; static const uint16_t buttons[] = { BTN_A, BTN_B, BTN_C, BTN_X, BTN_Y, BTN_Z, BTN_TL, BTN_TR, BTN_TL2, BTN_TR2, BTN_SELECT, BTN_START, BTN_MODE, BTN_THUMBL, BTN_THUMBR, BTN_DPAD_UP, BTN_DPAD_DOWN, BTN_DPAD_LEFT, BTN_DPAD_RIGHT, BTN_TRIGGER_HAPPY1, BTN_TRIGGER_HAPPY2 }; |
︙ | ︙ | |||
199 200 201 202 203 204 205 | value = min; if (value > max) value = max; return ((value - min) / (max - min) * 2) - 1; } | | | 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 | value = min; if (value > max) value = max; return ((value - min) / (max - min) * 2) - 1; } @implementation OFEvdevGameController @synthesize name = _name, buttons = _buttons; @synthesize hasLeftAnalogStick = _hasLeftAnalogStick; @synthesize hasRightAnalogStick = _hasRightAnalogStick; @synthesize leftAnalogStickPosition = _leftAnalogStickPosition; @synthesize rightAnalogStickPosition = _rightAnalogStickPosition; + (OFArray OF_GENERIC(OFGameController *) *)controllers |
︙ | ︙ | |||
222 223 224 225 226 227 228 | if (![device hasPrefix: @"event"]) continue; path = [@"/dev/input" stringByAppendingPathComponent: device]; @try { | | | 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 | if (![device hasPrefix: @"event"]) continue; path = [@"/dev/input" stringByAppendingPathComponent: device]; @try { controller = [[[OFEvdevGameController alloc] of_initWithPath: path] autorelease]; } @catch (OFOpenItemFailedException *e) { if (e.errNo == EACCES) continue; @throw e; } @catch (OFInvalidArgumentException *e) { |
︙ | ︙ | |||
567 568 569 570 571 572 573 | OFGameControllerRightTriggerButton]; } break; } } } | | | | 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 | OFGameControllerRightTriggerButton]; } break; } } } - (OFComparisonResult)compare: (OFEvdevGameController *)otherController { unsigned long long selfIndex, otherIndex; if (![otherController isKindOfClass: [OFEvdevGameController class]]) @throw [OFInvalidArgumentException exception]; selfIndex = [_path substringFromIndex: 16].unsignedLongLongValue; otherIndex = [otherController->_path substringFromIndex: 16] .unsignedLongLongValue; if (selfIndex > otherIndex) |
︙ | ︙ |
Modified src/hid/OFGameController.h from [e199114848] to [76e31b3ce8].
︙ | ︙ | |||
255 256 257 258 259 260 261 | #ifdef __cplusplus } #endif /** * @brief A class for reading state from a game controller. */ | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 | #ifdef __cplusplus } #endif /** * @brief A class for reading state from a game controller. */ @interface OFGameController: OFObject #ifdef OF_HAVE_CLASS_PROPERTIES @property (class, readonly, nonatomic) OFArray <OFGameController *> *controllers; #endif /** * @brief The name of the controller. |
︙ | ︙ | |||
353 354 355 356 357 358 359 | /** * @brief Returns the available controllers. * * @return The available controllers */ + (OFArray OF_GENERIC(OFGameController *) *)controllers; | < < | 319 320 321 322 323 324 325 326 327 328 329 330 331 332 | /** * @brief Returns the available controllers. * * @return The available controllers */ + (OFArray OF_GENERIC(OFGameController *) *)controllers; /** * @brief Retrieve the current state from the game controller. * * The state returned by @ref OFGameController's messages does not change until * this method is called. * * @throw OFReadFailedException The controller's state could not be read |
︙ | ︙ |
Modified src/hid/OFGameController.m from [680cfba800] to [c04fc09244].
︙ | ︙ | |||
17 18 19 20 21 22 23 24 25 26 27 28 29 30 | * <https://www.gnu.org/licenses/>. */ #include "config.h" #import "OFGameController.h" #import "OFArray.h" const OFGameControllerButton OFGameControllerNorthButton = @"North"; const OFGameControllerButton OFGameControllerSouthButton = @"South"; const OFGameControllerButton OFGameControllerWestButton = @"West"; const OFGameControllerButton OFGameControllerEastButton = @"East"; const OFGameControllerButton OFGameControllerLeftTriggerButton = @"Left Trigger"; | > > > > > > > > > > > > > | 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | * <https://www.gnu.org/licenses/>. */ #include "config.h" #import "OFGameController.h" #import "OFArray.h" #if defined(OF_LINUX) && defined(OF_HAVE_FILES) # include "OFEvdevGameController.h" #endif #ifdef OF_WINDOWS # include "OFXInputGameController.h" #endif #ifdef OF_NINTENDO_DS # include "OFNintendoDSGameController.h" #endif #ifdef OF_NINTENDO_3DS # include "OFNintendo3DSGameController.h" #endif const OFGameControllerButton OFGameControllerNorthButton = @"North"; const OFGameControllerButton OFGameControllerSouthButton = @"South"; const OFGameControllerButton OFGameControllerWestButton = @"West"; const OFGameControllerButton OFGameControllerEastButton = @"East"; const OFGameControllerButton OFGameControllerLeftTriggerButton = @"Left Trigger"; |
︙ | ︙ | |||
57 58 59 60 61 62 63 | const OFGameControllerButton OFGameControllerPlusButton = @"+"; const OFGameControllerButton OFGameControllerMinusButton = @"-"; const OFGameControllerButton OFGameControllerSLButton = @"SL"; const OFGameControllerButton OFGameControllerSRButton = @"SR"; const OFGameControllerButton OFGameControllerModeButton = @"Mode"; const OFGameControllerButton OFGameControllerAssistantButton = @"Assistant"; | < < < < < < < < < > > > > > > > > > > > > > > > > > | > > > > > < > > > > > > > > > > > > > | 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 | const OFGameControllerButton OFGameControllerPlusButton = @"+"; const OFGameControllerButton OFGameControllerMinusButton = @"-"; const OFGameControllerButton OFGameControllerSLButton = @"SL"; const OFGameControllerButton OFGameControllerSRButton = @"SR"; const OFGameControllerButton OFGameControllerModeButton = @"Mode"; const OFGameControllerButton OFGameControllerAssistantButton = @"Assistant"; @implementation OFGameController @dynamic name, buttons, pressedButtons, hasLeftAnalogStick; @dynamic leftAnalogStickPosition, hasRightAnalogStick, rightAnalogStickPosition; + (OFArray OF_GENERIC(OFGameController *) *)controllers { #if defined(OF_LINUX) && defined(OF_HAVE_FILES) return [OFEvdevGameController controllers]; #elif defined(OF_WINDOWS) return [OFXInputGameController controllers]; #elif defined(OF_NINTENDO_DS) return [OFNintendoDSGameController controllers]; #elif defined(OF_NINTENDO_3DS) return [OFNintendo3DSGameController controllers]; #else return [OFArray array]; #endif } - (instancetype)init { if ([self isMemberOfClass: [OFGameController class]]) { @try { [self doesNotRecognizeSelector: _cmd]; } @catch (id e) { [self release]; @throw e; } abort(); } return [super init]; } - (OFNumber *)vendorID { return nil; } - (OFNumber *)productID { return nil; } - (void)retrieveState { OF_UNRECOGNIZED_SELECTOR } - (float)pressureForButton: (OFGameControllerButton)button { OF_UNRECOGNIZED_SELECTOR } @end #if defined(OF_LINUX) && defined(OF_HAVE_FILES) # include "OFEvdevGameController.m" #endif #ifdef OF_WINDOWS # include "OFXInputGameController.m" #endif #ifdef OF_NINTENDO_DS # include "OFNintendoDSGameController.m" #endif #ifdef OF_NINTENDO_3DS # include "OFNintendo3DSGameController.m" #endif |
Added src/hid/OFNintendo3DSGameController.h version [54f724ec89].
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | /* * Copyright (c) 2008-2024 Jonathan Schleifer <js@nil.im> * * All rights reserved. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License version 3.0 only, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * version 3.0 for more details. * * You should have received a copy of the GNU Lesser General Public License * version 3.0 along with this program. If not, see * <https://www.gnu.org/licenses/>. */ #import "OFGameController.h" OF_ASSUME_NONNULL_BEGIN @interface OFNintendo3DSGameController: OFGameController { OFMutableSet *_pressedButtons; OFPoint _leftAnalogStickPosition; } @end OF_ASSUME_NONNULL_END |
Renamed and modified src/hid/platform/Nintendo3DS/OFGameController.m [f3681e2d31] to src/hid/OFNintendo3DSGameController.m [a67f0beecf].
︙ | ︙ | |||
15 16 17 18 19 20 21 | * You should have received a copy of the GNU Lesser General Public License * version 3.0 along with this program. If not, see * <https://www.gnu.org/licenses/>. */ #include "config.h" | | < < < < | | < < < < < < | 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | * You should have received a copy of the GNU Lesser General Public License * version 3.0 along with this program. If not, see * <https://www.gnu.org/licenses/>. */ #include "config.h" #import "OFNintendo3DSGameController.h" #import "OFArray.h" #import "OFSet.h" #import "OFOutOfRangeException.h" #define id id_3ds #include <3ds.h> #undef id static OFArray OF_GENERIC(OFGameController *) *controllers; static void initControllers(void) { void *pool = objc_autoreleasePoolPush(); controllers = [[OFArray alloc] initWithObject: [[[OFNintendo3DSGameController alloc] init] autorelease]]; objc_autoreleasePoolPop(pool); } @implementation OFNintendo3DSGameController @synthesize leftAnalogStickPosition = _leftAnalogStickPosition; + (OFArray OF_GENERIC(OFGameController *) *)controllers { static OFOnceControl onceControl = OFOnceControlInitValue; OFOnce(&onceControl, initControllers); return [[controllers retain] autorelease]; } - (instancetype)init { self = [super init]; @try { _pressedButtons = [[OFMutableSet alloc] initWithCapacity: 18]; [self retrieveState]; } @catch (id e) { |
︙ | ︙ | |||
143 144 145 146 147 148 149 | } - (OFString *)name { return @"Nintendo 3DS"; } | < < < < < < < < < < | 133 134 135 136 137 138 139 140 141 142 143 144 145 146 | } - (OFString *)name { return @"Nintendo 3DS"; } - (OFSet OF_GENERIC(OFGameControllerButton) *)buttons { return [OFSet setWithObjects: OFGameControllerNorthButton, OFGameControllerSouthButton, OFGameControllerWestButton, OFGameControllerEastButton, |
︙ | ︙ |
Added src/hid/OFNintendoDSGameController.h version [b8a00a7023].
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | /* * Copyright (c) 2008-2024 Jonathan Schleifer <js@nil.im> * * All rights reserved. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License version 3.0 only, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * version 3.0 for more details. * * You should have received a copy of the GNU Lesser General Public License * version 3.0 along with this program. If not, see * <https://www.gnu.org/licenses/>. */ #import "OFGameController.h" OF_ASSUME_NONNULL_BEGIN @interface OFNintendoDSGameController: OFGameController { OFMutableSet *_pressedButtons; } @end OF_ASSUME_NONNULL_END |
Renamed and modified src/hid/platform/NintendoDS/OFGameController.m [4b910e9db0] to src/hid/OFNintendoDSGameController.m [9294d80bc8].
︙ | ︙ | |||
15 16 17 18 19 20 21 | * You should have received a copy of the GNU Lesser General Public License * version 3.0 along with this program. If not, see * <https://www.gnu.org/licenses/>. */ #include "config.h" | | < < < < | | < < < < < < < | 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | * You should have received a copy of the GNU Lesser General Public License * version 3.0 along with this program. If not, see * <https://www.gnu.org/licenses/>. */ #include "config.h" #import "OFNintendoDSGameController.h" #import "OFArray.h" #import "OFSet.h" #import "OFOutOfRangeException.h" #define asm __asm__ #include <nds.h> #undef asm static OFArray OF_GENERIC(OFGameController *) *controllers; static void initControllers(void) { void *pool = objc_autoreleasePoolPush(); controllers = [[OFArray alloc] initWithObject: [[[OFNintendoDSGameController alloc] init] autorelease]]; objc_autoreleasePoolPop(pool); } @implementation OFNintendoDSGameController + (OFArray OF_GENERIC(OFGameController *) *)controllers { static OFOnceControl onceControl = OFOnceControlInitValue; OFOnce(&onceControl, initControllers); return [[controllers retain] autorelease]; } - (instancetype)init { self = [super init]; @try { _pressedButtons = [[OFMutableSet alloc] initWithCapacity: 12]; [self retrieveState]; } @catch (id e) { |
︙ | ︙ | |||
123 124 125 126 127 128 129 | } - (OFString *)name { return @"Nintendo DS"; } | < < < < < < < < < < | 112 113 114 115 116 117 118 119 120 121 122 123 124 125 | } - (OFString *)name { return @"Nintendo DS"; } - (OFSet OF_GENERIC(OFGameControllerButton) *)buttons { return [OFSet setWithObjects: OFGameControllerNorthButton, OFGameControllerSouthButton, OFGameControllerWestButton, OFGameControllerEastButton, |
︙ | ︙ |
Added src/hid/OFXInputGameController.h version [523c04abd7].
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | /* * Copyright (c) 2008-2024 Jonathan Schleifer <js@nil.im> * * All rights reserved. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License version 3.0 only, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * version 3.0 for more details. * * You should have received a copy of the GNU Lesser General Public License * version 3.0 along with this program. If not, see * <https://www.gnu.org/licenses/>. */ #import "OFGameController.h" OF_ASSUME_NONNULL_BEGIN @interface OFXInputGameController: OFGameController { DWORD _index; OFNumber *_Nullable _vendorID, *_Nullable productID; OFMutableSet *_pressedButtons; OFPoint _leftAnalogStickPosition, _rightAnalogStickPosition; float _leftTriggerPressure, _rightTriggerPressure; } - (instancetype)of_initWithIndex: (DWORD)index OF_METHOD_FAMILY(init); @end OF_ASSUME_NONNULL_END |
Renamed and modified src/hid/platform/Windows/OFGameController.m [b049972691] to src/hid/OFXInputGameController.m [ba31cb5921].
︙ | ︙ | |||
15 16 17 18 19 20 21 | * You should have received a copy of the GNU Lesser General Public License * version 3.0 along with this program. If not, see * <https://www.gnu.org/licenses/>. */ #include "config.h" | | < < < < | | | 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | * You should have received a copy of the GNU Lesser General Public License * version 3.0 along with this program. If not, see * <https://www.gnu.org/licenses/>. */ #include "config.h" #import "OFXInputGameController.h" #import "OFArray.h" #import "OFNumber.h" #import "OFSet.h" #import "OFInitializationFailedException.h" #import "OFReadFailedException.h" #include <xinput.h> struct XInputCapabilitiesEx { XINPUT_CAPABILITIES capabilities; WORD vendorID; WORD productID; WORD versionNumber; WORD unknown1; DWORD unknown2; }; static WINAPI DWORD (*XInputGetStateFuncPtr)(DWORD, XINPUT_STATE *); static WINAPI DWORD (*XInputGetCapabilitiesExFuncPtr)(DWORD, DWORD, DWORD, struct XInputCapabilitiesEx *); static const char *XInputVersion; @implementation OFXInputGameController @synthesize vendorID = _vendorID, productID = _productID; @synthesize leftAnalogStickPosition = _leftAnalogStickPosition; @synthesize rightAnalogStickPosition = _rightAnalogStickPosition; + (void)initialize { HMODULE module; if (self != [OFXInputGameController class]) return; if ((module = LoadLibraryA("xinput1_4.dll")) != NULL) { XInputGetStateFuncPtr = (WINAPI DWORD (*)(DWORD, XINPUT_STATE *)) GetProcAddress(module, "XInputGetState"); XInputGetCapabilitiesExFuncPtr = (WINAPI DWORD (*)(DWORD, DWORD, |
︙ | ︙ | |||
87 88 89 90 91 92 93 | if (XInputGetStateFuncPtr != NULL) { void *pool = objc_autoreleasePoolPush(); for (DWORD i = 0; i < XUSER_MAX_COUNT; i++) { OFGameController *controller; @try { | | | 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 | if (XInputGetStateFuncPtr != NULL) { void *pool = objc_autoreleasePoolPush(); for (DWORD i = 0; i < XUSER_MAX_COUNT; i++) { OFGameController *controller; @try { controller = [[[OFXInputGameController alloc] of_initWithIndex: i] autorelease]; } @catch (OFInitializationFailedException *e) { /* Controller does not exist. */ continue; } [controllers addObject: controller]; |
︙ | ︙ |