Jump to content


JoyShockLibrary 3.0


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

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!
¿Tienes alguna duda, petición o aporte? Utiliza el foro!

  • Contenido similar

    • Por Dekuwa
      xp_activate32 es una sencilla aplicación que nos permite activar una licencia de Windows XP con alguna clave propia u obtenida de aplicaciones como XPKeygen sin necesidad de conectarse a internet o utilizar el servicio de activación telefónica de Microsoft, que fue desactivado hace años.

      De hecho, como se puede ver en la captura de pantalla, la aplicación es una modificación de la aplicación que permitía activar el sistema operativo vía telefónica.
      Todo el proceso de activación de Windows XP utilizando xp_activate32.exe se realiza offline.
    • Por Dekuwa
      Un generador de claves VLK de Windows XP / Windows Server 2003. Esta herramienta le permite generar claves válidas de Windows XP basadas en la Clave de Producto Bruta, que puede ser aleatoria. El Raw Product Key (RPK) se suministra en forma de 9 dígitos XXX-YYYYYY y sólo es necesario para generar una clave de Windows XP.

      Una vez obtenida la clave, podemos utilizar xp_activate32 para activar la licencia.
      XPKeygen es una aplicación creada por Endermanch.
    • Por Dekuwa
      Desbloqueador universal y gestor de PC para Windows 11.
      Windows 11 tiene un montón de botones y opciones de configuración. Y los usuarios en general no saben dónde encontrar la mayoría de estas funciones, qué hacer con ellas y qué configuración activar o desactivar. BloatyNosy racionaliza y aloja todos los ajustes esenciales en una sola aplicación y te permite desactivar y eliminar funciones innecesarias con un simple clic.

      Viene con algunos módulos que se ampliarán con el tiempo, de forma similar a ThisIsWin11. BloatyNosy también podría sustituir a la aplicación ThisIsWin11 tarde o temprano y servir como un desinstalador de aplicaciones universal.
      A través del enlace de la esquina inferior derecha "Quiero configurar Windows 11 por primera vez", puedes llamar a un asistente/configurador de Windows 11 y personalizar tu sistema paso a paso y desinstalarlo. Cuenta con una app BloatFinder, que te permite eliminar apps preinstaladas de forma automática o manual. La aplicación WinModder te permite aplicar fragmentos de código basados en PowerShell y scripts de la comunidad. Además, integra el instalador de aplicaciones InstaPackage, que te permite instalar algunas de las aplicaciones más importantes con un solo clic y de forma masiva. BloatyNosy es una aplicación creada por Bel.
    • Por Dekuwa
      Rufus es una utilidad que le ayuda a formatear y crear soportes USB de arranque, como «pendrives», tarjetas de memoria, etcétera.
      Es especialmente útil en casos donde:
      necesite crear medios de instalación USB a partir de ISOs arrancables (Windows, Linux, UEFI, etc.) necesite trabajar en un equipo que no tenga un sistema operativo instalado necesite actualizar el firmware o BIOS de un ordenador desde DOS quiera ejecutar una utilidad de bajo nivel
      Uso
      Descargue el archivo ejecutable y ábralo; no es necesario instalarlo.
      El ejecutable está firmado digitalmente, y la firma debería indicar: "Akeo Consulting"
      Notas sobre la compatibilidad con DOS:
      Si crea un disco de arranque DOS y utiliza un teclado no estadounidense, Rufus intentará seleccionar una disposición de teclado a partir de la configuración regional del sistema. En ese caso, se recomienda FreeDOS, que es la opción predeterminada, ya que admite más disposiciones de teclado.
      Notas sobre la compatibilidad con ISO:
      Todas las versiones de Rufus a partir de v1.1.0 permiten crear soportes USB de arranque a partir de una imagen ISO (.iso).
      Es muy fácil crear una imagen ISO a partir de un disco físico o de un conjunto de archivos, con el uso de una aplicación de grabación de CD, como CDBurnerXP o ImgBurn.
      by Pete Batard.
    • Por Dekuwa
      CHIRP es una herramienta gratuita y de código abierto para programar tu radio desde Windows y macOS. Es compatible con un gran número de fabricantes y modelos, además de proporcionar una forma de interactuar con múltiples fuentes y formatos de datos.

      Modelos de Radio soportados por Chirp
      Abbree AR-518 AR-63 AR-F3 (use Baofeng UV-82III) AR-F8 (use Wouxun KG-UV8D) Alinco DJ-G7EG DJ-G7T* DJ175 DJ596 DR03T DR06T DR135T DR235T DR435T Ansoko A-5R A-8S AnyTone 5888UV 5888UVIII 778UV 778UV VOX OBLTR-8R TERMN-8R Anysecu AC-580 WP-9900 Arcshell AR-5 AR-6 AR-7 (use Radtel T18) AR-8 BTECH FRS-A1 FRS-B1 GMRS-20V2 GMRS-50V2 GMRS-50X1 GMRS-V1 GMRS-V2 MURS-V1 MURS-V2 UV-2501 UV-2501+220 UV-25X2 UV-25X4 UV-5001 UV-50X2 UV-50X2_G2 UV-50X3 UV-5X3 Baiston BST-2100 (use Baofeng BF-888) Baofeng BF-888 BF-A58 BF-A58S BF-F8HP BF-T1 BF-T8 BF-U9 BF-V8A F-11 GT-3WP GT-5R UV-3R UV-5R UV-5X UV-5XP UV-6 UV-6R UV-82 UV-82HP UV-82III UV-82WP UV-9G UV-9R UV-9R Pro UV-B5 Baofeng/Pofung 997-S (Foscam Digital Technologies) (use UV-5R) AR-152 (use UV-5R) B-580T (use UV-5R) BF-88E (use BF-888) BF-C2/C5 (use BF-888) BF-E500S (use UV-5R) BF-F11 (use BF-A58S) BF-F8+III (use Radioddity UV-5RX3) BF-F8, F8+ (use UV-5R) BF-F8X3 (use BF-A58S) BF-F9 (use UV-5R) BF-F9V2+ (use BF-F8HP) BF-H6 (use TIDRADIO TD-H6) BF-R3 (use Radioddity UV-5RX3) BF-R5 Mini (use BF-888) BF-S5 Plus (use UV-82III) BF-UV10R (use BF-F8HP) BF-UV9R+HP (use UV-82WP) BF-UVB2+ (use UV-5R) BF-UVF10 (use BF-A58S) BF-V85 (use UV-B5) BF-V9 (use BF-888) BF-X3 Plus (use BF-A58S) BF-X9 (use Radioddity UV-5RX3) FF-12P (use UV-5R) G11S (use Retevis RB27) GT-1 (use BF-888) GT-3, GT-3 MK II (use UV-5R) GT-3TP (use BF-F8HP) GT-5 (use UV-82) GT-5TP (use UV-82HP) P10UV (use Radioddity GA-510) P11UV (use Retevis RB27) P8UV (use Radioddity UV-5G) UV-10R (use BF-F8HP) UV-59T (use Radioddity UV-5RX3) UV-5G (use Radioddity UV-5G) UV-5R HTQ (use BF-F8HP) UV-5R MK4, MK5 (use BF-F8HP) UV-5R V2+, UV-5R2 (use UV-5R) UV-5R+ (use BF-F8HP) UV-5R++ (use UV-5R) UV-5R7W (use BF-F8HP) UV-5RA, UV-5RA+, UV-5RAX, UV-5RAX+ (use UV-5R) UV-5RA3 (use Radioddity UV-5RX3) UV-5RB (use UV-5R) UV-5RC, UV-5RC, UV-5RCX+ (use UV-5R) UV-5RD (use UV-5R) UV-5RE, UV-5RE+ (use UV-5R) UV-5RG, RK, RQ, RS, RT, RU (use UV-5R) UV-5RHP (use BF-F8HP) UV-5RIII (use Radioddity UV-5RX3) UV-5RM HP (use BF-F8HP) UV-5RTP (use BF-F8HP) UV-5RWP (use UV-82WP) UV-5RX3 (use Radioddity UV-5RX3) UV-5S (use UV-5R) UV-5X (GMRS version) (use Radioddity UV-5G) UV-5X (original 2014 model) (use UV-5R) UV-82III (2 x PTT) (use Radioddity UV-82X3) UV-82T (use Radioddity UV-82X3) UV-82X3 (use Radioddity UV-82X3) UV-860 (use UV-5R) UV-8R (use UV-82HP) UV-920 (use UV-5R) UV-9R Pro (BF-H6 variant) (use Radioddity GA-510) UV-9S (use Radioddity UV-5RX3) UV-9X+ (use UV-82HP) UV-B2 (use UV-82) UV-B2+, B3+ (use UV-5R) UV-S9 (tri-power: use BF-F8HP) UV-S9/S9T/S9X3 (tri-band: use Radioddity UV-5RX3) UV-X9 (use UV-82HP) Baojie BJ-218 BJ-318 BJ-9900* BJ-UV55* Boblov X3Plus* CRT Micron UV Micron UV V2 Cignus UV-85 (use Baofeng UV-5R) UV-87 (use TYT TH-UV88) XTR-5 Explorer QRZ-1 Feidaxin FD-150A* FD-160A* FD-268A* FD-268B* FD-288A* FD-288B* FD-450A* FD-460A* FD-460UH* Greaval GV-8S GV-9S Hesenate BJ-218 HT-5RX3 (use Radioddity UV-5RX3) HT-U222 (use Retevis RT22) Hiroyasu UV-5118 (use Abbree AR-518) HobbyPCB RS-UV3 Icom IC-208H IC-2100H IC-2200H IC-2300H IC-2720H IC-2730A IC-2820H IC-7000* IC-7100 IC-7200 IC-7300 IC-746 IC-7610 IC-91/92AD IC-910 IC-E90 IC-P7 IC-Q7A IC-T70 IC-T7H IC-T8A IC-T90 IC-U82 IC-V80 IC-V82 IC-V86 IC-W32A IC-W32E ID-31A ID-4100 ID-51 ID-51 Plus ID-51 Plus2 ID-5100 ID-800H ID-80H ID-880H Intek HR-2040 KT-980HP Iradio UV-5118 (use Abbree AR-518) Jetstream JT220M JT2705M JT270M JT270MH Jianpai FT-UV78 (use Abbree AR-518) G63 (use Abbree AR-63) Juentai JT-6188 Mini JT-6188 Plus KYD IP-620* NC-630A* Kenwood TH-D7 TH-D72 (clone mode) TH-D72 (live mode) TH-D74 (clone mode) TH-D74 (live mode) TH-D7G TH-F6 TH-F7 TH-G71 TH-K2 TK-2140K TK-2180 TK-260* TK-260G TK-270* TK-270G TK-272* TK-272G TK-278* TK-278G TK-3140K TK-3140K2 TK-3140K3 TK-3180K TK-3180K2 TK-360* TK-360G TK-370* TK-370G TK-372* TK-372G TK-378* TK-378G TK-388G TK-7102 TK-7108 TK-7160K TK-7160M TK-7180 TK-7180E TK-760 TK-760G TK-762 TK-762G TK-768 TK-768G TK-8102 TK-8108 TK-8160K TK-8160M TK-8180 TK-8180E TK-860 TK-860G TK-862 TK-862G TK-868 TK-868G TM-271 TM-281 TM-471 TM-D700 TM-D710 TM-D710G TM-D710G_CloneMode TM-D710_CloneMode* TM-G707 TM-V7 TM-V71 TS-2000 TS-480_CloneMode* TS-480_LiveMode* TS-590S/SG_LiveMode* TS-590SG_CloneMode* TS-590S_CloneMode* TS-850* LUITON LT-316 LT-580_UHF LT-580_VHF LT-588UV LT-725UV LT-898UV Lanchonlh HG-UV98* Leixen VV-898 VV-898E VV-898S MTC UV-5R-3 Marui MR-UV1 (use TYT TH-UV88) Midland CT-210 (use Puxing PX-777) DBR2500 NKTech UV-7RX (use Retevis RT6) OTGSTUFF OTG Radio v1 Plant-Tours MT-700* Polmar DB-50M Powerwerx DB-750X Puxing PX-2R* PX-777* PX-888K* Q-MAC HF-90 QYT KT-8R KT-9900 (use KT-WP12) KT-UV980 KT-WP12 KT5800 KT7900D KT8900 KT8900D KT8900R KT980PLUS Quansheng TG-UV2+ R&L Electronics UV-5R 3 band (use Radioddity UV-5RX3) Radioddity DB25-G GA-2S GA-510 GA-5S GS-5B QB25 R2 UV-5G UV-5R EX UV-5RX3 UV-5X (use Radioddity UV-5G) UV-82X3 Radtel RT-10 (use Retevis RT22) T18 Retevis H777 H777 (FRS) (use Retevis H777 Plus) H777 Plus H777S RA685 RA85 RB15 RB17 RB17A RB17P RB17V RB18 RB19 RB19P RB23 RB26 RB27 RB27B RB27V RB28 RB28B RB29 RB615 RB617 RB618 RB619 RB627B RB628 RB628B RB629 RB75 RB85 RB87 RT-B6 (use Baofeng UV-B5) RT1 RT15 RT16 RT19 RT21 RT22 RT22FRS RT22S RT23 RT24 RT26 RT29_UHF RT29_VHF RT40B RT47 RT47V RT5 RT5 with 2 power levels (use Baofeng UV-5R) RT5(tri-power) RT5R RT5RV RT6 RT619 RT622 RT647 RT668 RT68 RT76 RT76P RT85 RT86 RT87 RT9000D_136-174 RT9000D_220-260 RT9000D_400-490 RT9000D_66-88 RT95 RT95 VOX RT98 Rugged RH5R RH5R-V2* RH5X Rugged Radios RH5R, RH5R-V2 (use Baofeng UV-5R) Ruyage UV58 (use Abbree AR-518) UV58Plus Sainsonic AP510* GT-3TP (use Baofeng BF-F8HP) GT-890 SenhaiX 8800 Socotran UV-5118 (use Abbree AR-518) Surecom S-KT8900D TDXone TD-Q8A TID TD-M8 TD-UV68 TIDRADIO BF-F8TD (use TIDRADIO TD-UV5R TriPower) TD-H6 TD-H8 TD-H8-GMRS TD-H8-HAM TD-UV5R TriPower UV-82 (use Baofeng UV-82HP) TXQ G63 (use Abbree AR-63) TYT QRZ-1 (use Explorer QRZ-1) TH-350* TH-7800 File* TH-7800* TH-9800 TH-9800 File* TH-UV3R-25* TH-UV3R* TH-UV8000 TH-UV88 TH-UVF1 TH-UVF8D TH9000_144 TH9000_220 TH9000_440 Tacklife MTR01 (use Radioddity R2) Talinfone G63 (use Abbree AR-63) TechSide TI-F8+ TS-T1 (use Retevis RB26) TS-T9+ Tenway TW-325 UV-5R Pro UV-82 Pro Tonfa UV-985 (use Baofeng UV-5R) Vero UV-E5, UV-E5 MK II (use Baofeng UV-5R) Vertex Standard FTL-1011* FTL-2011* FTL-7011* FTL-8011* VXA-700* WACCOM MINI-8900 WLN KD-C1 Wouxun KG-1000G KG-1000G Plus KG-816 KG-818 KG-935G KG-935G Plus KG-UV2D (use KG-UVD1P) KG-UV3D (use KG-UVD1P) KG-UV5D (use KG-UVD1P) KG-UV6 KG-UV7D (use KG-UV6) KG-UV8D KG-UV8D Plus KG-UV8E KG-UV920P-A KG-UV980P KG-UV9D Mate (use Wouxun KG-UV9D Plus) KG-UV9D Plus KG-UV9P (use Wouxun KG-UV9D Plus) KG-UV9PX KG-UVD1P Wurui G63 (use Abbree AR-63) Yaesu FT-1500M FT-1802M* FT-1D FT-25R FT-2800M* FT-2900R/1900R FT-2900R/1900R(TXMod) FT-450D* FT-4VR FT-4XE FT-4XR FT-50* FT-60 FT-65E FT-65R FT-70D FT-7100M* FT-7800/7900 FT-8100* FT-817 FT-817ND FT-817ND (US) FT-818 FT-818ND (US) FT-857/897 FT-857/897 (US) FT-8800 FT-8900 FT-90 FT2D FT3D FTM-3100 (use FTM-3200DR) FTM-3200D* FTM-350 FTM-7250D* VX-170* VX-2 VX-3 VX-5 VX-6 VX-7 VX-8DR VX-8GE VX-8R Yedro YC-M04VUS Zastone BJ-218 MP-300 MP-380 (use QYT KT8900D) MP-800 (use TYT TH-9800) V8A (use Baofeng UV-5R) V8A+ (use Baofeng UV-5R) ZT-V8 (use Baofeng UV-5R) ZT-X6 youRUSH UV-5RUSH (use Baofeng UV-5R) UV-82RUSH (use Baofeng UV-82) UV-9RUSH PLUS (use Baofeng BF-A58) UV-9RUSH PRO (use Radioddity GA-510)
×
×
  • Crear nuevo...