diff --git a/CMake/DefineOptions.cmake b/CMake/DefineOptions.cmake index 677d6000eb..0a3240587a 100644 --- a/CMake/DefineOptions.cmake +++ b/CMake/DefineOptions.cmake @@ -61,6 +61,7 @@ elseif(LINUX) # Builder beware: later versions of ffmpeg may break! option(WITH_SYSTEM_FFMPEG "Build with the system's FFMPEG, disabled build with bundled's FFMPEG" OFF) option(WITH_CRYSTALHD_DISABLED "Build FFMPEG without Crystal HD support." OFF) + option(WITH_MINIMAID "Build with Minimaid Lights Support." ON) option(WITH_TTY "Build with Linux TTY Input Support." OFF) option(WITH_PROFILING "Build with Profiling Support." OFF) option(WITH_GLES2 "Build with OpenGL ES 2.0 Support." ON) diff --git a/extern/CMakeProject-mmmagic.cmake b/extern/CMakeProject-mmmagic.cmake new file mode 100644 index 0000000000..df02cb8990 --- /dev/null +++ b/extern/CMakeProject-mmmagic.cmake @@ -0,0 +1,15 @@ +if(LINUX) + if(WITH_MINIMAID) + if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64") + list(APPEND SMDATA_LINK_LIB + "${SM_EXTERN_DIR}/libmmmagic/linux-64bit/libmmmagic.a" + "udev" + ) + else() + list(APPEND SMDATA_LINK_LIB + "${SM_EXTERN_DIR}/libmmmagic/linux-32bit/libmmmagic.a" + "udev" + ) + endif() + endif() +endif() diff --git a/extern/libmmmagic/linux-32bit/libmmmagic.a b/extern/libmmmagic/linux-32bit/libmmmagic.a new file mode 100644 index 0000000000..7ed07034f9 Binary files /dev/null and b/extern/libmmmagic/linux-32bit/libmmmagic.a differ diff --git a/extern/libmmmagic/linux-64bit/libmmmagic.a b/extern/libmmmagic/linux-64bit/libmmmagic.a new file mode 100644 index 0000000000..c90874f6ea Binary files /dev/null and b/extern/libmmmagic/linux-64bit/libmmmagic.a differ diff --git a/extern/libmmmagic/mmmagic.h b/extern/libmmmagic/mmmagic.h new file mode 100644 index 0000000000..fc17938c4e --- /dev/null +++ b/extern/libmmmagic/mmmagic.h @@ -0,0 +1,75 @@ +/* +IMPORTANT NOTE FOR *NIX USERS: +You must add permissions to access the minimaid as a user! Either do this through udev or manually or something.The below should work but fuck if it works for me :/ + + +sudo -i +echo SUBSYSTEM==\"usb\", ATTR{idVendor}==\"beef\", ATTR{idProduct}==\"5730\", MODE=\"0666\" > /etc/udev/rules.d/50-minimaid + + + +*/ + +#ifndef MMMAGIC_H +#define MMMAGIC_H + +#include +#include + + +#ifdef __cplusplus +extern "C" { +#endif + + +/*Minimaid bit identifiers*/ +//CANINET_LIGHTS +#define DDR_DOUBLE_BASS_LIGHTS 0 //unknown but guessed +#define DDR_DOUBLE_PLAYER1_PANEL 2 +#define DDR_DOUBLE_PLAYER2_PANEL 3 +#define DDR_DOUBLE_MARQUEE_LOWER_RIGHT 4 +#define DDR_DOUBLE_MARQUEE_UPPER_RIGHT 5 +#define DDR_DOUBLE_MARQUEE_LOWER_LEFT 6 +#define DDR_DOUBLE_MARQUEE_UPPER_LEFT 7 + +//PADX_LIGHTS +#define DDR_DOUBLE_PAD_UP 0 +#define DDR_DOUBLE_PAD_DOWN 1 +#define DDR_DOUBLE_PAD_LEFT 2 +#define DDR_DOUBLE_PAD_RIGHT 3 +#define DDR_DOUBLE_PAD_RESET 4 + +#define BIT(i) (1<<(i)) +#define BIT_IS_SET(v,i) ((v&BIT(i))!=0) +static bool __bitValid(int bit); + + +//minimaid prototypes +void mm_setDDRPad1Light(int, int); +void mm_setDDRPad2Light(int, int); +void mm_setDDRCabinetLight(int, int); +void mm_setDDRBassLight(int, int); + + +bool mm_connect_minimaid(); +bool mm_setKB(bool val); + +void mm_setDDRAllOn(); +void mm_setDDRAllOff(); + +void mm_setBlueLED(unsigned char value); +void mm_setMMOutputReports(unsigned char a, unsigned char b, unsigned char c, unsigned char d); +bool mm_sendDDRMiniMaidUpdate(); +static void mm_init(); +static unsigned char mm_turnON(unsigned char set, int bit); +static unsigned char mm_turnOFF(unsigned char set, int bit); + + + +//void mm_input_callback(void *ctx); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/CMakeData-arch.cmake b/src/CMakeData-arch.cmake index f99120e3b3..e23e5036e7 100644 --- a/src/CMakeData-arch.cmake +++ b/src/CMakeData-arch.cmake @@ -319,6 +319,14 @@ if(NOT APPLE) "arch/Lights/LightsDriver_LinuxParallel.h" ) endif() + if (WITH_MINIMAID) + list(APPEND SMDATA_ARCH_LIGHTS_SRC + "arch/Lights/LightsDriver_LinuxMinimaid.cpp" + ) + list(APPEND SMDATA_ARCH_LIGHTS_HPP + "arch/Lights/LightsDriver_LinuxMinimaid.h" + ) + endif() endif() endif(WIN32) endif(NOT APPLE) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 7135e1a12f..a6247522e7 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -331,6 +331,7 @@ list(APPEND SMDATA_LINK_LIB "glew" "jpeg" ) +include(../extern/CMakeProject-mmmagic.cmake) if (HAS_MP3) list(FIND SMDATA_LINK_LIB "jsoncpp" JSON_INDEX) diff --git a/src/arch/Lights/LightsDriver.h b/src/arch/Lights/LightsDriver.h index 5420f25cf5..b785fd3676 100644 --- a/src/arch/Lights/LightsDriver.h +++ b/src/arch/Lights/LightsDriver.h @@ -18,9 +18,9 @@ public: virtual void Set( const LightsState *ls ) = 0; }; -#define REGISTER_SOUND_DRIVER_CLASS2( name, x ) \ +#define REGISTER_LIGHTS_DRIVER_CLASS2( name, x ) \ static RegisterRageDriver register_##x( &LightsDriver::m_pDriverList, #name, CreateClass ) -#define REGISTER_SOUND_DRIVER_CLASS( name ) REGISTER_SOUND_DRIVER_CLASS2( name, name ) +#define REGISTER_LIGHTS_DRIVER_CLASS( name ) REGISTER_LIGHTS_DRIVER_CLASS2( name, name ) #endif diff --git a/src/arch/Lights/LightsDriver_Export.cpp b/src/arch/Lights/LightsDriver_Export.cpp index 17e70356ee..9d0e3a4dee 100644 --- a/src/arch/Lights/LightsDriver_Export.cpp +++ b/src/arch/Lights/LightsDriver_Export.cpp @@ -1,7 +1,7 @@ #include "global.h" #include "LightsDriver_Export.h" -REGISTER_SOUND_DRIVER_CLASS(Export); +REGISTER_LIGHTS_DRIVER_CLASS(Export); RageMutex LightsDriver_Export::m_Lock( "LightsDriver_Export"); LightsState LightsDriver_Export::m_State; diff --git a/src/arch/Lights/LightsDriver_LinuxMinimaid.cpp b/src/arch/Lights/LightsDriver_LinuxMinimaid.cpp new file mode 100644 index 0000000000..63f4496d1f --- /dev/null +++ b/src/arch/Lights/LightsDriver_LinuxMinimaid.cpp @@ -0,0 +1,100 @@ +// LightsDriver_LinuxMinimaid - driver for lights on the Minimaid with libmmmagic +/* To use, StepMania must be run with root permissions, or udev rule for the + * device must be made something like this (but it's not quite right): + * echo SUBSYSTEM==\"usb\", ATTR{idVendor}==\"beef\", ATTR{idProduct}==\"5730\", MODE=\"0666\" > /etc/udev/rules.d/50-minimaid + */ + +#include "global.h" +#include "LightsDriver_LinuxMinimaid.h" +#include "../../../extern/libmmmagic/mmmagic.h" + +REGISTER_LIGHTS_DRIVER_CLASS( LinuxMinimaid ); + +LightsDriver_LinuxMinimaid::LightsDriver_LinuxMinimaid() +{ + // libmmmagic is actually statically linked in, so there's no wrapper + // initializing to do. -Kyz + _mmmagic_loaded= true; + mm_connect_minimaid(); + mm_setKB(true); +} + +LightsDriver_LinuxMinimaid::~LightsDriver_LinuxMinimaid() +{ + // libmmmagic is actually statically linked in, so there's no wrapper + // destruction to do. -Kyz +} + +void LightsDriver_LinuxMinimaid::Set(LightsState const* ls) +{ + if(_mmmagic_loaded) + { + mm_setDDRAllOff(); + + // Set the cabinet light values + if(ls->m_bCabinetLights[LIGHT_MARQUEE_UP_LEFT]) + { + mm_setDDRCabinetLight(DDR_DOUBLE_MARQUEE_UPPER_LEFT, 1); + } + if(ls->m_bCabinetLights[LIGHT_MARQUEE_UP_RIGHT]) + { + mm_setDDRCabinetLight(DDR_DOUBLE_MARQUEE_UPPER_RIGHT, 1); + } + if(ls->m_bCabinetLights[LIGHT_MARQUEE_LR_LEFT]) + { + mm_setDDRCabinetLight(DDR_DOUBLE_MARQUEE_LOWER_LEFT, 1); + } + if(ls->m_bCabinetLights[LIGHT_MARQUEE_LR_RIGHT]) + { + mm_setDDRCabinetLight(DDR_DOUBLE_MARQUEE_LOWER_RIGHT, 1); + } + if(ls->m_bCabinetLights[LIGHT_BASS_LEFT] || ls->m_bCabinetLights[LIGHT_BASS_RIGHT]) + { + mm_setDDRBassLight(DDR_DOUBLE_BASS_LIGHTS, 1); + } + + if(ls->m_bGameButtonLights[GameController_1][DANCE_BUTTON_LEFT]) + { + mm_setDDRPad1Light(DDR_DOUBLE_PAD_LEFT, 1); + } + if(ls->m_bGameButtonLights[GameController_1][DANCE_BUTTON_RIGHT]) + { + mm_setDDRPad1Light(DDR_DOUBLE_PAD_RIGHT, 1); + } + if(ls->m_bGameButtonLights[GameController_1][DANCE_BUTTON_UP]) + { + mm_setDDRPad1Light(DDR_DOUBLE_PAD_UP, 1); + } + if(ls->m_bGameButtonLights[GameController_1][DANCE_BUTTON_DOWN]) + { + mm_setDDRPad1Light(DDR_DOUBLE_PAD_DOWN, 1); + } + if(ls->m_bGameButtonLights[GameController_1][GAME_BUTTON_START]) + { + mm_setDDRCabinetLight(DDR_DOUBLE_PLAYER1_PANEL, 1); + } + if(ls->m_bGameButtonLights[GameController_2][DANCE_BUTTON_LEFT]) + { + mm_setDDRPad2Light(DDR_DOUBLE_PAD_LEFT, 1); + } + if(ls->m_bGameButtonLights[GameController_2][DANCE_BUTTON_RIGHT]) + { + mm_setDDRPad2Light(DDR_DOUBLE_PAD_RIGHT, 1); + } + if(ls->m_bGameButtonLights[GameController_2][DANCE_BUTTON_UP]) + { + mm_setDDRPad2Light(DDR_DOUBLE_PAD_UP, 1); + } + if(ls->m_bGameButtonLights[GameController_2][DANCE_BUTTON_DOWN]) + { + mm_setDDRPad2Light(DDR_DOUBLE_PAD_DOWN, 1); + } + if(ls->m_bGameButtonLights[GameController_2][GAME_BUTTON_START]) + { + mm_setDDRCabinetLight(DDR_DOUBLE_PLAYER2_PANEL, 1); + } + + // Output the information + mm_sendDDRMiniMaidUpdate(); + } +} diff --git a/src/arch/Lights/LightsDriver_LinuxMinimaid.h b/src/arch/Lights/LightsDriver_LinuxMinimaid.h new file mode 100644 index 0000000000..72d1641462 --- /dev/null +++ b/src/arch/Lights/LightsDriver_LinuxMinimaid.h @@ -0,0 +1,37 @@ +/* LightsDriver_LinuxMinimaid - Minimaid based lights with libmmmagic */ + +#ifndef LightsDriver_LinuxMinimaid_H +#define LightsDriver_LinuxMinimaid_H + +#include "LightsDriver.h" + +#define DDR_DOUBLE_BASS_LIGHTS 0 //unknown but guessed +#define DDR_DOUBLE_PLAYER1_PANEL 2 +#define DDR_DOUBLE_PLAYER2_PANEL 3 +#define DDR_DOUBLE_MARQUEE_LOWER_RIGHT 4 +#define DDR_DOUBLE_MARQUEE_UPPER_RIGHT 5 +#define DDR_DOUBLE_MARQUEE_LOWER_LEFT 6 +#define DDR_DOUBLE_MARQUEE_UPPER_LEFT 7 + +//PADX_LIGHTS +#define DDR_DOUBLE_PAD_UP 0 +#define DDR_DOUBLE_PAD_DOWN 1 +#define DDR_DOUBLE_PAD_LEFT 2 +#define DDR_DOUBLE_PAD_RIGHT 3 +#define DDR_DOUBLE_PAD_RESET 4 + +#define BIT(i) (1<<(i)) +#define BIT_IS_SET(v,i) ((v&BIT(i))!=0) + +static bool _mmmagic_loaded=false; + +class LightsDriver_LinuxMinimaid : public LightsDriver +{ +public: + LightsDriver_LinuxMinimaid(); + + virtual ~LightsDriver_LinuxMinimaid(); + virtual void Set( const LightsState *ls ); +}; + +#endif diff --git a/src/arch/Lights/LightsDriver_LinuxParallel.cpp b/src/arch/Lights/LightsDriver_LinuxParallel.cpp index 6a54e61cc4..ff036e9d2d 100644 --- a/src/arch/Lights/LightsDriver_LinuxParallel.cpp +++ b/src/arch/Lights/LightsDriver_LinuxParallel.cpp @@ -13,7 +13,7 @@ static const int PORT_ADDRESS = 0x378; static const bool SCREEN_DEBUG = false; -REGISTER_SOUND_DRIVER_CLASS(LinuxParallel); +REGISTER_LIGHTS_DRIVER_CLASS(LinuxParallel); LightsDriver_LinuxParallel::LightsDriver_LinuxParallel() { diff --git a/src/arch/Lights/LightsDriver_LinuxWeedTech.cpp b/src/arch/Lights/LightsDriver_LinuxWeedTech.cpp index 4c10a5fe0d..79f4aeea46 100644 --- a/src/arch/Lights/LightsDriver_LinuxWeedTech.cpp +++ b/src/arch/Lights/LightsDriver_LinuxWeedTech.cpp @@ -15,7 +15,7 @@ #include "LightsDriver_LinuxWeedTech.h" #include "RageLog.h" -REGISTER_SOUND_DRIVER_CLASS(LinuxWeedTech); +REGISTER_LIGHTS_DRIVER_CLASS(LinuxWeedTech); // Begin serial driver static int fd = -1; diff --git a/src/arch/Lights/LightsDriver_Linux_PIUIO.cpp b/src/arch/Lights/LightsDriver_Linux_PIUIO.cpp index ce62629d46..bf2536bb3f 100644 --- a/src/arch/Lights/LightsDriver_Linux_PIUIO.cpp +++ b/src/arch/Lights/LightsDriver_Linux_PIUIO.cpp @@ -16,7 +16,7 @@ #include "Game.h" #include "RageLog.h" -REGISTER_SOUND_DRIVER_CLASS2(PIUIO, Linux_PIUIO); +REGISTER_LIGHTS_DRIVER_CLASS2(PIUIO, Linux_PIUIO); LightsDriver_Linux_PIUIO::LightsDriver_Linux_PIUIO() { diff --git a/src/arch/Lights/LightsDriver_Linux_PIUIO_Leds.cpp b/src/arch/Lights/LightsDriver_Linux_PIUIO_Leds.cpp index c0c24a7244..083e96777f 100644 --- a/src/arch/Lights/LightsDriver_Linux_PIUIO_Leds.cpp +++ b/src/arch/Lights/LightsDriver_Linux_PIUIO_Leds.cpp @@ -16,7 +16,7 @@ #include "Game.h" #include "RageLog.h" -REGISTER_SOUND_DRIVER_CLASS2(PIUIO_Leds, Linux_PIUIO_Leds); +REGISTER_LIGHTS_DRIVER_CLASS2(PIUIO_Leds, Linux_PIUIO_Leds); namespace { const char *cabinet_leds[NUM_CabinetLight] = { diff --git a/src/arch/Lights/LightsDriver_SextetStream.cpp b/src/arch/Lights/LightsDriver_SextetStream.cpp index 88510e351a..862590d156 100644 --- a/src/arch/Lights/LightsDriver_SextetStream.cpp +++ b/src/arch/Lights/LightsDriver_SextetStream.cpp @@ -227,7 +227,7 @@ void LightsDriver_SextetStream::Set(const LightsState *ls) // LightsDriver_SextetStreamToFile implementation -REGISTER_SOUND_DRIVER_CLASS(SextetStreamToFile); +REGISTER_LIGHTS_DRIVER_CLASS(SextetStreamToFile); #if defined(_WINDOWS) #define DEFAULT_OUTPUT_FILENAME "\\\\.\\pipe\\StepMania-Lights-SextetStream" diff --git a/src/arch/Lights/LightsDriver_SystemMessage.cpp b/src/arch/Lights/LightsDriver_SystemMessage.cpp index b405a6e10f..c514604248 100644 --- a/src/arch/Lights/LightsDriver_SystemMessage.cpp +++ b/src/arch/Lights/LightsDriver_SystemMessage.cpp @@ -4,7 +4,7 @@ #include "InputMapper.h" #include "PrefsManager.h" -REGISTER_SOUND_DRIVER_CLASS(SystemMessage); +REGISTER_LIGHTS_DRIVER_CLASS(SystemMessage); LightsDriver_SystemMessage::LightsDriver_SystemMessage() { diff --git a/src/arch/Lights/LightsDriver_Win32Minimaid.cpp b/src/arch/Lights/LightsDriver_Win32Minimaid.cpp index 96326de09f..9fe82521da 100644 --- a/src/arch/Lights/LightsDriver_Win32Minimaid.cpp +++ b/src/arch/Lights/LightsDriver_Win32Minimaid.cpp @@ -8,7 +8,7 @@ #include "LightsDriver_Win32Minimaid.h" #include "windows.h" -REGISTER_SOUND_DRIVER_CLASS( Win32Minimaid ); +REGISTER_LIGHTS_DRIVER_CLASS( Win32Minimaid ); HINSTANCE hMMMAGICDLL = NULL; diff --git a/src/arch/Lights/LightsDriver_Win32Parallel.cpp b/src/arch/Lights/LightsDriver_Win32Parallel.cpp index 85913a89c1..93e52b15d4 100644 --- a/src/arch/Lights/LightsDriver_Win32Parallel.cpp +++ b/src/arch/Lights/LightsDriver_Win32Parallel.cpp @@ -3,7 +3,7 @@ #include "windows.h" #include "RageUtil.h" -REGISTER_SOUND_DRIVER_CLASS(Win32Parallel); +REGISTER_LIGHTS_DRIVER_CLASS(Win32Parallel); HINSTANCE hDLL = NULL;