nintendo
This commit is contained in:
parent
4c84bce171
commit
debd4b7b0c
|
@ -172,88 +172,34 @@ void JoyconDriver::InputThread(std::stop_token stop_token) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void JoyconDriver::OnNewData(std::span<u8> buffer) {
|
void JoyconDriver::OnNewData(std::span<u8> buffer) {
|
||||||
|
const u8 report_mode_byte = buffer[0];
|
||||||
const auto report_mode = static_cast<ReportMode>(buffer[0]);
|
const auto report_mode = static_cast<ReportMode>(buffer[0]);
|
||||||
|
|
||||||
// Packages can be a little bit inconsistent. Average the delta time to provide a smoother
|
if (report_mode_byte > 0x33 || ((1L << report_mode_byte) & 0xf000a00000000U) == 0) {
|
||||||
// motion experience
|
// ParceUSBMode();
|
||||||
switch (report_mode) {
|
}
|
||||||
case ReportMode::STANDARD_FULL_60HZ:
|
|
||||||
case ReportMode::NFC_IR_MODE_60HZ:
|
u8 motion_samples = 0;
|
||||||
case ReportMode::SIMPLE_HID_MODE: {
|
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 now = std::chrono::steady_clock::now();
|
||||||
const auto new_delta_time = static_cast<u64>(
|
const auto new_delta_time = static_cast<u64>(
|
||||||
std::chrono::duration_cast<std::chrono::microseconds>(now - last_update).count());
|
std::chrono::duration_cast<std::chrono::microseconds>(now - last_update).count());
|
||||||
delta_time = ((delta_time * 8) + (new_delta_time * 2)) / 10;
|
delta_time = ((delta_time * 8) + (new_delta_time * 2)) / 10;
|
||||||
last_update = now;
|
last_update = now;
|
||||||
joycon_poller->UpdateColor(color);
|
motion_samples = 3;
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const MotionStatus motion_status{
|
if (irs_enabled) {
|
||||||
.is_enabled = motion_enabled,
|
motion_samples = 2;
|
||||||
.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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const RingStatus ring_status{
|
const bool is_not_reply_or_state =
|
||||||
.is_enabled = ring_connected,
|
report_mode != ReportMode::SUBCMD_REPLY && report_mode != ReportMode::MCU_UPDATE_STATE;
|
||||||
.default_value = ring_calibration.default_value,
|
|
||||||
.max_value = ring_calibration.max_value,
|
|
||||||
.min_value = ring_calibration.min_value,
|
|
||||||
};
|
|
||||||
|
|
||||||
if (irs_protocol->IsEnabled()) {
|
joycon_poller->ReadActiveMode(buffer, motion);
|
||||||
irs_protocol->RequestImage(buffer);
|
|
||||||
joycon_poller->UpdateCamera(irs_protocol->GetImage(), irs_protocol->GetIrsFormat());
|
|
||||||
}
|
|
||||||
|
|
||||||
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() {
|
Common::Input::DriverResult JoyconDriver::SetPollingMode() {
|
||||||
|
|
|
@ -16,6 +16,13 @@ void JoyconPoller::SetCallbacks(const JoyconCallbacks& callbacks_) {
|
||||||
callbacks = std::move(callbacks_);
|
callbacks = std::move(callbacks_);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void JoyconPoller::ReadButtonAndMotionInput(std::span<u8> buffer, const MotionStatus& motion_status,
|
||||||
|
std::size_t motion_samples, bool is_not_reply_or_state) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void JoyconPoller::ReadActiveMode(std::span<u8> buffer, const MotionStatus& motion_status,
|
void JoyconPoller::ReadActiveMode(std::span<u8> buffer, const MotionStatus& motion_status,
|
||||||
const RingStatus& ring_status) {
|
const RingStatus& ring_status) {
|
||||||
InputReportActive data{};
|
InputReportActive data{};
|
||||||
|
|
|
@ -24,6 +24,10 @@ public:
|
||||||
|
|
||||||
void SetCallbacks(const JoyconCallbacks& callbacks_);
|
void SetCallbacks(const JoyconCallbacks& callbacks_);
|
||||||
|
|
||||||
|
/// Handles data from active packages
|
||||||
|
void ReadButtonAndMotionInput(std::span<u8> buffer, const MotionStatus& motion_status,
|
||||||
|
std::size_t motion_samples, bool is_not_reply_or_state);
|
||||||
|
|
||||||
/// Handles data from passive packages
|
/// Handles data from passive packages
|
||||||
void ReadPassiveMode(std::span<u8> buffer);
|
void ReadPassiveMode(std::span<u8> buffer);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue