support pad lights

This commit is contained in:
Chris Danford
2003-11-16 06:27:52 +00:00
parent 2a33a95233
commit b697979cc0
5 changed files with 110 additions and 14 deletions
+62 -2
View File
@@ -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 )
+16 -6
View File
@@ -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;
+1 -1
View File
@@ -1715,7 +1715,7 @@ void ScreenGameplay::HandleScreenMessage( const ScreenMessage SM )
GAMESTATE->RemoveAllActiveAttacks();
LIGHTSMAN->SetLightMode( LIGHTMODE_ALL_OFF );
LIGHTSMAN->SetLightMode( LIGHTMODE_ALL_CLEARED );
if( bAllReallyFailed )
+1 -1
View File
@@ -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()) );
@@ -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 );
}