Jump to content


JoyShockLibrary 3.0

¿Quieres enterarte al momento de las nuevas descargas? Síguenos en Twitter, Mastodon o Threads!

El DualShock 4 de Sony PlayStation, el DualSense, los Joy-Cons de Nintendo Switch (usados por parejas) y el mando Pro de Nintendo Switch tienen mucho en común. Tienen muchas de las características que se esperan de los mandos de juego modernos. También tienen una entrada increíblemente versátil e infrautilizada que su mayor rival (el mando de la Xbox One de Microsoft) no tiene: el giroscopio.

El objetivo con JoyShockLibrary es permitir a los desarrolladores de juegos soportar DS4, DS, Joy-Cons, y Pro Controllers de forma nativa en los juegos de PC. He compilado la biblioteca para Windows, pero utiliza herramientas agnósticas, y espero que otros desarrolladores puedan hacerla funcionar en otras plataformas (como Linux o Mac) sin demasiados problemas.

Reference

JoyShockLibrary.h has everything you need to use the library, but here's a breakdown of everything in there.

Structs

struct JOY_SHOCK_STATE - This struct contains the state for all the sticks, buttons, and triggers on the controller. If you're just using JoyShockLibrary to be able to use JoyCons, Pro Controllers, and DualShock 4s similarly to how you'd use other devices, this has everything you need to know.

  • int buttons contains the states of all the controller's buttons with the following masks:
    • 0x00001 - d-pad up
    • 0x00002 - d-pad down
    • 0x00004 - d-pad left
    • 0x00008 - d-pad right
    • 0x00010 - + on Nintendo devices, Options on DS4
    • 0x00020 - - on Nintendo devices, Share on DS4
    • 0x00040 - left-stick click on Nintendo devices, L3 on DS4
    • 0x00080 - right-stick click on Nintendo devices, R3 on DS4
    • 0x00100 - L on Nintendo devices, L1 on DS4
    • 0x00200 - R on Nintendo devices, R1 on DS4
    • 0x00400 - ZL on Nintendo devices, L2 on DS4
    • 0x00800 - ZR on Nintendo devices, R2 on DS4
    • 0x01000 - the South face-button: B on Nintendo devices, ⨉ on DS4
    • 0x02000 - the East face-button: A on Nintendo devices, ○ on DS4
    • 0x04000 - the West face-button: Y on Nintendo devices, □ on DS4
    • 0x08000 - the North face-button: X on Nintendo devices, △ on DS4
    • 0x10000 - Home on Nintendo devices, PS on DS4
    • 0x20000 - Capture on Nintendo devices, touchpad click on DS4
    • 0x40000 - SL on Nintendo JoyCons
    • 0x80000 - SR on Nintendo JoyCons
  • float lTrigger - how far has the left trigger been pressed? This will be 1 or 0 on Nintendo devices, which don't have analog triggers
  • float rTrigger - how far has the right trigger been pressed? This will be 1 or 0 on Nintendo devices, which don't have analog triggers
  • float stickLX, stickLY - left-stick X axis and Y axis, respectively, from -1 to 1
  • float stickRX, stickRX - right-stick X axis and Y axis, respectively, from -1 to 1

struct IMU_STATE - Each supported device contains an IMU which has a 3-axis accelerometer and a 3-axis gyroscope. IMU_STATE is where you find that info.

  • float accelX, accelY, accelZ - accelerometer X axis, Y axis, and Z axis, respectively, in g (g-force).
  • float gyroX, gyroY, gyroZ - gyroscope angular velocity X, Y, and Z, respectively, in dps (degrees per second), when correctly calibrated.

Functions

All these functions should be thread-safe, and none of them should cause any harm if given the wrong handle. If they do, please report this to me as an isuse.

int JslConnectDevices() - Register any connected devices. Returns the number of devices connected, which is helpful for getting the handles for those devices with the next function.

int JslGetConnectedDeviceHandles(int* deviceHandleArray, int size) - Fills the array deviceHandleArray of size size with the handles for all connected devices, up to the length of the array. Use the length returned by JslConnectDevices to make sure you've got all connected devices' handles.

void JslDisconnectAndDisposeAll() - Disconnect devices, no longer polling them for input.

JOY_SHOCK_STATE JslGetSimpleState(int deviceId) - Get the latest button + trigger + stick state for the controller with the given id.

IMU_STATE JslGetIMUState(int deviceId) - Get the latest accelerometer + gyroscope state for the controller with the given id.

