poller.h 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. // Based on dkms-hid-nintendo implementation, CTCaer joycon toolkit and dekuNukem reverse
  4. // engineering https://github.com/nicman23/dkms-hid-nintendo/blob/master/src/hid-nintendo.c
  5. // https://github.com/CTCaer/jc_toolkit
  6. // https://github.com/dekuNukem/Nintendo_Switch_Reverse_Engineering
  7. #pragma once
  8. #include <functional>
  9. #include <span>
  10. #include "input_common/helpers/joycon_protocol/joycon_types.h"
  11. namespace InputCommon::Joycon {
  12. // Handles input packages and triggers the corresponding input events
  13. class JoyconPoller {
  14. public:
  15. JoyconPoller(ControllerType device_type_, JoyStickCalibration left_stick_calibration_,
  16. JoyStickCalibration right_stick_calibration_,
  17. MotionCalibration motion_calibration_);
  18. void SetCallbacks(const Joycon::JoyconCallbacks& callbacks_);
  19. /// Handles data from passive packages
  20. void ReadPassiveMode(std::span<u8> buffer);
  21. /// Handles data from active packages
  22. void ReadActiveMode(std::span<u8> buffer, const MotionStatus& motion_status,
  23. const RingStatus& ring_status);
  24. /// Handles data from nfc or ir packages
  25. void ReadNfcIRMode(std::span<u8> buffer, const MotionStatus& motion_status);
  26. void UpdateColor(const Color& color);
  27. void UpdateRing(s16 value, const RingStatus& ring_status);
  28. void UpdateAmiibo(const std::vector<u8>& amiibo_data);
  29. void UpdateCamera(const std::vector<u8>& amiibo_data, IrsResolution format);
  30. private:
  31. void UpdateActiveLeftPadInput(const InputReportActive& input,
  32. const MotionStatus& motion_status);
  33. void UpdateActiveRightPadInput(const InputReportActive& input,
  34. const MotionStatus& motion_status);
  35. void UpdateActiveProPadInput(const InputReportActive& input, const MotionStatus& motion_status);
  36. void UpdatePasiveLeftPadInput(const InputReportPassive& buffer);
  37. void UpdatePasiveRightPadInput(const InputReportPassive& buffer);
  38. void UpdatePasiveProPadInput(const InputReportPassive& buffer);
  39. /// Returns a calibrated joystick axis from raw axis data
  40. f32 GetAxisValue(u16 raw_value, Joycon::JoyStickAxisCalibration calibration) const;
  41. /// Returns a calibrated accelerometer axis from raw motion data
  42. f32 GetAccelerometerValue(s16 raw, const MotionSensorCalibration& cal,
  43. AccelerometerSensitivity sensitivity) const;
  44. /// Returns a calibrated gyro axis from raw motion data
  45. f32 GetGyroValue(s16 raw_value, const MotionSensorCalibration& cal,
  46. GyroSensitivity sensitivity) const;
  47. /// Returns a raw motion value from a buffer
  48. s16 GetRawIMUValues(size_t sensor, size_t axis, const InputReportActive& input) const;
  49. /// Returns motion data from a buffer
  50. MotionData GetMotionInput(const InputReportActive& input,
  51. const MotionStatus& motion_status) const;
  52. ControllerType device_type{};
  53. // Device calibration
  54. JoyStickCalibration left_stick_calibration{};
  55. JoyStickCalibration right_stick_calibration{};
  56. MotionCalibration motion_calibration{};
  57. Joycon::JoyconCallbacks callbacks{};
  58. };
  59. } // namespace InputCommon::Joycon