Showing preview only (671K chars total). Download the full file or copy to clipboard to get everything.
Repository: electric-monk/360Controller
Branch: master
Commit: 649b9712d2a2
Files: 96
Total size: 639.3 KB
Directory structure:
gitextract_62qdvxky/
├── 360Controller/
│ ├── 360Controller.xcodeproj/
│ │ └── project.pbxproj
│ ├── ChatPad.cpp
│ ├── ChatPad.h
│ ├── ControlStruct.h
│ ├── Controller.cpp
│ ├── Controller.h
│ ├── English.lproj/
│ │ └── InfoPlist.strings
│ ├── Info copy.plist
│ ├── Info.plist
│ ├── _60Controller.cpp
│ ├── _60Controller.h
│ ├── chatpadhid.h
│ ├── chatpadkeys.cpp
│ ├── chatpadkeys.h
│ ├── version.plist
│ └── xbox360hid.h
├── 360Daemon/
│ ├── 360Daemon.1
│ ├── 360Daemon.m
│ ├── 360Daemon.xcodeproj/
│ │ └── project.pbxproj
│ ├── 360Daemon_Prefix.pch
│ ├── Alert.tif
│ ├── ControlPrefs.h
│ ├── ControlPrefs.m
│ ├── FoundationTool.pbproj/
│ │ └── project.pbxproj
│ └── com.mice.360Daemon.plist
├── DriverTool/
│ ├── DriverTool.1
│ ├── DriverTool.m
│ ├── DriverTool.xcodeproj/
│ │ └── project.pbxproj
│ └── DriverTool_Prefix.pch
├── Feedback360/
│ ├── English.lproj/
│ │ └── InfoPlist.strings
│ ├── Feedback360.xcodeproj/
│ │ ├── colin.mode1
│ │ └── project.pbxproj
│ ├── Info.plist
│ ├── devlink.c
│ ├── devlink.h
│ ├── emulator.c
│ ├── emulator.h
│ ├── main.c
│ ├── main.h
│ └── version.plist
├── Install360Controller/
│ ├── Install360Controller.pkgproj
│ ├── Scripts/
│ │ ├── finish.sh
│ │ └── upgrade.sh
│ └── Text/
│ └── Welcome.rtf
├── Licence.txt
├── Pref360Control/
│ ├── DeviceItem.h
│ ├── DeviceItem.m
│ ├── DeviceLister.h
│ ├── DeviceLister.m
│ ├── English.lproj/
│ │ ├── InfoPlist.strings
│ │ └── Pref360ControlPref.nib/
│ │ ├── designable.nib
│ │ └── keyedobjects.nib
│ ├── Info.plist
│ ├── MyAnalogStick.h
│ ├── MyAnalogStick.m
│ ├── MyCentreButtons.h
│ ├── MyCentreButtons.m
│ ├── MyDigitalStick.h
│ ├── MyDigitalStick.m
│ ├── MyMainButtons.h
│ ├── MyMainButtons.m
│ ├── MyShoulderButton.h
│ ├── MyShoulderButton.m
│ ├── Pref360Control.xcodeproj/
│ │ └── project.pbxproj
│ ├── Pref360ControlPref.h
│ ├── Pref360ControlPref.m
│ ├── Pref360Control_Prefix.pch
│ ├── batt0.tif
│ ├── batt1.tif
│ ├── batt2.tif
│ ├── batt3.tif
│ ├── battNone.tif
│ ├── pref360controlpref.tiff
│ └── version.plist
├── Readme.rtf
├── Wireless360Controller/
│ ├── English.lproj/
│ │ └── InfoPlist.strings
│ ├── IOKitDriver.pbproj/
│ │ └── project.pbxproj
│ ├── Info.plist
│ ├── Wireless360Controller.cpp
│ ├── Wireless360Controller.h
│ ├── Wireless360Controller.xcodeproj/
│ │ └── project.pbxproj
│ └── version.plist
├── WirelessGamingReceiver/
│ ├── English.lproj/
│ │ └── InfoPlist.strings
│ ├── IOKitDriver.pbproj/
│ │ └── project.pbxproj
│ ├── Info.plist
│ ├── WirelessDevice.cpp
│ ├── WirelessDevice.h
│ ├── WirelessGamingReceiver.cpp
│ ├── WirelessGamingReceiver.h
│ ├── WirelessGamingReceiver.xcodeproj/
│ │ ├── colin.mode1
│ │ └── project.pbxproj
│ ├── WirelessHIDDevice.cpp
│ ├── WirelessHIDDevice.h
│ ├── devices.h
│ └── version.plist
└── build
================================================
FILE CONTENTS
================================================
================================================
FILE: 360Controller/360Controller.xcodeproj/project.pbxproj
================================================
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 46;
objects = {
/* Begin PBXBuildFile section */
32D94FC60562CBF700B6AF17 /* _60Controller.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A224C3EFF42367911CA2CB7 /* _60Controller.h */; };
32D94FC80562CBF700B6AF17 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C167DFE841241C02AAC07 /* InfoPlist.strings */; };
32D94FCA0562CBF700B6AF17 /* _60Controller.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A224C3FFF42367911CA2CB7 /* _60Controller.cpp */; settings = {ATTRIBUTES = (); }; };
3B36DCC410B7816F00FFD769 /* Controller.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B36DCC210B7816F00FFD769 /* Controller.cpp */; };
3B36DCC510B7816F00FFD769 /* Controller.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B36DCC310B7816F00FFD769 /* Controller.h */; };
3B36DCCB10B7817E00FFD769 /* ChatPad.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B36DCC610B7817E00FFD769 /* ChatPad.cpp */; };
3B36DCCC10B7817E00FFD769 /* ChatPad.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B36DCC710B7817E00FFD769 /* ChatPad.h */; };
3B36DCCD10B7817E00FFD769 /* chatpadhid.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B36DCC810B7817E00FFD769 /* chatpadhid.h */; };
3B36DCCE10B7817E00FFD769 /* chatpadkeys.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3B36DCC910B7817E00FFD769 /* chatpadkeys.cpp */; };
3B36DCCF10B7817E00FFD769 /* chatpadkeys.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B36DCCA10B7817E00FFD769 /* chatpadkeys.h */; };
3BB5E09C09641F8200F83598 /* xbox360hid.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BB5E09B09641F8200F83598 /* xbox360hid.h */; };
3BCE45CA09638EBC00B69EDF /* ControlStruct.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BCE45C909638EBC00B69EDF /* ControlStruct.h */; };
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
089C167EFE841241C02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = "<group>"; };
1A224C3EFF42367911CA2CB7 /* _60Controller.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _60Controller.h; sourceTree = "<group>"; };
1A224C3FFF42367911CA2CB7 /* _60Controller.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = _60Controller.cpp; sourceTree = "<group>"; };
32D94FCF0562CBF700B6AF17 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
32D94FD00562CBF700B6AF17 /* 360Controller.kext */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = 360Controller.kext; sourceTree = BUILT_PRODUCTS_DIR; };
3B0F1276097B395B00127827 /* Feedback360.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; name = Feedback360.bundle; path = ../Feedback360/build/Deployment/Feedback360.bundle; sourceTree = SOURCE_ROOT; };
3B36DCC210B7816F00FFD769 /* Controller.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Controller.cpp; sourceTree = "<group>"; };
3B36DCC310B7816F00FFD769 /* Controller.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Controller.h; sourceTree = "<group>"; };
3B36DCC610B7817E00FFD769 /* ChatPad.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ChatPad.cpp; sourceTree = "<group>"; };
3B36DCC710B7817E00FFD769 /* ChatPad.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ChatPad.h; sourceTree = "<group>"; };
3B36DCC810B7817E00FFD769 /* chatpadhid.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = chatpadhid.h; sourceTree = "<group>"; };
3B36DCC910B7817E00FFD769 /* chatpadkeys.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = chatpadkeys.cpp; sourceTree = "<group>"; };
3B36DCCA10B7817E00FFD769 /* chatpadkeys.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = chatpadkeys.h; sourceTree = "<group>"; };
3BB5E09B09641F8200F83598 /* xbox360hid.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = xbox360hid.h; sourceTree = "<group>"; };
3BCE45C909638EBC00B69EDF /* ControlStruct.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ControlStruct.h; sourceTree = "<group>"; };
8DA8362C06AD9B9200E5AC22 /* Kernel.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Kernel.framework; path = /System/Library/Frameworks/Kernel.framework; sourceTree = "<absolute>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
32D94FCB0562CBF700B6AF17 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
089C166AFE841209C02AAC07 /* 360Controller */ = {
isa = PBXGroup;
children = (
247142CAFF3F8F9811CA285C /* Source */,
089C167CFE841241C02AAC07 /* Resources */,
19C28FB6FE9D52B211CA2CBB /* Products */,
);
name = 360Controller;
sourceTree = "<group>";
};
089C167CFE841241C02AAC07 /* Resources */ = {
isa = PBXGroup;
children = (
3B2EF52A0965A0AE007BFB7B /* Kernel Driver */,
);
name = Resources;
sourceTree = "<group>";
};
19C28FB6FE9D52B211CA2CBB /* Products */ = {
isa = PBXGroup;
children = (
32D94FD00562CBF700B6AF17 /* 360Controller.kext */,
);
name = Products;
sourceTree = "<group>";
};
247142CAFF3F8F9811CA285C /* Source */ = {
isa = PBXGroup;
children = (
3B2EF19A0965A03E007BFB7B /* Kernel Driver */,
);
name = Source;
sourceTree = "<group>";
};
3B2EF19A0965A03E007BFB7B /* Kernel Driver */ = {
isa = PBXGroup;
children = (
3B36DCC010B7815000FFD769 /* Controller */,
3B36DCC110B7815700FFD769 /* ChatPad */,
3BCE45C909638EBC00B69EDF /* ControlStruct.h */,
1A224C3EFF42367911CA2CB7 /* _60Controller.h */,
1A224C3FFF42367911CA2CB7 /* _60Controller.cpp */,
);
name = "Kernel Driver";
sourceTree = "<group>";
};
3B2EF52A0965A0AE007BFB7B /* Kernel Driver */ = {
isa = PBXGroup;
children = (
3B0F1276097B395B00127827 /* Feedback360.bundle */,
8DA8362C06AD9B9200E5AC22 /* Kernel.framework */,
32D94FCF0562CBF700B6AF17 /* Info.plist */,
089C167DFE841241C02AAC07 /* InfoPlist.strings */,
);
name = "Kernel Driver";
sourceTree = "<group>";
};
3B36DCC010B7815000FFD769 /* Controller */ = {
isa = PBXGroup;
children = (
3B36DCC210B7816F00FFD769 /* Controller.cpp */,
3B36DCC310B7816F00FFD769 /* Controller.h */,
3BB5E09B09641F8200F83598 /* xbox360hid.h */,
);
name = Controller;
sourceTree = "<group>";
};
3B36DCC110B7815700FFD769 /* ChatPad */ = {
isa = PBXGroup;
children = (
3B36DCC610B7817E00FFD769 /* ChatPad.cpp */,
3B36DCC710B7817E00FFD769 /* ChatPad.h */,
3B36DCC910B7817E00FFD769 /* chatpadkeys.cpp */,
3B36DCCA10B7817E00FFD769 /* chatpadkeys.h */,
3B36DCC810B7817E00FFD769 /* chatpadhid.h */,
);
name = ChatPad;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXHeadersBuildPhase section */
32D94FC50562CBF700B6AF17 /* Headers */ = {
isa = PBXHeadersBuildPhase;
buildActionMask = 2147483647;
files = (
32D94FC60562CBF700B6AF17 /* _60Controller.h in Headers */,
3BCE45CA09638EBC00B69EDF /* ControlStruct.h in Headers */,
3BB5E09C09641F8200F83598 /* xbox360hid.h in Headers */,
3B36DCC510B7816F00FFD769 /* Controller.h in Headers */,
3B36DCCC10B7817E00FFD769 /* ChatPad.h in Headers */,
3B36DCCD10B7817E00FFD769 /* chatpadhid.h in Headers */,
3B36DCCF10B7817E00FFD769 /* chatpadkeys.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXHeadersBuildPhase section */
/* Begin PBXNativeTarget section */
32D94FC30562CBF700B6AF17 /* 360Controller */ = {
isa = PBXNativeTarget;
buildConfigurationList = 3BBDC682097938A90023AAD8 /* Build configuration list for PBXNativeTarget "360Controller" */;
buildPhases = (
32D94FC50562CBF700B6AF17 /* Headers */,
32D94FC70562CBF700B6AF17 /* Resources */,
32D94FC90562CBF700B6AF17 /* Sources */,
32D94FCB0562CBF700B6AF17 /* Frameworks */,
32D94FCC0562CBF700B6AF17 /* Rez */,
3B0F12A1097B3A3A00127827 /* ShellScript */,
);
buildRules = (
);
dependencies = (
);
name = 360Controller;
productInstallPath = "$(SYSTEM_LIBRARY_DIR)/Extensions";
productName = 360Controller;
productReference = 32D94FD00562CBF700B6AF17 /* 360Controller.kext */;
productType = "com.apple.product-type.kernel-extension.iokit";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
089C1669FE841209C02AAC07 /* Project object */ = {
isa = PBXProject;
buildConfigurationList = 3BBDC686097938A90023AAD8 /* Build configuration list for PBXProject "360Controller" */;
compatibilityVersion = "Xcode 3.2";
developmentRegion = English;
hasScannedForEncodings = 1;
knownRegions = (
English,
Japanese,
French,
German,
);
mainGroup = 089C166AFE841209C02AAC07 /* 360Controller */;
projectDirPath = "";
projectRoot = "";
targets = (
32D94FC30562CBF700B6AF17 /* 360Controller */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
32D94FC70562CBF700B6AF17 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
32D94FC80562CBF700B6AF17 /* InfoPlist.strings in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXRezBuildPhase section */
32D94FCC0562CBF700B6AF17 /* Rez */ = {
isa = PBXRezBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXRezBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
3B0F12A1097B3A3A00127827 /* ShellScript */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
);
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "cd \"$TARGET_BUILD_DIR/$TARGET_NAME.kext/Contents\"\nmkdir PlugIns > /dev/null 2>&1\nrm -R PlugIns/Feedback360.plugin > /dev/null 2>&1\necho \"$SRCROOT/../Feedback360/build/Deployment/Feedback360.bundle\"\ncp -R \"$SRCROOT/../Feedback360/build/Deployment/Feedback360.bundle\" PlugIns/Feedback360.plugin\n# Renaming extension from bundle to a plugin? Could be naughty.";
};
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
32D94FC90562CBF700B6AF17 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
32D94FCA0562CBF700B6AF17 /* _60Controller.cpp in Sources */,
3B36DCC410B7816F00FFD769 /* Controller.cpp in Sources */,
3B36DCCB10B7817E00FFD769 /* ChatPad.cpp in Sources */,
3B36DCCE10B7817E00FFD769 /* chatpadkeys.cpp in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXVariantGroup section */
089C167DFE841241C02AAC07 /* InfoPlist.strings */ = {
isa = PBXVariantGroup;
children = (
089C167EFE841241C02AAC07 /* English */,
);
name = InfoPlist.strings;
sourceTree = "<group>";
};
/* End PBXVariantGroup section */
/* Begin XCBuildConfiguration section */
3BBDC683097938A90023AAD8 /* Development */ = {
isa = XCBuildConfiguration;
buildSettings = {
ARCHS = "$(ARCHS_STANDARD_32_64_BIT)";
COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 1.0.0d12;
GCC_DYNAMIC_NO_PIC = NO;
GCC_ENABLE_FIX_AND_CONTINUE = YES;
GCC_GENERATE_DEBUGGING_SYMBOLS = YES;
GCC_MODEL_TUNING = G5;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
INFOPLIST_FILE = Info.plist;
INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/Extensions";
MODULE_NAME = com.mice.driver.Xbox360Controller;
MODULE_VERSION = 1.0.0d11;
PREBINDING = NO;
PRODUCT_NAME = 360Controller;
SDKROOT = "";
WRAPPER_EXTENSION = kext;
ZERO_LINK = YES;
};
name = Development;
};
3BBDC684097938A90023AAD8 /* Deployment */ = {
isa = XCBuildConfiguration;
buildSettings = {
ARCHS = (
ppc,
i386,
x86_64,
);
COPY_PHASE_STRIP = YES;
CURRENT_PROJECT_VERSION = 1.0.0d12;
GCC_ENABLE_FIX_AND_CONTINUE = NO;
GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
GCC_MODEL_TUNING = G5;
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
INFOPLIST_FILE = Info.plist;
INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/Extensions";
LD_GENERATE_MAP_FILE = NO;
MODULE_NAME = com.mice.driver.Xbox360Controller;
MODULE_VERSION = 1.0.0d11;
PREBINDING = NO;
PRODUCT_NAME = 360Controller;
WRAPPER_EXTENSION = kext;
ZERO_LINK = NO;
};
name = Deployment;
};
3BBDC685097938A90023AAD8 /* Default */ = {
isa = XCBuildConfiguration;
buildSettings = {
CURRENT_PROJECT_VERSION = 1.0.0d12;
GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
GCC_MODEL_TUNING = G5;
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
INFOPLIST_FILE = Info.plist;
INSTALL_PATH = "$(SYSTEM_LIBRARY_DIR)/Extensions";
MODULE_NAME = com.mice.driver.Xbox360Controller;
MODULE_VERSION = 1.0.0d11;
PREBINDING = NO;
PRODUCT_NAME = 360Controller;
WRAPPER_EXTENSION = kext;
};
name = Default;
};
3BBDC687097938A90023AAD8 /* Development */ = {
isa = XCBuildConfiguration;
buildSettings = {
CODE_SIGN_IDENTITY = "Developer ID Application: Colin Munro";
MACOSX_DEPLOYMENT_TARGET = 10.5;
PROVISIONING_PROFILE = "";
SDKROOT = "";
};
name = Development;
};
3BBDC688097938A90023AAD8 /* Deployment */ = {
isa = XCBuildConfiguration;
buildSettings = {
ARCHS = "$(ARCHS_STANDARD_32_64_BIT)";
CODE_SIGN_IDENTITY = "Developer ID Application: Colin Munro";
GCC_VERSION = "";
MACOSX_DEPLOYMENT_TARGET = 10.5;
PROVISIONING_PROFILE = "";
SDKROOT = "";
"SDKROOT[arch=x86_64]" = "";
};
name = Deployment;
};
3BBDC689097938A90023AAD8 /* Default */ = {
isa = XCBuildConfiguration;
buildSettings = {
CODE_SIGN_IDENTITY = "Developer ID Application: Colin Munro";
MACOSX_DEPLOYMENT_TARGET = 10.5;
PROVISIONING_PROFILE = "";
SDKROOT = "";
};
name = Default;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
3BBDC682097938A90023AAD8 /* Build configuration list for PBXNativeTarget "360Controller" */ = {
isa = XCConfigurationList;
buildConfigurations = (
3BBDC683097938A90023AAD8 /* Development */,
3BBDC684097938A90023AAD8 /* Deployment */,
3BBDC685097938A90023AAD8 /* Default */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Default;
};
3BBDC686097938A90023AAD8 /* Build configuration list for PBXProject "360Controller" */ = {
isa = XCConfigurationList;
buildConfigurations = (
3BBDC687097938A90023AAD8 /* Development */,
3BBDC688097938A90023AAD8 /* Deployment */,
3BBDC689097938A90023AAD8 /* Default */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Default;
};
/* End XCConfigurationList section */
};
rootObject = 089C1669FE841209C02AAC07 /* Project object */;
}
================================================
FILE: 360Controller/ChatPad.cpp
================================================
/*
MICE Xbox 360 Controller driver for Mac OS X
Copyright (C) 2006-2013 Colin Munro
ChatPad.cpp - Implementation of the ChatPad Accessory driver
This file is part of Xbox360Controller.
Xbox360Controller is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
Xbox360Controller 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with Foobar; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <IOKit/IOLib.h>
#include "ChatPad.h"
namespace HID_ChatPad {
#include "chatpadhid.h"
}
#include "chatpadkeys.h"
#include "_60Controller.h"
OSDefineMetaClassAndStructors(ChatPadKeyboardClass, IOHIDDevice)
IOReturn ChatPadKeyboardClass::newReportDescriptor(IOMemoryDescriptor **descriptor) const
{
IOBufferMemoryDescriptor *buffer;
buffer = IOBufferMemoryDescriptor::inTaskWithOptions(kernel_task, 0, sizeof(HID_ChatPad::ReportDescriptor));
if (buffer == NULL)
return kIOReturnNoResources;
buffer->writeBytes(0, HID_ChatPad::ReportDescriptor, sizeof(HID_ChatPad::ReportDescriptor));
*descriptor = buffer;
return kIOReturnSuccess;
}
IOReturn ChatPadKeyboardClass::setReport(IOMemoryDescriptor *report, IOHIDReportType reportType, IOOptionBits options)
{
// Maybe add LED support later?
return kIOReturnUnsupported;
}
IOReturn ChatPadKeyboardClass::getReport(IOMemoryDescriptor *report, IOHIDReportType reportType, IOOptionBits options)
{
return kIOReturnUnsupported;
}
IOReturn ChatPadKeyboardClass::handleReport(IOMemoryDescriptor *report, IOHIDReportType reportType, IOOptionBits options)
{
IOBufferMemoryDescriptor *realReport = OSDynamicCast(IOBufferMemoryDescriptor, report);
if (realReport != NULL)
{
unsigned char *data = (unsigned char*)realReport->getBytesNoCopy();
if (data[0] == 0x00)
{
for (int i = 2; i < 5; i++)
{
data[i] = ChatPad2USB(data[i]);
}
}
}
return IOHIDDevice::handleReport(report, reportType, options);
}
OSNumber* ChatPadKeyboardClass::newPrimaryUsageNumber() const
{
return OSNumber::withNumber(HID_ChatPad::ReportDescriptor[3], 8);
}
OSNumber* ChatPadKeyboardClass::newPrimaryUsagePageNumber() const
{
return OSNumber::withNumber(HID_ChatPad::ReportDescriptor[1], 8);
}
OSString* ChatPadKeyboardClass::newProductString() const
{
return OSString::withCString("ChatPad");
}
OSString* ChatPadKeyboardClass::newTransportString() const
{
return OSString::withCString("Serial");
}
OSNumber* ChatPadKeyboardClass::newVendorIDNumber() const
{
// Same as USB
return OSNumber::withNumber(100, 32);
}
OSNumber* ChatPadKeyboardClass::newProductIDNumber() const
{
// Same as USB, plus one
return OSNumber::withNumber(100, 32);
}
static IOHIDDevice* GetParent(const IOService *current)
{
Xbox360Peripheral *owner;
owner = OSDynamicCast(Xbox360Peripheral, current->getProvider());
if (owner == NULL)
return NULL;
return owner->getController(0);
}
bool ChatPadKeyboardClass::start(IOService *provider)
{
if (!IOHIDDevice::start(provider))
return false;
return OSDynamicCast(Xbox360Peripheral, provider) != NULL;
}
OSString* ChatPadKeyboardClass::newManufacturerString() const
{
IOHIDDevice *device = GetParent(this);
if (device == NULL)
return NULL;
return device->newManufacturerString();
}
OSString* ChatPadKeyboardClass::newSerialNumberString() const
{
IOHIDDevice *device = GetParent(this);
if (device == NULL)
return NULL;
return device->newSerialNumberString();
}
OSNumber* ChatPadKeyboardClass::newLocationIDNumber() const
{
IOHIDDevice *device = GetParent(this);
if (device == NULL)
return NULL;
OSNumber *number = device->newLocationIDNumber();
if (number == NULL)
return NULL;
UInt32 value = number->unsigned32BitValue();
number->release();
return OSNumber::withNumber(value + 1, 32);
}
================================================
FILE: 360Controller/ChatPad.h
================================================
/*
MICE Xbox 360 Controller driver for Mac OS X
Copyright (C) 2006-2013 Colin Munro
ChatPad.h - Driver class for the ChatPad accessory
This file is part of Xbox360Controller.
Xbox360Controller is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
Xbox360Controller 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with Foobar; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <IOKit/hid/IOHIDDevice.h>
class ChatPadKeyboardClass : public IOHIDDevice
{
OSDeclareDefaultStructors(ChatPadKeyboardClass)
private:
public:
virtual bool start(IOService *provider);
// IOHidDevice methods
virtual IOReturn newReportDescriptor(IOMemoryDescriptor **descriptor) const;
virtual IOReturn setReport(IOMemoryDescriptor *report,IOHIDReportType reportType,IOOptionBits options=0);
virtual IOReturn getReport(IOMemoryDescriptor *report,IOHIDReportType reportType,IOOptionBits options);
virtual IOReturn handleReport(IOMemoryDescriptor *report, IOHIDReportType reportType = kIOHIDReportTypeInput, IOOptionBits options = 0);
virtual OSString* newManufacturerString() const;
virtual OSNumber* newPrimaryUsageNumber() const;
virtual OSNumber* newPrimaryUsagePageNumber() const;
virtual OSNumber* newProductIDNumber() const;
virtual OSString* newProductString() const;
virtual OSString* newSerialNumberString() const;
virtual OSString* newTransportString() const;
virtual OSNumber* newVendorIDNumber() const;
virtual OSNumber* newLocationIDNumber() const;
};
================================================
FILE: 360Controller/ControlStruct.h
================================================
/*
MICE Xbox 360 Controller driver for Mac OS X
Copyright (C) 2006-2013 Colin Munro
ControlStruct.h - Structures used by the device
This file is part of Xbox360Controller.
Xbox360Controller is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
Xbox360Controller 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with Foobar; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef __CONTROLSTRUCT_H__
#define __CONTROLSTRUCT_H__
typedef UInt8 XBox360_Byte;
typedef UInt16 XBox360_Short;
typedef SInt16 XBox360_SShort;
#define Xbox360_Prepare(x,t) {memset(&x,0,sizeof(x));x.header.command=t;x.header.size=sizeof(x);}
#define PACKED __attribute__((__packed__))
// Common structure format
typedef struct {
XBox360_Byte command;
XBox360_Byte size;
} PACKED XBOX360_PACKET;
// Analog stick format
typedef struct {
XBox360_SShort x,y;
} PACKED XBOX360_HAT;
// Structure describing the report had back from the controller
typedef struct {
XBOX360_PACKET header;
XBox360_Short buttons;
XBox360_Byte trigL,trigR;
XBOX360_HAT left,right;
XBox360_Byte reserved[6];
} PACKED XBOX360_IN_REPORT;
// Structure describing the command to change LED status
typedef struct {
XBOX360_PACKET header;
XBox360_Byte pattern;
} PACKED XBOX360_OUT_LED;
// Structure describing the command to change rumble motor status
typedef struct {
XBOX360_PACKET header;
XBox360_Byte reserved1;
XBox360_Byte big,little;
XBox360_Byte reserved[3];
} PACKED XBOX360_OUT_RUMBLE;
// Enumeration of command types
enum {
// In
inReport = 0,
// Out
outRumble = 0,
outLed = 1
};
// Button bits
enum {
btnHatRight = 0x8000,
btnHatLeft = 0x4000,
btnBack = 0x2000,
btnStart = 0x1000,
btnDigiRight = 0x0800,
btnDigiLeft = 0x0400,
btnDigiDown = 0x0200,
btnDigiUp = 0x0100,
btnY = 0x0080,
btnX = 0x0040,
btnB = 0x0020,
btnA = 0x0010,
btnReserved1 = 0x0008, // Unused?
btnXbox = 0x0004,
btnShoulderRight = 0x0002,
btnShoulderLeft = 0x0001
};
// LED values
enum {
ledOff = 0x00,
ledBlinkingAll = 0x01,
ledFlashOn1 = 0x02,
ledFlashOn2 = 0x03,
ledFlashOn3 = 0x04,
ledFlashOn4 = 0x05,
ledOn1 = 0x06,
ledOn2 = 0x07,
ledOn3 = 0x08,
ledOn4 = 0x09,
ledRotating = 0x0a,
ledBlinking = 0x0b, // Blinking of previously enabled LED (e.g. from 0x01-0x09)
ledBlinkingSlow = 0x0c, // As above
ldAlternating = 0x0d // 1+4, 2+3, then back to previous after a short time
};
#endif // __CONTROLSTRUCT_H__
================================================
FILE: 360Controller/Controller.cpp
================================================
/*
MICE Xbox 360 Controller driver for Mac OS X
Copyright (C) 2006-2013 Colin Munro
Controller.cpp - driver class for the 360 controller
This file is part of Xbox360Controller.
Xbox360Controller is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
Xbox360Controller 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with Foobar; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <IOKit/usb/IOUSBDevice.h>
#include <IOKit/usb/IOUSBInterface.h>
#include "Controller.h"
#include "ControlStruct.h"
namespace HID_360 {
#include "xbox360hid.h"
}
#include "_60Controller.h"
OSDefineMetaClassAndStructors(Xbox360ControllerClass, IOHIDDevice)
static Xbox360Peripheral* GetOwner(IOService *us)
{
IOService *prov;
prov = us->getProvider();
if (prov == NULL)
return NULL;
return OSDynamicCast(Xbox360Peripheral, prov);
}
static IOUSBDevice* GetOwnerProvider(const IOService *us)
{
IOService *prov, *provprov;
prov = us->getProvider();
if (prov == NULL)
return NULL;
provprov = prov->getProvider();
if (provprov == NULL)
return NULL;
return OSDynamicCast(IOUSBDevice, provprov);
}
bool Xbox360ControllerClass::start(IOService *provider)
{
if (OSDynamicCast(Xbox360Peripheral, provider) == NULL)
return false;
return IOHIDDevice::start(provider);
}
IOReturn Xbox360ControllerClass::setProperties(OSObject *properties)
{
Xbox360Peripheral *owner = GetOwner(this);
if (owner == NULL)
return kIOReturnUnsupported;
return owner->setProperties(properties);
}
// Returns the HID descriptor for this device
IOReturn Xbox360ControllerClass::newReportDescriptor(IOMemoryDescriptor **descriptor) const
{
IOBufferMemoryDescriptor *buffer;
buffer=IOBufferMemoryDescriptor::inTaskWithOptions(kernel_task,0,sizeof(HID_360::ReportDescriptor));
if(buffer==NULL) return kIOReturnNoResources;
buffer->writeBytes(0,HID_360::ReportDescriptor,sizeof(HID_360::ReportDescriptor));
*descriptor=buffer;
return kIOReturnSuccess;
}
// Handles a message from the userspace IOHIDDeviceInterface122::setReport function
IOReturn Xbox360ControllerClass::setReport(IOMemoryDescriptor *report,IOHIDReportType reportType,IOOptionBits options)
{
char data[2];
report->readBytes(0,data,2);
switch(data[0]) {
case 0x00: // Set force feedback
if((data[1]!=report->getLength())||(data[1]!=0x04)) return kIOReturnUnsupported;
{
XBOX360_OUT_RUMBLE rumble;
Xbox360_Prepare(rumble,outRumble);
report->readBytes(2,data,2);
rumble.big=data[0];
rumble.little=data[1];
GetOwner(this)->QueueWrite(&rumble,sizeof(rumble));
// IOLog("Set rumble: big(%d) little(%d)\n", rumble.big, rumble.little);
}
return kIOReturnSuccess;
case 0x01: // Set LEDs
if((data[1]!=report->getLength())||(data[1]!=0x03)) return kIOReturnUnsupported;
{
XBOX360_OUT_LED led;
report->readBytes(2,data,1);
Xbox360_Prepare(led,outLed);
led.pattern=data[0];
GetOwner(this)->QueueWrite(&led,sizeof(led));
// IOLog("Set LED: %d\n", led.pattern);
}
return kIOReturnSuccess;
default:
IOLog("Unknown escape %d\n", data[0]);
return kIOReturnUnsupported;
}
}
// Get report
IOReturn Xbox360ControllerClass::getReport(IOMemoryDescriptor *report,IOHIDReportType reportType,IOOptionBits options)
{
// Doesn't do anything yet ;)
return kIOReturnUnsupported;
}
// Returns the string for the specified index from the USB device's string list, with an optional default
OSString* Xbox360ControllerClass::getDeviceString(UInt8 index,const char *def) const
{
IOReturn err;
char buf[1024];
const char *string;
err = GetOwnerProvider(this)->GetStringDescriptor(index,buf,sizeof(buf));
if(err==kIOReturnSuccess) string=buf;
else {
if(def==NULL) string="Unknown";
else string=def;
}
return OSString::withCString(string);
}
OSString* Xbox360ControllerClass::newManufacturerString() const
{
return getDeviceString(GetOwnerProvider(this)->GetManufacturerStringIndex());
}
OSNumber* Xbox360ControllerClass::newPrimaryUsageNumber() const
{
return OSNumber::withNumber(HID_360::ReportDescriptor[3], 8);
}
OSNumber* Xbox360ControllerClass::newPrimaryUsagePageNumber() const
{
return OSNumber::withNumber(HID_360::ReportDescriptor[1], 8);
}
OSNumber* Xbox360ControllerClass::newProductIDNumber() const
{
return OSNumber::withNumber(GetOwnerProvider(this)->GetProductID(),16);
}
OSString* Xbox360ControllerClass::newProductString() const
{
return getDeviceString(GetOwnerProvider(this)->GetProductStringIndex());
}
OSString* Xbox360ControllerClass::newSerialNumberString() const
{
return getDeviceString(GetOwnerProvider(this)->GetSerialNumberStringIndex());
}
OSString* Xbox360ControllerClass::newTransportString() const
{
return OSString::withCString("USB");
}
OSNumber* Xbox360ControllerClass::newVendorIDNumber() const
{
return OSNumber::withNumber(GetOwnerProvider(this)->GetVendorID(),16);
}
OSNumber* Xbox360ControllerClass::newLocationIDNumber() const
{
IOUSBDevice *device;
OSNumber *number;
UInt32 location;
device = GetOwnerProvider(this);
if (device)
{
if ((number = OSDynamicCast(OSNumber, device->getProperty("locationID"))))
{
location = number->unsigned32BitValue();
}
else
{
// Make up an address
if ((number = OSDynamicCast(OSNumber, device->getProperty("USB Address"))))
location |= number->unsigned8BitValue() << 24;
if ((number = OSDynamicCast(OSNumber, device->getProperty("idProduct"))))
location |= number->unsigned8BitValue() << 16;
}
}
return (location != 0) ? OSNumber::withNumber(location, 32) : 0;
}
================================================
FILE: 360Controller/Controller.h
================================================
/*
MICE Xbox 360 Controller driver for Mac OS X
Copyright (C) 2006-2013 Colin Munro
Controller.h - Driver class for the 360 controller
This file is part of Xbox360Controller.
Xbox360Controller is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
Xbox360Controller 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with Foobar; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <IOKit/hid/IOHIDDevice.h>
class Xbox360ControllerClass : public IOHIDDevice
{
OSDeclareDefaultStructors(Xbox360ControllerClass)
private:
OSString* getDeviceString(UInt8 index,const char *def=NULL) const;
public:
virtual bool start(IOService *provider);
virtual IOReturn setProperties(OSObject *properties);
virtual IOReturn newReportDescriptor(IOMemoryDescriptor **descriptor) const;
virtual IOReturn setReport(IOMemoryDescriptor *report,IOHIDReportType reportType,IOOptionBits options=0);
virtual IOReturn getReport(IOMemoryDescriptor *report,IOHIDReportType reportType,IOOptionBits options);
virtual OSString* newManufacturerString() const;
virtual OSNumber* newPrimaryUsageNumber() const;
virtual OSNumber* newPrimaryUsagePageNumber() const;
virtual OSNumber* newProductIDNumber() const;
virtual OSString* newProductString() const;
virtual OSString* newSerialNumberString() const;
virtual OSString* newTransportString() const;
virtual OSNumber* newVendorIDNumber() const;
virtual OSNumber* newLocationIDNumber() const;
};
================================================
FILE: 360Controller/English.lproj/InfoPlist.strings
================================================
/* Localized versions of Info.plist keys */
CFBundleName = "360Controller";
NSHumanReadableCopyright = "© Colin Munro, 2005-11";
================================================
FILE: 360Controller/Info copy.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleExecutable</key>
<string>360Controller</string>
<key>CFBundleIconFile</key>
<string></string>
<key>CFBundleIdentifier</key>
<string>com.mice.driver.Xbox360Controller</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
<string>KEXT</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1.0.0d1</string>
<key>IOKitPersonalities</key>
<dict>
<key>Controller</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.mice.driver.Xbox360Controller</string>
<key>IOCFPlugInTypes</key>
<dict>
<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>
<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>
</dict>
<key>IOClass</key>
<string>Xbox360ControllerClass</string>
<key>IOKitDebug</key>
<integer>65535</integer>
<key>IOProviderClass</key>
<string>IOUSBDevice</string>
<key>idProduct</key>
<integer>654</integer>
<key>idVendor</key>
<integer>1118</integer>
</dict>
</dict>
<key>OSBundleLibraries</key>
<dict>
<key>com.apple.iokit.IOHIDFamily</key>
<string>1.2</string>
<key>com.apple.iokit.IOUSBFamily</key>
<string>1.8</string>
<key>com.apple.kernel.libkern</key>
<string>6.9.9</string>
<key>com.apple.kernel.mach</key>
<string>6.9.9</string>
</dict>
</dict>
</plist>
================================================
FILE: 360Controller/Info.plist
================================================
<?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>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleExecutable</key>
<string>${EXECUTABLE_NAME}</string>
<key>CFBundleIconFile</key>
<string></string>
<key>CFBundleIdentifier</key>
<string>com.mice.driver.Xbox360Controller</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>${PRODUCT_NAME}</string>
<key>CFBundlePackageType</key>
<string>KEXT</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1.0.0d12</string>
<key>IOKitPersonalities</key>
<dict>
<key>AfterglowGamepadforXbox360</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.mice.driver.Xbox360Controller</string>
<key>IOCFPlugInTypes</key>
<dict>
<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>
<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>
</dict>
<key>IOClass</key>
<string>Xbox360Peripheral</string>
<key>IOKitDebug</key>
<integer>65535</integer>
<key>IOProviderClass</key>
<string>IOUSBDevice</string>
<key>idProduct</key>
<integer>275</integer>
<key>idVendor</key>
<integer>3695</integer>
</dict>
<key>AfterglowGamepadforXbox360Z</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.mice.driver.Xbox360Controller</string>
<key>IOCFPlugInTypes</key>
<dict>
<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>
<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>
</dict>
<key>IOClass</key>
<string>Xbox360Peripheral</string>
<key>IOKitDebug</key>
<integer>65535</integer>
<key>IOProviderClass</key>
<string>IOUSBDevice</string>
<key>idProduct</key>
<integer>531</integer>
<key>idVendor</key>
<integer>3695</integer>
</dict>
<key>AfterglowGamepadforXbox360ZZ</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.mice.driver.Xbox360Controller</string>
<key>IOCFPlugInTypes</key>
<dict>
<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>
<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>
</dict>
<key>IOClass</key>
<string>Xbox360Peripheral</string>
<key>IOKitDebug</key>
<integer>65535</integer>
<key>IOProviderClass</key>
<string>IOUSBDevice</string>
<key>idProduct</key>
<integer>63744</integer>
<key>idVendor</key>
<integer>7085</integer>
</dict>
<key>AviatorforXbox360PC</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.mice.driver.Xbox360Controller</string>
<key>IOCFPlugInTypes</key>
<dict>
<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>
<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>
</dict>
<key>IOClass</key>
<string>Xbox360Peripheral</string>
<key>IOKitDebug</key>
<integer>65535</integer>
<key>IOProviderClass</key>
<string>IOUSBDevice</string>
<key>idProduct</key>
<integer>52009</integer>
<key>idVendor</key>
<integer>1848</integer>
</dict>
<key>BatarangwiredcontrollerXBOX</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.mice.driver.Xbox360Controller</string>
<key>IOCFPlugInTypes</key>
<dict>
<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>
<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>
</dict>
<key>IOClass</key>
<string>Xbox360Peripheral</string>
<key>IOKitDebug</key>
<integer>65535</integer>
<key>IOProviderClass</key>
<string>IOUSBDevice</string>
<key>idProduct</key>
<integer>16144</integer>
<key>idVendor</key>
<integer>5604</integer>
</dict>
<key>BigbenControllerBB7201</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.mice.driver.Xbox360Controller</string>
<key>IOCFPlugInTypes</key>
<dict>
<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>
<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>
</dict>
<key>IOClass</key>
<string>Xbox360Peripheral</string>
<key>IOKitDebug</key>
<integer>65535</integer>
<key>IOProviderClass</key>
<string>IOUSBDevice</string>
<key>idProduct</key>
<integer>1537</integer>
<key>idVendor</key>
<integer>5227</integer>
</dict>
<key>ChatPadKeyboardEvents</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.apple.iokit.IOHIDFamily</string>
<key>IOClass</key>
<string>IOHIDEventDriver</string>
<key>IOProviderClass</key>
<string>IOHIDInterface</string>
<key>VendorID</key>
<integer>100</integer>
</dict>
<key>Controller</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.mice.driver.Xbox360Controller</string>
<key>IOCFPlugInTypes</key>
<dict>
<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>
<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>
</dict>
<key>IOClass</key>
<string>Xbox360Peripheral</string>
<key>IOKitDebug</key>
<integer>65535</integer>
<key>IOProviderClass</key>
<string>IOUSBDevice</string>
<key>idProduct</key>
<integer>62465</integer>
<key>idVendor</key>
<integer>1848</integer>
</dict>
<key>ControllerZ</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.mice.driver.Xbox360Controller</string>
<key>IOCFPlugInTypes</key>
<dict>
<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>
<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>
</dict>
<key>IOClass</key>
<string>Xbox360Peripheral</string>
<key>IOKitDebug</key>
<integer>65535</integer>
<key>IOProviderClass</key>
<string>IOUSBDevice</string>
<key>idProduct</key>
<integer>62721</integer>
<key>idVendor</key>
<integer>3695</integer>
</dict>
<key>ControllerZZ</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.mice.driver.Xbox360Controller</string>
<key>IOCFPlugInTypes</key>
<dict>
<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>
<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>
</dict>
<key>IOClass</key>
<string>Xbox360Peripheral</string>
<key>IOKitDebug</key>
<integer>65535</integer>
<key>IOProviderClass</key>
<string>IOUSBDevice</string>
<key>idProduct</key>
<integer>63489</integer>
<key>idVendor</key>
<integer>5168</integer>
</dict>
<key>ControllerZZZ</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.mice.driver.Xbox360Controller</string>
<key>IOCFPlugInTypes</key>
<dict>
<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>
<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>
</dict>
<key>IOClass</key>
<string>Xbox360Peripheral</string>
<key>IOKitDebug</key>
<integer>65535</integer>
<key>IOProviderClass</key>
<string>IOUSBDevice</string>
<key>idProduct</key>
<integer>654</integer>
<key>idVendor</key>
<integer>7085</integer>
</dict>
<key>ControllerZZZZ</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.mice.driver.Xbox360Controller</string>
<key>IOCFPlugInTypes</key>
<dict>
<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>
<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>
</dict>
<key>IOClass</key>
<string>Xbox360Peripheral</string>
<key>IOKitDebug</key>
<integer>65535</integer>
<key>IOProviderClass</key>
<string>IOUSBDevice</string>
<key>idProduct</key>
<integer>64001</integer>
<key>idVendor</key>
<integer>7085</integer>
</dict>
<key>DDRUniverse2Mat</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.mice.driver.Xbox360Controller</string>
<key>IOCFPlugInTypes</key>
<dict>
<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>
<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>
</dict>
<key>IOClass</key>
<string>Xbox360Peripheral</string>
<key>IOKitDebug</key>
<integer>65535</integer>
<key>IOProviderClass</key>
<string>IOUSBDevice</string>
<key>idProduct</key>
<integer>4</integer>
<key>idVendor</key>
<integer>4779</integer>
</dict>
<key>Ferrari458Racingwheel</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.mice.driver.Xbox360Controller</string>
<key>IOCFPlugInTypes</key>
<dict>
<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>
<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>
</dict>
<key>IOClass</key>
<string>Xbox360Peripheral</string>
<key>IOKitDebug</key>
<integer>65535</integer>
<key>IOProviderClass</key>
<string>IOUSBDevice</string>
<key>idProduct</key>
<integer>23296</integer>
<key>idVendor</key>
<integer>9414</integer>
</dict>
<key>GH4Guitar</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.mice.driver.Xbox360Controller</string>
<key>IOCFPlugInTypes</key>
<dict>
<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>
<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>
</dict>
<key>IOClass</key>
<string>Xbox360Peripheral</string>
<key>IOKitDebug</key>
<integer>65535</integer>
<key>IOProviderClass</key>
<string>IOUSBDevice</string>
<key>idProduct</key>
<integer>18228</integer>
<key>idVendor</key>
<integer>5168</integer>
</dict>
<key>GamepadF310</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.mice.driver.Xbox360Controller</string>
<key>IOCFPlugInTypes</key>
<dict>
<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>
<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>
</dict>
<key>IOClass</key>
<string>Xbox360Peripheral</string>
<key>IOKitDebug</key>
<integer>65535</integer>
<key>IOProviderClass</key>
<string>IOUSBDevice</string>
<key>idProduct</key>
<integer>49693</integer>
<key>idVendor</key>
<integer>1133</integer>
</dict>
<key>GamepadforXbox360</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.mice.driver.Xbox360Controller</string>
<key>IOCFPlugInTypes</key>
<dict>
<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>
<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>
</dict>
<key>IOClass</key>
<string>Xbox360Peripheral</string>
<key>IOKitDebug</key>
<integer>65535</integer>
<key>IOProviderClass</key>
<string>IOUSBDevice</string>
<key>idProduct</key>
<integer>769</integer>
<key>idVendor</key>
<integer>3695</integer>
</dict>
<key>GamepadforXbox360Z</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.mice.driver.Xbox360Controller</string>
<key>IOCFPlugInTypes</key>
<dict>
<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>
<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>
</dict>
<key>IOClass</key>
<string>Xbox360Peripheral</string>
<key>IOKitDebug</key>
<integer>65535</integer>
<key>IOProviderClass</key>
<string>IOUSBDevice</string>
<key>idProduct</key>
<integer>1025</integer>
<key>idVendor</key>
<integer>3695</integer>
</dict>
<key>GamepadforXbox360ZZ</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.mice.driver.Xbox360Controller</string>
<key>IOCFPlugInTypes</key>
<dict>
<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>
<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>
</dict>
<key>IOClass</key>
<string>Xbox360Peripheral</string>
<key>IOKitDebug</key>
<integer>65535</integer>
<key>IOProviderClass</key>
<string>IOUSBDevice</string>
<key>idProduct</key>
<integer>770</integer>
<key>idVendor</key>
<integer>4779</integer>
</dict>
<key>GamepadforXbox360ZZZ</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.mice.driver.Xbox360Controller</string>
<key>IOCFPlugInTypes</key>
<dict>
<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>
<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>
</dict>
<key>IOClass</key>
<string>Xbox360Peripheral</string>
<key>IOKitDebug</key>
<integer>65535</integer>
<key>IOProviderClass</key>
<string>IOUSBDevice</string>
<key>idProduct</key>
<integer>63746</integer>
<key>idVendor</key>
<integer>7085</integer>
</dict>
<key>GamestopXbox360Controller</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.mice.driver.Xbox360Controller</string>
<key>IOCFPlugInTypes</key>
<dict>
<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>
<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>
</dict>
<key>IOClass</key>
<string>Xbox360Peripheral</string>
<key>IOKitDebug</key>
<integer>65535</integer>
<key>IOProviderClass</key>
<string>IOUSBDevice</string>
<key>idProduct</key>
<integer>63745</integer>
<key>idVendor</key>
<integer>7085</integer>
</dict>
<key>GuitarHeroforPCMAC</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.mice.driver.Xbox360Controller</string>
<key>IOCFPlugInTypes</key>
<dict>
<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>
<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>
</dict>
<key>IOClass</key>
<string>Xbox360Peripheral</string>
<key>IOKitDebug</key>
<integer>65535</integer>
<key>IOProviderClass</key>
<string>IOUSBDevice</string>
<key>idProduct</key>
<integer>18252</integer>
<key>idVendor</key>
<integer>5168</integer>
</dict>
<key>HORIPADEX2TURBO</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.mice.driver.Xbox360Controller</string>
<key>IOCFPlugInTypes</key>
<dict>
<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>
<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>
</dict>
<key>IOClass</key>
<string>Xbox360Peripheral</string>
<key>IOKitDebug</key>
<integer>65535</integer>
<key>IOProviderClass</key>
<string>IOUSBDevice</string>
<key>idProduct</key>
<integer>62721</integer>
<key>idVendor</key>
<integer>7085</integer>
</dict>
<key>HarmonixDrumKitforXbox360</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.mice.driver.Xbox360Controller</string>
<key>IOCFPlugInTypes</key>
<dict>
<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>
<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>
</dict>
<key>IOClass</key>
<string>Xbox360Peripheral</string>
<key>IOKitDebug</key>
<integer>65535</integer>
<key>IOProviderClass</key>
<string>IOUSBDevice</string>
<key>idProduct</key>
<integer>3</integer>
<key>idVendor</key>
<integer>7085</integer>
</dict>
<key>HarmonixGuitarforXbox360</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.mice.driver.Xbox360Controller</string>
<key>IOCFPlugInTypes</key>
<dict>
<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>
<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>
</dict>
<key>IOClass</key>
<string>Xbox360Peripheral</string>
<key>IOKitDebug</key>
<integer>65535</integer>
<key>IOProviderClass</key>
<string>IOUSBDevice</string>
<key>idProduct</key>
<integer>2</integer>
<key>idVendor</key>
<integer>7085</integer>
</dict>
<key>HoriCoDOA4FightStick</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.mice.driver.Xbox360Controller</string>
<key>IOCFPlugInTypes</key>
<dict>
<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>
<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>
</dict>
<key>IOClass</key>
<string>Xbox360Peripheral</string>
<key>IOKitDebug</key>
<integer>65535</integer>
<key>IOProviderClass</key>
<string>IOUSBDevice</string>
<key>idProduct</key>
<integer>10</integer>
<key>idVendor</key>
<integer>3853</integer>
</dict>
<key>HoriFightingStickEx2</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.mice.driver.Xbox360Controller</string>
<key>IOCFPlugInTypes</key>
<dict>
<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>
<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>
</dict>
<key>IOClass</key>
<string>Xbox360Peripheral</string>
<key>IOKitDebug</key>
<integer>65535</integer>
<key>IOProviderClass</key>
<string>IOUSBDevice</string>
<key>idProduct</key>
<integer>13</integer>
<key>idVendor</key>
<integer>3853</integer>
</dict>
<key>HoriRealArcadeProEx</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.mice.driver.Xbox360Controller</string>
<key>IOCFPlugInTypes</key>
<dict>
<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>
<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>
</dict>
<key>IOClass</key>
<string>Xbox360Peripheral</string>
<key>IOKitDebug</key>
<integer>65535</integer>
<key>IOProviderClass</key>
<string>IOUSBDevice</string>
<key>idProduct</key>
<integer>22</integer>
<key>idVendor</key>
<integer>3853</integer>
</dict>
<key>HoriRealArcadeProVXSA</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.mice.driver.Xbox360Controller</string>
<key>IOCFPlugInTypes</key>
<dict>
<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>
<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>
</dict>
<key>IOClass</key>
<string>Xbox360Peripheral</string>
<key>IOKitDebug</key>
<integer>65535</integer>
<key>IOProviderClass</key>
<string>IOUSBDevice</string>
<key>idProduct</key>
<integer>21761</integer>
<key>idVendor</key>
<integer>9414</integer>
</dict>
<key>HoriSOULCALIBURVStick</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.mice.driver.Xbox360Controller</string>
<key>IOCFPlugInTypes</key>
<dict>
<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>
<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>
</dict>
<key>IOClass</key>
<string>Xbox360Peripheral</string>
<key>IOKitDebug</key>
<integer>65535</integer>
<key>IOProviderClass</key>
<string>IOUSBDevice</string>
<key>idProduct</key>
<integer>21766</integer>
<key>idVendor</key>
<integer>9414</integer>
</dict>
<key>JoytechNeoSe</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.mice.driver.Xbox360Controller</string>
<key>IOCFPlugInTypes</key>
<dict>
<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>
<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>
</dict>
<key>IOClass</key>
<string>Xbox360Peripheral</string>
<key>IOKitDebug</key>
<integer>65535</integer>
<key>IOProviderClass</key>
<string>IOUSBDevice</string>
<key>idProduct</key>
<integer>61485</integer>
<key>idVendor</key>
<integer>7085</integer>
</dict>
<key>JoytechNeoSeTake2</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.mice.driver.Xbox360Controller</string>
<key>IOCFPlugInTypes</key>
<dict>
<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>
<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>
</dict>
<key>IOClass</key>
<string>Xbox360Peripheral</string>
<key>IOKitDebug</key>
<integer>65535</integer>
<key>IOProviderClass</key>
<string>IOUSBDevice</string>
<key>idProduct</key>
<integer>48879</integer>
<key>idVendor</key>
<integer>5678</integer>
</dict>
<key>LogitechChillStream</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.mice.driver.Xbox360Controller</string>
<key>IOCFPlugInTypes</key>
<dict>
<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>
<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>
</dict>
<key>IOClass</key>
<string>Xbox360Peripheral</string>
<key>IOKitDebug</key>
<integer>65535</integer>
<key>IOProviderClass</key>
<string>IOUSBDevice</string>
<key>idProduct</key>
<integer>49730</integer>
<key>idVendor</key>
<integer>1133</integer>
</dict>
<key>LogitechF510</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.mice.driver.Xbox360Controller</string>
<key>IOCFPlugInTypes</key>
<dict>
<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>
<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>
</dict>
<key>IOClass</key>
<string>Xbox360Peripheral</string>
<key>IOKitDebug</key>
<integer>65535</integer>
<key>IOProviderClass</key>
<string>IOUSBDevice</string>
<key>idProduct</key>
<integer>49694</integer>
<key>idVendor</key>
<integer>1133</integer>
</dict>
<key>MadCatz360</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.mice.driver.Xbox360Controller</string>
<key>IOCFPlugInTypes</key>
<dict>
<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>
<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>
</dict>
<key>IOClass</key>
<string>Xbox360Peripheral</string>
<key>IOKitDebug</key>
<integer>65535</integer>
<key>IOProviderClass</key>
<string>IOUSBDevice</string>
<key>idProduct</key>
<integer>64769</integer>
<key>idVendor</key>
<integer>7085</integer>
</dict>
<key>MadCatzBeatPad</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.mice.driver.Xbox360Controller</string>
<key>IOCFPlugInTypes</key>
<dict>
<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>
<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>
</dict>
<key>IOClass</key>
<string>Xbox360Peripheral</string>
<key>IOKitDebug</key>
<integer>65535</integer>
<key>IOProviderClass</key>
<string>IOUSBDevice</string>
<key>idProduct</key>
<integer>18240</integer>
<key>idVendor</key>
<integer>1848</integer>
</dict>
<key>MadCatzCallofDutyGamePad</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.mice.driver.Xbox360Controller</string>
<key>IOCFPlugInTypes</key>
<dict>
<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>
<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>
</dict>
<key>IOClass</key>
<string>Xbox360Peripheral</string>
<key>IOKitDebug</key>
<integer>65535</integer>
<key>IOProviderClass</key>
<string>IOUSBDevice</string>
<key>idProduct</key>
<integer>61477</integer>
<key>idVendor</key>
<integer>7085</integer>
</dict>
<key>MadCatzFPSProGamePad</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.mice.driver.Xbox360Controller</string>
<key>IOCFPlugInTypes</key>
<dict>
<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>
<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>
</dict>
<key>IOClass</key>
<string>Xbox360Peripheral</string>
<key>IOKitDebug</key>
<integer>65535</integer>
<key>IOProviderClass</key>
<string>IOUSBDevice</string>
<key>idProduct</key>
<integer>61479</integer>
<key>idVendor</key>
<integer>7085</integer>
</dict>
<key>MadCatzGhostReconFSGamePad</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.mice.driver.Xbox360Controller</string>
<key>IOCFPlugInTypes</key>
<dict>
<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>
<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>
</dict>
<key>IOClass</key>
<string>Xbox360Peripheral</string>
<key>IOKitDebug</key>
<integer>65535</integer>
<key>IOProviderClass</key>
<string>IOUSBDevice</string>
<key>idProduct</key>
<integer>61473</integer>
<key>idVendor</key>
<integer>7085</integer>
</dict>
<key>MadCatzMicroConGamePadPro</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.mice.driver.Xbox360Controller</string>
<key>IOCFPlugInTypes</key>
<dict>
<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>
<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>
</dict>
<key>IOClass</key>
<string>Xbox360Peripheral</string>
<key>IOKitDebug</key>
<integer>65535</integer>
<key>IOProviderClass</key>
<string>IOUSBDevice</string>
<key>idProduct</key>
<integer>18230</integer>
<key>idVendor</key>
<integer>1848</integer>
</dict>
<key>MadCatzMicroConGamePadProZ</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.mice.driver.Xbox360Controller</string>
<key>IOCFPlugInTypes</key>
<dict>
<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>
<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>
</dict>
<key>IOClass</key>
<string>Xbox360Peripheral</string>
<key>IOKitDebug</key>
<integer>65535</integer>
<key>IOProviderClass</key>
<string>IOUSBDevice</string>
<key>idProduct</key>
<integer>61494</integer>
<key>idVendor</key>
<integer>7085</integer>
</dict>
<key>MadCatzPortableDrumKit</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.mice.driver.Xbox360Controller</string>
<key>IOCFPlugInTypes</key>
<dict>
<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>
<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>
</dict>
<key>IOClass</key>
<string>Xbox360Peripheral</string>
<key>IOKitDebug</key>
<integer>65535</integer>
<key>IOProviderClass</key>
<string>IOUSBDevice</string>
<key>idProduct</key>
<integer>39025</integer>
<key>idVendor</key>
<integer>1848</integer>
</dict>
<key>MadCatzStreetFighterIVFightPad</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.mice.driver.Xbox360Controller</string>
<key>IOCFPlugInTypes</key>
<dict>
<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>
<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>
</dict>
<key>IOClass</key>
<string>Xbox360Peripheral</string>
<key>IOKitDebug</key>
<integer>65535</integer>
<key>IOProviderClass</key>
<string>IOUSBDevice</string>
<key>idProduct</key>
<integer>18216</integer>
<key>idVendor</key>
<integer>1848</integer>
</dict>
<key>MadCatzStreetFighterIVFightStickSE</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.mice.driver.Xbox360Controller</string>
<key>IOCFPlugInTypes</key>
<dict>
<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>
<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>
</dict>
<key>IOClass</key>
<string>Xbox360Peripheral</string>
<key>IOKitDebug</key>
<integer>65535</integer>
<key>IOProviderClass</key>
<string>IOUSBDevice</string>
<key>idProduct</key>
<integer>18200</integer>
<key>idVendor</key>
<integer>1848</integer>
</dict>
<key>MadCatzXbox360Controller</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.mice.driver.Xbox360Controller</string>
<key>IOCFPlugInTypes</key>
<dict>
<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>
<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>
</dict>
<key>IOClass</key>
<string>Xbox360Peripheral</string>
<key>IOKitDebug</key>
<integer>65535</integer>
<key>IOProviderClass</key>
<string>IOUSBDevice</string>
<key>idProduct</key>
<integer>18198</integer>
<key>idVendor</key>
<integer>1848</integer>
</dict>
<key>MadCatzXbox360ControllerZ</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.mice.driver.Xbox360Controller</string>
<key>IOCFPlugInTypes</key>
<dict>
<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>
<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>
</dict>
<key>IOClass</key>
<string>Xbox360Peripheral</string>
<key>IOKitDebug</key>
<integer>65535</integer>
<key>IOProviderClass</key>
<string>IOUSBDevice</string>
<key>idProduct</key>
<integer>18214</integer>
<key>idVendor</key>
<integer>1848</integer>
</dict>
<key>MadCatzXbox360ControllerZZ</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.mice.driver.Xbox360Controller</string>
<key>IOCFPlugInTypes</key>
<dict>
<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>
<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>
</dict>
<key>IOClass</key>
<string>Xbox360Peripheral</string>
<key>IOKitDebug</key>
<integer>65535</integer>
<key>IOProviderClass</key>
<string>IOUSBDevice</string>
<key>idProduct</key>
<integer>48879</integer>
<key>idVendor</key>
<integer>1848</integer>
</dict>
<key>MadCatzXbox360ControllerZZZ</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.mice.driver.Xbox360Controller</string>
<key>IOCFPlugInTypes</key>
<dict>
<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>
<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>
</dict>
<key>IOClass</key>
<string>Xbox360Peripheral</string>
<key>IOKitDebug</key>
<integer>65535</integer>
<key>IOProviderClass</key>
<string>IOUSBDevice</string>
<key>idProduct</key>
<integer>61462</integer>
<key>idVendor</key>
<integer>7085</integer>
</dict>
<key>MadCatzXboxcontrollerMW2</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.mice.driver.Xbox360Controller</string>
<key>IOCFPlugInTypes</key>
<dict>
<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>
<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>
</dict>
<key>IOClass</key>
<string>Xbox360Peripheral</string>
<key>IOKitDebug</key>
<integer>65535</integer>
<key>IOProviderClass</key>
<string>IOUSBDevice</string>
<key>idProduct</key>
<integer>46886</integer>
<key>idVendor</key>
<integer>1848</integer>
</dict>
<key>MicrosoftXbox360Controller</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.mice.driver.Xbox360Controller</string>
<key>IOCFPlugInTypes</key>
<dict>
<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>
<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>
</dict>
<key>IOClass</key>
<string>Xbox360Peripheral</string>
<key>IOKitDebug</key>
<integer>65535</integer>
<key>IOProviderClass</key>
<string>IOUSBDevice</string>
<key>idProduct</key>
<integer>654</integer>
<key>idVendor</key>
<integer>1118</integer>
</dict>
<key>PDPAFTERGLOWAX1</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.mice.driver.Xbox360Controller</string>
<key>IOCFPlugInTypes</key>
<dict>
<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>
<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>
</dict>
<key>IOClass</key>
<string>Xbox360Peripheral</string>
<key>IOKitDebug</key>
<integer>65535</integer>
<key>IOProviderClass</key>
<string>IOUSBDevice</string>
<key>idProduct</key>
<integer>769</integer>
<key>idVendor</key>
<integer>4779</integer>
</dict>
<key>PDPDancePad</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.mice.driver.Xbox360Controller</string>
<key>IOCFPlugInTypes</key>
<dict>
<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>
<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>
</dict>
<key>IOClass</key>
<string>Xbox360Peripheral</string>
<key>IOKitDebug</key>
<integer>65535</integer>
<key>IOProviderClass</key>
<string>IOUSBDevice</string>
<key>idProduct</key>
<integer>261</integer>
<key>idVendor</key>
<integer>3695</integer>
</dict>
<key>PelicanTSZ360Pad</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.mice.driver.Xbox360Controller</string>
<key>IOCFPlugInTypes</key>
<dict>
<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>
<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>
</dict>
<key>IOClass</key>
<string>Xbox360Peripheral</string>
<key>IOKitDebug</key>
<integer>65535</integer>
<key>IOProviderClass</key>
<string>IOUSBDevice</string>
<key>idProduct</key>
<integer>513</integer>
<key>idVendor</key>
<integer>3695</integer>
</dict>
<key>PowerAMiniProElite</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.mice.driver.Xbox360Controller</string>
<key>IOCFPlugInTypes</key>
<dict>
<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>
<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>
</dict>
<key>IOClass</key>
<string>Xbox360Peripheral</string>
<key>IOKitDebug</key>
<integer>65535</integer>
<key>IOProviderClass</key>
<string>IOUSBDevice</string>
<key>idProduct</key>
<integer>16128</integer>
<key>idVendor</key>
<integer>5604</integer>
</dict>
<key>PowerAMiniProEliteGlow</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.mice.driver.Xbox360Controller</string>
<key>IOCFPlugInTypes</key>
<dict>
<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>
<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>
</dict>
<key>IOClass</key>
<string>Xbox360Peripheral</string>
<key>IOKitDebug</key>
<integer>65535</integer>
<key>IOProviderClass</key>
<string>IOUSBDevice</string>
<key>idProduct</key>
<integer>21248</integer>
<key>idVendor</key>
<integer>9414</integer>
</dict>
<key>REALARCADEPROEX</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.mice.driver.Xbox360Controller</string>
<key>IOCFPlugInTypes</key>
<dict>
<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>
<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>
</dict>
<key>IOClass</key>
<string>Xbox360Peripheral</string>
<key>IOKitDebug</key>
<integer>65535</integer>
<key>IOProviderClass</key>
<string>IOUSBDevice</string>
<key>idProduct</key>
<integer>62724</integer>
<key>idVendor</key>
<integer>7085</integer>
</dict>
<key>REALARCADEProVX</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.mice.driver.Xbox360Controller</string>
<key>IOCFPlugInTypes</key>
<dict>
<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>
<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>
</dict>
<key>IOClass</key>
<string>Xbox360Peripheral</string>
<key>IOKitDebug</key>
<integer>65535</integer>
<key>IOProviderClass</key>
<string>IOUSBDevice</string>
<key>idProduct</key>
<integer>62722</integer>
<key>idVendor</key>
<integer>7085</integer>
</dict>
<key>RazerOnza</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.mice.driver.Xbox360Controller</string>
<key>IOCFPlugInTypes</key>
<dict>
<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>
<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>
</dict>
<key>IOClass</key>
<string>Xbox360Peripheral</string>
<key>IOKitDebug</key>
<integer>65535</integer>
<key>IOProviderClass</key>
<string>IOUSBDevice</string>
<key>idProduct</key>
<integer>64768</integer>
<key>idVendor</key>
<integer>5769</integer>
</dict>
<key>RazerOnzaTournamentEdition</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.mice.driver.Xbox360Controller</string>
<key>IOCFPlugInTypes</key>
<dict>
<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>
<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>
</dict>
<key>IOClass</key>
<string>Xbox360Peripheral</string>
<key>IOKitDebug</key>
<integer>65535</integer>
<key>IOProviderClass</key>
<string>IOUSBDevice</string>
<key>idProduct</key>
<integer>64769</integer>
<key>idVendor</key>
<integer>5769</integer>
</dict>
<key>RedOctaneGuitarHeroXplorer</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.mice.driver.Xbox360Controller</string>
<key>IOCFPlugInTypes</key>
<dict>
<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>
<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>
</dict>
<key>IOClass</key>
<string>Xbox360Peripheral</string>
<key>IOKitDebug</key>
<integer>65535</integer>
<key>IOProviderClass</key>
<string>IOUSBDevice</string>
<key>idProduct</key>
<integer>18248</integer>
<key>idVendor</key>
<integer>5168</integer>
</dict>
<key>RockCandyGamepadforXbox360</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.mice.driver.Xbox360Controller</string>
<key>IOCFPlugInTypes</key>
<dict>
<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>
<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>
</dict>
<key>IOClass</key>
<string>Xbox360Peripheral</string>
<key>IOKitDebug</key>
<integer>65535</integer>
<key>IOProviderClass</key>
<string>IOUSBDevice</string>
<key>idProduct</key>
<integer>287</integer>
<key>idVendor</key>
<integer>3695</integer>
</dict>
<key>RockRevolutionforXbox360</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.mice.driver.Xbox360Controller</string>
<key>IOCFPlugInTypes</key>
<dict>
<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>
<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>
</dict>
<key>IOClass</key>
<string>Xbox360Peripheral</string>
<key>IOKitDebug</key>
<integer>65535</integer>
<key>IOProviderClass</key>
<string>IOUSBDevice</string>
<key>idProduct</key>
<integer>6</integer>
<key>idVendor</key>
<integer>4779</integer>
</dict>
<key>SaitekCyborgRumblePadPCXbox360</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.mice.driver.Xbox360Controller</string>
<key>IOCFPlugInTypes</key>
<dict>
<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>
<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>
</dict>
<key>IOClass</key>
<string>Xbox360Peripheral</string>
<key>IOKitDebug</key>
<integer>65535</integer>
<key>IOProviderClass</key>
<string>IOUSBDevice</string>
<key>idProduct</key>
<integer>51970</integer>
<key>idVendor</key>
<integer>1848</integer>
</dict>
<key>SaitekP3200RumblePadPCXbox360</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.mice.driver.Xbox360Controller</string>
<key>IOCFPlugInTypes</key>
<dict>
<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>
<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>
</dict>
<key>IOClass</key>
<string>Xbox360Peripheral</string>
<key>IOKitDebug</key>
<integer>65535</integer>
<key>IOProviderClass</key>
<string>IOUSBDevice</string>
<key>idProduct</key>
<integer>51971</integer>
<key>idVendor</key>
<integer>1848</integer>
</dict>
<key>StreetFighterIVFightPad</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.mice.driver.Xbox360Controller</string>
<key>IOCFPlugInTypes</key>
<dict>
<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>
<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>
</dict>
<key>IOClass</key>
<string>Xbox360Peripheral</string>
<key>IOKitDebug</key>
<integer>65535</integer>
<key>IOProviderClass</key>
<string>IOUSBDevice</string>
<key>idProduct</key>
<integer>61480</integer>
<key>idVendor</key>
<integer>7085</integer>
</dict>
<key>StreetFighterIVFightStickTE</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.mice.driver.Xbox360Controller</string>
<key>IOCFPlugInTypes</key>
<dict>
<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>
<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>
</dict>
<key>IOClass</key>
<string>Xbox360Peripheral</string>
<key>IOKitDebug</key>
<integer>65535</integer>
<key>IOProviderClass</key>
<string>IOUSBDevice</string>
<key>idProduct</key>
<integer>18232</integer>
<key>idVendor</key>
<integer>1848</integer>
</dict>
<key>SuperSFIVFightStickTES</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.mice.driver.Xbox360Controller</string>
<key>IOCFPlugInTypes</key>
<dict>
<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>
<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>
</dict>
<key>IOClass</key>
<string>Xbox360Peripheral</string>
<key>IOKitDebug</key>
<integer>65535</integer>
<key>IOProviderClass</key>
<string>IOUSBDevice</string>
<key>idProduct</key>
<integer>63288</integer>
<key>idVendor</key>
<integer>1848</integer>
</dict>
<key>TronXbox360controller</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.mice.driver.Xbox360Controller</string>
<key>IOCFPlugInTypes</key>
<dict>
<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>
<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>
</dict>
<key>IOClass</key>
<string>Xbox360Peripheral</string>
<key>IOKitDebug</key>
<integer>65535</integer>
<key>IOProviderClass</key>
<string>IOUSBDevice</string>
<key>idProduct</key>
<integer>63747</integer>
<key>idVendor</key>
<integer>7085</integer>
</dict>
<key>USBGamepad</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.mice.driver.Xbox360Controller</string>
<key>IOCFPlugInTypes</key>
<dict>
<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>
<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>
</dict>
<key>IOClass</key>
<string>Xbox360Peripheral</string>
<key>IOKitDebug</key>
<integer>65535</integer>
<key>IOProviderClass</key>
<string>IOUSBDevice</string>
<key>idProduct</key>
<integer>21760</integer>
<key>idVendor</key>
<integer>7085</integer>
</dict>
<key>XB360MortalKombatFightStick</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.mice.driver.Xbox360Controller</string>
<key>IOCFPlugInTypes</key>
<dict>
<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>
<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>
</dict>
<key>IOClass</key>
<string>Xbox360Peripheral</string>
<key>IOKitDebug</key>
<integer>65535</integer>
<key>IOProviderClass</key>
<string>IOUSBDevice</string>
<key>idProduct</key>
<integer>63750</integer>
<key>idVendor</key>
<integer>7085</integer>
</dict>
<key>XboxAirflowiredcontroller</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.mice.driver.Xbox360Controller</string>
<key>IOCFPlugInTypes</key>
<dict>
<key>F4545CE5-BF5B-11D6-A4BB-0003933E3E3E</key>
<string>360Controller.kext/Contents/PlugIns/Feedback360.plugin</string>
</dict>
<key>IOClass</key>
<string>Xbox360Peripheral</string>
<key>IOKitDebug</key>
<integer>65535</integer>
<key>IOProviderClass</key>
<string>IOUSBDevice</string>
<key>idProduct</key>
<integer>16138</integer>
<key>idVendor</key>
<integer>5604</integer>
</dict>
</dict>
<key>NSHumanReadableCopyright</key>
<string>Copyright © 2013 MICE Software. All rights reserved.</string>
<key>OSBundleLibraries</key>
<dict>
<key>com.apple.iokit.IOHIDFamily</key>
<string>1.2</string>
<key>com.apple.iokit.IOUSBFamily</key>
<string>1.8</string>
<key>com.apple.kpi.iokit</key>
<string>8.0.0</string>
<key>com.apple.kpi.libkern</key>
<string>8.0.0</string>
<key>com.apple.kpi.mach</key>
<string>8.0.0</string>
</dict>
</dict>
</plist>
================================================
FILE: 360Controller/_60Controller.cpp
================================================
/*
MICE Xbox 360 Controller driver for Mac OS X
Copyright (C) 2006-2013 Colin Munro
Bug fixes contributed by Cody "codeman38" Boisclair
_60Controller.cpp - main source of the driver
This file is part of Xbox360Controller.
Xbox360Controller is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
Xbox360Controller 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with Foobar; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <IOKit/IOLib.h>
#include <IOKit/IOMessage.h>
#include <IOKit/IOTimerEventSource.h>
#include "_60Controller.h"
#include "ControlStruct.h"
#include "ChatPad.h"
#include "Controller.h"
#define kDriverSettingKey "DeviceData"
#define kIOSerialDeviceType "Serial360Device"
OSDefineMetaClassAndStructors(Xbox360Peripheral, IOService)
#define super IOService
class LockRequired
{
private:
IOLock *_lock;
public:
LockRequired(IOLock *lock)
{
_lock = lock;
IOLockLock(_lock);
}
~LockRequired()
{
IOLockUnlock(_lock);
}
};
// Find the maximum packet size of this pipe
static UInt32 GetMaxPacketSize(IOUSBPipe *pipe)
{
const IOUSBEndpointDescriptor *ed;
ed=pipe->GetEndpointDescriptor();
if(ed==NULL) return 0;
else return ed->wMaxPacketSize;
}
void Xbox360Peripheral::SendSpecial(UInt16 value)
{
IOUSBDevRequest controlReq;
controlReq.bmRequestType = USBmakebmRequestType(kUSBOut, kUSBVendor, kUSBInterface);
controlReq.bRequest = 0x00;
controlReq.wValue = value;
controlReq.wIndex = 0x0002;
controlReq.wLength = 0;
controlReq.pData = NULL;
if (device->DeviceRequest(&controlReq, 100, 100, NULL) != kIOReturnSuccess)
IOLog("Failed to send special message %.4x\n", value);
}
void Xbox360Peripheral::SendInit(UInt16 value, UInt16 index)
{
IOUSBDevRequest controlReq;
controlReq.bmRequestType = USBmakebmRequestType(kUSBOut, kUSBVendor, kUSBDevice);
controlReq.bRequest = 0xa9;
controlReq.wValue = value;
controlReq.wIndex = index;
controlReq.wLength = 0;
controlReq.pData = NULL;
device->DeviceRequest(&controlReq, 100, 100, NULL); // Will fail - but device should still act on it
}
bool Xbox360Peripheral::SendSwitch(bool sendOut)
{
IOUSBDevRequest controlReq;
controlReq.bmRequestType = USBmakebmRequestType(sendOut ? kUSBOut : kUSBIn, kUSBVendor, kUSBDevice);
controlReq.bRequest = 0xa1;
controlReq.wValue = 0x0000;
controlReq.wIndex = 0xe416;
controlReq.wLength = sizeof(chatpadInit);
controlReq.pData = chatpadInit;
if (device->DeviceRequest(&controlReq, 100, 100, NULL) == kIOReturnSuccess)
return true;
IOLog("start - failed to %s chatpad setting\n", sendOut ? "write" : "read");
return false;
}
void Xbox360Peripheral::SendToggle(void)
{
SendSpecial(serialToggle ? 0x1F : 0x1E);
serialToggle = !serialToggle;
}
void Xbox360Peripheral::ChatPadTimerActionWrapper(OSObject *owner, IOTimerEventSource *sender)
{
Xbox360Peripheral *controller;
controller = OSDynamicCast(Xbox360Peripheral, owner);
controller->ChatPadTimerAction(sender);
}
void Xbox360Peripheral::ChatPadTimerAction(IOTimerEventSource *sender)
{
int nextTime, serialGot;
serialGot = 0;
nextTime = 1000;
switch (serialTimerState)
{
case tsToggle:
SendToggle();
if (serialActive)
{
if (!serialHeard)
{
serialActive = false;
serialGot = 2;
}
}
else
{
if (serialHeard)
{
serialTimerState = tsReset1;
serialResetCount = 0;
nextTime = 40;
}
}
break;
case tsMiniToggle:
SendToggle();
if (serialHeard)
{
serialTimerState = tsSet1;
nextTime = 40;
}
else
{
serialResetCount++;
if (serialResetCount > 3)
{
serialTimerState = tsToggle;
}
else
{
serialTimerState = tsReset1;
nextTime = 40;
}
}
break;
case tsReset1:
SendSpecial(0x1B);
serialTimerState = tsReset2;
nextTime = 35;
break;
case tsReset2:
SendSpecial(0x1B);
serialTimerState = tsMiniToggle;
nextTime = 150;
break;
case tsSet1:
SendSpecial(0x18);
serialTimerState = tsSet2;
nextTime = 10;
break;
case tsSet2:
SendSpecial(0x10);
serialTimerState = tsSet3;
nextTime = 10;
break;
case tsSet3:
SendSpecial(0x03);
serialTimerState = tsToggle;
nextTime = 940;
serialActive = true;
serialGot = 1;
break;
}
sender->setTimeoutMS(nextTime); // Todo: Make it take into account function execution time?
serialHeard = false;
// Make it happen after the timer's set, for minimum impact
switch (serialGot)
{
case 1:
SerialConnect();
break;
case 2:
SerialDisconnect();
break;
default:
break;
}
}
// Read the settings from the registry
void Xbox360Peripheral::readSettings(void)
{
OSDictionary *dataDictionary;
OSBoolean *value;
OSNumber *number;
dataDictionary=OSDynamicCast(OSDictionary,getProperty(kDriverSettingKey));
if(dataDictionary==NULL) return;
value=OSDynamicCast(OSBoolean,dataDictionary->getObject("InvertLeftX"));
if(value!=NULL) invertLeftX=value->getValue();
value=OSDynamicCast(OSBoolean,dataDictionary->getObject("InvertLeftY"));
if(value!=NULL) invertLeftY=value->getValue();
value=OSDynamicCast(OSBoolean,dataDictionary->getObject("InvertRightX"));
if(value!=NULL) invertRightX=value->getValue();
value=OSDynamicCast(OSBoolean,dataDictionary->getObject("InvertRightY"));
if(value!=NULL) invertRightY=value->getValue();
number=OSDynamicCast(OSNumber,dataDictionary->getObject("DeadzoneLeft"));
if(number!=NULL) deadzoneLeft=number->unsigned32BitValue();
number=OSDynamicCast(OSNumber,dataDictionary->getObject("DeadzoneRight"));
if(number!=NULL) deadzoneRight=number->unsigned32BitValue();
value=OSDynamicCast(OSBoolean,dataDictionary->getObject("RelativeLeft"));
if(value!=NULL) relativeLeft=value->getValue();
value=OSDynamicCast(OSBoolean,dataDictionary->getObject("RelativeRight"));
if(value!=NULL) relativeRight=value->getValue();
/*
IOLog("Xbox360Peripheral preferences loaded:\n invertLeft X: %s, Y: %s\n invertRight X: %s, Y:%s\n deadzone Left: %d, Right: %d\n\n",
invertLeftX?"True":"False",invertLeftY?"True":"False",
invertRightX?"True":"False",invertRightY?"True":"False",
deadzoneLeft,deadzoneRight);
*/
}
// Initialise the extension
bool Xbox360Peripheral::init(OSDictionary *propTable)
{
bool res=super::init(propTable);
mainLock = IOLockAlloc();
device=NULL;
interface=NULL;
inPipe=NULL;
outPipe=NULL;
inBuffer=NULL;
padHandler = NULL;
serialIn = NULL;
serialInPipe = NULL;
serialInBuffer = NULL;
serialTimer = NULL;
serialHandler = NULL;
// Default settings
invertLeftX=invertLeftY=FALSE;
invertRightX=invertRightY=FALSE;
deadzoneLeft=deadzoneRight=0;
relativeLeft=relativeRight=FALSE;
// Done
return res;
}
// Free the extension
void Xbox360Peripheral::free(void)
{
IOLockFree(mainLock);
super::free();
}
bool Xbox360Peripheral::start(IOService *provider)
{
const IOUSBConfigurationDescriptor *cd;
IOUSBFindInterfaceRequest intf;
IOUSBFindEndpointRequest pipe;
XBOX360_OUT_LED led;
IOWorkLoop *workloop = NULL;
if (!super::start(provider))
return false;
// Get device
device=OSDynamicCast(IOUSBDevice,provider);
if(device==NULL) {
IOLog("start - invalid provider\n");
goto fail;
}
// Check for configurations
if(device->GetNumConfigurations()<1) {
device=NULL;
IOLog("start - device has no configurations!\n");
goto fail;
}
// Set configuration
cd=device->GetFullConfigurationDescriptor(0);
if(cd==NULL) {
device=NULL;
IOLog("start - couldn't get configuration descriptor\n");
goto fail;
}
// Open
if(!device->open(this)) {
device=NULL;
IOLog("start - unable to open device\n");
goto fail;
}
if(device->SetConfiguration(this,cd->bConfigurationValue,true)!=kIOReturnSuccess) {
IOLog("start - unable to set configuration\n");
goto fail;
}
// Get release
{
UInt16 release = device->GetDeviceRelease();
switch (release) {
default:
IOLog("Unknown device release %.4x", release);
// fall through
case 0x0110:
chatpadInit[0] = 0x01;
chatpadInit[1] = 0x02;
break;
case 0x0114:
chatpadInit[0] = 0x09;
chatpadInit[1] = 0x00;
break;
}
}
// Find correct interface
intf.bInterfaceClass=kIOUSBFindInterfaceDontCare;
intf.bInterfaceSubClass=93;
intf.bInterfaceProtocol=1;
intf.bAlternateSetting=kIOUSBFindInterfaceDontCare;
interface=device->FindNextInterface(NULL,&intf);
if(interface==NULL) {
IOLog("start - unable to find the interface\n");
goto fail;
}
interface->open(this);
// Find pipes
pipe.direction=kUSBIn;
pipe.interval=0;
pipe.type=kUSBInterrupt;
pipe.maxPacketSize=0;
inPipe=interface->FindNextPipe(NULL,&pipe);
if(inPipe==NULL) {
IOLog("start - unable to find in pipe\n");
goto fail;
}
inPipe->retain();
pipe.direction=kUSBOut;
outPipe=interface->FindNextPipe(NULL,&pipe);
if(outPipe==NULL) {
IOLog("start - unable to find out pipe\n");
goto fail;
}
outPipe->retain();
// Get a buffer
inBuffer=IOBufferMemoryDescriptor::inTaskWithOptions(kernel_task,0,GetMaxPacketSize(inPipe));
if(inBuffer==NULL) {
IOLog("start - failed to allocate input buffer\n");
goto fail;
}
// Find chatpad interface
intf.bInterfaceClass = kIOUSBFindInterfaceDontCare;
intf.bInterfaceSubClass = 93;
intf.bInterfaceProtocol = 2;
intf.bAlternateSetting = kIOUSBFindInterfaceDontCare;
serialIn = device->FindNextInterface(NULL, &intf);
if (serialIn == NULL) {
IOLog("start - unable to find chatpad interface\n");
goto nochat;
}
serialIn->open(this);
// Find chatpad pipe
pipe.direction = kUSBIn;
pipe.interval = 0;
pipe.type = kUSBInterrupt;
pipe.maxPacketSize = 0;
serialInPipe = serialIn->FindNextPipe(NULL, &pipe);
if (serialInPipe == NULL)
{
IOLog("start - unable to find chatpad in pipe\n");
goto fail;
}
serialInPipe->retain();
// Get a buffer for the chatpad
serialInBuffer = IOBufferMemoryDescriptor::inTaskWithOptions(kernel_task, 0, GetMaxPacketSize(serialInPipe));
if (serialInBuffer == NULL)
{
IOLog("start - failed to allocate input buffer for chatpad\n");
goto fail;
}
// Create timer for chatpad
serialTimer = IOTimerEventSource::timerEventSource(this, ChatPadTimerActionWrapper);
if (serialTimer == NULL)
{
IOLog("start - failed to create timer for chatpad\n");
goto fail;
}
workloop = getWorkLoop();
if ((workloop == NULL) || (workloop->addEventSource(serialTimer) != kIOReturnSuccess))
{
IOLog("start - failed to connect timer for chatpad\n");
goto fail;
}
// Configure ChatPad
// Send 'configuration'
SendInit(0xa30c, 0x4423);
SendInit(0x2344, 0x7f03);
SendInit(0x5839, 0x6832);
// Set 'switch'
if ((!SendSwitch(false)) || (!SendSwitch(true)) || (!SendSwitch(false)))
goto fail;
// Begin toggle
serialHeard = false;
serialActive = false;
serialToggle = false;
serialResetCount = 0;
serialTimerState = tsToggle;
serialTimer->setTimeoutMS(1000);
// Begin reading
if (!QueueSerialRead())
goto fail;
nochat:
if (!QueueRead())
goto fail;
// Disable LED
Xbox360_Prepare(led,outLed);
led.pattern=ledOff;
QueueWrite(&led,sizeof(led));
// Done
PadConnect();
registerService();
return true;
fail:
ReleaseAll();
return false;
}
// Set up an asynchronous read
bool Xbox360Peripheral::QueueRead(void)
{
IOUSBCompletion complete;
IOReturn err;
if ((inPipe == NULL) || (inBuffer == NULL))
return false;
complete.target=this;
complete.action=ReadCompleteInternal;
complete.parameter=inBuffer;
err=inPipe->Read(inBuffer,0,0,inBuffer->getLength(),&complete);
if(err==kIOReturnSuccess) return true;
else {
IOLog("read - failed to start (0x%.8x)\n",err);
return false;
}
}
bool Xbox360Peripheral::QueueSerialRead(void)
{
IOUSBCompletion complete;
IOReturn err;
if ((serialInPipe == NULL) || (serialInBuffer == NULL))
return false;
complete.target = this;
complete.action = SerialReadCompleteInternal;
complete.parameter = serialInBuffer;
err = serialInPipe->Read(serialInBuffer, 0, 0, serialInBuffer->getLength(), &complete);
if (err == kIOReturnSuccess)
{
return true;
}
else
{
IOLog("read - failed to start for chatpad (0x%.8x)\n",err);
return false;
}
}
// Set up an asynchronous write
bool Xbox360Peripheral::QueueWrite(const void *bytes,UInt32 length)
{
IOBufferMemoryDescriptor *outBuffer;
IOUSBCompletion complete;
IOReturn err;
outBuffer=IOBufferMemoryDescriptor::inTaskWithOptions(kernel_task,0,length);
if(outBuffer==NULL) {
IOLog("send - unable to allocate buffer\n");
return false;
}
outBuffer->writeBytes(0,bytes,length);
complete.target=this;
complete.action=WriteCompleteInternal;
complete.parameter=outBuffer;
err=outPipe->Write(outBuffer,0,0,length,&complete);
if(err==kIOReturnSuccess) return true;
else {
IOLog("send - failed to start (0x%.8x)\n",err);
return false;
}
}
void Xbox360Peripheral::stop(IOService *provider)
{
ReleaseAll();
super::stop(provider);
}
// Releases all the objects used
void Xbox360Peripheral::ReleaseAll(void)
{
LockRequired locker(mainLock);
SerialDisconnect();
PadDisconnect();
if (serialTimer != NULL)
{
serialTimer->cancelTimeout();
getWorkLoop()->removeEventSource(serialTimer);
serialTimer->release();
serialTimer = NULL;
}
if (serialInPipe != NULL)
{
serialInPipe->Abort();
serialInPipe->release();
serialInPipe = NULL;
}
if (serialInBuffer != NULL)
{
serialInBuffer->release();
serialInBuffer = NULL;
}
if (serialIn != NULL)
{
serialIn->close(this);
serialIn = NULL;
}
if(outPipe!=NULL) {
outPipe->Abort();
outPipe->release();
outPipe=NULL;
}
if(inPipe!=NULL) {
inPipe->Abort();
inPipe->release();
inPipe=NULL;
}
if(inBuffer!=NULL) {
inBuffer->release();
inBuffer=NULL;
}
if(interface!=NULL) {
interface->close(this);
interface=NULL;
}
if(device!=NULL) {
device->close(this);
device=NULL;
}
}
// Handle message sent to the driver
IOReturn Xbox360Peripheral::message(UInt32 type,IOService *provider,void *argument)
{
switch(type) {
case kIOMessageServiceIsTerminated:
case kIOMessageServiceIsRequestingClose:
if(device->isOpen(this)) ReleaseAll();
return kIOReturnSuccess;
default:
return super::message(type,provider,argument);
}
}
// This returns the abs() value of a short, swapping it if necessary
static inline XBox360_SShort getAbsolute(XBox360_SShort value)
{
XBox360_SShort reverse;
#ifdef __LITTLE_ENDIAN__
reverse=value;
#elif __BIG_ENDIAN__
reverse=((value&0xFF00)>>8)|((value&0x00FF)<<8);
#else
#error Unknown CPU byte order
#endif
return (reverse<0)?~reverse:reverse;
}
// Adjusts the report for any settings speciified by the user
void Xbox360Peripheral::fiddleReport(IOBufferMemoryDescriptor *buffer)
{
XBOX360_IN_REPORT *report=(XBOX360_IN_REPORT*)buffer->getBytesNoCopy();
if(invertLeftX) report->left.x=~report->left.x;
if(!invertLeftY) report->left.y=~report->left.y;
if(invertRightX) report->right.x=~report->right.x;
if(!invertRightY) report->right.y=~report->right.y;
if(deadzoneLeft!=0) {
if(relativeLeft) {
if((getAbsolute(report->left.x)<deadzoneLeft)&&(getAbsolute(report->left.y)<deadzoneLeft)) {
report->left.x=0;
report->left.y=0;
}
} else {
if(getAbsolute(report->left.x)<deadzoneLeft) report->left.x=0;
if(getAbsolute(report->left.y)<deadzoneLeft) report->left.y=0;
}
}
if(deadzoneRight!=0) {
if(relativeRight) {
if((getAbsolute(report->right.x)<deadzoneRight)&&(getAbsolute(report->right.y)<deadzoneRight)) {
report->right.x=0;
report->right.y=0;
}
} else {
if(getAbsolute(report->right.x)<deadzoneRight) report->right.x=0;
if(getAbsolute(report->right.y)<deadzoneRight) report->right.y=0;
}
}
}
// This forwards a completed read notification to a member function
void Xbox360Peripheral::ReadCompleteInternal(void *target,void *parameter,IOReturn status,UInt32 bufferSizeRemaining)
{
if(target!=NULL)
((Xbox360Peripheral*)target)->ReadComplete(parameter,status,bufferSizeRemaining);
}
void Xbox360Peripheral::SerialReadCompleteInternal(void *target, void *parameter, IOReturn status, UInt32 bufferSizeRemaining)
{
if (target != NULL)
((Xbox360Peripheral*)target)->SerialReadComplete(parameter, status, bufferSizeRemaining);
}
// This forwards a completed write notification to a member function
void Xbox360Peripheral::WriteCompleteInternal(void *target,void *parameter,IOReturn status,UInt32 bufferSizeRemaining)
{
if(target!=NULL)
((Xbox360Peripheral*)target)->WriteComplete(parameter,status,bufferSizeRemaining);
}
// This handles a completed asynchronous read
void Xbox360Peripheral::ReadComplete(void *parameter,IOReturn status,UInt32 bufferSizeRemaining)
{
if (padHandler != NULL) // avoid deadlock with release
{
LockRequired locker(mainLock);
IOReturn err;
bool reread=!isInactive();
switch(status) {
case kIOReturnOverrun:
IOLog("read - kIOReturnOverrun, clearing stall\n");
if (inPipe != NULL)
inPipe->ClearStall();
// Fall through
case kIOReturnSuccess:
if (inBuffer != NULL)
{
const XBOX360_IN_REPORT *report=(const XBOX360_IN_REPORT*)inBuffer->getBytesNoCopy();
if((report->header.command==inReport)&&(report->header.size==sizeof(XBOX360_IN_REPORT))) {
fiddleReport(inBuffer);
err = padHandler->handleReport(inBuffer, kIOHIDReportTypeInput);
if(err!=kIOReturnSuccess) {
IOLog("read - failed to handle report: 0x%.8x\n",err);
}
}
}
break;
case kIOReturnNotResponding:
IOLog("read - kIOReturnNotResponding\n");
reread=false;
break;
default:
reread=false;
break;
}
if(reread) QueueRead();
}
}
void Xbox360Peripheral::SerialReadComplete(void *parameter, IOReturn status, UInt32 bufferSizeRemaining)
{
if (padHandler != NULL) // avoid deadlock with release
{
LockRequired locker(mainLock);
bool reread = !isInactive();
switch (status)
{
case kIOReturnOverrun:
IOLog("read (serial) - kIOReturnOverrun, clearing stall\n");
if (serialInPipe != NULL)
serialInPipe->ClearStall();
// Fall through
case kIOReturnSuccess:
serialHeard = true;
if (serialInBuffer != NULL)
SerialMessage(serialInBuffer, serialInBuffer->getCapacity() - bufferSizeRemaining);
break;
case kIOReturnNotResponding:
IOLog("read (serial) - kIOReturnNotResponding\n");
reread = false;
break;
default:
reread = false;
break;
}
if (reread)
QueueSerialRead();
}
}
// Handle a completed asynchronous write
void Xbox360Peripheral::WriteComplete(void *parameter,IOReturn status,UInt32 bufferSizeRemaining)
{
IOMemoryDescriptor *memory=(IOMemoryDescriptor*)parameter;
if(status!=kIOReturnSuccess) {
IOLog("write - Error writing: 0x%.8x\n",status);
}
memory->release();
}
// Called by the userspace IORegistryEntrySetCFProperties function
IOReturn Xbox360Peripheral::setProperties(OSObject *properties)
{
OSDictionary *dictionary;
dictionary=OSDynamicCast(OSDictionary,properties);
if(dictionary!=NULL) {
setProperty(kDriverSettingKey,dictionary);
readSettings();
return kIOReturnSuccess;
} else return kIOReturnBadArgument;
}
IOHIDDevice* Xbox360Peripheral::getController(int index)
{
switch (index)
{
case 0:
return padHandler;
case 1:
return serialHandler;
default:
return NULL;
}
}
// Main controller support
void Xbox360Peripheral::PadConnect(void)
{
PadDisconnect();
padHandler = new Xbox360ControllerClass;
if (padHandler != NULL)
{
const OSString *keys[] = {
OSString::withCString(kIOSerialDeviceType),
OSString::withCString("IOCFPlugInTypes"),
OSString::withCString("IOKitDebug"),
};
const OSObject *objects[] = {
OSNumber::withNumber((unsigned long long)1, 32),
getProperty("IOCFPlugInTypes"),
OSNumber::withNumber((unsigned long long)65535, 32),
};
OSDictionary *dictionary = OSDictionary::withObjects(objects, keys, sizeof(keys) / sizeof(keys[0]), 0);
if (padHandler->init(dictionary))
{
padHandler->attach(this);
padHandler->start(this);
}
else
{
padHandler->release();
padHandler = NULL;
}
}
}
void Xbox360Peripheral::PadDisconnect(void)
{
if (padHandler != NULL)
{
padHandler->terminate(kIOServiceRequired | kIOServiceSynchronous);
padHandler->release();
padHandler = NULL;
}
}
// Serial peripheral support
void Xbox360Peripheral::SerialConnect(void)
{
SerialDisconnect();
serialHandler = new ChatPadKeyboardClass;
if (serialHandler != NULL)
{
const OSString *keys[] = {
OSString::withCString(kIOSerialDeviceType),
};
const OSObject *objects[] = {
OSNumber::withNumber((unsigned long long)0, 32),
};
OSDictionary *dictionary = OSDictionary::withObjects(objects, keys, sizeof(keys) / sizeof(keys[0]), 0);
if (serialHandler->init(dictionary))
{
serialHandler->attach(this);
serialHandler->start(this);
}
else
{
serialHandler->release();
serialHandler = NULL;
}
}
}
void Xbox360Peripheral::SerialDisconnect(void)
{
if (serialHandler != NULL)
{
// Hope it's okay to terminate twice...
serialHandler->terminate(kIOServiceRequired | kIOServiceSynchronous);
serialHandler->release();
serialHandler = NULL;
}
}
void Xbox360Peripheral::SerialMessage(IOBufferMemoryDescriptor *data, size_t length)
{
if (serialHandler != NULL)
{
char *buffer = (char*)data->getBytesNoCopy();
if ((length == 5) && (buffer[0] == 0x00))
serialHandler->handleReport(data, kIOHIDReportTypeInput);
}
}
================================================
FILE: 360Controller/_60Controller.h
================================================
/*
MICE Xbox 360 Controller driver for Mac OS X
Copyright (C) 2006-2013 Colin Munro
_60Controller.h - declaration of the driver main class
This file is part of Xbox360Controller.
Xbox360Controller is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
Xbox360Controller 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with Foobar; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef __XBOX360CONTROLLER_H__
#define __XBOX360CONTROLLER_H__
#include <IOKit/hid/IOHIDDevice.h>
#include <IOKit/usb/IOUSBDevice.h>
#include <IOKit/usb/IOUSBInterface.h>
class Xbox360ControllerClass;
class ChatPadKeyboardClass;
class Xbox360Peripheral : public IOService
{
OSDeclareDefaultStructors(Xbox360Peripheral)
private:
void ReleaseAll(void);
bool QueueRead(void);
bool QueueSerialRead(void);
static void SerialReadCompleteInternal(void *target,void *parameter,IOReturn status,UInt32 bufferSizeRemaining);
static void ReadCompleteInternal(void *target,void *parameter,IOReturn status,UInt32 bufferSizeRemaining);
static void WriteCompleteInternal(void *target,void *parameter,IOReturn status,UInt32 bufferSizeRemaining);
void SerialReadComplete(void *parameter, IOReturn status, UInt32 bufferSizeRemaining);
void fiddleReport(IOBufferMemoryDescriptor *buffer);
void readSettings(void);
static void ChatPadTimerActionWrapper(OSObject *owner, IOTimerEventSource *sender);
void ChatPadTimerAction(IOTimerEventSource *sender);
void SendToggle(void);
void SendSpecial(UInt16 value);
void SendInit(UInt16 value, UInt16 index);
bool SendSwitch(bool sendOut);
void PadConnect(void);
void PadDisconnect(void);
void SerialConnect(void);
void SerialDisconnect(void);
void SerialMessage(IOBufferMemoryDescriptor *data, size_t length);
protected:
typedef enum {
tsToggle,
tsReset1,
tsReset2,
tsMiniToggle,
tsSet1,
tsSet2,
tsSet3,
} TIMER_STATE;
IOUSBDevice *device;
IOLock *mainLock;
// Joypad
IOUSBInterface *interface;
IOUSBPipe *inPipe,*outPipe;
IOBufferMemoryDescriptor *inBuffer;
// Keyboard
IOUSBInterface *serialIn;
IOUSBPipe *serialInPipe;
IOBufferMemoryDescriptor *serialInBuffer;
IOTimerEventSource *serialTimer;
bool serialToggle, serialHeard, serialActive;
int serialResetCount;
TIMER_STATE serialTimerState;
ChatPadKeyboardClass *serialHandler;
Xbox360ControllerClass *padHandler;
UInt8 chatpadInit[2];
// Settings
bool invertLeftX,invertLeftY;
bool invertRightX,invertRightY;
short deadzoneLeft,deadzoneRight;
bool relativeLeft,relativeRight;
public:
// this is from the IORegistryEntry - no provider yet
virtual bool init(OSDictionary *propTable);
virtual void free(void);
bool start(IOService *provider);
void stop(IOService *provider);
// IOKit methods. These methods are defines in <IOKit/IOService.h>
virtual IOReturn setProperties(OSObject *properties);
virtual IOReturn message(UInt32 type, IOService *provider, void *argument);
// Hooks
virtual void ReadComplete(void *parameter,IOReturn status,UInt32 bufferSizeRemaining);
virtual void WriteComplete(void *parameter,IOReturn status,UInt32 bufferSizeRemaining);
bool QueueWrite(const void *bytes,UInt32 length);
IOHIDDevice* getController(int index);
};
#endif /* __XBOX360CONTROLLER_H__ */
================================================
FILE: 360Controller/chatpadhid.h
================================================
/*
MICE Xbox 360 Controller driver for Mac OS X
Copyright (C) 2006-2013 Colin Munro
chatpadhid.h - a HID descriptor for the Microsoft ChatPad accessory
This file is part of Xbox360Controller.
Xbox360Controller is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
Xbox360Controller 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with Foobar; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
// F:\Documents and Settings\Desktop\hid\ChatPad_Keyboard.h
char ReportDescriptor[58] = {
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x06, // USAGE (Keyboard)
0xa1, 0x01, // COLLECTION (Application)
0x25, 0x00, // LOGICAL_MAXIMUM (0)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x75, 0x08, // REPORT_SIZE (8)
0x95, 0x01, // REPORT_COUNT (1)
0x81, 0x03, // INPUT (Cnst,Var,Abs)
0x05, 0x07, // USAGE_PAGE (Keyboard)
0x09, 0xe1, // USAGE (Keyboard LeftShift)
0x09, 0xe0, // USAGE (Keyboard LeftControl)
0x09, 0xe2, // USAGE (Keyboard LeftAlt)
0x09, 0xe3, // USAGE (Keyboard Left GUI)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x75, 0x01, // REPORT_SIZE (1)
0x95, 0x04, // REPORT_COUNT (4)
0x81, 0x02, // INPUT (Data,Var,Abs)
0x75, 0x01, // REPORT_SIZE (1)
0x95, 0x04, // REPORT_COUNT (4)
0x81, 0x03, // INPUT (Cnst,Var,Abs)
0x95, 0x03, // REPORT_COUNT (3)
0x75, 0x08, // REPORT_SIZE (8)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x26, 0xe7, 0x00, // LOGICAL_MAXIMUM (231)
0x19, 0x00, // USAGE_MINIMUM (Reserved (no event indicated))
0x29, 0xe7, // USAGE_MAXIMUM (Keyboard Right GUI)
0x81, 0x00, // INPUT (Data,Ary,Abs)
0xc0 // END_COLLECTION
};
================================================
FILE: 360Controller/chatpadkeys.cpp
================================================
/*
MICE Xbox 360 Controller driver for Mac OS X
Copyright (C) 2006-2013 Colin Munro
chatpadkeys.cpp - Converts a chatpad scancode to a USB key value
This file is part of Xbox360Controller.
Xbox360Controller is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
Xbox360Controller 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with Foobar; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "chatpadkeys.h"
#define ROW_SIZE 8
typedef struct MAP_DATA {
unsigned char row[ROW_SIZE];
} MAP_DATA;
static const MAP_DATA columns[] = {
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x00, 0x24, 0x23, 0x22, 0x21, 0x20, 0x1F, 0x1E},
{0x00, 0x18, 0x1C, 0x17, 0x15, 0x08, 0x1A, 0x14},
{0x00, 0x0D, 0x0B, 0x0A, 0x09, 0x07, 0x16, 0x04},
{0x00, 0x11, 0x05, 0x19, 0x06, 0x1B, 0x1D, 0x00},
{0x00, 0x4F, 0x10, 0x37, 0x2C, 0x50, 0x00, 0x00},
{0x00, 0x00, 0x36, 0x28, 0x13, 0x27, 0x26, 0x25},
{0x00, 0x2A, 0x0F, 0x00, 0x00, 0x12, 0x0C, 0x0E},
};
unsigned char ChatPad2USB(unsigned char input)
{
unsigned char row, column;
row = input & 0x0F;
if (row >= ROW_SIZE)
return 0x00;
column = (input & 0xF0) >> 4;
if (column >= (sizeof(columns) / sizeof(columns[0])))
return 0x00;
return columns[column].row[row];
}
================================================
FILE: 360Controller/chatpadkeys.h
================================================
/*
MICE Xbox 360 Controller driver for Mac OS X
Copyright (C) 2006-2013 Colin Munro
chatpadkeys.h - public functions of the ChatPad key handling
This file is part of Xbox360Controller.
Xbox360Controller is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
Xbox360Controller 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with Foobar; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
unsigned char ChatPad2USB(unsigned char input);
================================================
FILE: 360Controller/version.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>BuildVersion</key>
<string>12</string>
<key>CFBundleVersion</key>
<string>1.0</string>
<key>ProductBuildVersion</key>
<string>7K571</string>
<key>ProjectName</key>
<string>DevToolsWizardTemplates</string>
<key>SourceVersion</key>
<string>3870000</string>
</dict>
</plist>
================================================
FILE: 360Controller/xbox360hid.h
================================================
/*
MICE Xbox 360 Controller driver for Mac OS X
Copyright (C) 2006-2013 Colin Munro
xbox360hid.h - HID descriptor for the driver
This file is part of Xbox360Controller.
Xbox360Controller is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
Xbox360Controller 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with Foobar; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
/*
* This descriptor was generated using the USB HID definition tool available
* from the USB people's website. It's not quite the same as the HID descriptor
* on the free60.org site as I created this file before I knew about it and
* just kept working with this one anyway :)
*/
char ReportDescriptor[196] = {
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x05, // USAGE (Game Pad)
0xa1, 0x01, // COLLECTION (Application)
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x3a, // USAGE (Counted Buffer)
0xa1, 0x02, // COLLECTION (Logical)
0x75, 0x08, // REPORT_SIZE (8)
0x95, 0x02, // REPORT_COUNT (2)
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x3f, // USAGE (Reserved)
0x09, 0x3b, // USAGE (Byte Count)
0x81, 0x01, // INPUT (Cnst,Ary,Abs)
0x75, 0x01, // REPORT_SIZE (1)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x35, 0x00, // PHYSICAL_MINIMUM (0)
0x45, 0x01, // PHYSICAL_MAXIMUM (1)
0x95, 0x04, // REPORT_COUNT (4)
0x05, 0x09, // USAGE_PAGE (Button)
0x19, 0x0c, // USAGE_MINIMUM (Button 12)
0x29, 0x0f, // USAGE_MAXIMUM (Button 15)
0x81, 0x02, // INPUT (Data,Var,Abs)
0x75, 0x01, // REPORT_SIZE (1)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x35, 0x00, // PHYSICAL_MINIMUM (0)
0x45, 0x01, // PHYSICAL_MAXIMUM (1)
0x95, 0x04, // REPORT_COUNT (4)
0x05, 0x09, // USAGE_PAGE (Button)
0x09, 0x09, // USAGE (Button 9)
0x09, 0x0a, // USAGE (Button 10)
0x09, 0x07, // USAGE (Button 7)
0x09, 0x08, // USAGE (Button 8)
0x81, 0x02, // INPUT (Data,Var,Abs)
0x75, 0x01, // REPORT_SIZE (1)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x35, 0x00, // PHYSICAL_MINIMUM (0)
0x45, 0x01, // PHYSICAL_MAXIMUM (1)
0x95, 0x03, // REPORT_COUNT (3)
0x05, 0x09, // USAGE_PAGE (Button)
0x09, 0x05, // USAGE (Button 5)
0x09, 0x06, // USAGE (Button 6)
0x09, 0x0b, // USAGE (Button 11)
0x81, 0x02, // INPUT (Data,Var,Abs)
0x75, 0x01, // REPORT_SIZE (1)
0x95, 0x01, // REPORT_COUNT (1)
0x81, 0x01, // INPUT (Cnst,Ary,Abs)
0x75, 0x01, // REPORT_SIZE (1)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x35, 0x00, // PHYSICAL_MINIMUM (0)
0x45, 0x01, // PHYSICAL_MAXIMUM (1)
0x95, 0x04, // REPORT_COUNT (4)
0x05, 0x09, // USAGE_PAGE (Button)
0x19, 0x01, // USAGE_MINIMUM (Button 1)
0x29, 0x04, // USAGE_MAXIMUM (Button 4)
0x81, 0x02, // INPUT (Data,Var,Abs)
0x75, 0x08, // REPORT_SIZE (8)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (255)
0x35, 0x00, // PHYSICAL_MINIMUM (0)
0x46, 0xff, 0x00, // PHYSICAL_MAXIMUM (255)
0x95, 0x02, // REPORT_COUNT (2)
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x32, // USAGE (Z)
0x09, 0x35, // USAGE (Rz)
0x81, 0x02, // INPUT (Data,Var,Abs)
0x75, 0x10, // REPORT_SIZE (16)
0x16, 0x00, 0x80, // LOGICAL_MINIMUM (-32768)
0x26, 0xff, 0x7f, // LOGICAL_MAXIMUM (32767)
0x36, 0x00, 0x80, // PHYSICAL_MINIMUM (-32768)
0x46, 0xff, 0x7f, // PHYSICAL_MAXIMUM (32767)
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x01, // USAGE (Pointer)
0xa1, 0x00, // COLLECTION (Physical)
0x95, 0x02, // REPORT_COUNT (2)
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x30, // USAGE (X)
0x09, 0x31, // USAGE (Y)
0x81, 0x02, // INPUT (Data,Var,Abs)
0xc0, // END_COLLECTION
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x01, // USAGE (Pointer)
0xa1, 0x00, // COLLECTION (Physical)
0x95, 0x02, // REPORT_COUNT (2)
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x33, // USAGE (Rx)
0x09, 0x34, // USAGE (Ry)
0x81, 0x02, // INPUT (Data,Var,Abs)
0xc0, // END_COLLECTION
0xc0, // END_COLLECTION
0xc0 // END_COLLECTION
};
================================================
FILE: 360Daemon/360Daemon.1
================================================
.\"Modified from man(1) of FreeBSD, the NetBSD mdoc.template, and mdoc.samples.
.\"See Also:
.\"man mdoc.samples for a complete listing of options
.\"man mdoc for the short list of editing options
.\"/usr/share/misc/mdoc.template
.Dd 7/8/07 \" DATE
.Dt 360Daemon 1 \" Program name and manual section number
.Os Darwin
.Sh NAME \" Section Header - required - don't modify
.Nm 360Daemon,
.\" The following lines are read in generating the apropos(man -k) database. Use only key
.\" words here as the database is built based on the words here and in the .ND line.
.Nm Other_name_for_same_program(),
.Nm Yet another name for the same program.
.\" Use .Nm macro to designate other names for the documented program.
.Nd This line parsed for whatis database.
.Sh SYNOPSIS \" Section Header - required - don't modify
.Nm
.Op Fl abcd \" [-abcd]
.Op Fl a Ar path \" [-a path]
.Op Ar file \" [file]
.Op Ar \" [file ...]
.Ar arg0 \" Underlined argument - use .Ar anywhere to underline
arg2 ... \" Arguments
.Sh DESCRIPTION \" Section Header - required - don't modify
Use the .Nm macro to refer to your program throughout the man page like such:
.Nm
Underlining is accomplished with the .Ar macro like this:
.Ar underlined text .
.Pp \" Inserts a space
A list of items with descriptions:
.Bl -tag -width -indent \" Begins a tagged list
.It item a \" Each item preceded by .It macro
Description of item a
.It item b
Description of item b
.El \" Ends the list
.Pp
A list of flags and their descriptions:
.Bl -tag -width -indent \" Differs from above in tag removed
.It Fl a \"-a flag as a list item
Description of -a flag
.It Fl b
Description of -b flag
.El \" Ends the list
.Pp
.\" .Sh ENVIRONMENT \" May not be needed
.\" .Bl -tag -width "ENV_VAR_1" -indent \" ENV_VAR_1 is width of the string ENV_VAR_1
.\" .It Ev ENV_VAR_1
.\" Description of ENV_VAR_1
.\" .It Ev ENV_VAR_2
.\" Description of ENV_VAR_2
.\" .El
.Sh FILES \" File used or created by the topic of the man page
.Bl -tag -width "/Users/joeuser/Library/really_long_file_name" -compact
.It Pa /usr/share/file_name
FILE_1 description
.It Pa /Users/joeuser/Library/really_long_file_name
FILE_2 description
.El \" Ends the list
.\" .Sh DIAGNOSTICS \" May not be needed
.\" .Bl -diag
.\" .It Diagnostic Tag
.\" Diagnostic informtion here.
.\" .It Diagnostic Tag
.\" Diagnostic informtion here.
.\" .El
.Sh SEE ALSO
.\" List links in ascending order by section, alphabetically within a section.
.\" Please do not reference files that do not exist without filing a bug report
.Xr a 1 ,
.Xr b 1 ,
.Xr c 1 ,
.Xr a 2 ,
.Xr b 2 ,
.Xr a 3 ,
.Xr b 3
.\" .Sh BUGS \" Document known, unremedied bugs
.\" .Sh HISTORY \" Document history if command behaves in a unique manner
================================================
FILE: 360Daemon/360Daemon.m
================================================
/*
MICE Xbox 360 Controller driver for Mac OS X
Copyright (C) 2006-2013 Colin Munro
360Daemon.m - main functionality of the support daemon
This file is part of Xbox360Controller.
Xbox360Controller is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
Xbox360Controller 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with Foobar; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#import <Foundation/Foundation.h>
#import <IOKit/IOKitLib.h>
#import <IOKit/IOCFPlugIn.h>
#import <IOKit/hid/IOHIDLib.h>
#import <IOKit/hid/IOHIDKeys.h>
#include <IOKit/usb/IOUSBLib.h>
#import <ForceFeedback/ForceFeedback.h>
#include "ControlPrefs.h"
#define CHECK_SHOWAGAIN @"Do not show this message again"
#define INSTALL_PATH @"/Library/Application Support/MICE/360Daemon"
#define RESOURCE_PATH INSTALL_PATH @"/Resources"
mach_port_t masterPort;
IONotificationPortRef notifyPort;
CFRunLoopSourceRef notifySource;
io_iterator_t onIteratorWired;
io_iterator_t onIteratorWireless;
io_iterator_t onIteratorOther;
io_iterator_t offIteratorWired;
io_iterator_t offIteratorWireless;
BOOL foundWirelessReceiver;
NSString *leds[4];
CFUserNotificationRef activeAlert = nil;
CFRunLoopSourceRef activeAlertSource;
int activeAlertIndex;
enum {
kaPlugNCharge = 0,
};
NSString *alertStrings[] = {
@"You have attached a Microsoft Play & Charge cable for your XBox 360 Wireless Controller. While this cable will allow you to charge your wireless controller, you will require the Microsoft Wireless Gaming Receiver for Windows to use your wireless controller in Mac OS X!",
};
static void releaseAlert(void)
{
CFRunLoopRemoveSource(CFRunLoopGetCurrent(), activeAlertSource, kCFRunLoopCommonModes);
CFRelease(activeAlertSource);
CFRelease(activeAlert);
activeAlertSource = nil;
activeAlert = nil;
}
static void callbackAlert(CFUserNotificationRef userNotification, CFOptionFlags responseFlags)
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
if (responseFlags & CFUserNotificationCheckBoxChecked(0))
SetAlertDisabled(activeAlertIndex);
releaseAlert();
[pool release];
}
static void ShowAlert(int index)
{
SInt32 error;
NSArray *checkBoxes = [NSArray arrayWithObjects:CHECK_SHOWAGAIN, nil];
NSArray *dictKeys = [NSArray arrayWithObjects:
(NSString*)kCFUserNotificationAlertHeaderKey,
(NSString*)kCFUserNotificationAlertMessageKey,
(NSString*)kCFUserNotificationCheckBoxTitlesKey,
(NSString*)kCFUserNotificationIconURLKey,
nil];
NSArray *dictValues = [NSArray arrayWithObjects:
@"XBox 360 Controller Driver",
alertStrings[index],
checkBoxes,
[NSURL fileURLWithPath:RESOURCE_PATH @"/Alert.tif"],
nil];
NSDictionary *dictionary = [NSDictionary dictionaryWithObjects:dictValues forKeys:dictKeys];
if (AlertDisabled(index))
return;
if (activeAlert != nil)
{
CFUserNotificationCancel(activeAlert);
releaseAlert();
}
activeAlertIndex = index;
activeAlert = CFUserNotificationCreate(kCFAllocatorDefault, 0, kCFUserNotificationPlainAlertLevel, &error, (CFDictionaryRef)dictionary);
activeAlertSource = CFUserNotificationCreateRunLoopSource(kCFAllocatorDefault, activeAlert, callbackAlert, 0);
CFRunLoopAddSource(CFRunLoopGetCurrent(), activeAlertSource, kCFRunLoopCommonModes);
}
static void ConfigureDevice(io_service_t object)
{
IOCFPlugInInterface **iodev;
IOUSBDeviceInterface **dev;
IOReturn err;
SInt32 score;
if ((!IOCreatePlugInInterfaceForService(object, kIOUSBDeviceUserClientTypeID, kIOCFPlugInInterfaceID, &iodev, &score))&&iodev)
{
err = (*iodev)->QueryInterface(iodev, CFUUIDGetUUIDBytes(kIOUSBDeviceInterfaceID), (LPVOID)&dev);
(*iodev)->Release(iodev);
if ((!err) && dev)
{
if ((*dev)->USBDeviceOpen(dev) == 0)
{
IOUSBConfigurationDescriptorPtr confDesc;
if ((*dev)->GetConfigurationDescriptorPtr(dev, 0, &confDesc) == 0)
{
(*dev)->SetConfiguration(dev, confDesc->bConfigurationValue);
// Open interface? Hopefully not necessary
}
(*dev)->USBDeviceClose(dev);
}
(*dev)->Release(dev);
}
}
}
// Supported device - connecting - set settings?
static void callbackConnected(void *param,io_iterator_t iterator)
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
io_service_t object = 0;
while ((object = IOIteratorNext(iterator)) != 0)
{
/*
CFStringRef bob = IOObjectCopyClass(object);
NSLog(@"Found %p: %@", object, bob);
CFRelease(bob);
*/
if (IOObjectConformsTo(object, "WirelessHIDDevice") || IOObjectConformsTo(object, "Xbox360ControllerClass"))
{
FFDeviceObjectReference forceFeedback;
NSString *serialNumber;
serialNumber = GetSerialNumber(object);
// Supported device - load settings
ConfigController(object, GetController(serialNumber));
// Set LEDs
forceFeedback = 0;
if (FFCreateDevice(object, &forceFeedback) != FF_OK)
forceFeedback = 0;
if (forceFeedback != 0)
{
FFEFFESCAPE escape;
unsigned char c;
int i;
c = 0x0a;
if (serialNumber != nil)
{
for (i = 0; i < 4; i++)
{
if ((leds[i] == nil) || ([leds[i] caseInsensitiveCompare:serialNumber] == NSOrderedSame))
{
c = 0x06 + i;
if (leds[i] == nil)
leds[i] = [serialNumber retain];
// NSLog(@"Added controller with LED %i", i);
break;
}
}
}
escape.dwSize = sizeof(escape);
escape.dwCommand = 0x02;
escape.cbInBuffer = sizeof(c);
escape.lpvInBuffer = &c;
escape.cbOutBuffer = 0;
escape.lpvOutBuffer = NULL;
FFDeviceEscape(forceFeedback, &escape);
FFReleaseDevice(forceFeedback);
}
}
else
{
CFTypeRef vendorID = IORegistryEntrySearchCFProperty(object,kIOServicePlane,CFSTR("idVendor"),kCFAllocatorDefault,kIORegistryIterateRecursively | kIORegistryIterateParents);
CFTypeRef productID = IORegistryEntrySearchCFProperty(object,kIOServicePlane,CFSTR("idProduct"),kCFAllocatorDefault,kIORegistryIterateRecursively | kIORegistryIterateParents);
if ((vendorID != NULL) && (productID != NULL))
{
UInt32 idVendor = [((NSNumber*)vendorID) unsignedIntValue];
UInt32 idProduct = [((NSNumber*)productID) unsignedIntValue];
if (idVendor == 0x045e)
{
// Microsoft
switch (idProduct)
{
case 0x028f: // Plug'n'charge cable
if (!foundWirelessReceiver)
ShowAlert(kaPlugNCharge);
ConfigureDevice(object);
break;
case 0x0719: // Microsoft Wireless Gaming Receiver
case 0x0291: // Third party Wireless Gaming Receiver
foundWirelessReceiver = TRUE;
break;
}
}
}
if (vendorID != NULL)
CFRelease(vendorID);
if (productID != NULL)
CFRelease(productID);
}
IOObjectRelease(object);
}
[pool release];
}
// Supported device - disconnecting
static void callbackDisconnected(void *param, io_iterator_t iterator)
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
io_service_t object = 0;
NSString *serial;
int i;
while ((object = IOIteratorNext(iterator)) != 0)
{
/*
CFStringRef bob = IOObjectCopyClass(object);
NSLog(@"Lost %p: %@", object, bob);
CFRelease(bob);
*/
serial = GetSerialNumber(object);
if (serial != nil)
{
for (i = 0; i < 4; i++)
{
if (leds[i] == nil)
continue;
if ([leds[i] caseInsensitiveCompare:serial] == NSOrderedSame)
{
[leds[i] release];
leds[i] = nil;
// NSLog(@"Removed controller with LED %i", i);
}
}
}
IOObjectRelease(object);
}
[pool release];
}
// Entry point
int main (int argc, const char * argv[])
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
foundWirelessReceiver = FALSE;
memset(leds, 0, sizeof(leds));
// Get master port, for accessing I/O Kit
IOMasterPort(MACH_PORT_NULL,&masterPort);
// Set up notification of USB device addition/removal
notifyPort=IONotificationPortCreate(masterPort);
notifySource=IONotificationPortGetRunLoopSource(notifyPort);
CFRunLoopAddSource(CFRunLoopGetCurrent(),notifySource,kCFRunLoopCommonModes);
// Start listening
// USB devices
IOServiceAddMatchingNotification(notifyPort, kIOFirstMatchNotification, IOServiceMatching(kIOUSBDeviceClassName), callbackConnected, NULL, &onIteratorOther);
callbackConnected(NULL, onIteratorOther);
// Wired 360 devices
IOServiceAddMatchingNotification(notifyPort, kIOFirstMatchNotification, IOServiceMatching("Xbox360ControllerClass"), callbackConnected, NULL, &onIteratorWired);
callbackConnected(NULL, onIteratorWired);
IOServiceAddMatchingNotification(notifyPort, kIOTerminatedNotification, IOServiceMatching("Xbox360ControllerClass"), callbackDisconnected, NULL, &offIteratorWired);
callbackDisconnected(NULL, offIteratorWired);
// Wireless 360 devices
IOServiceAddMatchingNotification(notifyPort, kIOFirstMatchNotification, IOServiceMatching("WirelessHIDDevice"), callbackConnected, NULL, &onIteratorWireless);
callbackConnected(NULL, onIteratorWireless);
IOServiceAddMatchingNotification(notifyPort, kIOTerminatedNotification, IOServiceMatching("WirelessHIDDevice"), callbackDisconnected, NULL, &offIteratorWireless);
callbackDisconnected(NULL, offIteratorWireless);
// Run loop
CFRunLoopRun();
// Stop listening
IOObjectRelease(onIteratorOther);
IOObjectRelease(onIteratorWired);
IOObjectRelease(offIteratorWired);
IOObjectRelease(onIteratorWireless);
IOObjectRelease(offIteratorWireless);
CFRunLoopRemoveSource(CFRunLoopGetCurrent(), notifySource, kCFRunLoopCommonModes);
CFRunLoopSourceInvalidate(notifySource);
IONotificationPortDestroy(notifyPort);
// End
[pool release];
return 0;
}
================================================
FILE: 360Daemon/360Daemon.xcodeproj/project.pbxproj
================================================
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 45;
objects = {
/* Begin PBXBuildFile section */
3B7905000CE3F6A400ACB699 /* ForceFeedback.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B7904FF0CE3F6A400ACB699 /* ForceFeedback.framework */; };
3B7A8E2C0CE14E38005BB45B /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B7A8E2B0CE14E38005BB45B /* IOKit.framework */; };
3B8698090CE2903100283CEC /* ControlPrefs.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B8698080CE2903100283CEC /* ControlPrefs.m */; };
8DD76F9A0486AA7600D96B5E /* 360Daemon.m in Sources */ = {isa = PBXBuildFile; fileRef = 08FB7796FE84155DC02AAC07 /* 360Daemon.m */; settings = {ATTRIBUTES = (); }; };
8DD76F9C0486AA7600D96B5E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 08FB779EFE84155DC02AAC07 /* Foundation.framework */; };
8DD76F9F0486AA7600D96B5E /* 360Daemon.1 in CopyFiles */ = {isa = PBXBuildFile; fileRef = C6859EA3029092ED04C91782 /* 360Daemon.1 */; };
/* End PBXBuildFile section */
/* Begin PBXCopyFilesBuildPhase section */
8DD76F9E0486AA7600D96B5E /* CopyFiles */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 8;
dstPath = /usr/share/man/man1/;
dstSubfolderSpec = 0;
files = (
8DD76F9F0486AA7600D96B5E /* 360Daemon.1 in CopyFiles */,
);
runOnlyForDeploymentPostprocessing = 1;
};
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
08FB7796FE84155DC02AAC07 /* 360Daemon.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = 360Daemon.m; sourceTree = "<group>"; };
08FB779EFE84155DC02AAC07 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = "<absolute>"; };
32A70AAB03705E1F00C91783 /* 360Daemon_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = 360Daemon_Prefix.pch; sourceTree = "<group>"; };
3B7904D50CE3F13700ACB699 /* Alert.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = Alert.tif; sourceTree = "<group>"; };
3B7904FF0CE3F6A400ACB699 /* ForceFeedback.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ForceFeedback.framework; path = /System/Library/Frameworks/ForceFeedback.framework; sourceTree = "<absolute>"; };
3B7A8E2B0CE14E38005BB45B /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = /System/Library/Frameworks/IOKit.framework; sourceTree = "<absolute>"; };
3B8698070CE2903100283CEC /* ControlPrefs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ControlPrefs.h; sourceTree = "<group>"; };
3B8698080CE2903100283CEC /* ControlPrefs.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ControlPrefs.m; sourceTree = "<group>"; };
3BBB7EED16C387C600BC7827 /* com.mice.360Daemon.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = com.mice.360Daemon.plist; sourceTree = "<group>"; };
8DD76FA10486AA7600D96B5E /* 360Daemon */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = 360Daemon; sourceTree = BUILT_PRODUCTS_DIR; };
C6859EA3029092ED04C91782 /* 360Daemon.1 */ = {isa = PBXFileReference; lastKnownFileType = text.man; path = 360Daemon.1; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
8DD76F9B0486AA7600D96B5E /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
8DD76F9C0486AA7600D96B5E /* Foundation.framework in Frameworks */,
3B7A8E2C0CE14E38005BB45B /* IOKit.framework in Frameworks */,
3B7905000CE3F6A400ACB699 /* ForceFeedback.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
08FB7794FE84155DC02AAC07 /* 360Daemon */ = {
isa = PBXGroup;
children = (
08FB7795FE84155DC02AAC07 /* Source */,
C6859EA2029092E104C91782 /* Documentation */,
08FB779DFE84155DC02AAC07 /* External Frameworks and Libraries */,
1AB674ADFE9D54B511CA2CBB /* Products */,
);
name = 360Daemon;
sourceTree = "<group>";
};
08FB7795FE84155DC02AAC07 /* Source */ = {
isa = PBXGroup;
children = (
3B7904D50CE3F13700ACB699 /* Alert.tif */,
3B8698070CE2903100283CEC /* ControlPrefs.h */,
3B8698080CE2903100283CEC /* ControlPrefs.m */,
32A70AAB03705E1F00C91783 /* 360Daemon_Prefix.pch */,
08FB7796FE84155DC02AAC07 /* 360Daemon.m */,
3BBB7EED16C387C600BC7827 /* com.mice.360Daemon.plist */,
);
name = Source;
sourceTree = "<group>";
};
08FB779DFE84155DC02AAC07 /* External Frameworks and Libraries */ = {
isa = PBXGroup;
children = (
3B7904FF0CE3F6A400ACB699 /* ForceFeedback.framework */,
3B7A8E2B0CE14E38005BB45B /* IOKit.framework */,
08FB779EFE84155DC02AAC07 /* Foundation.framework */,
);
name = "External Frameworks and Libraries";
sourceTree = "<group>";
};
1AB674ADFE9D54B511CA2CBB /* Products */ = {
isa = PBXGroup;
children = (
8DD76FA10486AA7600D96B5E /* 360Daemon */,
);
name = Products;
sourceTree = "<group>";
};
C6859EA2029092E104C91782 /* Documentation */ = {
isa = PBXGroup;
children = (
C6859EA3029092ED04C91782 /* 360Daemon.1 */,
);
name = Documentation;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
8DD76F960486AA7600D96B5E /* 360Daemon */ = {
isa = PBXNativeTarget;
buildConfigurationList = 1DEB927408733DD40010E9CD /* Build configuration list for PBXNativeTarget "360Daemon" */;
buildPhases = (
8DD76F990486AA7600D96B5E /* Sources */,
8DD76F9B0486AA7600D96B5E /* Frameworks */,
8DD76F9E0486AA7600D96B5E /* CopyFiles */,
);
buildRules = (
);
dependencies = (
);
name = 360Daemon;
productInstallPath = "$(HOME)/bin";
productName = 360Daemon;
productReference = 8DD76FA10486AA7600D96B5E /* 360Daemon */;
productType = "com.apple.product-type.tool";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
08FB7793FE84155DC02AAC07 /* Project object */ = {
isa = PBXProject;
buildConfigurationList = 1DEB927808733DD40010E9CD /* Build configuration list for PBXProject "360Daemon" */;
compatibilityVersion = "Xcode 2.4";
developmentRegion = English;
hasScannedForEncodings = 1;
knownRegions = (
English,
Japanese,
French,
German,
);
mainGroup = 08FB7794FE84155DC02AAC07 /* 360Daemon */;
projectDirPath = "";
projectRoot = "";
targets = (
8DD76F960486AA7600D96B5E /* 360Daemon */,
);
};
/* End PBXProject section */
/* Begin PBXSourcesBuildPhase section */
8DD76F990486AA7600D96B5E /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
8DD76F9A0486AA7600D96B5E /* 360Daemon.m in Sources */,
3B8698090CE2903100283CEC /* ControlPrefs.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin XCBuildConfiguration section */
1DEB927508733DD40010E9CD /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ARCHS = "$(ARCHS_STANDARD_32_64_BIT)";
COPY_PHASE_STRIP = NO;
GCC_DYNAMIC_NO_PIC = NO;
GCC_ENABLE_FIX_AND_CONTINUE = YES;
GCC_MODEL_TUNING = G5;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = 360Daemon_Prefix.pch;
INSTALL_PATH = "$(HOME)/bin";
PRODUCT_NAME = 360Daemon;
SDKROOT = "";
ZERO_LINK = YES;
};
name = Debug;
};
1DEB927608733DD40010E9CD /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
GCC_MODEL_TUNING = G5;
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = 360Daemon_Prefix.pch;
INSTALL_PATH = "$(HOME)/bin";
PRODUCT_NAME = 360Daemon;
};
name = Release;
};
1DEB927908733DD40010E9CD /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
CODE_SIGN_IDENTITY = "Developer ID Application: Colin Munro";
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
MACOSX_DEPLOYMENT_TARGET = 10.5;
PREBINDING = NO;
PROVISIONING_PROFILE = "";
SDKROOT = "";
};
name = Debug;
};
1DEB927A08733DD40010E9CD /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ARCHS = "$(ARCHS_STANDARD_32_64_BIT)";
CODE_SIGN_IDENTITY = "Developer ID Application: Colin Munro";
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
MACOSX_DEPLOYMENT_TARGET = 10.5;
PREBINDING = NO;
PROVISIONING_PROFILE = "";
SDKROOT = "";
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
1DEB927408733DD40010E9CD /* Build configuration list for PBXNativeTarget "360Daemon" */ = {
isa = XCConfigurationList;
buildConfigurations = (
1DEB927508733DD40010E9CD /* Debug */,
1DEB927608733DD40010E9CD /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
1DEB927808733DD40010E9CD /* Build configuration list for PBXProject "360Daemon" */ = {
isa = XCConfigurationList;
buildConfigurations = (
1DEB927908733DD40010E9CD /* Debug */,
1DEB927A08733DD40010E9CD /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = 08FB7793FE84155DC02AAC07 /* Project object */;
}
================================================
FILE: 360Daemon/360Daemon_Prefix.pch
================================================
//
// Prefix header for all source files of the '360Daemon' target in the '360Daemon' project.
//
#ifdef __OBJC__
#import <Foundation/Foundation.h>
#endif
================================================
FILE: 360Daemon/ControlPrefs.h
================================================
/*
MICE Xbox 360 Controller driver for Mac OS X
Copyright (C) 2006-2013 Colin Munro
ControlPrefs.h - interface to the preferences functionality
This file is part of Xbox360Controller.
Xbox360Controller is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
Xbox360Controller 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with Foobar; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#import <Cocoa/Cocoa.h>
#define DOM_DAEMON CFSTR("com.mice.driver.Xbox360Controller.daemon")
#define DOM_CONTROLLERS CFSTR("com.mice.driver.Xbox360Controller.devices")
#define D_SHOWONCE @"ShowAlert"
#define D_KNOWNDEV @"KnownDevices"
// Daemon's own settings
void SetAlertDisabled(int index);
BOOL AlertDisabled(int index);
// Controller settings
void SetController(NSString *serial, NSDictionary *data);
NSDictionary* GetController(NSString *serial);
// Configuration settings
void SetKnownDevices(NSDictionary *devices);
NSDictionary* GetKnownDevices(void);
// Utility functions
NSString* GetSerialNumber(io_service_t device);
void ConfigController(io_service_t device, NSDictionary *config);
================================================
FILE: 360Daemon/ControlPrefs.m
================================================
/*
MICE Xbox 360 Controller driver for Mac OS X
Copyright (C) 2006-2013 Colin Munro
ControlPrefs.m - code to read and write shared preferences
This file is part of Xbox360Controller.
Xbox360Controller is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
Xbox360Controller 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with Foobar; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#import "ControlPrefs.h"
void SetAlertDisabled(int index)
{
NSString *prop;
NSNumber *value;
prop = [NSString stringWithFormat:@"%@%i", D_SHOWONCE, index];
value = [NSNumber numberWithBool:TRUE];
CFPreferencesSetValue((CFStringRef)prop, value, DOM_DAEMON, kCFPreferencesCurrentUser, kCFPreferencesCurrentHost);
CFPreferencesSynchronize((CFStringRef)DOM_DAEMON, kCFPreferencesCurrentUser, kCFPreferencesCurrentHost);
}
BOOL AlertDisabled(int index)
{
NSString *prop;
BOOL result;
CFPropertyListRef value;
result = FALSE;
prop = [NSString stringWithFormat:@"%@%i", D_SHOWONCE, index];
value = CFPreferencesCopyValue((CFStringRef)prop, DOM_DAEMON, kCFPreferencesCurrentUser, kCFPreferencesCurrentHost);
if (value != NULL)
{
result = [((NSNumber*)value) boolValue];
CFRelease(value);
}
return result;
}
void SetController(NSString *serial, NSDictionary *data)
{
CFPreferencesSetValue((CFStringRef)serial, data, DOM_CONTROLLERS, kCFPreferencesAnyUser, kCFPreferencesCurrentHost);
CFPreferencesSynchronize(DOM_CONTROLLERS, kCFPreferencesAnyUser, kCFPreferencesCurrentHost);
}
NSDictionary* GetController(NSString *serial)
{
CFPropertyListRef value;
CFPreferencesSynchronize(DOM_CONTROLLERS, kCFPreferencesAnyUser, kCFPreferencesCurrentHost);
value = CFPreferencesCopyValue((CFStringRef)serial, DOM_CONTROLLERS, kCFPreferencesAnyUser, kCFPreferencesCurrentHost);
return [((NSDictionary*)value) autorelease];
}
NSString* GetSerialNumber(io_service_t device)
{
CFTypeRef value;
value = IORegistryEntrySearchCFProperty(device, kIOServicePlane, CFSTR("USB Serial Number"), kCFAllocatorDefault, kIORegistryIterateRecursively);
if (value == NULL)
value = IORegistryEntrySearchCFProperty(device, kIOServicePlane, CFSTR("SerialNumber"), kCFAllocatorDefault, kIORegistryIterateRecursively);
return [((NSString*)value) autorelease];
}
void ConfigController(io_service_t device, NSDictionary *config)
{
IORegistryEntrySetCFProperties(device, config);
}
void SetKnownDevices(NSDictionary *devices)
{
// Setting the dictionary should work?
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:devices];
CFPreferencesSetValue((CFStringRef)D_KNOWNDEV, data, DOM_CONTROLLERS, kCFPreferencesAnyUser, kCFPreferencesCurrentHost);
CFPreferencesSynchronize(DOM_CONTROLLERS, kCFPreferencesAnyUser, kCFPreferencesCurrentHost);
}
NSDictionary* GetKnownDevices(void)
{
CFPropertyListRef value;
NSData *data;
CFPreferencesSynchronize(DOM_CONTROLLERS, kCFPreferencesAnyUser, kCFPreferencesCurrentHost);
value = CFPreferencesCopyValue((CFStringRef)D_KNOWNDEV, DOM_CONTROLLERS, kCFPreferencesAnyUser, kCFPreferencesCurrentHost);
data = [(NSData*)value autorelease];
if (data == nil)
return nil;
return [NSKeyedUnarchiver unarchiveObjectWithData:data];
}
================================================
FILE: 360Daemon/FoundationTool.pbproj/project.pbxproj
================================================
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 39;
objects = {
014CEA4F0018CE4811CA2923 = {
buildRules = (
);
buildSettings = {
COPY_PHASE_STRIP = NO;
GCC_DYNAMIC_NO_PIC = NO;
GCC_ENABLE_FIX_AND_CONTINUE = YES;
GCC_GENERATE_DEBUGGING_SYMBOLS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
ZERO_LINK = YES;
};
isa = PBXBuildStyle;
name = Development;
};
014CEA500018CE4811CA2923 = {
buildRules = (
);
buildSettings = {
COPY_PHASE_STRIP = YES;
GCC_ENABLE_FIX_AND_CONTINUE = NO;
ZERO_LINK = NO;
};
isa = PBXBuildStyle;
name = Deployment;
};
//010
//011
//012
//013
//014
//080
//081
//082
//083
//084
08FB7793FE84155DC02AAC07 = {
buildSettings = {
};
buildStyles = (
014CEA4F0018CE4811CA2923,
014CEA500018CE4811CA2923,
);
hasScannedForEncodings = 1;
isa = PBXProject;
mainGroup = 08FB7794FE84155DC02AAC07;
projectDirPath = "";
targets = (
8DD76F960486AA7600D96B5E,
);
};
08FB7794FE84155DC02AAC07 = {
children = (
08FB7795FE84155DC02AAC07,
C6859EA2029092E104C91782,
08FB779DFE84155DC02AAC07,
1AB674ADFE9D54B511CA2CBB,
);
isa = PBXGroup;
name = "«PROJECTNAME»";
refType = 4;
sourceTree = "<group>";
};
08FB7795FE84155DC02AAC07 = {
children = (
32A70AAB03705E1F00C91783,
08FB7796FE84155DC02AAC07,
);
isa = PBXGroup;
name = Source;
refType = 4;
sourceTree = "<group>";
};
08FB7796FE84155DC02AAC07 = {
fileEncoding = 4;
isa = PBXFileReference;
lastKnownFileType = sourcecode.c.objc;
path = "«PROJECTNAME».m";
refType = 4;
sourceTree = "<group>";
};
08FB779DFE84155DC02AAC07 = {
children = (
08FB779EFE84155DC02AAC07,
);
isa = PBXGroup;
name = "External Frameworks and Libraries";
refType = 4;
sourceTree = "<group>";
};
08FB779EFE84155DC02AAC07 = {
fallbackIsa = PBXFileReference;
isa = PBXFrameworkReference;
lastKnownFileType = wrapper.framework;
name = Foundation.framework;
path = /System/Library/Frameworks/Foundation.framework;
refType = 0;
sourceTree = "<absolute>";
};
//080
//081
//082
//083
//084
//1A0
//1A1
//1A2
//1A3
//1A4
1AB674ADFE9D54B511CA2CBB = {
children = (
8DD76FA10486AA7600D96B5E,
);
isa = PBXGroup;
name = Products;
refType = 4;
sourceTree = "<group>";
};
//1A0
//1A1
//1A2
//1A3
//1A4
//320
//321
//322
//323
//324
32A70AAB03705E1F00C91783 = {
fileEncoding = 4;
isa = PBXFileReference;
lastKnownFileType = file;
path = "«PROJECTNAME»_Prefix.pch";
refType = 4;
sourceTree = "<group>";
};
//320
//321
//322
//323
//324
//8D0
//8D1
//8D2
//8D3
//8D4
8DD76F960486AA7600D96B5E = {
buildPhases = (
8DD76F990486AA7600D96B5E,
8DD76F9B0486AA7600D96B5E,
8DD76F9E0486AA7600D96B5E,
);
buildRules = (
);
buildSettings = {
GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "«PROJECTNAME»_Prefix.pch";
INSTALL_PATH = "$(HOME)/bin";
PRODUCT_NAME = "«PROJECTNAME»";
};
dependencies = (
);
isa = PBXNativeTarget;
name = "«PROJECTNAME»";
productInstallPath = "$(HOME)/bin";
productName = "«PROJECTNAME»";
productReference = 8DD76FA10486AA7600D96B5E;
productType = "com.apple.product-type.tool";
};
8DD76F990486AA7600D96B5E = {
buildActionMask = 2147483647;
files = (
8DD76F9A0486AA7600D96B5E,
);
isa = PBXSourcesBuildPhase;
runOnlyForDeploymentPostprocessing = 0;
};
8DD76F9A0486AA7600D96B5E = {
fileRef = 08FB7796FE84155DC02AAC07;
isa = PBXBuildFile;
settings = {
ATTRIBUTES = (
);
};
};
8DD76F9B0486AA7600D96B5E = {
buildActionMask = 2147483647;
files = (
8DD76F9C0486AA7600D96B5E,
);
isa = PBXFrameworksBuildPhase;
runOnlyForDeploymentPostprocessing = 0;
};
8DD76F9C0486AA7600D96B5E = {
fileRef = 08FB779EFE84155DC02AAC07;
isa = PBXBuildFile;
settings = {
};
};
8DD76F9E0486AA7600D96B5E = {
buildActionMask = 8;
dstPath = /usr/share/man/man1/;
dstSubfolderSpec = 0;
files = (
8DD76F9F0486AA7600D96B5E,
);
isa = PBXCopyFilesBuildPhase;
runOnlyForDeploymentPostprocessing = 1;
};
8DD76F9F0486AA7600D96B5E = {
fileRef = C6859EA3029092ED04C91782;
isa = PBXBuildFile;
settings = {
};
};
8DD76FA10486AA7600D96B5E = {
explicitFileType = "compiled.mach-o.executable";
includeInIndex = 0;
isa = PBXFileReference;
path = "«PROJECTNAME»";
refType = 3;
sourceTree = BUILT_PRODUCTS_DIR;
};
//8D0
//8D1
//8D2
//8D3
//8D4
//C60
//C61
//C62
//C63
//C64
C6859EA2029092E104C91782 = {
children = (
C6859EA3029092ED04C91782,
);
isa = PBXGroup;
name = Documentation;
refType = 4;
sourceTree = "<group>";
};
C6859EA3029092ED04C91782 = {
isa = PBXFileReference;
lastKnownFileType = file;
path = "«PROJECTNAME».1";
refType = 4;
sourceTree = "<group>";
};
};
rootObject = 08FB7793FE84155DC02AAC07;
}
================================================
FILE: 360Daemon/com.mice.360Daemon.plist
================================================
<?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>RunAtLoad</key>
<true/>
<key>ProgramArguments</key>
<array>
<string>/Library/Application Support/MICE/360Daemon/360Daemon</string>
</array>
<key>KeepAlive</key>
<true/>
<key>Label</key>
<string>com.mice.360Daemon</string>
</dict>
</plist>
================================================
FILE: DriverTool/DriverTool.1
================================================
.\"Modified from man(1) of FreeBSD, the NetBSD mdoc.template, and mdoc.samples.
.\"See Also:
.\"man mdoc.samples for a complete listing of options
.\"man mdoc for the short list of editing options
.\"/usr/share/misc/mdoc.template
.Dd 8/05/2011 \" DATE
.Dt DriverTool 1 \" Program name and manual section number
.Os Darwin
.Sh NAME \" Section Header - required - don't modify
.Nm DriverTool,
.\" The following lines are read in generating the apropos(man -k) database. Use only key
.\" words here as the database is built based on the words here and in the .ND line.
.Nm Other_name_for_same_program(),
.Nm Yet another name for the same program.
.\" Use .Nm macro to designate other names for the documented program.
.Nd This line parsed for whatis database.
.Sh SYNOPSIS \" Section Header - required - don't modify
.Nm
.Op Fl abcd \" [-abcd]
.Op Fl a Ar path \" [-a path]
.Op Ar file \" [file]
.Op Ar \" [file ...]
.Ar arg0 \" Underlined argument - use .Ar anywhere to underline
arg2 ... \" Arguments
.Sh DESCRIPTION \" Section Header - required - don't modify
Use the .Nm macro to refer to your program throughout the man page like such:
.Nm
Underlining is accomplished with the .Ar macro like this:
.Ar underlined text .
.Pp \" Inserts a space
A list of items with descriptions:
.Bl -tag -width -indent \" Begins a tagged list
.It item a \" Each item preceded by .It macro
Description of item a
.It item b
Description of item b
.El \" Ends the list
.Pp
A list of flags and their descriptions:
.Bl -tag -width -indent \" Differs from above in tag removed
.It Fl a \"-a flag as a list item
Description of -a flag
.It Fl b
Description of -b flag
.El \" Ends the list
.Pp
.\" .Sh ENVIRONMENT \" May not be needed
.\" .Bl -tag -width "ENV_VAR_1" -indent \" ENV_VAR_1 is width of the string ENV_VAR_1
.\" .It Ev ENV_VAR_1
.\" Description of ENV_VAR_1
.\" .It Ev ENV_VAR_2
.\" Description of ENV_VAR_2
.\" .El
.Sh FILES \" File used or created by the topic of the man page
.Bl -tag -width "/Users/joeuser/Library/really_long_file_name" -compact
.It Pa /usr/share/file_name
FILE_1 description
.It Pa /Users/joeuser/Library/really_long_file_name
FILE_2 description
.El \" Ends the list
.\" .Sh DIAGNOSTICS \" May not be needed
.\" .Bl -diag
.\" .It Diagnostic Tag
.\" Diagnostic informtion here.
.\" .It Diagnostic Tag
.\" Diagnostic informtion here.
.\" .El
.Sh SEE ALSO
.\" List links in ascending order by section, alphabetically within a section.
.\" Please do not reference files that do not exist without filing a bug report
.Xr a 1 ,
.Xr b 1 ,
.Xr c 1 ,
.Xr a 2 ,
.Xr b 2 ,
.Xr a 3 ,
.Xr b 3
.\" .Sh BUGS \" Document known, unremedied bugs
.\" .Sh HISTORY \" Document history if command behaves in a unique manner
================================================
FILE: DriverTool/DriverTool.m
================================================
/*
MICE Xbox 360 Controller driver for Mac OS X
Copyright (C) 2006-2013 Colin Munro
DriverTool.m - implementation of driver info tweaking tool
This file is part of Xbox360Controller.
Xbox360Controller is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
Xbox360Controller 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with Foobar; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#import <Foundation/Foundation.h>
#define DRIVER_NAME @"360Controller.kext"
static NSDictionary *infoPlistAttributes = nil;
static NSString* GetDriverDirectory(void)
{
NSArray *data = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSSystemDomainMask, YES);
return [[data objectAtIndex:0] stringByAppendingPathComponent:@"Extensions"];
}
static NSString* GetDriverConfigPath(NSString *driver)
{
NSString *root = GetDriverDirectory();
NSString *driverPath = [root stringByAppendingPathComponent:driver];
NSString *contents = [driverPath stringByAppendingPathComponent:@"Contents"];
return [contents stringByAppendingPathComponent:@"Info.plist"];
}
static id ReadDriverConfig(NSString *driver)
{
NSString *filename;
NSError *error = nil;
NSData *data;
NSDictionary *config;
filename = GetDriverConfigPath(driver);
infoPlistAttributes = [[[NSFileManager defaultManager] attributesOfItemAtPath:filename error:&error] retain];
if (infoPlistAttributes == nil)
{
NSLog(@"Warning: Failed to read attributes of '%@': %@",
filename, error);
}
data = [NSData dataWithContentsOfFile:filename];
config = [NSPropertyListSerialization propertyListFromData:data mutabilityOption:0 format:NULL errorDescription:NULL];
return config;
}
static void WriteDriverConfig(NSString *driver, id config)
{
NSString *filename;
NSString *errorString;
NSData *data;
filename = GetDriverConfigPath(driver);
errorString = nil;
data = [NSPropertyListSerialization dataFromPropertyList:config format:NSPropertyListXMLFormat_v1_0 errorDescription:&errorString];
if (data == nil)
NSLog(@"Error writing config for driver: %@", errorString);
[errorString release];
if (![data writeToFile:filename atomically:NO])
NSLog(@"Failed to write file!");
if (infoPlistAttributes != nil)
{
NSError *error = nil;
if (![[NSFileManager defaultManager] setAttributes:infoPlistAttributes ofItemAtPath:filename error:&error])
{
NSLog(@"Error setting attributes on '%@': %@",
filename, error);
}
}
}
static void ScrubDevices(NSMutableDictionary *devices)
{
NSMutableArray *deviceKeys;
deviceKeys = [NSMutableArray arrayWithCapacity:10];
for (NSString *key in [devices allKeys])
{
NSDictionary *device = [devices objectForKey:key];
if ([(NSString*)[device objectForKey:@"IOClass"] compare:@"Xbox360Peripheral"] == NSOrderedSame)
[deviceKeys addObject:key];
}
[devices removeObjectsForKeys:deviceKeys];
}
static id MakeMutableCopy(id object)
{
return [(id<NSObject>)CFPropertyListCreateDeepCopy(
kCFAllocatorDefault,
(CFTypeRef)object,
kCFPropertyListMutableContainers) autorelease];
}
static void AddDevice(NSMutableDictionary *personalities, NSString *name, int vendor, int product)
{
NSMutableDictionary *controller;
controller = [NSMutableDictionary dictionaryWithCapacity:10];
// Standard
[controller setObject:@"com.mice.driver.Xbox360Controller"
forKey:@"CFBundleIdentifier"];
[controller setObject:[NSDictionary dictionaryWithObject:@"360Controller.kext/Contents/PlugIns/Feedback360.plugin"
forKey:@"F4545CE5-BF5B-11D6-A4BB-0003933E3E3E"]
forKey:@"IOCFPlugInTypes"];
[controller setObject:@"Xbox360Peripheral"
forKey:@"IOClass"];
[controller setObject:@"IOUSBDevice"
forKey:@"IOProviderClass"];
[controller setObject:[NSNumber numberWithInt:65535]
forKey:@"IOKitDebug"];
// Device-specific
[controller setObject:[NSNumber numberWithInt:vendor]
forKey:@"idVendor"];
[controller setObject:[NSNumber numberWithInt:product]
forKey:@"idProduct"];
// Add it to the tree
[personalities setObject:controller
forKey:name];
}
static void AddDevices(NSMutableDictionary *personalities, int argc, const char *argv[])
{
int i, count;
count = (argc - 2) / 3;
for (i = 0; i < count; i++)
{
NSString *name = [NSString stringWithCString:argv[(i * 3) + 2] encoding:NSUTF8StringEncoding];
int vendor = atoi(argv[(i * 3) + 3]);
int product = atoi(argv[(i * 3) + 4]);
AddDevice(personalities, name, vendor, product);
}
}
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSDictionary *config = ReadDriverConfig(DRIVER_NAME);
if (argc == 1)
{
// Print out current types
NSDictionary *types;
NSArray *keys;
types = [config objectForKey:@"IOKitPersonalities"];
keys = [types allKeys];
for (NSString *key in keys)
{
NSDictionary *device = [types objectForKey:key];
if ([(NSString*)[device objectForKey:@"IOClass"] compare:@"Xbox360Peripheral"] != NSOrderedSame)
continue;
fprintf(stdout, "%s,%i,%i\n",
[key UTF8String],
[[device objectForKey:@"idVendor"] intValue],
[[device objectForKey:@"idProduct"] intValue]);
}
}
else if ((argc > 1) && (strcmp(argv[1], "edit") == 0) && (((argc - 2) % 3) == 0))
{
NSMutableDictionary *saving;
NSMutableDictionary *devices;
saving = MakeMutableCopy(config);
devices = [saving objectForKey:@"IOKitPersonalities"];
ScrubDevices(devices);
AddDevices(devices, argc, argv);
WriteDriverConfig(DRIVER_NAME, saving);
system("/usr/bin/touch /System/Library/Extensions");
}
else
NSLog(@"Invalid number of parameters (%i)", argc);
[pool drain];
return 0;
}
================================================
FILE: DriverTool/DriverTool.xcodeproj/project.pbxproj
================================================
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 45;
objects = {
/* Begin PBXBuildFile section */
8DD76F9A0486AA7600D96B5E /* DriverTool.m in Sources */ = {isa = PBXBuildFile; fileRef = 08FB7796FE84155DC02AAC07 /* DriverTool.m */; settings = {ATTRIBUTES = (); }; };
8DD76F9C0486AA7600D96B5E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 08FB779EFE84155DC02AAC07 /* Foundation.framework */; };
8DD76F9F0486AA7600D96B5E /* DriverTool.1 in CopyFiles */ = {isa = PBXBuildFile; fileRef = C6859EA3029092ED04C91782 /* DriverTool.1 */; };
/* End PBXBuildFile section */
/* Begin PBXCopyFilesBuildPhase section */
8DD76F9E0486AA7600D96B5E /* CopyFiles */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 8;
dstPath = /usr/share/man/man1/;
dstSubfolderSpec = 0;
files = (
8DD76F9F0486AA7600D96B5E /* DriverTool.1 in CopyFiles */,
);
runOnlyForDeploymentPostprocessing = 1;
};
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
08FB7796FE84155DC02AAC07 /* DriverTool.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DriverTool.m; sourceTree = "<group>"; };
08FB779EFE84155DC02AAC07 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = "<absolute>"; };
32A70AAB03705E1F00C91783 /* DriverTool_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DriverTool_Prefix.pch; sourceTree = "<group>"; };
8DD76FA10486AA7600D96B5E /* DriverTool */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = DriverTool; sourceTree = BUILT_PRODUCTS_DIR; };
C6859EA3029092ED04C91782 /* DriverTool.1 */ = {isa = PBXFileReference; lastKnownFileType = text.man; path = DriverTool.1; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
8DD76F9B0486AA7600D96B5E /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
8DD76F9C0486AA7600D96B5E /* Foundation.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
08FB7794FE84155DC02AAC07 /* DriverTool */ = {
isa = PBXGroup;
children = (
08FB7795FE84155DC02AAC07 /* Source */,
C6859EA2029092E104C91782 /* Documentation */,
08FB779DFE84155DC02AAC07 /* External Frameworks and Libraries */,
1AB674ADFE9D54B511CA2CBB /* Products */,
);
name = DriverTool;
sourceTree = "<group>";
};
08FB7795FE84155DC02AAC07 /* Source */ = {
isa = PBXGroup;
children = (
32A70AAB03705E1F00C91783 /* DriverTool_Prefix.pch */,
08FB7796FE84155DC02AAC07 /* DriverTool.m */,
);
name = Source;
sourceTree = "<group>";
};
08FB779DFE84155DC02AAC07 /* External Frameworks and Libraries */ = {
isa = PBXGroup;
children = (
08FB779EFE84155DC02AAC07 /* Foundation.framework */,
);
name = "External Frameworks and Libraries";
sourceTree = "<group>";
};
1AB674ADFE9D54B511CA2CBB /* Products */ = {
isa = PBXGroup;
children = (
8DD76FA10486AA7600D96B5E /* DriverTool */,
);
name = Products;
sourceTree = "<group>";
};
C6859EA2029092E104C91782 /* Documentation */ = {
isa = PBXGroup;
children = (
C6859EA3029092ED04C91782 /* DriverTool.1 */,
);
name = Documentation;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
8DD76F960486AA7600D96B5E /* DriverTool */ = {
isa = PBXNativeTarget;
buildConfigurationList = 1DEB927408733DD40010E9CD /* Build configuration list for PBXNativeTarget "DriverTool" */;
buildPhases = (
8DD76F990486AA7600D96B5E /* Sources */,
8DD76F9B0486AA7600D96B5E /* Frameworks */,
8DD76F9E0486AA7600D96B5E /* CopyFiles */,
);
buildRules = (
);
dependencies = (
);
name = DriverTool;
productInstallPath = "$(HOME)/bin";
productName = DriverTool;
productReference = 8DD76FA10486AA7600D96B5E /* DriverTool */;
productType = "com.apple.product-type.tool";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
08FB7793FE84155DC02AAC07 /* Project object */ = {
isa = PBXProject;
buildConfigurationList = 1DEB927808733DD40010E9CD /* Build configuration list for PBXProject "DriverTool" */;
compatibilityVersion = "Xcode 3.1";
developmentRegion = English;
hasScannedForEncodings = 1;
knownRegions = (
English,
Japanese,
French,
German,
);
mainGroup = 08FB7794FE84155DC02AAC07 /* DriverTool */;
projectDirPath = "";
projectRoot = "";
targets = (
8DD76F960486AA7600D96B5E /* DriverTool */,
);
};
/* End PBXProject section */
/* Begin PBXSourcesBuildPhase section */
8DD76F990486AA7600D96B5E /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
8DD76F9A0486AA7600D96B5E /* DriverTool.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin XCBuildConfiguration section */
1DEB927508733DD40010E9CD /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
COPY_PHASE_STRIP = NO;
GCC_DYNAMIC_NO_PIC = NO;
GCC_ENABLE_FIX_AND_CONTINUE = YES;
GCC_MODEL_TUNING = G5;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = DriverTool_Prefix.pch;
INSTALL_PATH = /usr/local/bin;
PRODUCT_NAME = DriverTool;
};
name = Debug;
};
1DEB927608733DD40010E9CD /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
GCC_MODEL_TUNING = G5;
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = DriverTool_Prefix.pch;
INSTALL_PATH = /usr/local/bin;
PRODUCT_NAME = DriverTool;
SDKROOT = "";
};
name = Release;
};
1DEB927908733DD40010E9CD /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ARCHS = "$(ARCHS_STANDARD_32_64_BIT)";
CODE_SIGN_IDENTITY = "Developer ID Application: Colin Munro";
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
MACOSX_DEPLOYMENT_TARGET = 10.5;
ONLY_ACTIVE_ARCH = YES;
PREBINDING = NO;
PROVISIONING_PROFILE = "";
SDKROOT = "";
};
name = Debug;
};
1DEB927A08733DD40010E9CD /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ARCHS = "$(ARCHS_STANDARD_32_64_BIT)";
CODE_SIGN_IDENTITY = "Developer ID Application: Colin Munro";
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
MACOSX_DEPLOYMENT_TARGET = 10.5;
PREBINDING = NO;
PROVISIONING_PROFILE = "";
SDKROOT = "";
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
1DEB927408733DD40010E9CD /* Build configuration list for PBXNativeTarget "DriverTool" */ = {
isa = XCConfigurationList;
buildConfigurations = (
1DEB927508733DD40010E9CD /* Debug */,
1DEB927608733DD40010E9CD /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
1DEB927808733DD40010E9CD /* Build configuration list for PBXProject "DriverTool" */ = {
isa = XCConfigurationList;
buildConfigurations = (
1DEB927908733DD40010E9CD /* Debug */,
1DEB927A08733DD40010E9CD /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = 08FB7793FE84155DC02AAC07 /* Project object */;
}
================================================
FILE: DriverTool/DriverTool_Prefix.pch
================================================
//
// Prefix header for all source files of the 'DriverTool' target in the 'DriverTool' project.
//
#ifdef __OBJC__
#import <Foundation/Foundation.h>
#endif
================================================
FILE: Feedback360/English.lproj/InfoPlist.strings
================================================
/* Localized versions of Info.plist keys */
CFBundleName = "Feedback360";
NSHumanReadableCopyright = "© Colin Munro, 2005-2011";
================================================
FILE: Feedback360/Feedback360.xcodeproj/colin.mode1
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>ActivePerspectiveName</key>
<string>Project</string>
<key>AllowedModules</key>
<array>
<dict>
<key>BundleLoadPath</key>
<string></string>
<key>MaxInstances</key>
<string>n</string>
<key>Module</key>
<string>PBXSmartGroupTreeModule</string>
<key>Name</key>
<string>Groups and Files Outline View</string>
</dict>
<dict>
<key>BundleLoadPath</key>
<string></string>
<key>MaxInstances</key>
<string>n</string>
<key>Module</key>
<string>PBXNavigatorGroup</string>
<key>Name</key>
<string>Editor</string>
</dict>
<dict>
<key>BundleLoadPath</key>
<string></string>
<key>MaxInstances</key>
<string>n</string>
<key>Module</key>
<string>XCTaskListModule</string>
<key>Name</key>
<string>Task List</string>
</dict>
<dict>
<key>BundleLoadPath</key>
<string></string>
<key>MaxInstances</key>
<string>n</string>
<key>Module</key>
<string>XCDetailModule</string>
<key>Name</key>
<string>File and Smart Group Detail Viewer</string>
</dict>
<dict>
<key>BundleLoadPath</key>
<string></string>
<key>MaxInstances</key>
<string>1</string>
<key>Module</key>
<string>PBXBuildResultsModule</string>
<key>Name</key>
<string>Detailed Build Results Viewer</string>
</dict>
<dict>
<key>BundleLoadPath</key>
<string></string>
<key>MaxInstances</key>
<string>1</string>
<key>Module</key>
<string>PBXProjectFindModule</string>
<key>Name</key>
<string>Project Batch Find Tool</string>
</dict>
<dict>
<key>BundleLoadPath</key>
<string></string>
<key>MaxInstances</key>
<string>n</string>
<key>Module</key>
<string>PBXRunSessionModule</string>
<key>Name</key>
<string>Run Log</string>
</dict>
<dict>
<key>BundleLoadPath</key>
<string></string>
<key>MaxInstances</key>
<string>n</string>
<key>Module</key>
<string>PBXBookmarksModule</string>
<key>Name</key>
<string>Bookmarks Tool</string>
</dict>
<dict>
<key>BundleLoadPath</key>
<string></string>
<key>MaxInstances</key>
<string>n</string>
<key>Module</key>
<string>PBXClassBrowserModule</string>
<key>Name</key>
<string>Class Browser</string>
</dict>
<dict>
<key>BundleLoadPath</key>
<string></string>
<key>MaxInstances</key>
<string>n</string>
<key>Module</key>
<string>PBXCVSModule</string>
<key>Name</key>
<string>Source Code Control Tool</string>
</dict>
<dict>
<key>BundleLoadPath</key>
<string></string>
<key>MaxInstances</key>
<string>n</string>
<key>Module</key>
<string>PBXDebugBreakpointsModule</string>
<key>Name</key>
<string>Debug Breakpoints Tool</string>
</dict>
<dict>
<key>BundleLoadPath</key>
<string></string>
<key>MaxInstances</key>
<string>n</string>
<key>Module</key>
<string>XCDockableInspector</string>
<key>Name</key>
<string>Inspector</string>
</dict>
<dict>
<key>BundleLoadPath</key>
<string></string>
<key>MaxInstances</key>
<string>n</string>
<key>Module</key>
<string>PBXOpenQuicklyModule</string>
<key>Name</key>
<string>Open Quickly Tool</string>
</dict>
<dict>
<key>BundleLoadPath</key>
<string></string>
<key>MaxInstances</key>
<string>1</string>
<key>Module</key>
<string>PBXDebugSessionModule</string>
<key>Name</key>
<string>Debugger</string>
</dict>
<dict>
<key>BundleLoadPath</key>
<string></string>
<key>MaxInstances</key>
<string>1</string>
<key>Module</key>
<string>PBXDebugCLIModule</string>
<key>Name</key>
<string>Debug Console</string>
</dict>
</array>
<key>Description</key>
<string>DefaultDescriptionKey</string>
<key>DockingSystemVisible</key>
<false/>
<key>Extension</key>
<string>mode1</string>
<key>FavBarConfig</key>
<dict>
<key>PBXProjectModuleGUID</key>
<string>3B2EF59109661AF5007BFB7B</string>
<key>XCBarModuleItemNames</key>
<dict/>
<key>XCBarModuleItems</key>
<array/>
</dict>
<key>FirstTimeWindowDisplayed</key>
<false/>
<key>Identifier</key>
<string>com.apple.perspectives.project.mode1</string>
<key>MajorVersion</key>
<integer>31</integer>
<key>MinorVersion</key>
<integer>1</integer>
<key>Name</key>
<string>Default</string>
<key>Notifications</key>
<array/>
<key>OpenEditors</key>
<array/>
<key>PerspectiveWidths</key>
<array>
<integer>-1</integer>
<integer>-1</integer>
</array>
<key>Perspectives</key>
<array>
<dict>
<key>ChosenToolbarItems</key>
<array>
<string>active-target-popup</string>
<string>active-buildstyle-popup</string>
<string>action</string>
<string>NSToolbarFlexibleSpaceItem</string>
<string>buildOrClean</string>
<string>build-and-runOrDebug</string>
<string>com.apple.ide.PBXToolbarStopButton</string>
<string>get-info</string>
<string>toggle-editor</string>
<string>NSToolbarFlexibleSpaceItem</string>
<string>com.apple.pbx.toolbar.searchfield</string>
</array>
<key>ControllerClassBaseName</key>
<string></string>
<key>IconName</key>
<string>WindowOfProjectWithEditor</string>
<key>Identifier</key>
<string>perspective.project</string>
<key>IsVertical</key>
<false/>
<key>Layout</key>
<array>
<dict>
<key>BecomeActive</key>
<true/>
<key>ContentConfiguration</key>
<dict>
<key>PBXBottomSmartGroupGIDs</key>
<array>
<string>1C37FBAC04509CD000000102</string>
<string>1C37FAAC04509CD000000102</string>
<string>1C08E77C0454961000C914BD</string>
<string>1C37FABC05509CD000000102</string>
<string>1C37FABC05539CD112110102</string>
<string>E2644B35053B69B200211256</string>
<string>1C37FABC04509CD000100104</string>
<string>1CC0EA4004350EF90044410B</string>
<string>1CC0EA4004350EF90041110B</string>
</array>
<key>PBXProjectModuleGUID</key>
<string>1CE0B1FE06471DED0097A5F4</string>
<key>PBXProjectModuleLabel</key>
<string>Files</string>
<key>PBXProjectStructureProvided</key>
<string>yes</string>
<key>PBXSmartGroupTreeModuleColumnData</key>
<dict>
<key>PBXSmartGroupTreeModuleColumnWidthsKey</key>
<array>
<real>186</real>
</array>
<key>PBXSmartGroupTreeModuleColumnsKey_v4</key>
<array>
<string>MainColumn</string>
</array>
</dict>
<key>PBXSmartGroupTreeModuleOutlineStateKey_v7</key>
<dict>
<key>PBXSmartGroupTreeModuleOutlineStateExpansionKey</key>
<array>
<string>089C166AFE841209C02AAC07</string>
<string>08FB77AFFE84173DC02AAC07</string>
<string>089C167CFE841241C02AAC07</string>
<string>3B2EF5470965B8E3007BFB7B</string>
<string>089C1671FE841209C02AAC07</string>
<string>3B2EF54B0965C358007BFB7B</string>
<string>0AA1909FFE8422F4C02AAC07</string>
<string>19C28FB6FE9D52B211CA2CBB</string>
<string>1C37FABC05509CD000000102</string>
</array>
<key>PBXSmartGroupTreeModuleOutlineStateSelectionKey</key>
<array>
<array>
<integer>0</integer>
</array>
</array>
<key>PBXSmartGroupTreeModuleOutlineStateVisibleRectKey</key>
<string>{{0, 0}, {186, 338}}</string>
</dict>
<key>PBXTopSmartGroupGIDs</key>
<array/>
<key>XCIncludePerspectivesSwitch</key>
<true/>
<key>XCSharingToken</key>
<string>com.apple.Xcode.GFSharingToken</string>
</dict>
<key>GeometryConfiguration</key>
<dict>
<key>Frame</key>
<string>{{0, 0}, {203, 356}}</string>
<key>GroupTreeTableConfiguration</key>
<array>
<string>MainColumn</string>
<real>186</real>
</array>
<key>RubberWindowFrame</key>
<string>308 400 690 397 0 0 1280 1002 </string>
</dict>
<key>Module</key>
<string>PBXSmartGroupTreeModule</string>
<key>Proportion</key>
<string>203pt</string>
</dict>
<dict>
<key>Dock</key>
<array>
<dict>
<key>ContentConfiguration</key>
<dict>
<key>PBXProjectModuleGUID</key>
<string>1CE0B20306471E060097A5F4</string>
<key>PBXProjectModuleLabel</key>
<string>MyNewFile14.java</string>
<key>PBXSplitModuleInNavigatorKey</key>
<dict>
<key>Split0</key>
<dict>
<key>PBXProjectModuleGUID</key>
<string>1CE0B20406471E060097A5F4</string>
<key>PBXProjectModuleLabel</key>
<string>MyNewFile14.java</string>
</dict>
<key>SplitCount</key>
<string>1</string>
</dict>
<key>StatusBarVisibility</key>
<true/>
</dict>
<key>GeometryConfiguration</key>
<dict>
<key>Frame</key>
<string>{{0, 0}, {482, 0}}</string>
<key>RubberWindowFrame</key>
<string>308 400 690 397 0 0 1280 1002 </string>
</dict>
<key>Module</key>
<string>PBXNavigatorGroup</string>
<key>Proportion</key>
<string>0pt</string>
</dict>
<dict>
<key>ContentConfiguration</key>
<dict>
<key>PBXProjectModuleGUID</key>
<string>1CE0B20506471E060097A5F4</string>
<key>PBXProjectModuleLabel</key>
<string>Detail</string>
</dict>
<key>GeometryConfiguration</key>
<dict>
<key>Frame</key>
<string>{{0, 5}, {482, 351}}</string>
<key>RubberWindowFrame</key>
<string>308 400 690 397 0 0 1280 1002 </string>
</dict>
<key>Module</key>
<string>XCDetailModule</string>
<key>Proportion</key>
<string>351pt</string>
</dict>
</array>
<key>Proportion</key>
<string>482pt</string>
</dict>
</array>
<key>Name</key>
<string>Project</string>
<key>ServiceClasses</key>
<array>
<string>XCModuleDock</string>
<string>PBXSmartGroupTreeModule</string>
<string>XCModuleDock</string>
<string>PBXNavigatorGroup</string>
<string>XCDetailModule</string>
</array>
<key>TableOfContents</key>
<array>
<string>3BCC40840BDA915400B1619B</string>
<string>1CE0B1FE06471DED0097A5F4</string>
<string>3BCC40850BDA915400B1619B</string>
<string>1CE0B20306471E060097A5F4</string>
<string>1CE0B20506471E060097A5F4</string>
</array>
<key>ToolbarConfiguration</key>
<string>xcode.toolbar.config.default</string>
</dict>
<dict>
<key>ControllerClassBaseName</key>
<string></string>
<key>IconName</key>
<string>WindowOfProject</string>
<key>Identifier</key>
<string>perspective.morph</string>
<key>IsVertical</key>
<integer>0</integer>
<key>Layout</key>
<array>
<dict>
<key>BecomeActive</key>
<integer>1</integer>
<key>ContentConfiguration</key>
<dict>
<key>PBXBottomSmartGroupGIDs</key>
<array>
<string>1C37FBAC04509CD000000102</string>
<string>1C37FAAC04509CD000000102</string>
<string>1C08E77C0454961000C914BD</string>
<string>1C37FABC05509CD000000102</string>
<string>1C37FABC05539CD112110102</string>
<string>E2644B35053B69B200211256</string>
<string>1C37FABC04509CD000100104</string>
<string>1CC0EA4004350EF90044410B</string>
<string>1CC0EA4004350EF90041110B</string>
</array>
<key>PBXProjectModuleGUID</key>
<string>11E0B1FE06471DED0097A5F4</string>
<key>PBXProjectModuleLabel</key>
<string>Files</string>
<key>PBXProjectStructureProvided</key>
<string>yes</string>
<key>PBXSmartGroupTreeModuleColumnData</key>
<dict>
<key>PBXSmartGroupTreeModuleColumnWidthsKey</key>
<array>
<real>186</real>
</array>
<key>PBXSmartGroupTreeModuleColumnsKey_v4</key>
<array>
<string>MainColumn</string>
</array>
</dict>
<key>PBXSmartGroupTreeModuleOutlineStateKey_v7</key>
<dict>
<key>PBXSmartGroupTreeModuleOutlineStateExpansionKey</key>
<array>
<string>29B97314FDCFA39411CA2CEA</string>
<string>1C37FABC05509CD000000102</string>
</array>
<key>PBXSmartGroupTreeModuleOutlineStateSelectionKey</key>
<array>
<array>
<integer>0</integer>
</array>
</array>
<key>PBXSmartGroupTreeModuleOutlineStateVisibleRectKey</key>
<string>{{0, 0}, {186, 337}}</string>
</dict>
<key>PBXTopSmartGroupGIDs</key>
<array/>
<key>XCIncludePerspectivesSwitch</key>
<integer>1</integer>
<key>XCSharingToken</key>
<string>com.apple.Xcode.GFSharingToken</string>
</dict>
<key>GeometryConfiguration</key>
<dict>
<key>Frame</key>
<string>{{0, 0}, {203, 355}}</string>
<key>GroupTreeTableConfiguration</key>
<array>
<string>MainColumn</string>
<real>186</real>
</array>
<key>RubberWindowFrame</key>
<string>373 269 690 397 0 0 1440 878 </string>
</dict>
<key>Module</key>
<string>PBXSmartGroupTreeModule</string>
<key>Proportion</key>
<string>100%</string>
</dict>
</array>
<key>Name</key>
<string>Morph</string>
<key>PreferredWidth</key>
<integer>300</integer>
<key>ServiceClasses</key>
<array>
<string>XCModuleDock</string>
<string>PBXSmartGroupTreeModule</string>
</array>
<key>TableOfContents</key>
<array>
<string>11E0B1FE06471DED0097A5F4</string>
</array>
<key>ToolbarConfiguration</key>
<string>xcode.toolbar.config.default.short</string>
</dict>
</array>
<key>PerspectivesBarVisible</key>
<false/>
<key>ShelfIsVisible</key>
<false/>
<key>SourceDescription</key>
<string>file at '/System/Library/PrivateFrameworks/DevToolsInterface.framework/Versions/A/Resources/XCPerspectivesSpecificationMode1.xcperspec'</string>
<key>StatusbarIsVisible</key>
<true/>
<key>TimeStamp</key>
<real>0.0</real>
<key>ToolbarDisplayMode</key>
<integer>1</integer>
<key>ToolbarIsVisible</key>
<true/>
<key>ToolbarSizeMode</key>
<integer>1</integer>
<key>Type</key>
<string>Perspectives</string>
<key>UpdateMessage</key>
<string>The Default Workspace in this version of Xcode now includes support to hide and show the detail view (what has been referred to as the "Metro-Morph" feature). You must discard your current Default Workspace settings and update to the latest Default Workspace in order to gain this feature. Do you wish to update to the latest Workspace defaults for project '%@'?</string>
<key>WindowJustification</key>
<integer>5</integer>
<key>WindowOrderList</key>
<array>
<string>3B2EF5820965C4A5007BFB7B</string>
<string>/Users/colin/Projects2/OSX/360 Controller/Feedback360/Feedback360.xcodeproj</string>
</array>
<key>WindowString</key>
<string>308 400 690 397 0 0 1280 1002 </string>
<key>WindowTools</key>
<array>
<dict>
<key>FirstTimeWindowDisplayed</key>
<false/>
<key>Identifier</key>
<string>windowTool.build</string>
<key>IsVertical</key>
<true/>
<key>Layout</key>
<array>
<dict>
<key>Dock</key>
<array>
<dict>
<key>ContentConfiguration</key>
<dict>
<key>PBXProjectModuleGUID</key>
<string>1CD0528F0623707200166675</string>
<key>PBXProjectModuleLabel</key>
<string></string>
<key>StatusBarVisibility</key>
<true/>
</dict>
<key>GeometryConfiguration</key>
<dict>
<key>Frame</key>
<string>{{0, 0}, {500, 218}}</string>
<key>RubberWindowFrame</key>
<string>691 470 500 500 0 0 1280 1002 </string>
</dict>
<key>Module</key>
<string>PBXNavigatorGroup</string>
<key>Proportion</key>
<string>218pt</string>
</dict>
<dict>
<key>ContentConfiguration</key>
<dict>
<key>PBXBuildLogShowsTranscriptDefaultKey</key>
<string>{{0, 5}, {500, 231}}</string>
<key>PBXProjectModuleGUID</key>
<string>XCMainBuildResultsModuleGUID</string>
<key>PBXProjectModuleLabel</key>
<string>Build</string>
<key>XCBuildResultsTrigger_Collapse</key>
<integer>1021</integer>
<key>XCBuildResultsTrigger_Open</key>
<integer>1011</integer>
</dict>
<key>GeometryConfiguration</key>
<dict>
<key>Frame</key>
<string>{{0, 223}, {500, 236}}</string>
<key>RubberWindowFrame</key>
<string>691 470 500 500 0 0 1280 1002 </string>
</dict>
<key>Module</key>
<string>PBXBuildResultsModule</string>
<key>Proportion</key>
<string>236pt</string>
</dict>
</array>
<key>Proportion</key>
<string>459pt</string>
</dict>
</array>
<key>Name</key>
<string>Build Results</string>
<key>ServiceClasses</key>
<array>
<string>PBXBuildResultsModule</string>
</array>
<key>StatusbarIsVisible</key>
<true/>
<key>TableOfContents</key>
<array>
<string>3B2EF5820965C4A5007BFB7B</string>
<string>3BCC40880BDA916800B1619B</string>
<string>1CD0528F0623707200166675</string>
<string>XCMainBuildResultsModuleGUID</string>
</array>
<key>ToolbarConfiguration</key>
<string>xcode.toolbar.config.build</string>
<key>WindowString</key>
<string>691 470 500 500 0 0 1280 1002 </string>
<key>WindowToolGUID</key>
<string>3B2EF5820965C4A5007BFB7B</string>
<key>WindowToolIsVisible</key>
<false/>
</dict>
<dict>
<key>Identifier</key>
<string>windowTool.debugger</string>
<key>Layout</key>
<array>
<dict>
<key>Dock</key>
<array>
<dict>
<key>ContentConfiguration</key>
<dict>
<key>Debugger</key>
<dict>
<key>HorizontalSplitView</key>
<dict>
<key>_collapsingFrameDimension</key>
<real>0.0</real>
<key>_indexOfCollapsedView</key>
<integer>0</integer>
<key>_percentageOfCollapsedView</key>
<real>0.0</real>
<key>isCollapsed</key>
<string>yes</string>
<key>sizes</key>
<array>
<string>{{0, 0}, {317, 164}}</string>
<string>{{317, 0}, {377, 164}}</string>
</array>
</dict>
<key>VerticalSplitView</key>
<dict>
<key>_collapsingFrameDimension</key>
<real>0.0</real>
<key>_indexOfCollapsedView</key>
<integer>0</integer>
<key>_percentageOfCollapsedView</key>
<real>0.0</real>
<key>isCollapsed</key>
<string>yes</string>
<key>sizes</key>
<array>
<string>{{0, 0}, {694, 164}}</string>
<string>{{0, 164}, {694, 216}}</string>
</array>
</dict>
</dict>
<key>LauncherConfigVersion</key>
<string>8</string>
<key>PBXProjectModuleGUID</key>
<string>1C162984064C10D400B95A72</string>
<key>PBXProjectModuleLabel</key>
<string>Debug - GLUTExamples (Underwater)</string>
</dict>
<key>GeometryConfiguration</key>
<dict>
<key>DebugConsoleDrawerSize</key>
<string>{100, 120}</string>
<key>DebugConsoleVisible</key>
<string>None</string>
<key>DebugConsoleWindowFrame</key>
<string>{{200, 200}, {500, 300}}</string>
<key>DebugSTDIOWindowFrame</key>
<string>{{200, 200}, {500, 300}}</string>
<key>Frame</key>
<string>{{0, 0}, {694, 380}}</string>
<key>RubberWindowFrame</key>
<string>321 238 694 422 0 0 1440 878 </string>
</dict>
<key>Module</key>
<string>PBXDebugSessionModule</string>
<key>Proportion</key>
<string>100%</string>
</dict>
</array>
<key>Proportion</key>
<string>100%</string>
</dict>
</array>
<key>Name</key>
<string>Debugger</string>
<key>ServiceClasses</key>
<array>
<string>PBXDebugSessionModule</string>
</array>
<key>StatusbarIsVisible</key>
<integer>1</integer>
<key>TableOfContents</key>
<array>
<string>1CD10A99069EF8BA00B06720</string>
<string>1C0AD2AB069F1E9B00FABCE6</string>
<string>1C162984064C10D400B95A72</string>
<string>1C0AD2AC069F1E9B00FABCE6</string>
</array>
<key>ToolbarConfiguration</key>
<string>xcode.toolbar.config.debug</string>
<key>WindowString</key>
<string>321 238 694 422 0 0 1440 878 </string>
<key>WindowToolGUID</key>
<string>1CD10A99069EF8BA00B06720</string>
<key>WindowToolIsVisible</key>
<integer>0</integer>
</dict>
<dict>
<key>FirstTimeWindowDisplayed</key>
<false/>
<key>Identifier</key>
<string>windowTool.find</string>
<key>IsVertical</key>
<true/>
<key>Layout</key>
<array>
<dict>
<key>Dock</key>
<array>
<dict>
<key>Dock</key>
<array>
<dict>
<key>ContentConfiguration</key>
<dict>
<key>PBXProjectModuleGUID</key>
<string>1CDD528C0622207200134675</string>
<key>PBXProjectModuleLabel</key>
<string>IOHIDLib.h</string>
<key>StatusBarVisibility</key>
<true/>
</dict>
<key>GeometryConfiguration</key>
<dict>
<key>Frame</key>
<string>{{0, 0}, {781, 212}}</string>
<key>RubberWindowFrame</key>
<string>31 477 781 470 0 0 1280 1002 </string>
</dict>
<key>Module</key>
<string>PBXNavigatorGroup</string>
<key>Proportion</key>
<string>781pt</string>
</dict>
</array>
<key>Proportion</key>
<string>212pt</string>
</dict>
<dict>
<key>BecomeActive</key>
<true/>
<key>ContentConfiguration</key>
<dict>
<key>PBXProjectModuleGUID</key>
<string>1CD0528E0623707200166675</string>
<key>PBXProjectModuleLabel</key>
<string>Project Find</string>
</dict>
<key>GeometryConfiguration</key>
<dict>
<key>Frame</key>
<string>{{0, 217}, {781, 212}}</string>
<key>RubberWindowFrame</key>
<string>31 477 781 470 0 0 1280 1002 </string>
</dict>
<key>Module</key>
<string>PBXProjectFindModule</string>
<key>Proportion</key>
<string>212pt</string>
</dict>
</array>
<key>Proportion</key>
<string>429pt</string>
</dict>
</array>
<key>Name</key>
<string>Project Find</string>
<key>ServiceClasses</key>
<array>
<string>PBXProjectFindModule</string>
</array>
<key>StatusbarIsVisible</key>
<true/>
<key>TableO
gitextract_62qdvxky/ ├── 360Controller/ │ ├── 360Controller.xcodeproj/ │ │ └── project.pbxproj │ ├── ChatPad.cpp │ ├── ChatPad.h │ ├── ControlStruct.h │ ├── Controller.cpp │ ├── Controller.h │ ├── English.lproj/ │ │ └── InfoPlist.strings │ ├── Info copy.plist │ ├── Info.plist │ ├── _60Controller.cpp │ ├── _60Controller.h │ ├── chatpadhid.h │ ├── chatpadkeys.cpp │ ├── chatpadkeys.h │ ├── version.plist │ └── xbox360hid.h ├── 360Daemon/ │ ├── 360Daemon.1 │ ├── 360Daemon.m │ ├── 360Daemon.xcodeproj/ │ │ └── project.pbxproj │ ├── 360Daemon_Prefix.pch │ ├── Alert.tif │ ├── ControlPrefs.h │ ├── ControlPrefs.m │ ├── FoundationTool.pbproj/ │ │ └── project.pbxproj │ └── com.mice.360Daemon.plist ├── DriverTool/ │ ├── DriverTool.1 │ ├── DriverTool.m │ ├── DriverTool.xcodeproj/ │ │ └── project.pbxproj │ └── DriverTool_Prefix.pch ├── Feedback360/ │ ├── English.lproj/ │ │ └── InfoPlist.strings │ ├── Feedback360.xcodeproj/ │ │ ├── colin.mode1 │ │ └── project.pbxproj │ ├── Info.plist │ ├── devlink.c │ ├── devlink.h │ ├── emulator.c │ ├── emulator.h │ ├── main.c │ ├── main.h │ └── version.plist ├── Install360Controller/ │ ├── Install360Controller.pkgproj │ ├── Scripts/ │ │ ├── finish.sh │ │ └── upgrade.sh │ └── Text/ │ └── Welcome.rtf ├── Licence.txt ├── Pref360Control/ │ ├── DeviceItem.h │ ├── DeviceItem.m │ ├── DeviceLister.h │ ├── DeviceLister.m │ ├── English.lproj/ │ │ ├── InfoPlist.strings │ │ └── Pref360ControlPref.nib/ │ │ ├── designable.nib │ │ └── keyedobjects.nib │ ├── Info.plist │ ├── MyAnalogStick.h │ ├── MyAnalogStick.m │ ├── MyCentreButtons.h │ ├── MyCentreButtons.m │ ├── MyDigitalStick.h │ ├── MyDigitalStick.m │ ├── MyMainButtons.h │ ├── MyMainButtons.m │ ├── MyShoulderButton.h │ ├── MyShoulderButton.m │ ├── Pref360Control.xcodeproj/ │ │ └── project.pbxproj │ ├── Pref360ControlPref.h │ ├── Pref360ControlPref.m │ ├── Pref360Control_Prefix.pch │ ├── batt0.tif │ ├── batt1.tif │ ├── batt2.tif │ ├── batt3.tif │ ├── battNone.tif │ ├── pref360controlpref.tiff │ └── version.plist ├── Readme.rtf ├── Wireless360Controller/ │ ├── English.lproj/ │ │ └── InfoPlist.strings │ ├── IOKitDriver.pbproj/ │ │ └── project.pbxproj │ ├── Info.plist │ ├── Wireless360Controller.cpp │ ├── Wireless360Controller.h │ ├── Wireless360Controller.xcodeproj/ │ │ └── project.pbxproj │ └── version.plist ├── WirelessGamingReceiver/ │ ├── English.lproj/ │ │ └── InfoPlist.strings │ ├── IOKitDriver.pbproj/ │ │ └── project.pbxproj │ ├── Info.plist │ ├── WirelessDevice.cpp │ ├── WirelessDevice.h │ ├── WirelessGamingReceiver.cpp │ ├── WirelessGamingReceiver.h │ ├── WirelessGamingReceiver.xcodeproj/ │ │ ├── colin.mode1 │ │ └── project.pbxproj │ ├── WirelessHIDDevice.cpp │ ├── WirelessHIDDevice.h │ ├── devices.h │ └── version.plist └── build
SYMBOL INDEX (142 symbols across 30 files)
FILE: 360Controller/ChatPad.cpp
type HID_ChatPad (line 26) | namespace HID_ChatPad {
function IOReturn (line 34) | IOReturn ChatPadKeyboardClass::newReportDescriptor(IOMemoryDescriptor **...
function IOReturn (line 46) | IOReturn ChatPadKeyboardClass::setReport(IOMemoryDescriptor *report, IOH...
function IOReturn (line 52) | IOReturn ChatPadKeyboardClass::getReport(IOMemoryDescriptor *report, IOH...
function IOReturn (line 57) | IOReturn ChatPadKeyboardClass::handleReport(IOMemoryDescriptor *report, ...
function OSNumber (line 74) | OSNumber* ChatPadKeyboardClass::newPrimaryUsageNumber() const
function OSNumber (line 79) | OSNumber* ChatPadKeyboardClass::newPrimaryUsagePageNumber() const
function OSString (line 84) | OSString* ChatPadKeyboardClass::newProductString() const
function OSString (line 89) | OSString* ChatPadKeyboardClass::newTransportString() const
function OSNumber (line 94) | OSNumber* ChatPadKeyboardClass::newVendorIDNumber() const
function OSNumber (line 100) | OSNumber* ChatPadKeyboardClass::newProductIDNumber() const
function IOHIDDevice (line 106) | static IOHIDDevice* GetParent(const IOService *current)
function OSString (line 123) | OSString* ChatPadKeyboardClass::newManufacturerString() const
function OSString (line 131) | OSString* ChatPadKeyboardClass::newSerialNumberString() const
function OSNumber (line 139) | OSNumber* ChatPadKeyboardClass::newLocationIDNumber() const
FILE: 360Controller/ChatPad.h
function class (line 26) | class ChatPadKeyboardClass : public IOHIDDevice
FILE: 360Controller/ControlStruct.h
type UInt8 (line 26) | typedef UInt8 XBox360_Byte;
type UInt16 (line 27) | typedef UInt16 XBox360_Short;
type SInt16 (line 28) | typedef SInt16 XBox360_SShort;
type XBOX360_PACKET (line 35) | typedef struct {
type XBOX360_HAT (line 41) | typedef struct {
type XBOX360_IN_REPORT (line 46) | typedef struct {
type XBOX360_OUT_LED (line 55) | typedef struct {
type XBOX360_OUT_RUMBLE (line 61) | typedef struct {
FILE: 360Controller/Controller.cpp
type HID_360 (line 28) | namespace HID_360 {
function Xbox360Peripheral (line 35) | static Xbox360Peripheral* GetOwner(IOService *us)
function IOUSBDevice (line 45) | static IOUSBDevice* GetOwnerProvider(const IOService *us)
function IOReturn (line 65) | IOReturn Xbox360ControllerClass::setProperties(OSObject *properties)
function IOReturn (line 74) | IOReturn Xbox360ControllerClass::newReportDescriptor(IOMemoryDescriptor ...
function IOReturn (line 86) | IOReturn Xbox360ControllerClass::setReport(IOMemoryDescriptor *report,IO...
function IOReturn (line 124) | IOReturn Xbox360ControllerClass::getReport(IOMemoryDescriptor *report,IO...
function OSString (line 131) | OSString* Xbox360ControllerClass::getDeviceString(UInt8 index,const char...
function OSString (line 146) | OSString* Xbox360ControllerClass::newManufacturerString() const
function OSNumber (line 151) | OSNumber* Xbox360ControllerClass::newPrimaryUsageNumber() const
function OSNumber (line 156) | OSNumber* Xbox360ControllerClass::newPrimaryUsagePageNumber() const
function OSNumber (line 161) | OSNumber* Xbox360ControllerClass::newProductIDNumber() const
function OSString (line 166) | OSString* Xbox360ControllerClass::newProductString() const
function OSString (line 171) | OSString* Xbox360ControllerClass::newSerialNumberString() const
function OSString (line 176) | OSString* Xbox360ControllerClass::newTransportString() const
function OSNumber (line 181) | OSNumber* Xbox360ControllerClass::newVendorIDNumber() const
function OSNumber (line 186) | OSNumber* Xbox360ControllerClass::newLocationIDNumber() const
FILE: 360Controller/Controller.h
function class (line 26) | class Xbox360ControllerClass : public IOHIDDevice
FILE: 360Controller/_60Controller.cpp
class LockRequired (line 39) | class LockRequired
method LockRequired (line 44) | LockRequired(IOLock *lock)
function UInt32 (line 56) | static UInt32 GetMaxPacketSize(IOUSBPipe *pipe)
function IOReturn (line 582) | IOReturn Xbox360Peripheral::message(UInt32 type,IOService *provider,void...
function XBox360_SShort (line 595) | static inline XBox360_SShort getAbsolute(XBox360_SShort value)
function IOReturn (line 747) | IOReturn Xbox360Peripheral::setProperties(OSObject *properties)
function IOHIDDevice (line 759) | IOHIDDevice* Xbox360Peripheral::getController(int index)
FILE: 360Controller/_60Controller.h
function class (line 33) | class Xbox360Peripheral : public IOService
FILE: 360Controller/chatpadkeys.cpp
type MAP_DATA (line 28) | struct MAP_DATA {
function ChatPad2USB (line 43) | unsigned char ChatPad2USB(unsigned char input)
FILE: Feedback360/devlink.c
function Device_Initialise (line 27) | bool Device_Initialise(DeviceLink *link,io_object_t device)
function Device_Finalise (line 45) | void Device_Finalise(DeviceLink *link)
function Device_Send (line 53) | bool Device_Send(DeviceLink *link,void *data,int length)
FILE: Feedback360/devlink.h
type DeviceLink (line 26) | typedef struct {
FILE: Feedback360/emulator.c
function Emulate_Initialise (line 39) | void Emulate_Initialise(ForceEmulator *emulator,int effectCount,void (*S...
function Emulate_Finalise (line 69) | void Emulate_Finalise(ForceEmulator *emulator)
function Emulate_Callback (line 78) | void Emulate_Callback(ForceEmulator *emulator,unsigned char large,unsign...
function Emulate_CreateEffect (line 86) | int Emulate_CreateEffect(ForceEmulator *emulator,const ForceParams *params)
function Emulate_ChangeEffect (line 104) | bool Emulate_ChangeEffect(ForceEmulator *emulator,int index,const ForceP...
function Emulate_DestroyEffect (line 120) | void Emulate_DestroyEffect(ForceEmulator *emulator,int index)
function Emulate_IsValidEffect (line 127) | bool Emulate_IsValidEffect(ForceEmulator *emulator,int index)
function Emulate_IsPlaying (line 134) | bool Emulate_IsPlaying(ForceEmulator *emulator,int index)
function Emulate_IsEmpty (line 140) | bool Emulate_IsEmpty(ForceEmulator *emulator)
function Emulate_Reset (line 151) | void Emulate_Reset(ForceEmulator *emulator)
function Emulate_Start (line 160) | void Emulate_Start(ForceEmulator *emulator,int index,int iterations)
function Emulate_Stop (line 175) | void Emulate_Stop(ForceEmulator *emulator,int index)
function Emulate_IsStopped (line 185) | bool Emulate_IsStopped(ForceEmulator *emulator)
function UInt32 (line 191) | UInt32 Emulate_Effects_Used(ForceEmulator *emulator)
function UInt32 (line 202) | UInt32 Emulate_Effects_Total(ForceEmulator *emulator)
function Emulate_SetEnable (line 208) | void Emulate_SetEnable(ForceEmulator *emulator,bool enable)
function Emulate_IsEnabled (line 220) | bool Emulate_IsEnabled(ForceEmulator *emulator)
function Emulate_SetPaused (line 226) | void Emulate_SetPaused(ForceEmulator *emulator,bool enable)
function Emulate_IsPaused (line 238) | bool Emulate_IsPaused(ForceEmulator *emulator)
function Emulate_SetGain (line 244) | void Emulate_SetGain(ForceEmulator *emulator,int gain,int gainMax)
function Emulate_Scale (line 256) | static inline int Emulate_Scale(int from,int to,int max,int val)
function Emulate_Force (line 263) | static void Emulate_Force(ForceEmulator *emulator,int force,int maxGain)
function Emulate_Timer (line 290) | static void Emulate_Timer(CFRunLoopTimerRef timer,void *context)
FILE: Feedback360/emulator.h
type ForceState (line 25) | typedef enum {
type ForceEffect (line 30) | typedef struct {
type ForceParams (line 51) | typedef struct {
type ForceEmulator (line 65) | typedef struct {
FILE: Feedback360/main.c
function HRESULT (line 30) | static HRESULT Feedback360QueryInterface(void *that,REFIID iid,LPVOID *ppv)
function ULONG (line 53) | static ULONG Feedback360AddRef(void *that)
function ULONG (line 60) | static ULONG Feedback360Release(void *that)
function IOReturn (line 72) | static IOReturn Feedback360Probe(void *that,CFDictionaryRef propertyTabl...
function IOReturn (line 80) | static IOReturn Feedback360Start(void *that,CFDictionaryRef propertyTabl...
function IOReturn (line 85) | static IOReturn Feedback360Stop(void *that)
function HRESULT (line 92) | static HRESULT Feedback360GetVersion(void *this,ForceFeedbackVersion *ve...
function Feedback360_Callback (line 106) | static void Feedback360_Callback(void *that,unsigned char large,unsigned...
function HRESULT (line 113) | static HRESULT Feedback360InitializeTerminate(void *that,NumVersion APIv...
function HRESULT (line 150) | static HRESULT Feedback360DestroyEffect(void *that,FFEffectDownloadID do...
function Feedback360SupportedEffect (line 157) | static bool Feedback360SupportedEffect(CFUUIDRef effect)
function Feedback360ConvertEffect (line 168) | static bool Feedback360ConvertEffect(const FFEFFECT *effect,ForceParams ...
function HRESULT (line 196) | static HRESULT Feedback360DownloadEffect(void *that,CFUUIDRef effectType...
function HRESULT (line 220) | static HRESULT Feedback360Escape(void *that,FFEffectDownloadID downloadI...
function HRESULT (line 262) | static HRESULT Feedback360GetEffectStatus(void *that,FFEffectDownloadID ...
function HRESULT (line 271) | static HRESULT Feedback360GetForceFeedbackCapabilities(void *this,FFCAPA...
function HRESULT (line 299) | static HRESULT Feedback360GetForceFeedbackState(void *that,ForceFeedback...
function HRESULT (line 314) | static HRESULT Feedback360SendForceFeedbackCommand(void *that,FFCommandF...
function HRESULT (line 338) | static HRESULT Feedback360SetProperty(void *that,FFProperty property,voi...
function HRESULT (line 356) | static HRESULT Feedback360StartEffect(void *that,FFEffectDownloadID down...
function HRESULT (line 365) | static HRESULT Feedback360StopEffect(void *that,FFEffectDownloadID downl...
function IOCFPlugInInterface (line 414) | static IOCFPlugInInterface** alloc360Feedback(CFUUIDRef uuid)
function dealloc360Feedback (line 429) | static void dealloc360Feedback(Xbox360ForceFeedback *this)
FILE: Feedback360/main.h
type _Xbox360ForceFeedback (line 28) | struct _Xbox360ForceFeedback
type Xbox360InterfaceMap (line 30) | typedef struct _Xbox360InterfaceMap {
type Xbox360ForceFeedback (line 35) | typedef struct _Xbox360ForceFeedback {
FILE: Pref360Control/DeviceItem.h
function interface (line 30) | interface DeviceItem : NSObject {
FILE: Pref360Control/DeviceLister.h
function interface (line 27) | interface DeviceLister : NSObject {
FILE: Pref360Control/MyAnalogStick.h
function interface (line 25) | interface MyAnalogStick : NSView
FILE: Pref360Control/MyCentreButtons.h
function interface (line 25) | interface MyCentreButtons : NSView
FILE: Pref360Control/MyDigitalStick.h
function interface (line 25) | interface MyDigitalStick : NSView
FILE: Pref360Control/MyMainButtons.h
function interface (line 25) | interface MyMainButtons : NSView
FILE: Pref360Control/MyShoulderButton.h
function interface (line 25) | interface MyShoulderButton : NSView
FILE: Pref360Control/Pref360ControlPref.h
function interface (line 40) | interface Pref360ControlPref : NSPreferencePane
FILE: Wireless360Controller/Wireless360Controller.cpp
function XBox360_SShort (line 34) | static inline XBox360_SShort getAbsolute(XBox360_SShort value)
function IOReturn (line 164) | IOReturn Wireless360Controller::setReport(IOMemoryDescriptor *report, IO...
function IOReturn (line 185) | IOReturn Wireless360Controller::newReportDescriptor(IOMemoryDescriptor *...
function IOReturn (line 198) | IOReturn Wireless360Controller::setProperties(OSObject *properties)
function OSString (line 212) | OSString* Wireless360Controller::newManufacturerString() const
function OSNumber (line 217) | OSNumber* Wireless360Controller::newPrimaryUsageNumber() const
function OSNumber (line 223) | OSNumber* Wireless360Controller::newPrimaryUsagePageNumber() const
function OSNumber (line 229) | OSNumber* Wireless360Controller::newProductIDNumber() const
function OSString (line 234) | OSString* Wireless360Controller::newProductString() const
function OSString (line 239) | OSString* Wireless360Controller::newTransportString() const
function OSNumber (line 244) | OSNumber* Wireless360Controller::newVendorIDNumber() const
FILE: Wireless360Controller/Wireless360Controller.h
function class (line 28) | class Wireless360Controller : public WirelessHIDDevice
FILE: WirelessGamingReceiver/WirelessDevice.cpp
function IOMemoryDescriptor (line 51) | IOMemoryDescriptor* WirelessDevice::NextPacket(void)
function OSNumber (line 96) | OSNumber* WirelessDevice::newLocationIDNumber() const
FILE: WirelessGamingReceiver/WirelessDevice.h
function class (line 32) | class WirelessDevice : public IOService
FILE: WirelessGamingReceiver/WirelessGamingReceiver.cpp
function UInt32 (line 40) | static UInt32 GetMaxPacketSize(IOUSBPipe *pipe)
function IOReturn (line 222) | IOReturn WirelessGamingReceiver::message(UInt32 type,IOService *provider...
function IOMemoryDescriptor (line 553) | IOMemoryDescriptor* WirelessGamingReceiver::ReadBuffer(int index)
function OSNumber (line 565) | OSNumber* WirelessGamingReceiver::newLocationIDNumber() const
FILE: WirelessGamingReceiver/WirelessGamingReceiver.h
type WIRELESS_CONNECTION (line 34) | typedef struct
function class (line 51) | class WirelessGamingReceiver : public IOService
FILE: WirelessGamingReceiver/WirelessHIDDevice.cpp
function IOReturn (line 84) | IOReturn WirelessHIDDevice::setReport(IOMemoryDescriptor *report, IOHIDR...
function OSNumber (line 268) | OSNumber* WirelessHIDDevice::newLocationIDNumber() const
function OSString (line 279) | OSString* WirelessHIDDevice::newSerialNumberString() const
FILE: WirelessGamingReceiver/WirelessHIDDevice.h
function class (line 30) | class WirelessHIDDevice : public IOHIDDevice
Condensed preview — 96 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (739K chars).
[
{
"path": "360Controller/360Controller.xcodeproj/project.pbxproj",
"chars": 15838,
"preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section *"
},
{
"path": "360Controller/ChatPad.cpp",
"chars": 4257,
"preview": "/*\n MICE Xbox 360 Controller driver for Mac OS X\n Copyright (C) 2006-2013 Colin Munro\n \n ChatPad.cpp - Implementation of"
},
{
"path": "360Controller/ChatPad.h",
"chars": 2026,
"preview": "/*\n MICE Xbox 360 Controller driver for Mac OS X\n Copyright (C) 2006-2013 Colin Munro\n \n ChatPad.h - Driver class for th"
},
{
"path": "360Controller/ControlStruct.h",
"chars": 3287,
"preview": "/*\n MICE Xbox 360 Controller driver for Mac OS X\n Copyright (C) 2006-2013 Colin Munro\n \n ControlStruct.h - S"
},
{
"path": "360Controller/Controller.cpp",
"chars": 6333,
"preview": "/*\n MICE Xbox 360 Controller driver for Mac OS X\n Copyright (C) 2006-2013 Colin Munro\n \n Controller.cpp - driver class f"
},
{
"path": "360Controller/Controller.h",
"chars": 1993,
"preview": "/*\n MICE Xbox 360 Controller driver for Mac OS X\n Copyright (C) 2006-2013 Colin Munro\n \n Controller.h - Driver class for"
},
{
"path": "360Controller/English.lproj/InfoPlist.strings",
"chars": 130,
"preview": "/* Localized versions of Info.plist keys */\n\nCFBundleName = \"360Controller\";\nNSHumanReadableCopyright = \"© Colin Munro,"
},
{
"path": "360Controller/Info copy.plist",
"chars": 1616,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.c"
},
{
"path": "360Controller/Info.plist",
"chars": 43251,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "360Controller/_60Controller.cpp",
"chars": 23422,
"preview": "/*\n MICE Xbox 360 Controller driver for Mac OS X\n Copyright (C) 2006-2013 Colin Munro\n Bug fixes contributed by"
},
{
"path": "360Controller/_60Controller.h",
"chars": 3897,
"preview": "/*\n MICE Xbox 360 Controller driver for Mac OS X\n Copyright (C) 2006-2013 Colin Munro\n \n _60Controller.h - d"
},
{
"path": "360Controller/chatpadhid.h",
"chars": 2841,
"preview": "/*\r\n MICE Xbox 360 Controller driver for Mac OS X\r\n Copyright (C) 2006-2013 Colin Munro\r\n \r\n chatpadhid.h - a HID descri"
},
{
"path": "360Controller/chatpadkeys.cpp",
"chars": 1728,
"preview": "/*\n MICE Xbox 360 Controller driver for Mac OS X\n Copyright (C) 2006-2013 Colin Munro\n \n chatpadkeys.cpp - Converts a ch"
},
{
"path": "360Controller/chatpadkeys.h",
"chars": 942,
"preview": "/*\n MICE Xbox 360 Controller driver for Mac OS X\n Copyright (C) 2006-2013 Colin Munro\n \n chatpadkeys.h - public function"
},
{
"path": "360Controller/version.plist",
"chars": 467,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.c"
},
{
"path": "360Controller/xbox360hid.h",
"chars": 6991,
"preview": "/*\n MICE Xbox 360 Controller driver for Mac OS X\n Copyright (C) 2006-2013 Colin Munro\n \n xbox360hid.h - HID "
},
{
"path": "360Daemon/360Daemon.1",
"chars": 3123,
"preview": ".\\\"Modified from man(1) of FreeBSD, the NetBSD mdoc.template, and mdoc.samples.\r\n.\\\"See Also:\r\n.\\\"man mdoc.samples for a"
},
{
"path": "360Daemon/360Daemon.m",
"chars": 11690,
"preview": "/*\n MICE Xbox 360 Controller driver for Mac OS X\n Copyright (C) 2006-2013 Colin Munro\n \n 360Daemon.m - main functionalit"
},
{
"path": "360Daemon/360Daemon.xcodeproj/project.pbxproj",
"chars": 9878,
"preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 45;\n\tobjects = {\n\n/* Begin PBXBuildFile section *"
},
{
"path": "360Daemon/360Daemon_Prefix.pch",
"chars": 160,
"preview": "//\n// Prefix header for all source files of the '360Daemon' target in the '360Daemon' project.\n//\n\n#ifdef __OBJC__\n #"
},
{
"path": "360Daemon/ControlPrefs.h",
"chars": 1609,
"preview": "/*\n MICE Xbox 360 Controller driver for Mac OS X\n Copyright (C) 2006-2013 Colin Munro\n \n ControlPrefs.h - interface to t"
},
{
"path": "360Daemon/ControlPrefs.m",
"chars": 3828,
"preview": "/*\n MICE Xbox 360 Controller driver for Mac OS X\n Copyright (C) 2006-2013 Colin Munro\n \n ControlPrefs.m - code to read a"
},
{
"path": "360Daemon/FoundationTool.pbproj/project.pbxproj",
"chars": 5026,
"preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 39;\n\tobjects = {\n\t\t014CEA4F0018CE4811CA2923 = {\n\t"
},
{
"path": "360Daemon/com.mice.360Daemon.plist",
"chars": 426,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "DriverTool/DriverTool.1",
"chars": 3050,
"preview": ".\\\"Modified from man(1) of FreeBSD, the NetBSD mdoc.template, and mdoc.samples.\n.\\\"See Also:\n.\\\"man mdoc.samples for a c"
},
{
"path": "DriverTool/DriverTool.m",
"chars": 6884,
"preview": "/*\n MICE Xbox 360 Controller driver for Mac OS X\n Copyright (C) 2006-2013 Colin Munro\n \n DriverTool.m - implementation o"
},
{
"path": "DriverTool/DriverTool.xcodeproj/project.pbxproj",
"chars": 7960,
"preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 45;\n\tobjects = {\n\n/* Begin PBXBuildFile section *"
},
{
"path": "DriverTool/DriverTool_Prefix.pch",
"chars": 162,
"preview": "//\n// Prefix header for all source files of the 'DriverTool' target in the 'DriverTool' project.\n//\n\n#ifdef __OBJC__\n "
},
{
"path": "Feedback360/English.lproj/InfoPlist.strings",
"chars": 130,
"preview": "/* Localized versions of Info.plist keys */\n\nCFBundleName = \"Feedback360\";\nNSHumanReadableCopyright = \"© Colin Munro, 2"
},
{
"path": "Feedback360/Feedback360.xcodeproj/colin.mode1",
"chars": 38405,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.c"
},
{
"path": "Feedback360/Feedback360.xcodeproj/project.pbxproj",
"chars": 11240,
"preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 45;\n\tobjects = {\n\n/* Begin PBXBuildFile section *"
},
{
"path": "Feedback360/Info.plist",
"chars": 1212,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "Feedback360/devlink.c",
"chars": 2245,
"preview": "/*\n MICE Xbox 360 Controller driver for Mac OS X\n Copyright (C) 2006-2013 Colin Munro\n \n devlink.c - code to"
},
{
"path": "Feedback360/devlink.h",
"chars": 1213,
"preview": "/*\n MICE Xbox 360 Controller driver for Mac OS X\n Copyright (C) 2006-2013 Colin Munro\n \n devlink.h - Interfa"
},
{
"path": "Feedback360/emulator.c",
"chars": 11121,
"preview": "/*\n MICE Xbox 360 Controller driver for Mac OS X\n Copyright (C) 2006-2013 Colin Munro\n \n emulator.c - simula"
},
{
"path": "Feedback360/emulator.h",
"chars": 3548,
"preview": "/*\n MICE Xbox 360 Controller driver for Mac OS X\n Copyright (C) 2006-2013 Colin Munro\n \n emulator.h - Interf"
},
{
"path": "Feedback360/main.c",
"chars": 16054,
"preview": "/*\n MICE Xbox 360 Controller driver for Mac OS X\n Copyright (C) 2006-2013 Colin Munro\n \n main.c - Main code "
},
{
"path": "Feedback360/main.h",
"chars": 2142,
"preview": "/*\n MICE Xbox 360 Controller driver for Mac OS X\n Copyright (C) 2006-2013 Colin Munro\n \n main.h - defines th"
},
{
"path": "Feedback360/version.plist",
"chars": 467,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.c"
},
{
"path": "Install360Controller/Install360Controller.pkgproj",
"chars": 28468,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "Install360Controller/Scripts/finish.sh",
"chars": 61,
"preview": "#!/bin/sh\n\n/usr/bin/touch /System/Library/Extensions\n\nexit 0\n"
},
{
"path": "Install360Controller/Scripts/upgrade.sh",
"chars": 1026,
"preview": "#!/bin/sh\n\n# Clear out daemon\n\nif [ -d /Library/StartupItems/360ControlDaemon ]; then\n /bin/rm -r /Library/StartupItem"
},
{
"path": "Install360Controller/Text/Welcome.rtf",
"chars": 9900,
"preview": "{\\rtf1\\ansi\\ansicpg1252\\cocoartf1187\\cocoasubrtf340\n\\cocoascreenfonts1{\\fonttbl\\f0\\fswiss\\fcharset0 Helvetica;}\n{\\colort"
},
{
"path": "Licence.txt",
"chars": 18011,
"preview": "\t\t GNU GENERAL PUBLIC LICENSE\n\t\t Version 2, June 1991\n\n Copyright (C) 1989, 1991 Free Software Foundation, Inc."
},
{
"path": "Pref360Control/DeviceItem.h",
"chars": 1487,
"preview": "/*\n MICE Xbox 360 Controller driver for Mac OS X\n Copyright (C) 2006-2013 Colin Munro\n \n DeviceItem.h - decl"
},
{
"path": "Pref360Control/DeviceItem.m",
"chars": 2968,
"preview": "/*\n MICE Xbox 360 Controller driver for Mac OS X\n Copyright (C) 2006-2013 Colin Munro\n \n DeviceItem.m - impl"
},
{
"path": "Pref360Control/DeviceLister.h",
"chars": 1274,
"preview": "/*\n MICE Xbox 360 Controller driver for Mac OS X\n Copyright (C) 2006-2013 Colin Munro\n \n DeviceLister.h - decleration of"
},
{
"path": "Pref360Control/DeviceLister.m",
"chars": 17112,
"preview": "/*\n MICE Xbox 360 Controller driver for Mac OS X\n Copyright (C) 2006-2013 Colin Munro\n \n DeviceLister.m - implementation"
},
{
"path": "Pref360Control/English.lproj/Pref360ControlPref.nib/designable.nib",
"chars": 96714,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<archive type=\"com.apple.InterfaceBuilder3.Cocoa.XIB\" version=\"8.00\">\n\t<data>\n\t\t<"
},
{
"path": "Pref360Control/Info.plist",
"chars": 1070,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "Pref360Control/MyAnalogStick.h",
"chars": 1270,
"preview": "/*\n MICE Xbox 360 Controller driver for Mac OS X\n Copyright (C) 2006-2013 Colin Munro\n \n MyAnalogStick.h - d"
},
{
"path": "Pref360Control/MyAnalogStick.m",
"chars": 3635,
"preview": "/*\n MICE Xbox 360 Controller driver for Mac OS X\n Copyright (C) 2006-2013 Colin Munro\n \n MyAnalogStick.m - i"
},
{
"path": "Pref360Control/MyCentreButtons.h",
"chars": 1148,
"preview": "/*\n MICE Xbox 360 Controller driver for Mac OS X\n Copyright (C) 2006-2013 Colin Munro\n \n MyCentreButtons.h -"
},
{
"path": "Pref360Control/MyCentreButtons.m",
"chars": 2929,
"preview": "/*\n MICE Xbox 360 Controller driver for Mac OS X\n Copyright (C) 2006-2013 Colin Munro\n \n MyCentreButtons.m -"
},
{
"path": "Pref360Control/MyDigitalStick.h",
"chars": 1220,
"preview": "/*\n MICE Xbox 360 Controller driver for Mac OS X\n Copyright (C) 2006-2013 Colin Munro\n \n MyDigitalStick.h - "
},
{
"path": "Pref360Control/MyDigitalStick.m",
"chars": 3647,
"preview": "/*\n MICE Xbox 360 Controller driver for Mac OS X\n Copyright (C) 2006-2013 Colin Munro\n \n MyDigitalStick.m - "
},
{
"path": "Pref360Control/MyMainButtons.h",
"chars": 1120,
"preview": "/*\n MICE Xbox 360 Controller driver for Mac OS X\n Copyright (C) 2006-2013 Colin Munro\n \n MyMainButtons.h - d"
},
{
"path": "Pref360Control/MyMainButtons.m",
"chars": 3311,
"preview": "/*\n MICE Xbox 360 Controller driver for Mac OS X\n Copyright (C) 2006-2013 Colin Munro\n \n MyMainButtons.m - i"
},
{
"path": "Pref360Control/MyShoulderButton.h",
"chars": 1050,
"preview": "/*\n MICE Xbox 360 Controller driver for Mac OS X\n Copyright (C) 2006-2013 Colin Munro\n \n MyShoulderButton.h "
},
{
"path": "Pref360Control/MyShoulderButton.m",
"chars": 1606,
"preview": "/*\n MICE Xbox 360 Controller driver for Mac OS X\n Copyright (C) 2006-2013 Colin Munro\n \n MyShoulderButton.m "
},
{
"path": "Pref360Control/Pref360Control.xcodeproj/project.pbxproj",
"chars": 26367,
"preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 45;\n\tobjects = {\n\n/* Begin PBXBuildFile section *"
},
{
"path": "Pref360Control/Pref360ControlPref.h",
"chars": 2994,
"preview": "/*\n MICE Xbox 360 Controller driver for Mac OS X\n Copyright (C) 2006-2013 Colin Munro\n \n Pref360ControlPref."
},
{
"path": "Pref360Control/Pref360ControlPref.m",
"chars": 24150,
"preview": "/*\n MICE Xbox 360 Controller driver for Mac OS X\n Copyright (C) 2006-2013 Colin Munro\n \n Pref360ControlPref."
},
{
"path": "Pref360Control/Pref360Control_Prefix.pch",
"chars": 200,
"preview": "//\n// Prefix header for all source files of the 'Pref360Control' target in the 'Pref360Control' project.\n//\n\n#ifdef __OB"
},
{
"path": "Pref360Control/version.plist",
"chars": 527,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.c"
},
{
"path": "Readme.rtf",
"chars": 6441,
"preview": "{\\rtf1\\ansi\\ansicpg1252\\cocoartf1187\\cocoasubrtf340\n\\cocoascreenfonts1{\\fonttbl\\f0\\fswiss\\fcharset0 Helvetica;}\n{\\colort"
},
{
"path": "Wireless360Controller/IOKitDriver.pbproj/project.pbxproj",
"chars": 6479,
"preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 39;\n\tobjects = {\n\t\t06AA1265FFB2107B11CA28AA = {\n\t"
},
{
"path": "Wireless360Controller/Info.plist",
"chars": 1716,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "Wireless360Controller/Wireless360Controller.cpp",
"chars": 8030,
"preview": "/*\n MICE Xbox 360 Controller driver for Mac OS X\n Copyright (C) 2006-2013 Colin Munro\n \n Wireless360Controll"
},
{
"path": "Wireless360Controller/Wireless360Controller.h",
"chars": 2287,
"preview": "/*\n MICE Xbox 360 Controller driver for Mac OS X\n Copyright (C) 2006-2013 Colin Munro\n \n Wireless360Controll"
},
{
"path": "Wireless360Controller/Wireless360Controller.xcodeproj/project.pbxproj",
"chars": 9076,
"preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section *"
},
{
"path": "Wireless360Controller/version.plist",
"chars": 467,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.c"
},
{
"path": "WirelessGamingReceiver/English.lproj/InfoPlist.strings",
"chars": 98,
"preview": "/* Localized versions of Info.plist keys */\n\nNSHumanReadableCopyright = \"© Colin Munro, 2007-11\";"
},
{
"path": "WirelessGamingReceiver/IOKitDriver.pbproj/project.pbxproj",
"chars": 6479,
"preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 39;\n\tobjects = {\n\t\t06AA1265FFB2107B11CA28AA = {\n\t"
},
{
"path": "WirelessGamingReceiver/Info.plist",
"chars": 2088,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "WirelessGamingReceiver/WirelessDevice.cpp",
"chars": 3361,
"preview": "/*\n MICE Xbox 360 Controller driver for Mac OS X\n Copyright (C) 2006-2013 Colin Munro\n \n WirelessDevice.cpp "
},
{
"path": "WirelessGamingReceiver/WirelessDevice.h",
"chars": 1845,
"preview": "/*\n MICE Xbox 360 Controller driver for Mac OS X\n Copyright (C) 2006-2013 Colin Munro\n \n WirelessDevice.h - "
},
{
"path": "WirelessGamingReceiver/WirelessGamingReceiver.cpp",
"chars": 18776,
"preview": "/*\n MICE Xbox 360 Controller driver for Mac OS X\n Copyright (C) 2006-2013 Colin Munro\n \n WirelessGamingRecei"
},
{
"path": "WirelessGamingReceiver/WirelessGamingReceiver.h",
"chars": 2820,
"preview": "/*\n MICE Xbox 360 Controller driver for Mac OS X\n Copyright (C) 2006-2013 Colin Munro\n \n WirelessGamingRecei"
},
{
"path": "WirelessGamingReceiver/WirelessGamingReceiver.xcodeproj/colin.mode1",
"chars": 44888,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.c"
},
{
"path": "WirelessGamingReceiver/WirelessGamingReceiver.xcodeproj/project.pbxproj",
"chars": 11383,
"preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section *"
},
{
"path": "WirelessGamingReceiver/WirelessHIDDevice.cpp",
"chars": 8205,
"preview": "/*\n MICE Xbox 360 Controller driver for Mac OS X\n Copyright (C) 2006-2013 Colin Munro\n \n WirelessHIDDevice.c"
},
{
"path": "WirelessGamingReceiver/WirelessHIDDevice.h",
"chars": 2144,
"preview": "/*\n MICE Xbox 360 Controller driver for Mac OS X\n Copyright (C) 2006-2013 Colin Munro\n \n WirelessHIDDevice.h"
},
{
"path": "WirelessGamingReceiver/devices.h",
"chars": 1103,
"preview": "/*\n MICE Xbox 360 Controller driver for Mac OS X\n Copyright (C) 2006-2013 Colin Munro\n \n devics.h - contains"
},
{
"path": "WirelessGamingReceiver/version.plist",
"chars": 467,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.c"
},
{
"path": "build",
"chars": 2622,
"preview": "#!/bin/bash\nzip -r ../360ControllerSource.zip *\ncd Feedback360\nxcodebuild -configuration Deployment\nif [ $? -ne 0 ]\n th"
}
]
// ... and 10 more files (download for full content)
About this extraction
This page contains the full source code of the electric-monk/360Controller GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 96 files (639.3 KB), approximately 197.1k tokens, and a symbol index with 142 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.