mirror of
https://github.com/TomHarte/CLK.git
synced 2024-11-26 23:52:26 +00:00
Gamely starts to create a HID input manager for joysticks/pads/etc.
This commit is contained in:
parent
badbbdf155
commit
09950d9414
@ -605,6 +605,7 @@
|
|||||||
4BBF99151C8FBA6F0075DAFB /* CRTOpenGL.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BBF990A1C8FBA6F0075DAFB /* CRTOpenGL.cpp */; };
|
4BBF99151C8FBA6F0075DAFB /* CRTOpenGL.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BBF990A1C8FBA6F0075DAFB /* CRTOpenGL.cpp */; };
|
||||||
4BBF99181C8FBA6F0075DAFB /* TextureTarget.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BBF99121C8FBA6F0075DAFB /* TextureTarget.cpp */; };
|
4BBF99181C8FBA6F0075DAFB /* TextureTarget.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BBF99121C8FBA6F0075DAFB /* TextureTarget.cpp */; };
|
||||||
4BBFBB6C1EE8401E00C01E7A /* ZX8081.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BBFBB6A1EE8401E00C01E7A /* ZX8081.cpp */; };
|
4BBFBB6C1EE8401E00C01E7A /* ZX8081.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BBFBB6A1EE8401E00C01E7A /* ZX8081.cpp */; };
|
||||||
|
4BBFE83D21015D9C00BF1C40 /* CSJoystickManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 4BBFE83C21015D9C00BF1C40 /* CSJoystickManager.m */; };
|
||||||
4BBFFEE61F7B27F1005F3FEB /* TrackSerialiser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BBFFEE51F7B27F1005F3FEB /* TrackSerialiser.cpp */; };
|
4BBFFEE61F7B27F1005F3FEB /* TrackSerialiser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BBFFEE51F7B27F1005F3FEB /* TrackSerialiser.cpp */; };
|
||||||
4BC39568208EE6CF0044766B /* DiskIICard.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BC39566208EE6CF0044766B /* DiskIICard.cpp */; };
|
4BC39568208EE6CF0044766B /* DiskIICard.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BC39566208EE6CF0044766B /* DiskIICard.cpp */; };
|
||||||
4BC39569208EE6CF0044766B /* DiskIICard.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BC39566208EE6CF0044766B /* DiskIICard.cpp */; };
|
4BC39569208EE6CF0044766B /* DiskIICard.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BC39566208EE6CF0044766B /* DiskIICard.cpp */; };
|
||||||
@ -1345,6 +1346,8 @@
|
|||||||
4BBF99191C8FC2750075DAFB /* CRTTypes.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = CRTTypes.hpp; sourceTree = "<group>"; };
|
4BBF99191C8FC2750075DAFB /* CRTTypes.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = CRTTypes.hpp; sourceTree = "<group>"; };
|
||||||
4BBFBB6A1EE8401E00C01E7A /* ZX8081.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ZX8081.cpp; path = Parsers/ZX8081.cpp; sourceTree = "<group>"; };
|
4BBFBB6A1EE8401E00C01E7A /* ZX8081.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ZX8081.cpp; path = Parsers/ZX8081.cpp; sourceTree = "<group>"; };
|
||||||
4BBFBB6B1EE8401E00C01E7A /* ZX8081.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = ZX8081.hpp; path = Parsers/ZX8081.hpp; sourceTree = "<group>"; };
|
4BBFBB6B1EE8401E00C01E7A /* ZX8081.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = ZX8081.hpp; path = Parsers/ZX8081.hpp; sourceTree = "<group>"; };
|
||||||
|
4BBFE83C21015D9C00BF1C40 /* CSJoystickManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSJoystickManager.m; sourceTree = "<group>"; };
|
||||||
|
4BBFE83E21015DAE00BF1C40 /* CSJoystickManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CSJoystickManager.h; sourceTree = "<group>"; };
|
||||||
4BBFFEE51F7B27F1005F3FEB /* TrackSerialiser.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = TrackSerialiser.cpp; sourceTree = "<group>"; };
|
4BBFFEE51F7B27F1005F3FEB /* TrackSerialiser.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = TrackSerialiser.cpp; sourceTree = "<group>"; };
|
||||||
4BC39565208EDFCE0044766B /* Card.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = Card.hpp; sourceTree = "<group>"; };
|
4BC39565208EDFCE0044766B /* Card.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = Card.hpp; sourceTree = "<group>"; };
|
||||||
4BC39566208EE6CF0044766B /* DiskIICard.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = DiskIICard.cpp; sourceTree = "<group>"; };
|
4BC39566208EE6CF0044766B /* DiskIICard.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = DiskIICard.cpp; sourceTree = "<group>"; };
|
||||||
@ -2760,6 +2763,7 @@
|
|||||||
4BB73EA01B587A5100552FC2 /* Clock Signal */ = {
|
4BB73EA01B587A5100552FC2 /* Clock Signal */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
4BBFE83B21015D9C00BF1C40 /* Joystick Manager */,
|
||||||
4BB73ECF1B587A6700552FC2 /* Clock Signal.entitlements */,
|
4BB73ECF1B587A6700552FC2 /* Clock Signal.entitlements */,
|
||||||
4B1414501B58848C00E04248 /* ClockSignal-Bridging-Header.h */,
|
4B1414501B58848C00E04248 /* ClockSignal-Bridging-Header.h */,
|
||||||
4BB73EAD1B587A5100552FC2 /* Info.plist */,
|
4BB73EAD1B587A5100552FC2 /* Info.plist */,
|
||||||
@ -2916,6 +2920,15 @@
|
|||||||
path = Internals;
|
path = Internals;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
|
4BBFE83B21015D9C00BF1C40 /* Joystick Manager */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
4BBFE83C21015D9C00BF1C40 /* CSJoystickManager.m */,
|
||||||
|
4BBFE83E21015DAE00BF1C40 /* CSJoystickManager.h */,
|
||||||
|
);
|
||||||
|
path = "Joystick Manager";
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
4BC3B74C1CD194CC00F86E85 /* Shaders */ = {
|
4BC3B74C1CD194CC00F86E85 /* Shaders */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
@ -3824,6 +3837,7 @@
|
|||||||
4B4518A21F75FD1C00926311 /* G64.cpp in Sources */,
|
4B4518A21F75FD1C00926311 /* G64.cpp in Sources */,
|
||||||
4B89452C201967B4007DE474 /* Tape.cpp in Sources */,
|
4B89452C201967B4007DE474 /* Tape.cpp in Sources */,
|
||||||
4B448E811F1C45A00009ABD6 /* TZX.cpp in Sources */,
|
4B448E811F1C45A00009ABD6 /* TZX.cpp in Sources */,
|
||||||
|
4BBFE83D21015D9C00BF1C40 /* CSJoystickManager.m in Sources */,
|
||||||
4BEBFB512002DB30000708CC /* DiskROM.cpp in Sources */,
|
4BEBFB512002DB30000708CC /* DiskROM.cpp in Sources */,
|
||||||
4B89451C201967B4007DE474 /* Disk.cpp in Sources */,
|
4B89451C201967B4007DE474 /* Disk.cpp in Sources */,
|
||||||
4B302184208A550100773308 /* DiskII.cpp in Sources */,
|
4B302184208A550100773308 /* DiskII.cpp in Sources */,
|
||||||
|
@ -4,6 +4,10 @@
|
|||||||
<dict>
|
<dict>
|
||||||
<key>com.apple.security.app-sandbox</key>
|
<key>com.apple.security.app-sandbox</key>
|
||||||
<true/>
|
<true/>
|
||||||
|
<key>com.apple.security.device.bluetooth</key>
|
||||||
|
<true/>
|
||||||
|
<key>com.apple.security.device.usb</key>
|
||||||
|
<true/>
|
||||||
<key>com.apple.security.files.user-selected.read-write</key>
|
<key>com.apple.security.files.user-selected.read-write</key>
|
||||||
<true/>
|
<true/>
|
||||||
</dict>
|
</dict>
|
||||||
|
@ -0,0 +1,15 @@
|
|||||||
|
//
|
||||||
|
// CSJoystickManager.h
|
||||||
|
// Clock Signal
|
||||||
|
//
|
||||||
|
// Created by Thomas Harte on 19/07/2018.
|
||||||
|
// Copyright © 2018 Thomas Harte. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
|
@interface CSJoystickManager : NSObject
|
||||||
|
|
||||||
|
- (instancetype)init;
|
||||||
|
|
||||||
|
@end
|
@ -0,0 +1,59 @@
|
|||||||
|
//
|
||||||
|
// CSJoystickManager.m
|
||||||
|
// Clock Signal
|
||||||
|
//
|
||||||
|
// Created by Thomas Harte on 19/07/2018.
|
||||||
|
// Copyright © 2018 Thomas Harte. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import "CSJoystickManager.h"
|
||||||
|
|
||||||
|
@import IOKit;
|
||||||
|
#include <IOKit/hid/IOHIDLib.h>
|
||||||
|
|
||||||
|
static void DeviceMatched(void *context, IOReturn result, void *sender, IOHIDDeviceRef device) {
|
||||||
|
NSLog(@"Matched");
|
||||||
|
}
|
||||||
|
|
||||||
|
static void DeviceRemoved(void *context, IOReturn result, void *sender, IOHIDDeviceRef device) {
|
||||||
|
NSLog(@"Removed");
|
||||||
|
}
|
||||||
|
|
||||||
|
@implementation CSJoystickManager {
|
||||||
|
IOHIDManagerRef _hidManager;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (instancetype)init {
|
||||||
|
self = [super init];
|
||||||
|
if(self) {
|
||||||
|
_hidManager = IOHIDManagerCreate(kCFAllocatorDefault, kIOHIDOptionsTypeNone);
|
||||||
|
if(!_hidManager) return nil;
|
||||||
|
|
||||||
|
NSArray<NSDictionary<NSString *, NSNumber *> *> *const multiple = @[
|
||||||
|
@{ @kIOHIDDeviceUsagePageKey: @(kHIDPage_GenericDesktop), @kIOHIDDeviceUsageKey: @(kHIDUsage_GD_Joystick) },
|
||||||
|
@{ @kIOHIDDeviceUsagePageKey: @(kHIDPage_GenericDesktop), @kIOHIDDeviceUsageKey: @(kHIDUsage_GD_GamePad) },
|
||||||
|
@{ @kIOHIDDeviceUsagePageKey: @(kHIDPage_GenericDesktop), @kIOHIDDeviceUsageKey: @(kHIDUsage_GD_MultiAxisController) },
|
||||||
|
];
|
||||||
|
|
||||||
|
IOHIDManagerSetDeviceMatchingMultiple(_hidManager, (__bridge CFArrayRef)multiple);
|
||||||
|
IOHIDManagerRegisterDeviceMatchingCallback(_hidManager, DeviceMatched, (__bridge void *)self);
|
||||||
|
IOHIDManagerRegisterDeviceRemovalCallback(_hidManager, DeviceRemoved, (__bridge void *)self);
|
||||||
|
IOHIDManagerScheduleWithRunLoop(_hidManager, CFRunLoopGetMain(), kCFRunLoopDefaultMode);
|
||||||
|
|
||||||
|
if(IOHIDManagerOpen(_hidManager, kIOHIDOptionsTypeNone) != kIOReturnSuccess) {
|
||||||
|
NSLog(@"Failed to open HID manager");
|
||||||
|
// something
|
||||||
|
return nil;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)dealloc {
|
||||||
|
IOHIDManagerUnscheduleFromRunLoop(_hidManager, CFRunLoopGetMain(), kCFRunLoopDefaultMode);
|
||||||
|
IOHIDManagerClose(_hidManager, kIOHIDOptionsTypeNone);
|
||||||
|
CFRelease(_hidManager);
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
@ -20,6 +20,7 @@
|
|||||||
#include "Typer.hpp"
|
#include "Typer.hpp"
|
||||||
#include "../../../../Activity/Observer.hpp"
|
#include "../../../../Activity/Observer.hpp"
|
||||||
|
|
||||||
|
#import "CSJoystickManager.h"
|
||||||
#import "CSStaticAnalyser+TargetVector.h"
|
#import "CSStaticAnalyser+TargetVector.h"
|
||||||
#import "NSBundle+DataResource.h"
|
#import "NSBundle+DataResource.h"
|
||||||
#import "NSData+StdVector.h"
|
#import "NSData+StdVector.h"
|
||||||
@ -76,6 +77,7 @@ struct ActivityObserver: public Activity::Observer {
|
|||||||
CSStaticAnalyser *_analyser;
|
CSStaticAnalyser *_analyser;
|
||||||
std::unique_ptr<Machine::DynamicMachine> _machine;
|
std::unique_ptr<Machine::DynamicMachine> _machine;
|
||||||
|
|
||||||
|
CSJoystickManager *_joystickManager;
|
||||||
std::bitset<65536> _depressedKeys;
|
std::bitset<65536> _depressedKeys;
|
||||||
NSMutableArray<NSString *> *_leds;
|
NSMutableArray<NSString *> *_leds;
|
||||||
}
|
}
|
||||||
@ -91,6 +93,8 @@ struct ActivityObserver: public Activity::Observer {
|
|||||||
|
|
||||||
_inputMode = _machine->keyboard_machine() ? CSMachineKeyboardInputModeKeyboard : CSMachineKeyboardInputModeJoystick;
|
_inputMode = _machine->keyboard_machine() ? CSMachineKeyboardInputModeKeyboard : CSMachineKeyboardInputModeJoystick;
|
||||||
|
|
||||||
|
_joystickManager = [[CSJoystickManager alloc] init];
|
||||||
|
|
||||||
_leds = [[NSMutableArray alloc] init];
|
_leds = [[NSMutableArray alloc] init];
|
||||||
Activity::Source *const activity_source = _machine->activity_source();
|
Activity::Source *const activity_source = _machine->activity_source();
|
||||||
if(activity_source) {
|
if(activity_source) {
|
||||||
|
Loading…
Reference in New Issue
Block a user