split X and Y center of paddles

add definition of paddles centers via game properties
This commit is contained in:
thrust26 2020-03-25 19:28:39 +01:00
parent 48f87ffa54
commit 6741cb4ef9
13 changed files with 3678 additions and 3608 deletions

View File

@ -924,7 +924,8 @@ unique_ptr<Controller> Console::getControllerPort(const Controller::Type type,
else if(type == Controller::Type::PaddlesIAxDr) else if(type == Controller::Type::PaddlesIAxDr)
swapAxis = swapDir = true; swapAxis = swapDir = true;
Paddles::setAnalogCenter(myOSystem.settings().getInt("pcenter")); Paddles::setAnalogXCenter(BSPF::stringToInt(myProperties.get(PropType::Controller_PaddlesXCenter)));
Paddles::setAnalogYCenter(BSPF::stringToInt(myProperties.get(PropType::Controller_PaddlesYCenter)));
Paddles::setAnalogSensitivity(myOSystem.settings().getInt("psense")); Paddles::setAnalogSensitivity(myOSystem.settings().getInt("psense"));
controller = make_unique<Paddles>(port, myEvent, *mySystem, controller = make_unique<Paddles>(port, myEvent, *mySystem,

File diff suppressed because it is too large Load Diff

View File

@ -600,6 +600,8 @@ unique_ptr<Console> OSystem::openConsole(const FilesystemNode& romfile, string&
CMDLINE_PROPS_UPDATE("vcenter", PropType::Display_VCenter); CMDLINE_PROPS_UPDATE("vcenter", PropType::Display_VCenter);
CMDLINE_PROPS_UPDATE("pp", PropType::Display_Phosphor); CMDLINE_PROPS_UPDATE("pp", PropType::Display_Phosphor);
CMDLINE_PROPS_UPDATE("ppblend", PropType::Display_PPBlend); CMDLINE_PROPS_UPDATE("ppblend", PropType::Display_PPBlend);
CMDLINE_PROPS_UPDATE("pxcenter", PropType::Controller_PaddlesXCenter);
CMDLINE_PROPS_UPDATE("pycenter", PropType::Controller_PaddlesYCenter);
// Finally, create the cart with the correct properties // Finally, create the cart with the correct properties
if(cart) if(cart)

View File

@ -238,7 +238,7 @@ void Paddles::update()
sa_xaxis = new_val; sa_xaxis = new_val;
setPin(AnalogPin::Nine, Int32(MAX_RESISTANCE * setPin(AnalogPin::Nine, Int32(MAX_RESISTANCE *
(BSPF::clamp(32768 - Int32(Int32(sa_xaxis) * SENSITIVITY + CENTER), 0, 65536) / 65536.0))); (BSPF::clamp(32768 - Int32(Int32(sa_xaxis) * SENSITIVITY + XCENTER), 0, 65536) / 65536.0)));
sa_changed = true; sa_changed = true;
} }
@ -253,7 +253,7 @@ void Paddles::update()
sa_yaxis = new_val; sa_yaxis = new_val;
setPin(AnalogPin::Five, Int32(MAX_RESISTANCE * setPin(AnalogPin::Five, Int32(MAX_RESISTANCE *
(BSPF::clamp(32768 - Int32(Int32(sa_yaxis) * SENSITIVITY + CENTER), 0, 65536) / 65536.0))); (BSPF::clamp(32768 - Int32(Int32(sa_yaxis) * SENSITIVITY + YCENTER), 0, 65536) / 65536.0)));
sa_changed = true; sa_changed = true;
} }
myLastAxisX = sa_xaxis; myLastAxisX = sa_xaxis;
@ -383,10 +383,17 @@ bool Paddles::setMouseControl(
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void Paddles::setAnalogCenter(int center) void Paddles::setAnalogXCenter(int xcenter)
{ {
// TODO: convert into ~5 pixel (also in Input Dialog!) // convert into ~5 pixel steps
CENTER = BSPF::clamp(center, MIN_ANALOG_CENTER, MAX_ANALOG_CENTER) * 860; XCENTER = BSPF::clamp(xcenter, MIN_ANALOG_CENTER, MAX_ANALOG_CENTER) * 860;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void Paddles::setAnalogYCenter(int ycenter)
{
// convert into ~5 pixel steps
YCENTER = BSPF::clamp(ycenter, MIN_ANALOG_CENTER, MAX_ANALOG_CENTER) * 860;
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@ -431,7 +438,8 @@ void Paddles::setDigitalPaddleRange(int range)
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
int Paddles::CENTER = 0; int Paddles::XCENTER = 0;
int Paddles::YCENTER = 0;
float Paddles::SENSITIVITY = 1.0; float Paddles::SENSITIVITY = 1.0;
int Paddles::TRIGRANGE = Paddles::TRIGMAX; int Paddles::TRIGRANGE = Paddles::TRIGMAX;

View File

@ -50,8 +50,8 @@ class Paddles : public Controller
public: public:
static constexpr float BASE_ANALOG_SENSE = 0.148643628f; static constexpr float BASE_ANALOG_SENSE = 0.148643628f;
static constexpr int MAX_ANALOG_SENSE = 30; static constexpr int MAX_ANALOG_SENSE = 30;
static constexpr int MIN_ANALOG_CENTER = -20; static constexpr int MIN_ANALOG_CENTER = -10;
static constexpr int MAX_ANALOG_CENTER = 20; static constexpr int MAX_ANALOG_CENTER = 30;
static constexpr int MAX_DIGITAL_SENSE = 20; static constexpr int MAX_DIGITAL_SENSE = 20;
static constexpr int MAX_MOUSE_SENSE = 20; static constexpr int MAX_MOUSE_SENSE = 20;
static constexpr int MIN_DEJITTER = 0; static constexpr int MIN_DEJITTER = 0;
@ -93,11 +93,18 @@ class Paddles : public Controller
Controller::Type ytype, int yid) override; Controller::Type ytype, int yid) override;
/** /**
Sets the center for analog paddles. Sets the x-center for analog paddles.
@param center Value from -20 to 20, representing the center offset/860 @param center Value from -10 to 30, representing the center offset/860
*/ */
static void setAnalogCenter(int center); static void setAnalogXCenter(int xcenter);
/**
Sets the y-center for analog paddles.
@param center Value from -10 to 30, representing the center offset/860
*/
static void setAnalogYCenter(int ycenter);
/** /**
Sets the sensitivity for analog paddles. Sets the sensitivity for analog paddles.
@ -175,7 +182,8 @@ class Paddles : public Controller
int myLastAxisX{0}, myLastAxisY{0}; int myLastAxisX{0}, myLastAxisY{0};
int myAxisDigitalZero{0}, myAxisDigitalOne{0}; int myAxisDigitalZero{0}, myAxisDigitalOne{0};
static int CENTER; static int XCENTER;
static int YCENTER;
static float SENSITIVITY; static float SENSITIVITY;
static int DIGITAL_SENSITIVITY, DIGITAL_DISTANCE; static int DIGITAL_SENSITIVITY, DIGITAL_DISTANCE;

View File

@ -251,6 +251,8 @@ void Properties::print() const
<< get(PropType::Controller_Left) << "|" << get(PropType::Controller_Left) << "|"
<< get(PropType::Controller_Right) << "|" << get(PropType::Controller_Right) << "|"
<< get(PropType::Controller_SwapPaddles) << "|" << get(PropType::Controller_SwapPaddles) << "|"
<< get(PropType::Controller_PaddlesXCenter) << "|"
<< get(PropType::Controller_PaddlesYCenter) << "|"
<< get(PropType::Controller_MouseAxis) << "|" << get(PropType::Controller_MouseAxis) << "|"
<< get(PropType::Display_Format) << "|" << get(PropType::Display_Format) << "|"
<< get(PropType::Display_VCenter) << "|" << get(PropType::Display_VCenter) << "|"
@ -296,6 +298,8 @@ void Properties::printHeader()
<< "Controller_Left|" << "Controller_Left|"
<< "Controller_Right|" << "Controller_Right|"
<< "Controller_SwapPaddles|" << "Controller_SwapPaddles|"
<< "Controller_PaddlesXCenter|"
<< "Controller_PaddlesYCenter|"
<< "Controller_MouseAxis|" << "Controller_MouseAxis|"
<< "Display_Format|" << "Display_Format|"
<< "Display_VCenter|" << "Display_VCenter|"
@ -323,6 +327,8 @@ std::array<string, Properties::NUM_PROPS> Properties::ourDefaultProperties =
"AUTO", // Controller.Left "AUTO", // Controller.Left
"AUTO", // Controller.Right "AUTO", // Controller.Right
"NO", // Controller.SwapPaddles "NO", // Controller.SwapPaddles
"0", // Controller.PaddlesXCenter
"0", // Controller.PaddlesYCenter
"AUTO", // Controller.MouseAxis "AUTO", // Controller.MouseAxis
"AUTO", // Display.Format "AUTO", // Display.Format
"0", // Display.VCenter "0", // Display.VCenter
@ -349,6 +355,8 @@ std::array<string, Properties::NUM_PROPS> Properties::ourPropertyNames =
"Controller.Left", "Controller.Left",
"Controller.Right", "Controller.Right",
"Controller.SwapPaddles", "Controller.SwapPaddles",
"Controller.PaddlesXCenter",
"Controller.PaddlesYCenter",
"Controller.MouseAxis", "Controller.MouseAxis",
"Display.Format", "Display.Format",
"Display.VCenter", "Display.VCenter",

View File

@ -37,6 +37,8 @@ enum class PropType : uInt8 {
Controller_Left, Controller_Left,
Controller_Right, Controller_Right,
Controller_SwapPaddles, Controller_SwapPaddles,
Controller_PaddlesXCenter,
Controller_PaddlesYCenter,
Controller_MouseAxis, Controller_MouseAxis,
Display_Format, Display_Format,
Display_VCenter, Display_VCenter,

View File

@ -103,7 +103,6 @@ Settings::Settings()
setPermanent("dejitter.base", "0"); setPermanent("dejitter.base", "0");
setPermanent("dejitter.diff", "0"); setPermanent("dejitter.diff", "0");
setPermanent("dsense", "10"); setPermanent("dsense", "10");
setPermanent("pcenter", "0");
setPermanent("psense", "20"); setPermanent("psense", "20");
setPermanent("msense", "10"); setPermanent("msense", "10");
setPermanent("tsense", "10"); setPermanent("tsense", "10");
@ -324,10 +323,6 @@ void Settings::validate()
if(i < 0 || i > 3) if(i < 0 || i > 3)
setValue("cursor", "2"); setValue("cursor", "2");
i = getInt("pcenter");
if(i < Paddles::MIN_ANALOG_CENTER || i > Paddles::MAX_ANALOG_CENTER)
setValue("pcenter", "0");
i = getInt("psense"); i = getInt("psense");
if(i < 0|| i > Paddles::MAX_ANALOG_SENSE) if(i < 0|| i > Paddles::MAX_ANALOG_SENSE)
setValue("psense", "20"); setValue("psense", "20");
@ -458,7 +453,6 @@ void Settings::usage() const
<< " -cursor <0,1,2,3> Set cursor state in UI/emulation modes\n" << " -cursor <0,1,2,3> Set cursor state in UI/emulation modes\n"
<< " -dejitter.base <0-10> Strength of analog paddle value averaging\n" << " -dejitter.base <0-10> Strength of analog paddle value averaging\n"
<< " -dejitter.diff <0-10> Strength of analog paddle reaction to fast movements\n" << " -dejitter.diff <0-10> Strength of analog paddle reaction to fast movements\n"
<< " -pcenter <-20-20> Center of analog paddle\n"
<< " -psense <0-30> Sensitivity of analog paddle movement\n" << " -psense <0-30> Sensitivity of analog paddle movement\n"
<< " -dsense <1-20> Sensitivity of digital emulated paddle movement\n" << " -dsense <1-20> Sensitivity of digital emulated paddle movement\n"
<< " -msense <1-20> Sensitivity of mouse emulated paddle movement\n" << " -msense <1-20> Sensitivity of mouse emulated paddle movement\n"
@ -568,6 +562,8 @@ void Settings::usage() const
<< " -rc <arg> Sets the 'Controller.Right' property\n" << " -rc <arg> Sets the 'Controller.Right' property\n"
<< " -bc <arg> Same as using both -lc and -rc\n" << " -bc <arg> Same as using both -lc and -rc\n"
<< " -cp <arg> Sets the 'Controller.SwapPaddles' property\n" << " -cp <arg> Sets the 'Controller.SwapPaddles' property\n"
<< " -pxcenter <arg> Sets the 'Controller.PaddlesXCenter' property\n"
<< " -pycenter <arg> Sets the 'Controller.PaddlesYCenter' property\n"
<< " -format <arg> Sets the 'Display.Format' property\n" << " -format <arg> Sets the 'Display.Format' property\n"
<< " -vcenter <arg> Sets the 'Display.vcenter' property\n" << " -vcenter <arg> Sets the 'Display.vcenter' property\n"
<< " -pp <arg> Sets the 'Display.Phosphor' property\n" << " -pp <arg> Sets the 'Display.Phosphor' property\n"

View File

@ -27,6 +27,7 @@
#include "OSystem.hxx" #include "OSystem.hxx"
#include "CartDetector.hxx" #include "CartDetector.hxx"
#include "ControllerDetector.hxx" #include "ControllerDetector.hxx"
#include "Paddles.hxx"
#include "PopUpWidget.hxx" #include "PopUpWidget.hxx"
#include "Props.hxx" #include "Props.hxx"
#include "PropsSet.hxx" #include "PropsSet.hxx"
@ -66,7 +67,7 @@ GameInfoDialog::GameInfoDialog(
StaticTextWidget* t; StaticTextWidget* t;
// Set real dimensions // Set real dimensions
setSize(53 * fontWidth + 8, setSize(55 * fontWidth + 8,
8 * (lineHeight + VGAP) + 1 * (infoLineHeight + VGAP) + VBORDER * 2 + _th + 8 * (lineHeight + VGAP) + 1 * (infoLineHeight + VGAP) + VBORDER * 2 + _th +
buttonHeight + fontHeight + ifont.getLineHeight() + 20, buttonHeight + fontHeight + ifont.getLineHeight() + 20,
max_w, max_h); max_w, max_h);
@ -118,12 +119,13 @@ GameInfoDialog::GameInfoDialog(
pwidth, lineHeight, items, "", 0, 0); pwidth, lineHeight, items, "", 0, 0);
wid.push_back(myFormat); wid.push_back(myFormat);
myFormatDetected = new StaticTextWidget(myTab, ifont, myFormat->getRight() + 8, ypos + 4, "SECAM60 detected"); myFormatDetected = new StaticTextWidget(myTab, ifont, myFormat->getRight() + 8, ypos + 4,
"SECAM60 detected");
// Phosphor // Phosphor
ypos += lineHeight + VGAP; ypos += lineHeight + VGAP;
myPhosphor = new CheckboxWidget(myTab, font, HBORDER, ypos + 1, "Phosphor (enabled for all ROMs)", kPhosphorChanged); myPhosphor = new CheckboxWidget(myTab, font, HBORDER, ypos + 1,
"Phosphor (enabled for all ROMs)", kPhosphorChanged);
wid.push_back(myPhosphor); wid.push_back(myPhosphor);
ypos += lineHeight + VGAP * 0; ypos += lineHeight + VGAP * 0;
@ -261,10 +263,35 @@ GameInfoDialog::GameInfoDialog(
pwidth, buttonHeight, "Erase EEPROM", kEEButtonPressed); pwidth, buttonHeight, "Erase EEPROM", kEEButtonPressed);
wid.push_back(myEraseEEPROMButton); wid.push_back(myEraseEEPROMButton);
myEraseEEPROMInfo = new StaticTextWidget(myTab, ifont, myEraseEEPROMButton->getRight() + 4, myEraseEEPROMInfo = new StaticTextWidget(myTab, ifont, myEraseEEPROMButton->getRight() + 4,
myEraseEEPROMLabel->getTop() + 3, "(for this game only)"); myEraseEEPROMLabel->getTop() + 3,
"(for this game only)");
ypos += lineHeight + VGAP * 4; ypos += lineHeight + VGAP * 4;
myMouseControl = new CheckboxWidget(myTab, font, xpos, ypos + 1, "Specific mouse axes", kMCtrlChanged);
// Paddles
myPaddlesCenter = new StaticTextWidget(myTab, font, xpos, ypos, "Paddles center:");
ypos += lineHeight + VGAP;
xpos += 20;
myPaddleXCenter = new SliderWidget(myTab, font, xpos, ypos - 1, "X ", 0, kPXCenterChanged,
fontWidth * 6, "px", 0 ,true);
myPaddleXCenter->setMinValue(Paddles::MIN_ANALOG_CENTER);
myPaddleXCenter->setMaxValue(Paddles::MAX_ANALOG_CENTER);
myPaddleXCenter->setTickmarkIntervals(4);
wid.push_back(myPaddleXCenter);
ypos += lineHeight + VGAP;
myPaddleYCenter = new SliderWidget(myTab, font, xpos, ypos - 1, "Y ", 0, kPYCenterChanged,
fontWidth * 6, "px", 0 ,true);
myPaddleYCenter->setMinValue(Paddles::MIN_ANALOG_CENTER);
myPaddleYCenter->setMaxValue(Paddles::MAX_ANALOG_CENTER);
myPaddleYCenter->setTickmarkIntervals(4);
wid.push_back(myPaddleYCenter);
// Mouse
xpos = HBORDER + fontWidth * 24 - 20;
ypos = myPaddlesCenter->getTop();
myMouseControl = new CheckboxWidget(myTab, font, xpos, ypos + 1, "Specific mouse axes",
kMCtrlChanged);
wid.push_back(myMouseControl); wid.push_back(myMouseControl);
// Mouse controller specific axis // Mouse controller specific axis
@ -291,8 +318,8 @@ GameInfoDialog::GameInfoDialog(
"Y-Axis is "); "Y-Axis is ");
wid.push_back(myMouseY); wid.push_back(myMouseY);
xpos = HBORDER; ypos += lineHeight + VGAP; xpos -= 20; ypos += lineHeight + VGAP;
myMouseRange = new SliderWidget(myTab, font, HBORDER, ypos, myMouseRange = new SliderWidget(myTab, font, xpos, ypos,
"Mouse axes range ", 0, 0, fontWidth * 4, "%"); "Mouse axes range ", 0, 0, fontWidth * 4, "%");
myMouseRange->setMinValue(1); myMouseRange->setMaxValue(100); myMouseRange->setMinValue(1); myMouseRange->setMaxValue(100);
myMouseRange->setTickmarkIntervals(4); myMouseRange->setTickmarkIntervals(4);
@ -492,6 +519,10 @@ void GameInfoDialog::loadControllerProperties(const Properties& props)
mySwapPorts->setState(props.get(PropType::Console_SwapPorts) == "YES"); mySwapPorts->setState(props.get(PropType::Console_SwapPorts) == "YES");
mySwapPaddles->setState(props.get(PropType::Controller_SwapPaddles) == "YES"); mySwapPaddles->setState(props.get(PropType::Controller_SwapPaddles) == "YES");
// Paddle centers
myPaddleXCenter->setValue(BSPF::stringToInt(props.get(PropType::Controller_PaddlesXCenter)));
myPaddleYCenter->setValue(BSPF::stringToInt(props.get(PropType::Controller_PaddlesYCenter)));
// MouseAxis property (potentially contains 'range' information) // MouseAxis property (potentially contains 'range' information)
istringstream m_axis(props.get(PropType::Controller_MouseAxis)); istringstream m_axis(props.get(PropType::Controller_MouseAxis));
string m_control, m_range; string m_control, m_range;
@ -557,7 +588,11 @@ void GameInfoDialog::saveConfig()
myGameProperties.set(PropType::Controller_Left, myLeftPort->getSelectedTag().toString()); myGameProperties.set(PropType::Controller_Left, myLeftPort->getSelectedTag().toString());
myGameProperties.set(PropType::Controller_Right, myRightPort->getSelectedTag().toString()); myGameProperties.set(PropType::Controller_Right, myRightPort->getSelectedTag().toString());
myGameProperties.set(PropType::Console_SwapPorts, (mySwapPorts->isEnabled() && mySwapPorts->getState()) ? "YES" : "NO"); myGameProperties.set(PropType::Console_SwapPorts, (mySwapPorts->isEnabled() && mySwapPorts->getState()) ? "YES" : "NO");
myGameProperties.set(PropType::Controller_SwapPaddles, (/*mySwapPaddles->isEnabled() &&*/ mySwapPaddles->getState()) ? "YES" : "NO"); myGameProperties.set(PropType::Controller_SwapPaddles, mySwapPaddles->getState() ? "YES" : "NO");
// Paddle center
myGameProperties.set(PropType::Controller_PaddlesXCenter, std::to_string(myPaddleXCenter->getValue()));
myGameProperties.set(PropType::Controller_PaddlesYCenter, std::to_string(myPaddleYCenter->getValue()));
// MouseAxis property (potentially contains 'range' information) // MouseAxis property (potentially contains 'range' information)
string mcontrol = "AUTO"; string mcontrol = "AUTO";
@ -598,6 +633,9 @@ void GameInfoDialog::saveConfig()
// update 'Controllers' tab settings immediately // update 'Controllers' tab settings immediately
instance().console().setControllers(myGameProperties.get(PropType::Cart_MD5)); instance().console().setControllers(myGameProperties.get(PropType::Cart_MD5));
Paddles::setAnalogXCenter(myPaddleXCenter->getValue());
Paddles::setAnalogYCenter(myPaddleYCenter->getValue());
} }
} }
@ -686,7 +724,7 @@ void GameInfoDialog::updateControllerStates()
// Compumate bankswitching scheme doesn't allow to select controllers // Compumate bankswitching scheme doesn't allow to select controllers
bool enableSelectControl = myBSType->getSelectedTag() != "CM"; bool enableSelectControl = myBSType->getSelectedTag() != "CM";
// Enable Swap Paddles checkbox only for paddle games // Enable Swap Paddles checkbox only for paddle games
bool enableSwapPaddles = BSPF::startsWithIgnoreCase(contrLeft, "PADDLES") || bool enablePaddles = BSPF::startsWithIgnoreCase(contrLeft, "PADDLES") ||
BSPF::startsWithIgnoreCase(contrRight, "PADDLES") || BSPF::startsWithIgnoreCase(contrRight, "PADDLES") ||
BSPF::startsWithIgnoreCase(myLeftPortDetected->getLabel(), "Paddles") || BSPF::startsWithIgnoreCase(myLeftPortDetected->getLabel(), "Paddles") ||
BSPF::startsWithIgnoreCase(myRightPortDetected->getLabel(), "Paddles"); BSPF::startsWithIgnoreCase(myRightPortDetected->getLabel(), "Paddles");
@ -712,11 +750,27 @@ void GameInfoDialog::updateControllerStates()
myRightPort->setEnabled(enableSelectControl); myRightPort->setEnabled(enableSelectControl);
mySwapPorts->setEnabled(enableSelectControl); mySwapPorts->setEnabled(enableSelectControl);
mySwapPaddles->setEnabled(enableSwapPaddles); mySwapPaddles->setEnabled(enablePaddles);
myEraseEEPROMLabel->setEnabled(enableEEEraseButton); myEraseEEPROMLabel->setEnabled(enableEEEraseButton);
myEraseEEPROMButton->setEnabled(enableEEEraseButton); myEraseEEPROMButton->setEnabled(enableEEEraseButton);
myEraseEEPROMInfo->setEnabled(enableEEEraseButton); myEraseEEPROMInfo->setEnabled(enableEEEraseButton);
myPaddlesCenter->setEnabled(enablePaddles);
myPaddleXCenter->setEnabled(enablePaddles);
myPaddleYCenter->setEnabled(enablePaddles);
bool enableMouse = enablePaddles ||
BSPF::startsWithIgnoreCase(contrLeft, "Driving") ||
BSPF::startsWithIgnoreCase(contrRight, "Driving") ||
BSPF::startsWithIgnoreCase(contrLeft, "MindLink") ||
BSPF::startsWithIgnoreCase(contrRight, "MindLink");
myMouseControl->setEnabled(enableMouse);
myMouseX->setEnabled(enableMouse);
myMouseY->setEnabled(enableMouse);
myMouseRange->setEnabled(enableMouse);
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@ -797,6 +851,14 @@ void GameInfoDialog::handleCommand(CommandSender* sender, int cmd,
myVCenter->setValueUnit("px"); myVCenter->setValueUnit("px");
break; break;
case kPXCenterChanged:
myPaddleXCenter->setValueLabel(myPaddleXCenter->getValue() * 5);
break;
case kPYCenterChanged:
myPaddleYCenter->setValueLabel(myPaddleYCenter->getValue() * 5);
break;
case kMCtrlChanged: case kMCtrlChanged:
{ {
bool state = myMouseControl->getState(); bool state = myMouseControl->getState();

View File

@ -89,6 +89,9 @@ class GameInfoDialog : public Dialog, public CommandSender
StaticTextWidget* myEraseEEPROMLabel{nullptr}; StaticTextWidget* myEraseEEPROMLabel{nullptr};
ButtonWidget* myEraseEEPROMButton{nullptr}; ButtonWidget* myEraseEEPROMButton{nullptr};
StaticTextWidget* myEraseEEPROMInfo{nullptr}; StaticTextWidget* myEraseEEPROMInfo{nullptr};
StaticTextWidget* myPaddlesCenter{nullptr};
SliderWidget* myPaddleXCenter{nullptr};
SliderWidget* myPaddleYCenter{nullptr};
CheckboxWidget* myMouseControl{nullptr}; CheckboxWidget* myMouseControl{nullptr};
PopUpWidget* myMouseX{nullptr}; PopUpWidget* myMouseX{nullptr};
PopUpWidget* myMouseY{nullptr}; PopUpWidget* myMouseY{nullptr};
@ -110,6 +113,8 @@ class GameInfoDialog : public Dialog, public CommandSender
kRightCChanged = 'RCch', kRightCChanged = 'RCch',
kMCtrlChanged = 'MCch', kMCtrlChanged = 'MCch',
kEEButtonPressed = 'EEgb', kEEButtonPressed = 'EEgb',
kPXCenterChanged = 'Pxch',
kPYCenterChanged = 'Pych',
}; };
// Game properties for currently loaded ROM // Game properties for currently loaded ROM

View File

@ -123,20 +123,9 @@ void InputDialog::addDevicePortTab()
xpos = HBORDER; ypos += lineHeight + VGAP * 2; xpos = HBORDER; ypos += lineHeight + VGAP * 2;
new StaticTextWidget(myTab, _font, xpos, ypos+1, "Analog paddle:"); new StaticTextWidget(myTab, _font, xpos, ypos+1, "Analog paddle:");
// Add paddle center
xpos += fontWidth * 2; xpos += fontWidth * 2;
ypos += lineHeight + VGAP;
myPaddleCenter = new SliderWidget(myTab, _font, xpos, ypos - 1, 13 * fontWidth, lineHeight, // Add analog paddle sensitivity
"Center",
lwidth - fontWidth * 2, kPCenterChanged, 6 * fontWidth, "px", 0, true);
myPaddleCenter->setMinValue(Paddles::MIN_ANALOG_CENTER);
myPaddleCenter->setMaxValue(Paddles::MAX_ANALOG_CENTER);
myPaddleCenter->setTickmarkIntervals(4);
wid.push_back(myPaddleCenter);
// Add paddle sensitivity
ypos += lineHeight + VGAP; ypos += lineHeight + VGAP;
myPaddleSpeed = new SliderWidget(myTab, _font, xpos, ypos - 1, 13 * fontWidth, lineHeight, myPaddleSpeed = new SliderWidget(myTab, _font, xpos, ypos - 1, 13 * fontWidth, lineHeight,
"Sensitivity", "Sensitivity",
@ -146,26 +135,26 @@ void InputDialog::addDevicePortTab()
wid.push_back(myPaddleSpeed); wid.push_back(myPaddleSpeed);
// Add dejitter (Stelladaptor emulation for now only) // Add dejitter (analog paddles)
ypos += lineHeight + VGAP; ypos += lineHeight + VGAP;
myDejitterBase = new SliderWidget(myTab, _font, xpos, ypos - 1, 6 * fontWidth, lineHeight, myDejitterBase = new SliderWidget(myTab, _font, xpos, ypos - 1, 13 * fontWidth, lineHeight,
"Dejitter strength", lwidth - fontWidth * 2, kDejitterChanged); "Dejitter averaging", lwidth - fontWidth * 2,
kDejitterAvChanged, 3 * fontWidth);
myDejitterBase->setMinValue(Paddles::MIN_DEJITTER); myDejitterBase->setMinValue(Paddles::MIN_DEJITTER);
myDejitterBase->setMaxValue(Paddles::MAX_DEJITTER); myDejitterBase->setMaxValue(Paddles::MAX_DEJITTER);
myDejitterBase->setTickmarkIntervals(2); myDejitterBase->setTickmarkIntervals(5);
xpos += myDejitterBase->getWidth() + fontWidth - 4; //xpos += myDejitterBase->getWidth() + fontWidth - 4;
wid.push_back(myDejitterBase); wid.push_back(myDejitterBase);
myDejitterDiff = new SliderWidget(myTab, _font, xpos, ypos - 1, 6 * fontWidth, lineHeight, ypos += lineHeight + VGAP;
"", 0, kDejitterChanged); myDejitterDiff = new SliderWidget(myTab, _font, xpos, ypos - 1, 13 * fontWidth, lineHeight,
"Dejitter reaction", lwidth - fontWidth * 2,
kDejitterReChanged, 3 * fontWidth);
myDejitterDiff->setMinValue(Paddles::MIN_DEJITTER); myDejitterDiff->setMinValue(Paddles::MIN_DEJITTER);
myDejitterDiff->setMaxValue(Paddles::MAX_DEJITTER); myDejitterDiff->setMaxValue(Paddles::MAX_DEJITTER);
myDejitterDiff->setTickmarkIntervals(2); myDejitterDiff->setTickmarkIntervals(5);
xpos += myDejitterDiff->getWidth();
wid.push_back(myDejitterDiff); wid.push_back(myDejitterDiff);
myDejitterLabel = new StaticTextWidget(myTab, _font, xpos, ypos + 1, 7 * fontWidth, lineHeight, "");
// Add paddle speed (digital emulation) // Add paddle speed (digital emulation)
ypos += lineHeight + VGAP * 4; ypos += lineHeight + VGAP * 4;
myDPaddleSpeed = new SliderWidget(myTab, _font, HBORDER, ypos - 1, 13 * fontWidth, lineHeight, myDPaddleSpeed = new SliderWidget(myTab, _font, HBORDER, ypos - 1, 13 * fontWidth, lineHeight,
@ -319,14 +308,13 @@ void InputDialog::loadConfig()
// Joystick deadzone // Joystick deadzone
myDeadzone->setValue(instance().settings().getInt("joydeadzone")); myDeadzone->setValue(instance().settings().getInt("joydeadzone"));
// Paddle center & speed (analog) // Paddle speed (analog)
myPaddleCenter->setValue(instance().settings().getInt("pcenter"));
myPaddleSpeed->setValue(instance().settings().getInt("psense")); myPaddleSpeed->setValue(instance().settings().getInt("psense"));
// Paddle dejitter (analog)
// Paddle speed (digital and mouse)
myDejitterBase->setValue(instance().settings().getInt("dejitter.base")); myDejitterBase->setValue(instance().settings().getInt("dejitter.base"));
myDejitterDiff->setValue(instance().settings().getInt("dejitter.diff")); myDejitterDiff->setValue(instance().settings().getInt("dejitter.diff"));
updateDejitter();
// Paddle speed (digital and mouse)
myDPaddleSpeed->setValue(instance().settings().getInt("dsense")); myDPaddleSpeed->setValue(instance().settings().getInt("dsense"));
myMPaddleSpeed->setValue(instance().settings().getInt("msense")); myMPaddleSpeed->setValue(instance().settings().getInt("msense"));
@ -376,11 +364,6 @@ void InputDialog::saveConfig()
instance().settings().setValue("joydeadzone", deadzone); instance().settings().setValue("joydeadzone", deadzone);
Joystick::setDeadZone(deadzone); Joystick::setDeadZone(deadzone);
// Paddle center (analog)
int center = myPaddleCenter->getValue();
instance().settings().setValue("pcenter", center);
Paddles::setAnalogCenter(center);
// Paddle speed (analog) // Paddle speed (analog)
int sensitivity = myPaddleSpeed->getValue(); int sensitivity = myPaddleSpeed->getValue();
instance().settings().setValue("psense", sensitivity); instance().settings().setValue("psense", sensitivity);
@ -453,8 +436,7 @@ void InputDialog::setDefaults()
// Joystick deadzone // Joystick deadzone
myDeadzone->setValue(0); myDeadzone->setValue(0);
// Paddle center & speed (analog) // Paddle speed (analog)
myPaddleCenter->setValue(0);
myPaddleSpeed->setValue(20); myPaddleSpeed->setValue(20);
// Paddle speed (digital) // Paddle speed (digital)
@ -466,7 +448,6 @@ void InputDialog::setDefaults()
myDejitterBase->setValue(0); myDejitterBase->setValue(0);
myDejitterDiff->setValue(0); myDejitterDiff->setValue(0);
#endif #endif
updateDejitter();
myTrackBallSpeed->setValue(10); myTrackBallSpeed->setValue(10);
// AtariVox serial port // AtariVox serial port
@ -625,16 +606,16 @@ void InputDialog::handleCommand(CommandSender* sender, int cmd,
myDeadzone->setValueLabel(3200 + 1000 * myDeadzone->getValue()); myDeadzone->setValueLabel(3200 + 1000 * myDeadzone->getValue());
break; break;
case kPCenterChanged:
myPaddleCenter->setValueLabel(myPaddleCenter->getValue() * 5);
break;
case kPSpeedChanged: case kPSpeedChanged:
myPaddleSpeed->setValueLabel(Paddles::setAnalogSensitivity(myPaddleSpeed->getValue()) * 100.0 + 0.5); myPaddleSpeed->setValueLabel(Paddles::setAnalogSensitivity(myPaddleSpeed->getValue()) * 100.0 + 0.5);
break; break;
case kDejitterChanged: case kDejitterAvChanged:
updateDejitter(); updateDejitterAveraging();
break;
case kDejitterReChanged:
updateDejitterReaction();
break; break;
case kDPSpeedChanged: case kDPSpeedChanged:
@ -696,25 +677,19 @@ void InputDialog::handleCommand(CommandSender* sender, int cmd,
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void InputDialog::updateDejitter() void InputDialog::updateDejitterAveraging()
{ {
int strength = myDejitterBase->getValue(); int strength = myDejitterBase->getValue();
stringstream label;
if (strength) myDejitterBase->setValueLabel(strength ? std::to_string(strength) : "Off");
label << myDejitterBase->getValue(); }
else
label << "Off";
label << " "; // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
strength = myDejitterDiff->getValue(); void InputDialog::updateDejitterReaction()
{
int strength = myDejitterDiff->getValue();
if (strength) myDejitterDiff->setValueLabel(strength ? std::to_string(strength) : "Off");
label << myDejitterDiff->getValue();
else
label << "Off";
myDejitterLabel->setLabel(label.str());
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

View File

@ -65,15 +65,16 @@ class InputDialog : public Dialog
void handleMouseControlState(); void handleMouseControlState();
void handleCursorState(); void handleCursorState();
void updateDejitter(); void updateDejitterAveraging();
void updateDejitterReaction();
void eraseEEPROM(); void eraseEEPROM();
private: private:
enum { enum {
kDeadzoneChanged = 'DZch', kDeadzoneChanged = 'DZch',
kPCenterChanged = 'Pcch',
kPSpeedChanged = 'Ppch', kPSpeedChanged = 'Ppch',
kDejitterChanged = 'Pjch', kDejitterAvChanged = 'JAch',
kDejitterReChanged = 'JRch',
kDPSpeedChanged = 'PDch', kDPSpeedChanged = 'PDch',
kTBSpeedChanged = 'TBch', kTBSpeedChanged = 'TBch',
kDBButtonPressed = 'DBbp', kDBButtonPressed = 'DBbp',
@ -96,14 +97,12 @@ class InputDialog : public Dialog
EditTextWidget* myAVoxPort{nullptr}; EditTextWidget* myAVoxPort{nullptr};
SliderWidget* myDeadzone{nullptr}; SliderWidget* myDeadzone{nullptr};
SliderWidget* myPaddleCenter{nullptr};
SliderWidget* myPaddleSpeed{nullptr}; SliderWidget* myPaddleSpeed{nullptr};
SliderWidget* myDejitterBase{nullptr}; SliderWidget* myDejitterBase{nullptr};
SliderWidget* myDejitterDiff{nullptr}; SliderWidget* myDejitterDiff{nullptr};
SliderWidget* myDPaddleSpeed{nullptr}; SliderWidget* myDPaddleSpeed{nullptr};
SliderWidget* myMPaddleSpeed{nullptr}; SliderWidget* myMPaddleSpeed{nullptr};
SliderWidget* myTrackBallSpeed{nullptr}; SliderWidget* myTrackBallSpeed{nullptr};
StaticTextWidget* myDejitterLabel{nullptr};
CheckboxWidget* myAllowAll4{nullptr}; CheckboxWidget* myAllowAll4{nullptr};
CheckboxWidget* myGrabMouse{nullptr}; CheckboxWidget* myGrabMouse{nullptr};
CheckboxWidget* myModCombo{nullptr}; CheckboxWidget* myModCombo{nullptr};

View File

@ -19,11 +19,13 @@ my %prop_type = (
"Controller.Left" => 13, "Controller.Left" => 13,
"Controller.Right" => 14, "Controller.Right" => 14,
"Controller.SwapPaddles" => 15, "Controller.SwapPaddles" => 15,
"Controller.MouseAxis" => 16, "Controller.PaddlesXCenter" => 16,
"Display.Format" => 17, "Controller.PaddlesYCenter" => 17,
"Display.VCenter" => 18, "Controller.MouseAxis" => 18,
"Display.Phosphor" => 19, "Display.Format" => 19,
"Display.PPBlend" => 20 "Display.VCenter" => 20,
"Display.Phosphor" => 21,
"Display.PPBlend" => 22
); );
my @prop_type_as_string = ( my @prop_type_as_string = (
"Cart.MD5", "Cart.MD5",
@ -42,6 +44,8 @@ my @prop_type_as_string = (
"Controller.Left", "Controller.Left",
"Controller.Right", "Controller.Right",
"Controller.SwapPaddles", "Controller.SwapPaddles",
"Controller.PaddlesXCenter",
"Controller.PaddlesYCenter",
"Controller.MouseAxis", "Controller.MouseAxis",
"Display.Format", "Display.Format",
"Display.VCenter", "Display.VCenter",