From debd4b7b0c95e59a00c2b6f27075269671a9e180 Mon Sep 17 00:00:00 2001 From: Narr the Reg Date: Thu, 13 Jul 2023 10:08:15 -0600 Subject: [PATCH] nintendo --- src/input_common/helpers/joycon_driver.cpp | 84 ++++--------------- .../helpers/joycon_protocol/poller.cpp | 7 ++ .../helpers/joycon_protocol/poller.h | 4 + 3 files changed, 26 insertions(+), 69 deletions(-) diff --git a/src/input_common/helpers/joycon_driver.cpp b/src/input_common/helpers/joycon_driver.cpp index cf51f3481..743cf2cb1 100644 --- a/src/input_common/helpers/joycon_driver.cpp +++ b/src/input_common/helpers/joycon_driver.cpp @@ -172,88 +172,34 @@ void JoyconDriver::InputThread(std::stop_token stop_token) { } void JoyconDriver::OnNewData(std::span buffer) { + const u8 report_mode_byte = buffer[0]; const auto report_mode = static_cast(buffer[0]); - // Packages can be a little bit inconsistent. Average the delta time to provide a smoother - // motion experience - switch (report_mode) { - case ReportMode::STANDARD_FULL_60HZ: - case ReportMode::NFC_IR_MODE_60HZ: - case ReportMode::SIMPLE_HID_MODE: { + if (report_mode_byte > 0x33 || ((1L << report_mode_byte) & 0xf000a00000000U) == 0) { + // ParceUSBMode(); + } + + u8 motion_samples = 0; + if (motion_enabled) { + // Packages can be a little bit inconsistent. Average the delta time to provide a smoother + // motion experience const auto now = std::chrono::steady_clock::now(); const auto new_delta_time = static_cast( std::chrono::duration_cast(now - last_update).count()); delta_time = ((delta_time * 8) + (new_delta_time * 2)) / 10; last_update = now; - joycon_poller->UpdateColor(color); - break; - } - default: - break; + motion_samples = 3; } - const MotionStatus motion_status{ - .is_enabled = motion_enabled, - .delta_time = delta_time, - .gyro_sensitivity = gyro_sensitivity, - .accelerometer_sensitivity = accelerometer_sensitivity, - }; - - // TODO: Remove this when calibration is properly loaded and not calculated - if (ring_connected && report_mode == ReportMode::STANDARD_FULL_60HZ) { - InputReportActive data{}; - memcpy(&data, buffer.data(), sizeof(InputReportActive)); - calibration_protocol->GetRingCalibration(ring_calibration, data.ring_input); + if (irs_enabled) { + motion_samples = 2; } - const RingStatus ring_status{ - .is_enabled = ring_connected, - .default_value = ring_calibration.default_value, - .max_value = ring_calibration.max_value, - .min_value = ring_calibration.min_value, - }; + const bool is_not_reply_or_state = + report_mode != ReportMode::SUBCMD_REPLY && report_mode != ReportMode::MCU_UPDATE_STATE; - if (irs_protocol->IsEnabled()) { - irs_protocol->RequestImage(buffer); - joycon_poller->UpdateCamera(irs_protocol->GetImage(), irs_protocol->GetIrsFormat()); - } + joycon_poller->ReadActiveMode(buffer, motion); - if (nfc_protocol->IsPolling()) { - if (amiibo_detected) { - if (!nfc_protocol->HasAmiibo()) { - joycon_poller->UpdateAmiibo({}); - amiibo_detected = false; - return; - } - } - - if (!amiibo_detected) { - Joycon::TagInfo tag_info; - const auto result = nfc_protocol->GetTagInfo(tag_info); - if (result == Common::Input::DriverResult::Success) { - joycon_poller->UpdateAmiibo(tag_info); - amiibo_detected = true; - } - } - } - - switch (report_mode) { - case ReportMode::STANDARD_FULL_60HZ: - joycon_poller->ReadActiveMode(buffer, motion_status, ring_status); - break; - case ReportMode::NFC_IR_MODE_60HZ: - joycon_poller->ReadNfcIRMode(buffer, motion_status); - break; - case ReportMode::SIMPLE_HID_MODE: - joycon_poller->ReadPassiveMode(buffer); - break; - case ReportMode::SUBCMD_REPLY: - LOG_DEBUG(Input, "Unhandled command reply"); - break; - default: - LOG_ERROR(Input, "Report mode not Implemented {}", report_mode); - break; - } } Common::Input::DriverResult JoyconDriver::SetPollingMode() { diff --git a/src/input_common/helpers/joycon_protocol/poller.cpp b/src/input_common/helpers/joycon_protocol/poller.cpp index 1aab9e12a..1f6c1978b 100644 --- a/src/input_common/helpers/joycon_protocol/poller.cpp +++ b/src/input_common/helpers/joycon_protocol/poller.cpp @@ -16,6 +16,13 @@ void JoyconPoller::SetCallbacks(const JoyconCallbacks& callbacks_) { callbacks = std::move(callbacks_); } + +void JoyconPoller::ReadButtonAndMotionInput(std::span buffer, const MotionStatus& motion_status, + std::size_t motion_samples, bool is_not_reply_or_state) { + +} + + void JoyconPoller::ReadActiveMode(std::span buffer, const MotionStatus& motion_status, const RingStatus& ring_status) { InputReportActive data{}; diff --git a/src/input_common/helpers/joycon_protocol/poller.h b/src/input_common/helpers/joycon_protocol/poller.h index 3746abe5d..e52fc15fd 100644 --- a/src/input_common/helpers/joycon_protocol/poller.h +++ b/src/input_common/helpers/joycon_protocol/poller.h @@ -24,6 +24,10 @@ public: void SetCallbacks(const JoyconCallbacks& callbacks_); + /// Handles data from active packages + void ReadButtonAndMotionInput(std::span buffer, const MotionStatus& motion_status, + std::size_t motion_samples, bool is_not_reply_or_state); + /// Handles data from passive packages void ReadPassiveMode(std::span buffer);