#!/bin/bash
# Audio/Gimbal startup for newer Raspberry Pi OS
# Prefer pinctrl (Bookworm/Trixie), fall back to raspi-gpio, then sysfs if available.

set -e

GPIO_TOOL=""

if command -v pinctrl >/dev/null 2>&1; then
    GPIO_TOOL="pinctrl"
elif command -v raspi-gpio >/dev/null 2>&1; then
    GPIO_TOOL="raspi-gpio"
fi

set_gpio() {
    local pin="$1"
    local level="$2"   # dh or dl

    if [ -n "$GPIO_TOOL" ]; then
        "$GPIO_TOOL" set "$pin" op pn "$level"
        return 0
    fi

    # Last resort: legacy sysfs GPIO, if enabled in kernel
    local gpio_path="/sys/class/gpio/gpio${pin}"

    if [ ! -d "$gpio_path" ]; then
        if [ ! -w /sys/class/gpio/export ]; then
            echo "Brak pinctrl/raspi-gpio i brak dostępu do /sys/class/gpio/export" >&2
            exit 1
        fi
        echo "$pin" > /sys/class/gpio/export 2>/dev/null || true
        sleep 0.1
    fi

    if [ ! -d "$gpio_path" ]; then
        echo "Nie udało się uzyskać dostępu do GPIO$pin" >&2
        exit 1
    fi

    echo "out" > "$gpio_path/direction"
    case "$level" in
        dh) echo "1" > "$gpio_path/value" ;;
        dl) echo "0" > "$gpio_path/value" ;;
        *)
            echo "Nieznany poziom GPIO: $level" >&2
            exit 1
            ;;
    esac
}

echo "Using GPIO backend: ${GPIO_TOOL:-sysfs}"

# starting the gimbals
set_gpio 17 dl
sleep 1
set_gpio 17 dh
echo "Engine driver reset"

# Turning on the audio will take 3 seconds to stabilize the voltage and avoid the 'pop' effect.
set_gpio 27 dh
sleep 1
set_gpio 26 dl
sleep 1
set_gpio 4 dh   # disable class D amplifier
sleep 1
set_gpio 16 dl  # reset DSP processor
sleep 1
set_gpio 16 dh  # enable DSP
sleep 1
set_gpio 4 dl   # enable amplifier

#sleep 1
#set_gpio 26 dl
#sleep 1

echo "Audio ON"
