From b697979cc0a97288fb00c226679275b452c38118 Mon Sep 17 00:00:00 2001 From: Chris Danford Date: Sun, 16 Nov 2003 06:27:52 +0000 Subject: [PATCH] support pad lights --- stepmania/src/LightsManager.cpp | 64 ++++++++++++++++++- stepmania/src/LightsManager.h | 22 +++++-- stepmania/src/ScreenGameplay.cpp | 2 +- stepmania/src/ScreenStage.cpp | 2 +- .../Lights/LightsDriver_Win32Parallel.cpp | 34 ++++++++-- 5 files changed, 110 insertions(+), 14 deletions(-) diff --git a/stepmania/src/LightsManager.cpp b/stepmania/src/LightsManager.cpp index 72ae635c1e..61f351b13d 100644 --- a/stepmania/src/LightsManager.cpp +++ b/stepmania/src/LightsManager.cpp @@ -16,6 +16,8 @@ #include "arch/Lights/LightsDriver.h" #include "arch/arch.h" #include "RageUtil.h" +#include "GameInput.h" // for GameController +#include "InputMapper.h" #include "windows.h" @@ -35,6 +37,9 @@ LightsManager::~LightsManager() void LightsManager::Update( float fDeltaTime ) { + // + // Update cabinet lights + // switch( m_LightMode ) { case LIGHTMODE_JOINING: @@ -115,13 +120,13 @@ void LightsManager::Update( float fDeltaTime ) m_pDriver->SetLight( (Light)i, bOn ); } break; - case LIGHTMODE_ALL_ON: + case LIGHTMODE_STAGE: { for( int i=0; i<8; i++ ) m_pDriver->SetLight( (Light)i, true ); } break; - case LIGHTMODE_ALL_OFF: + case LIGHTMODE_ALL_CLEARED: { for( int i=0; i<8; i++ ) m_pDriver->SetLight( (Light)i, false ); @@ -130,6 +135,61 @@ void LightsManager::Update( float fDeltaTime ) default: ASSERT(0); } + + // + // Update game controller lights + // + // FIXME: Works only with Game==dance + // FIXME: lights pads for players who aren't playing + switch( m_LightMode ) + { + case LIGHTMODE_ATTRACT: + case LIGHTMODE_MENU: + case LIGHTMODE_DEMONSTRATION: + { + for( int i=LIGHT_GAME_BUTTON1; i<=LIGHT_LAST_GAME_BUTTON; i++ ) + m_pDriver->SetLight( (Light)i, false ); + } + break; + case LIGHTMODE_ALL_CLEARED: + case LIGHTMODE_STAGE: + case LIGHTMODE_JOINING: + { + for( int c=0; c<2; c++ ) + { + GameController gc = (GameController)c; + bool bOn = GAMESTATE->m_bSideIsJoined[c]; + + 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 ); + } + } + } + break; + case LIGHTMODE_GAMEPLAY: + { + for( int c=0; c<2; c++ ) + { + GameController gc = (GameController)c; + + for( int i=0; i<4; i++ ) + { + 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 ); + } + } + } + break; + default: + ASSERT(0); + } } void LightsManager::SetLightMode( LightMode lm ) diff --git a/stepmania/src/LightsManager.h b/stepmania/src/LightsManager.h index c502b613ba..167bf800e7 100644 --- a/stepmania/src/LightsManager.h +++ b/stepmania/src/LightsManager.h @@ -18,13 +18,23 @@ enum Light LIGHT_MARUQEE_UP_RIGHT, LIGHT_MARUQEE_LR_LEFT, LIGHT_MARUQEE_LR_RIGHT, - LIGHT_MARUQEE_MENU_LEFT, - LIGHT_MARUQEE_MENU_RIGHT, - LIGHT_MARUQEE_BASS_LEFT, - LIGHT_MARUQEE_BASS_RIGHT, + LIGHT_MENU_LEFT, + LIGHT_MENU_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 }; +const Light LIGHT_LAST_GAME_BUTTON = LIGHT_GAME_BUTTON8; + enum LightMode { LIGHTMODE_ATTRACT, @@ -32,8 +42,8 @@ enum LightMode LIGHTMODE_MENU, LIGHTMODE_DEMONSTRATION, LIGHTMODE_GAMEPLAY, - LIGHTMODE_ALL_ON, - LIGHTMODE_ALL_OFF, + LIGHTMODE_STAGE, + LIGHTMODE_ALL_CLEARED, }; class LightsDriver; diff --git a/stepmania/src/ScreenGameplay.cpp b/stepmania/src/ScreenGameplay.cpp index 502390ae3e..fcea6cb916 100644 --- a/stepmania/src/ScreenGameplay.cpp +++ b/stepmania/src/ScreenGameplay.cpp @@ -1715,7 +1715,7 @@ void ScreenGameplay::HandleScreenMessage( const ScreenMessage SM ) GAMESTATE->RemoveAllActiveAttacks(); - LIGHTSMAN->SetLightMode( LIGHTMODE_ALL_OFF ); + LIGHTSMAN->SetLightMode( LIGHTMODE_ALL_CLEARED ); if( bAllReallyFailed ) diff --git a/stepmania/src/ScreenStage.cpp b/stepmania/src/ScreenStage.cpp index 0f1475f68e..3a2369e961 100644 --- a/stepmania/src/ScreenStage.cpp +++ b/stepmania/src/ScreenStage.cpp @@ -57,7 +57,7 @@ ScreenStage::ScreenStage( CString sClassName ) : Screen( sClassName ) { SOUND->StopMusic(); - LIGHTSMAN->SetLightMode( LIGHTMODE_ALL_ON ); + LIGHTSMAN->SetLightMode( LIGHTMODE_STAGE ); m_Background.LoadFromAniDir( THEME->GetPathToB("ScreenStage "+GAMESTATE->GetStageText()) ); diff --git a/stepmania/src/arch/Lights/LightsDriver_Win32Parallel.cpp b/stepmania/src/arch/Lights/LightsDriver_Win32Parallel.cpp index 76aedca405..4e6aa6a533 100644 --- a/stepmania/src/arch/Lights/LightsDriver_Win32Parallel.cpp +++ b/stepmania/src/arch/Lights/LightsDriver_Win32Parallel.cpp @@ -21,6 +21,20 @@ PORTOUT* PortOut = NULL; typedef short int (WINAPI ISDRIVERINSTALLED)(); ISDRIVERINSTALLED* IsDriverInstalled = NULL; +const int LIGHTS_PER_PARALLEL_PORT = 8; +const int MAX_PARALLEL_PORTS = 3; +DWORD LPT_ADDRESS[MAX_PARALLEL_PORTS] = +{ + 0x378, // LPT1 + 0x278, // LPT2 + 0x3bc, // LPT3 +}; +void LightToLptAndPin( Light light, int &lpt_out, int &pin_out ) +{ + lpt_out = light / LIGHTS_PER_PARALLEL_PORT; + ASSERT( lpt_out >= 0 && lpt_out < MAX_PARALLEL_PORTS ); + pin_out = light % LIGHTS_PER_PARALLEL_PORT; +} LightsDriver_Win32Parallel::LightsDriver_Win32Parallel() { @@ -42,14 +56,26 @@ LightsDriver_Win32Parallel::~LightsDriver_Win32Parallel() FreeLibrary( hDLL ); } +BYTE g_data[MAX_PARALLEL_PORTS] = +{ + 0x00, + 0x00, + 0x00 +}; + void LightsDriver_Win32Parallel::SetLight( Light light, bool bOn ) { - static BYTE data = 0x00; - BYTE mask = 0x01 << light; + int lpt; + int pin; + LightToLptAndPin( light, lpt, pin ); + + BYTE &data = g_data[lpt]; + BYTE mask = 0x01 << pin; if( bOn ) data |= mask; else data &= ~mask; - PortOut( 0x378, data ); - // ports of interest: 0x278, 0x3BC, 0x378 + + DWORD address = LPT_ADDRESS[lpt]; + PortOut( address, data ); }