#include "negcon.h" #include "common/assert.h" #include "common/log.h" #include "host_interface.h" #include "util/state_wrapper.h" #include #include NeGcon::NeGcon() { m_axis_state.fill(0x00); m_axis_state[static_cast(Axis::Steering)] = 0x80; } NeGcon::~NeGcon() = default; ControllerType NeGcon::GetType() const { return ControllerType::NeGcon; } std::optional NeGcon::GetAxisCodeByName(std::string_view axis_name) const { return StaticGetAxisCodeByName(axis_name); } std::optional NeGcon::GetButtonCodeByName(std::string_view button_name) const { return StaticGetButtonCodeByName(button_name); } void NeGcon::Reset() { m_transfer_state = TransferState::Idle; } bool NeGcon::DoState(StateWrapper& sw, bool apply_input_state) { if (!Controller::DoState(sw, apply_input_state)) return false; u16 button_state = m_button_state; sw.Do(&button_state); if (apply_input_state) m_button_state = button_state; sw.Do(&m_transfer_state); return true; } float NeGcon::GetAxisState(s32 axis_code) const { if (axis_code < 0 || axis_code >= static_cast(Axis::Count)) return 0.0f; if (axis_code == static_cast(Axis::Steering)) return (((static_cast(m_axis_state[static_cast(Axis::Steering)]) / 255.0f) * 2.0f) - 1.0f); else return (static_cast(m_axis_state[static_cast(axis_code)]) / 255.0f); } void NeGcon::SetAxisState(s32 axis_code, float value) { if (axis_code < 0 || axis_code >= static_cast(Axis::Count)) return; // Steering Axis: -1..1 -> 0..255 if (axis_code == static_cast(Axis::Steering)) { const float float_value = (std::abs(value) < m_steering_deadzone) ? 0.0f : std::copysign((std::abs(value) - m_steering_deadzone) / (1.0f - m_steering_deadzone), value); const u8 u8_value = static_cast(std::clamp(std::round(((float_value + 1.0f) / 2.0f) * 255.0f), 0.0f, 255.0f)); SetAxisState(static_cast(axis_code), u8_value); return; } // I, II, L: -1..1 -> 0..255 const u8 u8_value = static_cast(std::clamp(value * 255.0f, 0.0f, 255.0f)); SetAxisState(static_cast(axis_code), u8_value); } void NeGcon::SetAxisState(Axis axis, u8 value) { m_axis_state[static_cast(axis)] = value; } bool NeGcon::GetButtonState(s32 button_code) const { if (button_code < 0 || button_code >= static_cast(Button::Count)) return false; const u16 bit = u16(1) << static_cast(button_code); return ((m_button_state & bit) == 0); } void NeGcon::SetButtonState(s32 button_code, bool pressed) { if (button_code < 0 || button_code >= static_cast(Button::Count)) return; SetButtonState(static_cast