clean up lights

This commit is contained in:
Chris Danford
2004-03-23 06:11:10 +00:00
parent 3abe83c71e
commit 0ca0f86d7e
23 changed files with 184 additions and 319 deletions
+1
View File
@@ -0,0 +1 @@
#define FOREACH_ENUM( e, max, var ) for( e var=(e)0; var<max; ((int&)var)++ )
+1 -3
View File
@@ -14,6 +14,7 @@
*/
#include "PlayerNumber.h" // TODO: Get rid of this dependency. -Chris
#include "ForeachEnum.h"
//
// Screen Dimensions
@@ -35,9 +36,6 @@
#define ARROW_SIZE (64)
#define FOREACH_ENUM( e, max, var ) for( e var=(e)0; var<max; ((int&)var)++ )
//
// Note definitions
//
+7 -3
View File
@@ -10,6 +10,9 @@
Chris Danford
-----------------------------------------------------------------------------
*/
#include "ForeachEnum.h"
enum GameController
{
GAME_CONTROLLER_1 = 0, // left controller
@@ -17,8 +20,12 @@ enum GameController
MAX_GAME_CONTROLLERS, // leave this at the end
GAME_CONTROLLER_INVALID,
};
#define FOREACH_GameController( gc ) FOREACH_ENUM( GameController, MAX_GAME_CONTROLLERS, gc )
typedef int GameButton;
const GameButton MAX_GAME_BUTTONS = 20;
const GameButton GAME_BUTTON_INVALID = MAX_GAME_BUTTONS+1;
#define FOREACH_GameButton( gb ) FOREACH_ENUM( GameButton, MAX_GAME_BUTTONS, gb )
enum // DanceButtons
{
@@ -223,9 +230,6 @@ enum // PnM Buttons
NUM_PNM_BUTTONS, // leave this at the end
};
const GameButton MAX_GAME_BUTTONS = 20;
const GameButton GAME_BUTTON_INVALID = MAX_GAME_BUTTONS+1;
struct GameInput
+1 -1
View File
@@ -165,7 +165,7 @@ void GameState::Reset()
MEMCARDMAN->LockCards( false );
LIGHTSMAN->SetLightMode( LIGHTMODE_ATTRACT );
LIGHTSMAN->SetLightsMode( LIGHTSMODE_ATTRACT );
}
void GameState::BeginGame()
+47 -69
View File
@@ -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;
}
+27 -26
View File
@@ -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;
};
-1
View File
@@ -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 \
+1 -2
View File
@@ -14,8 +14,7 @@
*/
#include "RageTypes.h" // for RageColor
#define FOREACH_ENUM( e, max, var ) for( e var=(e)0; var<max; ((int&)var)++ )
#include "ForeachEnum.h"
//
+2 -2
View File
@@ -79,10 +79,10 @@ void ScreenCaution::HandleScreenMessage( const ScreenMessage SM )
break;
case SM_GoToPrevScreen:
SCREENMAN->SetNewScreen( "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;
}
+1 -1
View File
@@ -162,7 +162,7 @@ void ScreenEvaluation::Init()
LOG->Trace( "ScreenEvaluation::ScreenEvaluation()" );
LIGHTSMAN->SetLightMode( LIGHTMODE_MENU );
LIGHTSMAN->SetLightsMode( LIGHTSMODE_MENU );
m_bFailed = g_CurStageStats.AllFailed();
+5 -5
View File
@@ -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 )
+1 -1
View File
@@ -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();
+1 -1
View File
@@ -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; i<m_aModeChoices.size(); i++ )
+1 -1
View File
@@ -58,7 +58,7 @@ ScreenStage::ScreenStage( CString sClassName ) : Screen( sClassName )
{
SOUND->StopMusic();
LIGHTSMAN->SetLightMode( LIGHTMODE_STAGE );
LIGHTSMAN->SetLightsMode( LIGHTSMODE_STAGE );
m_Background.LoadFromAniDir( THEME->GetPathToB(m_sName + " "+GAMESTATE->GetStageText()) );
+1 -1
View File
@@ -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)) );
+3 -2
View File
@@ -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;
};
@@ -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 <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <string.h>
#include <errno.h>
#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<NUM_DATA_BYTES; i++ )
temp_data_to_write[2+i] = ~g_data[i]; // flip bits so that 0=on, 1=off.
RageTimer testing;
WriteString( temp_data_to_write, sizeof(temp_data_to_write) );
if( testing.PeekDeltaTime() > 0.1f )
LOG->Warn("WriteString took %F", testing.GetDeltaTime());
// LOG->Trace( "Leaving LightsDriver_LinuxSerial::Flush()" );
}
@@ -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
@@ -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 ) {};
};
@@ -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; i<NUM_LIGHTS; i++ )
CString s;
s += "Cabinet: ";
FOREACH_CabinetLight( cl )
{
s += g_bLightOn[i] ? '1' : '0';
s += ls->m_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 );
}
@@ -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 );
};
@@ -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; i<MAX_PARALLEL_PORTS; i++ )
BYTE data[MAX_PARALLEL_PORTS] =
{
BYTE &data = g_data[i];
DWORD address = LPT_ADDRESS[i];
PortOut( (short) address, data );
0x00,
0x00,
0x00
};
{
FOREACH_CabinetLight( cl )
{
bool bOn = ls->m_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<MAX_PARALLEL_PORTS; i++ )
{
short address = LPT_ADDRESS[i];
PortOut( address, data[i] );
}
}
}
@@ -20,8 +20,7 @@ public:
LightsDriver_Win32Parallel();
virtual ~LightsDriver_Win32Parallel();
virtual void SetLight( Light light, bool bOn );
virtual void Flush();
virtual void Set( const LightsState *ls );
};