RetroPie forum home
    • Recent
    • Tags
    • Popular
    • Home
    • Docs
    • Register
    • Login
    Please do not post a support request without first reading and following the advice in https://retropie.org.uk/forum/topic/3/read-this-first

    [How-To] Browse the bash history with a game controller

    Scheduled Pinned Locked Moved Help and Support
    bashterminalconsolehistoryhow-to
    11 Posts 3 Posters 1.6k Views
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • ClydeC
      Clyde
      last edited by Clyde

      Hi folks,

      edit: Dirty hack deleted that broke controller support in other menus. Read the next post from @meleu for a clean and working solution. 😊

      Cheers
      Clyde

      meleuM cyperghostC 2 Replies Last reply Reply Quote 0
      • meleuM
        meleu @Clyde
        last edited by meleu

        @clyde I may be wrong, but I think the way you're doing can possibly bring some problems like not launching joy2key.py properly in later instances of retropie_setup.sh (or any other joy2key client).

        My untested suggestion

        Add this to your .bashrc (not your .profile):

        export scriptdir="$HOME/RetroPie-Setup"
        source "$HOME/RetroPie-Setup/scriptmodules/helpers.sh"
        joy2keyStart
        

        And add this to your .bash_logout (create the file if it doesn't exist):

        joy2keyStop
        

        Explaining

        No parameters to joy2keyStart will use the default ones:
        /dev/input/jsX kcub1 kcuf1 kcuu1 kcud1 0x0a 0x20.

        Advantage/difference from your approach:

        • jsX: means every connected controller (not only js0 or js4, for example)
        • 0x20 (the last argument) means <space>, and your approach is using 0x9, meaning <tab>. I think it's not an issue for your goal, right?

        Also, adding joy2keyStop to your .bash_logout will stop joy2key.py when you log out from a subshell, making it "sensible" to new joysticks [dis]connections on later instances joy2key.py.

        • Useful topics
        • joystick-selection tool
        • rpie-art tool
        • achievements I made
        ClydeC 1 Reply Last reply Reply Quote 3
        • cyperghostC
          cyperghost @Clyde
          last edited by

          @clyde It is a real cool idea but this one has it's pitfalls. There are wonderfull commands. like history | tail -n50
          This hinders direct access to .bash_rc file ;)

          1 Reply Last reply Reply Quote 0
          • ClydeC
            Clyde @meleu
            last edited by

            First and foremost, thank you very much for your help.

            @meleu said in [How-To] Browse the bash history with a game controller:

            @clyde I may be wrong, but I think the way you're doing can possibly bring some problems like not launching joy2key.py properly in later instances of retropie_setup.sh (or any other joy2key client).

            Why is that? Just curious and willing to learn.

            Add this to your .bashrc (not your .profile):

            source "$HOME/RetroPie-Setup/scriptmodules/helpers.sh"
            joy2keyStart
            

            Alas, this doesn't work and gives me the error -bash: /scriptmodules/supplementary/runcommand/joy2key.py: no such file or directory.

            Advantage/difference from your approach:

            • jsX: means every connected controller (not only js0 or js4, for example)

            Ah, I wondered about the jsX and I thought this would only work from within a script.

            • 0x20 (the last argument) means <space>, and your approach is using 0x9, meaning <tab>. I think it's not an issue for your goal, right?

            Right, I just copied the line from runcommand.sh. 😇

            cyperghostC ClydeC meleuM 3 Replies Last reply Reply Quote 0
            • cyperghostC
              cyperghost @Clyde
              last edited by

              @clyde said in [How-To] Browse the bash history with a game controller:

              Why is that? Just curious and willing to learn.

              Try it yourself. Just start the command /opt/retropie/supplementary/runcommand/joy2key.py /dev/input/js0 kcub1 kcuf1 kcuu1 kcud1 0x0a 0x09 & twice and you see you will do two inputs at once.

              Start it three times, you will make three hops... and so on.

              1 Reply Last reply Reply Quote 0
              • ClydeC
                Clyde @Clyde
                last edited by Clyde

                @clyde said in [How-To] Browse the bash history with a game controller:

                @meleu said in [How-To] Browse the bash history with a game controller:

                @clyde I may be wrong, but I think the way you're doing can possibly bring some problems like not launching joy2key.py properly in later instances of retropie_setup.sh (or any other joy2key client).

                Why is that? Just curious and willing to learn.

                A test confirmed your concerns. With my approach, my controller doesn't work in retropie_setup.sh anymore. I watched the instances of joy2key in htop: One instance is created at boot, another one when I exit ES to the shell. Both remain even when I exit the shell back to ES. Subsequent visits to the shell don't increase the number of joy2key instances any further. Starting retropie_setup.sh from ES Retropie menu kills the second instance (judging by its pid), but the remaining instance don't work in the setup's menu. Just mentioned for your information.

                I still would like to know the why behind it, though. 😌

                edit:
                @cyperghost: My post collided with yours. I still wonder why multiple instances of joy2key can't coexist together, especially if they are mapped to the same keys. I just lack the knowledge about the internals of the Linux input system.

                cyperghostC 1 Reply Last reply Reply Quote 0
                • cyperghostC
                  cyperghost @Clyde
                  last edited by

                  @clyde They can coexists together but not if they use the same joystick number js{0...9}. But it is in general not a good programming style if you let called processes be in the wild. So you catch it's PID via $! routine

                  1 Reply Last reply Reply Quote 1
                  • cyperghostC
                    cyperghost
                    last edited by cyperghost

                    @Clyde So see your attempt as first try we can to some evolution on the hop ;)

                    1. Try to call joy2key

                    call background processes and forget to terminate them

                    You see the results it can cause in your script

                    2. Try to call joy2key

                    call background process, and terminate it's process by nane - after there i no need of it. So you make your call with joy2key, and just use pkill -f joy2key

                    That's a shotgun, all processes which are called joy2key are terminated. Easy and works in most situations ;)

                    3. Try to call joy2key

                    call background process, catch it's process ID and terminate it - after there i no need of it. Catch it's PID with $! command and then kill this one PID

                    Much better isn't it? So you can avoid answer people do like .... your script causes this and that...

                    4. Try to call joy2key

                    function start_joy(){
                                "$ROOTDIR/supplementary/runcommand/joy2key.py" js0 kcub1 kcuf1 kcuu1 kcud1 0x0a 0x09 &
                                JOY2KEY_PID=$!
                    }
                    
                    function end_joy(){
                          if [[ -n "$JOY2KEY_PID" ]]; then
                            kill -INT JOY2KEY_PID
                        fi
                    
                    }
                    

                    So we have funtion calls, and catch PID but still have only one joystick in action... We can do that better?

                    5. Try to call joy2key

                    function start_joy(){
                            local joy_find; local i
                            joy_find=$(find /dev/input/js?)
                            for i in ${joy_find[@]}; do
                                "$ROOTDIR/supplementary/runcommand/joy2key.py" "$i" kcub1 kcuf1 kcuu1 kcud1 0x0a 0x09 &
                                JOY2KEY_PID+=("$!")
                            done
                    }
                    
                    function end_joy(){
                        if [[ -n "$JOY2KEY_PID" ]]; then
                            kill -INT "${JOY2KEY_PID[@]}"
                        fi
                    }
                    

                    Much better all instances of js{...} are called but we have multiple instances of joy2script running (but each sessions is assigned to only one joypad) but this works very good but is waste of resources .... but we are 80% done and understood how to call functions and how to create arrays in bash ;)

                    BTW: the use of find here is very unprofessional. You must take care of word splitting. So the answer if someone asks why you did you do that this way, the only smart anwer is: I know what I'm doing ;)

                    6. Try to get joy2key running

                    readonly JOY2KEY_SCRIPTLOC="$HOME/RetroPie-Setup/scriptmodules/helpers.sh"
                    readonly CONFIG=(kcub1 kcuf1 kcuu1 kcud1 0x0a kf10 0x20 kf9)
                    source "$JOY2KEY_SCRIPTLOC"
                    scriptdir="$HOME/RetroPie-Setup"
                    
                    # We call the script with connected Joypads only, you can leave array CONFIG empty then you will use default...
                    joy2keyStart ${CONFIG[@]}
                    
                    # Do here your actions
                    
                    # ......
                    
                    joy2keyStop # Terminate joy2key python script
                    

                    That's the professional way and it's much easier to use in your code ;)

                    Enjoy ;)

                    1 Reply Last reply Reply Quote 1
                    • meleuM
                      meleu @Clyde
                      last edited by

                      @clyde said in [How-To] Browse the bash history with a game controller:

                      First and foremost, thank you very much for your help.

                      @meleu said in [How-To] Browse the bash history with a game controller:

                      @clyde I may be wrong, but I think the way you're doing can possibly bring some problems like not launching joy2key.py properly in later instances of retropie_setup.sh (or any other joy2key client).

                      Why is that? Just curious and willing to learn.

                      because runcommand.sh and retropie_setup.sh always check if there's an instance of joy2key.py running before launching it.

                      Add this to your .bashrc (not your .profile):

                      source "$HOME/RetroPie-Setup/scriptmodules/helpers.sh"
                      joy2keyStart
                      

                      Alas, this doesn't work and gives me the error -bash: /scriptmodules/supplementary/runcommand/joy2key.py: no such file or directory.

                      whoops! I missed a detail, the first line below.

                      export scriptdir="$HOME/RetroPie-Setup"
                      source "$HOME/RetroPie-Setup/scriptmodules/helpers.sh"
                      joy2keyStart
                      

                      Edited my previous post accordingly.

                      • Useful topics
                      • joystick-selection tool
                      • rpie-art tool
                      • achievements I made
                      ClydeC 1 Reply Last reply Reply Quote 1
                      • cyperghostC
                        cyperghost
                        last edited by cyperghost

                        @meleu Yes the litte export ;)

                        1 Reply Last reply Reply Quote 0
                        • ClydeC
                          Clyde @meleu
                          last edited by

                          @meleu @cyperghost The export did the trick. It works now and doesn't break the other menu controls. 😄 Thank you for all the effort and explanations. I learned a lot today, as may others who stumble upon this thread, too.

                          I edited my opening post to a mere reference to @meleu's solution. 😌

                          1 Reply Last reply Reply Quote 0
                          • First post
                            Last post

                          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.