diff --git a/stepmania/PBProject/stepmania.pbproj/project.pbxproj b/stepmania/PBProject/stepmania.pbproj/project.pbxproj index 3ea804c88f..259aad7db9 100755 --- a/stepmania/PBProject/stepmania.pbproj/project.pbxproj +++ b/stepmania/PBProject/stepmania.pbproj/project.pbxproj @@ -90,6 +90,10 @@ AA1B08400762532800835464 /* Preference.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AA1B083B0762532800835464 /* Preference.cpp */; }; AA1CD943060AE571003702C4 /* RageSoundDriver_Generic_Software.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AA1CD941060AE571003702C4 /* RageSoundDriver_Generic_Software.cpp */; }; AA1CD944060AE571003702C4 /* RageSoundDriver_Generic_Software.h in Headers */ = {isa = PBXBuildFile; fileRef = AA1CD942060AE571003702C4 /* RageSoundDriver_Generic_Software.h */; }; + AA1F9C4709AF1BF5002C15A8 /* PumpDevice.h in Headers */ = {isa = PBXBuildFile; fileRef = AA1F9C4509AF1BF5002C15A8 /* PumpDevice.h */; }; + AA1F9C4809AF1BF5002C15A8 /* PumpDevice.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AA1F9C4609AF1BF5002C15A8 /* PumpDevice.cpp */; }; + AA1F9C4909AF1BF5002C15A8 /* PumpDevice.h in Headers */ = {isa = PBXBuildFile; fileRef = AA1F9C4509AF1BF5002C15A8 /* PumpDevice.h */; }; + AA1F9C4A09AF1BF5002C15A8 /* PumpDevice.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AA1F9C4609AF1BF5002C15A8 /* PumpDevice.cpp */; }; AA21D59D0712ADE4008B825F /* ScreenDimensions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AA21D59C0712ADE4008B825F /* ScreenDimensions.cpp */; }; AA21D5A20712AE16008B825F /* ThemeMetric.h in Headers */ = {isa = PBXBuildFile; fileRef = AA21D5A10712AE16008B825F /* ThemeMetric.h */; }; AA22CBA506DE909C0083BA97 /* ScreenNetSelectMusic.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AA22CBA306DE909C0083BA97 /* ScreenNetSelectMusic.cpp */; }; @@ -1945,6 +1949,8 @@ AA1DC47804A4866B00D02EE9 /* ActorCollision.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.h; name = ActorCollision.h; path = ../src/ActorCollision.h; sourceTree = ""; }; AA1DCB6104A4872700D02EE9 /* glext.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.h; name = glext.h; path = ../src/glext.h; sourceTree = ""; }; AA1DCB6304A4872700D02EE9 /* MenuInput.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.h; name = MenuInput.h; path = ../src/MenuInput.h; sourceTree = ""; }; + AA1F9C4509AF1BF5002C15A8 /* PumpDevice.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PumpDevice.h; sourceTree = ""; }; + AA1F9C4609AF1BF5002C15A8 /* PumpDevice.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PumpDevice.cpp; sourceTree = ""; }; AA21D59C0712ADE4008B825F /* ScreenDimensions.cpp */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.cpp; name = ScreenDimensions.cpp; path = ../src/ScreenDimensions.cpp; sourceTree = ""; }; AA21D5A10712AE16008B825F /* ThemeMetric.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.h; name = ThemeMetric.h; path = ../src/ThemeMetric.h; sourceTree = ""; }; AA22CBA306DE909C0083BA97 /* ScreenNetSelectMusic.cpp */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.cpp; name = ScreenNetSelectMusic.cpp; path = ../src/ScreenNetSelectMusic.cpp; sourceTree = ""; }; @@ -4008,6 +4014,8 @@ AA4470BA098476F600983E82 /* KeyboardDevice.h */, AA2FB62909120FC5000FD574 /* PreferredLanguage.m */, AAF744A306116B0500B19AD1 /* PublicUtility */, + AA1F9C4609AF1BF5002C15A8 /* PumpDevice.cpp */, + AA1F9C4509AF1BF5002C15A8 /* PumpDevice.h */, AABBFCD209838C3A00F077E2 /* SMMain.mm */, AAABB2D90979DB5B006C9F25 /* SMMainThread.h */, AAABB2DA0979DB5B006C9F25 /* SMMainThread.m */, @@ -4520,6 +4528,7 @@ AAB55EBC09A7E3D3008FDC69 /* ScreenGameplaySyncMachine.h in Headers */, AAB55EBE09A7E3D3008FDC69 /* ScreenUnlockBrowse.h in Headers */, AAB55EC009A7E3D3008FDC69 /* ScreenUnlockCelebrate.h in Headers */, + AA1F9C4709AF1BF5002C15A8 /* PumpDevice.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -4976,6 +4985,7 @@ AA40D37A09A08D650068C0D5 /* AdjustSync.h in Headers */, AAB55FFF09A84E62008FDC69 /* ScreenUnlockCelebrate.h in Headers */, AAB5600109A84E64008FDC69 /* ScreenUnlockBrowse.h in Headers */, + AA1F9C4909AF1BF5002C15A8 /* PumpDevice.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -5647,6 +5657,7 @@ AAB55EBB09A7E3D3008FDC69 /* ScreenGameplaySyncMachine.cpp in Sources */, AAB55EBD09A7E3D3008FDC69 /* ScreenUnlockBrowse.cpp in Sources */, AAB55EBF09A7E3D3008FDC69 /* ScreenUnlockCelebrate.cpp in Sources */, + AA1F9C4809AF1BF5002C15A8 /* PumpDevice.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -6056,6 +6067,7 @@ AA40D51309A08D650068C0D5 /* AdjustSync.cpp in Sources */, AAB5600009A84E63008FDC69 /* ScreenUnlockCelebrate.cpp in Sources */, AAB5600209A84E65008FDC69 /* ScreenUnlockBrowse.cpp in Sources */, + AA1F9C4A09AF1BF5002C15A8 /* PumpDevice.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/stepmania/src/arch/InputHandler/InputHandler_Carbon.cpp b/stepmania/src/arch/InputHandler/InputHandler_Carbon.cpp index b53d39cdc0..05e37dc647 100644 --- a/stepmania/src/arch/InputHandler/InputHandler_Carbon.cpp +++ b/stepmania/src/arch/InputHandler/InputHandler_Carbon.cpp @@ -10,6 +10,7 @@ #include "archutils/Darwin/DarwinThreadHelpers.h" #include "archutils/Darwin/KeyboardDevice.h" #include "archutils/Darwin/JoystickDevice.h" +#include "archutils/Darwin/PumpDevice.h" #include void InputHandler_Carbon::QueueCallBack( void *target, int result, void *refcon, void *sender ) @@ -159,13 +160,15 @@ static HIDDevice *MakeDevice( InputDevice id ) return new KeyboardDevice; if( id <= DEVICE_JOY16 ) return new JoystickDevice; + if( id <= DEVICE_PUMP2 ) + return new PumpDevice; return NULL; } -void InputHandler_Carbon::AddDevices( int usage, InputDevice &id ) +void InputHandler_Carbon::AddDevices( int usagePage, int usage, InputDevice &id ) { io_iterator_t iter; - CFDictionaryRef dict = GetMatchingDictionary( kHIDPage_GenericDesktop, usage ); + CFDictionaryRef dict = GetMatchingDictionary( usagePage, usage ); kern_return_t ret = IOServiceAddMatchingNotification( m_NotifyPort, kIOFirstMatchNotification, dict, InputHandler_Carbon::DeviceAdded, this, &iter ); io_object_t device; @@ -216,10 +219,12 @@ InputHandler_Carbon::InputHandler_Carbon() : m_Sem( "Input thread started" ), m_ m_NotifyPort = IONotificationPortCreate( kIOMasterPortDefault ); // Add devices. - AddDevices( kHIDUsage_GD_Keyboard, id ); + AddDevices( kHIDPage_GenericDesktop, kHIDUsage_GD_Keyboard, id ); id = DEVICE_JOY1; - AddDevices( kHIDUsage_GD_Joystick, id ); - AddDevices( kHIDUsage_GD_GamePad, id ); + AddDevices( kHIDPage_GenericDesktop, kHIDUsage_GD_Joystick, id ); + AddDevices( kHIDPage_GenericDesktop, kHIDUsage_GD_GamePad, id ); + id = DEVICE_PUMP1; + AddDevices( 0xFF00, 0x0001, id ); // Pump pads use the first vendor specific usage page. m_bChanged = false; if( PREFSMAN->m_bThreadedInput ) diff --git a/stepmania/src/arch/InputHandler/InputHandler_Carbon.h b/stepmania/src/arch/InputHandler/InputHandler_Carbon.h index a558a2393a..d7126e536b 100644 --- a/stepmania/src/arch/InputHandler/InputHandler_Carbon.h +++ b/stepmania/src/arch/InputHandler/InputHandler_Carbon.h @@ -26,7 +26,7 @@ private: static void DeviceAdded( void *refCon, io_iterator_t iter ); static void DeviceChanged( void *refCon, io_service_t service, natural_t messageType, void *arg ); void StartDevices(); - void AddDevices( int usage, InputDevice &id ); + void AddDevices( int usagePage, int usage, InputDevice &id ); public: InputHandler_Carbon(); diff --git a/stepmania/src/archutils/Darwin/PumpDevice.cpp b/stepmania/src/archutils/Darwin/PumpDevice.cpp new file mode 100644 index 0000000000..eaf2723d53 --- /dev/null +++ b/stepmania/src/archutils/Darwin/PumpDevice.cpp @@ -0,0 +1,119 @@ +#include "global.h" +#include "PumpDevice.h" +#include "EnumHelper.h" + +void PumpDevice::Open() +{ + AddElementToQueue( 2 ); + AddElementToQueue( 3 ); + AddElementToQueue( 4 ); + AddElementToQueue( 6 ); +} + +void PumpDevice::GetButtonPresses( vector >& vPresses, int cookie, + int value, const RageTimer& now ) const +{ + DeviceButton db1 = DeviceButton_Invalid; + DeviceButton db2 = DeviceButton_Invalid; + bool pressed; + + LOG->Trace( "Pump button: %d, %d.", cookie, value ); + switch( cookie ) + { + case 2: + db1 = JOY_BUTTON_1; + pressed = value == 0; + break; + case 3: + switch( value ) + { + case 1: + db1 = JOY_BUTTON_5; + pressed = true; + break; + case 2: + db1 = JOY_BUTTON_4; + pressed = true; + break; + case 3: + db1 = JOY_BUTTON_5; + db2 = JOY_BUTTON_4; + pressed = false; + break; + } + break; + case 4: + switch( value ) + { + case 1: + db1 = JOY_BUTTON_2; + pressed = true; + break; + case 2: + db1 = JOY_BUTTON_3; + pressed = true; + break; + case 3: + db1 = JOY_BUTTON_2; + db2 = JOY_BUTTON_3; + pressed = false; + break; + } + break; + case 6: + db1 = JOY_BUTTON_6; + pressed = value == 2; + break; + } + + if( db1 != DeviceButton_Invalid ) + { + DeviceInput di( id, db1, pressed ? 1.0f : 0.0f , now ); + vPresses.push_back( pair(di, pressed) ); + } + if( db2 != DeviceButton_Invalid ) + { + DeviceInput di( id, db2, pressed ? 1.0f : 0.0f , now ); + vPresses.push_back( pair(di, pressed) ); + } +} + +int PumpDevice::AssignIDs( InputDevice startID ) +{ + id = DEVICE_NONE; + if( startID < DEVICE_PUMP1 || startID > DEVICE_PUMP2 ) + return 0; + id = startID; + return 1; +} + +void PumpDevice::GetDevicesAndDescriptions( vector& dev, vector& desc ) const +{ + dev.push_back( id ); + desc.push_back( "Pump USB" ); +} + +/* + * (c) 2005-2006 Steve Checkoway + * All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, and/or sell copies of the Software, and to permit persons to + * whom the Software is furnished to do so, provided that the above + * copyright notice(s) and this permission notice appear in all copies of + * the Software and that both the above copyright notice(s) and this + * permission notice appear in supporting documentation. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF + * THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS + * INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT + * OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS + * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ diff --git a/stepmania/src/archutils/Darwin/PumpDevice.h b/stepmania/src/archutils/Darwin/PumpDevice.h new file mode 100644 index 0000000000..9520306703 --- /dev/null +++ b/stepmania/src/archutils/Darwin/PumpDevice.h @@ -0,0 +1,49 @@ +#ifndef PUMP_DEVICE_H +#define PUMP_DEVICE_H + +#include "HIDDevice.h" + +class PumpDevice : public HIDDevice +{ +private: + InputDevice id; +protected: + bool AddLogicalDevice( int usagePage, int usage ) { return true; } + void AddElement( int usagePage, int usage, int cookie, + const CFDictionaryRef properties ) { } + void Open(); + bool SupportsVidPid( int vid, int pid ) { return vid == 0x0d2f && pid == 0x0001; } + +public: + void GetButtonPresses( vector >& vPresses, int cookie, + int value, const RageTimer& now ) const; + int AssignIDs( InputDevice startID ); + void GetDevicesAndDescriptions( vector& dev, vector& desc ) const; +}; + +#endif + +/* + * (c) 2006 Steve Checkoway + * All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, and/or sell copies of the Software, and to permit persons to + * whom the Software is furnished to do so, provided that the above + * copyright notice(s) and this permission notice appear in all copies of + * the Software and that both the above copyright notice(s) and this + * permission notice appear in supporting documentation. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF + * THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS + * INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT + * OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS + * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */