diff --git a/arcade-bonnet.sh b/arcade-bonnet.sh new file mode 100755 index 0000000..fd85804 --- /dev/null +++ b/arcade-bonnet.sh @@ -0,0 +1,184 @@ +#!/bin/bash + +##### SET UP UDEV + +if [ $(id -u) -ne 0 ]; then + echo "Installer must be run as root." + echo "Try 'sudo bash $0'" + exit 1 +fi + +clear + +echo "This script installs software for the Adafruit" +echo "Arcade Bonnet for Raspberry Pi. Steps include:" +echo "- Update package index files (apt-get update)." +echo "- Install Python libraries: smbus, evdev." +echo "- Install arcadeBonnet.py in /boot and" +echo " configure /etc/rc.local to auto-start script." +echo "- Enable I2C bus." +echo "- OPTIONAL: disable overscan." +echo "Run time ~10 minutes. Reboot required." +echo "EXISTING INSTALLATION, IF ANY, WILL BE OVERWRITTEN." +echo +echo -n "CONTINUE? [y/N] " +read +if [[ ! "$REPLY" =~ ^(yes|y|Y)$ ]]; then + echo "Canceled." + exit 0 +fi + +# FEATURE PROMPTS ---------------------------------------------------------- +# Installation doesn't begin until after all user input is taken. + +DISABLE_OVERSCAN=0 +INSTALL_HALT=0 + +# Given a list of strings representing options, display each option +# preceded by a number (1 to N), display a prompt, check input until +# a valid number within the selection range is entered. +selectN() { + for ((i=1; i<=$#; i++)); do + echo $i. ${!i} + done + echo + REPLY="" + while : + do + echo -n "SELECT 1-$#: " + read + if [[ $REPLY -ge 1 ]] && [[ $REPLY -le $# ]]; then + return $REPLY + fi + done +} + +echo -n "Disable overscan? [y/N] " +read +if [[ "$REPLY" =~ (yes|y|Y)$ ]]; then + DISABLE_OVERSCAN=1 +fi + +echo -n "Install GPIO-halt utility? [y/N] " +read +if [[ "$REPLY" =~ (yes|y|Y)$ ]]; then + INSTALL_HALT=1 + echo -n "GPIO pin for halt: " + read + HALT_PIN=$REPLY +fi + +echo +if [ $DISABLE_OVERSCAN -eq 1 ]; then + echo "Overscan: disable." +else + echo "Overscan: keep current setting." +fi +if [ $INSTALL_HALT -eq 1 ]; then + echo "Install GPIO-halt: YES (GPIO$HALT_PIN)" +else + echo "Install GPIO-halt: NO" +fi +echo +echo -n "CONTINUE? [y/N] " +read +if [[ ! "$REPLY" =~ ^(yes|y|Y)$ ]]; then + echo "Canceled." + exit 0 +fi + +# START INSTALL ------------------------------------------------------------ +# All selections are validated at this point... + +# Given a filename, a regex pattern to match and a replacement string, +# perform replacement if found, else append replacement to end of file. +# (# $1 = filename, $2 = pattern to match, $3 = replacement) +reconfig() { + grep $2 $1 >/dev/null + if [ $? -eq 0 ]; then + # Pattern found; replace in file + sed -i "s/$2/$3/g" $1 >/dev/null + else + # Not found; append (silently) + echo $3 | sudo tee -a $1 >/dev/null + fi +} + +echo +echo "Starting installation..." +echo "Updating package index files..." +apt-get update + +echo "Installing Python libraries..." +apt-get install -y --force-yes python-pip python-dev python-smbus +pip install evdev + +echo "Installing Adafruit code in /boot..." +cd /tmp +curl -LO https://raw.githubusercontent.com/adafruit/Adafruit-Retrogame/master/arcadeBonnet.py +# Moving between filesystems requires copy-and-delete: +cp -r arcadeBonnet.py /boot +rm -f arcadeBonnet.py +if [ $INSTALL_HALT -ne 0 ]; then + echo "Installing gpio-halt in /usr/local/bin..." + curl -LO https://github.com/adafruit/Adafruit-GPIO-Halt/archive/master.zip + unzip master.zip + cd Adafruit-GPIO-Halt-master + make + mv gpio-halt /usr/local/bin + cd .. + rm -rf Adafruit-GPIO-Halt-master +fi + +# CONFIG ------------------------------------------------------------------- + +echo "Configuring system..." + +# Enable I2C using raspi-config +raspi-config nonint do_i2c 0 + +# Disable overscan compensation (use full screen): +if [ $DISABLE_OVERSCAN -eq 1 ]; then + raspi-config nonint do_overscan 1 +fi + +if [ $INSTALL_HALT -ne 0 ]; then + # Add gpio-halt to /rc.local: + grep gpio-halt /etc/rc.local >/dev/null + if [ $? -eq 0 ]; then + # gpio-halt already in rc.local, but make sure correct: + sed -i "s/^.*gpio-halt.*$/\/usr\/local\/bin\/gpio-halt $HALT_PIN \&/g" /etc/rc.local >/dev/null + else + # Insert gpio-halt into rc.local before final 'exit 0' + sed -i "s/^exit 0/\/usr\/local\/bin\/gpio-halt $HALT_PIN \&\\nexit 0/g" /etc/rc.local >/dev/null + fi +fi + +# Auto-start arcadeBonnet.py on boot +grep arcadeBonnet.py /etc/rc.local >/dev/null +if [ $? -eq 0 ]; then + # arcadeBonnet.py already in rc.local, but make sure correct: + sed -i "s/^.*arcadeBonnet.py.*$/cd \/boot;python arcadeBonnet.py \&/g" /etc/rc.local >/dev/null +else + # Insert arcadeBonnet.py into rc.local before final 'exit 0' +sed -i "s/^exit 0/cd \/boot;python arcadeBonnet.py \&\\nexit 0/g" /etc/rc.local >/dev/null +fi + +# Add udev rule (will overwrite if present) +echo "SUBSYSTEM==\"input\", ATTRS{name}==\"retrogame\", ENV{ID_INPUT_KEYBOARD}=\"1\"" > /etc/udev/rules.d/10-retrogame.rules + +# PROMPT FOR REBOOT -------------------------------------------------------- + +echo "Done." +echo +echo "Settings take effect on next boot." +echo +echo -n "REBOOT NOW? [y/N] " +read +if [[ ! "$REPLY" =~ ^(yes|y|Y)$ ]]; then + echo "Exiting without reboot." + exit 0 +fi +echo "Reboot started..." +reboot +exit 0