Map joysticks to motion controls
This commit is contained in:
parent
c6f39bc60b
commit
06ce30d3a8
@ -459,6 +459,12 @@ static const uint8_t workboy_vk_to_key[] = {
|
|||||||
[lastController setRumbleAmplitude:amp];
|
[lastController setRumbleAmplitude:amp];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (bool)shouldControllerUseJoystickForMotion:(JOYController *)controller
|
||||||
|
{
|
||||||
|
if (!GB_has_accelerometer(_gb)) return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
- (void)controller:(JOYController *)controller movedAxis:(JOYAxis *)axis
|
- (void)controller:(JOYController *)controller movedAxis:(JOYAxis *)axis
|
||||||
{
|
{
|
||||||
if (![self.window isMainWindow]) return;
|
if (![self.window isMainWindow]) return;
|
||||||
@ -481,9 +487,17 @@ static const uint8_t workboy_vk_to_key[] = {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void)controller:(JOYController *)controller movedAxes2D:(JOYAxes2D *)axes
|
||||||
|
{
|
||||||
|
if ([self shouldControllerUseJoystickForMotion:controller]) {
|
||||||
|
GB_set_accelerometer_values(_gb, -axes.value.x, -axes.value.y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
- (void)controller:(JOYController *)controller buttonChangedState:(JOYButton *)button
|
- (void)controller:(JOYController *)controller buttonChangedState:(JOYButton *)button
|
||||||
{
|
{
|
||||||
if (![self.window isMainWindow]) return;
|
if (![self.window isMainWindow]) return;
|
||||||
|
if (button.type == JOYButtonTypeAxes2DEmulated && [self shouldControllerUseJoystickForMotion:controller]) return;
|
||||||
|
|
||||||
unsigned player_count = GB_get_player_count(_gb);
|
unsigned player_count = GB_get_player_count(_gb);
|
||||||
if (self.document.partner) {
|
if (self.document.partner) {
|
||||||
|
@ -1,7 +1,5 @@
|
|||||||
#import <Foundation/Foundation.h>
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
JOYButtonUsageNone,
|
JOYButtonUsageNone,
|
||||||
JOYButtonUsageA,
|
JOYButtonUsageA,
|
||||||
@ -41,12 +39,20 @@ typedef enum {
|
|||||||
JOYButtonUsageGeneric0 = 0x10000,
|
JOYButtonUsageGeneric0 = 0x10000,
|
||||||
} JOYButtonUsage;
|
} JOYButtonUsage;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
JOYButtonTypeNormal,
|
||||||
|
JOYButtonTypeAxisEmulated,
|
||||||
|
JOYButtonTypeAxes2DEmulated,
|
||||||
|
JOYButtonTypeHatEmulated,
|
||||||
|
} JOYButtonType;
|
||||||
|
|
||||||
@interface JOYButton : NSObject
|
@interface JOYButton : NSObject
|
||||||
- (NSString *)usageString;
|
- (NSString *)usageString;
|
||||||
+ (NSString *)usageToString: (JOYButtonUsage) usage;
|
+ (NSString *)usageToString: (JOYButtonUsage) usage;
|
||||||
- (uint64_t)uniqueID;
|
- (uint64_t)uniqueID;
|
||||||
- (bool) isPressed;
|
- (bool) isPressed;
|
||||||
@property JOYButtonUsage usage;
|
@property JOYButtonUsage usage;
|
||||||
|
@property (readonly) JOYButtonType type;
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
|
||||||
|
@ -105,4 +105,9 @@
|
|||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (JOYButtonType)type
|
||||||
|
{
|
||||||
|
return JOYButtonTypeNormal;
|
||||||
|
}
|
||||||
@end
|
@end
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
#import "JOYElement.h"
|
#import "JOYElement.h"
|
||||||
#import "JOYSubElement.h"
|
#import "JOYSubElement.h"
|
||||||
#import "JOYFullReportElement.h"
|
#import "JOYFullReportElement.h"
|
||||||
|
#import "JOYButton.h"
|
||||||
#import "JOYEmulatedButton.h"
|
#import "JOYEmulatedButton.h"
|
||||||
#include <IOKit/hid/IOHIDLib.h>
|
#include <IOKit/hid/IOHIDLib.h>
|
||||||
|
|
||||||
@ -307,10 +307,10 @@ typedef union {
|
|||||||
|
|
||||||
if (axes2DEmulateButtons) {
|
if (axes2DEmulateButtons) {
|
||||||
_axes2DEmulatedButtons[@(axes.uniqueID)] = @[
|
_axes2DEmulatedButtons[@(axes.uniqueID)] = @[
|
||||||
[[JOYEmulatedButton alloc] initWithUsage:JOYButtonUsageDPadLeft uniqueID:axes.uniqueID | 0x100000000L],
|
[[JOYEmulatedButton alloc] initWithUsage:JOYButtonUsageDPadLeft type:JOYButtonTypeAxes2DEmulated uniqueID:axes.uniqueID | 0x100000000L],
|
||||||
[[JOYEmulatedButton alloc] initWithUsage:JOYButtonUsageDPadRight uniqueID:axes.uniqueID | 0x200000000L],
|
[[JOYEmulatedButton alloc] initWithUsage:JOYButtonUsageDPadRight type:JOYButtonTypeAxes2DEmulated uniqueID:axes.uniqueID | 0x200000000L],
|
||||||
[[JOYEmulatedButton alloc] initWithUsage:JOYButtonUsageDPadUp uniqueID:axes.uniqueID | 0x300000000L],
|
[[JOYEmulatedButton alloc] initWithUsage:JOYButtonUsageDPadUp type:JOYButtonTypeAxes2DEmulated uniqueID:axes.uniqueID | 0x300000000L],
|
||||||
[[JOYEmulatedButton alloc] initWithUsage:JOYButtonUsageDPadDown uniqueID:axes.uniqueID | 0x400000000L],
|
[[JOYEmulatedButton alloc] initWithUsage:JOYButtonUsageDPadDown type:JOYButtonTypeAxes2DEmulated uniqueID:axes.uniqueID | 0x400000000L],
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -346,7 +346,7 @@ typedef union {
|
|||||||
|
|
||||||
if ([_hacks[JOYEmulateAxisButtons] boolValue]) {
|
if ([_hacks[JOYEmulateAxisButtons] boolValue]) {
|
||||||
_axisEmulatedButtons[@(axis.uniqueID)] =
|
_axisEmulatedButtons[@(axis.uniqueID)] =
|
||||||
[[JOYEmulatedButton alloc] initWithUsage:axis.equivalentButtonUsage uniqueID:axis.uniqueID];
|
[[JOYEmulatedButton alloc] initWithUsage:axis.equivalentButtonUsage type:JOYButtonTypeAxisEmulated uniqueID:axis.uniqueID];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -366,10 +366,10 @@ typedef union {
|
|||||||
[_hats setObject:hat forKey:element];
|
[_hats setObject:hat forKey:element];
|
||||||
if (hatsEmulateButtons) {
|
if (hatsEmulateButtons) {
|
||||||
_hatEmulatedButtons[@(hat.uniqueID)] = @[
|
_hatEmulatedButtons[@(hat.uniqueID)] = @[
|
||||||
[[JOYEmulatedButton alloc] initWithUsage:JOYButtonUsageDPadLeft uniqueID:hat.uniqueID | 0x100000000L],
|
[[JOYEmulatedButton alloc] initWithUsage:JOYButtonUsageDPadLeft type:JOYButtonTypeHatEmulated uniqueID:hat.uniqueID | 0x100000000L],
|
||||||
[[JOYEmulatedButton alloc] initWithUsage:JOYButtonUsageDPadRight uniqueID:hat.uniqueID | 0x200000000L],
|
[[JOYEmulatedButton alloc] initWithUsage:JOYButtonUsageDPadRight type:JOYButtonTypeHatEmulated uniqueID:hat.uniqueID | 0x200000000L],
|
||||||
[[JOYEmulatedButton alloc] initWithUsage:JOYButtonUsageDPadUp uniqueID:hat.uniqueID | 0x300000000L],
|
[[JOYEmulatedButton alloc] initWithUsage:JOYButtonUsageDPadUp type:JOYButtonTypeHatEmulated uniqueID:hat.uniqueID | 0x300000000L],
|
||||||
[[JOYEmulatedButton alloc] initWithUsage:JOYButtonUsageDPadDown uniqueID:hat.uniqueID | 0x400000000L],
|
[[JOYEmulatedButton alloc] initWithUsage:JOYButtonUsageDPadDown type:JOYButtonTypeHatEmulated uniqueID:hat.uniqueID | 0x400000000L],
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
#import "JOYHat.h"
|
#import "JOYHat.h"
|
||||||
|
|
||||||
@interface JOYEmulatedButton : JOYButton
|
@interface JOYEmulatedButton : JOYButton
|
||||||
- (instancetype)initWithUsage:(JOYButtonUsage)usage uniqueID:(uint64_t)uniqueID;
|
- (instancetype)initWithUsage:(JOYButtonUsage)usage type:(JOYButtonType)type uniqueID:(uint64_t)uniqueID;
|
||||||
- (bool)updateStateFromAxis:(JOYAxis *)axis;
|
- (bool)updateStateFromAxis:(JOYAxis *)axis;
|
||||||
- (bool)updateStateFromAxes2D:(JOYAxes2D *)axes;
|
- (bool)updateStateFromAxes2D:(JOYAxes2D *)axes;
|
||||||
- (bool)updateStateFromHat:(JOYHat *)hat;
|
- (bool)updateStateFromHat:(JOYHat *)hat;
|
||||||
|
@ -10,13 +10,15 @@
|
|||||||
@implementation JOYEmulatedButton
|
@implementation JOYEmulatedButton
|
||||||
{
|
{
|
||||||
uint64_t _uniqueID;
|
uint64_t _uniqueID;
|
||||||
|
JOYButtonType _type;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (instancetype)initWithUsage:(JOYButtonUsage)usage uniqueID:(uint64_t)uniqueID;
|
- (instancetype)initWithUsage:(JOYButtonUsage)usage type:(JOYButtonType)type uniqueID:(uint64_t)uniqueID;
|
||||||
{
|
{
|
||||||
self = [super init];
|
self = [super init];
|
||||||
self.usage = usage;
|
self.usage = usage;
|
||||||
_uniqueID = uniqueID;
|
_uniqueID = uniqueID;
|
||||||
|
_type = type;
|
||||||
|
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
@ -89,4 +91,9 @@
|
|||||||
return _state != old;
|
return _state != old;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (JOYButtonType)type
|
||||||
|
{
|
||||||
|
return _type;
|
||||||
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
Loading…
Reference in New Issue
Block a user