[SOLVED] how can I get the connected joypad names?
-
I think I will hold off on that until you made some progress on the run command script.
But thank you for pointing it out for me :)
-
@Zigurana You are amazing!!! :D
You pointed me out that SDL stuff and I did my research on that topic.
I can't play with C++ but I can remember my teenager hacking days with C language!
I wrote this small program to get the joystick names and indexes:
/* jslist.c * This little program just list the joysticks connected to the system. * The ouput format is "index:JoystickName". */ #include <stdio.h> #include "SDL.h" int main(void) { int num_joy, i; SDL_Init(SDL_INIT_JOYSTICK); num_joy = SDL_NumJoysticks(); for(i = 0; i < num_joy; i++) printf("%d:%s\n", i, SDL_JoystickNameForIndex(i)); SDL_Quit(); return 0; }
The command to compile this code (as pointed in SDL Wiki):
gcc jslist.c -o jslist $(sdl2-config --cflags --libs)
This was my first step. The jslist needs some little improvements to avoid problems with controllers with the same name. It's easy to solve, but I will work on that later. Now I have to play with my children! :D
-
Good work! interested to see where this ends!
Have fun with the little ones! -
This post is deleted! -
Hey guys! I think I did it! Or, at least, started it!
Let's talk about it at a proper thread:
https://retropie.org.uk/forum/topic/1167/here-is-a-way-to-select-input-for-retroarch-players-1-4 -
from shell
for js in /dev/input/js*; do path=$(udevadm info --name=$js | grep DEVPATH | cut -d= -f2); name=$(</$(dirname sys$path)/name); echo $name; done
-
@BuZz said in [SOLVED] how can I get the connected joypad names?:
from shell
for js in /dev/input/js*; do path=$(udevadm info --name=$js | grep DEVPATH | cut -d= -f2); name=$(</$(dirname sys$path)/name); echo $name; done
pretty awesome! :)
It perfectly answer the topic question. But another problem arises for my application...
The problem is how to find out the proper SDL2/RetroArch index. The SDL2 gives to my
jslist.c
the correct index, and it doesn't always happen to be the same number after the/dev/input/js
.Example: I have 3 usb controllers (as js0, js1 and js2) and one bluetooth controller as js3. The js-RetroArch equivalence is:
js0 = 0
js1 = 1
js2 = 2
js3 = 3Then I unplug the second usb controller. Now the the relation is:
js0 = 0
js2 = 1
js3 = 2I think it's hard to find the proper index with "pure" shell script.
-
thats ok, you just go through them and increment the index in the loop.
-
i=0; for dev in $(find /dev/input -name "js*" | sort); do path=$(udevadm info --name=$dev | grep DEVPATH | cut -d= -f2); name=$(</$(dirname sys$path)/name); echo $dev $i $name; ((i++)); done
/dev/input/js0 0 USB,2-axis 8-button gamepad /dev/input/js1 1 8Bitdo SFC30 GamePad Joystick
then unplugging the USB
/dev/input/js1 0 8Bitdo SFC30 GamePad Joystick
(switched to find to avoid an error if no joysticks connected, but just for this quick one line example)
-
@BuZz
Initially I was excited with this solution and went for the tests...Then I realized that the SDL algorithm index assignment isn't that simple...
The scenario: 4 usb joysticks (js0, js1, js2 and js3) and one bluetooth controller (js4). And then I disconnected the 1st and 2nd usb joysticks (js0 and js1), and the bluetooth controller also. Several minutes later I reconnected the bluetooth controller and it took the js0 "slot". Look at the output differences:
[prompt]$ jslist 0:Twin USB Joystick 1:Twin USB Joystick 2:8Bitdo Zero GamePad [prompt]$ bash buzz-jslist.sh /dev/input/js0 0 8Bitdo Zero GamePad /dev/input/js2 1 Twin USB Joystick /dev/input/js3 2 Twin USB Joystick
-
I think my current dilema is: C or Python?
The C solution is great because the SDL2 is installed by default in RetroPie. The only doubt I have is "where to put the binary?". Maybe
/opt/retropie/supplementary
?The Python solution requires the installation of python-pygame. It means 15.2 MB of additional disk space just to list the available joysticks.
For the moment I think the C approach is the winner.
-
Hey @BuZz , I've just realized that your method can be used to let the user choose which controller to use in runcommand.
I saw this line in runcommand.sh and it seems to always get the first/dev/input/js*
.
(no need for that sermon about your priorities. :-) It's just an enhancement idea, ok...) -
The smiley doesn't make that line funny.
-
@BuZz it represents the effect, not the cause
Contributions to the project are always appreciated, so if you would like to support us with a donation you can do so here.
Hosting provided by Mythic-Beasts. See the Hosting Information page for more information.