Gui controller calibration fixes and enhancements.

This commit is contained in:
Matthew Budd 2020-06-27 21:08:02 -04:00
parent 7ba7ef4b82
commit 59462545ca
5 changed files with 203 additions and 33 deletions

View File

@ -11,11 +11,14 @@
GamePadConfDialog_t::GamePadConfDialog_t(QWidget *parent)
: QDialog( parent )
{
QHBoxLayout *hbox1;
QHBoxLayout *hbox1, *hbox2;
QGridLayout *grid;
QCheckBox *efs_chkbox, *udlr_chkbox;
QGroupBox *frame;
QPushButton *loadDefaultButton;
QPushButton *clearAllButton;
QPushButton *closebutton;
QPushButton *clearButton[GAMEPAD_NUM_BUTTONS];
portNum = 0;
configNo = 0;
@ -24,6 +27,7 @@ GamePadConfDialog_t::GamePadConfDialog_t(QWidget *parent)
setWindowTitle("GamePad Config");
hbox1 = new QHBoxLayout();
hbox2 = new QHBoxLayout();
QLabel *label = new QLabel(tr("Port:"));
portSel = new QComboBox();
@ -54,7 +58,7 @@ GamePadConfDialog_t::GamePadConfDialog_t(QWidget *parent)
//frame->setFrameStyle( QFrame::Box );
frame->setLayout( grid );
for (int i=0; i<10; i++)
for (int i=0; i<GAMEPAD_NUM_BUTTONS; i++)
{
char text[64];
QLabel *buttonName;
@ -65,17 +69,25 @@ GamePadConfDialog_t::GamePadConfDialog_t(QWidget *parent)
//hbox2->setAlignment(Qt::AlignCenter);
buttonName = new QLabel(tr(text));
keyName[i] = new QLabel();
button[i] = new GamePadConfigButton_t(i);
buttonName = new QLabel(tr(text));
keyName[i] = new QLabel();
button[i] = new GamePadConfigButton_t(i);
clearButton[i] = new QPushButton("Clear");
grid->addWidget( buttonName, i, 0, Qt::AlignCenter );
grid->addWidget( keyName[i], i, 1, Qt::AlignCenter );
grid->addWidget( button[i] , i, 2, Qt::AlignCenter );
grid->addWidget( buttonName , i, 0, Qt::AlignCenter );
grid->addWidget( keyName[i] , i, 1, Qt::AlignCenter );
grid->addWidget( button[i] , i, 2, Qt::AlignCenter );
grid->addWidget( clearButton[i], i, 3, Qt::AlignCenter );
}
updateCntrlrDpy();
closebutton = new QPushButton(tr("Close"));
loadDefaultButton = new QPushButton(tr("Load Defaults"));
clearAllButton = new QPushButton(tr("Clear All"));
closebutton = new QPushButton(tr("Close"));
hbox2->addWidget( loadDefaultButton );
hbox2->addWidget( clearAllButton );
hbox2->addWidget( closebutton );
connect(button[0], SIGNAL(clicked()), this, SLOT(changeButton0(void)) );
connect(button[1], SIGNAL(clicked()), this, SLOT(changeButton1(void)) );
@ -87,7 +99,21 @@ GamePadConfDialog_t::GamePadConfDialog_t(QWidget *parent)
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)) );
connect(clearButton[0], SIGNAL(clicked()), this, SLOT(clearButton0(void)) );
connect(clearButton[1], SIGNAL(clicked()), this, SLOT(clearButton1(void)) );
connect(clearButton[2], SIGNAL(clicked()), this, SLOT(clearButton2(void)) );
connect(clearButton[3], SIGNAL(clicked()), this, SLOT(clearButton3(void)) );
connect(clearButton[4], SIGNAL(clicked()), this, SLOT(clearButton4(void)) );
connect(clearButton[5], SIGNAL(clicked()), this, SLOT(clearButton5(void)) );
connect(clearButton[6], SIGNAL(clicked()), this, SLOT(clearButton6(void)) );
connect(clearButton[7], SIGNAL(clicked()), this, SLOT(clearButton7(void)) );
connect(clearButton[8], SIGNAL(clicked()), this, SLOT(clearButton8(void)) );
connect(clearButton[9], SIGNAL(clicked()), this, SLOT(clearButton9(void)) );
connect(loadDefaultButton, SIGNAL(clicked()), this, SLOT(loadDefaults(void)) );
connect(clearAllButton , SIGNAL(clicked()), this, SLOT(clearAllCallback(void)) );
connect(closebutton , SIGNAL(clicked()), this, SLOT(closeWindow(void)) );
connect(portSel , SIGNAL(activated(int)), this, SLOT(controllerSelect(int)) );
connect(efs_chkbox , SIGNAL(stateChanged(int)), this, SLOT(ena4score(int)) );
@ -99,7 +125,7 @@ GamePadConfDialog_t::GamePadConfDialog_t(QWidget *parent)
mainLayout->addWidget( efs_chkbox );
mainLayout->addWidget( udlr_chkbox );
mainLayout->addWidget( frame );
mainLayout->addWidget( closebutton, Qt::AlignRight );
mainLayout->addLayout( hbox2 );
setLayout( mainLayout );
@ -126,7 +152,7 @@ void GamePadConfDialog_t::updateCntrlrDpy(void)
{
char keyNameStr[128];
for (int i=0; i<10; i++)
for (int i=0; i<GAMEPAD_NUM_BUTTONS; i++)
{
if (GamePadConfig[portNum][i].ButtType[configNo] == BUTTC_KEYBOARD)
{
@ -143,7 +169,7 @@ void GamePadConfDialog_t::updateCntrlrDpy(void)
//----------------------------------------------------
void GamePadConfDialog_t::controllerSelect(int index)
{
printf("Port Number:%i \n", index);
//printf("Port Number:%i \n", index);
portNum = index;
updateCntrlrDpy();
}
@ -186,11 +212,11 @@ void GamePadConfDialog_t::changeButton(int padNo, int x)
g_config->setOption (prefix + GamePadNames[x],
GamePadConfig[padNo][x].ButtonNum[configNo]);
if (GamePadConfig[padNo][x].ButtType[0] == BUTTC_KEYBOARD)
if (GamePadConfig[padNo][x].ButtType[configNo] == BUTTC_KEYBOARD)
{
g_config->setOption (prefix + "DeviceType", "Keyboard");
}
else if (GamePadConfig[padNo][x].ButtType[0] == BUTTC_JOYSTICK)
else if (GamePadConfig[padNo][x].ButtType[configNo] == BUTTC_JOYSTICK)
{
g_config->setOption (prefix + "DeviceType", "Joystick");
}
@ -211,6 +237,23 @@ void GamePadConfDialog_t::changeButton(int padNo, int x)
buttonConfigStatus = 1;
}
//----------------------------------------------------
void GamePadConfDialog_t::clearButton( int padNo, int x )
{
char buf[256];
std::string prefix;
GamePadConfig[padNo][x].ButtonNum[configNo] = -1;
keyName[x]->setText("");
snprintf (buf, sizeof(buf)-1, "SDL.Input.GamePad.%d.", padNo);
prefix = buf;
g_config->setOption (prefix + GamePadNames[x],
GamePadConfig[padNo][x].ButtonNum[configNo]);
}
//----------------------------------------------------
void GamePadConfDialog_t::closeEvent(QCloseEvent *event)
{
//printf("GamePad Close Window Event\n");
@ -276,6 +319,106 @@ void GamePadConfDialog_t::changeButton9(void)
changeButton( portNum, 9 );
}
//----------------------------------------------------
void GamePadConfDialog_t::clearButton0(void)
{
clearButton( portNum, 0 );
}
//----------------------------------------------------
void GamePadConfDialog_t::clearButton1(void)
{
clearButton( portNum, 1 );
}
//----------------------------------------------------
void GamePadConfDialog_t::clearButton2(void)
{
clearButton( portNum, 2 );
}
//----------------------------------------------------
void GamePadConfDialog_t::clearButton3(void)
{
clearButton( portNum, 3 );
}
//----------------------------------------------------
void GamePadConfDialog_t::clearButton4(void)
{
clearButton( portNum, 4 );
}
//----------------------------------------------------
void GamePadConfDialog_t::clearButton5(void)
{
clearButton( portNum, 5 );
}
//----------------------------------------------------
void GamePadConfDialog_t::clearButton6(void)
{
clearButton( portNum, 6 );
}
//----------------------------------------------------
void GamePadConfDialog_t::clearButton7(void)
{
clearButton( portNum, 7 );
}
//----------------------------------------------------
void GamePadConfDialog_t::clearButton8(void)
{
clearButton( portNum, 8 );
}
//----------------------------------------------------
void GamePadConfDialog_t::clearButton9(void)
{
clearButton( portNum, 9 );
}
//----------------------------------------------------
void GamePadConfDialog_t::clearAllCallback(void)
{
for (int i=0; i<GAMEPAD_NUM_BUTTONS; i++)
{
clearButton( portNum, i );
}
}
//----------------------------------------------------
void GamePadConfDialog_t::loadDefaults(void)
{
char buf[256];
std::string prefix;
if ( portNum > 0 )
{
clearAllCallback();
return;
}
snprintf (buf, sizeof(buf)-1, "SDL.Input.GamePad.%d.", portNum);
prefix = buf;
for (int x=0; x<GAMEPAD_NUM_BUTTONS; x++)
{
GamePadConfig[portNum][x].ButtType[configNo] = BUTTC_KEYBOARD;
GamePadConfig[portNum][x].DeviceNum[configNo] = 0;
GamePadConfig[portNum][x].ButtonNum[configNo] = DefaultGamePad[portNum][x];
GamePadConfig[portNum][x].NumC = 1;
g_config->setOption (prefix + GamePadNames[x],
GamePadConfig[portNum][x].ButtonNum[configNo]);
if (GamePadConfig[portNum][x].ButtType[configNo] == BUTTC_KEYBOARD)
{
g_config->setOption (prefix + "DeviceType", "Keyboard");
}
else if (GamePadConfig[portNum][x].ButtType[configNo] == BUTTC_JOYSTICK)
{
g_config->setOption (prefix + "DeviceType", "Joystick");
}
else
{
g_config->setOption (prefix + "DeviceType", "Unknown");
}
g_config->setOption (prefix + "DeviceNum",
GamePadConfig[portNum][x].DeviceNum[configNo]);
}
updateCntrlrDpy();
}
//----------------------------------------------------
GamePadConfigButton_t::GamePadConfigButton_t(int i)
{
idx = i;

View File

@ -14,6 +14,8 @@
#include <QFrame>
#include <QGroupBox>
#include "Qt/main.h"
class GamePadConfigButton_t : public QPushButton
{
public:
@ -36,14 +38,15 @@ class GamePadConfDialog_t : public QDialog
protected:
QComboBox *portSel;
QLabel *keyName[10];
GamePadConfigButton_t *button[10];
QLabel *keyName[GAMEPAD_NUM_BUTTONS];
GamePadConfigButton_t *button[GAMEPAD_NUM_BUTTONS];
int portNum;
int configNo;
int buttonConfigStatus;
void changeButton( int port, int button );
void clearButton( int port, int button );
void keyPressEvent(QKeyEvent *event);
void keyReleaseEvent(QKeyEvent *event);
void closeEvent(QCloseEvent *bar);
@ -63,6 +66,18 @@ class GamePadConfDialog_t : public QDialog
void changeButton7(void);
void changeButton8(void);
void changeButton9(void);
void clearButton0(void);
void clearButton1(void);
void clearButton2(void);
void clearButton3(void);
void clearButton4(void);
void clearButton5(void);
void clearButton6(void);
void clearButton7(void);
void clearButton8(void);
void clearButton9(void);
void clearAllCallback(void);
void loadDefaults(void);
void ena4score(int state);
void oppDirEna(int state);
void controllerSelect(int index);

View File

@ -1041,10 +1041,11 @@ DTestButton (ButtConfig * bc)
#define MK(x) {{BUTTC_KEYBOARD},{0},{MKK(x)},1}
#define MK2(x1,x2) {{BUTTC_KEYBOARD},{0},{MKK(x1),MKK(x2)},2}
#define MKZ() {{0},{0},{0},0}
#define MKZ() {{0},{0},{-1},0}
#define GPZ() {MKZ(), MKZ(), MKZ(), MKZ()}
ButtConfig GamePadConfig[4][10] = {
ButtConfig GamePadConfig[ GAMEPAD_NUM_DEVICES ][ GAMEPAD_NUM_BUTTONS ] =
{
/* Gamepad 1 */
{MK (KP_3), MK (KP_2), MK (SLASH), MK (ENTER),
MK (w), MK (z), MK (a), MK (s), MKZ (), MKZ ()},
@ -1568,6 +1569,10 @@ const char * ButtonName (const ButtConfig * bc, int which)
name[0] = 0;
if (bc->ButtonNum[which] == -1)
{
return name;
}
switch (bc->ButtType[which])
{
case BUTTC_KEYBOARD:
@ -2286,10 +2291,10 @@ const char *DefaultGamePadDevice[GAMEPAD_NUM_DEVICES] =
{ "Keyboard", "None", "None", "None" };
const int DefaultGamePad[GAMEPAD_NUM_DEVICES][GAMEPAD_NUM_BUTTONS] =
{ {SDLK_f, SDLK_d, SDLK_s, SDLK_RETURN,
SDLK_UP, SDLK_DOWN, SDLK_LEFT, SDLK_RIGHT, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
SDLK_UP, SDLK_DOWN, SDLK_LEFT, SDLK_RIGHT, -1, -1},
{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1}
};
// PowerPad defaults

View File

@ -4,14 +4,20 @@
#include "common/configSys.h"
#define MAXBUTTCONFIG 4
typedef struct {
uint8 ButtType[MAXBUTTCONFIG];
uint8 DeviceNum[MAXBUTTCONFIG];
//uint16 ButtonNum[MAXBUTTCONFIG];
enum {
BUTTC_KEYBOARD = 0,
BUTTC_JOYSTICK = 1,
BUTTC_MOUSE = 2
};
struct ButtConfig
{
int ButtType[MAXBUTTCONFIG];
int DeviceNum[MAXBUTTCONFIG];
int ButtonNum[MAXBUTTCONFIG];
uint32 NumC;
//uint64 DeviceID[MAXBUTTCONFIG]; /* TODO */
} ButtConfig;
};
extern int NoWaiting;
@ -26,9 +32,6 @@ void ButtonConfigEnd();
void ConfigButton(char *text, ButtConfig *bc);
int DWaitButton(const uint8 *text, ButtConfig *bc, int wb, int *buttonConfigStatus = NULL);
#define BUTTC_KEYBOARD 0x00
#define BUTTC_JOYSTICK 0x01
#define BUTTC_MOUSE 0x02
#define FCFGD_GAMEPAD 1
#define FCFGD_POWERPAD 2

View File

@ -45,7 +45,11 @@ DTestButtonJoy(ButtConfig *bc)
for(x = 0; x < bc->NumC; x++)
{
if(bc->ButtonNum[x] & 0x2000)
if (bc->ButtonNum[x] == -1)
{
continue;
}
if (bc->ButtonNum[x] & 0x2000)
{
/* Hat "button" */
if(SDL_JoystickGetHat(s_Joysticks[bc->DeviceNum[x]],
@ -53,7 +57,7 @@ DTestButtonJoy(ButtConfig *bc)
(bc->ButtonNum[x]&0xFF))
return 1;
}
else if(bc->ButtonNum[x] & 0x8000)
else if (bc->ButtonNum[x] & 0x8000)
{
/* Axis "button" */
int pos;