diff --git a/rootfs/etc/s6-overlay/scripts/mlat-client b/rootfs/etc/s6-overlay/scripts/mlat-client index b13fc82..09eb8ae 100755 --- a/rootfs/etc/s6-overlay/scripts/mlat-client +++ b/rootfs/etc/s6-overlay/scripts/mlat-client @@ -77,20 +77,20 @@ GPSD=0 if grep -qs "gpsd" <<< "$ULTRAFEEDER_CONFIG" || grep -qs "gpsd" <<< "$ULTRAFEEDER_NET_CONNECTOR"; then GPSD=1 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" - "${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 # initialize "old" location for gpsd movement detection - old_lat="$new_lat" - old_lon="$new_lon" + # use zero island as starting point if location persist does not exit + 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}" # enforce gpsd min distance is no larger than 40m @@ -284,6 +284,12 @@ do # shellcheck disable=SC2048,SC2086 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 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: while true 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")" if ! [[ -f "$LOCATION_PERSIST" ]]; then echo "$new_lat" "$new_lon" "$new_alt" > "$LOCATION_PERSIST" fi 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 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" - else - "${s6wrap[@]}" --args echo "Receiver moved ${distance%%.*} meters" + msg+=" - Stopping all mlat-clients" fi + "${s6wrap[@]}" --args echo "${msg}" + old_lat="$new_lat" old_lon="$new_lon" @@ -338,6 +352,8 @@ do # no movement during the checking interval, allow mlat-clients to be restarted (( no_movement += ${GPSD_CHECK_INTERVAL:-30} )) || true 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 $! continue elif (( no_movement / ${GPSD_CHECK_INTERVAL:-30} == no_movement_required / ${GPSD_CHECK_INTERVAL:-30} )); then