Skip to content

Commit 2ab1550

Browse files
authored
feat(hid): Update hid-rp to have support for Dualshock 4 hid report. (#574)
1 parent 186ef56 commit 2ab1550

File tree

8 files changed

+858
-5
lines changed

8 files changed

+858
-5
lines changed

components/hid-rp/example/main/hid_rp_example.cpp

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
#include "hid-rp-gamepad.hpp"
77
#include "hid-rp-playstation.hpp"
8+
#include "hid-rp-ps4.hpp"
89
#include "hid-rp-switch-pro.hpp"
910
#include "hid-rp-xbox.hpp"
1011
#include "hid-rp.hpp"
@@ -90,6 +91,23 @@ extern "C" void app_main(void) {
9091
}
9192
logger.info(" Data: [{}]", str);
9293

94+
using PS4DualShock4Input = espp::PS4DualShock4GamepadInputReport<>;
95+
PS4DualShock4Input ps4_input_report;
96+
logger.info("{}", ps4_input_report);
97+
logger.info("PS4 DualShock 4 Input Report Size: {}", ps4_input_report.get_report().size());
98+
logger.info("PS4 DualShock 4 Input Report Data: {::#04X}", ps4_input_report.get_report());
99+
100+
auto ps4_raw_descriptor = espp::ps4_dualshock4_descriptor();
101+
auto ps4_descriptor = std::vector<uint8_t>(ps4_raw_descriptor.begin(), ps4_raw_descriptor.end());
102+
103+
logger.info("PS4 DualShock 4 Report Descriptor:");
104+
logger.info(" Size: {}", ps4_descriptor.size());
105+
str = "";
106+
for (auto &byte : ps4_descriptor) {
107+
str += fmt::format("0x{:02X}, ", byte);
108+
}
109+
logger.info(" Data: [{}]", str);
110+
93111
GamepadInput::Hat hat = GamepadInput::Hat::UP_RIGHT;
94112
int button_index = 5;
95113
float angle = 2.0f * M_PI * button_index / num_buttons;
@@ -100,13 +118,15 @@ extern "C" void app_main(void) {
100118
switch_pro_input_report.reset();
101119
dualsense_simple_input_report.reset();
102120
dualsense_complex_input_report.reset();
121+
ps4_input_report.reset();
103122

104123
// print out the reports in their default states
105124
logger.info("{}", gamepad_input_report);
106125
logger.info("{}", xbox_input_report);
107126
logger.info("{}", switch_pro_input_report);
108127
logger.info("{}", dualsense_simple_input_report);
109128
logger.info("{}", dualsense_complex_input_report);
129+
logger.info("{}", ps4_input_report);
110130

111131
// update the gamepad input report
112132
logger.info("{}", gamepad_input_report);
@@ -140,6 +160,17 @@ extern "C" void app_main(void) {
140160
dualsense_complex_input_report.set_left_trigger(std::abs(cos(angle)));
141161
dualsense_complex_input_report.set_right_trigger(std::abs(sin(angle)));
142162

163+
ps4_input_report.set_hat(hat);
164+
ps4_input_report.set_button_cross(button_index == 1);
165+
ps4_input_report.set_button_circle(button_index == 2);
166+
ps4_input_report.set_button_square(button_index == 3);
167+
ps4_input_report.set_button_triangle(button_index == 4);
168+
ps4_input_report.set_left_joystick(128 + 127 * sin(angle), 128 + 127 * cos(angle));
169+
ps4_input_report.set_right_joystick(128 + 127 * cos(angle), 128 + 127 * sin(angle));
170+
ps4_input_report.set_l2_trigger(std::abs(cos(angle)) * 255);
171+
ps4_input_report.set_r2_trigger(std::abs(sin(angle)) * 255);
172+
ps4_input_report.set_battery_level(8);
173+
143174
button_index = (button_index % num_buttons) + 1;
144175

145176
// send an input report
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
#pragma once
2+
3+
#include "format.hpp"
4+
5+
template <uint8_t REPORT_ID>
6+
struct fmt::formatter<espp::PS4DualShock4GamepadInputReport<REPORT_ID>> {
7+
template <typename ParseContext> constexpr auto parse(ParseContext &ctx) const {
8+
return ctx.begin();
9+
}
10+
11+
template <typename FormatContext>
12+
auto format(const espp::PS4DualShock4GamepadInputReport<REPORT_ID> &report,
13+
FormatContext &ctx) const {
14+
auto out = ctx.out();
15+
fmt::format_to(out, "PS4DualShock4GamepadInputReport {{");
16+
fmt::format_to(out, "left_stick: ({}, {}), ", report.get_left_joystick_x(),
17+
report.get_left_joystick_y());
18+
fmt::format_to(out, "right_stick: ({}, {}), ", report.get_right_joystick_x(),
19+
report.get_right_joystick_y());
20+
fmt::format_to(out, "triggers: (L2={}, R2={}), ", report.get_l2_trigger(),
21+
report.get_r2_trigger());
22+
fmt::format_to(out, "hat: {}, ", static_cast<int>(report.get_hat()));
23+
fmt::format_to(out, "buttons: [");
24+
fmt::format_to(out, "Square={}, Cross={}, Circle={}, Triangle={}, ", report.get_button_square(),
25+
report.get_button_cross(), report.get_button_circle(),
26+
report.get_button_triangle());
27+
fmt::format_to(out, "L1={}, R1={}, L2={}, R2={}, ", report.get_button_l1(),
28+
report.get_button_r1(), report.get_button_l2(), report.get_button_r2());
29+
fmt::format_to(out, "Share={}, Options={}, L3={}, R3={}, ", report.get_button_share(),
30+
report.get_button_options(), report.get_button_l3(), report.get_button_r3());
31+
fmt::format_to(out, "PS={}, Touchpad={}], ", report.get_button_home(),
32+
report.get_button_touchpad());
33+
fmt::format_to(out, "battery: {}%, charging: {}, ", report.get_battery_level(),
34+
report.get_battery_charging());
35+
auto gyro = report.get_gyroscope();
36+
auto accel = report.get_accelerometer();
37+
fmt::format_to(out, "gyro: ({}, {}, {}), ", gyro.X, gyro.Y, gyro.Z);
38+
fmt::format_to(out, "accel: ({}, {}, {}), ", accel.X, accel.Y, accel.Z);
39+
fmt::format_to(out, "timestamp: {}, counter: {}", report.get_timestamp(), report.get_counter());
40+
return fmt::format_to(out, "}}");
41+
}
42+
};
43+
44+
template <uint8_t REPORT_ID> struct fmt::formatter<espp::PS4DualShock4OutputReport<REPORT_ID>> {
45+
template <typename ParseContext> constexpr auto parse(ParseContext &ctx) const {
46+
return ctx.begin();
47+
}
48+
49+
template <typename FormatContext>
50+
auto format(const espp::PS4DualShock4OutputReport<REPORT_ID> &report, FormatContext &ctx) const {
51+
auto out = ctx.out();
52+
fmt::format_to(out, "PS4DualShock4OutputReport {{");
53+
fmt::format_to(out, "data: [{::#02X}]", report.data);
54+
return fmt::format_to(out, "}}");
55+
}
56+
};

0 commit comments

Comments
 (0)