diff --git a/allynone.c b/allynone.c index 218d089..48a08f0 100644 --- a/allynone.c +++ b/allynone.c @@ -32,6 +32,7 @@ int main(int argc, char ** argv) { .gamepad_leds_control = true, .gamepad_rumble_control = true, .controller_bluetooth = false, + .dualsense_edge = false, }; load_out_config(&out_settings, configuration_file); diff --git a/config.cfg.default b/config.cfg.default index 6cb1260..3bb59ba 100644 --- a/config.cfg.default +++ b/config.cfg.default @@ -7,4 +7,5 @@ gamepad_rumble_control = true; gamepad_leds_control = true; m1m2_mode = 1; touchbar = true; -controller_bluetooth = false; \ No newline at end of file +controller_bluetooth = true; +dualsense_edge = false; \ No newline at end of file diff --git a/dev_out.c b/dev_out.c index 3d1707c..4a93843 100644 --- a/dev_out.c +++ b/dev_out.c @@ -8,8 +8,6 @@ #include "virt_mouse.h" #include "virt_kbd.h" -#include - static void handle_incoming_message_gamepad_action( const dev_out_settings_t *const in_settings, const in_message_gamepad_action_t *const msg_payload, @@ -442,7 +440,12 @@ void *dev_out_thread_func(void *ptr) { const int64_t gamepad_report_timing_us = 1250; if (current_gamepad == GAMEPAD_DUALSENSE) { - const int ds5_init_res = virt_dualsense_init(&controller_data.ds5, dev_out_data->settings.controller_bluetooth); + const int ds5_init_res = virt_dualsense_init( + &controller_data.ds5, + dev_out_data->settings.controller_bluetooth, + dev_out_data->settings.dualsense_edge + ); + if (ds5_init_res != 0) { fprintf(stderr, "Unable to initialize the DualSense device: %d\n", ds5_init_res); } else { @@ -450,7 +453,11 @@ void *dev_out_thread_func(void *ptr) { printf("DualSense initialized: fd=%d, bluetooth=%s\n", current_gamepad_fd, dev_out_data->settings.controller_bluetooth ? "true" : "false"); } } else if (current_gamepad == GAMEPAD_DUALSHOCK) { - const int ds4_init_res = virt_dualshock_init(&controller_data.ds4, dev_out_data->settings.controller_bluetooth); + const int ds4_init_res = virt_dualshock_init( + &controller_data.ds4, + dev_out_data->settings.controller_bluetooth + ); + if (ds4_init_res != 0) { fprintf(stderr, "Unable to initialize the DualShock device: %d\n", ds4_init_res); } else { diff --git a/settings.c b/settings.c index 15f0c7b..57d6a1b 100644 --- a/settings.c +++ b/settings.c @@ -106,6 +106,13 @@ void load_out_config(dev_out_settings_t *const out_conf, const char* const filep fprintf(stderr, "controller_bluetooth (bool) configuration not found. Default value will be used.\n"); } + int dualsense_edge; + if (config_lookup_bool(&cfg, "dualsense_edge", &dualsense_edge) != CONFIG_FALSE) { + out_conf->dualsense_edge = dualsense_edge; + } else { + fprintf(stderr, "dualsense_edge (bool) configuration not found. Default value will be used.\n"); + } + config_destroy(&cfg); load_out_config_err: diff --git a/settings.h b/settings.h index 8a9af80..1006db0 100644 --- a/settings.h +++ b/settings.h @@ -18,6 +18,7 @@ typedef struct dev_out_settings { bool gamepad_leds_control; bool gamepad_rumble_control; bool controller_bluetooth; + bool dualsense_edge; } dev_out_settings_t; void load_out_config(dev_out_settings_t *const out_conf, const char* const filepath); \ No newline at end of file diff --git a/stray_ally.c b/stray_ally.c index bf395db..0847e52 100644 --- a/stray_ally.c +++ b/stray_ally.c @@ -18,6 +18,7 @@ int main(int argc, char ** argv) { .gamepad_leds_control = true, .gamepad_rumble_control = true, .controller_bluetooth = false, + .dualsense_edge = false, }; load_out_config(&out_settings, configuration_file); diff --git a/virt_ds5.c b/virt_ds5.c index 3e55074..c17b98a 100644 --- a/virt_ds5.c +++ b/virt_ds5.c @@ -40,10 +40,16 @@ static uint8_t PS_INPUT_CRC32_SEED = 0xA1; static uint8_t PS_OUTPUT_CRC32_SEED = 0xA2; static uint8_t PS_FEATURE_CRC32_SEED = 0xA3; +#define DS5_EDGE_NAME "Sony Corp. DualSense Edge wireless controller (PS5)" #define DS5_EDGE_VERSION 256 #define DS5_EDGE_VENDOR 0x054C #define DS5_EDGE_PRODUCT 0x0DF2 +#define DS5_NAME "Sony Corp. DualSense Edge wireless controller (PS5)" +#define DS5_VERSION 256 +#define DS5_VENDOR 0x054C +#define DS5_PRODUCT 0x0DF2 + static const char* path = "/dev/uhid"; //static const char* const MAC_ADDR_STR = "e8:47:3a:d6:e7:74"; @@ -890,22 +896,32 @@ static int uhid_write(int fd, const struct uhid_event *ev) } } -static int create(int fd, bool bluetooth) +static int create(int fd, bool bluetooth, bool dualsense_edge) { struct uhid_event ev; + char uniq[sizeof(ev.u.create.uniq)]; + sprintf(uniq, "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx", + MAC_ADDR[5], MAC_ADDR[4], MAC_ADDR[3], MAC_ADDR[2], MAC_ADDR[1], MAC_ADDR[0] + ); + memset(&ev, 0, sizeof(ev)); ev.type = UHID_CREATE; - strcpy((char*)ev.u.create.name, "Sony Corp. DualSense Edge wireless controller (PS5)"); - ev.u.create.rd_data = bluetooth ? rdesc_bt : rdesc; + + if (dualsense_edge) { + strcpy((char*)ev.u.create.name, DS5_EDGE_NAME); + } else { + strcpy((char*)ev.u.create.name, DS5_NAME); + } + + ev.u.create.rd_data = bluetooth ? rdesc_bt : rdesc; ev.u.create.rd_size = bluetooth ? sizeof(rdesc_bt) : sizeof(rdesc); ev.u.create.bus = bluetooth ? BUS_BLUETOOTH : BUS_USB; - ev.u.create.vendor = DS5_EDGE_VENDOR; - ev.u.create.product = DS5_EDGE_PRODUCT; - ev.u.create.version = DS5_EDGE_VERSION; + ev.u.create.vendor = dualsense_edge ? DS5_EDGE_VENDOR : DS5_VENDOR; + ev.u.create.product = dualsense_edge ? DS5_EDGE_PRODUCT : DS5_PRODUCT; + ev.u.create.version = dualsense_edge ? DS5_EDGE_VERSION : DS5_VERSION; ev.u.create.country = 0; - memset(&ev.u.create.uniq, 0, sizeof(ev.u.create.uniq)); - memcpy(&ev.u.create.uniq, (void*)MAC_ADDR, sizeof(MAC_ADDR)); + memcpy(&ev.u.create.uniq, (void*)uniq, sizeof(uniq)); return uhid_write(fd, &ev); } @@ -920,9 +936,10 @@ static void destroy(int fd) uhid_write(fd, &ev); } -int virt_dualsense_init(virt_dualsense_t *const out_gamepad, bool bluetooth) { +int virt_dualsense_init(virt_dualsense_t *const out_gamepad, bool bluetooth, bool dualsense_edge) { int ret = 0; + out_gamepad->edge_model = dualsense_edge; out_gamepad->bluetooth = bluetooth; out_gamepad->dt_sum = 0; out_gamepad->dt_buffer_current = 0; @@ -939,7 +956,7 @@ int virt_dualsense_init(virt_dualsense_t *const out_gamepad, bool bluetooth) { goto virt_dualshock_init_err; } - ret = create(out_gamepad->fd, bluetooth); + ret = create(out_gamepad->fd, bluetooth, dualsense_edge); if (ret) { fprintf(stderr, "Error creating uhid device: %d\n", ret); close(out_gamepad->fd); diff --git a/virt_ds5.h b/virt_ds5.h index 0d111a9..282f505 100644 --- a/virt_ds5.h +++ b/virt_ds5.h @@ -15,6 +15,8 @@ typedef struct virt_dualsense { bool bluetooth; + bool edge_model; + uint8_t seq_num; uint32_t dt_sum; @@ -25,15 +27,33 @@ typedef struct virt_dualsense { int64_t last_time; } virt_dualsense_t; -int virt_dualsense_init(virt_dualsense_t *const gamepad, bool bluetooth); +int virt_dualsense_init( + virt_dualsense_t *const gamepad, + bool bluetooth, + bool dualsense_edge +); -int virt_dualsense_get_fd(virt_dualsense_t *const gamepad); +int virt_dualsense_get_fd( + virt_dualsense_t *const gamepad +); -int virt_dualsense_event(virt_dualsense_t *const gamepad, gamepad_status_t *const out_device_status); +int virt_dualsense_event( + virt_dualsense_t *const gamepad, + gamepad_status_t *const out_device_status +); -void virt_dualsense_compose(virt_dualsense_t *const gamepad, gamepad_status_t *const in_device_status, uint8_t *const out_buf); +void virt_dualsense_compose( + virt_dualsense_t *const gamepad, + gamepad_status_t *const in_device_status, + uint8_t *const out_buf +); -int virt_dualsense_send(virt_dualsense_t *const gamepad, uint8_t *const out_buf); +int virt_dualsense_send( + virt_dualsense_t *const gamepad, + uint8_t *const out_buf +); -void virt_dualsense_close(virt_dualsense_t *const gamepad); +void virt_dualsense_close( + virt_dualsense_t *const gamepad +);