int JslGetButtons(int deviceId) - Get the latest button state for the controller with the given id. If you want more than just the buttons, it's more efficient to use JslGetSimpleState.

float JslGetLeftX/JslGetLeftY/JslGetRightX/JslGetRightY(int deviceId) - Get the latest stick state for the controller with the given id. If you want more than just a single stick axis, it's more efficient to use JslGetSimpleState.

float JslGetLeftTrigger/JslGetRightTrigger(int deviceId) - Get the latest trigger state for the controller with the given id. If you want more than just a single trigger, it's more efficient to use JslGetSimpleState.

float JslGetGyroX/JslGetGyroY/JslGetGyroZ(int deviceId) - Get the latest angular velocity for a given gyroscope axis. If you want more than just a single gyroscope axis velocity, it's more efficient to use JslGetIMUState.

float JslGetAccelX/JslGetAccelY/JslGetAccelZ(int deviceId) - Get the latest acceleration for a given axis. If you want more than just a accelerometer axis, it's more efficient to use JslGetIMUState.

float JslGetStickStep(int deviceId) - Different devices use different size data types and different ranges on those data types when reporting stick axes. For some calculations, it may be important to know the limits of the current device and work around them in different ways. This gives the smallest step size between two values for the given device's analog sticks.

float JslGetTriggerStep(int deviceId) - Some devices have analog triggers, some don't. For some calculations, it may be important to know the limits of the current device and work around them in different ways. This gives the smallest step size between two values for the given device's triggers, or 1.0 if they're actually just binary inputs.

float JslGetTriggerStep(int deviceId) - Some devices have analog triggers, some don't. For some calculations, it may be important to know the limits of the current device and work around them in different ways. This gives the smallest step size between two values for the given device's triggers, or 1.0 if they're actually just binary inputs.

float JslGetPollRate(int deviceId) - Different devices report back new information at different rates. For the given device, this gives how many times one would usually expect the device to report back per second.

void JslResetContinuousCalibration(int deviceId) - JoyShockLibrary has helpful functions for calibrating the gyroscope by averaging out its input over time. This deletes all calibration data that's been accumulated, if any, this session.

void JslStartContinuousCalibration(int deviceId) - Start collecting gyro data, recording the ongoing average and using that to offset gyro output.

void JslPauseContinuousCalibration(int deviceId) - Stop collecting gyro data, but don't delete it.

void JslGetCalibrationOffset(int deviceId, float& xOffset, float& yOffset, float& zOffset) - Get the calibrated offset value for the given device's gyro. You don't have to use it; all gyro output for this device is already being offset by this vector before leaving JoyShockLibrary.

void JslSetCalibrationOffset(int deviceId, float xOffset, float yOffset, float zOffset) - Manually set the calibrated offset value for the given device's gyro.

void JslSetCallback(void(*callback)(int, JOY_SHOCK_STATE, JOY_SHOCK_STATE, IMU_STATE, IMU_STATE, float)) - Set a callback function by which JoyShockLibrary can report the current state for each device. This callback will be given the deviceId for the reporting device, its current button + trigger + stick state, its previous button + trigger + stick state, its current accelerometer + gyro state, its previous accelerometer + gyro state, and the amount of time since the last report for this device (in seconds).

int JslGetControllerType(int deviceId) - What type of controller is this device?

  • Left JoyCon
  • Right JoyCon
  • Switch Pro Controller
  • DualShock 4

int JslGetControllerSplitType(int deviceId) - Is this a half-controller or full? If half, what kind?

  • Left half
  • Right half
  • Full controller

int JslGetControllerColour(int deviceId) - Get the colour of the controller. Only Nintendo devices support this. Others will report white.

void JslSetLightColour(int deviceId, int colour) - Set the light colour on the given controller. Only DualShock 4s support this. Players will often prefer to be able to disable the light, so make sure to give them that option, but when setting players up in a local multiplayer game, setting the light colour is a useful way to uniquely identify different controllers.

void JslSetPlayerNumber(int deviceId, int number) - Set the lights that indicate player number. This only works on Nintendo devices.

void JslSetRumble(int deviceId, int smallRumble, int bigRumble) - DualShock 4s have two types of rumble, and they can be set at the same time with different intensities. These can be set from 0 to 255. Nintendo devices support rumble as well, but totally differently. They call it "HD rumble", and it's a great feature, but JoyShockLibrary doesn't yet support it.

Known and Perceived Issues

Bluetooth connectivity

