2020-12-13 21:50:41 +01:00
|
|
|
#pragma once
|
2020-12-13 00:00:45 +01:00
|
|
|
|
2021-02-11 23:27:33 +01:00
|
|
|
#include "hid_pad_handler.h"
|
2020-12-13 00:00:45 +01:00
|
|
|
|
2020-12-22 16:04:08 +01:00
|
|
|
#include <unordered_map>
|
|
|
|
|
|
2021-02-11 23:27:33 +01:00
|
|
|
class DualSenseDevice : public HidDevice
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
enum class DualSenseDataMode
|
|
|
|
|
{
|
|
|
|
|
Simple,
|
|
|
|
|
Enhanced
|
|
|
|
|
};
|
|
|
|
|
|
2021-02-13 01:25:39 +01:00
|
|
|
bool bt_controller{false};
|
2021-02-11 23:27:33 +01:00
|
|
|
u8 bt_sequence{0};
|
|
|
|
|
bool has_calib_data{false};
|
|
|
|
|
std::array<CalibData, CalibIndex::COUNT> calib_data{};
|
2021-02-13 01:25:39 +01:00
|
|
|
DualSenseDataMode data_mode{DualSenseDataMode::Simple};
|
2021-02-11 23:27:33 +01:00
|
|
|
bool init_lightbar{true};
|
|
|
|
|
bool update_lightbar{true};
|
|
|
|
|
bool update_player_leds{true};
|
2022-10-22 01:58:45 +02:00
|
|
|
bool release_leds{false};
|
2021-03-05 22:08:13 +01:00
|
|
|
|
|
|
|
|
// Controls for lightbar pulse. This seems somewhat hacky for now, as I haven't found out a nicer way.
|
|
|
|
|
bool lightbar_on{false};
|
|
|
|
|
bool lightbar_on_old{false};
|
|
|
|
|
steady_clock::time_point last_lightbar_time;
|
2021-02-11 23:27:33 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class dualsense_pad_handler final : public hid_pad_handler<DualSenseDevice>
|
2020-12-13 00:00:45 +01:00
|
|
|
{
|
|
|
|
|
enum DualSenseKeyCodes
|
|
|
|
|
{
|
2021-08-08 16:45:45 +02:00
|
|
|
None = 0,
|
|
|
|
|
|
|
|
|
|
Triangle,
|
2020-12-13 00:00:45 +01:00
|
|
|
Circle,
|
|
|
|
|
Cross,
|
|
|
|
|
Square,
|
|
|
|
|
Left,
|
|
|
|
|
Right,
|
|
|
|
|
Up,
|
|
|
|
|
Down,
|
|
|
|
|
R1,
|
|
|
|
|
R3,
|
|
|
|
|
L1,
|
|
|
|
|
L3,
|
|
|
|
|
Share,
|
|
|
|
|
Options,
|
|
|
|
|
PSButton,
|
2021-02-08 21:07:27 +01:00
|
|
|
Mic,
|
2020-12-13 00:00:45 +01:00
|
|
|
TouchPad,
|
|
|
|
|
|
|
|
|
|
L2,
|
|
|
|
|
R2,
|
|
|
|
|
|
|
|
|
|
LSXNeg,
|
|
|
|
|
LSXPos,
|
|
|
|
|
LSYNeg,
|
|
|
|
|
LSYPos,
|
|
|
|
|
RSXNeg,
|
|
|
|
|
RSXPos,
|
|
|
|
|
RSYNeg,
|
2021-08-08 16:45:45 +02:00
|
|
|
RSYPos
|
2020-12-13 00:00:45 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
dualsense_pad_handler();
|
|
|
|
|
~dualsense_pad_handler();
|
|
|
|
|
|
2022-10-21 22:35:31 +02:00
|
|
|
void SetPadData(const std::string& padId, u8 player_id, u8 large_motor, u8 small_motor, s32 r, s32 g, s32 b, bool player_led, bool battery_led, u32 battery_led_brightness) override;
|
2021-03-03 00:33:10 +01:00
|
|
|
u32 get_battery_level(const std::string& padId) override;
|
2021-08-10 21:45:26 +02:00
|
|
|
void init_config(cfg_pad* cfg) override;
|
2020-12-13 00:00:45 +01:00
|
|
|
|
|
|
|
|
private:
|
2021-04-07 23:05:18 +02:00
|
|
|
bool get_calibration_data(DualSenseDevice* dualsense_device) const;
|
2020-12-13 00:00:45 +01:00
|
|
|
|
2021-04-07 23:05:18 +02:00
|
|
|
DataStatus get_data(DualSenseDevice* device) override;
|
2021-02-12 02:44:26 +01:00
|
|
|
void check_add_device(hid_device* hidDevice, std::string_view path, std::wstring_view wide_serial) override;
|
|
|
|
|
int send_output_report(DualSenseDevice* device) override;
|
|
|
|
|
|
2022-10-15 12:41:21 +02:00
|
|
|
bool get_is_left_trigger(const std::shared_ptr<PadDevice>& device, u64 keyCode) override;
|
|
|
|
|
bool get_is_right_trigger(const std::shared_ptr<PadDevice>& device, u64 keyCode) override;
|
|
|
|
|
bool get_is_left_stick(const std::shared_ptr<PadDevice>& device, u64 keyCode) override;
|
|
|
|
|
bool get_is_right_stick(const std::shared_ptr<PadDevice>& device, u64 keyCode) override;
|
2020-12-13 00:00:45 +01:00
|
|
|
PadHandlerBase::connection update_connection(const std::shared_ptr<PadDevice>& device) override;
|
|
|
|
|
std::unordered_map<u64, u16> get_button_values(const std::shared_ptr<PadDevice>& device) override;
|
2020-12-14 14:33:43 +01:00
|
|
|
pad_preview_values get_preview_values(const std::unordered_map<u64, u16>& data) override;
|
2022-08-13 09:56:04 +02:00
|
|
|
void get_extended_info(const pad_ensemble& binding) override;
|
|
|
|
|
void apply_pad_data(const pad_ensemble& binding) override;
|
2020-12-13 00:00:45 +01:00
|
|
|
};
|