diff --git a/src/Makefile.am b/src/Makefile.am index c43f4c8d38..b1c3be4934 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -400,6 +400,10 @@ if WINDOWS if HAVE_PARALLEL_PORT Lights += arch/Lights/LightsDriver_Win32Parallel.cpp arch/Lights/LightsDriver_Win32Parallel.h endif + +if HAVE_MINIMAID + Lights += arch/Lights/LightsDriver_Win32Minimaid.cpp arch/Lights/LightsDriver_Win32Minimaid.h +endif if !HAVE_PTHREAD Threads += arch/Threads/Threads_Win32.cpp arch/Threads/Threads_Win32.h diff --git a/src/StepMania-net2008.vcproj b/src/StepMania-net2008.vcproj index b7993c0bf3..6f0bd4bf78 100644 --- a/src/StepMania-net2008.vcproj +++ b/src/StepMania-net2008.vcproj @@ -2430,6 +2430,14 @@ RelativePath="arch\Lights\LightsDriver_SystemMessage.h" > + + + + diff --git a/src/StepMania-net2010.vcxproj b/src/StepMania-net2010.vcxproj index 14303661dc..a296a39375 100644 --- a/src/StepMania-net2010.vcxproj +++ b/src/StepMania-net2010.vcxproj @@ -580,6 +580,7 @@ cl /Zl /nologo /c verstub.cpp /Fo$(IntDir) + @@ -1898,6 +1899,7 @@ cl /Zl /nologo /c verstub.cpp /Fo$(IntDir) + diff --git a/src/StepMania-net2010.vcxproj.filters b/src/StepMania-net2010.vcxproj.filters index 718d8b3c93..94642bc4c2 100644 --- a/src/StepMania-net2010.vcxproj.filters +++ b/src/StepMania-net2010.vcxproj.filters @@ -747,6 +747,9 @@ StepMania\arch\Lights + + StepMania\arch\Lights + StepMania\arch\Lights @@ -2270,6 +2273,9 @@ StepMania\arch\Lights + + StepMania\arch\Lights + StepMania\arch\Lights diff --git a/src/StepMania-net2011.vcxproj b/src/StepMania-net2011.vcxproj index 901f8608db..1424c89ba2 100644 --- a/src/StepMania-net2011.vcxproj +++ b/src/StepMania-net2011.vcxproj @@ -606,6 +606,7 @@ cl /Zl /nologo /c verstub.cpp /Fo"$(IntDir)" + @@ -1484,6 +1485,7 @@ cl /Zl /nologo /c verstub.cpp /Fo"$(IntDir)" + diff --git a/src/StepMania-net2011.vcxproj.filters b/src/StepMania-net2011.vcxproj.filters index 22f3d05525..b230a7d580 100644 --- a/src/StepMania-net2011.vcxproj.filters +++ b/src/StepMania-net2011.vcxproj.filters @@ -735,6 +735,9 @@ StepMania\arch\Lights + + StepMania\arch\Lights + StepMania\arch\Lights @@ -2108,6 +2111,9 @@ StepMania\arch\Lights + + StepMania\arch\Lights + StepMania\arch\Lights diff --git a/src/StepMania-net2013.vcxproj b/src/StepMania-net2013.vcxproj index 8121d7e9cb..48656c83cd 100644 --- a/src/StepMania-net2013.vcxproj +++ b/src/StepMania-net2013.vcxproj @@ -605,6 +605,7 @@ cl /Zl /nologo /c verstub.cpp /Fo"$(IntDir)" + @@ -1923,6 +1924,7 @@ cl /Zl /nologo /c verstub.cpp /Fo"$(IntDir)" + diff --git a/src/StepMania-net2013.vcxproj.filters b/src/StepMania-net2013.vcxproj.filters index 4254fdd875..561138996c 100644 --- a/src/StepMania-net2013.vcxproj.filters +++ b/src/StepMania-net2013.vcxproj.filters @@ -747,6 +747,9 @@ StepMania\arch\Lights + + StepMania\arch\Lights + StepMania\arch\Lights @@ -2270,6 +2273,9 @@ StepMania\arch\Lights + + StepMania\arch\Lights + StepMania\arch\Lights diff --git a/src/arch/Lights/LightsDriver_Win32Minimaid.cpp b/src/arch/Lights/LightsDriver_Win32Minimaid.cpp new file mode 100644 index 0000000000..96326de09f --- /dev/null +++ b/src/arch/Lights/LightsDriver_Win32Minimaid.cpp @@ -0,0 +1,100 @@ +// LightsDriver_Win32Minimaid - 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_Win32Minimaid.h" +#include "windows.h" + +REGISTER_SOUND_DRIVER_CLASS( Win32Minimaid ); + +HINSTANCE hMMMAGICDLL = NULL; + +LightsDriver_Win32Minimaid::LightsDriver_Win32Minimaid() +{ + _mmmagic_loaded=false; + hMMMAGICDLL = LoadLibraryW(L"mmmagic.dll"); + if(hMMMAGICDLL == NULL) + { + MessageBox(NULL, "Could not LoadLibrary( mmmagic.dll ).", "ERROR", MB_OK ); + return; + } + _mmmagic_loaded=true; + + // Get the function pointers + mm_connect_minimaid = (MM_CONNECT_MINIMAID) GetProcAddress(hMMMAGICDLL, "mm_connect_minimaid"); + mm_setKB = (MM_SETKB) GetProcAddress(hMMMAGICDLL, "mm_setKB"); + mm_setDDRPad1Light = (MM_SETDDRPAD1LIGHT) GetProcAddress(hMMMAGICDLL, "mm_setDDRPad1Light"); + mm_setDDRPad2Light = (MM_SETDDRPAD2LIGHT) GetProcAddress(hMMMAGICDLL, "mm_setDDRPad2Light"); + mm_setDDRCabinetLight = (MM_SETCABINETLIGHT) GetProcAddress(hMMMAGICDLL, "mm_setDDRCabinetLight"); + mm_setDDRBassLight = (MM_SETDDRBASSLIGHT) GetProcAddress(hMMMAGICDLL, "mm_setDDRBassLight"); + mm_setDDRAllOn = (MM_SETDDRALLON) GetProcAddress(hMMMAGICDLL, "mm_setDDRAllOn"); + mm_setDDRAllOff = (MM_SETDDRALLOFF) GetProcAddress(hMMMAGICDLL, "mm_setDDRAllOff"); + mm_setBlueLED = (MM_SETBLUELED) GetProcAddress(hMMMAGICDLL, "mm_setBlueLED"); + mm_setMMOutputReports = (MM_SETMMOUTPUTREPORTS) GetProcAddress(hMMMAGICDLL, "mm_setMMOutputReports"); + mm_sendDDRMiniMaidUpdate= (MM_SENDDDRMINIMAIDUPDATE) GetProcAddress(hMMMAGICDLL, "mm_sendDDRMiniMaidUpdate"); + mm_connect_minimaid(); + mm_setKB(true); +} + +LightsDriver_Win32Minimaid::~LightsDriver_Win32Minimaid() +{ + if(_mmmagic_loaded) + FreeLibrary( hMMMAGICDLL ); +} + +void LightsDriver_Win32Minimaid::Set( const LightsState *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(); + } +} + +/* + * (c) 2013 pkgingo + * 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/src/arch/Lights/LightsDriver_Win32Minimaid.h b/src/arch/Lights/LightsDriver_Win32Minimaid.h new file mode 100644 index 0000000000..6bdaa59615 --- /dev/null +++ b/src/arch/Lights/LightsDriver_Win32Minimaid.h @@ -0,0 +1,99 @@ +/* LightsDriver_Win32Minimaid - Minimaid based lights with libmmmagic */ + +#ifndef LightsDriver_Win32Minimaid_H +#define LightsDriver_Win32Minimaid_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; + +typedef bool (*__BITVALID)(int); +static __BITVALID __bitValid; + +// minimaid prototypes +typedef void (*MM_SETDDRPAD1LIGHT)(int, int); +typedef void (*MM_SETDDRPAD2LIGHT)(int, int); +typedef void (*MM_SETCABINETLIGHT)(int, int); +typedef void (*MM_SETDDRBASSLIGHT)(int, int); +static MM_SETDDRPAD1LIGHT mm_setDDRPad1Light; +static MM_SETDDRPAD2LIGHT mm_setDDRPad2Light; +static MM_SETCABINETLIGHT mm_setDDRCabinetLight; +static MM_SETDDRBASSLIGHT mm_setDDRBassLight; + +typedef bool (*MM_CONNECT_MINIMAID)(); +typedef bool (*MM_SETKB)(bool val); +static MM_CONNECT_MINIMAID mm_connect_minimaid; +static MM_SETKB mm_setKB; + +typedef void (*MM_SETDDRALLON)(); +typedef void (*MM_SETDDRALLOFF)(); +static MM_SETDDRALLON mm_setDDRAllOn; +static MM_SETDDRALLOFF mm_setDDRAllOff; + +typedef void (*MM_SETBLUELED)(unsigned char); +typedef void (*MM_SETMMOUTPUTREPORTS)(unsigned char, unsigned char, unsigned char, unsigned char); +typedef bool (*MM_SENDDDRMINIMAIDUPDATE)(); +static MM_SETBLUELED mm_setBlueLED; +static MM_SETMMOUTPUTREPORTS mm_setMMOutputReports; +static MM_SENDDDRMINIMAIDUPDATE mm_sendDDRMiniMaidUpdate; + +typedef void (*MM_INIT)(); +typedef void (*MM_TURNON)(unsigned char, int); +typedef bool (*MM_TURNOFF)(unsigned char, int); +static MM_INIT mm_init; +static MM_TURNON mm_turnON; +static MM_TURNOFF mm_turnOFF; + +class LightsDriver_Win32Minimaid : public LightsDriver +{ +public: + LightsDriver_Win32Minimaid(); + + virtual ~LightsDriver_Win32Minimaid(); + virtual void Set( const LightsState *ls ); +}; + +#endif + +/* + * (c) 2013 pkgingo + * 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. + */