1
0
Fork 0
mirror of https://github.com/sdr-enthusiasts/docker-adsb-ultrafeeder.git synced 2024-12-27 06:42:00 +00:00
docker-adsb-ultrafeeder/rootfs/usr/local/bin/autogain1090
2023-03-24 13:44:41 +01:00

144 lines
No EOL
3.7 KiB
Text
Executable file

#!/usr/bin/with-contenv bash
# shellcheck shell=bash
low="${READSB_AUTOGAIN_LOW_PCT:-0.5}"
high="${READSB_AUTOGAIN_HIGH_PCT:-7.0}"
ga=(0.0 0.9 1.4 2.7 3.7 7.7 8.7 12.5 14.4 15.7 16.6 19.7 20.7 22.9 25.4 28.0 29.7 32.8 33.8 36.4 37.2 38.6 40.2 42.1 43.4 43.9 44.5 48.0 49.6 -10)
tmp=/var/globe_history/autogain
mkdir -p $tmp
mkdir -p /var/globe_history/autogain
#work around stupid locale stuff
export LC_ALL=C
APP=dump1090-fa
if [[ -f /run/dump1090-fa/stats.json ]]; then
APP=dump1090-fa
elif [[ -f /run/readsb/stats.json ]]; then
APP=readsb
fi
stats=/run/$APP/stats.json
if [[ "$1" == "reset" ]]; then
echo "Reset AutoGain - restarting with initial values and initialization process"
rm -f /var/globe_history/autogain/* >/dev/null 2>&1
pkill -f "s6-supervise autogain"
exit 0
fi
if ! [[ -f $stats ]]; then echo "stats.json not found, is the decoder running?"; exit 1; fi
oldstrong=$(cat $tmp/strong 2>/dev/null)
oldtotal=$(cat $tmp/total 2>/dev/null)
if [[ -z $oldstrong ]] || [[ -z $oldtotal ]]; then
oldstrong=0
oldtotal=0
fi
if ! grep -qs total $stats | grep -qs -e strong_signals $stats; then
echo "the decoder doesn't seem to be using an rtl-sdr device, can't help with that."
exit 1
fi
# start=$(jq '.total.start' < $stats)
# end=$(jq '.total.end' < $stats)
strong=$(jq '.total.local.strong_signals' < $stats | tee $tmp/strong)
total=$(jq '.total.local.accepted | add' < $stats | tee $tmp/total)
if [[ -z $strong ]] || [[ -z $total ]]; then
echo "unrecognized format: $stats"
exit 1
fi
if ! awk "BEGIN{ exit ($total < 1000) }"; then
echo "The decoder hasn't been running long enough, wait a bit!"
exit 1
fi
if (( oldtotal > total )) || (( oldstrong > strong )) || (( oldtotal == total )); then
oldstrong=0
oldtotal=0
fi
strong=$((strong - oldstrong))
total=$((total - oldtotal))
if [[ $total == 0 ]]; then
percent=0
else
percent=$(awk "BEGIN {printf \"%.3f\", $strong * 100 / $total}")
fi
strong=$percent
if [[ $strong == "nan" ]]; then echo "Error, can't automatically adjust gain!"; exit 1; fi
# Get the gain -- updated for docker-tar1090 use by kx1t
if [[ ! -f /var/globe_history/autogain/gain ]]; then
oldgain="49.6"
echo "Initial run. Starting point for adjusting gain is $oldgain"
else
read -r oldgain < /var/globe_history/autogain/gain
oldgain="${oldgain:-49.6}" # needed for stupidity reasons
fi
gain_index=28
for i in "${!ga[@]}"; do
if ! awk "BEGIN{ exit (${oldgain} <= ${ga[$i]}) }"; then
gain_index="${i}"
break
fi
done
if ! awk "BEGIN{ exit (${oldgain} > 49.6) }"; then
gain_index=28
fi
if [[ "$oldgain" == "-10" ]]; then
gain_index=28
fi
if ! awk "BEGIN{ exit ($strong > $low) }" && ! awk "BEGIN{ exit ($strong < $high) }"; then
echo "No gain change needed, percentage of messages >-3dB is in nominal range. (${strong}%)"
exit 0
fi
if ! awk "BEGIN{ exit ($strong < $low) }" && [[ $gain_index == 28 ]]; then
echo "Gain already at maximum! (${strong}% messages >-3dB)"
exit 0
fi
if ! awk "BEGIN{ exit ($strong < $low) }"; then
gain_index=$((gain_index+1))
action=Increasing
fi
if ! awk "BEGIN{ exit ($strong > $high) }" && [[ $gain_index == 0 ]]; then
echo "Gain already at minimum! (${strong}% messages >-3dB)"
exit 0
fi
if ! awk "BEGIN{ exit ($strong > $high) }"; then
gain_index=$((gain_index-1))
action=Decreasing
fi
gain="${ga[$gain_index]}"
if [[ $gain == "" ]]; then echo "Gain already at maximum! (${strong}% messages >-3dB)"; exit 0; fi
# Set the gain -- updated for docker-tar1090 use by kx1t
echo "$gain" > /var/globe_history/autogain/gain
pkill readsb
#reset numbers
echo 0 > $tmp/strong
echo 0 > $tmp/total
echo "$action gain to $gain (${strong}% messages >-3dB)"