JoyShockLibrary doesn't yet support setting rumble and light colour for the DualShock 4 via Bluetooth.

JoyCons and Pro Controllers can only be connected by Bluetooth. Some Bluetooth adapters can't keep up with these devices, resulting in laggy input. This is especially common when more than one device is connected (such as when using a pair of JoyCons). There is nothing JoyShockMapper or JoyShockLibrary can do about this.

Gyro poll rate on Nintendo devices

The Nintendo devices report every 15ms, but their IMUs actually report every 5ms. Every 15ms report includes the last 3 gyro and accelerometer reports. When creating the latest IMU state for Nintendo devices, JoyShockLibrary averages out those 3 gyro and accelerometer reports, so that it can best include all that information in a sensible format. For things like controlling a cursor on a plane, this should be of little to no consequence, since the result is the same as adding all 3 reports separately over shorter time intervals. But for representing real 3D rotations of the controller, this causes the Nintendo devices to be slightly less accurate than they could be, because we're combining 3 rotations in a simplistic way.

In a future version I hope to either combine the 3 rotations in a way that works better in 3D, or to add a way for a single controller event to report several IMU events at the same time.

Credits

I'm Jibb Smart, and I made JoyShockLibrary.

JoyShockLibrary uses substantial portions of mfosse's JoyCon-Driver, a vJoy feeder for most communication with Nintendo devices, building on it with info from dekuNukem's Nintendo Switch Reverse Engineering page in order to (for example) unpack all gyro and accelerometer samples from each report.

JoyShockLibrary's DualShock 4 support would likely not be possible without the info available on PSDevWiki and Eleccelerator Wiki. chrippa's ds4drv was also a handy reference for getting rumble and lights working right away.

This software also relies on and links signal11's HIDAPI to connect to USB and Bluetooth devices. Since HIDAPI is linked statically, .objs are included. Since .objs may need to be compiled with the same compiler version as the dll itself, HIDAPI itself is included in a .zip.


Que novedades incluye la versión 3.0

Released

La versión 3 mejora la seguridad de los hilos y el comportamiento de JslConnectDevices para que pueda ser llamado sin restablecer las conexiones actuales. También mejora la calibración automática y añade funciones para ayudar a obtener una entrada de giroscopio útil y de alta resolución. También incluye un montón de nuevas características de calidad de vida.

Busque estas nuevas funciones en el README:

  • JslSetGyroSpace (opciones de giroscopio que se adaptan a la orientación preferida del controlador del jugador)
  • JslGetAndFlushAccumulatedGyro (obtiene el movimiento completo del giroscopio incluso cuando se sondea a baja velocidad)
  • JslSetConnectCallback
  • JslSetDisconnectCallback
  • JslGetTimeSinceLastUpdate
  • JslGetControllerInfoAndSettings
  • JslGetAutoCalibrationStatus

