#!/bin/bash

CONFIG_FILE="/etc/modalai/voxl-px4.conf"

AIRFRAME=MULTICOPTER
GPS=NONE
RC=SPEKTRUM
ESC=VOXL_ESC
POWER_MANAGER=VOXLPM
AIRSPEED_SENSOR=NONE
DISTANCE_SENSOR=NONE
OSD=DISABLE
DAEMON_MODE=DISABLE
SENSOR_CAL=ACTUAL
ARTIFACT_MODE=DISABLE
HITL=DISABLE
EXTRA_STEPS=()

# Try to source configuration variables from a file.
# This will override anything already set in the environment.
if [ -f "$CONFIG_FILE" ]; then
    echo "[INFO] Reading from $CONFIG_FILE"
    source $CONFIG_FILE
else
    echo "[INFO] $CONFIG_FILE not found, using defaults"
fi

# Make sure that the SLPI DSP test signature is there otherwise px4 cannot run
# on the DSP
if /bin/ls /usr/lib/rfsa/adsp/testsig-*.so &> /dev/null; then
    /bin/echo "Found DSP signature file"
else
    /bin/echo "[WARNING] Could not find DSP signature file"
    # Look for the DSP signature generation script (platform-specific)
    if [ -f /share/modalai/qcs6490-slpi-test-sig/generate-test-sig.sh ]; then
        /bin/echo "[INFO] Attempting to generate the DSP signature file (qcs6490)"
        /share/modalai/qcs6490-slpi-test-sig/generate-test-sig.sh
    elif [ -f /share/modalai/qrb5165-slpi-test-sig/generate-test-sig.sh ]; then
        /bin/echo "[INFO] Attempting to generate the DSP signature file (qrb5165)"
        /share/modalai/qrb5165-slpi-test-sig/generate-test-sig.sh
    else
        /bin/echo "[ERROR] Could not find the DSP signature file generation script"
        exit 0
    fi
fi

print_usage() {
    echo -e "\nUsage: voxl-px4 [-a (Specify Airspeed Sensor)]"
    echo "                [-b (Specify Holybro GPS unit)]"
    echo "                [-c delete configuration file and exit]"
    echo "                [-d start px4 without daemon mode]"
    echo "                [-f (Use fake rc input instead of from a real transmitter)]"
    echo "                [-m (Specify Matek GPS unit)]"
    echo "                [-o (Start OSD module on the apps processor)]"
    echo "                [-p (Specify Fixed Wing airframe selected)]"
    echo "                [-r (Specify TBS Crossfire RC receiver, MAVLINK)]"
    echo "                [-s (Start in HITL simulation mode)]"
    echo "                [-S (Start in SIH simulation mode)]"
    echo "                [-w (Specify TBS Crossfire RC receiver, raw)]"
    echo "                [-z (Use fake sensor calibration values)]"
    echo "                [-h (show help)]"

    exit 1
}

print_config_settings(){
    echo -e "\n*************************"
    echo "AIRFRAME=$AIRFRAME"
    echo "GPS=$GPS"
    echo "RC=$RC"
    echo "ESC=$ESC"
    echo "POWER MANAGER=$POWER_MANAGER"
    echo "AIRSPEED SENSOR=$AIRSPEED_SENSOR"
    echo "DISTANCE SENSOR=$DISTANCE_SENSOR"
    echo "OSD=$OSD"
    echo "DAEMON_MODE=$DAEMON_MODE"
    echo "SENSOR_CAL=$SENSOR_CAL"
    echo "ARTIFACT_MODE=$ARTIFACT_MODE"
    echo "HITL=$HITL"

    echo "EXTRA STEPS:"
    for i in "${EXTRA_STEPS[@]}"
    do
        echo -e "\t$i"
    done
    echo -e "*************************\n"
}

while getopts "abcdhfmoprsSwz" flag
do
    case "${flag}" in
        a)
            echo "[INFO] MRO AIRSPEED Sensor selected"
            AIRSPEED_SENSOR=MS4525DO
            ;;
        b)
            echo "[INFO] Holybro GPS selected"
            GPS=HOLYBRO
            ;;
        c)
            echo "[INFO] Wiping old config file"
            if [ -f "$CONFIG_FILE" ]; then
                rm -rf ${CONFIG_FILE}
            fi
            exit 0
            ;;
        d)
            echo "[INFO] Disabling daemon mode"
            DAEMON_MODE=DISABLE
            ;;
        h)
            print_usage
            ;;
        f)
            echo "[INFO] Setting RC to FAKE_RC_INPUT"
            RC=FAKE_RC_INPUT
            ;;
        m)
            echo "[INFO] Matek GPS selected"
            GPS=MATEK
            ;;
        o)
            echo "[INFO] OSD module selected"
            OSD=ENABLE
            ;;
        p)
            echo "[INFO] Airframe Selected as Fixed Wing"
            AIRFRAME=FIXED_WING
            ;;
        r)
            echo "[INFO] TBS Crossfire RC receiver, MAVLINK selected"
            RC=CRSF_MAV
            ;;
        s)
            echo "[INFO] HITL simulation selected"
            HITL=ENABLED
            ;;
        S)
            echo "[INFO] SIH simulation mode selected"
            px4 -s /usr/bin/voxl-px4-sih-start
            exit 0
            ;;
        w)
            echo "[INFO] TBS Crossfire RC receiver, raw selected"
            RC=CRSF_RAW
            ;;
        z)
            echo "[INFO] Fake sensor calibration values selected"
            SENSOR_CAL=FAKE
            ;;
        *)
            print_usage
            ;;
    esac
done

if [ $DAEMON_MODE == "DISABLE" ]; then
    DAEMON=" "
else
    echo "[INFO] Daemon mode enabled"
    DAEMON="-d"
fi

if [ $SENSOR_CAL == "FAKE" ]; then
   /bin/echo "[INFO] Setting up fake sensor calibration values"
   px4 $DAEMON -s /etc/modalai/voxl-px4-fake-imu-calibration.config
   /bin/sync
fi

print_config_settings

if [ $HITL == "ENABLED" ]; then
   px4 -s /usr/bin/voxl-px4-hitl-start
else
   AIRFRAME=$AIRFRAME GPS=$GPS RC=$RC ESC=$ESC POWER_MANAGER=$POWER_MANAGER DISTANCE_SENSOR=$DISTANCE_SENSOR \
   AIRSPEED_SENSOR=$AIRSPEED_SENSOR OSD=$OSD EXTRA_STEPS=$EXTRA_STEPS ARTIFACT_MODE=$ARTIFACT_MODE \
   px4 $DAEMON -s /usr/bin/voxl-px4-start
fi
