Skip to content

Commit

Permalink
Collection of fixes for long standing bugs (#688)
Browse files Browse the repository at this point in the history
* Resolve Xbox One Guide button stick
Applies to 2016 Xbox One Controllers
Applies to Xbox One S Controllers

* Remove trailing spaces from .gitignore

* Add xcconfig

* Clean up some build settings

* Update project to use xcconfig for debug builds

* Fix issues with wired controller force feedback

* Add note about Unity mappings

* Remove trailing whitespace from README

* Re-add Chatpad Code

* Update instructions for debugging PrefPane

* Resolve settings issues
Settings no longer stored in /Library/Preferences
Now stored in ~/Library/Preferences/ByHost

Settings should now be stored per-user, and should no longer have issues
with failure to be retained.

* Fix rumble options
Rumble options now correctly show up for Xbox One controller

* Remove buggy naming scheme

* Add some Xbox One LED packet information

* Modify Xbox One init packets

* Fix typo in Xbox One LED spec

* Text changes for 0.16.8

* Fix source of retain
  • Loading branch information
FranticRain committed Jun 1, 2018
1 parent c3f594a commit 848187f
Show file tree
Hide file tree
Showing 15 changed files with 419 additions and 145 deletions.
7 changes: 5 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@
#
#########################

# Xcode configuration files used for storing developer information
*.xcconfig

#####
# OS X temporary files that should never be committed
#
Expand All @@ -31,7 +34,7 @@
*.swp

# *.lock - this is used and abused by many editors for many different things.
# For the main ones I use (e.g. Eclipse), it should be excluded
# For the main ones I use (e.g. Eclipse), it should be excluded
# from source-control, but YMMV

*.lock
Expand All @@ -43,7 +46,7 @@

####
# Xcode temporary files that should never be committed
#
#
# NB: NIB/XIB files still exist even on Storyboard projects, so we want this...

*~.nib
Expand Down
174 changes: 154 additions & 20 deletions 360 Driver.xcodeproj/project.pbxproj

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IDEDidComputeMac32BitWarning</key>
<true/>
</dict>
</plist>
48 changes: 48 additions & 0 deletions 360Controller/Controller.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -516,6 +516,12 @@ typedef struct {
UInt8 dummy;
} PACKED XBOXONE_IN_GUIDE_REPORT;

typedef struct {
XBOXONE_HEADER header;
UInt8 data[4];
UInt8 zero[5];
} PACKED XBOXONE_OUT_GUIDE_REPORT;

typedef struct {
XBOXONE_HEADER header;
UInt8 mode; // So far always 0x00
Expand All @@ -527,6 +533,13 @@ typedef struct {
UInt8 extra;
} PACKED XBOXONE_OUT_RUMBLE;

typedef struct {
XBOXONE_HEADER header; // 0x0a 0x20 0x04 0x03
UInt8 zero;
UInt8 command;
UInt8 brightness; // 0x00 - 0x20
} PACKED XBOXONE_OUT_LED;

typedef enum {
XONE_SYNC = 0x0001, // Bit 00
XONE_MENU = 0x0004, // Bit 02
Expand All @@ -553,6 +566,25 @@ typedef enum {
XONE_PADDLE_PRESET_NUM = 0x0010, // Bit 04
} GAMEPAD_XONE_ELITE_PADDLE;

typedef enum {
XONE_LED_OFF_1 = 0x00,
XONE_LED_SOLID = 0x01,
XONE_LED_BLINK_FAST = 0x02,
XONE_LED_BLINK_SLOW = 0x03,
XONE_LED_BLINK_VERY_SLOW = 0x04,
XONE_LED_SOLD_1 = 0x05,
XONE_LED_SOLD_2 = 0x06,
XONE_LED_SOLD_3 = 0x07,
XONE_LED_PHASE_SLOW = 0x08,
XONE_LED_PHASE_FAST = 0x09,
XONE_LED_REBOOT_1 = 0x0a,
XONE_LED_OFF = 0x0b,
XONE_LED_FLICKER = 0x0c,
XONE_LED_SOLID_4 = 0x0d,
XONE_LED_SOLID_5 = 0x0e,
XONE_LED_REBOOT_2 = 0x0f,
} LED_XONE;

OSDefineMetaClassAndStructors(XboxOneControllerClass, Xbox360ControllerClass)

OSString* XboxOneControllerClass::newProductString() const
Expand Down Expand Up @@ -637,6 +669,22 @@ IOReturn XboxOneControllerClass::handleReport(IOMemoryDescriptor * descriptor, I
if ((report->header.command==0x07) && (report->header.size==(sizeof(XBOXONE_IN_GUIDE_REPORT)-4)))
{
XBOXONE_IN_GUIDE_REPORT *guideReport=(XBOXONE_IN_GUIDE_REPORT*)report;

if (guideReport->header.reserved1 == 0x30) // 2016 Controller
{
XBOXONE_OUT_GUIDE_REPORT outReport = {};
outReport.header.command = 0x01;
outReport.header.reserved1 = 0x20;
outReport.header.counter = guideReport->header.counter;
outReport.header.size = 0x09;
outReport.data[0] = 0x00;
outReport.data[1] = 0x07;
outReport.data[2] = 0x20;
outReport.data[3] = 0x02;

GetOwner(this)->QueueWrite(&outReport, 13);
}

isXboxOneGuideButtonPressed = (bool)guideReport->state;
XBOX360_IN_REPORT *oldReport = (XBOX360_IN_REPORT*)lastData;
oldReport->buttons ^= (-isXboxOneGuideButtonPressed ^ oldReport->buttons) & (1 << GetOwner(this)->mapping[10]);
Expand Down
15 changes: 13 additions & 2 deletions 360Controller/_60Controller.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -524,13 +524,16 @@ bool Xbox360Peripheral::start(IOService *provider)
if (!QueueRead())
goto fail;
if (controllerType == XboxOne || controllerType == XboxOnePretend360) {
UInt8 xoneInit0[] = { 0x01, 0x20, 0x01, 0x09, 0x00, 0x04, 0x20, 0x3a, 0x00, 0x00, 0x00, 0x80, 0x00 };
UInt8 xoneInit1[] = { 0x05, 0x20, 0x03, 0x01, 0x00 };
UInt8 xoneInit0[] = { 0x01, 0x20, 0x00, 0x09, 0x00, 0x04, 0x20, 0x3a, 0x00, 0x00, 0x00, 0x80, 0x00 };
UInt8 xoneInit1[] = { 0x05, 0x20, 0x00, 0x01, 0x00 };
UInt8 xoneInit2[] = { 0x09, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x00, 0x00,
0x1D, 0x1D, 0xFF, 0x00, 0x00 };
UInt8 xoneInit3[] = { 0x09, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00 };
QueueWrite(&xoneInit0, sizeof(xoneInit0));
QueueWrite(&xoneInit1, sizeof(xoneInit1));
QueueWrite(&xoneInit2, sizeof(xoneInit2));
QueueWrite(&xoneInit3, sizeof(xoneInit3));
} else {
// Disable LED
Xbox360_Prepare(led,outLed);
Expand Down Expand Up @@ -612,9 +615,17 @@ bool Xbox360Peripheral::QueueWrite(const void *bytes,UInt32 length)
}
}

bool Xbox360Peripheral::willTerminate(IOService *provider, IOOptionBits options)
{
ReleaseAll();

return super::willTerminate(provider, options);
}

void Xbox360Peripheral::stop(IOService *provider)
{
ReleaseAll();

super::stop(provider);
}

Expand Down
1 change: 1 addition & 0 deletions 360Controller/_60Controller.h
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,7 @@ class Xbox360Peripheral : public IOService
virtual void free(void);

bool start(IOService *provider);
bool willTerminate(IOService *provider, IOOptionBits options);
void stop(IOService *provider);

// IOKit methods. These methods are defines in <IOKit/IOService.h>
Expand Down
16 changes: 8 additions & 8 deletions 360Daemon/ControlPrefs.m
Original file line number Diff line number Diff line change
Expand Up @@ -45,15 +45,15 @@ BOOL AlertDisabled(NSInteger index)

void SetController(NSString *serial, NSDictionary *data)
{
CFPreferencesSetValue((__bridge CFStringRef)serial, (__bridge CFPropertyListRef)(data), DOM_CONTROLLERS, kCFPreferencesAnyUser, kCFPreferencesCurrentHost);
CFPreferencesSynchronize(DOM_CONTROLLERS, kCFPreferencesAnyUser, kCFPreferencesCurrentHost);
CFPreferencesSetValue((__bridge CFStringRef)serial, (__bridge CFPropertyListRef)(data), DOM_CONTROLLERS, kCFPreferencesCurrentUser, kCFPreferencesCurrentHost);
CFPreferencesSynchronize(DOM_CONTROLLERS, kCFPreferencesCurrentUser, kCFPreferencesCurrentHost);
}

NSDictionary* GetController(NSString *serial)
{
CFPropertyListRef value;
CFPreferencesSynchronize(DOM_CONTROLLERS, kCFPreferencesAnyUser, kCFPreferencesCurrentHost);
value = CFPreferencesCopyValue((__bridge CFStringRef)serial, DOM_CONTROLLERS, kCFPreferencesAnyUser, kCFPreferencesCurrentHost);
CFPreferencesSynchronize(DOM_CONTROLLERS, kCFPreferencesCurrentUser, kCFPreferencesCurrentHost);
value = CFPreferencesCopyValue((__bridge CFStringRef)serial, DOM_CONTROLLERS, kCFPreferencesCurrentUser, kCFPreferencesCurrentHost);
return CFBridgingRelease(value);
}

Expand All @@ -75,17 +75,17 @@ void SetKnownDevices(NSDictionary *devices)
{
// Setting the dictionary should work?
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:devices];
CFPreferencesSetValue((CFStringRef)D_KNOWNDEV, (__bridge CFPropertyListRef)(data), DOM_CONTROLLERS, kCFPreferencesAnyUser, kCFPreferencesCurrentHost);
CFPreferencesSynchronize(DOM_CONTROLLERS, kCFPreferencesAnyUser, kCFPreferencesCurrentHost);
CFPreferencesSetValue((CFStringRef)D_KNOWNDEV, (__bridge CFPropertyListRef)(data), DOM_CONTROLLERS, kCFPreferencesCurrentUser, kCFPreferencesCurrentHost);
CFPreferencesSynchronize(DOM_CONTROLLERS, kCFPreferencesCurrentUser, kCFPreferencesCurrentHost);
}

NSDictionary* GetKnownDevices(void)
{
CFPropertyListRef value;
NSData *data;

CFPreferencesSynchronize(DOM_CONTROLLERS, kCFPreferencesAnyUser, kCFPreferencesCurrentHost);
value = CFPreferencesCopyValue((CFStringRef)D_KNOWNDEV, DOM_CONTROLLERS, kCFPreferencesAnyUser, kCFPreferencesCurrentHost);
CFPreferencesSynchronize(DOM_CONTROLLERS, kCFPreferencesCurrentUser, kCFPreferencesCurrentHost);
value = CFPreferencesCopyValue((CFStringRef)D_KNOWNDEV, DOM_CONTROLLERS, kCFPreferencesCurrentUser, kCFPreferencesCurrentHost);
data = CFBridgingRelease(value);
if (data == nil)
return nil;
Expand Down
81 changes: 61 additions & 20 deletions Install360Controller/Install360Controller.pkgproj
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,10 @@
<key>PACKAGES</key>
<array>
<dict>
<key>MUST-CLOSE-APPLICATION-ITEMS</key>
<array/>
<key>MUST-CLOSE-APPLICATIONS</key>
<false/>
<key>PACKAGE_FILES</key>
<dict>
<key>DEFAULT_INSTALL_LOCATION</key>
Expand Down Expand Up @@ -313,6 +317,18 @@
<key>CHILDREN</key>
<array>
<dict>
<key>BUNDLE_CAN_DOWNGRADE</key>
<false/>
<key>BUNDLE_POSTINSTALL_PATH</key>
<dict>
<key>PATH_TYPE</key>
<integer>0</integer>
</dict>
<key>BUNDLE_PREINSTALL_PATH</key>
<dict>
<key>PATH_TYPE</key>
<integer>0</integer>
</dict>
<key>CHILDREN</key>
<array/>
<key>GID</key>
Expand Down Expand Up @@ -384,7 +400,7 @@
<key>PATH_TYPE</key>
<integer>0</integer>
<key>PERMISSIONS</key>
<integer>493</integer>
<integer>1005</integer>
<key>TYPE</key>
<integer>1</integer>
<key>UID</key>
Expand Down Expand Up @@ -486,6 +502,22 @@
<key>UID</key>
<integer>0</integer>
</dict>
<dict>
<key>CHILDREN</key>
<array/>
<key>GID</key>
<integer>0</integer>
<key>PATH</key>
<string>Automator</string>
<key>PATH_TYPE</key>
<integer>0</integer>
<key>PERMISSIONS</key>
<integer>493</integer>
<key>TYPE</key>
<integer>1</integer>
<key>UID</key>
<integer>0</integer>
</dict>
</array>
<key>GID</key>
<integer>0</integer>
Expand Down Expand Up @@ -599,8 +631,14 @@
</dict>
<key>PAYLOAD_TYPE</key>
<integer>0</integer>
<key>SHOW_INVISIBLE</key>
<false/>
<key>SPLIT_FORKS</key>
<true/>
<key>TREAT_MISSING_FILES_AS_WARNING</key>
<false/>
<key>VERSION</key>
<integer>2</integer>
<integer>5</integer>
</dict>
<key>PACKAGE_SCRIPTS</key>
<dict>
Expand All @@ -627,15 +665,29 @@
<integer>1</integer>
<key>CONCLUSION_ACTION</key>
<integer>2</integer>
<key>FOLLOW_SYMBOLIC_LINKS</key>
<false/>
<key>IDENTIFIER</key>
<string>com.mice.pkg.Xbox360controller</string>
<key>LOCATION</key>
<integer>0</integer>
<key>NAME</key>
<string>Install360Controller</string>
<key>OVERWRITE_PERMISSIONS</key>
<false/>
<key>PAYLOAD_SIZE</key>
<integer>-1</integer>
<key>REFERENCE_PATH</key>
<string></string>
<key>RELOCATABLE</key>
<false/>
<key>USE_HFS+_COMPRESSION</key>
<false/>
<key>VERSION</key>
<string>0.15</string>
<string>0.16</string>
</dict>
<key>TYPE</key>
<integer>0</integer>
<key>UUID</key>
<string>95C3DB03-4C99-4A29-AEC7-C73B3D9F6A04</string>
</dict>
Expand All @@ -661,6 +713,8 @@
</dict>
<key>PROJECT_PRESENTATION</key>
<dict>
<key>BACKGROUND</key>
<dict/>
<key>INSTALLATION TYPE</key>
<dict>
<key>HIERARCHIES</key>
Expand Down Expand Up @@ -697,8 +751,6 @@
<dict/>
</dict>
</dict>
<key>INSTALLATION TYPE</key>
<integer>0</integer>
<key>MODE</key>
<integer>1</integer>
</dict>
Expand Down Expand Up @@ -780,8 +832,6 @@
</dict>
<key>LICENSE</key>
<dict>
<key>KEYWORDS</key>
<dict/>
<key>LOCALIZATIONS</key>
<array>
<dict>
Expand Down Expand Up @@ -862,19 +912,13 @@
<true/>
</dict>
</array>
<key>POSTINSTALL_PATH</key>
<dict/>
<key>PREINSTALL_PATH</key>
<dict/>
<key>RESOURCES</key>
<array/>
<key>ROOT_VOLUME_ONLY</key>
<true/>
</dict>
<key>PROJECT_SETTINGS</key>
<dict>
<key>ADVANCED_OPTIONS</key>
<dict/>
<key>BUILD_FORMAT</key>
<integer>0</integer>
<key>BUILD_PATH</key>
Expand All @@ -884,13 +928,6 @@
<key>PATH_TYPE</key>
<integer>1</integer>
</dict>
<key>CERTIFICATE</key>
<dict>
<key>NAME</key>
<string>Developer ID Application: Rodrigo Rocha (CDMF3S9CTN)</string>
<key>PATH</key>
<string>/Users/Rodrigo/Library/Keychains/login.keychain</string>
</dict>
<key>EXCLUDED_FILES</key>
<array>
<dict>
Expand Down Expand Up @@ -1061,6 +1098,10 @@
</array>
<key>NAME</key>
<string>Install360Controller</string>
<key>PAYLOAD_ONLY</key>
<false/>
<key>TREAT_MISSING_PRESENTATION_DOCUMENTS_AS_WARNING</key>
<false/>
</dict>
</dict>
<key>TYPE</key>
Expand Down
6 changes: 3 additions & 3 deletions Install360Controller/Scripts/finish.sh
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
#!/bin/sh

#This is to fix a bug in Yosemite.
# /bin/ln -s /Library/Extensions/360Controller.kext /System/Library/Extensions/
/bin/ln -s /Library/Extensions/360Controller.kext /System/Library/Extensions/

# /usr/bin/touch /System/Library/Extensions
/usr/bin/touch /System/Library/Extensions
/usr/bin/touch /Library/Extensions
/usr/bin/touch /Library/Preferences/com.mice.driver.Xbox360Controller.devices.plist

/bin/launchctl load -w /Library/LaunchDaemons/com.mice.360Daemon.plist

exit 0

0 comments on commit 848187f

Please sign in to comment.