No te pierdas nada, síguenos en Twitter, Mastodon o Threads!
Preguntas, aportes y peticiones en el foro.

  • Contenido similar

    • Por Dekuwa
      Calibre es una aplicación para Windows, macOS y Linux que nos permite gestionar todo lo relacionado con nuestros eBooks, como pasar archivos .epub del ordenador a un lector de libros electrónicos como el Kindle, hacer copias de seguridad o administrar nuestra biblioteca, entre otras cosas.

      Como meter libros en Kindle utilizando Calibre
      Añadir libros a un Kindle en formato .epub utilizando Calibre es un proceso rápido y sencillo. Una vez tengamos descargado el archivo .epub del libro en cuestión solo tenemos que conectar el Kindle al ordenador, sea por WiFi o USB, y seguir estos pasos:
      Utilizar la opción "Añadir libro", situada en la parte superior izquierda, seleccionar el .epub y aceptar. Una vez añadido el libro a Calibre, simplemente elegimos la opción "Enviar al dispositivo" -> "Enviar formato específico para" -> "Memoria Principal". Aceptamos, esperamos que termine y listo, ya lo tendremos en nuestra biblioteca de Kindle listo para ser leído.
    • Por Dekuwa
      Bloatynosy es una aplicación para para Windows 10 y  Windows 11 que nos permite personalizar fácilmente nuestro sistema.

      Características:
      Funciones nativas (sin aplicaciones web basura) Volvemos a lo básico: eficiente y fácil de usar Sin integración con IA/Copilot Enfocado en lo esencial Qué viene a continuación:
      WinModder regresa para ofrecer aún más personalizaciones Próximamente habrá localizaciones para un alcance global Bloatynosy Nue es una aplicación creada por Bel.
    • Por Dekuwa
      NoxPlayer es un emulador de Android para Windows y Mac totalmente optimizado para jugar a juegos móviles.
      Admite todas las versiones de los motores Android: 5.1, 7.1 y 9 (tanto de 32 como de 64 bits) y es compatible con X86 / AMD. NoxPlayer permite ejecutar juegos móviles de alto rendimiento y alta calidad gráfica en PC con una compatibilidad y estabilidad extremadamente altas, y una velocidad de cuadros extrema.

      Al jugar con la pantalla y el teclado de la PC, los usuarios pueden obtener una mejor experiencia visual y una mayor experiencia de control del teclado. Al crear varias instancias, los usuarios pueden iniciar sesión en varias cuentas y realizar "multitarea" para ejecutar no solo juegos, sino también aplicaciones sociales, o en algunas circunstancias, ambas, simultáneamente.
      En NoxPlayer, los jugadores pueden experimentar una visión más clara, una forma más sencilla de controlar a los personajes, una experiencia de juego más fluida, mayor compatibilidad y rendimiento, y... todo esto no nos dejará satisfechos. Para ti, hemos añadido funciones como macro, script, grabación de vídeo, modo en directo, tema animado y añadiremos más en el futuro.
    • Por Dekuwa
      BlueStacks es un emulador de Android para Windows y macOS que nos permite ejecutar aplicaciones y juegos de forma remota.
      Su instalación es tan sencilla como descargar la versión correspondiente a nuestro sistema operativo, descomprimirla, lanzar el ejecutable y seguir las instrucciones que aparece en pantalla.

      Nota: Es necesario utilizar una cuenta de Google.
    • Por Dekuwa
      Fido es un script de PowerShell que está diseñado principalmente para usarse en Rufus, pero que también se puede usar de manera independiente y cuyo propósito es automatizar el acceso a los enlaces de descarga ISO minoristas oficiales de Microsoft Windows, así como brindar un acceso conveniente a imágenes UEFI Shell de arranque.
      Este script existe porque, si bien Microsoft hace que los enlaces de descarga ISO minoristas estén disponibles de forma gratuita y pública (al menos para Windows 8 a Windows 11), hasta los lanzamientos recientes, la mayoría de estos enlaces solo estaban disponibles después de obligar a los usuarios a pasar por muchos obstáculos injustificados que creaban una experiencia del consumidor extremadamente contraproducente, si no francamente hostil, que restaba valor a lo que la gente realmente quiere (acceso directo a las descargas ISO).
      En cuanto a la razón por la que uno podría querer descargar ISO minoristas de Windows, en lugar de los ISO que se generan mediante la propia herramienta de creación de medios (MCT) de Microsoft, esto se debe a que el uso de ISO minoristas oficiales es actualmente la única forma de afirmar con absoluta certeza que el contenido del sistema operativo no ha sido alterado. De hecho, como solo existe un único master para cada una de ellas, las ISOs de venta minorista de Microsoft son las únicas para las que puede obtener un SHA-1 oficial (desde MSDN, si tiene acceso a ella, o desde sitios como este), lo que le permite estar 100% seguro de que la imagen que está utilizando no se ha dañado y es segura de usar.
      Esto, a su vez, ofrece la garantía de que el contenido que USTED está utilizando para instalar su SO, que es realmente fundamental validar de antemano si tiene la más mínima preocupación sobre la seguridad, coincide, bit a bit, con el que Microsoft lanzó.
      Por otro lado, independientemente de la forma en que la herramienta de creación de medios de Microsoft produce su contenido, como nunca hay dos ISOs de MCT iguales (debido a que MCT siempre regenera el contenido ISO sobre la marcha), actualmente es imposible validar con absoluta certeza si cualquier ISO generado por MCT es seguro de usar. Especialmente, a diferencia de lo que sucede con las ISOs de venta minorista, es imposible saber si una ISO de MCT puede haberse dañado después de su generación.
      De ahí la necesidad de ofrecer a los usuarios una forma mucho más sencilla y menos restrictiva de acceder a las ISOs minoristas oficiales...
      Requisitos
      Windows 8 o posterior con PowerShell. No es compatible con Windows 7.
      Modo de línea de comandos
      Fido admite el modo de línea de comandos, mientras que, siempre que se proporciona una de las siguientes opciones, no se crea una instancia de GUI y, en su lugar, puede generar la descarga ISO desde una consola o un script de PowerShell.
      Sin embargo, tenga en cuenta que, a partir del 2023.05, Microsoft ha eliminado el acceso a versiones anteriores de ISO de Windows y, como resultado, la lista de versiones que se pueden descargar desde Fido se ha tenido que reducir solo a la última para cada versión.
      Las opciones son:
      Win: especifique la versión de Windows (p. ej., "Windows 10"). La versión abreviada también debería funcionar (p. ej., -Win 10) siempre que sea lo suficientemente única. Si no se especifica esta opción, se selecciona automáticamente la versión más reciente de Windows. Puede obtener una lista de versiones compatibles especificando -Win List. Rel: especifique la versión de Windows (p. ej., "21H1"). Si no se especifica esta opción, se selecciona automáticamente la versión más reciente de la versión elegida de Windows. También puede utilizar -Rel Latest para forzar el uso de la versión más reciente. Puede obtener una lista de versiones compatibles especificando -Rel List. Ed: especifique la edición de Windows (p. ej., "Pro/Home"). Las ediciones abreviadas también deberían funcionar (p. ej., -Ed Pro) siempre que sean lo suficientemente únicas. Si no se especifica esta opción, se selecciona automáticamente la versión más reciente de Windows. Puede obtener una lista de versiones compatibles especificando -Ed List. Lang: especifique el idioma de Windows (p. ej., "árabe"). Las versiones abreviadas o parte de un idioma (p. ej., -Lang Int para inglés internacional) deberían funcionar siempre que sean lo suficientemente únicas. Si no se especifica esta opción, el script intenta seleccionar el mismo idioma que la configuración regional del sistema. Puede obtener una lista de idiomas compatibles especificando -Lang List. Arch: especifique la arquitectura de Windows (p. ej., "x64"). Si no se especifica esta opción, el script intenta utilizar la misma arquitectura que la del sistema actual. GetUrl: de forma predeterminada, el script intenta iniciar automáticamente la descarga. Pero cuando se utiliza el modificador -GetUrl, el script solo muestra la URL de descarga, que luego se puede enviar a otro comando o a un archivo. Ejemplos de una descarga desde la línea de comandos:
      PS C:\Projects\Fido> .\Fido.ps1 -Win 10 No release specified (-Rel). Defaulting to '21H1 (Build 19043.985 - 2021.05)'. No edition specified (-Ed). Defaulting to 'Windows 10 Home/Pro'. No language specified (-Lang). Defaulting to 'English International'. No architecture specified (-Arch). Defaulting to 'x64'. Selected: Windows 10 21H1 (Build 19043.985 - 2021.05), Home/Pro, English International, x64 Downloading 'Win10_21H1_EnglishInternational_x64.iso' (5.0 GB)... PS C:\Projects\Fido> .\Fido.ps1 -Win 10 -Rel List Please select a Windows Release (-Rel) for Windows 10 (or use 'Latest' for most recent): - 21H1 (Build 19043.985 - 2021.05) - 20H2 (Build 19042.631 - 2020.12) - 20H2 (Build 19042.508 - 2020.10) - 20H1 (Build 19041.264 - 2020.05) - 19H2 (Build 18363.418 - 2019.11) - 19H1 (Build 18362.356 - 2019.09) - 19H1 (Build 18362.30 - 2019.05) - 1809 R2 (Build 17763.107 - 2018.10) - 1809 R1 (Build 17763.1 - 2018.09) - 1803 (Build 17134.1 - 2018.04) - 1709 (Build 16299.15 - 2017.09) - 1703 [Redstone 2] (Build 15063.0 - 2017.03) - 1607 [Redstone 1] (Build 14393.0 - 2016.07) - 1511 R3 [Threshold 2] (Build 10586.164 - 2016.04) - 1511 R2 [Threshold 2] (Build 10586.104 - 2016.02) - 1511 R1 [Threshold 2] (Build 10586.0 - 2015.11) - 1507 [Threshold 1] (Build 10240.16384 - 2015.07) PS C:\Projects\Fido> .\Fido.ps1 -Win 10 -Rel 20H2 -Ed Edu -Lang Fre -Arch x86 -GetUrl https://software-download.microsoft.com/db/Win10_Edu_20H2_v2_French_x32.iso?t=c48b32d3-4cf3-46f3-a8ad-6dd9568ff4eb&e=1629113408&h=659cdd60399584c5dc1d267957924fbd Fido ha sido creado por pbatard.
×
×
  • Crear nuevo...