diff options
Diffstat (limited to 'src/input_common')
| -rw-r--r-- | src/input_common/drivers/virtual_amiibo.cpp | 34 | ||||
| -rw-r--r-- | src/input_common/drivers/virtual_amiibo.h | 2 | ||||
| -rw-r--r-- | src/input_common/drivers/virtual_gamepad.cpp | 16 | ||||
| -rw-r--r-- | src/input_common/drivers/virtual_gamepad.h | 12 | 
4 files changed, 55 insertions, 9 deletions
diff --git a/src/input_common/drivers/virtual_amiibo.cpp b/src/input_common/drivers/virtual_amiibo.cpp index 304f4c70b..f8bafe553 100644 --- a/src/input_common/drivers/virtual_amiibo.cpp +++ b/src/input_common/drivers/virtual_amiibo.cpp @@ -73,10 +73,7 @@ VirtualAmiibo::State VirtualAmiibo::GetCurrentState() const {  VirtualAmiibo::Info VirtualAmiibo::LoadAmiibo(const std::string& filename) {      const Common::FS::IOFile nfc_file{filename, Common::FS::FileAccessMode::Read,                                        Common::FS::FileType::BinaryFile}; - -    if (state != State::WaitingForAmiibo) { -        return Info::WrongDeviceState; -    } +    std::vector<u8> data{};      if (!nfc_file.IsOpen()) {          return Info::UnableToLoad; @@ -85,14 +82,14 @@ VirtualAmiibo::Info VirtualAmiibo::LoadAmiibo(const std::string& filename) {      switch (nfc_file.GetSize()) {      case AmiiboSize:      case AmiiboSizeWithoutPassword: -        nfc_data.resize(AmiiboSize); -        if (nfc_file.Read(nfc_data) < AmiiboSizeWithoutPassword) { +        data.resize(AmiiboSize); +        if (nfc_file.Read(data) < AmiiboSizeWithoutPassword) {              return Info::NotAnAmiibo;          }          break;      case MifareSize: -        nfc_data.resize(MifareSize); -        if (nfc_file.Read(nfc_data) < MifareSize) { +        data.resize(MifareSize); +        if (nfc_file.Read(data) < MifareSize) {              return Info::NotAnAmiibo;          }          break; @@ -101,7 +98,28 @@ VirtualAmiibo::Info VirtualAmiibo::LoadAmiibo(const std::string& filename) {      }      file_path = filename; +    return LoadAmiibo(data); +} + +VirtualAmiibo::Info VirtualAmiibo::LoadAmiibo(std::span<u8> data) { +    if (state != State::WaitingForAmiibo) { +        return Info::WrongDeviceState; +    } + +    switch (data.size_bytes()) { +    case AmiiboSize: +    case AmiiboSizeWithoutPassword: +        nfc_data.resize(AmiiboSize); +        break; +    case MifareSize: +        nfc_data.resize(MifareSize); +        break; +    default: +        return Info::NotAnAmiibo; +    } +      state = State::AmiiboIsOpen; +    memcpy(nfc_data.data(), data.data(), data.size_bytes());      SetNfc(identifier, {Common::Input::NfcState::NewAmiibo, nfc_data});      return Info::Success;  } diff --git a/src/input_common/drivers/virtual_amiibo.h b/src/input_common/drivers/virtual_amiibo.h index 488d00b31..34e97cd91 100644 --- a/src/input_common/drivers/virtual_amiibo.h +++ b/src/input_common/drivers/virtual_amiibo.h @@ -4,6 +4,7 @@  #pragma once  #include <array> +#include <span>  #include <string>  #include <vector> @@ -47,6 +48,7 @@ public:      State GetCurrentState() const;      Info LoadAmiibo(const std::string& amiibo_file); +    Info LoadAmiibo(std::span<u8> data);      Info ReloadAmiibo();      Info CloseAmiibo(); diff --git a/src/input_common/drivers/virtual_gamepad.cpp b/src/input_common/drivers/virtual_gamepad.cpp index 7db945aa6..c15cbbe58 100644 --- a/src/input_common/drivers/virtual_gamepad.cpp +++ b/src/input_common/drivers/virtual_gamepad.cpp @@ -39,6 +39,22 @@ void VirtualGamepad::SetStickPosition(std::size_t player_index, VirtualStick axi      SetStickPosition(player_index, static_cast<int>(axis_id), x_value, y_value);  } +void VirtualGamepad::SetMotionState(std::size_t player_index, u64 delta_timestamp, float gyro_x, +                                    float gyro_y, float gyro_z, float accel_x, float accel_y, +                                    float accel_z) { +    const auto identifier = GetIdentifier(player_index); +    const BasicMotion motion_data{ +        .gyro_x = gyro_x, +        .gyro_y = gyro_y, +        .gyro_z = gyro_z, +        .accel_x = accel_x, +        .accel_y = accel_y, +        .accel_z = accel_z, +        .delta_timestamp = delta_timestamp, +    }; +    SetMotion(identifier, 0, motion_data); +} +  void VirtualGamepad::ResetControllers() {      for (std::size_t i = 0; i < PlayerIndexCount; i++) {          SetStickPosition(i, VirtualStick::Left, 0.0f, 0.0f); diff --git a/src/input_common/drivers/virtual_gamepad.h b/src/input_common/drivers/virtual_gamepad.h index 3df91cc6f..dfbc45a28 100644 --- a/src/input_common/drivers/virtual_gamepad.h +++ b/src/input_common/drivers/virtual_gamepad.h @@ -52,7 +52,7 @@ public:      void SetButtonState(std::size_t player_index, VirtualButton button_id, bool value);      /** -     * Sets the status of all buttons bound with the key to released +     * Sets the status of a stick to a specific player index       * @param player_index the player number that will take this action       * @param axis_id the id of the axis to move       * @param x_value the position of the stick in the x axis @@ -62,6 +62,16 @@ public:      void SetStickPosition(std::size_t player_index, VirtualStick axis_id, float x_value,                            float y_value); +    /** +     * Sets the status of the motion sensor to a specific player index +     * @param player_index the player number that will take this action +     * @param delta_timestamp time passed since last reading +     * @param gyro_x,gyro_y,gyro_z the gyro sensor readings +     * @param accel_x,accel_y,accel_z the acelerometer reading +     */ +    void SetMotionState(std::size_t player_index, u64 delta_timestamp, float gyro_x, float gyro_y, +                        float gyro_z, float accel_x, float accel_y, float accel_z); +      /// Restores all inputs into the neutral position      void ResetControllers();  | 
