Scripting help for replacing retroarch.cfg
-
Here is the full working script... Change as you like
#!/bin/bash # Retroswap.sh ############# # This script lets you switch retroarch config files. # v4 09.09.2017 by cyperghost and FlashPC # # Place this script in /home/pi/RetroPie/retropiemenu/ # In order to run the script you must create the following folders: # 1. /opt/retropie/configs/all/retroswap # 2. within that folder create a folder for each system # 2.1 create there folder "overlay" # 2.2 create there folder "overlay-real" # 2.3 create there folder "shader" # 2.4 create there folder "standard" # # full example path for 3DO = /opt/retropie/configs/all/retroswap/3do/overlay # # Within each folder you have created place a retroarch.cfg file. # The file needs to be named the same in each folder. # Place your current retroarch_shader.cfg in the shader folder. # Name the file retroarch.cfg. # # Greetings fly out to meleu and TMNTturtleguy # # Please respect the work of others # -- F U N C T I O N S -- modemenu () { local idx=0 local shaderchoice until [[ "${console[idx]}" == "$1" ]] do idx=$(( $idx + 1 )) done until [[ "$shaderchoice" == "<--" ]] do shaderchoice=$(whiptail --backtitle " Console is ${console[idx+1]} " \ --title " Choose " \ --nocancel --menu "Choose an option" 0 0 0 \ "<--" "... back to systemselection" \ "overlay" "Use Basic Overlay & Scanlines" \ "overlay-real" "Use Realistic Overlay & Scanlines" \ "shaders" "Use Shaders...." \ "standard" "Disable Overlays & Scanlines" \ 2>&1 > /dev/tty) case "$shaderchoice" in overlay) echo "$1 Overlay" && sleep 2 ;; overlay-real) echo "$1 RealOverlay" && sleep 2 ;; shaders) echo "$1 shaders" && sleep 2 ;; standard) echo "$1 standard" && sleep 2 ;; esac done } #-- A R R A Y -- # Feel free to add and edit new console # TAKE CARE OF UPPER AND LOWER CASE! console=("3do" "Panasonic 3DO" "atari2600" "Atari 2600" "atari5200" "Atari 5200" "atarijaguar" "Atari Jaguar" "coleco" "ColecoVision" \ "dreamcast" "Sega Dreamcast" "famicom" "Nintendo Famicom" "intellivision" "IntelliVision" "markiii" "Sega Mark III" \ "mastersystem" "Sega Master System" "megadrive" "Sega MegaDrive" "segacd" "Sega MegaCD" "n64" "Nintendo 64" \ "neogeo" "SNK Neo-Geo AES" "nes" "Nintendo Entertainment System" "nintendobsx" "Nintendo Satelliview" \ "pcengine" "NEC PC-Engine" "pcenginecd" "NEC PC_EnigneCD" "psx" "Sony Playstation" "saturn" "Sega Saturn" \ "sega32x" "Sega 32X" "sfc" "Nintendo Super Famicom" "snes" "Super Nintendo Entertainment System" "tg16" "TurboGrafx 16" \ "tg16cd" "TurboGrafx 16CD") # -- M A I N - L O O P -- while true do syschoice=$(whiptail --backtitle " Choose " --title " Choose " \ --nocancel --menu "Select Console" 0 0 0 \ "<--" "... back to ES" \ "${console[@]}" \ "<--" "... back to ES" \ 2>&1 > /dev/tty) case "$syschoice" in "<--") break ;; *) modemenu "$syschoice" ;; esac done
@meleu ;) How about the indentations?
-
@cyperghost Hey mate, I really appreciate your help, I am away from my Pi for a while so I cannot simply load the code, and for me to learn can I just confirm a few things.
@cyperghost said in Scripting help for replacing retroarch.cfg:
modemenu () { local idx=0 local shaderchoice until [[ "${console[idx]}" == "$1" ]] do idx=$(( $idx + 1 )) done until [[ "$shaderchoice" == "<--" ]] do shaderchoice=$(whiptail --backtitle " Console is ${console[idx+1]} " \ --title " Choose " \ --nocancel --menu "Choose an option" 0 0 0 \ "<--" "... back to systemselection" \ "overlay" "Use Basic Overlay & Scanlines" \ "overlay-real" "Use Realistic Overlay & Scanlines" \ "shaders" "Use Shaders...." \ "standard" "Disable Overlays & Scanlines" \ 2>&1 > /dev/tty) done }
In this function am I right in guessing that the 2 'locals' at the start, clears the shaderchoice variable and sets idx to zero, then program will loop the console array searching for $1, using idx as a counter, then once it has found the result it locks down idx to a number, which when the menu runs it uses the next result within the array to display the menu title.
console=("3do" "Panasonic 3DO" "atari2600" "Atari 2600" "atari5200" "Atari 5200" "atarijaguar" "Atari Jaguar" "coleco" "ColecoVision" \ "dreamcast" "Sega Dreamcast" "famicom" "Nintendo Famicom" "intellivision" "IntelliVision" "markiii" "Sega Mark III" \ "mastersystem" "Sega Master System" "megadrive" "Sega MegaDrive" "segacd" "Sega MegaCD" "n64" "Nintendo 64" \ "neogeo" "SNK Neo-Geo AES" "nes" "Nintendo Entertainment System" "nintendobsx" "Nintendo Satelliview" \ "pcengine" "NEC PC-Engine" "pcenginecd" "NEC PC_EnigneCD" "psx" "Sony Playstation" "saturn" "Sega Saturn" \ "sega32x" "Sega 32X" "sfc" "Nintendo Super Famicom" "snes" "Super Nintendo Entertainment System" "tg16" "TurboGrafx 16" \ "tg16cd" "TurboGrafx 16CD")
In the array are the backslashes used to continue the array onto another line without breaking the array
while true do syschoice=$(whiptail --backtitle " Choose " --title " Choose " \ --nocancel --menu "Select Console" 0 0 0 \ "<--" "... back to ES" \ "${console[@]}" \ "<--" "... back to ES" \ 2>&1 > /dev/tty) case "$syschoice" in "<--") break ;; *) modemenu "$syschoice" ;; esac done
Will the "${console[@]}" part actually populate both the tags and the descriptions within the whiptail menu?
2>&1 > /dev/tty)
And finally what does the above terminal code mean?
-
@cyperghost Hey mate, I really appreciate your help, I am away from my Pi for a while so I cannot simply load the code, and for me to learn can I just confirm a few things.
Okay - but I'm not a professional
@cyperghost said in Scripting help for replacing retroarch.cfg:
modemenu () { local idx=0 local shaderchoice until [[ "${console[idx]}" == "$1" ]] do idx=$(( $idx + 1 )) done until [[ "$shaderchoice" == "<--" ]] do shaderchoice=$(whiptail --backtitle " Console is ${console[idx+1]} " \ --title " Choose " \ --nocancel --menu "Choose an option" 0 0 0 \ "<--" "... back to systemselection" \ "overlay" "Use Basic Overlay & Scanlines" \ "overlay-real" "Use Realistic Overlay & Scanlines" \ "shaders" "Use Shaders...." \ "standard" "Disable Overlays & Scanlines" \ 2>&1 > /dev/tty) done }
In this function am I right in guessing that the 2 'locals' at the start, clears the shaderchoice variable and sets idx to zero, then program will loop the console array searching for $1, using idx as a counter, then once it has found the result it locks down idx to a number, which when the menu runs it uses the next result within the array to display the menu title.
Yes... locale variables are fire and forget ones. They are working only inside the function and if the funtion is finished the variables values are nomore available (or set to zero) a bit uncommon imho but it's a neat thing.
Yes the first loop compares array with called $syschoice and sets an counter (idx). If condtion is true (loop until) the whiptail menu will be entered. There you just set idx+1 and ask array and you'll get the "User System Description".
console=("3do" "Panasonic 3DO" "atari2600" "Atari 2600" "atari5200" "Atari 5200" "atarijaguar" "Atari Jaguar" "coleco" "ColecoVision" \ "dreamcast" "Sega Dreamcast" "famicom" "Nintendo Famicom" "intellivision" "IntelliVision" "markiii" "Sega Mark III" \ "mastersystem" "Sega Master System" "megadrive" "Sega MegaDrive" "segacd" "Sega MegaCD" "n64" "Nintendo 64" \ "neogeo" "SNK Neo-Geo AES" "nes" "Nintendo Entertainment System" "nintendobsx" "Nintendo Satelliview" \ "pcengine" "NEC PC-Engine" "pcenginecd" "NEC PC_EnigneCD" "psx" "Sony Playstation" "saturn" "Sega Saturn" \ "sega32x" "Sega 32X" "sfc" "Nintendo Super Famicom" "snes" "Super Nintendo Entertainment System" "tg16" "TurboGrafx 16" \ "tg16cd" "TurboGrafx 16CD")
In the array are the backslashes used to continue the array onto another line without breaking the array
That is cosmetic for a better reading and maintaining. The backslash is used as breakline, a newline will work like ; and will introduce/end a command
while true do syschoice=$(whiptail --backtitle " Choose " --title " Choose " \ --nocancel --menu "Select Console" 0 0 0 \ "<--" "... back to ES" \ "${console[@]}" \ "<--" "... back to ES" \ 2>&1 > /dev/tty) case "$syschoice" in "<--") break ;; *) modemenu "$syschoice" ;; esac done
Will the "${console[@]}" part actually populate both the tags and the descriptions within the whiptail menu?
Yes, as I wrote above whiptail in menu mode ask for two tags for an entry, so we feed whiptail with that values. I think it's also possible to use two arrays (as it was your first intention) but think about maintaining the code. You have always to use the correct counter position for "systemname" (3do) and "User Systemname" (3DO Philips Emulator thing.......). As humans are not perfect and may make mistakes it's a variant I won't prefer..... Therefore I coded this script for you.
2>&1 > /dev/tty)
And finally what does the above terminal code mean?
Unix uses different channels for inputs, standard output and error outputs.
0 is standard input (keyboard for ex.)
1 is standard ouput (PC monitor for ex. = terminal)
2 is standard error ouput (PC monitor for ex. =terminal)So we redirect error messages (channel 2) to 1 tty is standard terminal
if you write /dev/null then every message error and normal progress will be send to nirvana.I repeat I'm in no means a professional coder and there may be errors.
For the idx-do-loop... I think there is an easier approch to do this.
As bash seems to be a very logic language you must ask if the whiptail command extracts the full array and you can select an entry the index number must be somewhere handeled during the whiptail call ;) -
@cyperghost @meleu @TMNTturtlguy Thank you so much guys, I'm pretty sure the script is now done. I am proud to say I added a little to the project but it was down to you guys.
I have learnt a lot in the last week, and I realise that there is no single way to do anything, and I hope that once I get into this a bit more I can help others with my dirty code...lol
-
@flashpc Glad to know you achieved what you want. :-)
Feel free to ask shell scripting questions in this thread: https://retropie.org.uk/forum/topic/11900/shell-scripting-topic/
-
Hey guys, I've been tinkering and adding more features, and for about 2 weeks I've been fighting trying to get the interface working with controllers, instead of the keyboard. I had some success with Joymap which worked great with the PS3 controller, which is what I have been using initially, so I thought 'Sweet, that was easy....' and it was until I tried a PS2/PSX twin USB adaptor.
Joymap would correctly map Player 2 but not Player 1, next I tried xboxdrv which nicely maps all the buttons and axis for Player 1 so the menu worked again, but when I plugged in an Xbox controller it would kill the controller on exit, so that was out too.
I was at my wits end and kind of put it on the back burner, and wandered through the internet looking for inspiration on a way to try and fix this, but it ended up me watching YouTube for a few days...
Finally I came back to the forum and found @meleu RetroPie joystick selector, which claimed to change the joystick order within Retropie. I started the install script and my controllers worked.... so I had a look at his script and couldn't work it out, but I did notice it was running from the folder,
home/pi/RetroPie-Setup/scriptmodules/supplementary/
I was able to run the script from Emulation Station, but not from the terminal.
So I had a look at other Attract Mode Setup scripts which run from within the retropiemenu folder.
For Example Configure Wifi.sh
#!/usr/bin/env bash sudo /home/pi/RetroPie-Setup/retropie_packages.sh retropiemenu launch/home/pi/RetroPie/retropiemenu/wifi.rp
So I had a go at linking retroswap.sh in the retropiemenu folder
And after using this scriptprintf "\033[H\033[2J" sudo /home/pi/RetroPie-Setup/retropie_packages.sh retropiemenu launch /home/pi/RetroPie/retropiemenu/retroswap.sh printf "\033[H\033[2J"
Every controller works straight away, no workarounds, no crashes, no screwed up Attract Mode on return.
so for the TL:DR version
If you create a script which you want to control with a controller instead of the keyboard, create a linked file within the retropiemenu folder and run the simple script like the one above to execute your script, and all the heavy lifting for the controller interface will be done for you. -
@flashpc hey mate. I didn't get the exact goal of your post, sorry. 😀
Do you need help to add joystick capabilities to your script or are you just sharing your findings?
-
@meleu said in Scripting help for replacing retroarch.cfg:
I didn't get the exact goal of your post
Yeah, I did ramble a bit, didn't I
Do you need help to add joystick capabilities to your script or are you just sharing your findings?
Originally I tried to add joystick capabilities myself and had to go through 3 programs to get it working, but it was buggy as hell.
So this is basically sharing my findings in the hope that I can help someone else not make the mistakes I did, by showing that the retropiemenu setup can do the controller setup for your scripts
-
@flashpc yeah, it's great. I took advantage of this feature in my rpie-art tool (link on my signature).
Cheers!
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.