1
0
Fork 0
mirror of https://github.com/sdr-enthusiasts/docker-adsb-ultrafeeder.git synced 2024-11-27 16:20:10 +00:00

don't immediately start mlat clients when GPSD is configured

This commit is contained in:
Matthias Wirth 2024-06-07 19:28:16 +02:00
parent 372600dfb5
commit 0b10463093

View file

@ -77,20 +77,20 @@ GPSD=0
if grep -qs "gpsd" <<< "$ULTRAFEEDER_CONFIG" || grep -qs "gpsd" <<< "$ULTRAFEEDER_NET_CONNECTOR"; then if grep -qs "gpsd" <<< "$ULTRAFEEDER_CONFIG" || grep -qs "gpsd" <<< "$ULTRAFEEDER_NET_CONNECTOR"; then
GPSD=1 GPSD=1
LOCATION_PERSIST=/var/globe_history/gpsd_last_location LOCATION_PERSIST=/var/globe_history/gpsd_last_location
if [[ -f "$LOCATION_PERSIST" ]] && { grep -qs "gpsd" <<< "$ULTRAFEEDER_CONFIG" || grep -qs "gpsd" <<< "$ULTRAFEEDER_NET_CONNECTOR"; }; then if [[ -f "$LOCATION_PERSIST" ]]; then
read new_lat new_lon new_alt < "$LOCATION_PERSIST" read new_lat new_lon new_alt < "$LOCATION_PERSIST"
"${s6wrap[@]}" --args echo "Using last known GPSD location for startup: $new_lat,$new_lon (alt: $new_alt)"
else
# wait for gpsd to continue with startup
"${s6wrap[@]}" --args echo "GPSD configured, no location set, no persistent location found, waiting for gpsd to provide location data"
while ! check_gpsd; do
sleep "${GPSD_CHECK_INTERVAL:-30}" & wait $!
done
"${s6wrap[@]}" --args echo "GPSD has provided location data"
fi fi
# initialize "old" location for gpsd movement detection # initialize "old" location for gpsd movement detection
old_lat="$new_lat" # use zero island as starting point if location persist does not exit
old_lon="$new_lon" old_lat=${new_lat:-0}
old_lon=${new_lon:-0}
# wait for gpsd to continue with startup
"${s6wrap[@]}" --args echo "GPSD configured, waiting for gpsd to provide location data"
while ! check_gpsd; do
sleep "${GPSD_CHECK_INTERVAL:-30}" & wait $!
done
"${s6wrap[@]}" --args echo "GPSD has provided location data"
GPSD_MIN_DISTANCE="${GPSD_MIN_DISTANCE:-20}" GPSD_MIN_DISTANCE="${GPSD_MIN_DISTANCE:-20}"
# enforce gpsd min distance is no larger than 40m # enforce gpsd min distance is no larger than 40m
@ -284,6 +284,12 @@ do
# shellcheck disable=SC2048,SC2086 # shellcheck disable=SC2048,SC2086
execstring="$(echo ${MLAT_CMD} ${MLAT_PARAM[*]} | xargs)" execstring="$(echo ${MLAT_CMD} ${MLAT_PARAM[*]} | xargs)"
if (( GPSD == 1 )); then
# when GPSD is active, just write the pid array, mlat-client will be started by the gpsd checking logic later
# use a long random PID so that it's detected as "not running"
pid_array["${RANDOM}${RANDOM}${RANDOM}"]="${MLAT_PARAM[*]}"
continue
fi
# stagger by 15 second so they don't all start at the same time # stagger by 15 second so they don't all start at the same time
sleep "${MLAT_STARTUP_STAGGER:-15}" & wait $! sleep "${MLAT_STARTUP_STAGGER:-15}" & wait $!
@ -311,20 +317,28 @@ sleep 5 & wait $!
# Now iterate over all MLAT-client instances and check if they are still running: # Now iterate over all MLAT-client instances and check if they are still running:
while true while true
do do
if check_gpsd; then if (( GPSD == 1 )); then
if ! check_gpsd; then
# don't do mlat client restarts if GPSD is configured but not providing a position
sleep "${GPSD_CHECK_INTERVAL}" & wait $!
continue
fi
distance="$(distance "$old_lat" "$old_lon" "$new_lat" "$new_lon")" distance="$(distance "$old_lat" "$old_lon" "$new_lat" "$new_lon")"
if ! [[ -f "$LOCATION_PERSIST" ]]; then if ! [[ -f "$LOCATION_PERSIST" ]]; then
echo "$new_lat" "$new_lon" "$new_alt" > "$LOCATION_PERSIST" echo "$new_lat" "$new_lon" "$new_alt" > "$LOCATION_PERSIST"
fi fi
if (( ${distance%%.*} > ${GPSD_MIN_DISTANCE:-20} )); then if (( ${distance%%.*} > ${GPSD_MIN_DISTANCE:-20} )); then
msg="Receiver moved ${distance%%.*} meters"
# kill the mlat-client instances so they get restarted with the new GPS coords # kill the mlat-client instances so they get restarted with the new GPS coords
if pkill -f "/usr/bin/python3 /usr/bin/mlat-client" >/dev/null 2>&1; then if pkill -f "/usr/bin/python3 /usr/bin/mlat-client" >/dev/null 2>&1; then
"${s6wrap[@]}" --args echo "Receiver moved ${distance%%.*} meters - Stopping all mlat-clients" msg+=" - Stopping all mlat-clients"
else
"${s6wrap[@]}" --args echo "Receiver moved ${distance%%.*} meters"
fi fi
"${s6wrap[@]}" --args echo "${msg}"
old_lat="$new_lat" old_lat="$new_lat"
old_lon="$new_lon" old_lon="$new_lon"
@ -338,6 +352,8 @@ do
# no movement during the checking interval, allow mlat-clients to be restarted # no movement during the checking interval, allow mlat-clients to be restarted
(( no_movement += ${GPSD_CHECK_INTERVAL:-30} )) || true (( no_movement += ${GPSD_CHECK_INTERVAL:-30} )) || true
if (( no_movement < no_movement_required )); then if (( no_movement < no_movement_required )); then
msg="Receiver moved less than ${GPSD_MIN_DISTANCE} meters, $(( no_movement_required - no_movement )) seconds remaining before starting mlat-clients"
"${s6wrap[@]}" --args echo "${msg}"
sleep "${GPSD_CHECK_INTERVAL:-30}" & wait $! sleep "${GPSD_CHECK_INTERVAL:-30}" & wait $!
continue continue
elif (( no_movement / ${GPSD_CHECK_INTERVAL:-30} == no_movement_required / ${GPSD_CHECK_INTERVAL:-30} )); then elif (( no_movement / ${GPSD_CHECK_INTERVAL:-30} == no_movement_required / ${GPSD_CHECK_INTERVAL:-30} )); then