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 "PlayerNumber.h" // TODO: Get rid of this dependency. -Chris
#include "ForeachEnum.h"
// //
// Screen Dimensions // Screen Dimensions
@@ -35,9 +36,6 @@
#define ARROW_SIZE (64) #define ARROW_SIZE (64)
#define FOREACH_ENUM( e, max, var ) for( e var=(e)0; var<max; ((int&)var)++ )
// //
// Note definitions // Note definitions
// //
+7 -3
View File
@@ -10,6 +10,9 @@
Chris Danford Chris Danford
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
*/ */
#include "ForeachEnum.h"
enum GameController enum GameController
{ {
GAME_CONTROLLER_1 = 0, // left controller GAME_CONTROLLER_1 = 0, // left controller
@@ -17,8 +20,12 @@ enum GameController
MAX_GAME_CONTROLLERS, // leave this at the end MAX_GAME_CONTROLLERS, // leave this at the end
GAME_CONTROLLER_INVALID, GAME_CONTROLLER_INVALID,
}; };
#define FOREACH_GameController( gc ) FOREACH_ENUM( GameController, MAX_GAME_CONTROLLERS, gc )
typedef int GameButton; 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 enum // DanceButtons
{ {
@@ -223,9 +230,6 @@ enum // PnM Buttons
NUM_PNM_BUTTONS, // leave this at the end 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 struct GameInput
+1 -1
View File
@@ -165,7 +165,7 @@ void GameState::Reset()
MEMCARDMAN->LockCards( false ); MEMCARDMAN->LockCards( false );
LIGHTSMAN->SetLightMode( LIGHTMODE_ATTRACT ); LIGHTSMAN->SetLightsMode( LIGHTSMODE_ATTRACT );
} }
void GameState::BeginGame() 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) LightsManager::LightsManager(CString sDriver)
{ {
m_LightMode = LIGHTMODE_JOINING; m_LightsMode = LIGHTSMODE_JOINING;
m_pDriver = MakeLightsDriver(sDriver); m_pDriver = MakeLightsDriver(sDriver);
} }
@@ -39,9 +39,9 @@ void LightsManager::Update( float fDeltaTime )
// //
// Update cabinet lights // Update cabinet lights
// //
switch( m_LightMode ) switch( m_LightsMode )
{ {
case LIGHTMODE_JOINING: case LIGHTSMODE_JOINING:
{ {
switch( GAMESTATE->GetNumSidesJoined() ) switch( GAMESTATE->GetNumSidesJoined() )
{ {
@@ -51,95 +51,92 @@ void LightsManager::Update( float fDeltaTime )
// float fBeatPercentage = GAMESTATE->m_fSongBeat - (int)GAMESTATE->m_fSongBeat; // float fBeatPercentage = GAMESTATE->m_fSongBeat - (int)GAMESTATE->m_fSongBeat;
bool bOn = (iSec%2)==0; bool bOn = (iSec%2)==0;
for( int i=0; i<8; i++ ) for( int i=0; i<8; i++ )
m_pDriver->SetLight( (Light)i, bOn ); m_LightsState.m_bCabinetLights[i] = bOn;
} }
break; break;
default: default:
for( int i=0; i<8; i++ ) for( int i=0; i<8; i++ )
{ {
bool bOn = GAMESTATE->m_bSideIsJoined[i%2]; bool bOn = GAMESTATE->m_bSideIsJoined[i%2];
m_pDriver->SetLight( (Light)i, bOn ); m_LightsState.m_bCabinetLights[i] = bOn;
} }
} }
} }
break; break;
case LIGHTMODE_ATTRACT: case LIGHTSMODE_ATTRACT:
{ {
int iSec = (int)RageTimer::GetTimeSinceStart(); int iSec = (int)RageTimer::GetTimeSinceStart();
int i; int i;
for( i=0; i<4; i++ ) for( i=0; i<4; i++ )
{ {
bool bOn = (iSec%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++ ) for( i=4; i<6; i++ )
{ {
bool bOn = false; bool bOn = false;
m_pDriver->SetLight( (Light)i, bOn ); m_LightsState.m_bCabinetLights[i] = bOn;
} }
for( i=6; i<8; i++ ) for( i=6; i<8; i++ )
{ {
bool bOn = (iSec%3)==0; bool bOn = (iSec%3)==0;
m_pDriver->SetLight( (Light)i, bOn ); m_LightsState.m_bCabinetLights[i] = bOn;
} }
} }
break; break;
case LIGHTMODE_MENU: case LIGHTSMODE_MENU:
{ {
int iSec = (int)RageTimer::GetTimeSinceStart(); int iSec = (int)RageTimer::GetTimeSinceStart();
int i; int i;
for( i=0; i<2; i++ ) for( i=0; i<2; i++ )
{ {
bool bOn = (iSec%2)==0; bool bOn = (iSec%2)==0;
m_pDriver->SetLight( (Light)i, bOn ); m_LightsState.m_bCabinetLights[i] = bOn;
} }
for( i=2; i<4; i++ ) for( i=2; i<4; i++ )
{ {
bool bOn = (iSec%2)==1; bool bOn = (iSec%2)==1;
m_pDriver->SetLight( (Light)i, bOn ); m_LightsState.m_bCabinetLights[i] = bOn;
} }
for( i=4; i<6; i++ ) for( i=4; i<6; i++ )
{ {
bool bOn = (iSec%2)==0; bool bOn = (iSec%2)==0;
m_pDriver->SetLight( (Light)i, bOn ); m_LightsState.m_bCabinetLights[i] = bOn;
} }
for( i=6; i<8; i++ ) for( i=6; i<8; i++ )
{ {
bool bOn = (iSec%2)==1; bool bOn = (iSec%2)==1;
m_pDriver->SetLight( (Light)i, bOn ); m_LightsState.m_bCabinetLights[i] = bOn;
} }
} }
break; break;
case LIGHTMODE_DEMONSTRATION: case LIGHTSMODE_DEMONSTRATION:
case LIGHTMODE_GAMEPLAY: case LIGHTSMODE_GAMEPLAY_READY:
case LIGHTSMODE_GAMEPLAY_GO:
{ {
int i; int i;
// top lights are controlled my ScreenGameplay bool bMarqueeLightsOn = m_LightsMode == LIGHTSMODE_GAMEPLAY_READY;
//for( int i=0; i<4; i++ )
// m_pDriver->SetLight( (Light)i, bOn ); for( i=0; i<4; i++ )
m_LightsState.m_bCabinetLights[i] = bMarqueeLightsOn;
// menu lights are always off // menu lights are always off
for( i=4; i<6; i++ ) for( i=4; i<6; i++ )
m_pDriver->SetLight( (Light)i, false ); m_LightsState.m_bCabinetLights[i] = false;
// bass lights // bass lights
float fBeatPercentage = GAMESTATE->m_fSongBeat - (int)GAMESTATE->m_fSongBeat; float fBeatPercentage = GAMESTATE->m_fSongBeat - (int)GAMESTATE->m_fSongBeat;
bool bOn = fBeatPercentage < 0.1 || fBeatPercentage > 0.9; bool bOn = fBeatPercentage < 0.1 || fBeatPercentage > 0.9;
for( i=7; i<8; i++ ) for( i=7; i<8; i++ )
m_pDriver->SetLight( (Light)i, bOn ); m_LightsState.m_bCabinetLights[i] = bOn;
} }
break; break;
case LIGHTMODE_STAGE: case LIGHTSMODE_STAGE:
case LIGHTSMODE_ALL_CLEARED:
{ {
for( int i=0; i<8; i++ ) FOREACH_CabinetLight( cl )
m_pDriver->SetLight( (Light)i, true ); m_LightsState.m_bCabinetLights[cl] = true;
}
break;
case LIGHTMODE_ALL_CLEARED:
{
for( int i=0; i<8; i++ )
m_pDriver->SetLight( (Light)i, false );
} }
break; break;
default: default:
@@ -151,48 +148,37 @@ void LightsManager::Update( float fDeltaTime )
// //
// FIXME: Works only with Game==dance // FIXME: Works only with Game==dance
// FIXME: lights pads for players who aren't playing // FIXME: lights pads for players who aren't playing
switch( m_LightMode ) switch( m_LightsMode )
{ {
case LIGHTMODE_ATTRACT: case LIGHTSMODE_ATTRACT:
case LIGHTMODE_MENU: case LIGHTSMODE_MENU:
case LIGHTMODE_DEMONSTRATION: case LIGHTSMODE_DEMONSTRATION:
{ {
for( int i=LIGHT_GAME_BUTTON1; i<=LIGHT_LAST_GAME_BUTTON; i++ ) ZERO( m_LightsState.m_bGameButtonLights );
m_pDriver->SetLight( (Light)i, false );
} }
break; break;
case LIGHTMODE_ALL_CLEARED: case LIGHTSMODE_ALL_CLEARED:
case LIGHTMODE_STAGE: case LIGHTSMODE_STAGE:
case LIGHTMODE_JOINING: case LIGHTSMODE_JOINING:
{ {
for( int c=0; c<2; c++ ) FOREACH_GameController( gc )
{ {
// GameController gc = (GameController)c; bool bOn = GAMESTATE->m_bSideIsJoined[gc];
bool bOn = GAMESTATE->m_bSideIsJoined[c];
for( int i=0; i<4; i++ ) FOREACH_GameButton( gb )
{ m_LightsState.m_bGameButtonLights[gc][gb] = bOn;
// GameButton gb = (GameButton)i;
Light light = (Light)(LIGHT_GAME_BUTTON1 + c*4+i);
m_pDriver->SetLight( light, bOn );
}
} }
} }
break; 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; FOREACH_GameButton( gb )
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) ); 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 // 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; m_LightsMode = lm;
}
void LightsManager::SetAllUpperLights( bool bOn )
{
for( int i=0; i<4; i++ )
{
m_pDriver->SetLight( (Light)i, bOn );
}
} }
+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_LEFT,
LIGHT_MARUQEE_UP_RIGHT, LIGHT_MARUQEE_UP_RIGHT,
LIGHT_MARUQEE_LR_LEFT, LIGHT_MARUQEE_LR_LEFT,
LIGHT_MARUQEE_LR_RIGHT, LIGHT_MARUQEE_LR_RIGHT,
LIGHT_MENU_LEFT, LIGHT_BUTTONS_LEFT,
LIGHT_MENU_RIGHT, LIGHT_BUTTONS_RIGHT,
LIGHT_BASS_LEFT, LIGHT_BASS_LEFT,
LIGHT_BASS_RIGHT, LIGHT_BASS_RIGHT,
LIGHT_GAME_BUTTON1, // NUM_CABINET_LIGHTS
LIGHT_GAME_BUTTON2, };
LIGHT_GAME_BUTTON3, #define FOREACH_CabinetLight( i ) FOREACH_ENUM( CabinetLight, NUM_CABINET_LIGHTS, i )
LIGHT_GAME_BUTTON4,
LIGHT_GAME_BUTTON5, enum LightsMode
LIGHT_GAME_BUTTON6, {
LIGHT_GAME_BUTTON7, LIGHTSMODE_ATTRACT,
LIGHT_GAME_BUTTON8, LIGHTSMODE_JOINING,
NUM_LIGHTS 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; struct LightsState
enum LightMode
{ {
LIGHTMODE_ATTRACT, bool m_bCabinetLights[NUM_CABINET_LIGHTS];
LIGHTMODE_JOINING, bool m_bGameButtonLights[MAX_GAME_CONTROLLERS][MAX_GAME_BUTTONS];
LIGHTMODE_MENU,
LIGHTMODE_DEMONSTRATION,
LIGHTMODE_GAMEPLAY,
LIGHTMODE_STAGE,
LIGHTMODE_ALL_CLEARED,
}; };
class LightsDriver; class LightsDriver;
@@ -56,14 +58,13 @@ public:
void Update( float fDeltaTime ); void Update( float fDeltaTime );
void SetLightMode( LightMode lm ); void SetLightsMode( LightsMode lm );
void SetAllUpperLights( bool bOn );
private: private:
void SetLight( Light light, bool bOn );
LightsDriver* m_pDriver; 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 endif
Lights = arch/Lights/LightsDriver.h \ 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 arch/Lights/LightsDriver_SystemMessage.cpp arch/Lights/LightsDriver_SystemMessage.h
MemoryCard = arch/MemoryCard/MemoryCardDriver.h \ MemoryCard = arch/MemoryCard/MemoryCardDriver.h \
+1 -2
View File
@@ -14,8 +14,7 @@
*/ */
#include "RageTypes.h" // for RageColor #include "RageTypes.h" // for RageColor
#include "ForeachEnum.h"
#define FOREACH_ENUM( e, max, var ) for( e var=(e)0; var<max; ((int&)var)++ )
// //
+2 -2
View File
@@ -79,10 +79,10 @@ void ScreenCaution::HandleScreenMessage( const ScreenMessage SM )
break; break;
case SM_GoToPrevScreen: case SM_GoToPrevScreen:
SCREENMAN->SetNewScreen( "ScreenTitleMenu" ); SCREENMAN->SetNewScreen( "ScreenTitleMenu" );
LIGHTSMAN->SetLightMode( LIGHTMODE_MENU ); LIGHTSMAN->SetLightsMode( LIGHTSMODE_MENU );
break; break;
case SM_GoToNextScreen: case SM_GoToNextScreen:
LIGHTSMAN->SetLightMode( LIGHTMODE_MENU ); LIGHTSMAN->SetLightsMode( LIGHTSMODE_MENU );
SCREENMAN->SetNewScreen( NEXT_SCREEN ); SCREENMAN->SetNewScreen( NEXT_SCREEN );
break; break;
} }
+1 -1
View File
@@ -162,7 +162,7 @@ void ScreenEvaluation::Init()
LOG->Trace( "ScreenEvaluation::ScreenEvaluation()" ); LOG->Trace( "ScreenEvaluation::ScreenEvaluation()" );
LIGHTSMAN->SetLightMode( LIGHTMODE_MENU ); LIGHTSMAN->SetLightsMode( LIGHTSMODE_MENU );
m_bFailed = g_CurStageStats.AllFailed(); m_bFailed = g_CurStageStats.AllFailed();
+5 -5
View File
@@ -99,9 +99,9 @@ void ScreenGameplay::Init()
int p; int p;
if( m_bDemonstration ) if( m_bDemonstration )
LIGHTSMAN->SetLightMode( LIGHTMODE_DEMONSTRATION ); LIGHTSMAN->SetLightsMode( LIGHTSMODE_DEMONSTRATION );
else else
LIGHTSMAN->SetLightMode( LIGHTMODE_GAMEPLAY ); LIGHTSMAN->SetLightsMode( LIGHTSMODE_GAMEPLAY_READY );
m_soundMusic = NULL; m_soundMusic = NULL;
@@ -1388,9 +1388,9 @@ void ScreenGameplay::Update( float fDeltaTime )
s_fSecsLeftOnUpperLights = 0; s_fSecsLeftOnUpperLights = 0;
} }
if( s_fSecsLeftOnUpperLights>0 ) if( s_fSecsLeftOnUpperLights>0 )
LIGHTSMAN->SetAllUpperLights( true ); LIGHTSMAN->SetLightsMode( LIGHTSMODE_GAMEPLAY_READY );
else else
LIGHTSMAN->SetAllUpperLights( false ); LIGHTSMAN->SetLightsMode( LIGHTSMODE_GAMEPLAY_GO );
// //
// update song position meter // update song position meter
@@ -1977,7 +1977,7 @@ void ScreenGameplay::HandleScreenMessage( const ScreenMessage SM )
GAMESTATE->RemoveAllActiveAttacks(); GAMESTATE->RemoveAllActiveAttacks();
LIGHTSMAN->SetLightMode( LIGHTMODE_ALL_CLEARED ); LIGHTSMAN->SetLightsMode( LIGHTSMODE_ALL_CLEARED );
if( bAllReallyFailed ) if( bAllReallyFailed )
+1 -1
View File
@@ -82,7 +82,7 @@ ScreenSelectMusic::ScreenSelectMusic( CString sClassName ) : Screen( sClassName
{ {
LOG->Trace( "ScreenSelectMusic::ScreenSelectMusic()" ); LOG->Trace( "ScreenSelectMusic::ScreenSelectMusic()" );
LIGHTSMAN->SetLightMode( LIGHTMODE_MENU ); LIGHTSMAN->SetLightsMode( LIGHTSMODE_MENU );
m_bInCourseDisplayMode = GAMESTATE->IsCourseMode(); m_bInCourseDisplayMode = GAMESTATE->IsCourseMode();
+1 -1
View File
@@ -31,7 +31,7 @@ ScreenSelectStyle::ScreenSelectStyle( CString sClassName ) : ScreenSelect( sClas
{ {
m_iSelection = 0; m_iSelection = 0;
LIGHTSMAN->SetLightMode( LIGHTMODE_MENU ); LIGHTSMAN->SetLightsMode( LIGHTSMODE_MENU );
unsigned i; unsigned i;
for( i=0; i<m_aModeChoices.size(); 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(); SOUND->StopMusic();
LIGHTSMAN->SetLightMode( LIGHTMODE_STAGE ); LIGHTSMAN->SetLightsMode( LIGHTSMODE_STAGE );
m_Background.LoadFromAniDir( THEME->GetPathToB(m_sName + " "+GAMESTATE->GetStageText()) ); 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 ... */ * things stinks ... */
GAMESTATE->Reset(); 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)) ); m_sprLogo.Load( THEME->GetPathToG(ssprintf("ScreenLogo %s",GAMESTATE->GetCurrentGameDef()->m_szName)) );
+3 -2
View File
@@ -13,14 +13,15 @@
#include "LightsManager.h" #include "LightsManager.h"
struct LightsState;
class LightsDriver class LightsDriver
{ {
public: public:
LightsDriver() {}; LightsDriver() {};
virtual ~LightsDriver() {}; virtual ~LightsDriver() {};
virtual void SetLight( Light light, bool bOn ) = 0; virtual void Set( const LightsState *ls ) = 0;
virtual void Flush() = 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() {}; LightsDriver_Null() {};
virtual ~LightsDriver_Null() {}; virtual ~LightsDriver_Null() {};
virtual void SetLight( Light light, bool bOn ) {}; void Set( const LightsState *ls ) {};
virtual void Flush() {};
}; };
@@ -14,28 +14,34 @@
#include "ScreenManager.h" #include "ScreenManager.h"
bool g_bLightOn[NUM_LIGHTS];
LightsDriver_SystemMessage::LightsDriver_SystemMessage() LightsDriver_SystemMessage::LightsDriver_SystemMessage()
{ {
memset( g_bLightOn, 0, sizeof(g_bLightOn) );
} }
LightsDriver_SystemMessage::~LightsDriver_SystemMessage() LightsDriver_SystemMessage::~LightsDriver_SystemMessage()
{ {
} }
void LightsDriver_SystemMessage::SetLight( Light light, bool bOn ) void LightsDriver_SystemMessage::Set( const LightsState *ls )
{ {
g_bLightOn[light] = bOn; CString s;
}
void LightsDriver_SystemMessage::Flush() s += "Cabinet: ";
{ FOREACH_CabinetLight( cl )
CString s = "Lights: ";
for( int i=0; i<NUM_LIGHTS; i++ )
{ {
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 ); SCREENMAN->SystemMessageNoAnimate( s );
} }
@@ -19,8 +19,7 @@ public:
LightsDriver_SystemMessage(); LightsDriver_SystemMessage();
virtual ~LightsDriver_SystemMessage(); virtual ~LightsDriver_SystemMessage();
virtual void SetLight( Light light, bool bOn ); virtual void Set( const LightsState *ls );
virtual void Flush();
}; };
@@ -12,6 +12,7 @@
#include "LightsDriver_Win32Parallel.h" #include "LightsDriver_Win32Parallel.h"
#include "windows.h" #include "windows.h"
#include "RageUtil.h"
HINSTANCE hDLL = NULL; HINSTANCE hDLL = NULL;
@@ -23,17 +24,29 @@ ISDRIVERINSTALLED* IsDriverInstalled = NULL;
const int LIGHTS_PER_PARALLEL_PORT = 8; const int LIGHTS_PER_PARALLEL_PORT = 8;
const int MAX_PARALLEL_PORTS = 3; const int MAX_PARALLEL_PORTS = 3;
DWORD LPT_ADDRESS[MAX_PARALLEL_PORTS] = short LPT_ADDRESS[MAX_PARALLEL_PORTS] =
{ {
0x378, // LPT1 0x378, // LPT1
0x278, // LPT2 0x278, // LPT2
0x3bc, // LPT3 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 ); 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() LightsDriver_Win32Parallel::LightsDriver_Win32Parallel()
@@ -56,33 +69,53 @@ LightsDriver_Win32Parallel::~LightsDriver_Win32Parallel()
FreeLibrary( hDLL ); FreeLibrary( hDLL );
} }
BYTE g_data[MAX_PARALLEL_PORTS] = void LightsDriver_Win32Parallel::Set( const LightsState *ls )
{ {
BYTE data[MAX_PARALLEL_PORTS] =
{
0x00, 0x00,
0x00, 0x00,
0x00 0x00
}; };
void LightsDriver_Win32Parallel::SetLight( Light light, bool bOn ) {
{ FOREACH_CabinetLight( cl )
{
bool bOn = ls->m_bCabinetLights[cl];
int index = CabinetLightToIndex( cl );
int lpt; int lpt;
int pin; int pin;
LightToLptAndPin( light, lpt, pin ); IndexToLptAndPin( index, lpt, pin );
BYTE &data = g_data[lpt];
BYTE mask = (BYTE) (0x01 << pin); BYTE mask = (BYTE) (0x01 << pin);
if( bOn ) if( bOn )
data |= mask; data[lpt] |= mask;
else else
data &= ~mask; data[lpt] &= ~mask;
} }
}
void LightsDriver_Win32Parallel::Flush() 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++ ) for( int i=0; i<MAX_PARALLEL_PORTS; i++ )
{ {
BYTE &data = g_data[i]; short address = LPT_ADDRESS[i];
DWORD address = LPT_ADDRESS[i]; PortOut( address, data[i] );
PortOut( (short) address, data ); }
} }
} }
@@ -20,8 +20,7 @@ public:
LightsDriver_Win32Parallel(); LightsDriver_Win32Parallel();
virtual ~LightsDriver_Win32Parallel(); virtual ~LightsDriver_Win32Parallel();
virtual void SetLight( Light light, bool bOn ); virtual void Set( const LightsState *ls );
virtual void Flush();
}; };