From 4d78865ab218f2d8396d4f401e2a2d629c0b25c7 Mon Sep 17 00:00:00 2001 From: Thomas Jentzsch Date: Wed, 15 Sep 2021 18:02:10 +0200 Subject: [PATCH] finalized new paddle settings --- Changes.txt | 2 + docs/graphics/eventmapping_devsports.png | Bin 4952 -> 4961 bytes docs/index.html | 32 +++---- src/common/PJoystickHandler.cxx | 40 +++------ src/common/PJoystickHandler.hxx | 2 +- src/common/PKeyboardHandler.cxx | 4 +- src/common/jsonDefinitions.hxx | 4 +- src/emucore/Control.cxx | 11 ++- src/emucore/Control.hxx | 9 +- src/emucore/Event.hxx | 2 +- src/emucore/EventHandler.cxx | 24 +++--- src/emucore/EventHandler.hxx | 2 +- src/emucore/MindLink.cxx | 2 +- src/emucore/Paddles.cxx | 102 ++++++++--------------- src/emucore/Paddles.hxx | 15 ++-- src/emucore/Settings.cxx | 11 ++- src/gui/InputDialog.cxx | 57 +++++-------- src/gui/InputDialog.hxx | 4 +- 18 files changed, 143 insertions(+), 180 deletions(-) diff --git a/Changes.txt b/Changes.txt index 1677857cc..28b38ca27 100644 --- a/Changes.txt +++ b/Changes.txt @@ -21,6 +21,8 @@ * Added web links for many games + * Added dead zone and linearity settings for analog controllers + * Fixed MindLink controller * Added TIA randomization on startup option diff --git a/docs/graphics/eventmapping_devsports.png b/docs/graphics/eventmapping_devsports.png index 018f503327038254799cc2334ac28e9e23a42647..2cc3e73f3126cb139ed087576aed8d11a0e37611 100644 GIT binary patch delta 4873 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 qstnd@BwsxKA5YM-FV4>1JJ>n*K{hx - Decrease analog paddle acceleration + Decrease analog paddle linearity Shift-Control-Alt + F2 Shift-Control-Cmd + F2 - Increase analog paddle acceleration + Increase analog paddle linearity Control-Alt + F2 Control-Cmd + F2 @@ -2965,29 +2965,31 @@ Set the joystick axis dead zone area for analog joysticks/gamepads emulating digital controllers. All values within the dead zone are treated as zero-axis values, - while only those values outside are registered as valid input. + while only those values outside are registered as valid input.
Dead zone is calculated as 3200 + value * 1000. So the possible dead zone values range from 3200 to 32200 (= 10% - 98%). -
-adeadzone <0 - 16500>
+
-adeadzone <0 - 29>
Set the joystick axis dead zone area for analog joysticks/gamepads - emulating analog controllers. All values within the - dead zone are treated as zero-axis values, while only those values - outside are registered as valid input. Range: 0% - 50% + emulating analog controllers. All values within the dead zone are + treated as zero-axis values, while only those values outside are + registered as valid input.
+ Dead zone is calculated as value * 565. So the possible dead zone + values range from 0 to 16384 (= 0% - 50%) -
-psense <number>
- Sensitivity for emulation of paddles when using analog paddles. - Valid range of values is from 0 to 30, with larger numbers causing - faster movement. +
-psense <0 - 30>
+ Sensitivity for emulation of paddles when using analog controllers. + Larger numbers are causing faster movement. -
-paccel <0 - 100>
- Acceleration of analog paddles while moving them fast. +
-plinear <25 - 100>
+ Linearity of analog paddles. Lower numbers allow finer control + around the paddle center. @@ -4036,8 +4038,8 @@ Analog dead zone sizeDead zone area for axes on joysticks/gamepads emulating analog controllers -adeadzone - (Analog paddle) SensitivitySensitivity of an analog paddle-psense - (Analog paddle) AccelerationAcceleration of analog paddles when moving them fast-paccel + (Analog paddle) SensitivitySensitivity of analog paddles-psense + (Analog paddle) LinearityLinearity of analog paddles-plinear (Analog paddle) Dejitter averagingStrength of paddle input averaging, suppresses paddle jitter
Note: The 2600-daptor has built-in dejitter, so there should be no need to use Stella's dejitter. -dejitter.base diff --git a/src/common/PJoystickHandler.cxx b/src/common/PJoystickHandler.cxx index d5d2ff3c6..250919b5e 100644 --- a/src/common/PJoystickHandler.cxx +++ b/src/common/PJoystickHandler.cxx @@ -789,22 +789,7 @@ void PhysicalJoystickHandler::handleRegularAxisEvent(const PhysicalJoystickPtr j if((abs(j->axisLastValue[axis] - value) < 30000) && (eventAxisAnalog = j->joyMap.get(EventMode::kEmulationMode, button, JoyAxis(axis), JoyDir::ANALOG)) != Event::Type::NoType) { - // TODO: TEST!!! - if(abs(value) > Controller::analogDeadZone()) - myHandler.handleEvent(eventAxisAnalog, value); - else - { - // Treat any dead zone value as zero - value = 0; - - // Now filter out consecutive, similar values - // (only pass on the event if the state has changed) - if(j->axisLastValue[axis] != value) - { - // Turn off events - myHandler.handleEvent(eventAxisAnalog, 0); - } - } + myHandler.handleEvent(eventAxisAnalog, value); } else { @@ -978,13 +963,14 @@ void PhysicalJoystickHandler::changeDigitalDeadZone(int direction) // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void PhysicalJoystickHandler::changeAnalogPaddleDeadZone(int direction) { - int deadZone = BSPF::clamp(myOSystem.settings().getInt("adeadzone") + direction * 500, + int deadZone = BSPF::clamp(myOSystem.settings().getInt("adeadzone") + direction, Controller::MIN_ANALOG_DEADZONE, Controller::MAX_ANALOG_DEADZONE); myOSystem.settings().setValue("adeadzone", deadZone); Controller::setAnalogDeadZone(deadZone); + ostringstream ss; - ss << std::round(deadZone * 100.F / 32768) << "%"; + ss << std::round(Controller::analogDeadZoneValue(deadZone) * 100.F / 32768) << "%"; myOSystem.frameBuffer().showGaugeMessage("Analog controller dead zone", ss.str(), deadZone, Controller::MIN_ANALOG_DEADZONE, Controller::MAX_ANALOG_DEADZONE); @@ -1007,22 +993,22 @@ void PhysicalJoystickHandler::changeAnalogPaddleSensitivity(int direction) } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void PhysicalJoystickHandler::changeAnalogPaddleAcceleration(int direction) +void PhysicalJoystickHandler::changeAnalogPaddleLinearity(int direction) { - int accel = BSPF::clamp(myOSystem.settings().getInt("paccel") + direction * 5, - Paddles::MIN_ANALOG_ACCEL, Paddles::MAX_ANALOG_ACCEL); - myOSystem.settings().setValue("paccel", accel); + int linear = BSPF::clamp(myOSystem.settings().getInt("plinear") + direction * 5, + Paddles::MIN_ANALOG_LINEARITY, Paddles::MAX_ANALOG_LINEARITY); + myOSystem.settings().setValue("plinear", linear); - Paddles::setAnalogAccel(accel); + Paddles::setAnalogLinearity(linear); ostringstream ss; - if(accel) - ss << accel << "%"; + if(linear) + ss << linear << "%"; else ss << "Off"; - myOSystem.frameBuffer().showGaugeMessage("Analog paddle acceleration", ss.str(), accel, - Paddles::MIN_ANALOG_ACCEL, Paddles::MAX_ANALOG_ACCEL); + myOSystem.frameBuffer().showGaugeMessage("Analog paddle linearity", ss.str(), linear, + Paddles::MIN_ANALOG_LINEARITY, Paddles::MAX_ANALOG_LINEARITY); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/common/PJoystickHandler.hxx b/src/common/PJoystickHandler.hxx index 522dfbd26..b28ca228b 100644 --- a/src/common/PJoystickHandler.hxx +++ b/src/common/PJoystickHandler.hxx @@ -113,7 +113,7 @@ class PhysicalJoystickHandler void changeDigitalDeadZone(int direction = +1); void changeAnalogPaddleDeadZone(int direction = +1); void changeAnalogPaddleSensitivity(int direction = +1); - void changeAnalogPaddleAcceleration(int direction = +1); + void changeAnalogPaddleLinearity(int direction = +1); void changePaddleDejitterAveraging(int direction = +1); void changePaddleDejitterReaction(int direction = +1); void changeDigitalPaddleSensitivity(int direction = +1); diff --git a/src/common/PKeyboardHandler.cxx b/src/common/PKeyboardHandler.cxx index 50fdafa75..7e4b9b93c 100644 --- a/src/common/PKeyboardHandler.cxx +++ b/src/common/PKeyboardHandler.cxx @@ -693,8 +693,8 @@ PhysicalKeyboardHandler::DefaultCommonMapping = { { Event::IncAnalogDeadzone, KBDK_F1, KBDM_CTRL | MOD3}, { Event::DecAnalogSense, KBDK_F2, KBDM_CTRL | KBDM_SHIFT }, { Event::IncAnalogSense, KBDK_F2, KBDM_CTRL }, - { Event::DecAnalogAccel, KBDK_F2, KBDM_CTRL | MOD3 | KBDM_SHIFT}, - { Event::IncAnalogAccel, KBDK_F2, KBDM_CTRL | MOD3}, + { Event::DecAnalogLinear, KBDK_F2, KBDM_CTRL | MOD3 | KBDM_SHIFT}, + { Event::IncAnalogLinear, KBDK_F2, KBDM_CTRL | MOD3}, { Event::DecDejtterAveraging, KBDK_F3, KBDM_CTRL | KBDM_SHIFT }, { Event::IncDejtterAveraging, KBDK_F3, KBDM_CTRL }, { Event::DecDejtterReaction, KBDK_F4, KBDM_CTRL | KBDM_SHIFT }, diff --git a/src/common/jsonDefinitions.hxx b/src/common/jsonDefinitions.hxx index 3d60ae30d..35053864f 100644 --- a/src/common/jsonDefinitions.hxx +++ b/src/common/jsonDefinitions.hxx @@ -199,8 +199,8 @@ NLOHMANN_JSON_SERIALIZE_ENUM(Event::Type, { {Event::IncAnalogDeadzone, "IncAnalogDeadzone"}, {Event::DecAnalogSense, "DecAnalogSense"}, {Event::IncAnalogSense, "IncAnalogSense"}, - {Event::DecAnalogAccel, "DecAnalogAccel"}, - {Event::IncAnalogAccel, "IncAnalogAccel"}, + {Event::DecAnalogLinear, "DecAnalogLinear"}, + {Event::IncAnalogLinear, "IncAnalogLinear"}, {Event::DecDejtterAveraging, "DecDejtterAveraging"}, {Event::IncDejtterAveraging, "IncDejtterAveraging"}, {Event::DecDejtterReaction, "DecDejtterReaction"}, diff --git a/src/emucore/Control.cxx b/src/emucore/Control.cxx index b83616de7..b356e96e4 100644 --- a/src/emucore/Control.cxx +++ b/src/emucore/Control.cxx @@ -165,9 +165,18 @@ int Controller::digitalDeadZoneValue(int deadZone) // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void Controller::setAnalogDeadZone(int deadZone) { - ANALOG_DEAD_ZONE = BSPF::clamp(deadZone, MIN_ANALOG_DEADZONE, MAX_ANALOG_DEADZONE); + ANALOG_DEAD_ZONE = analogDeadZoneValue(deadZone); } +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +int Controller::analogDeadZoneValue(int deadZone) +{ + deadZone = BSPF::clamp(deadZone, MIN_ANALOG_DEADZONE, MAX_ANALOG_DEADZONE); + + return deadZone * std::round(32768 / 2. / MAX_DIGITAL_DEADZONE); +} + + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void Controller::setMouseSensitivity(int sensitivity) { diff --git a/src/emucore/Control.hxx b/src/emucore/Control.hxx index 8e90706d0..12a4ae699 100644 --- a/src/emucore/Control.hxx +++ b/src/emucore/Control.hxx @@ -74,7 +74,7 @@ class Controller : public Serializable static constexpr int MIN_DIGITAL_DEADZONE = 0; static constexpr int MAX_DIGITAL_DEADZONE = 29; static constexpr int MIN_ANALOG_DEADZONE = 0; - static constexpr int MAX_ANALOG_DEADZONE = 16500; + static constexpr int MAX_ANALOG_DEADZONE = 29; static constexpr int MIN_MOUSE_SENSE = 1; static constexpr int MAX_MOUSE_SENSE = 20; @@ -290,7 +290,7 @@ class Controller : public Serializable /** Sets the dead zone for analog paddles. - @param deadZone Value from 0 to 16500 + @param deadZone Value from 0 to 29 */ static void setAnalogDeadZone(int deadZone); @@ -299,6 +299,11 @@ class Controller : public Serializable */ static int digitalDeadZoneValue(int deadZone); + /** + Retrieves the effective analog dead zone value + */ + static int Controller::analogDeadZoneValue(int deadZone); + inline static int digitalDeadZone() { return DIGITAL_DEAD_ZONE; } inline static int analogDeadZone() { return ANALOG_DEAD_ZONE; } diff --git a/src/emucore/Event.hxx b/src/emucore/Event.hxx index 64381a0de..481a13252 100644 --- a/src/emucore/Event.hxx +++ b/src/emucore/Event.hxx @@ -149,7 +149,7 @@ class Event DecreaseDeadzone, IncreaseDeadzone, DecAnalogDeadzone, IncAnalogDeadzone, DecAnalogSense, IncAnalogSense, - DecAnalogAccel, IncAnalogAccel, + DecAnalogLinear, IncAnalogLinear, DecDejtterAveraging, IncDejtterAveraging, DecDejtterReaction, IncDejtterReaction, DecDigitalSense, IncDigitalSense, diff --git a/src/emucore/EventHandler.cxx b/src/emucore/EventHandler.cxx index b1ac76bc2..593bedaa0 100644 --- a/src/emucore/EventHandler.cxx +++ b/src/emucore/EventHandler.cxx @@ -101,7 +101,7 @@ void EventHandler::initialize() Controller::setDigitalDeadZone(myOSystem.settings().getInt("joydeadzone")); Controller::setAnalogDeadZone(myOSystem.settings().getInt("adeadzone")); - Paddles::setAnalogAccel(myOSystem.settings().getInt("paccel")); + Paddles::setAnalogLinearity(myOSystem.settings().getInt("plinear")); Paddles::setDejitterDiff(myOSystem.settings().getInt("dejitter.diff")); Paddles::setDejitterBase(myOSystem.settings().getInt("dejitter.base")); Paddles::setDejitterDiff(myOSystem.settings().getInt("dejitter.diff")); @@ -461,7 +461,7 @@ bool EventHandler::skipInputSetting() const || (!paddle && (myAdjustSetting == AdjustSetting::ANALOG_DEADZONE || myAdjustSetting == AdjustSetting::ANALOG_SENSITIVITY - || myAdjustSetting == AdjustSetting::ANALOG_ACCEL + || myAdjustSetting == AdjustSetting::ANALOG_LINEARITY || myAdjustSetting == AdjustSetting::DEJITTER_AVERAGING || myAdjustSetting == AdjustSetting::DEJITTER_REACTION || myAdjustSetting == AdjustSetting::DIGITAL_SENSITIVITY @@ -599,7 +599,7 @@ AdjustFunction EventHandler::getAdjustSetting(AdjustSetting setting) std::bind(&PhysicalJoystickHandler::changeDigitalDeadZone, &joyHandler(), _1), std::bind(&PhysicalJoystickHandler::changeAnalogPaddleDeadZone, &joyHandler(), _1), std::bind(&PhysicalJoystickHandler::changeAnalogPaddleSensitivity, &joyHandler(), _1), - std::bind(&PhysicalJoystickHandler::changeAnalogPaddleAcceleration, &joyHandler(), _1), + std::bind(&PhysicalJoystickHandler::changeAnalogPaddleLinearity, &joyHandler(), _1), std::bind(&PhysicalJoystickHandler::changePaddleDejitterAveraging, &joyHandler(), _1), std::bind(&PhysicalJoystickHandler::changePaddleDejitterReaction, &joyHandler(), _1), std::bind(&PhysicalJoystickHandler::changeDigitalPaddleSensitivity, &joyHandler(), _1), @@ -1415,20 +1415,20 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) } return; - case Event::DecAnalogAccel: + case Event::DecAnalogLinear: if(pressed) { - myPJoyHandler->changeAnalogPaddleAcceleration(-1); - myAdjustSetting = AdjustSetting::ANALOG_ACCEL; + myPJoyHandler->changeAnalogPaddleLinearity(-1); + myAdjustSetting = AdjustSetting::ANALOG_LINEARITY; myAdjustActive = true; } return; - case Event::IncAnalogAccel: + case Event::IncAnalogLinear: if(pressed) { - myPJoyHandler->changeAnalogPaddleAcceleration(+1); - myAdjustSetting = AdjustSetting::ANALOG_ACCEL; + myPJoyHandler->changeAnalogPaddleLinearity(+1); + myAdjustSetting = AdjustSetting::ANALOG_LINEARITY; myAdjustActive = true; } return; @@ -3328,8 +3328,8 @@ EventHandler::EmulActionList EventHandler::ourEmulActionList = { { { Event::IncAnalogDeadzone, "Increase analog dead zone", "" }, { Event::DecAnalogSense, "Decrease analog paddle sensitivity", "" }, { Event::IncAnalogSense, "Increase analog paddle sensitivity", "" }, - { Event::DecAnalogAccel, "Decrease analog paddle acceleration", "" }, - { Event::IncAnalogAccel, "Increase analog paddle acceleration", "" }, + { Event::DecAnalogLinear, "Decrease analog paddle linearity", "" }, + { Event::IncAnalogLinear, "Increase analog paddle linearity", "" }, { Event::DecDejtterAveraging, "Decrease paddle dejitter averaging", "" }, { Event::IncDejtterAveraging, "Increase paddle dejitter averaging", "" }, { Event::DecDejtterReaction, "Decrease paddle dejitter reaction", "" }, @@ -3515,7 +3515,7 @@ const Event::EventSet EventHandler::DevicesEvents = { Event::DecreaseDeadzone, Event::IncreaseDeadzone, Event::DecAnalogDeadzone, Event::IncAnalogDeadzone, Event::DecAnalogSense, Event::IncAnalogSense, - Event::DecAnalogAccel, Event::IncAnalogAccel, + Event::DecAnalogLinear, Event::IncAnalogLinear, Event::DecDejtterAveraging, Event::IncDejtterAveraging, Event::DecDejtterReaction, Event::IncDejtterReaction, Event::DecDigitalSense, Event::IncDigitalSense, diff --git a/src/emucore/EventHandler.hxx b/src/emucore/EventHandler.hxx index 49acaf0b2..431f3f644 100644 --- a/src/emucore/EventHandler.hxx +++ b/src/emucore/EventHandler.hxx @@ -475,7 +475,7 @@ class EventHandler DEADZONE, ANALOG_DEADZONE, ANALOG_SENSITIVITY, - ANALOG_ACCEL, + ANALOG_LINEARITY, DEJITTER_AVERAGING, DEJITTER_REACTION, DIGITAL_SENSITIVITY, diff --git a/src/emucore/MindLink.cxx b/src/emucore/MindLink.cxx index 40f96c6cb..6dc14f59d 100644 --- a/src/emucore/MindLink.cxx +++ b/src/emucore/MindLink.cxx @@ -57,7 +57,7 @@ void MindLink::nextMindlinkBit() if(myMindlinkPos & myMindlinkShift) setPin(DigitalPin::Four, true); myMindlinkShift <<= 1; // next bit - } + } } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/emucore/Paddles.cxx b/src/emucore/Paddles.cxx index f469d08e5..0523895d8 100644 --- a/src/emucore/Paddles.cxx +++ b/src/emucore/Paddles.cxx @@ -25,8 +25,8 @@ Paddles::Paddles(Jack jack, const Event& event, const System& system, bool swappaddle, bool swapaxis, bool swapdir, bool altmap) : Controller(jack, event, system, Controller::Type::Paddles) { - // We must start with minimum resistance; see commit - // 38b452e1a047a0dca38c5bcce7c271d40f76736e for more information + // We must start with a physical valid resistance (e.g. 0); + // see commit 38b452e1a047a0dca38c5bcce7c271d40f76736e for more information setPin(AnalogPin::Five, AnalogReadout::connectToVcc()); setPin(AnalogPin::Nine, AnalogReadout::connectToVcc()); @@ -197,11 +197,21 @@ void Paddles::update() AnalogReadout::Connection Paddles::getReadOut(int lastAxis, int& newAxis, int center) { + const double range = ANALOG_RANGE - analogDeadZone() * 2; + + // dead zone, ignore changes inside the dead zone + if(newAxis > analogDeadZone()) + newAxis -= analogDeadZone(); + else if(newAxis < -analogDeadZone()) + newAxis += analogDeadZone(); + else + newAxis = 0; // treat any dead zone value as zero + static constexpr std::array bFac = { - // higher values mean more dejitter strength - 0, // off - 0.50, 0.59, 0.67, 0.74, 0.80, - 0.85, 0.89, 0.92, 0.94, 0.95 + // higher values mean more dejitter strength + 0, // off + 0.50, 0.59, 0.67, 0.74, 0.80, + 0.85, 0.89, 0.92, 0.94, 0.95 }; static constexpr std::array dFac = { // lower values mean more dejitter strength @@ -220,24 +230,30 @@ AnalogReadout::Connection Paddles::getReadOut(int lastAxis, int& newAxis, int ce if(abs(newVal - newAxis) > 10) newAxis = newVal; - // TODO: deadzone - // here or in PJoystickhandler? + // apply linearity + double linearVal = newAxis / (range / 2); // scale to -1.0..+1.0 - // accelerate, reduces sensitivity accordingly - int diff = newAxis - lastAxis; - float factor = diff ? pow(abs(diff), ACCEL) / abs(diff) : 0; + if(newAxis >= 0) + linearVal = pow(abs(linearVal), LINEARITY); + else + linearVal = -pow(abs(linearVal), LINEARITY); - newAxis = lastAxis - diff * factor * pow(MOUSE_SENSITIVITY, 1.f/ACCEL); // TODO: predefine pow(...) + newAxis = linearVal * (range / 2); // scale back to ANALOG_RANGE + + // scale axis to range including dead zone + const Int32 scaledAxis = newAxis * ANALOG_RANGE / range; // scale result return AnalogReadout::connectToVcc(MAX_RESISTANCE * - (BSPF::clamp(32768 - Int32(Int32(newAxis) * SENSITIVITY + center), 0, 65536) / 65536.0)); + BSPF::clamp((ANALOG_MAX_VALUE - (scaledAxis * SENSITIVITY + center)) / double(ANALOG_RANGE), + 0.0, 1.0)); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - bool Paddles::updateAnalogAxes() { - // Analog axis events from Stelladaptor-like devices + // Analog axis events from Stelladaptor-like devices, + // (which includes analog USB controllers) // These devices generate data in the range -32768 to 32767, // so we have to scale appropriately // Since these events are generated and stored indefinitely, @@ -245,20 +261,6 @@ bool Paddles::updateAnalogAxes() // previous values by a pre-defined amount) // Otherwise, it would always override input from digital and mouse - //static constexpr std::array bFac = { - // // higher values mean more dejitter strength - // 0, // off - // 0.50, 0.59, 0.67, 0.74, 0.80, - // 0.85, 0.89, 0.92, 0.94, 0.95 - //}; - //static constexpr std::array dFac = { - // // lower values mean more dejitter strength - // 1, // off - // 1.0 / 181, 1.0 / 256, 1.0 / 362, 1.0 / 512, 1.0 / 724, - // 1.0 / 1024, 1.0 / 1448, 1.0 / 2048, 1.0 / 2896, 1.0 / 4096 - //}; - //const double baseFactor = bFac[DEJITTER_BASE]; - //const double diffFactor = dFac[DEJITTER_DIFF]; int sa_xaxis = myEvent.get(myAAxisValue); int sa_yaxis = myEvent.get(myBAxisValue); @@ -266,34 +268,13 @@ bool Paddles::updateAnalogAxes() if(abs(myLastAxisX - sa_xaxis) > 10) { - - //// dejitter, suppress small changes only - //double dejitter = pow(baseFactor, abs(sa_xaxis - myLastAxisX) * diffFactor); - //int new_val = sa_xaxis * (1 - dejitter) + myLastAxisX * dejitter; - - //// only use new dejittered value for larger differences - //if(abs(new_val - sa_xaxis) > 10) - // sa_xaxis = new_val; - - //setPin(AnalogPin::Nine, AnalogReadout::connectToVcc(MAX_RESISTANCE * - // (BSPF::clamp(32768 - Int32(Int32(sa_xaxis) * SENSITIVITY + XCENTER), 0, 65536) / 65536.0))); setPin(AnalogPin::Nine, getReadOut(myLastAxisX, sa_xaxis, XCENTER)); sa_changed = true; } if(abs(myLastAxisY - sa_yaxis) > 10) { - //// dejitter, suppress small changes only - //double dejitter = pow(baseFactor, abs(sa_yaxis - myLastAxisY) * diffFactor); - //int new_val = sa_yaxis * (1 - dejitter) + myLastAxisY * dejitter; - - //// only use new dejittered value for larger differences - //if(abs(new_val - sa_yaxis) > 10) - // sa_yaxis = new_val; - - //setPin(AnalogPin::Five, AnalogReadout::connectToVcc(MAX_RESISTANCE * - // (BSPF::clamp(32768 - Int32(Int32(sa_yaxis) * SENSITIVITY + YCENTER), 0, 65536) / 65536.0))); - setPin(AnalogPin::Nine, getReadOut(myLastAxisY, sa_yaxis, YCENTER)); + setPin(AnalogPin::Five, getReadOut(myLastAxisY, sa_yaxis, YCENTER)); sa_changed = true; } myLastAxisX = sa_xaxis; @@ -329,20 +310,9 @@ void Paddles::updateMouse(bool& firePressedA, bool& firePressedB) // mapped to a separate paddle if(myMPaddleIDX > -1) { - // TODO: REMOVE! Test for 2600-daptor paddles only! - // deadzone - // TODO - // - // accelerate - int diff = myEvent.get(myAxisMouseMotion); - float factor = diff ? pow(abs(diff), ACCEL) / abs(diff) : 0; - int newVal = myCharge[myMPaddleIDX] - diff * factor * pow(MOUSE_SENSITIVITY, 1.f/ACCEL); - - myCharge[myMPaddleIDX] = BSPF::clamp(newVal, TRIGMIN, TRIGRANGE); - - /* myCharge[myMPaddleIDX] = BSPF::clamp(myCharge[myMPaddleIDX] - + myCharge[myMPaddleIDX] = BSPF::clamp(myCharge[myMPaddleIDX] - (myEvent.get(Event::MouseAxisXMove) * MOUSE_SENSITIVITY), - TRIGMIN, TRIGRANGE);*/ + TRIGMIN, TRIGRANGE); if(myMPaddleIDX == 0) firePressedA = firePressedA || myEvent.get(Event::MouseButtonLeftValue); @@ -479,9 +449,9 @@ float Paddles::analogSensitivityValue(int sensitivity) } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void Paddles::setAnalogAccel(int accel) +void Paddles::setAnalogLinearity(int linearity) { - ACCEL = 1.f + BSPF::clamp(accel, MIN_ANALOG_ACCEL, MAX_ANALOG_ACCEL) / 100.f; + LINEARITY = 100.f / BSPF::clamp(linearity, MIN_ANALOG_LINEARITY, MAX_ANALOG_LINEARITY); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void Paddles::setDejitterBase(int strength) @@ -513,7 +483,7 @@ void Paddles::setDigitalPaddleRange(int range) int Paddles::XCENTER = 0; int Paddles::YCENTER = 0; float Paddles::SENSITIVITY = 1.0; -float Paddles::ACCEL = 1.0; +float Paddles::LINEARITY = 1.0; int Paddles::DEJITTER_BASE = 0; int Paddles::DEJITTER_DIFF = 0; int Paddles::TRIGRANGE = Paddles::TRIGMAX; diff --git a/src/emucore/Paddles.hxx b/src/emucore/Paddles.hxx index 2c501771a..ce37b35b3 100644 --- a/src/emucore/Paddles.hxx +++ b/src/emucore/Paddles.hxx @@ -48,11 +48,14 @@ class Paddles : public Controller ~Paddles() override = default; public: + static constexpr int ANALOG_MIN_VALUE = -32768; + static constexpr int ANALOG_MAX_VALUE = 32767; + static constexpr int ANALOG_RANGE = ANALOG_MAX_VALUE - ANALOG_MIN_VALUE + 1; static constexpr float BASE_ANALOG_SENSE = 0.148643628F; static constexpr int MIN_ANALOG_SENSE = 0; static constexpr int MAX_ANALOG_SENSE = 30; - static constexpr int MIN_ANALOG_ACCEL = 0; - static constexpr int MAX_ANALOG_ACCEL = 100; + static constexpr int MIN_ANALOG_LINEARITY = 25; + static constexpr int MAX_ANALOG_LINEARITY = 100; static constexpr int MIN_ANALOG_CENTER = -10; static constexpr int MAX_ANALOG_CENTER = 30; static constexpr int MIN_DIGITAL_SENSE = 1; @@ -112,11 +115,11 @@ class Paddles : public Controller static void setAnalogYCenter(int ycenter); /** - Sets the acceleration for analog paddles. + Sets the linearity of analog paddles. - @param accel Value from 100 to 300 + @param linearity Value from 25 to 100 */ - static void setAnalogAccel(int accel); + static void setAnalogLinearity(int linearity); /** Sets the sensitivity for analog paddles. @@ -191,7 +194,7 @@ class Paddles : public Controller static int XCENTER; static int YCENTER; - static float SENSITIVITY, ACCEL; + static float SENSITIVITY, LINEARITY; static int DIGITAL_SENSITIVITY, DIGITAL_DISTANCE; static int DEJITTER_BASE, DEJITTER_DIFF; diff --git a/src/emucore/Settings.cxx b/src/emucore/Settings.cxx index d441cf96b..0a9314316 100644 --- a/src/emucore/Settings.cxx +++ b/src/emucore/Settings.cxx @@ -116,7 +116,7 @@ Settings::Settings() setPermanent("grabmouse", "true"); setPermanent("cursor", "2"); setPermanent("adeadzone", "0"); - setPermanent("paccel", "100"); + setPermanent("plinear", "100"); setPermanent("dejitter.base", "0"); setPermanent("dejitter.diff", "0"); setPermanent("dsense", "10"); @@ -368,8 +368,8 @@ void Settings::validate() setValue("psense", BSPF::clamp(getInt("psense"), Paddles::MIN_ANALOG_SENSE, Paddles::MAX_ANALOG_SENSE)); - setValue("paccel", BSPF::clamp(getInt("paccel"), - Paddles::MIN_ANALOG_ACCEL, Paddles::MAX_ANALOG_ACCEL)); + setValue("plinear", BSPF::clamp(getInt("plinear"), + Paddles::MIN_ANALOG_LINEARITY, Paddles::MAX_ANALOG_LINEARITY)); setValue("dejitter.base", BSPF::clamp(getInt("dejitter.base"), Paddles::MIN_DEJITTER, Paddles::MAX_DEJITTER)); @@ -525,9 +525,8 @@ void Settings::usage() const << " properties in given mode(see manual)\n" << " -grabmouse <1|0> Locks the mouse cursor in the TIA window\n" << " -cursor <0,1,2,3> Set cursor state in UI/emulation modes\n" - << " -adeadzone Sets analog 'dead zone' area for analog joysticks\n" - << " (0-16500)\n" - << " -paccel <0-100> Sets paddle acceleration strength\n" + << " -adeadzone <0-29> Sets analog 'dead zone' area for analog joysticks\n" + << " -plinear <25-100> Sets paddle linearity\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" << " -psense <0-30> Sensitivity of analog paddle movement\n" diff --git a/src/gui/InputDialog.cxx b/src/gui/InputDialog.cxx index b45048b1a..40ae3f8f9 100644 --- a/src/gui/InputDialog.cxx +++ b/src/gui/InputDialog.cxx @@ -121,7 +121,7 @@ void InputDialog::addDevicePortTab() lwidth, kDDeadzoneChanged, 3 * fontWidth, "%"); myDigitalDeadzone->setMinValue(Controller::MIN_DIGITAL_DEADZONE); myDigitalDeadzone->setMaxValue(Controller::MAX_DIGITAL_DEADZONE); - myDigitalDeadzone->setTickmarkIntervals(4); + myDigitalDeadzone->setTickmarkIntervals(5); myDigitalDeadzone->setToolTip("Adjust dead zone size for analog joysticks when emulating digital controllers."); wid.push_back(myDigitalDeadzone); @@ -132,8 +132,7 @@ void InputDialog::addDevicePortTab() lwidth, kADeadzoneChanged, 3 * fontWidth, "%"); myAnalogDeadzone->setMinValue(Controller::MIN_ANALOG_DEADZONE); myAnalogDeadzone->setMaxValue(Controller::MAX_ANALOG_DEADZONE); - myAnalogDeadzone->setStepValue(500); - myAnalogDeadzone->setTickmarkIntervals(3); + myAnalogDeadzone->setTickmarkIntervals(5); myAnalogDeadzone->setToolTip("Adjust dead zone size for analog joysticks when emulating analog controllers."); wid.push_back(myAnalogDeadzone); @@ -151,17 +150,16 @@ void InputDialog::addDevicePortTab() myPaddleSpeed->setTickmarkIntervals(3); wid.push_back(myPaddleSpeed); - // Add analog paddle acceleration + // Add analog paddle linearity ypos += lineHeight + VGAP; - myPaddleAccel = new SliderWidget(myTab, _font, xpos, ypos - 1, 13 * fontWidth, lineHeight, - "Acceleration", - lwidth - fontWidth * 2, kPAccelChanged, 4 * fontWidth); - myPaddleAccel->setMinValue(Paddles::MIN_ANALOG_ACCEL); - myPaddleAccel->setMaxValue(Paddles::MAX_ANALOG_ACCEL); - myPaddleAccel->setStepValue(5); - myPaddleAccel->setTickmarkIntervals(4); - myPaddleAccel->setToolTip("Adjust fast paddle movement acceleration."); - wid.push_back(myPaddleAccel); + myPaddleLinearity = new SliderWidget(myTab, _font, xpos, ypos - 1, 13 * fontWidth, lineHeight, + "Linearity", lwidth - fontWidth * 2, 0, 4 * fontWidth, "%"); + myPaddleLinearity->setMinValue(Paddles::MIN_ANALOG_LINEARITY); + myPaddleLinearity->setMaxValue(Paddles::MAX_ANALOG_LINEARITY); + myPaddleLinearity->setStepValue(5); + myPaddleLinearity->setTickmarkIntervals(3); + myPaddleLinearity->setToolTip("Adjust paddle movement linearity."); + wid.push_back(myPaddleLinearity); // Add dejitter (analog paddles) ypos += lineHeight + VGAP; @@ -371,8 +369,8 @@ void InputDialog::loadConfig() // Paddle speed (analog) myPaddleSpeed->setValue(settings.getInt("psense")); - // Paddle acceleration (analog) - myPaddleAccel->setValue(settings.getInt("paccel")); + // Paddle linearity (analog) + myPaddleLinearity->setValue(settings.getInt("plinear")); // Paddle dejitter (analog) myDejitterBase->setValue(settings.getInt("dejitter.base")); myDejitterDiff->setValue(settings.getInt("dejitter.diff")); @@ -447,10 +445,10 @@ void InputDialog::saveConfig() int sensitivity = myPaddleSpeed->getValue(); settings.setValue("psense", sensitivity); Paddles::setAnalogSensitivity(sensitivity); - // Paddle acceleration (analog) - int accel = myPaddleAccel->getValue(); - settings.setValue("paccel", accel); - Paddles::setAnalogAccel(accel); + // Paddle linearity (analog) + int linearity = myPaddleLinearity->getValue(); + settings.setValue("plinear", linearity); + Paddles::setAnalogLinearity(linearity); // Paddle dejitter (analog) int dejitter = myDejitterBase->getValue(); @@ -539,8 +537,8 @@ void InputDialog::setDefaults() // Paddle speed (analog) myPaddleSpeed->setValue(20); - // Paddle acceleration - myPaddleAccel->setValue(0); + // Paddle linearity + myPaddleLinearity->setValue(100); #if defined(RETRON77) myDejitterBase->setValue(2); myDejitterDiff->setValue(6); @@ -700,11 +698,13 @@ void InputDialog::handleCommand(CommandSender* sender, int cmd, break; case kDDeadzoneChanged: - myDigitalDeadzone->setValueLabel(std::round(Controller::digitalDeadZoneValue(myDigitalDeadzone->getValue()) * 100.f / 32768)); + myDigitalDeadzone->setValueLabel(std::round(Controller::digitalDeadZoneValue(myDigitalDeadzone->getValue()) * 100.f / + (Paddles::ANALOG_RANGE / 2))); break; case kADeadzoneChanged: - myAnalogDeadzone->setValueLabel(std::round(myAnalogDeadzone->getValue() * 100.f / 32768)); + myAnalogDeadzone->setValueLabel(std::round(Controller::analogDeadZoneValue(myAnalogDeadzone->getValue()) * 100.f / + (Paddles::ANALOG_RANGE / 2))); break; case kPSpeedChanged: @@ -712,10 +712,6 @@ void InputDialog::handleCommand(CommandSender* sender, int cmd, myPaddleSpeed->getValue()) * 100.F)); break; - case kPAccelChanged: - updatePaddleAccel(); - break; - case kDejitterAvChanged: updateDejitterAveraging(); break; @@ -791,13 +787,6 @@ void InputDialog::handleCommand(CommandSender* sender, int cmd, } } -void InputDialog::updatePaddleAccel() -{ - int strength = myPaddleAccel->getValue(); - - myPaddleAccel->setValueLabel(strength ? std::to_string(strength) + "%" : "Off"); -} - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void InputDialog::updateDejitterAveraging() { diff --git a/src/gui/InputDialog.hxx b/src/gui/InputDialog.hxx index 793b59a57..e5a2d1ced 100644 --- a/src/gui/InputDialog.hxx +++ b/src/gui/InputDialog.hxx @@ -64,7 +64,6 @@ class InputDialog : public Dialog void handleMouseControlState(); void handleCursorState(); - void updatePaddleAccel(); void updateDejitterAveraging(); void updateDejitterReaction(); void updateAutoFireRate(); @@ -75,7 +74,6 @@ class InputDialog : public Dialog kDDeadzoneChanged = 'DDch', kADeadzoneChanged = 'ADch', kPSpeedChanged = 'Ppch', - kPAccelChanged = 'PAch', kDejitterAvChanged = 'JAch', kDejitterReChanged = 'JRch', kDPSpeedChanged = 'DSch', @@ -102,7 +100,7 @@ class InputDialog : public Dialog SliderWidget* myDigitalDeadzone{nullptr}; SliderWidget* myAnalogDeadzone{nullptr}; SliderWidget* myPaddleSpeed{nullptr}; - SliderWidget* myPaddleAccel{nullptr}; + SliderWidget* myPaddleLinearity{nullptr}; SliderWidget* myDejitterBase{nullptr}; SliderWidget* myDejitterDiff{nullptr}; SliderWidget* myDPaddleSpeed{nullptr};