Added logic to configure gamepad buttons. Still needs more testing.

This commit is contained in:
mjbudd77 2020-06-26 16:35:41 -04:00
parent ee02883ac7
commit 002e9e0f34
5 changed files with 283 additions and 16 deletions

View File

@ -32,24 +32,41 @@ gameWin_t::gameWin_t(QWidget *parent)
gameTimer->setTimerType( Qt::PreciseTimer ); gameTimer->setTimerType( Qt::PreciseTimer );
gameTimer->start( 10 ); gameTimer->start( 10 );
gamePadConfWin = NULL;
} }
gameWin_t::~gameWin_t(void) gameWin_t::~gameWin_t(void)
{ {
if ( gamePadConfWin != NULL )
{
gamePadConfWin->closeWindow();
}
fceuWrapperClose(); fceuWrapperClose();
delete viewport; delete viewport;
} }
void gameWin_t::closeEvent(QCloseEvent *event)
{
printf("Main Window Close Event\n");
if ( gamePadConfWin != NULL )
{
printf("Command Game Pad Close\n");
gamePadConfWin->closeWindow();
}
event->accept();
}
void gameWin_t::keyPressEvent(QKeyEvent *event) void gameWin_t::keyPressEvent(QKeyEvent *event)
{ {
//printf("Key Press: 0x%x \n", event->key() ); printf("Key Press: 0x%x \n", event->key() );
pushKeyEvent( event, 1 ); pushKeyEvent( event, 1 );
} }
void gameWin_t::keyReleaseEvent(QKeyEvent *event) void gameWin_t::keyReleaseEvent(QKeyEvent *event)
{ {
//printf("Key Release: 0x%x \n", event->key() ); printf("Key Release: 0x%x \n", event->key() );
pushKeyEvent( event, 0 ); pushKeyEvent( event, 0 );
} }
@ -165,8 +182,20 @@ void gameWin_t::closeROMCB(void)
void gameWin_t::openGamePadConfWin(void) void gameWin_t::openGamePadConfWin(void)
{ {
if ( gamePadConfWin != NULL )
{
printf("GamePad Config Window Already Open\n");
return;
}
printf("Open GamePad Config Window\n"); printf("Open GamePad Config Window\n");
GamePadConfDialog_t gpConf(this); gamePadConfWin = new GamePadConfDialog_t(this);
gamePadConfWin->show();
gamePadConfWin->exec();
delete gamePadConfWin;
gamePadConfWin = NULL;
printf("GamePad Config Window Destroyed\n");
} }
void gameWin_t::aboutQPlot(void) void gameWin_t::aboutQPlot(void)
@ -177,12 +206,12 @@ void gameWin_t::aboutQPlot(void)
void gameWin_t::runGameFrame(void) void gameWin_t::runGameFrame(void)
{ {
struct timespec ts; //struct timespec ts;
double t; //double t;
clock_gettime( CLOCK_REALTIME, &ts ); //clock_gettime( CLOCK_REALTIME, &ts );
t = (double)ts.tv_sec + (double)(ts.tv_nsec * 1.0e-9); //t = (double)ts.tv_sec + (double)(ts.tv_nsec * 1.0e-9);
//printf("Run Frame %f\n", t); //printf("Run Frame %f\n", t);
fceuWrapperUpdate(); fceuWrapperUpdate();

View File

@ -16,6 +16,7 @@
#include <QTimer> #include <QTimer>
#include "GameViewer.h" #include "GameViewer.h"
#include "GamePadConf.h"
class gameWin_t : public QMainWindow class gameWin_t : public QMainWindow
{ {
@ -41,7 +42,10 @@ class gameWin_t : public QMainWindow
QTimer *gameTimer; QTimer *gameTimer;
GamePadConfDialog_t *gamePadConfWin;
protected: protected:
void closeEvent(QCloseEvent *event);
void keyPressEvent(QKeyEvent *event); void keyPressEvent(QKeyEvent *event);
void keyReleaseEvent(QKeyEvent *event); void keyReleaseEvent(QKeyEvent *event);

View File

@ -1,13 +1,26 @@
// GamePadConf.cpp // GamePadConf.cpp
// //
#include "GamePadConf.h" #include "GamePadConf.h"
#include "main.h"
#include "input.h"
#include "config.h"
#include "keyscan.h"
#include "fceuWrapper.h"
//---------------------------------------------------- //----------------------------------------------------
GamePadConfDialog_t::GamePadConfDialog_t(QWidget *parent) GamePadConfDialog_t::GamePadConfDialog_t(QWidget *parent)
: QDialog( parent ) : QDialog( parent )
{ {
QHBoxLayout *hbox1, *hbox2; QHBoxLayout *hbox1;
QCheckBox *efs_chkbox; QGridLayout *grid;
QCheckBox *efs_chkbox, *udlr_chkbox;
QGroupBox *frame;
QPushButton *closebutton;
portNum = 0;
buttonConfigStatus = 1;
setWindowTitle("GamePad Config");
hbox1 = new QHBoxLayout(); hbox1 = new QHBoxLayout();
@ -16,25 +29,202 @@ GamePadConfDialog_t::GamePadConfDialog_t(QWidget *parent)
hbox1->addWidget( label ); hbox1->addWidget( label );
hbox1->addWidget( portSel ); hbox1->addWidget( portSel );
hbox2 = new QHBoxLayout(); portSel->addItem( tr("1"), 0 );
portSel->addItem( tr("2"), 1 );
portSel->addItem( tr("3"), 2 );
portSel->addItem( tr("4"), 3 );
efs_chkbox = new QCheckBox("Enable Four Score"); efs_chkbox = new QCheckBox("Enable Four Score");
hbox2->addWidget( efs_chkbox ); udlr_chkbox = new QCheckBox("Allow Up+Down/Left+Right");
frame = new QGroupBox(tr("Buttons:"));
grid = new QGridLayout();
grid-> setHorizontalSpacing(50);
//frame->setFrameStyle( QFrame::Box );
frame->setLayout( grid );
for (int i=0; i<10; i++)
{
char text[64];
const char *keyNameStr;
QLabel *buttonName;
sprintf( text, "%s:", GamePadNames[i] );
//hbox2 = new QHBoxLayout();
//hbox2->setAlignment(Qt::AlignCenter);
keyNameStr = ButtonName( &GamePadConfig[portNum][i], portNum );
buttonName = new QLabel(tr(text));
keyName[i] = new QLabel(tr(keyNameStr));
button[i] = new QPushButton(tr("Change"));
grid->addWidget( buttonName, i, 0, Qt::AlignCenter );
grid->addWidget( keyName[i], i, 1, Qt::AlignCenter );
grid->addWidget( button[i] , i, 2, Qt::AlignCenter );
}
closebutton = new QPushButton(tr("Close"));
connect(button[0], SIGNAL(clicked()), this, SLOT(changeButton0(void)) );
connect(button[1], SIGNAL(clicked()), this, SLOT(changeButton1(void)) );
connect(button[2], SIGNAL(clicked()), this, SLOT(changeButton2(void)) );
connect(button[3], SIGNAL(clicked()), this, SLOT(changeButton3(void)) );
connect(button[4], SIGNAL(clicked()), this, SLOT(changeButton4(void)) );
connect(button[5], SIGNAL(clicked()), this, SLOT(changeButton5(void)) );
connect(button[6], SIGNAL(clicked()), this, SLOT(changeButton6(void)) );
connect(button[7], SIGNAL(clicked()), this, SLOT(changeButton7(void)) );
connect(button[8], SIGNAL(clicked()), this, SLOT(changeButton8(void)) );
connect(button[9], SIGNAL(clicked()), this, SLOT(changeButton9(void)) );
connect(closebutton, SIGNAL(clicked()), this, SLOT(closeWindow(void)) );
QVBoxLayout *mainLayout = new QVBoxLayout(); QVBoxLayout *mainLayout = new QVBoxLayout();
mainLayout->addLayout( hbox1 ); mainLayout->addLayout( hbox1 );
mainLayout->addWidget( efs_chkbox ); mainLayout->addWidget( efs_chkbox );
//mainLayout->addLayout( hbox2 ); mainLayout->addWidget( udlr_chkbox );
mainLayout->addWidget( frame );
mainLayout->addWidget( closebutton, Qt::AlignRight );
setLayout( mainLayout ); setLayout( mainLayout );
show(); //show();
exec(); //exec();
} }
//---------------------------------------------------- //----------------------------------------------------
GamePadConfDialog_t::~GamePadConfDialog_t(void) GamePadConfDialog_t::~GamePadConfDialog_t(void)
{ {
buttonConfigStatus = 0;
}
void GamePadConfDialog_t::keyPressEvent(QKeyEvent *event)
{
//printf("Key Press: 0x%x \n", event->key() );
pushKeyEvent( event, 1 );
}
void GamePadConfDialog_t::keyReleaseEvent(QKeyEvent *event)
{
//printf("Key Release: 0x%x \n", event->key() );
pushKeyEvent( event, 0 );
}
//----------------------------------------------------
void GamePadConfDialog_t::changeButton(int padNo, int x)
{
int configNo = 0;
char buf[256];
std::string prefix;
const char *keyNameStr;
if ( buttonConfigStatus == 2 )
{
buttonConfigStatus = 0;
return;
}
buttonConfigStatus = 2;
ButtonConfigBegin ();
button[x]->setText("Waiting" );
snprintf (buf, sizeof(buf)-1, "SDL.Input.GamePad.%d.", padNo);
prefix = buf;
DWaitButton (NULL, &GamePadConfig[padNo][x], configNo, &buttonConfigStatus );
g_config->setOption (prefix + GamePadNames[x],
GamePadConfig[padNo][x].ButtonNum[configNo]);
if (GamePadConfig[padNo][x].ButtType[0] == BUTTC_KEYBOARD)
{
g_config->setOption (prefix + "DeviceType", "Keyboard");
}
else if (GamePadConfig[padNo][x].ButtType[0] == BUTTC_JOYSTICK)
{
g_config->setOption (prefix + "DeviceType", "Joystick");
}
else
{
g_config->setOption (prefix + "DeviceType", "Unknown");
}
g_config->setOption (prefix + "DeviceNum",
GamePadConfig[padNo][x].DeviceNum[configNo]);
keyNameStr = ButtonName( &GamePadConfig[padNo][x], padNo );
keyName[x]->setText( keyNameStr );
button[x]->setText("Change");
ButtonConfigEnd ();
buttonConfigStatus = 1;
}
//----------------------------------------------------
void GamePadConfDialog_t::closeEvent(QCloseEvent *event)
{
printf("GamePad Close Window Event\n");
buttonConfigStatus = 0;
done(0);
event->accept();
}
//----------------------------------------------------
void GamePadConfDialog_t::closeWindow(void)
{
printf("Close Window\n");
buttonConfigStatus = 0;
done(0);
}
//----------------------------------------------------
void GamePadConfDialog_t::changeButton0(void)
{
changeButton( portNum, 0 );
}
//----------------------------------------------------
void GamePadConfDialog_t::changeButton1(void)
{
changeButton( portNum, 1 );
}
//----------------------------------------------------
void GamePadConfDialog_t::changeButton2(void)
{
changeButton( portNum, 2 );
}
//----------------------------------------------------
void GamePadConfDialog_t::changeButton3(void)
{
changeButton( portNum, 3 );
}
//----------------------------------------------------
void GamePadConfDialog_t::changeButton4(void)
{
changeButton( portNum, 4 );
}
//----------------------------------------------------
void GamePadConfDialog_t::changeButton5(void)
{
changeButton( portNum, 5 );
}
//----------------------------------------------------
void GamePadConfDialog_t::changeButton6(void)
{
changeButton( portNum, 6 );
}
//----------------------------------------------------
void GamePadConfDialog_t::changeButton7(void)
{
changeButton( portNum, 7 );
}
//----------------------------------------------------
void GamePadConfDialog_t::changeButton8(void)
{
changeButton( portNum, 8 );
}
//----------------------------------------------------
void GamePadConfDialog_t::changeButton9(void)
{
changeButton( portNum, 9 );
} }
//---------------------------------------------------- //----------------------------------------------------

View File

@ -11,18 +11,42 @@
#include <QCheckBox> #include <QCheckBox>
#include <QPushButton> #include <QPushButton>
#include <QLabel> #include <QLabel>
#include <QFrame>
#include <QGroupBox>
class GamePadConfDialog_t : public QDialog class GamePadConfDialog_t : public QDialog
{ {
Q_OBJECT
public: public:
GamePadConfDialog_t(QWidget *parent = 0); GamePadConfDialog_t(QWidget *parent = 0);
~GamePadConfDialog_t(void); ~GamePadConfDialog_t(void);
protected: protected:
QComboBox *portSel; QComboBox *portSel;
QPushButton *button[10];
QLabel *keyName[10];
int portNum;
int buttonConfigStatus;
void changeButton( int port, int button );
void keyPressEvent(QKeyEvent *event);
void keyReleaseEvent(QKeyEvent *event);
void closeEvent(QCloseEvent *bar);
public slots:
void closeWindow(void);
private slots: private slots:
void changeButton0(void);
void changeButton1(void);
void changeButton2(void);
void changeButton3(void);
void changeButton4(void);
void changeButton5(void);
void changeButton6(void);
void changeButton7(void);
void changeButton8(void);
void changeButton9(void);
}; };

View File

@ -52,6 +52,7 @@ extern bool bindSavestate, frameAdvanceLagSkip, lagCounterDisplay;
static int UsrInputType[NUM_INPUT_DEVICES]; static int UsrInputType[NUM_INPUT_DEVICES];
static int CurInputType[NUM_INPUT_DEVICES]; static int CurInputType[NUM_INPUT_DEVICES];
static int cspec = 0; static int cspec = 0;
static int buttonConfigInProgress = 0;
extern int gametype; extern int gametype;
@ -963,7 +964,7 @@ UpdatePhysicalInput ()
} }
static int bcpv, bcpj; static int bcpv=0, bcpj=0;
/** /**
* Begin configuring the buttons by placing the video and joystick * Begin configuring the buttons by placing the video and joystick
@ -981,6 +982,8 @@ int ButtonConfigBegin ()
// initialize the joystick subsystem // initialize the joystick subsystem
InitJoysticks (); InitJoysticks ();
buttonConfigInProgress = 1;
return 1; return 1;
} }
@ -1004,6 +1007,7 @@ ButtonConfigEnd ()
{ {
InitJoysticks (); InitJoysticks ();
} }
buttonConfigInProgress = 0;
} }
/** /**
@ -1197,6 +1201,10 @@ void FCEUD_UpdateInput ()
int x; int x;
int t = 0; int t = 0;
if ( buttonConfigInProgress )
{
return;
}
UpdatePhysicalInput (); UpdatePhysicalInput ();
KeyboardCommands (); KeyboardCommands ();
@ -1622,6 +1630,7 @@ int DWaitButton (const uint8 * text, ButtConfig * bc, int wb, int *buttonConfigS
SDL_Event event; SDL_Event event;
static int32 LastAx[64][64]; static int32 LastAx[64][64];
int x, y; int x, y;
int timeout_ms = 10000;
if (text) if (text)
{ {
@ -1643,6 +1652,16 @@ int DWaitButton (const uint8 * text, ButtConfig * bc, int wb, int *buttonConfigS
while (1) while (1)
{ {
int done = 0; int done = 0;
usleep(10000);
timeout_ms -= 10;
if ( timeout_ms <= 0 )
{
break;
}
QCoreApplication::processEvents();
//#ifdef _GTK //#ifdef _GTK
// while (gtk_events_pending ()) // while (gtk_events_pending ())
// gtk_main_iteration_do (FALSE); // gtk_main_iteration_do (FALSE);
@ -1653,6 +1672,7 @@ int DWaitButton (const uint8 * text, ButtConfig * bc, int wb, int *buttonConfigS
switch (event.type) switch (event.type)
{ {
case SDL_KEYDOWN: case SDL_KEYDOWN:
//printf("SDL KeyDown:%i \n", event.key.keysym.sym );
bc->ButtType[wb] = BUTTC_KEYBOARD; bc->ButtType[wb] = BUTTC_KEYBOARD;
bc->DeviceNum[wb] = 0; bc->DeviceNum[wb] = 0;
bc->ButtonNum[wb] = event.key.keysym.sym; bc->ButtonNum[wb] = event.key.keysym.sym;