From fcf648bbb20babb2319ff166f11dc21995488283 Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Thu, 2 Oct 2025 17:43:33 -0400 Subject: [PATCH] Flip axes, maximise range. --- Inputs/Joystick.hpp | 29 +++++++++++++++++++++------- Machines/Acorn/BBCMicro/BBCMicro.cpp | 22 ++++++++++++++++++--- 2 files changed, 41 insertions(+), 10 deletions(-) diff --git a/Inputs/Joystick.hpp b/Inputs/Joystick.hpp index 31150b7b7..0e5628334 100644 --- a/Inputs/Joystick.hpp +++ b/Inputs/Joystick.hpp @@ -168,7 +168,8 @@ public: if(stick_types_.size() < required_size) { stick_types_.resize(required_size); } - stick_types_[size_t(input.info.control.index)] = is_digital_axis ? StickType::Digital : StickType::Analogue; + stick_types_[size_t(input.info.control.index)] = + is_digital_axis ? StickType::Digital : StickType::Analogue; } } } @@ -188,11 +189,21 @@ public: // convenient hard-coded values. TODO: make these a function of time. using Type = Joystick::Input::Type; switch(input.type) { - default: did_set_input(input, is_active ? 1.0f : 0.0f); break; - case Type::Left: did_set_input(Input(Type::Horizontal, input.info.control.index), is_active ? 0.1f : 0.5f); break; - case Type::Right: did_set_input(Input(Type::Horizontal, input.info.control.index), is_active ? 0.9f : 0.5f); break; - case Type::Up: did_set_input(Input(Type::Vertical, input.info.control.index), is_active ? 0.1f : 0.5f); break; - case Type::Down: did_set_input(Input(Type::Vertical, input.info.control.index), is_active ? 0.9f : 0.5f); break; + default: + did_set_input(input, is_active ? 1.0f : 0.0f); + break; + case Type::Left: + did_set_input(Input(Type::Horizontal, input.info.control.index), is_active ? digital_minimum() : 0.5f); + break; + case Type::Right: + did_set_input(Input(Type::Horizontal, input.info.control.index), is_active ? digital_maximum() : 0.5f); + break; + case Type::Up: + did_set_input(Input(Type::Vertical, input.info.control.index), is_active ? digital_minimum() : 0.5f); + break; + case Type::Down: + did_set_input(Input(Type::Vertical, input.info.control.index), is_active ? digital_maximum() : 0.5f); + break; } } @@ -206,7 +217,9 @@ public: // Otherwise apply a threshold test to convert to digital, with remapping from axes to digital inputs. using Type = Joystick::Input::Type; switch(input.type) { - default: did_set_input(input, value > 0.5f); break; + default: + did_set_input(input, value > 0.5f); + break; case Type::Horizontal: did_set_input(Input(Type::Left, input.info.control.index), value <= 0.25f); did_set_input(Input(Type::Right, input.info.control.index), value >= 0.75f); @@ -221,6 +234,8 @@ public: protected: virtual void did_set_input([[maybe_unused]] const Input &input, [[maybe_unused]] float value) {} virtual void did_set_input([[maybe_unused]] const Input &input, [[maybe_unused]] bool value) {} + virtual float digital_minimum() const { return 0.1f; } + virtual float digital_maximum() const { return 0.9f; } private: const std::vector inputs_; diff --git a/Machines/Acorn/BBCMicro/BBCMicro.cpp b/Machines/Acorn/BBCMicro/BBCMicro.cpp index cca5ec3eb..fca468cd1 100644 --- a/Machines/Acorn/BBCMicro/BBCMicro.cpp +++ b/Machines/Acorn/BBCMicro/BBCMicro.cpp @@ -61,11 +61,20 @@ public: first_channel_(first_channel) {} void did_set_input(const Input &input, const float value) final { - adc_.set_input(first_channel_ + (input.type == Input::Vertical), value); + switch(input.type) { + case Input::Horizontal: + case Input::Vertical: + adc_.set_input(first_channel_ + (input.type == Input::Vertical), 1.0f - value); + break; + + default: break; + } } - void did_set_input(const Input &, const bool is_active) final { - fire_ = is_active; + void did_set_input(const Input &input, const bool is_active) final { + if(input.type == Input::Fire) { + fire_ = is_active; + } } bool fire() const { @@ -73,6 +82,13 @@ public: } private: + float digital_minimum() const final { + return 0.0f; + } + float digital_maximum() const final { + return 1.0f; + } + NEC::uPD7002 &adc_; const int first_channel_; bool fire_ = false;