From 0ca0f86d7e52bfd72851952e8b70ebc61442d251 Mon Sep 17 00:00:00 2001 From: Chris Danford Date: Tue, 23 Mar 2004 06:11:10 +0000 Subject: [PATCH] clean up lights --- stepmania/src/ForeachEnum.h | 1 + stepmania/src/GameConstantsAndTypes.h | 4 +- stepmania/src/GameInput.h | 10 +- stepmania/src/GameState.cpp | 2 +- stepmania/src/LightsManager.cpp | 116 +++++++--------- stepmania/src/LightsManager.h | 53 ++++---- stepmania/src/Makefile.am | 1 - stepmania/src/PlayerNumber.h | 3 +- stepmania/src/ScreenCaution.cpp | 4 +- stepmania/src/ScreenEvaluation.cpp | 2 +- stepmania/src/ScreenGameplay.cpp | 10 +- stepmania/src/ScreenSelectMusic.cpp | 2 +- stepmania/src/ScreenSelectStyle.cpp | 2 +- stepmania/src/ScreenStage.cpp | 2 +- stepmania/src/ScreenTitleMenu.cpp | 2 +- stepmania/src/arch/Lights/LightsDriver.h | 5 +- .../arch/Lights/LightsDriver_LinuxSerial.cpp | 124 ------------------ .../arch/Lights/LightsDriver_LinuxSerial.h | 28 ---- stepmania/src/arch/Lights/LightsDriver_Null.h | 3 +- .../Lights/LightsDriver_SystemMessage.cpp | 30 +++-- .../arch/Lights/LightsDriver_SystemMessage.h | 3 +- .../Lights/LightsDriver_Win32Parallel.cpp | 93 ++++++++----- .../arch/Lights/LightsDriver_Win32Parallel.h | 3 +- 23 files changed, 184 insertions(+), 319 deletions(-) create mode 100644 stepmania/src/ForeachEnum.h delete mode 100644 stepmania/src/arch/Lights/LightsDriver_LinuxSerial.cpp delete mode 100644 stepmania/src/arch/Lights/LightsDriver_LinuxSerial.h diff --git a/stepmania/src/ForeachEnum.h b/stepmania/src/ForeachEnum.h new file mode 100644 index 0000000000..de1d00ff4a --- /dev/null +++ b/stepmania/src/ForeachEnum.h @@ -0,0 +1 @@ +#define FOREACH_ENUM( e, max, var ) for( e var=(e)0; varLockCards( false ); - LIGHTSMAN->SetLightMode( LIGHTMODE_ATTRACT ); + LIGHTSMAN->SetLightsMode( LIGHTSMODE_ATTRACT ); } void GameState::BeginGame() diff --git a/stepmania/src/LightsManager.cpp b/stepmania/src/LightsManager.cpp index d5c8b73e8e..f9fb3f1cdb 100644 --- a/stepmania/src/LightsManager.cpp +++ b/stepmania/src/LightsManager.cpp @@ -24,7 +24,7 @@ LightsManager* LIGHTSMAN = NULL; // global and accessable from anywhere in our p LightsManager::LightsManager(CString sDriver) { - m_LightMode = LIGHTMODE_JOINING; + m_LightsMode = LIGHTSMODE_JOINING; m_pDriver = MakeLightsDriver(sDriver); } @@ -39,9 +39,9 @@ void LightsManager::Update( float fDeltaTime ) // // Update cabinet lights // - switch( m_LightMode ) + switch( m_LightsMode ) { - case LIGHTMODE_JOINING: + case LIGHTSMODE_JOINING: { switch( GAMESTATE->GetNumSidesJoined() ) { @@ -51,95 +51,92 @@ void LightsManager::Update( float fDeltaTime ) // float fBeatPercentage = GAMESTATE->m_fSongBeat - (int)GAMESTATE->m_fSongBeat; bool bOn = (iSec%2)==0; for( int i=0; i<8; i++ ) - m_pDriver->SetLight( (Light)i, bOn ); + m_LightsState.m_bCabinetLights[i] = bOn; } break; default: for( int i=0; i<8; i++ ) { bool bOn = GAMESTATE->m_bSideIsJoined[i%2]; - m_pDriver->SetLight( (Light)i, bOn ); + m_LightsState.m_bCabinetLights[i] = bOn; } } } break; - case LIGHTMODE_ATTRACT: + case LIGHTSMODE_ATTRACT: { int iSec = (int)RageTimer::GetTimeSinceStart(); int i; for( i=0; i<4; i++ ) { bool bOn = (iSec%4)==i; - m_pDriver->SetLight( (Light)i, bOn ); + m_LightsState.m_bCabinetLights[i] = bOn; } for( i=4; i<6; i++ ) { bool bOn = false; - m_pDriver->SetLight( (Light)i, bOn ); + m_LightsState.m_bCabinetLights[i] = bOn; } for( i=6; i<8; i++ ) { bool bOn = (iSec%3)==0; - m_pDriver->SetLight( (Light)i, bOn ); + m_LightsState.m_bCabinetLights[i] = bOn; } } break; - case LIGHTMODE_MENU: + case LIGHTSMODE_MENU: { int iSec = (int)RageTimer::GetTimeSinceStart(); int i; for( i=0; i<2; i++ ) { bool bOn = (iSec%2)==0; - m_pDriver->SetLight( (Light)i, bOn ); + m_LightsState.m_bCabinetLights[i] = bOn; } for( i=2; i<4; i++ ) { bool bOn = (iSec%2)==1; - m_pDriver->SetLight( (Light)i, bOn ); + m_LightsState.m_bCabinetLights[i] = bOn; } for( i=4; i<6; i++ ) { bool bOn = (iSec%2)==0; - m_pDriver->SetLight( (Light)i, bOn ); + m_LightsState.m_bCabinetLights[i] = bOn; } for( i=6; i<8; i++ ) { bool bOn = (iSec%2)==1; - m_pDriver->SetLight( (Light)i, bOn ); + m_LightsState.m_bCabinetLights[i] = bOn; } } break; - case LIGHTMODE_DEMONSTRATION: - case LIGHTMODE_GAMEPLAY: + case LIGHTSMODE_DEMONSTRATION: + case LIGHTSMODE_GAMEPLAY_READY: + case LIGHTSMODE_GAMEPLAY_GO: { int i; - // top lights are controlled my ScreenGameplay - //for( int i=0; i<4; i++ ) - // m_pDriver->SetLight( (Light)i, bOn ); + bool bMarqueeLightsOn = m_LightsMode == LIGHTSMODE_GAMEPLAY_READY; + + for( i=0; i<4; i++ ) + m_LightsState.m_bCabinetLights[i] = bMarqueeLightsOn; // menu lights are always off for( i=4; i<6; i++ ) - m_pDriver->SetLight( (Light)i, false ); + m_LightsState.m_bCabinetLights[i] = false; // bass lights float fBeatPercentage = GAMESTATE->m_fSongBeat - (int)GAMESTATE->m_fSongBeat; bool bOn = fBeatPercentage < 0.1 || fBeatPercentage > 0.9; for( i=7; i<8; i++ ) - m_pDriver->SetLight( (Light)i, bOn ); + m_LightsState.m_bCabinetLights[i] = bOn; } break; - case LIGHTMODE_STAGE: + case LIGHTSMODE_STAGE: + case LIGHTSMODE_ALL_CLEARED: { - for( int i=0; i<8; i++ ) - m_pDriver->SetLight( (Light)i, true ); - } - break; - case LIGHTMODE_ALL_CLEARED: - { - for( int i=0; i<8; i++ ) - m_pDriver->SetLight( (Light)i, false ); + FOREACH_CabinetLight( cl ) + m_LightsState.m_bCabinetLights[cl] = true; } break; default: @@ -151,48 +148,37 @@ void LightsManager::Update( float fDeltaTime ) // // FIXME: Works only with Game==dance // FIXME: lights pads for players who aren't playing - switch( m_LightMode ) + switch( m_LightsMode ) { - case LIGHTMODE_ATTRACT: - case LIGHTMODE_MENU: - case LIGHTMODE_DEMONSTRATION: + case LIGHTSMODE_ATTRACT: + case LIGHTSMODE_MENU: + case LIGHTSMODE_DEMONSTRATION: { - for( int i=LIGHT_GAME_BUTTON1; i<=LIGHT_LAST_GAME_BUTTON; i++ ) - m_pDriver->SetLight( (Light)i, false ); + ZERO( m_LightsState.m_bGameButtonLights ); } break; - case LIGHTMODE_ALL_CLEARED: - case LIGHTMODE_STAGE: - case LIGHTMODE_JOINING: + case LIGHTSMODE_ALL_CLEARED: + case LIGHTSMODE_STAGE: + case LIGHTSMODE_JOINING: { - for( int c=0; c<2; c++ ) + FOREACH_GameController( gc ) { -// GameController gc = (GameController)c; - bool bOn = GAMESTATE->m_bSideIsJoined[c]; + bool bOn = GAMESTATE->m_bSideIsJoined[gc]; - for( int i=0; i<4; i++ ) - { -// GameButton gb = (GameButton)i; - Light light = (Light)(LIGHT_GAME_BUTTON1 + c*4+i); - m_pDriver->SetLight( light, bOn ); - } + FOREACH_GameButton( gb ) + m_LightsState.m_bGameButtonLights[gc][gb] = bOn; } } break; - case LIGHTMODE_GAMEPLAY: + case LIGHTSMODE_GAMEPLAY_READY: + case LIGHTSMODE_GAMEPLAY_GO: { - for( int c=0; c<2; c++ ) + FOREACH_GameController( gc ) { - GameController gc = (GameController)c; - - for( int i=0; i<4; i++ ) + FOREACH_GameButton( gb ) { - GameButton gb = (GameButton)i; - - Light light = (Light)(LIGHT_GAME_BUTTON1 + c*4+i); - bool bOn = INPUTMAPPER->IsButtonDown( GameInput(gc,gb) ); - m_pDriver->SetLight( light, bOn ); + m_LightsState.m_bGameButtonLights[gc][gb] = bOn; } } } @@ -202,18 +188,10 @@ void LightsManager::Update( float fDeltaTime ) } // apply new light values we set above - m_pDriver->Flush(); + m_pDriver->Set( &m_LightsState ); } -void LightsManager::SetLightMode( LightMode lm ) +void LightsManager::SetLightsMode( LightsMode lm ) { - m_LightMode = lm; -} - -void LightsManager::SetAllUpperLights( bool bOn ) -{ - for( int i=0; i<4; i++ ) - { - m_pDriver->SetLight( (Light)i, bOn ); - } + m_LightsMode = lm; } diff --git a/stepmania/src/LightsManager.h b/stepmania/src/LightsManager.h index 691c45d1bc..bff09895a3 100644 --- a/stepmania/src/LightsManager.h +++ b/stepmania/src/LightsManager.h @@ -11,39 +11,41 @@ ----------------------------------------------------------------------------- */ +#include "PlayerNumber.h" +#include "GameInput.h" +#include "ForeachEnum.h" -enum Light +enum CabinetLight { LIGHT_MARUQEE_UP_LEFT, LIGHT_MARUQEE_UP_RIGHT, LIGHT_MARUQEE_LR_LEFT, LIGHT_MARUQEE_LR_RIGHT, - LIGHT_MENU_LEFT, - LIGHT_MENU_RIGHT, + LIGHT_BUTTONS_LEFT, + LIGHT_BUTTONS_RIGHT, LIGHT_BASS_LEFT, LIGHT_BASS_RIGHT, - LIGHT_GAME_BUTTON1, // - LIGHT_GAME_BUTTON2, - LIGHT_GAME_BUTTON3, - LIGHT_GAME_BUTTON4, - LIGHT_GAME_BUTTON5, - LIGHT_GAME_BUTTON6, - LIGHT_GAME_BUTTON7, - LIGHT_GAME_BUTTON8, - NUM_LIGHTS + NUM_CABINET_LIGHTS +}; +#define FOREACH_CabinetLight( i ) FOREACH_ENUM( CabinetLight, NUM_CABINET_LIGHTS, i ) + +enum LightsMode +{ + LIGHTSMODE_ATTRACT, + LIGHTSMODE_JOINING, + LIGHTSMODE_MENU, + LIGHTSMODE_DEMONSTRATION, + LIGHTSMODE_GAMEPLAY_READY, + LIGHTSMODE_GAMEPLAY_GO, + LIGHTSMODE_STAGE, + LIGHTSMODE_ALL_CLEARED, + LIGHTSMODE_TEST, }; -const Light LIGHT_LAST_GAME_BUTTON = LIGHT_GAME_BUTTON8; - -enum LightMode +struct LightsState { - LIGHTMODE_ATTRACT, - LIGHTMODE_JOINING, - LIGHTMODE_MENU, - LIGHTMODE_DEMONSTRATION, - LIGHTMODE_GAMEPLAY, - LIGHTMODE_STAGE, - LIGHTMODE_ALL_CLEARED, + bool m_bCabinetLights[NUM_CABINET_LIGHTS]; + bool m_bGameButtonLights[MAX_GAME_CONTROLLERS][MAX_GAME_BUTTONS]; }; class LightsDriver; @@ -56,14 +58,13 @@ public: void Update( float fDeltaTime ); - void SetLightMode( LightMode lm ); - void SetAllUpperLights( bool bOn ); + void SetLightsMode( LightsMode lm ); private: - void SetLight( Light light, bool bOn ); LightsDriver* m_pDriver; - LightMode m_LightMode; + LightsMode m_LightsMode; + LightsState m_LightsState; }; diff --git a/stepmania/src/Makefile.am b/stepmania/src/Makefile.am index 05fc26d1a3..1247812ed7 100644 --- a/stepmania/src/Makefile.am +++ b/stepmania/src/Makefile.am @@ -125,7 +125,6 @@ MovieTexture += arch/MovieTexture/MovieTexture_FFMpeg.cpp arch/MovieTexture/Movi endif Lights = arch/Lights/LightsDriver.h \ - arch/Lights/LightsDriver_LinuxSerial.cpp arch/Lights/LightsDriver_LinuxSerial.h \ arch/Lights/LightsDriver_SystemMessage.cpp arch/Lights/LightsDriver_SystemMessage.h MemoryCard = arch/MemoryCard/MemoryCardDriver.h \ diff --git a/stepmania/src/PlayerNumber.h b/stepmania/src/PlayerNumber.h index 35eef50d1b..886b41c22a 100644 --- a/stepmania/src/PlayerNumber.h +++ b/stepmania/src/PlayerNumber.h @@ -14,8 +14,7 @@ */ #include "RageTypes.h" // for RageColor - -#define FOREACH_ENUM( e, max, var ) for( e var=(e)0; varSetNewScreen( "ScreenTitleMenu" ); - LIGHTSMAN->SetLightMode( LIGHTMODE_MENU ); + LIGHTSMAN->SetLightsMode( LIGHTSMODE_MENU ); break; case SM_GoToNextScreen: - LIGHTSMAN->SetLightMode( LIGHTMODE_MENU ); + LIGHTSMAN->SetLightsMode( LIGHTSMODE_MENU ); SCREENMAN->SetNewScreen( NEXT_SCREEN ); break; } diff --git a/stepmania/src/ScreenEvaluation.cpp b/stepmania/src/ScreenEvaluation.cpp index 52ab472072..805fb0a5c5 100644 --- a/stepmania/src/ScreenEvaluation.cpp +++ b/stepmania/src/ScreenEvaluation.cpp @@ -162,7 +162,7 @@ void ScreenEvaluation::Init() LOG->Trace( "ScreenEvaluation::ScreenEvaluation()" ); - LIGHTSMAN->SetLightMode( LIGHTMODE_MENU ); + LIGHTSMAN->SetLightsMode( LIGHTSMODE_MENU ); m_bFailed = g_CurStageStats.AllFailed(); diff --git a/stepmania/src/ScreenGameplay.cpp b/stepmania/src/ScreenGameplay.cpp index b5f4140aa7..ac505a1082 100644 --- a/stepmania/src/ScreenGameplay.cpp +++ b/stepmania/src/ScreenGameplay.cpp @@ -99,9 +99,9 @@ void ScreenGameplay::Init() int p; if( m_bDemonstration ) - LIGHTSMAN->SetLightMode( LIGHTMODE_DEMONSTRATION ); + LIGHTSMAN->SetLightsMode( LIGHTSMODE_DEMONSTRATION ); else - LIGHTSMAN->SetLightMode( LIGHTMODE_GAMEPLAY ); + LIGHTSMAN->SetLightsMode( LIGHTSMODE_GAMEPLAY_READY ); m_soundMusic = NULL; @@ -1388,9 +1388,9 @@ void ScreenGameplay::Update( float fDeltaTime ) s_fSecsLeftOnUpperLights = 0; } if( s_fSecsLeftOnUpperLights>0 ) - LIGHTSMAN->SetAllUpperLights( true ); + LIGHTSMAN->SetLightsMode( LIGHTSMODE_GAMEPLAY_READY ); else - LIGHTSMAN->SetAllUpperLights( false ); + LIGHTSMAN->SetLightsMode( LIGHTSMODE_GAMEPLAY_GO ); // // update song position meter @@ -1977,7 +1977,7 @@ void ScreenGameplay::HandleScreenMessage( const ScreenMessage SM ) GAMESTATE->RemoveAllActiveAttacks(); - LIGHTSMAN->SetLightMode( LIGHTMODE_ALL_CLEARED ); + LIGHTSMAN->SetLightsMode( LIGHTSMODE_ALL_CLEARED ); if( bAllReallyFailed ) diff --git a/stepmania/src/ScreenSelectMusic.cpp b/stepmania/src/ScreenSelectMusic.cpp index 17536fc4cc..938787a715 100644 --- a/stepmania/src/ScreenSelectMusic.cpp +++ b/stepmania/src/ScreenSelectMusic.cpp @@ -82,7 +82,7 @@ ScreenSelectMusic::ScreenSelectMusic( CString sClassName ) : Screen( sClassName { LOG->Trace( "ScreenSelectMusic::ScreenSelectMusic()" ); - LIGHTSMAN->SetLightMode( LIGHTMODE_MENU ); + LIGHTSMAN->SetLightsMode( LIGHTSMODE_MENU ); m_bInCourseDisplayMode = GAMESTATE->IsCourseMode(); diff --git a/stepmania/src/ScreenSelectStyle.cpp b/stepmania/src/ScreenSelectStyle.cpp index bf84735ee3..b8c8734622 100644 --- a/stepmania/src/ScreenSelectStyle.cpp +++ b/stepmania/src/ScreenSelectStyle.cpp @@ -31,7 +31,7 @@ ScreenSelectStyle::ScreenSelectStyle( CString sClassName ) : ScreenSelect( sClas { m_iSelection = 0; - LIGHTSMAN->SetLightMode( LIGHTMODE_MENU ); + LIGHTSMAN->SetLightsMode( LIGHTSMODE_MENU ); unsigned i; for( i=0; iStopMusic(); - LIGHTSMAN->SetLightMode( LIGHTMODE_STAGE ); + LIGHTSMAN->SetLightsMode( LIGHTSMODE_STAGE ); m_Background.LoadFromAniDir( THEME->GetPathToB(m_sName + " "+GAMESTATE->GetStageText()) ); diff --git a/stepmania/src/ScreenTitleMenu.cpp b/stepmania/src/ScreenTitleMenu.cpp index aaa560d841..c11cab44ce 100644 --- a/stepmania/src/ScreenTitleMenu.cpp +++ b/stepmania/src/ScreenTitleMenu.cpp @@ -77,7 +77,7 @@ ScreenTitleMenu::ScreenTitleMenu( CString sClassName ) : ScreenSelect( sClassNam * things stinks ... */ GAMESTATE->Reset(); - LIGHTSMAN->SetLightMode( LIGHTMODE_JOINING ); // do this after Reset! + LIGHTSMAN->SetLightsMode( LIGHTSMODE_JOINING ); // do this after Reset! m_sprLogo.Load( THEME->GetPathToG(ssprintf("ScreenLogo %s",GAMESTATE->GetCurrentGameDef()->m_szName)) ); diff --git a/stepmania/src/arch/Lights/LightsDriver.h b/stepmania/src/arch/Lights/LightsDriver.h index 9fb55867c8..a1ef463403 100644 --- a/stepmania/src/arch/Lights/LightsDriver.h +++ b/stepmania/src/arch/Lights/LightsDriver.h @@ -13,14 +13,15 @@ #include "LightsManager.h" +struct LightsState; + class LightsDriver { public: LightsDriver() {}; virtual ~LightsDriver() {}; - virtual void SetLight( Light light, bool bOn ) = 0; - virtual void Flush() = 0; + virtual void Set( const LightsState *ls ) = 0; }; diff --git a/stepmania/src/arch/Lights/LightsDriver_LinuxSerial.cpp b/stepmania/src/arch/Lights/LightsDriver_LinuxSerial.cpp deleted file mode 100644 index 0e26a34f39..0000000000 --- a/stepmania/src/arch/Lights/LightsDriver_LinuxSerial.cpp +++ /dev/null @@ -1,124 +0,0 @@ -#include "global.h" -/* ------------------------------------------------------------------------------ - Class: LightsDriver_LinuxSerial - - Desc: See header. - - Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved. - Chris Danford ------------------------------------------------------------------------------ -*/ - -#include "LightsDriver_LinuxSerial.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include "RageLog.h" -#include "RageTimer.h" - -static int fd = -1; - -void WriteString( const char *sz, int len ) -{ - int iOut; - if( fd == -1 ) - { - LOG->Warn("Lights port is not open\n"); - return; - } - - iOut = write(fd, sz, len); - if (iOut < 0) - { - LOG->Warn("Lights write error %d %s\n", errno, strerror(errno)); - } - - ASSERT( iOut > 0 ); -} - -LightsDriver_LinuxSerial::LightsDriver_LinuxSerial() -{ - fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY); // COM1 - if (fd < 0) - RageException::Throw( "open error %d %s\n", errno, strerror(errno) ); - - tcflush(fd, TCIFLUSH); - - struct termios my_termios; - tcgetattr(fd, &my_termios); - -// my_termios.c_iflag = IGNBRK; -// my_termios.c_lflag = 0; -// my_termios.c_oflag = 0; -// my_termios.c_cflag |= CREAD | CLOCAL; - my_termios.c_cflag &= ~CRTSCTS; - my_termios.c_iflag &= ~(IXON | IXOFF | IXANY); /* no flow control */ -// my_termios.sg_ispeed = my_termios.sg_ispeed = B2400; - -// my_termios.c_cflag = B2400 | CS8 | CREAD | CLOCAL | HUPCL; -// my_termios.c_oflag &= ~0; /* no flow control */ -// fcntl(fd, F_SETFL, 0); - - cfsetispeed(&my_termios, B2400); - cfsetospeed(&my_termios, B2400); - tcsetattr(fd, TCSANOW, &my_termios); - LOG->Info("Lights info:"); - LOG->Info(" new cflag=%08x", (int) my_termios.c_cflag); - LOG->Info(" new oflag=%08x", (int) my_termios.c_oflag); - LOG->Info(" new iflag=%08x", (int) my_termios.c_iflag); - LOG->Info(" new lflag=%08x", (int) my_termios.c_lflag); -} - -LightsDriver_LinuxSerial::~LightsDriver_LinuxSerial() -{ - if( fd != -1 ) - close( fd ); -} - -#define NUM_DATA_BYTES 2 - -char g_data[NUM_DATA_BYTES] = { 0, 0 }; - -void LightsDriver_LinuxSerial::SetLight( Light light, bool bOn ) -{ - int byte_index = light / 8; - ASSERT( byte_index <= NUM_DATA_BYTES ); - int bit_index = light % 8; - char &data = g_data[byte_index]; - char mask = 0x01 << bit_index; - if( bOn ) - data |= mask; - else - data &= ~mask; -} - -void LightsDriver_LinuxSerial::Flush() -{ - // temp HACK: only write once every 30 times - static RageTimer tm; - if( tm.PeekDeltaTime() < 0.02f ) - return; - tm.Touch(); - -// LOG->Trace( "Entering LightsDriver_LinuxSerial::Flush()" ); - - char temp_data_to_write[2+NUM_DATA_BYTES] = ""; - temp_data_to_write[0] = 'Y'; - temp_data_to_write[1] = 'o'; - - for( int i=0; i 0.1f ) - LOG->Warn("WriteString took %F", testing.GetDeltaTime()); - -// LOG->Trace( "Leaving LightsDriver_LinuxSerial::Flush()" ); -} diff --git a/stepmania/src/arch/Lights/LightsDriver_LinuxSerial.h b/stepmania/src/arch/Lights/LightsDriver_LinuxSerial.h deleted file mode 100644 index d8ec7eff70..0000000000 --- a/stepmania/src/arch/Lights/LightsDriver_LinuxSerial.h +++ /dev/null @@ -1,28 +0,0 @@ -#ifndef LightsDriver_LinuxSerial_H -#define LightsDriver_LinuxSerial_H -/* ------------------------------------------------------------------------------ - Class: LightsDriver_LinuxSerial - - Desc: Control lights. - - Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved. - Chris Danford ------------------------------------------------------------------------------ -*/ - -#include "arch/Lights/LightsDriver.h" - -class LightsDriver_LinuxSerial : public LightsDriver -{ -public: - LightsDriver_LinuxSerial(); - virtual ~LightsDriver_LinuxSerial(); - - virtual void SetLight( Light light, bool bOn ); - virtual void Flush(); -}; - - - -#endif diff --git a/stepmania/src/arch/Lights/LightsDriver_Null.h b/stepmania/src/arch/Lights/LightsDriver_Null.h index 7b5778a65d..152b992475 100644 --- a/stepmania/src/arch/Lights/LightsDriver_Null.h +++ b/stepmania/src/arch/Lights/LightsDriver_Null.h @@ -19,8 +19,7 @@ public: LightsDriver_Null() {}; virtual ~LightsDriver_Null() {}; - virtual void SetLight( Light light, bool bOn ) {}; - virtual void Flush() {}; + void Set( const LightsState *ls ) {}; }; diff --git a/stepmania/src/arch/Lights/LightsDriver_SystemMessage.cpp b/stepmania/src/arch/Lights/LightsDriver_SystemMessage.cpp index 95b8a0cee6..7a650f97e0 100644 --- a/stepmania/src/arch/Lights/LightsDriver_SystemMessage.cpp +++ b/stepmania/src/arch/Lights/LightsDriver_SystemMessage.cpp @@ -14,28 +14,34 @@ #include "ScreenManager.h" -bool g_bLightOn[NUM_LIGHTS]; - LightsDriver_SystemMessage::LightsDriver_SystemMessage() { - memset( g_bLightOn, 0, sizeof(g_bLightOn) ); } LightsDriver_SystemMessage::~LightsDriver_SystemMessage() { } -void LightsDriver_SystemMessage::SetLight( Light light, bool bOn ) +void LightsDriver_SystemMessage::Set( const LightsState *ls ) { - g_bLightOn[light] = bOn; -} - -void LightsDriver_SystemMessage::Flush() -{ - CString s = "Lights: "; - for( int i=0; im_bCabinetLights[cl] ? '1' : '0'; } + s += "\n"; + + FOREACH_GameController( gc ) + { + s += ssprintf("Controller%d: ",gc+1); + FOREACH_GameButton( gb ) + { + s += ls->m_bGameButtonLights[gc][gb] ? '1' : '0'; + } + s += "\n"; + } + SCREENMAN->SystemMessageNoAnimate( s ); } diff --git a/stepmania/src/arch/Lights/LightsDriver_SystemMessage.h b/stepmania/src/arch/Lights/LightsDriver_SystemMessage.h index e48879709b..4945e43cb1 100644 --- a/stepmania/src/arch/Lights/LightsDriver_SystemMessage.h +++ b/stepmania/src/arch/Lights/LightsDriver_SystemMessage.h @@ -19,8 +19,7 @@ public: LightsDriver_SystemMessage(); virtual ~LightsDriver_SystemMessage(); - virtual void SetLight( Light light, bool bOn ); - virtual void Flush(); + virtual void Set( const LightsState *ls ); }; diff --git a/stepmania/src/arch/Lights/LightsDriver_Win32Parallel.cpp b/stepmania/src/arch/Lights/LightsDriver_Win32Parallel.cpp index 4a755711d1..3f20f2a25b 100644 --- a/stepmania/src/arch/Lights/LightsDriver_Win32Parallel.cpp +++ b/stepmania/src/arch/Lights/LightsDriver_Win32Parallel.cpp @@ -12,6 +12,7 @@ #include "LightsDriver_Win32Parallel.h" #include "windows.h" +#include "RageUtil.h" HINSTANCE hDLL = NULL; @@ -23,17 +24,29 @@ ISDRIVERINSTALLED* IsDriverInstalled = NULL; const int LIGHTS_PER_PARALLEL_PORT = 8; const int MAX_PARALLEL_PORTS = 3; -DWORD LPT_ADDRESS[MAX_PARALLEL_PORTS] = +short LPT_ADDRESS[MAX_PARALLEL_PORTS] = { 0x378, // LPT1 0x278, // LPT2 0x3bc, // LPT3 }; -void LightToLptAndPin( Light light, int &lpt_out, int &pin_out ) + +int CabinetLightToIndex( CabinetLight cl ) { - lpt_out = light / LIGHTS_PER_PARALLEL_PORT; + return cl; +} + +int GameControllerAndGameButtonToIndex( GameController gc, GameButton gb ) +{ + CLAMP( (int&)gb, 0, 3 ); + return NUM_CABINET_LIGHTS + gc*4 + gb; +} + +void IndexToLptAndPin( int index, int &lpt_out, int &pin_out ) +{ + lpt_out = index / LIGHTS_PER_PARALLEL_PORT; ASSERT( lpt_out >= 0 && lpt_out < MAX_PARALLEL_PORTS ); - pin_out = light % LIGHTS_PER_PARALLEL_PORT; + pin_out = index % LIGHTS_PER_PARALLEL_PORT; } LightsDriver_Win32Parallel::LightsDriver_Win32Parallel() @@ -56,33 +69,53 @@ LightsDriver_Win32Parallel::~LightsDriver_Win32Parallel() FreeLibrary( hDLL ); } -BYTE g_data[MAX_PARALLEL_PORTS] = +void LightsDriver_Win32Parallel::Set( const LightsState *ls ) { - 0x00, - 0x00, - 0x00 -}; - -void LightsDriver_Win32Parallel::SetLight( Light light, bool bOn ) -{ - int lpt; - int pin; - LightToLptAndPin( light, lpt, pin ); - - BYTE &data = g_data[lpt]; - BYTE mask = (BYTE) (0x01 << pin); - if( bOn ) - data |= mask; - else - data &= ~mask; -} - -void LightsDriver_Win32Parallel::Flush() -{ - for( int i=0; im_bCabinetLights[cl]; + int index = CabinetLightToIndex( cl ); + int lpt; + int pin; + IndexToLptAndPin( index, lpt, pin ); + BYTE mask = (BYTE) (0x01 << pin); + if( bOn ) + data[lpt] |= mask; + else + data[lpt] &= ~mask; + } + } + + FOREACH_GameController( gc ) + { + FOREACH_GameButton( gb ) + { + bool bOn = ls->m_bGameButtonLights[gc][gb]; + int index = GameControllerAndGameButtonToIndex( gc, gb ); + int lpt; + int pin; + IndexToLptAndPin( index, lpt, pin ); + BYTE mask = (BYTE) (0x01 << pin); + if( bOn ) + data[lpt] |= mask; + else + data[lpt] &= ~mask; + } + } + + { + for( int i=0; i