#!/bin/sh # Color-coded echo functions echo_red() { printf "\033[1;31m$*\033[m\n"; } echo_green() { printf "\033[1;32m$*\033[m\n"; } echo_blue() { printf "\033[1;34m$*\033[m\n"; } # Default configurations UDP_IP=10.5.0.10 UDP_PORT=9999 LOG_INTERVAL=100 WFBGS_CFG=/etc/wifibroadcast.cfg WFBGS_CFG2=/home/radxa/gs/wfb.sh WFBGS_CFG3=/gs/wfb.sh # Variables for repository REPO_OWNER="OpenIPC" REPO_NAME="adaptive-link" # Function to fetch the latest release asset URL github_asset_url() { FILE_NAME=$1 curl -s "https://api.github.com/repos/$REPO_OWNER/$REPO_NAME/releases" | \ grep -o '"browser_download_url": "[^"]*' | \ grep "$FILE_NAME" | head -n 1 | sed 's/"browser_download_url": "//' } # Ensure the script is run as root if [ $(id -u) -ne 0 ]; then echo_red "Permission denied. Use sudo to run this script." echo "Usage: sudo $0 " exit 1 fi # Detect system type gs_check() { # Check for absence of Buildroot to identify a Ground Station grep -o "NAME=Buildroot" /etc/os-release > /dev/null 2>&1 || return 0 return 1 } dr_check() { # Ensure Buildroot is present, indicating a Drone setup gs_check || return 0 return 1 } # Function to update wifibroadcast configuration update_log_interval() { if grep -q "log_interval" ${WFBGS_CFG}; then sed -i 's/log_interval.*/log_interval = '${LOG_INTERVAL}'/' $WFBGS_CFG else sed -i '/\[common\]/a log_interval = '${LOG_INTERVAL}'' $WFBGS_CFG fi if [ -f "$WFBGS_CFG2" ]; then # If the file exists, update the log_interval here too (CC's GS) if grep -q "log_interval" "$WFBGS_CFG2"; then sed -i 's/log_interval.*/log_interval = '${LOG_INTERVAL}'/' "$WFBGS_CFG2" else sed -i '/\[common\]/a log_interval = '${LOG_INTERVAL}'' "$WFBGS_CFG2" fi fi if [ -f "$WFBGS_CFG3" ]; then # If the file exists, update the log_interval here too (CC's GS) if grep -q "log_interval" "$WFBGS_CFG3"; then sed -i 's/log_interval.*/log_interval = '${LOG_INTERVAL}'/' "$WFBGS_CFG3" else sed -i '/\[common\]/a log_interval = '${LOG_INTERVAL}'' "$WFBGS_CFG3" fi fi } # Ground Station setup gs_setup() { FILE_NAME=alink_gs FILE=/usr/local/bin/$FILE_NAME FILE_CONF="/etc/alink_gs.conf" # If /config exists, create or update the symlink so /etc/alink_gs.conf points to /config/alink_gs.conf if [ -d "/config" ]; then ln -sf /config/alink_gs.conf $FILE_CONF fi PATH_SERVICE=/etc/systemd/system/$FILE_NAME.service case "$1" in install) echo_blue "Installing Adaptive Link for Ground Station..." if [ -f $FILE ]; then echo_red "$FILE_NAME already installed. Use 'remove' first." exit 1 fi URL_ALINK_GS=$(github_asset_url "alink_gs") wget -O $FILE "$URL_ALINK_GS" && chmod +x $FILE # Create service file cat </dev/null sed -i '/.*'$FILE_NAME'.*/d' /etc/rc.local rm -f $FILE $TXPROFILE $ALINK cli -d .video0.qpDelta echo_green "Adaptive Link removed." ;; update) echo_blue "Updating Adaptive Link for Drone..." URL_ALINK_DRONE=$(github_asset_url "alink_drone") URL_TXPROFILE_CONF=$(github_asset_url "txprofiles.conf") URL_ALINK_CONF=$(github_asset_url "alink.conf") curl -L -o $FILE "$URL_ALINK_DRONE" curl -L -o $TXPROFILE "$URL_TXPROFILE_CONF" curl -L -o $ALINK "$URL_ALINK_CONF" # Set qpDelta cli -s .video0.qpDelta -12 echo_green "Adaptive Link updated successfully. Restart the drone." ;; *) echo_red "Invalid action for Drone. Use install, remove, or update." ;; esac } # Main script execution case "$1" in gs) gs_check || { echo_red "Error: Not a valid Ground Station environment."; exit 1; } gs_setup "$2";; drone) dr_check || { echo_red "Error: Not a valid Drone environment."; exit 1; } dr_setup "$2";; *) echo_red "Usage: $0 gs|drone install|remove|update" ;; esac exit 0