RetroPie-Setup/scriptmodules/supplementary/snesdev.sh
Cristi Mitrana ea8db8e311
snesdev: updates for the new version
New version needs WiringPi, but not the original version that got discontinued. There's an active fork of WiringPi which also provides `.deb` files, so check whether this new version is installed first before compiling locally a static version and using it.

Other modifications:

* modified the installation/build to use `$md_build` and handle the installation ourselves, instead of using the upstream `make` targets. This means the driver is copied to `/opt/retropie` (just like `xboxdrv`) instead of being located in `/usr/local`.
* added a `systemd` unit file to start the driver and don't rely on the upstream `rc.d` service scripts.
2025-03-02 07:38:56 +02:00

177 lines
5.5 KiB
Bash

#!/usr/bin/env bash
# This file is part of The RetroPie Project
#
# The RetroPie Project is the legal property of its developers, whose names are
# too numerous to list here. Please refer to the COPYRIGHT.md file distributed with this source.
#
# See the LICENSE.md file at the top-level directory of this distribution and
# at https://raw.githubusercontent.com/RetroPie/RetroPie-Setup/master/LICENSE.md
#
rp_module_id="snesdev"
rp_module_desc="SNESDev (Driver for the RetroPie GPIO-Adapter)"
rp_module_section="driver"
rp_module_repo="git https://github.com/MonsterJoysticks/SNESDev-RPi-Wiring-Pi.git master"
rp_module_flags="noinstclean !all rpi"
# install the latest version of WiringPi
function _wiringpi_snesdev() {
pushd "$md_build"
gitPullOrClone wiringpi https://github.com/WiringPi/WiringPi.git
cd wiringpi
applyPatch "$md_data/001-wiringpi-static.diff"
make -C wiringPi libwiringPi.a
popd
}
function sources_snesdev() {
gitPullOrClone
}
function build_snesdev() {
local wiringpi_version
wiringpi_version="$(dpkg-query -f='${Version} ${Status}' -W wiringpi 2>/dev/null | grep installed | cut -f1)"
cd "$md_inst"
if [[ -z "$wiringpi_version" ]] || compareVersions "$wiringpi_version" lt 3.14; then
# when there's no WiringPi installed or there's an old version, build a static version and use it
printMsgs console "Using locally built WiringPi library"
_wiringpi_snesdev
make LDFLAGS=" -L"$md_build/wiringpi/wiringPi"" CFLAGS="$CFLAGS -I"$md_build/wiringpi/wiringPi""
else
make
fi
md_ret_require="$md_build/src/SNESDev"
}
function install_snesdev() {
md_ret_files=(
"src/SNESDev"
"README.md"
"supplementary/snesdev.cfg"
)
}
function configure_snesdev() {
if [[ "$md_mode" == "install" ]]; then
install -m 0755 "$md_inst/snesdev.cfg" "/etc/snesdev.cfg"
# remove old drivers and service
[[ -f "/usr/local/bin/SNESDev" ]] && rm -f "/usr/local/bin/SNESDev"
update-rc.d SNESDev remove
rm -f /etc/init.d/SNESDev
fi
}
function _systemd_install_snesdev() {
cat > /etc/systemd/system/snesdev.service << _EOF_
[Unit]
Description=Userspace SNES GPIO Driver
[Service]
ExecStart=$md_inst/SNESDev
[Install]
WantedBy=multi-user.target
_EOF_
systemctl daemon-reload
systemctl -q enable snesdev.service
}
function _systemd_uninstall_snesdev() {
if systemctl -q is-enabled snesdev.service 2>/dev/null; then
systemctl stop snesdev.service
systemctl -q disable snesdev.service
fi
[[ -f "/etc/systemd/system/snesdev.service" ]] && rm "/etc/systemd/system/snesdev.service"
}
# start SNESDev on boot and configure RetroArch input settings
function enable_at_start_snesdev() {
local mode="$1"
iniConfig "=" "" "/etc/snesdev.cfg"
clear
printHeading "Enabling SNESDev on boot."
case "$mode" in
1)
iniSet "button_enabled" "0"
iniSet "gamepad1_enabled" "1"
iniSet "gamepad2_enabled" "1"
_systemd_install_snesdev
;;
2)
iniSet "button_enabled" "1"
iniSet "gamepad1_enabled" "0"
iniSet "gamepad2_enabled" "0"
_systemd_install_snesdev
;;
3)
iniSet "button_enabled" "1"
iniSet "gamepad1_enabled" "1"
iniSet "gamepad2_enabled" "1"
_systemd_install_snesdev
;;
*)
echo "[enable_at_start_snesdev] I do not understand what is going on here."
;;
esac
}
function set_adapter_version_snesdev() {
local ver="$1"
iniConfig "=" "" "/etc/snesdev.cfg"
if [[ "$ver" -eq 1 ]]; then
iniSet "adapter_version" "1x"
else
iniSet "adapter_version" "2x"
fi
}
function remove_snesdev() {
_systemd_uninstall_snesdev
# remove old versions if found
[[ -f "/usr/local/bin/SNESDev" ]] && rm -f "/usr/local/bin/SNESDev"
}
function gui_snesdev() {
local cmd=(dialog --backtitle "$__backtitle" --menu "Choose an option." 22 86 16)
local options=(
1 "Enable SNESDev on boot and SNESDev keyboard mapping (polling pads and button)"
2 "Enable SNESDev on boot and SNESDev keyboard mapping (polling only pads)"
3 "Enable SNESDev on boot and SNESDev keyboard mapping (polling only button)"
4 "Switch to adapter version 1.X"
5 "Switch to adapter version 2.X"
D "Disable SNESDev on boot and SNESDev keyboard mapping"
)
local choice=$("${cmd[@]}" "${options[@]}" 2>&1 >/dev/tty)
if [[ -n "$choice" ]]; then
case "$choice" in
1)
enable_at_start_snesdev 3
printMsgs "dialog" "Enabled SNESDev on boot (polling pads and button)."
;;
2)
enable_at_start_snesdev 1
printMsgs "dialog" "Enabled SNESDev on boot (polling only pads)."
;;
3)
enable_at_start_snesdev 2
printMsgs "dialog" "Enabled SNESDev on boot (polling only button)."
;;
4)
set_adapter_version_snesdev 1
printMsgs "dialog" "Switched to adapter version 1.X."
;;
5)
set_adapter_version_snesdev 2
printMsgs "dialog" "Switched to adapter version 2.X."
;;
D)
_systemd_uninstall_snesdev
printMsgs "dialog" "Disabled SNESDev on boot."
;;
esac
fi
}