Ohjurot / DualSense-Windows

Windows API for the PS5 DualSense controller
Other
333 stars 37 forks source link
api bluetooth controler dualsense dualsense5 gamepad gamepad-api playstation ps5-controller sdk usb usb-hid

DualSense on Windows [API]

Windows API for the PS5 DualSense controller. Written in C++ for C++. This API will help you using the DualSense controller in your windows C++ Applications / Projects.

:exclamation: ​Warning: The current release state is still a preview release. The library may not work as intended!

Features

The library is still in active development and will be extended with additional features soon. Consider checking out our Road-map for further information.

Using the API

  1. Download the DualSenseWindows_VX.X.zip file from the latest release found at the Release Page
  2. Unzip the archive to your computer
  3. Read the DualSenseWindows.pdf PDF documentation to get the specific information for your current release

If you don't want to waste time reading the documentation - this is the minimal example on how to use the library:

#include <Windows.h>
#include <ds5w.h>
#include <iostream>

int main(int argc, char** argv){
    // Array of controller infos
    DS5W::DeviceEnumInfo infos[16];

    // Number of controllers found
    unsigned int controllersCount = 0;

    // Call enumerate function and switch on return value
    switch(DS5W::enumDevices(infos, 16, &controllersCount)){
        case DS5W_OK:
        // The buffer was not big enough. Ignore for now
        case DS5W_E_INSUFFICIENT_BUFFER:
            break;

        // Any other error will terminate the application
        default:
            // Insert your error handling
            return -1;
    }

    // Check number of controllers
    if(!controllersCount){
        return -1;
    }

    // Context for controller
    DS5W::DeviceContext con;

    // Init controller and close application is failed
    if(DS5W_FAILED(DS5W::initDeviceContext(&infos[0], &con))){
        return -1;
    }

    // Main loop
    while(true){
        // Input state
        DS5W::DS5InputState inState;

        // Retrieve data
        if (DS5W_SUCCESS(DS5W::getDeviceInputState(&con, &inState))){
            // Check for the Logo button
            if(inState.buttonsB & DS5W_ISTATE_BTN_B_PLAYSTATION_LOGO){
                // Break from while loop
                break;
            }

            // Create struct and zero it
            DS5W::DS5OutputState outState;
            ZeroMemory(&outState, sizeof(DS5W::DS5OutputState));

            // Set output data
            outState.leftRumble = inState.leftTrigger;
            outState.rightRumble = inState.rightTrigger;

            // Send output to the controller
            DS5W::setDeviceOutputState(&con, &outState);
        }
    }

    // Shutdown context
    DS5W::freeDeviceContext(&con);

    // Return zero
    return 0;
}

Known issues

Special thanks to

I have partially used the following sources to implement the functionality:

Important Informations about Trademarks