drio dll support for win32.

This commit is contained in:
din
2022-06-05 20:56:47 +02:00
committed by Martin Natano
parent 4d76e59e93
commit d694560e63
5 changed files with 561 additions and 2 deletions
+4 -2
View File
@@ -257,14 +257,16 @@ if(WIN32)
"arch/InputHandler/InputHandler_Win32_MIDI.cpp"
"arch/InputHandler/InputHandler_Win32_Para.cpp"
"arch/InputHandler/InputHandler_Win32_Pump.cpp"
"arch/InputHandler/InputHandler_Win32_RTIO.cpp")
"arch/InputHandler/InputHandler_Win32_RTIO.cpp"
"arch/InputHandler/InputHandler_Win32_ddrio.cpp")
list(APPEND SMDATA_ARCH_INPUT_HPP
"arch/InputHandler/InputHandler_DirectInput.h"
"arch/InputHandler/InputHandler_DirectInputHelper.h"
"arch/InputHandler/InputHandler_Win32_MIDI.h"
"arch/InputHandler/InputHandler_Win32_Para.h"
"arch/InputHandler/InputHandler_Win32_Pump.h"
"arch/InputHandler/InputHandler_Win32_RTIO.h")
"arch/InputHandler/InputHandler_Win32_RTIO.h"
"arch/InputHandler/InputHandler_Win32_ddrio.h")
if(NOT MSVC)
list(APPEND SMDATA_ARCH_INPUT_SRC
"arch/InputHandler/InputHandler_SextetStream.cpp")
+29
View File
@@ -484,6 +484,35 @@ static const AutoMappings g_AutoMappings[] =
AutoMappingEntry( 0, JOY_BUTTON_23, GAME_BUTTON_EFFECT_DOWN, false ),
AutoMappingEntry( 0, JOY_BUTTON_24, GAME_BUTTON_EFFECT_UP, false )
),
AutoMappings(
"dance",
"ddrio",
"ddrio",
AutoMappingEntry(0, JOY_BUTTON_1, GAME_BUTTON_MENUUP, false),
AutoMappingEntry(0, JOY_BUTTON_2, GAME_BUTTON_MENUDOWN, false),
AutoMappingEntry(0, JOY_BUTTON_3, GAME_BUTTON_MENUUP, true),
AutoMappingEntry(0, JOY_BUTTON_4, GAME_BUTTON_MENUDOWN, true),
AutoMappingEntry(0, JOY_BUTTON_5, GAME_BUTTON_OPERATOR, false),
AutoMappingEntry(0, JOY_BUTTON_6, GAME_BUTTON_COIN, false),
AutoMappingEntry(0, JOY_BUTTON_7, GAME_BUTTON_OPERATOR, false),
//AutoMappingEntry(0, JOY_BUTTON_8, GameButton_Invalid, false),
AutoMappingEntry(0, JOY_BUTTON_9, GAME_BUTTON_START, true),
AutoMappingEntry(0, JOY_BUTTON_10, DANCE_BUTTON_UP, true),
AutoMappingEntry(0, JOY_BUTTON_11, DANCE_BUTTON_DOWN, true),
AutoMappingEntry(0, JOY_BUTTON_12, DANCE_BUTTON_LEFT, true),
AutoMappingEntry(0, JOY_BUTTON_13, DANCE_BUTTON_RIGHT, true),
//AutoMappingEntry(0, JOY_BUTTON_14, GameButton_Invalid, true),
AutoMappingEntry(0, JOY_BUTTON_15, GAME_BUTTON_MENULEFT, true),
AutoMappingEntry(0, JOY_BUTTON_16, GAME_BUTTON_MENURIGHT, true),
AutoMappingEntry(0, JOY_BUTTON_17, GAME_BUTTON_START, false),
AutoMappingEntry(0, JOY_BUTTON_18, DANCE_BUTTON_UP, false),
AutoMappingEntry(0, JOY_BUTTON_19, DANCE_BUTTON_DOWN, false),
AutoMappingEntry(0, JOY_BUTTON_20, DANCE_BUTTON_LEFT, false),
AutoMappingEntry(0, JOY_BUTTON_21, DANCE_BUTTON_RIGHT, false),
//AutoMappingEntry(0, JOY_BUTTON_22, GameButton_Invalid, false),
AutoMappingEntry(0, JOY_BUTTON_23, GAME_BUTTON_MENULEFT, false),
AutoMappingEntry(0, JOY_BUTTON_24, GAME_BUTTON_MENURIGHT, false)
),
AutoMappings(
"pump",
"Pump USB",
@@ -0,0 +1,407 @@
#include "global.h"
#include "InputHandler_Win32_ddrio.h"
#include "RageLog.h"
#include "RageUtil.h"
#include "RageInputDevice.h"
#include <windows.h>
#include <process.h>
#include "PrefsManager.h"
typedef int (*thread_create_t)(
int (*proc)(void*), void* ctx, uint32_t stack_sz, unsigned int priority);
typedef void (*thread_join_t)(int thread_id, int* result);
typedef void (*thread_destroy_t)(int thread_id);
typedef void (*log_formatter_t)(const char* module, const char* fmt, ...);
typedef bool (*DDRIO_IO_INIT)(thread_create_t thread_create,
thread_join_t thread_join,
thread_destroy_t thread_destro
);
static DDRIO_IO_INIT ddrio_io_init;
typedef int (*DDRIO_READ_PAD)();
static DDRIO_READ_PAD ddrio_io_read_pad;
typedef int (*DDRIO_SETLIGHTS_P3IO)(uint32_t lights);
static DDRIO_SETLIGHTS_P3IO ddrio_set_lights_p3io;
typedef int (*DDRIO_SETLIGHTS_EXTIO)(uint32_t lights);
static DDRIO_SETLIGHTS_EXTIO ddrio_set_lights_extio;
typedef int (*DDRIO_SETLIGHTS_HDXSPANEL)(uint32_t lights);
static DDRIO_SETLIGHTS_HDXSPANEL ddrio_set_lights_hdxs_panel;
typedef int (*DDRIO_FINI)();
static DDRIO_FINI ddrio_fini;
HINSTANCE hDDRIOdll = nullptr;
REGISTER_INPUT_HANDLER_CLASS2( ddrio, Win32_ddrio );
struct shim_ctx {
HANDLE barrier;
int (*proc)(void*);
void* ctx;
};
static unsigned int crt_thread_shim(void* outer_ctx)
{
LOG->Trace("crt_thread_shim");
struct shim_ctx* sctx = (struct shim_ctx*)outer_ctx;
int (*proc)(void*);
void* inner_ctx;
proc = sctx->proc;
inner_ctx = sctx->ctx;
SetEvent(sctx->barrier);
return proc(inner_ctx);
}
int crt_thread_create(
int (*proc)(void*), void* ctx, uint32_t stack_sz, unsigned int priority)
{
LOG->Trace("crt_thread_create");
struct shim_ctx sctx;
uintptr_t thread_id;
sctx.barrier = CreateEvent(NULL, TRUE, FALSE, NULL);
sctx.proc = proc;
sctx.ctx = ctx;
thread_id = _beginthreadex(NULL, stack_sz, crt_thread_shim, &sctx, 0, NULL);
WaitForSingleObject(sctx.barrier, INFINITE);
CloseHandle(sctx.barrier);
LOG->Trace("crt_thread_create %d", thread_id);
return (int)thread_id;
}
void crt_thread_destroy(int thread_id)
{
LOG->Trace("crt_thread_destroy %d", thread_id);
CloseHandle((HANDLE)(uintptr_t)thread_id);
}
void crt_thread_join(int thread_id, int* result)
{
LOG->Trace("crt_thread_join %d", thread_id);
WaitForSingleObject((HANDLE)(uintptr_t)thread_id, INFINITE);
if (result)
{
GetExitCodeThread((HANDLE)(uintptr_t)thread_id, (DWORD*)result);
}
}
int ddrio_filter(unsigned int, struct _EXCEPTION_POINTERS*)
{
return EXCEPTION_EXECUTE_HANDLER;
}
bool InputHandler_Win32_ddrio::LoadDLL()
{
hDDRIOdll = LoadLibrary("ddrio.dll");
if (hDDRIOdll == nullptr)
{
MessageBox(nullptr, "Could not load ddrio.dll. Ensure it is in the Program directory, the proper C++ Visual C++ Redistributable Runtimes dependencies are installed, you have matched your architectures (x86/x64), and any additional dll dependencies of ddrio.dll are available.", "ERROR", MB_OK);
return false;
}
_ddriodll_loaded = true;
return true;
}
bool InputHandler_Win32_ddrio::MapFunctions()
{
__try
{
//pull the functions we need out of the dll.
ddrio_io_init = (DDRIO_IO_INIT)GetProcAddress(hDDRIOdll, "ddr_io_init");
ddrio_io_read_pad = (DDRIO_READ_PAD)GetProcAddress(hDDRIOdll, "ddr_io_read_pad");
ddrio_fini = (DDRIO_FINI)GetProcAddress(hDDRIOdll, "ddr_io_fini");
//these are technically optional depending on the device in question.
ddrio_set_lights_p3io = (DDRIO_SETLIGHTS_P3IO)GetProcAddress(hDDRIOdll, "ddr_io_set_lights_p3io");
ddrio_set_lights_extio = (DDRIO_SETLIGHTS_P3IO)GetProcAddress(hDDRIOdll, "ddr_io_set_lights_extio");
ddrio_set_lights_hdxs_panel = (DDRIO_SETLIGHTS_P3IO)GetProcAddress(hDDRIOdll, "ddr_io_set_lights_hdxs_panel");
}
__except (ddrio_filter(GetExceptionCode(), GetExceptionInformation()))
{
MessageBox(nullptr, "Could not map functions in ddrio.dll", "ERROR", MB_OK);
FreeLibrary(hDDRIOdll);
}
return true;
}
InputHandler_Win32_ddrio::InputHandler_Win32_ddrio()
{
if (!_ddriodll_loaded && LoadDLL())
{
_ddriodll_loaded = MapFunctions();
}
bool ddrInit = false;
thread_create_t thread_impl_create = crt_thread_create;
thread_join_t thread_impl_join = crt_thread_join;
thread_destroy_t thread_impl_destroy = crt_thread_destroy;
if (ddrio_io_init != nullptr)
{
ddrInit = ddrio_io_init(thread_impl_create, thread_impl_join, thread_impl_destroy);
}
if (!ddrInit)
{
LOG->Warn("Could not init ddrio.dll");
}
m_bShutdown = false;
if(_ddriodll_loaded && ddrInit && PREFSMAN->m_bThreadedInput )
{
InputThread.SetName( "ddrio thread" );
InputThread.Create( InputThread_Start, this );
}
}
InputHandler_Win32_ddrio::~InputHandler_Win32_ddrio()
{
if( InputThread.IsCreated() )
{
m_bShutdown = true;
LOG->Trace( "Shutting down ddrio thread ..." );
InputThread.Wait();
LOG->Trace( "ddrio thread shut down." );
if (ddrio_fini != nullptr)
{
LOG->Trace("calling ddrio dll fini");
ddrio_fini();
LOG->Trace("ddrio dll complete");
}
}
}
RString InputHandler_Win32_ddrio::GetDeviceSpecificInputString( const DeviceInput &di )
{
switch (di.button)
{
case JOY_BUTTON_1: return "ddrio P1 Menu Up";
case JOY_BUTTON_2: return "ddrio P1 Menu Down";
case JOY_BUTTON_3: return "ddrio P2 Menu Up";
case JOY_BUTTON_4: return "ddrio P2 Menu Down";
case JOY_BUTTON_5: return "ddrio Test";
case JOY_BUTTON_6: return "ddrio Coin";
case JOY_BUTTON_7: return "ddrio Service";
case JOY_BUTTON_8: return "ddrio UNUSED 8";
case JOY_BUTTON_9: return "ddrio P2 Start";
case JOY_BUTTON_10: return "ddrio P2 Pad Up";
case JOY_BUTTON_11: return "ddrio P2 Pad Down";
case JOY_BUTTON_12: return "ddrio P2 Pad Left";
case JOY_BUTTON_13: return "ddrio P2 Pad Right";
case JOY_BUTTON_14: return "ddrio UNUSED 14";
case JOY_BUTTON_15: return "ddrio P2 Menu Left";
case JOY_BUTTON_16: return "ddrio P2 Menu Right";
case JOY_BUTTON_17: return "ddrio P1 Start";
case JOY_BUTTON_18: return "ddrio P1 Pad Up";
case JOY_BUTTON_19: return "ddrio P1 Pad Down";
case JOY_BUTTON_20: return "ddrio P1 Pad Left";
case JOY_BUTTON_21: return "ddrio P1 Pad Right";
case JOY_BUTTON_22: return "ddrio UNUSED 22";
case JOY_BUTTON_23: return "ddrio P1 Menu Left";
case JOY_BUTTON_24: return "ddrio P1 Menu Right";
case JOY_BUTTON_25: return "ddrio UNUSED 25";
case JOY_BUTTON_26: return "ddrio UNUSED 26";
case JOY_BUTTON_27: return "ddrio UNUSED 27";
case JOY_BUTTON_28: return "ddrio UNUSED 28";
case JOY_BUTTON_29: return "ddrio UNUSED 29";
case JOY_BUTTON_30: return "ddrio UNUSED 30";
case JOY_BUTTON_31: return "ddrio UNUSED 31";
case JOY_BUTTON_32: return "ddrio UNUSED 32";
}
return InputHandler::GetDeviceSpecificInputString(di);
}
void InputHandler_Win32_ddrio::GetDevicesAndDescriptions( vector<InputDeviceInfo>& vDevicesOut )
{
// We use a joystick device so we can get automatic input mapping
vDevicesOut.push_back(InputDeviceInfo(InputDevice(DDRIO_DEVICEID), "ddrio"));
}
int InputHandler_Win32_ddrio::InputThread_Start( void *p )
{
((InputHandler_Win32_ddrio *) p)->InputThreadMain();
return 0;
}
void InputHandler_Win32_ddrio::InputThreadMain()
{
uint32_t prevInput = 0, newInput = 0;
LightsState prevLS = { 0 };
LightsState newLS = { 0 };
while (!m_bShutdown)
{
InputHandler::UpdateTimer();
//Btools API states that this method will sleep/halt
//so we can safely loop around it in a thread.
newInput = ddrio_io_read_pad();
if (prevInput != newInput)
{
PushInputState(newInput);
}
newLS = LightsDriver_Export::GetState();
if (IsLightChange(prevLS, newLS))
{
PushLightState(newLS);
}
prevLS = newLS;
prevInput = newInput;
}
}
void InputHandler_Win32_ddrio::PushInputState(uint32_t newInput)
{
for (int i = 0; i < 32; i++)
{
bool pressed = (newInput & (1 << i));
//return from ddrio is active high.
DeviceInput di(DDRIO_DEVICEID, enum_add2(JOY_BUTTON_1, i), pressed);
//If we're in a thread, our timestamp is accurate.
if (InputThread.IsCreated())
di.ts.Touch();
ButtonPressed(di);
}
}
bool InputHandler_Win32_ddrio::IsLightChange(LightsState prevLS, LightsState newLS)
{
FOREACH_CabinetLight(light)
{
if (prevLS.m_bCabinetLights[light] != newLS.m_bCabinetLights[light])
{
return true;
}
}
for (int gc = 0; gc < NUM_GameController; gc++)
{
FOREACH_ENUM(GameButton, gb)
{
if (prevLS.m_bGameButtonLights[gc][gb] != newLS.m_bGameButtonLights[gc][gb])
{
return true;
}
}
}
return false;
}
void InputHandler_Win32_ddrio::PushLightState(LightsState newLS)
{
uint32_t p3io = 0;
uint32_t hdxs = 0;
uint32_t extio = 0;
//lighting state has already been verified to have changed in this method, so create the new one from scratch.
if (newLS.m_bGameButtonLights[GameController_1][GAME_BUTTON_START]) p3io |= (1 << LIGHT_P1_MENU);
if (newLS.m_bGameButtonLights[GameController_2][GAME_BUTTON_START]) p3io |= (1 << LIGHT_P2_MENU);
if (newLS.m_bCabinetLights[LIGHT_MARQUEE_LR_RIGHT]) p3io |= (1 << LIGHT_P2_LOWER_LAMP);
if (newLS.m_bCabinetLights[LIGHT_MARQUEE_UP_RIGHT]) p3io |= (1 << LIGHT_P2_UPPER_LAMP);
if (newLS.m_bCabinetLights[LIGHT_MARQUEE_LR_LEFT]) p3io |= (1 << LIGHT_P1_LOWER_LAMP);
if (newLS.m_bCabinetLights[LIGHT_MARQUEE_UP_LEFT]) p3io |= (1 << LIGHT_P1_UPPER_LAMP);
//hdxs device has one light for both MenuLeft and MenuRight as well as MenuUp and MenuDown.
if (newLS.m_bGameButtonLights[GameController_1][GAME_BUTTON_START]) hdxs |= (1 << LIGHT_HD_P1_START);
if (newLS.m_bGameButtonLights[GameController_1][GAME_BUTTON_MENUUP] || newLS.m_bGameButtonLights[GameController_1][GAME_BUTTON_MENUDOWN]) hdxs |= (1 << LIGHT_HD_P1_UP_DOWN);
if (newLS.m_bGameButtonLights[GameController_1][GAME_BUTTON_MENULEFT] || newLS.m_bGameButtonLights[GameController_1][GAME_BUTTON_MENURIGHT]) hdxs |= (1 << LIGHT_HD_P1_LEFT_RIGHT);
if (newLS.m_bGameButtonLights[GameController_2][GAME_BUTTON_START]) hdxs |= (1 << LIGHT_HD_P2_START);
if (newLS.m_bGameButtonLights[GameController_2][GAME_BUTTON_MENUUP] || newLS.m_bGameButtonLights[GameController_2][GAME_BUTTON_MENUDOWN]) hdxs |= (1 << LIGHT_HD_P2_UP_DOWN);
if (newLS.m_bGameButtonLights[GameController_2][GAME_BUTTON_MENULEFT] || newLS.m_bGameButtonLights[GameController_2][GAME_BUTTON_MENURIGHT]) hdxs |= (1 << LIGHT_HD_P2_LEFT_RIGHT);
if (newLS.m_bGameButtonLights[GameController_2][DANCE_BUTTON_RIGHT]) extio |= (1 << LIGHT_P2_RIGHT);
if (newLS.m_bGameButtonLights[GameController_2][DANCE_BUTTON_LEFT]) extio |= (1 << LIGHT_P2_LEFT);
if (newLS.m_bGameButtonLights[GameController_2][DANCE_BUTTON_DOWN]) extio |= (1 << LIGHT_P2_DOWN);
if (newLS.m_bGameButtonLights[GameController_2][DANCE_BUTTON_UP]) extio |= (1 << LIGHT_P2_UP);
if (newLS.m_bGameButtonLights[GameController_1][DANCE_BUTTON_RIGHT]) extio |= (1 << LIGHT_P1_RIGHT);
if (newLS.m_bGameButtonLights[GameController_1][DANCE_BUTTON_LEFT]) extio |= (1 << LIGHT_P1_LEFT);
if (newLS.m_bGameButtonLights[GameController_1][DANCE_BUTTON_DOWN]) extio |= (1 << LIGHT_P1_DOWN);
if (newLS.m_bGameButtonLights[GameController_1][DANCE_BUTTON_UP]) extio |= (1 << LIGHT_P1_UP);
if (newLS.m_bCabinetLights[LIGHT_BASS_LEFT] || newLS.m_bCabinetLights[LIGHT_BASS_RIGHT]) extio |= (1 << LIGHT_NEONS);
//all of these functions are technically optional,
//so check to see if we were able to find them in this specific dll before calling a nullptr
if(ddrio_set_lights_p3io != nullptr)
ddrio_set_lights_p3io(p3io);
if (ddrio_set_lights_extio != nullptr)
ddrio_set_lights_extio(extio);
if (ddrio_set_lights_hdxs_panel != nullptr)
ddrio_set_lights_hdxs_panel(hdxs);
}
/*
* (c) 2022 din
* 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.
*/
@@ -0,0 +1,112 @@
#ifndef INPUT_HANDLER_WIN32_DDRIO_H
#define INPUT_HANDLER_WIN32_DDRIO_H
#include "InputHandler.h"
#include "RageThreads.h"
#include "arch/Lights/LightsDriver_Export.h"
static bool _ddriodll_loaded = false;
//we want to use a
#define DDRIO_DEVICEID DEVICE_JOY1
enum p3io_light_bit {
LIGHT_P1_MENU = 0x00,
LIGHT_P2_MENU = 0x01,
LIGHT_P2_LOWER_LAMP = 0x04,
LIGHT_P2_UPPER_LAMP = 0x05,
LIGHT_P1_LOWER_LAMP = 0x06,
LIGHT_P1_UPPER_LAMP = 0x07,
};
enum hdxs_light_bit {
LIGHT_HD_P1_START = 0x08,
LIGHT_HD_P1_UP_DOWN = 0x09,
LIGHT_HD_P1_LEFT_RIGHT = 0x0A,
LIGHT_HD_P2_START = 0x0B,
LIGHT_HD_P2_UP_DOWN = 0x0C,
LIGHT_HD_P2_LEFT_RIGHT = 0x0D,
};
// the indexing starts from 0x20 if you're looking in geninput
enum hdxs_rgb_light_idx {
LIGHT_HD_P1_SPEAKER_F_R = 0x00,
LIGHT_HD_P1_SPEAKER_F_G = 0x01,
LIGHT_HD_P1_SPEAKER_F_B = 0x02,
LIGHT_HD_P2_SPEAKER_F_R = 0x03,
LIGHT_HD_P2_SPEAKER_F_G = 0x04,
LIGHT_HD_P2_SPEAKER_F_B = 0x05,
LIGHT_HD_P1_SPEAKER_W_R = 0x06,
LIGHT_HD_P1_SPEAKER_W_G = 0x07,
LIGHT_HD_P1_SPEAKER_W_B = 0x08,
LIGHT_HD_P2_SPEAKER_W_R = 0x09,
LIGHT_HD_P2_SPEAKER_W_G = 0x0A,
LIGHT_HD_P2_SPEAKER_W_B = 0x0B,
};
enum extio_light_bit {
LIGHT_NEONS = 0x0E,
LIGHT_P2_RIGHT = 0x13,
LIGHT_P2_LEFT = 0x14,
LIGHT_P2_DOWN = 0x15,
LIGHT_P2_UP = 0x16,
LIGHT_P1_RIGHT = 0x1B,
LIGHT_P1_LEFT = 0x1C,
LIGHT_P1_DOWN = 0x1D,
LIGHT_P1_UP = 0x1E
};
class InputHandler_Win32_ddrio: public InputHandler
{
public:
InputHandler_Win32_ddrio();
~InputHandler_Win32_ddrio();
RString GetDeviceSpecificInputString( const DeviceInput &di );
void GetDevicesAndDescriptions( vector<InputDeviceInfo>& vDevicesOut );
private:
RageThread InputThread;
bool m_bShutdown;
bool LoadDLL();
bool MapFunctions();
static int InputThread_Start( void *p );
void InputThreadMain();
void PushInputState(uint32_t newInput);
bool IsLightChange(LightsState prevLS, LightsState newLS);
void PushLightState(LightsState newLS);
};
/*
* (c) 2022 din
* 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.
*/
#endif
+9
View File
@@ -4,6 +4,10 @@
#include "arch/arch_default.h"
//We explicitly load these drivers as they should always be available.
#include "arch/Lights/LightsDriver_SystemMessage.h"
#include "arch/Lights/LightsDriver_Export.h"
DriverList LightsDriver::m_pDriverList;
void LightsDriver::Create( const RString &sDrivers, vector<LightsDriver *> &Add )
@@ -28,6 +32,11 @@ void LightsDriver::Create( const RString &sDrivers, vector<LightsDriver *> &Add
LOG->Info( "Lights driver: %s", Driver.c_str() );
Add.push_back( pDriver );
}
//ensure these are always available to use for debugging
//or if InputHandlers that want lighting state.
Add.push_back(new LightsDriver_SystemMessage);
Add.push_back(new LightsDriver_Export);
}
void LightsDriver::Reset()