diff --git a/.gitignore b/.gitignore index acb007e4..a63f7b2e 100644 --- a/.gitignore +++ b/.gitignore @@ -50,3 +50,4 @@ sim_mode_auto direwolf-pacsatsim-tmp.conf groundstation/direwolf-pacsat-tmp.conf tlm.bin +frequency.txt diff --git a/config b/config index 634d4d57..7b69b013 100755 --- a/config +++ b/config @@ -94,11 +94,21 @@ function check_restart { value=`cat /home/pi/CubeSatSim/.mode` echo "$value" > /dev/null set -- $value + MODE=$1 + + value=`cat /home/pi/CubeSatSim/sim.cfg` + echo "$value" > /dev/null + set -- $value + if [ "${14}" = "sim" ] || [ "${14}" = "rig" ] ; then + DOPPLER=1 + else + DOPPLER=0 + fi -# if [ "$1" = "p" ] || [ "$1" = "P" ] ; then +# if [ "$MODE" = "p" ] || [ "$MODE" = "P" ] ; then # reboot=1 #el - if [ "$1" == "f" ] || [ "$1" == "b" ] || [ "$1" == "e" ] || [ "$1" == "j" ] ; then + if [ "$MODE" == "f" ] || [ "$MODE" == "b" ] || [ "$MODE" == "e" ] || [ "$MODE" == "j" ] ; then FILE=/home/pi/CubeSatSim/battery_saver if [ -f "$FILE" ]; then restart=1 @@ -107,6 +117,8 @@ function check_restart { reboot=1 # echo "Need to reboot" fi + elif [ "$MODE" == "m" ] || [ "$DOPPLER" == "1" ] ; then + reboot=1 else restart=1 # echo "Need to restart" @@ -122,11 +134,11 @@ echo sudo modprobe snd-aloop -# if [ "$2" = "n" ] ; then +# if [ "$2" = "-n" ] ; then if [ -z "$2" ] ; then noreboot=0 else - if [ "$2" = "n" ] ; then + if [ "$2" = "-n" ] ; then echo "Reboot disabled" noreboot=1 else @@ -260,13 +272,51 @@ if [ "$1" = "" ]; then echo "Random Failure Mode is OFF" fi - echo -n "TX Frequency is: " - echo -n ${7} - echo -n " MHz, RX Frequency is: " - echo -n ${8} - echo " MHz" +HAB=$9 +SQUELCH=$6 +RXPL=${10} +TXPL=${11} - if [ "$9" = "yes" ] || [ "$9" = "y" ]; then +# echo ${14} + if [[ ( "${14}" == "sim" || "${14}" == "rig" ) && ( "$MODE" == "f" || "$MODE" == "b" || "$MODE" == "j") ]] ; then + echo "Doppler frequency shift is ON but not active in this mode (only APRS, CW, SSTV, and Repeater modes)" + echo -n "TX Frequency is approximately: " + echo -n ${7} + echo -n " MHz, RX Frequency is: " + echo -n ${8} + echo " MHz" + elif [ "${14}" = "sim" ] ; then + echo "Simulated Doppler frequency shift enabled" + echo -n "Current TX and RX Frequency (Hz) is: " + cat /home/pi/CubeSatSim/frequency.txt + echo +# echo -n ${7} +# echo -n " MHz, RX Frequency is: " +# echo -n ${8} +# echo " MHz" + elif [ "${14}" = "rig" ] ; then + echo "rigctld Doppler frequency shift enabled" + echo -n "Current TX Frequency (Hz) is: " + head -c -11 frequency.txt + echo -e "\nCurrent RX Frequency (MHz) is: ${8} or set for a particular satellite" + elif [[ ( "$MODE" == "f" || "$MODE" == "b" || "$MODE" == "j") ]] ; then + echo "Doppler frequency shift is OFF" + echo -n "TX Frequency is approximately: " + echo -n ${7} + echo -n " MHz, RX Frequency is: " + echo -n ${8} + echo " MHz" + else + echo "Doppler frequency shift is OFF" + echo -n "TX Frequency is: " + echo -n ${7} + echo -n " MHz, RX Frequency is: " + echo -n ${8} + echo " MHz" + + fi + + if [ "$HAB" = "yes" ] || [ "$HAB" = "y" ]; then echo "Balloon mode is ON" else echo "Balloon mode is OFF" @@ -286,7 +336,7 @@ if [ "$1" = "" ]; then echo "Squelch is off since PacSat or PacSat Ground Station mode" else echo -n "Squelch level is: " - echo $6 + echo $SQUELCH fi # echo @@ -318,10 +368,10 @@ if [ "$1" = "" ]; then # echo echo -n "RX PL code is: " - echo -n ${10} + echo -n $RXPL # echo echo -n " TX PL code is: " - echo ${11} + echo $TXPL # echo FILE=/home/pi/CubeSatSim/battery_saver @@ -368,7 +418,8 @@ if [ "$1" = "" ]; then echo -e "Current sim.cfg configuration file:" # echo - echo $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} ${12} ${13} +# echo $1 $2 $3 $4 $5 $SQUELCH $7 $8 $HAB $RXPL $TXPL ${12} ${13} ${14} + cat /home/pi/CubeSatSim/sim.cfg echo echo "To change, include an OPTION" @@ -413,7 +464,22 @@ elif [ "$1" = "-m" ]; then else echo "changing CubeSatSim to CW mode" - check_restart + + value=`cat /home/pi/CubeSatSim/sim.cfg` + echo "$value" > /dev/null + set -- $value + if [ "${14}" = "sim" ] || [ "${14}" = "rig" ] ; then + DOPPLER=1 + else + DOPPLER=0 + fi + + if [ "$DOPPLER" = "1" ] ; then + restart=1 + else + check_restart + fi + sudo echo "m" > /home/pi/CubeSatSim/.mode fi @@ -497,7 +563,7 @@ elif [ "$1" = "-t" ]; then echo -# $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${12} ${13} +# $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${12} ${13} ${14} echo "Do you want Simulated Telemetry ON (y/n) " read sim @@ -515,8 +581,8 @@ elif [ "$1" = "-t" ]; then # echo echo -e "\nCubeSatSim configuration sim.cfg file updated to: \n" # echo - echo $1 $2 $3 $4 $sim $6 $7 $8 $9 ${10} ${11} ${12} ${13} - echo $1 $2 $3 $4 $sim $6 $7 $8 $9 ${10} ${11} ${12} ${13} > /home/pi/CubeSatSim/sim.cfg + echo $1 $2 $3 $4 $sim $6 $7 $8 $9 ${10} ${11} ${12} ${13} ${14} + echo $1 $2 $3 $4 $sim $6 $7 $8 $9 ${10} ${11} ${12} ${13} ${14} > /home/pi/CubeSatSim/sim.cfg echo ## echo "Rebooting CubeSatSim with new configuration file" ## echo @@ -545,7 +611,7 @@ elif [ "$1" = "-c" ]; then echo $oldcallsign echo -# echo $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${12} ${13} +# echo $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${12} ${13} ${14} echo "Enter callsign in all capitals: " read callsign @@ -559,8 +625,8 @@ elif [ "$1" = "-c" ]; then echo -e "\nCubeSatSim configuration sim.cfg file updated to: \n" - echo $callsign $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} ${12} ${13} - echo $callsign $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} ${12} ${13} > /home/pi/CubeSatSim/sim.cfg + echo $callsign $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} ${12} ${13} ${14} + echo $callsign $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} ${12} ${13} ${14} > /home/pi/CubeSatSim/sim.cfg fi if [ "$norestart" = "1" ]; then @@ -593,7 +659,7 @@ elif [ "$1" = "-r" ]; then echo $2 echo -# echo $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} ${12} ${13} +# echo $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} ${12} ${13} ${14} echo -e "Enter Reset Count (integer): " @@ -613,8 +679,8 @@ elif [ "$1" = "-r" ]; then echo -e "\nCubeSatSim configuration sim.cfg file updated to: \n" - echo $1 $resets $3 $4 $5 $6 $7 $8 $9 ${10} ${11} ${12} ${13} - echo $1 $resets $3 $4 $5 $6 $7 $8 $9 ${10} ${11} ${12} ${13} > /home/pi/CubeSatSim/sim.cfg + echo $1 $resets $3 $4 $5 $6 $7 $8 $9 ${10} ${11} ${12} ${13} ${14} + echo $1 $resets $3 $4 $5 $6 $7 $8 $9 ${10} ${11} ${12} ${13} ${14} > /home/pi/CubeSatSim/sim.cfg fi if [ "$norestart" = "1" ]; then @@ -648,7 +714,7 @@ elif [ "$1" = "-l" ]; then echo $3 echo -# echo $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} ${12} ${13} +# echo $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} ${12} ${13} ${14} echo -e "Enter latitude (decimal degrees, positive is north): " @@ -690,8 +756,8 @@ elif [ "$1" = "-l" ]; then fi echo -e "\nCubeSatSim configuration sim.cfg file updated to: \n" - echo $1 $2 $lat $long $5 $6 $7 $8 $9 ${10} ${11} ${12} ${13} - echo $1 $2 $lat $long $5 $6 $7 $8 $9 ${10} ${11} ${12} ${13} > /home/pi/CubeSatSim/sim.cfg + echo $1 $2 $lat $long $5 $6 $7 $8 $9 ${10} ${11} ${12} ${13} ${14} + echo $1 $2 $lat $long $5 $6 $7 $8 $9 ${10} ${11} ${12} ${13} ${14} > /home/pi/CubeSatSim/sim.cfg if [ "$norestart" = "1" ]; then echo @@ -1002,7 +1068,7 @@ elif [ "$1" = "-q" ]; then echo $6 echo -# echo $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} ${12} ${13} +# echo $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} ${12} ${13} ${14} echo -e "Enter squelch (integer 1 - 8): " @@ -1024,8 +1090,8 @@ elif [ "$1" = "-q" ]; then # echo echo -e "\nCubeSatSim configuration sim.cfg file updated to: \n" # echo - echo $1 $2 $3 $4 $5 $sq $7 $8 $9 ${10} ${11} ${12} ${13} - echo $1 $2 $3 $4 $4 $sq $7 $8 $9 ${10} ${11} ${12} ${13} > /home/pi/CubeSatSim/sim.cfg + echo $1 $2 $3 $4 $5 $sq $7 $8 $9 ${10} ${11} ${12} ${13} ${14} + echo $1 $2 $3 $4 $4 $sq $7 $8 $9 ${10} ${11} ${12} ${13} ${14} > /home/pi/CubeSatSim/sim.cfg echo echo "Restarting CubeSatSim with new configuration file" ## echo @@ -1061,7 +1127,7 @@ elif [ "$1" = "-P" ]; then echo ${11} echo -# echo $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} ${12} ${13} +# echo $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} ${12} ${13} ${14} echo -e "Enter RX PL value integer 0: None, 01-38: CTCSS (analog, 39-121:CDCSS (digital)" @@ -1104,13 +1170,13 @@ elif [ "$1" = "-P" ]; then # echo echo -e "\nCubeSatSim configuration sim.cfg file updated to: \n" # echo - echo $1 $2 $3 $4 $5 $6 $7 $8 $9 $rxpl $txpl ${12} ${13} - echo $1 $2 $3 $4 $5 $6 $7 $8 $9 $rxpl $txpl ${12} ${13} > /home/pi/CubeSatSim/sim.cfg + echo $1 $2 $3 $4 $5 $6 $7 $8 $9 $rxpl $txpl ${12} ${13} ${14} + echo $1 $2 $3 $4 $5 $6 $7 $8 $9 $rxpl $txpl ${12} ${13} ${14} > /home/pi/CubeSatSim/sim.cfg echo ## echo "Rebooting CubeSatSim with new configuration file" ## echo - reboot=1 + restart=1 ## sudo reboot now # sudo systemctl restart cubesatsim @@ -1135,7 +1201,7 @@ elif [ "$1" = "-F" ]; then echo $8 echo -# echo $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} ${12} ${13} +# echo $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} ${12} ${13} ${14} echo "Enter tx frequency as 4XX.XXXX: " read tx @@ -1156,8 +1222,13 @@ elif [ "$1" = "-F" ]; then fi echo -e "\nCubeSatSim configuration sim.cfg file updated to: \n" - echo $1 $2 $3 $4 $5 $6 $tx $rx $9 ${10} ${11} ${12} ${13} - echo $1 $2 $3 $4 $5 $6 $tx $rx $9 ${10} ${11} ${12} ${13} > /home/pi/CubeSatSim/sim.cfg + echo $1 $2 $3 $4 $5 $6 $tx $rx $9 ${10} ${11} ${12} ${13} ${14} + echo $1 $2 $3 $4 $5 $6 $tx $rx $9 ${10} ${11} ${12} ${13} ${14} > /home/pi/CubeSatSim/sim.cfg + + rxf=$(echo "$rx * 1000000" | bc) + txf=$(echo "$tx * 1000000" | bc) + echo $txf $rxf + echo $txf $rxf > /home/pi/CubeSatSim/frequency.txt echo echo "Restarting CubeSatSim with new configuration file" @@ -1228,7 +1299,7 @@ elif [ "$1" = "-H" ]; then echo -# echo $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} ${12} ${13} +# echo $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} ${12} ${13} ${14} echo "Do you want Balloon mode ON (y/n) " read hab @@ -1245,8 +1316,8 @@ elif [ "$1" = "-H" ]; then # echo echo -e "\nCubeSatSim configuration sim.cfg file updated to: \n" # echo - echo $1 $2 $3 $4 $5 $6 $7 $8 $hab ${10} ${11} ${12} ${13} - echo $1 $2 $3 $4 $5 $6 $7 $8 $hab ${10} ${11} ${12} ${13} > /home/pi/CubeSatSim/sim.cfg + echo $1 $2 $3 $4 $5 $6 $7 $8 $hab ${10} ${11} ${12} ${13} ${14} + echo $1 $2 $3 $4 $5 $6 $7 $8 $hab ${10} ${11} ${12} ${13} ${14} > /home/pi/CubeSatSim/sim.cfg echo ## echo "Rebooting CubeSatSim with new configuration file" ## echo @@ -1425,7 +1496,7 @@ elif [ "$1" = "-g" ]; then echo "Resetting" - echo "AMSAT 0 0 0 no 3 434.9 435 no 0 0" > /home/pi/CubeSatSim/sim.cfg + echo "AMSAT 0 0 0 no 3 434.9 435 no 0 0 no 60 no" > /home/pi/CubeSatSim/sim.cfg sudo echo "b" > /home/pi/CubeSatSim/.mode @@ -1721,7 +1792,7 @@ elif [ "$1" = "-U" ]; then echo -# $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${12} ${13} +# $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${12} ${13} ${14} echo "Do you want Random Simulated Failure ON (y/n) " read sim @@ -1761,8 +1832,8 @@ elif [ "$1" = "-U" ]; then # echo echo -e "\nCubeSatSim configuration sim.cfg file updated to: \n" # echo - echo $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} $sim $time - echo $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} $sim $time > /home/pi/CubeSatSim/sim.cfg + echo $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} $sim $time ${14} + echo $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} $sim $time ${14} > /home/pi/CubeSatSim/sim.cfg echo if [ "${12}" != "$sim" ] || [ "${13}" != "$time" ] ; then @@ -1888,6 +1959,69 @@ elif [ "$1" = "-k" ]; then reboot=1 # sudo systemctl restart pacsatsim +elif [ "$1" = "-K" ]; then + + echo + echo "Editing the Doppler frequency shift setting in" + echo "the configuration file for CubeSatSim" + echo + + value=`cat /home/pi/CubeSatSim/sim.cfg` + echo "$value" > /dev/null + set -- $value + doppler="${14}" + + if [ "${14}" = "sim" ] ; then + echo "Simulated Doppler frequency shift mode enabled" + elif [ "${14}" = "rig" ] ; then + echo "rigctld Doppler frequency shift mode enabled" + else + echo "Doppler frequency shift is OFF" + fi + + echo + +# $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${12} ${13} ${14} + + echo "Do you want Doppler frequency shift ON (y/n) " + read sim + echo + + if [ "$sim" = "y" ] || [ "$sim" = "yes" ] ; then + doppler="yes" + echo "Do you want simulated Doppler shift or rigctld Doppler (sim/rig)" + read doppler + + if [ "$doppler" = "sim" ] ; then + echo "Simulated Doppler frequency shift mode enabled" + elif [ "$doppler" = "rig" ] ; then + echo "rigctld Doppler frequency shift mode enabled" + else + doppler="no" + echo "sim or rig not entered. Doppler frequency shift is OFF" + fi + else + doppler="no" + echo " Doppler frequency shift is OFF" + fi + +# echo + echo -e "\nCubeSatSim configuration sim.cfg file updated to: \n" +# echo + echo $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} ${12} ${13} $doppler + echo $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} ${12} ${13} $doppler > /home/pi/CubeSatSim/sim.cfg + echo + + value=`cat /home/pi/CubeSatSim/.mode` + echo "$value" > /dev/null + set -- $value + +# if [[ ( "$doppler" == "y" || "$doppler" == "yes" ) && ( "$1" == "m" ) && ( "$doppler" == "no" ) ]] ; then +# reboot=1 +# else + restart=1 +# fi + elif [ "$1" = "-h" ]; then echo "config OPTION" @@ -1934,6 +2068,7 @@ elif [ "$1" = "-h" ]; then echo " -N Set next mode or failure" echo " -u Change gpsd state" echo " -k Reset the PacSatSim Configuration" + echo " -K Change the Doppler frequency shift setting" echo exit diff --git a/frequency.py b/frequency.py new file mode 100644 index 00000000..d05b2e82 --- /dev/null +++ b/frequency.py @@ -0,0 +1,865 @@ +#!/usr/bin/env python + +#import subprocess +import time +from time import sleep +#import os +import sys +from os import system + +def check_frequency(): + + global tx_doppler_freq_hz + global rx_doppler_freq_hz + tx_OK = False + rx_OK = False + + if tx_doppler_freq_hz > 450000000: + tx_doppler_freq_hz = 435200000 + elif (tx_doppler_freq_hz < 420000000) and (tx_doppler_freq_hz > 148000000): + tx_doppler_freq_hz = 434700000 + elif (tx_doppler_freq_hz < 144000000): + tx_doppler_freq_hz = 434600000 + else: + tx_OK = True + + if rx_doppler_freq_hz > 450000000: + rx_doppler_freq_hz = 435200000 + elif (rx_doppler_freq_hz < 420000000) and (rx_doppler_freq_hz > 148000000): + rx_doppler_freq_hz = 434700000 + elif (rx_doppler_freq_hz < 144000000): + rx_doppler_freq_hz = 434600000 + else: + rx_OK = True + + if (tx_OK != True) or (rx_OK != True): + print("Error - frequency out of range!") + +iss_doppler_passes = { + 88: [ + {"time_sec": 1, "doppler_434_khz": 9987, "doppler_144_khz": 3329}, + {"time_sec": 2, "doppler_434_khz": 9987, "doppler_144_khz": 3329}, + {"time_sec": 3, "doppler_434_khz": 9987, "doppler_144_khz": 3329}, + {"time_sec": 4, "doppler_434_khz": 9987, "doppler_144_khz": 3329}, + {"time_sec": 5, "doppler_434_khz": 9987, "doppler_144_khz": 3329}, + {"time_sec": 6, "doppler_434_khz": 9987, "doppler_144_khz": 3329}, + {"time_sec": 7, "doppler_434_khz": 9987, "doppler_144_khz": 3329}, + {"time_sec": 8, "doppler_434_khz": 9987, "doppler_144_khz": 3329}, + {"time_sec": 9, "doppler_434_khz": 9987, "doppler_144_khz": 3329}, + {"time_sec": 10, "doppler_434_khz": 9987, "doppler_144_khz": 3329}, + {"time_sec": 11, "doppler_434_khz": 9987, "doppler_144_khz": 3329}, + {"time_sec": 12, "doppler_434_khz": 9986, "doppler_144_khz": 3329}, + {"time_sec": 13, "doppler_434_khz": 9986, "doppler_144_khz": 3329}, + {"time_sec": 14, "doppler_434_khz": 9986, "doppler_144_khz": 3329}, + {"time_sec": 15, "doppler_434_khz": 9986, "doppler_144_khz": 3329}, + {"time_sec": 16, "doppler_434_khz": 9986, "doppler_144_khz": 3329}, + {"time_sec": 17, "doppler_434_khz": 9985, "doppler_144_khz": 3328}, + {"time_sec": 18, "doppler_434_khz": 9985, "doppler_144_khz": 3328}, + {"time_sec": 19, "doppler_434_khz": 9985, "doppler_144_khz": 3328}, + {"time_sec": 20, "doppler_434_khz": 9985, "doppler_144_khz": 3328}, + {"time_sec": 21, "doppler_434_khz": 9984, "doppler_144_khz": 3328}, + {"time_sec": 22, "doppler_434_khz": 9984, "doppler_144_khz": 3328}, + {"time_sec": 23, "doppler_434_khz": 9984, "doppler_144_khz": 3328}, + {"time_sec": 24, "doppler_434_khz": 9984, "doppler_144_khz": 3328}, + {"time_sec": 25, "doppler_434_khz": 9983, "doppler_144_khz": 3328}, + {"time_sec": 26, "doppler_434_khz": 9983, "doppler_144_khz": 3328}, + {"time_sec": 27, "doppler_434_khz": 9983, "doppler_144_khz": 3328}, + {"time_sec": 28, "doppler_434_khz": 9982, "doppler_144_khz": 3327}, + {"time_sec": 29, "doppler_434_khz": 9982, "doppler_144_khz": 3327}, + {"time_sec": 30, "doppler_434_khz": 9982, "doppler_144_khz": 3327}, + {"time_sec": 31, "doppler_434_khz": 9981, "doppler_144_khz": 3327}, + {"time_sec": 32, "doppler_434_khz": 9981, "doppler_144_khz": 3327}, + {"time_sec": 33, "doppler_434_khz": 9980, "doppler_144_khz": 3327}, + {"time_sec": 34, "doppler_434_khz": 9980, "doppler_144_khz": 3327}, + {"time_sec": 35, "doppler_434_khz": 9979, "doppler_144_khz": 3326}, + {"time_sec": 36, "doppler_434_khz": 9979, "doppler_144_khz": 3326}, + {"time_sec": 37, "doppler_434_khz": 9978, "doppler_144_khz": 3326}, + {"time_sec": 38, "doppler_434_khz": 9978, "doppler_144_khz": 3326}, + {"time_sec": 39, "doppler_434_khz": 9977, "doppler_144_khz": 3326}, + {"time_sec": 40, "doppler_434_khz": 9977, "doppler_144_khz": 3326}, + {"time_sec": 41, "doppler_434_khz": 9976, "doppler_144_khz": 3325}, + {"time_sec": 42, "doppler_434_khz": 9975, "doppler_144_khz": 3325}, + {"time_sec": 43, "doppler_434_khz": 9975, "doppler_144_khz": 3325}, + {"time_sec": 44, "doppler_434_khz": 9974, "doppler_144_khz": 3325}, + {"time_sec": 45, "doppler_434_khz": 9973, "doppler_144_khz": 3324}, + {"time_sec": 46, "doppler_434_khz": 9973, "doppler_144_khz": 3324}, + {"time_sec": 47, "doppler_434_khz": 9972, "doppler_144_khz": 3324}, + {"time_sec": 48, "doppler_434_khz": 9972, "doppler_144_khz": 3324}, + {"time_sec": 49, "doppler_434_khz": 9971, "doppler_144_khz": 3324}, + {"time_sec": 50, "doppler_434_khz": 9970, "doppler_144_khz": 3323}, + {"time_sec": 51, "doppler_434_khz": 9969, "doppler_144_khz": 3323}, + {"time_sec": 52, "doppler_434_khz": 9969, "doppler_144_khz": 3323}, + {"time_sec": 53, "doppler_434_khz": 9968, "doppler_144_khz": 3323}, + {"time_sec": 54, "doppler_434_khz": 9967, "doppler_144_khz": 3322}, + {"time_sec": 55, "doppler_434_khz": 9966, "doppler_144_khz": 3322}, + {"time_sec": 56, "doppler_434_khz": 9966, "doppler_144_khz": 3322}, + {"time_sec": 57, "doppler_434_khz": 9964, "doppler_144_khz": 3321}, + {"time_sec": 58, "doppler_434_khz": 9963, "doppler_144_khz": 3321}, + {"time_sec": 59, "doppler_434_khz": 9963, "doppler_144_khz": 3321}, + {"time_sec": 60, "doppler_434_khz": 9962, "doppler_144_khz": 3321}, + {"time_sec": 61, "doppler_434_khz": 9961, "doppler_144_khz": 3320}, + {"time_sec": 62, "doppler_434_khz": 9959, "doppler_144_khz": 3320}, + {"time_sec": 63, "doppler_434_khz": 9959, "doppler_144_khz": 3320}, + {"time_sec": 64, "doppler_434_khz": 9958, "doppler_144_khz": 3319}, + {"time_sec": 65, "doppler_434_khz": 9957, "doppler_144_khz": 3319}, + {"time_sec": 66, "doppler_434_khz": 9955, "doppler_144_khz": 3318}, + {"time_sec": 67, "doppler_434_khz": 9954, "doppler_144_khz": 3318}, + {"time_sec": 68, "doppler_434_khz": 9953, "doppler_144_khz": 3318}, + {"time_sec": 69, "doppler_434_khz": 9952, "doppler_144_khz": 3317}, + {"time_sec": 70, "doppler_434_khz": 9951, "doppler_144_khz": 3317}, + {"time_sec": 71, "doppler_434_khz": 9950, "doppler_144_khz": 3317}, + {"time_sec": 72, "doppler_434_khz": 9949, "doppler_144_khz": 3316}, + {"time_sec": 73, "doppler_434_khz": 9948, "doppler_144_khz": 3316}, + {"time_sec": 74, "doppler_434_khz": 9946, "doppler_144_khz": 3315}, + {"time_sec": 75, "doppler_434_khz": 9945, "doppler_144_khz": 3315}, + {"time_sec": 76, "doppler_434_khz": 9943, "doppler_144_khz": 3314}, + {"time_sec": 77, "doppler_434_khz": 9942, "doppler_144_khz": 3314}, + {"time_sec": 78, "doppler_434_khz": 9941, "doppler_144_khz": 3314}, + {"time_sec": 79, "doppler_434_khz": 9939, "doppler_144_khz": 3313}, + {"time_sec": 80, "doppler_434_khz": 9938, "doppler_144_khz": 3313}, + {"time_sec": 81, "doppler_434_khz": 9937, "doppler_144_khz": 3312}, + {"time_sec": 82, "doppler_434_khz": 9936, "doppler_144_khz": 3312}, + {"time_sec": 83, "doppler_434_khz": 9933, "doppler_144_khz": 3311}, + {"time_sec": 84, "doppler_434_khz": 9932, "doppler_144_khz": 3311}, + {"time_sec": 85, "doppler_434_khz": 9931, "doppler_144_khz": 3310}, + {"time_sec": 86, "doppler_434_khz": 9929, "doppler_144_khz": 3310}, + {"time_sec": 87, "doppler_434_khz": 9927, "doppler_144_khz": 3309}, + {"time_sec": 88, "doppler_434_khz": 9925, "doppler_144_khz": 3308}, + {"time_sec": 89, "doppler_434_khz": 9924, "doppler_144_khz": 3308}, + {"time_sec": 90, "doppler_434_khz": 9923, "doppler_144_khz": 3308}, + {"time_sec": 91, "doppler_434_khz": 9920, "doppler_144_khz": 3307}, + {"time_sec": 92, "doppler_434_khz": 9918, "doppler_144_khz": 3306}, + {"time_sec": 93, "doppler_434_khz": 9917, "doppler_144_khz": 3306}, + {"time_sec": 94, "doppler_434_khz": 9915, "doppler_144_khz": 3305}, + {"time_sec": 95, "doppler_434_khz": 9912, "doppler_144_khz": 3304}, + {"time_sec": 96, "doppler_434_khz": 9911, "doppler_144_khz": 3304}, + {"time_sec": 97, "doppler_434_khz": 9909, "doppler_144_khz": 3303}, + {"time_sec": 98, "doppler_434_khz": 9907, "doppler_144_khz": 3302}, + {"time_sec": 99, "doppler_434_khz": 9906, "doppler_144_khz": 3302}, + {"time_sec": 100, "doppler_434_khz": 9903, "doppler_144_khz": 3301}, + {"time_sec": 101, "doppler_434_khz": 9901, "doppler_144_khz": 3300}, + {"time_sec": 102, "doppler_434_khz": 9899, "doppler_144_khz": 3300}, + {"time_sec": 103, "doppler_434_khz": 9897, "doppler_144_khz": 3299}, + {"time_sec": 104, "doppler_434_khz": 9894, "doppler_144_khz": 3298}, + {"time_sec": 105, "doppler_434_khz": 9892, "doppler_144_khz": 3297}, + {"time_sec": 106, "doppler_434_khz": 9890, "doppler_144_khz": 3297}, + {"time_sec": 107, "doppler_434_khz": 9888, "doppler_144_khz": 3296}, + {"time_sec": 108, "doppler_434_khz": 9884, "doppler_144_khz": 3295}, + {"time_sec": 109, "doppler_434_khz": 9882, "doppler_144_khz": 3294}, + {"time_sec": 110, "doppler_434_khz": 9880, "doppler_144_khz": 3293}, + {"time_sec": 111, "doppler_434_khz": 9878, "doppler_144_khz": 3293}, + {"time_sec": 112, "doppler_434_khz": 9874, "doppler_144_khz": 3291}, + {"time_sec": 113, "doppler_434_khz": 9872, "doppler_144_khz": 3291}, + {"time_sec": 114, "doppler_434_khz": 9870, "doppler_144_khz": 3290}, + {"time_sec": 115, "doppler_434_khz": 9868, "doppler_144_khz": 3289}, + {"time_sec": 116, "doppler_434_khz": 9864, "doppler_144_khz": 3288}, + {"time_sec": 117, "doppler_434_khz": 9861, "doppler_144_khz": 3287}, + {"time_sec": 118, "doppler_434_khz": 9859, "doppler_144_khz": 3286}, + {"time_sec": 119, "doppler_434_khz": 9857, "doppler_144_khz": 3286}, + {"time_sec": 120, "doppler_434_khz": 9852, "doppler_144_khz": 3284}, + {"time_sec": 121, "doppler_434_khz": 9850, "doppler_144_khz": 3283}, + {"time_sec": 122, "doppler_434_khz": 9847, "doppler_144_khz": 3282}, + {"time_sec": 123, "doppler_434_khz": 9845, "doppler_144_khz": 3282}, + {"time_sec": 124, "doppler_434_khz": 9842, "doppler_144_khz": 3281}, + {"time_sec": 125, "doppler_434_khz": 9837, "doppler_144_khz": 3279}, + {"time_sec": 126, "doppler_434_khz": 9834, "doppler_144_khz": 3278}, + {"time_sec": 127, "doppler_434_khz": 9832, "doppler_144_khz": 3277}, + {"time_sec": 128, "doppler_434_khz": 9829, "doppler_144_khz": 3276}, + {"time_sec": 129, "doppler_434_khz": 9823, "doppler_144_khz": 3274}, + {"time_sec": 130, "doppler_434_khz": 9821, "doppler_144_khz": 3274}, + {"time_sec": 131, "doppler_434_khz": 9818, "doppler_144_khz": 3273}, + {"time_sec": 132, "doppler_434_khz": 9815, "doppler_144_khz": 3272}, + {"time_sec": 133, "doppler_434_khz": 9812, "doppler_144_khz": 3271}, + {"time_sec": 134, "doppler_434_khz": 9806, "doppler_144_khz": 3269}, + {"time_sec": 135, "doppler_434_khz": 9803, "doppler_144_khz": 3268}, + {"time_sec": 136, "doppler_434_khz": 9800, "doppler_144_khz": 3267}, + {"time_sec": 137, "doppler_434_khz": 9796, "doppler_144_khz": 3265}, + {"time_sec": 138, "doppler_434_khz": 9790, "doppler_144_khz": 3263}, + {"time_sec": 139, "doppler_434_khz": 9787, "doppler_144_khz": 3262}, + {"time_sec": 140, "doppler_434_khz": 9783, "doppler_144_khz": 3261}, + {"time_sec": 141, "doppler_434_khz": 9780, "doppler_144_khz": 3260}, + {"time_sec": 142, "doppler_434_khz": 9773, "doppler_144_khz": 3258}, + {"time_sec": 143, "doppler_434_khz": 9769, "doppler_144_khz": 3256}, + {"time_sec": 144, "doppler_434_khz": 9766, "doppler_144_khz": 3255}, + {"time_sec": 145, "doppler_434_khz": 9762, "doppler_144_khz": 3254}, + {"time_sec": 146, "doppler_434_khz": 9759, "doppler_144_khz": 3253}, + {"time_sec": 147, "doppler_434_khz": 9751, "doppler_144_khz": 3250}, + {"time_sec": 148, "doppler_434_khz": 9747, "doppler_144_khz": 3249}, + {"time_sec": 149, "doppler_434_khz": 9743, "doppler_144_khz": 3248}, + {"time_sec": 150, "doppler_434_khz": 9739, "doppler_144_khz": 3246}, + {"time_sec": 151, "doppler_434_khz": 9731, "doppler_144_khz": 3244}, + {"time_sec": 152, "doppler_434_khz": 9727, "doppler_144_khz": 3242}, + {"time_sec": 153, "doppler_434_khz": 9723, "doppler_144_khz": 3241}, + {"time_sec": 154, "doppler_434_khz": 9719, "doppler_144_khz": 3240}, + {"time_sec": 155, "doppler_434_khz": 9715, "doppler_144_khz": 3238}, + {"time_sec": 156, "doppler_434_khz": 9706, "doppler_144_khz": 3235}, + {"time_sec": 157, "doppler_434_khz": 9701, "doppler_144_khz": 3234}, + {"time_sec": 158, "doppler_434_khz": 9697, "doppler_144_khz": 3232}, + {"time_sec": 159, "doppler_434_khz": 9692, "doppler_144_khz": 3231}, + {"time_sec": 160, "doppler_434_khz": 9683, "doppler_144_khz": 3228}, + {"time_sec": 161, "doppler_434_khz": 9678, "doppler_144_khz": 3226}, + {"time_sec": 162, "doppler_434_khz": 9673, "doppler_144_khz": 3224}, + {"time_sec": 163, "doppler_434_khz": 9668, "doppler_144_khz": 3223}, + {"time_sec": 164, "doppler_434_khz": 9658, "doppler_144_khz": 3219}, + {"time_sec": 165, "doppler_434_khz": 9653, "doppler_144_khz": 3218}, + {"time_sec": 166, "doppler_434_khz": 9647, "doppler_144_khz": 3216}, + {"time_sec": 167, "doppler_434_khz": 9642, "doppler_144_khz": 3214}, + {"time_sec": 168, "doppler_434_khz": 9637, "doppler_144_khz": 3212}, + {"time_sec": 169, "doppler_434_khz": 9626, "doppler_144_khz": 3209}, + {"time_sec": 170, "doppler_434_khz": 9620, "doppler_144_khz": 3207}, + {"time_sec": 171, "doppler_434_khz": 9614, "doppler_144_khz": 3205}, + {"time_sec": 172, "doppler_434_khz": 9608, "doppler_144_khz": 3203}, + {"time_sec": 173, "doppler_434_khz": 9597, "doppler_144_khz": 3199}, + {"time_sec": 174, "doppler_434_khz": 9590, "doppler_144_khz": 3197}, + {"time_sec": 175, "doppler_434_khz": 9584, "doppler_144_khz": 3195}, + {"time_sec": 176, "doppler_434_khz": 9578, "doppler_144_khz": 3193}, + {"time_sec": 177, "doppler_434_khz": 9572, "doppler_144_khz": 3191}, + {"time_sec": 178, "doppler_434_khz": 9559, "doppler_144_khz": 3186}, + {"time_sec": 179, "doppler_434_khz": 9552, "doppler_144_khz": 3184}, + {"time_sec": 180, "doppler_434_khz": 9545, "doppler_144_khz": 3182}, + {"time_sec": 181, "doppler_434_khz": 9539, "doppler_144_khz": 3180}, + {"time_sec": 182, "doppler_434_khz": 9525, "doppler_144_khz": 3175}, + {"time_sec": 183, "doppler_434_khz": 9518, "doppler_144_khz": 3173}, + {"time_sec": 184, "doppler_434_khz": 9510, "doppler_144_khz": 3170}, + {"time_sec": 185, "doppler_434_khz": 9503, "doppler_144_khz": 3168}, + {"time_sec": 186, "doppler_434_khz": 9488, "doppler_144_khz": 3163}, + {"time_sec": 187, "doppler_434_khz": 9480, "doppler_144_khz": 3160}, + {"time_sec": 188, "doppler_434_khz": 9472, "doppler_144_khz": 3157}, + {"time_sec": 189, "doppler_434_khz": 9464, "doppler_144_khz": 3155}, + {"time_sec": 190, "doppler_434_khz": 9456, "doppler_144_khz": 3152}, + {"time_sec": 191, "doppler_434_khz": 9440, "doppler_144_khz": 3147}, + {"time_sec": 192, "doppler_434_khz": 9432, "doppler_144_khz": 3144}, + {"time_sec": 193, "doppler_434_khz": 9423, "doppler_144_khz": 3141}, + {"time_sec": 194, "doppler_434_khz": 9414, "doppler_144_khz": 3138}, + {"time_sec": 195, "doppler_434_khz": 9396, "doppler_144_khz": 3132}, + {"time_sec": 196, "doppler_434_khz": 9387, "doppler_144_khz": 3129}, + {"time_sec": 197, "doppler_434_khz": 9378, "doppler_144_khz": 3126}, + {"time_sec": 198, "doppler_434_khz": 9369, "doppler_144_khz": 3123}, + {"time_sec": 199, "doppler_434_khz": 9349, "doppler_144_khz": 3116}, + {"time_sec": 200, "doppler_434_khz": 9339, "doppler_144_khz": 3113}, + {"time_sec": 201, "doppler_434_khz": 9329, "doppler_144_khz": 3110}, + {"time_sec": 202, "doppler_434_khz": 9318, "doppler_144_khz": 3106}, + {"time_sec": 203, "doppler_434_khz": 9308, "doppler_144_khz": 3103}, + {"time_sec": 204, "doppler_434_khz": 9287, "doppler_144_khz": 3096}, + {"time_sec": 205, "doppler_434_khz": 9276, "doppler_144_khz": 3092}, + {"time_sec": 206, "doppler_434_khz": 9265, "doppler_144_khz": 3088}, + {"time_sec": 207, "doppler_434_khz": 9254, "doppler_144_khz": 3085}, + {"time_sec": 208, "doppler_434_khz": 9230, "doppler_144_khz": 3077}, + {"time_sec": 209, "doppler_434_khz": 9218, "doppler_144_khz": 3073}, + {"time_sec": 210, "doppler_434_khz": 9206, "doppler_144_khz": 3069}, + {"time_sec": 211, "doppler_434_khz": 9194, "doppler_144_khz": 3065}, + {"time_sec": 212, "doppler_434_khz": 9182, "doppler_144_khz": 3061}, + {"time_sec": 213, "doppler_434_khz": 9156, "doppler_144_khz": 3052}, + {"time_sec": 214, "doppler_434_khz": 9143, "doppler_144_khz": 3048}, + {"time_sec": 215, "doppler_434_khz": 9130, "doppler_144_khz": 3043}, + {"time_sec": 216, "doppler_434_khz": 9116, "doppler_144_khz": 3039}, + {"time_sec": 217, "doppler_434_khz": 9088, "doppler_144_khz": 3029}, + {"time_sec": 218, "doppler_434_khz": 9074, "doppler_144_khz": 3025}, + {"time_sec": 219, "doppler_434_khz": 9060, "doppler_144_khz": 3020}, + {"time_sec": 220, "doppler_434_khz": 9045, "doppler_144_khz": 3015}, + {"time_sec": 221, "doppler_434_khz": 9015, "doppler_144_khz": 3005}, + {"time_sec": 222, "doppler_434_khz": 8999, "doppler_144_khz": 3000}, + {"time_sec": 223, "doppler_434_khz": 8983, "doppler_144_khz": 2994}, + {"time_sec": 224, "doppler_434_khz": 8967, "doppler_144_khz": 2989}, + {"time_sec": 225, "doppler_434_khz": 8951, "doppler_144_khz": 2984}, + {"time_sec": 226, "doppler_434_khz": 8917, "doppler_144_khz": 2972}, + {"time_sec": 227, "doppler_434_khz": 8900, "doppler_144_khz": 2967}, + {"time_sec": 228, "doppler_434_khz": 8882, "doppler_144_khz": 2961}, + {"time_sec": 229, "doppler_434_khz": 8865, "doppler_144_khz": 2955}, + {"time_sec": 230, "doppler_434_khz": 8828, "doppler_144_khz": 2943}, + {"time_sec": 231, "doppler_434_khz": 8809, "doppler_144_khz": 2936}, + {"time_sec": 232, "doppler_434_khz": 8790, "doppler_144_khz": 2930}, + {"time_sec": 233, "doppler_434_khz": 8770, "doppler_144_khz": 2923}, + {"time_sec": 234, "doppler_434_khz": 8730, "doppler_144_khz": 2910}, + {"time_sec": 235, "doppler_434_khz": 8709, "doppler_144_khz": 2903}, + {"time_sec": 236, "doppler_434_khz": 8688, "doppler_144_khz": 2896}, + {"time_sec": 237, "doppler_434_khz": 8665, "doppler_144_khz": 2888}, + {"time_sec": 238, "doppler_434_khz": 8643, "doppler_144_khz": 2881}, + {"time_sec": 239, "doppler_434_khz": 8597, "doppler_144_khz": 2866}, + {"time_sec": 240, "doppler_434_khz": 8574, "doppler_144_khz": 2858}, + {"time_sec": 241, "doppler_434_khz": 8550, "doppler_144_khz": 2850}, + {"time_sec": 242, "doppler_434_khz": 8526, "doppler_144_khz": 2842}, + {"time_sec": 243, "doppler_434_khz": 8476, "doppler_144_khz": 2825}, + {"time_sec": 244, "doppler_434_khz": 8450, "doppler_144_khz": 2817}, + {"time_sec": 245, "doppler_434_khz": 8423, "doppler_144_khz": 2808}, + {"time_sec": 246, "doppler_434_khz": 8397, "doppler_144_khz": 2799}, + {"time_sec": 247, "doppler_434_khz": 8370, "doppler_144_khz": 2790}, + {"time_sec": 248, "doppler_434_khz": 8314, "doppler_144_khz": 2771}, + {"time_sec": 249, "doppler_434_khz": 8286, "doppler_144_khz": 2762}, + {"time_sec": 250, "doppler_434_khz": 8256, "doppler_144_khz": 2752}, + {"time_sec": 251, "doppler_434_khz": 8226, "doppler_144_khz": 2742}, + {"time_sec": 252, "doppler_434_khz": 8164, "doppler_144_khz": 2721}, + {"time_sec": 253, "doppler_434_khz": 8133, "doppler_144_khz": 2711}, + {"time_sec": 254, "doppler_434_khz": 8101, "doppler_144_khz": 2700}, + {"time_sec": 255, "doppler_434_khz": 8068, "doppler_144_khz": 2689}, + {"time_sec": 256, "doppler_434_khz": 8034, "doppler_144_khz": 2678}, + {"time_sec": 257, "doppler_434_khz": 7965, "doppler_144_khz": 2655}, + {"time_sec": 258, "doppler_434_khz": 7929, "doppler_144_khz": 2643}, + {"time_sec": 259, "doppler_434_khz": 7893, "doppler_144_khz": 2631}, + {"time_sec": 260, "doppler_434_khz": 7856, "doppler_144_khz": 2619}, + {"time_sec": 261, "doppler_434_khz": 7779, "doppler_144_khz": 2593}, + {"time_sec": 262, "doppler_434_khz": 7740, "doppler_144_khz": 2580}, + {"time_sec": 263, "doppler_434_khz": 7699, "doppler_144_khz": 2566}, + {"time_sec": 264, "doppler_434_khz": 7658, "doppler_144_khz": 2553}, + {"time_sec": 265, "doppler_434_khz": 7574, "doppler_144_khz": 2525}, + {"time_sec": 266, "doppler_434_khz": 7530, "doppler_144_khz": 2510}, + {"time_sec": 267, "doppler_434_khz": 7485, "doppler_144_khz": 2495}, + {"time_sec": 268, "doppler_434_khz": 7440, "doppler_144_khz": 2480}, + {"time_sec": 269, "doppler_434_khz": 7394, "doppler_144_khz": 2465}, + {"time_sec": 270, "doppler_434_khz": 7298, "doppler_144_khz": 2433}, + {"time_sec": 271, "doppler_434_khz": 7248, "doppler_144_khz": 2416}, + {"time_sec": 272, "doppler_434_khz": 7198, "doppler_144_khz": 2399}, + {"time_sec": 273, "doppler_434_khz": 7143, "doppler_144_khz": 2381}, + {"time_sec": 274, "doppler_434_khz": 7037, "doppler_144_khz": 2346}, + {"time_sec": 275, "doppler_434_khz": 6982, "doppler_144_khz": 2327}, + {"time_sec": 276, "doppler_434_khz": 6927, "doppler_144_khz": 2309}, + {"time_sec": 277, "doppler_434_khz": 6870, "doppler_144_khz": 2290}, + {"time_sec": 278, "doppler_434_khz": 6812, "doppler_144_khz": 2271}, + {"time_sec": 279, "doppler_434_khz": 6693, "doppler_144_khz": 2231}, + {"time_sec": 280, "doppler_434_khz": 6631, "doppler_144_khz": 2210}, + {"time_sec": 281, "doppler_434_khz": 6568, "doppler_144_khz": 2189}, + {"time_sec": 282, "doppler_434_khz": 6504, "doppler_144_khz": 2168}, + {"time_sec": 283, "doppler_434_khz": 6373, "doppler_144_khz": 2124}, + {"time_sec": 284, "doppler_434_khz": 6305, "doppler_144_khz": 2102}, + {"time_sec": 285, "doppler_434_khz": 6235, "doppler_144_khz": 2078}, + {"time_sec": 286, "doppler_434_khz": 6165, "doppler_144_khz": 2055}, + {"time_sec": 287, "doppler_434_khz": 6020, "doppler_144_khz": 2007}, + {"time_sec": 288, "doppler_434_khz": 5945, "doppler_144_khz": 1982}, + {"time_sec": 289, "doppler_434_khz": 5868, "doppler_144_khz": 1956}, + {"time_sec": 290, "doppler_434_khz": 5791, "doppler_144_khz": 1930}, + {"time_sec": 291, "doppler_434_khz": 5711, "doppler_144_khz": 1904}, + {"time_sec": 292, "doppler_434_khz": 5548, "doppler_144_khz": 1849}, + {"time_sec": 293, "doppler_434_khz": 5464, "doppler_144_khz": 1821}, + {"time_sec": 294, "doppler_434_khz": 5379, "doppler_144_khz": 1793}, + {"time_sec": 295, "doppler_434_khz": 5292, "doppler_144_khz": 1764}, + {"time_sec": 296, "doppler_434_khz": 5113, "doppler_144_khz": 1704}, + {"time_sec": 297, "doppler_434_khz": 5022, "doppler_144_khz": 1674}, + {"time_sec": 298, "doppler_434_khz": 4928, "doppler_144_khz": 1643}, + {"time_sec": 299, "doppler_434_khz": 4834, "doppler_144_khz": 1611}, + {"time_sec": 300, "doppler_434_khz": 4640, "doppler_144_khz": 1547}, + {"time_sec": 301, "doppler_434_khz": 4540, "doppler_144_khz": 1513}, + {"time_sec": 302, "doppler_434_khz": 4438, "doppler_144_khz": 1479}, + {"time_sec": 303, "doppler_434_khz": 4334, "doppler_144_khz": 1445}, + {"time_sec": 304, "doppler_434_khz": 4229, "doppler_144_khz": 1410}, + {"time_sec": 305, "doppler_434_khz": 4016, "doppler_144_khz": 1339}, + {"time_sec": 306, "doppler_434_khz": 3907, "doppler_144_khz": 1302}, + {"time_sec": 307, "doppler_434_khz": 3796, "doppler_144_khz": 1265}, + {"time_sec": 308, "doppler_434_khz": 3684, "doppler_144_khz": 1228}, + {"time_sec": 309, "doppler_434_khz": 3448, "doppler_144_khz": 1149}, + {"time_sec": 310, "doppler_434_khz": 3330, "doppler_144_khz": 1110}, + {"time_sec": 311, "doppler_434_khz": 3212, "doppler_144_khz": 1071}, + {"time_sec": 312, "doppler_434_khz": 3091, "doppler_144_khz": 1030}, + {"time_sec": 313, "doppler_434_khz": 2969, "doppler_144_khz": 990}, + {"time_sec": 314, "doppler_434_khz": 2722, "doppler_144_khz": 907}, + {"time_sec": 315, "doppler_434_khz": 2595, "doppler_144_khz": 865}, + {"time_sec": 316, "doppler_434_khz": 2466, "doppler_144_khz": 822}, + {"time_sec": 317, "doppler_434_khz": 2337, "doppler_144_khz": 779}, + {"time_sec": 318, "doppler_434_khz": 2206, "doppler_144_khz": 735}, + {"time_sec": 319, "doppler_434_khz": 1941, "doppler_144_khz": 647}, + {"time_sec": 320, "doppler_434_khz": 1807, "doppler_144_khz": 602}, + {"time_sec": 321, "doppler_434_khz": 1672, "doppler_144_khz": 557}, + {"time_sec": 322, "doppler_434_khz": 1536, "doppler_144_khz": 512}, + {"time_sec": 323, "doppler_434_khz": 1395, "doppler_144_khz": 465}, + {"time_sec": 324, "doppler_434_khz": 1119, "doppler_144_khz": 373}, + {"time_sec": 325, "doppler_434_khz": 979, "doppler_144_khz": 326}, + {"time_sec": 326, "doppler_434_khz": 839, "doppler_144_khz": 280}, + {"time_sec": 327, "doppler_434_khz": 699, "doppler_144_khz": 233}, + {"time_sec": 328, "doppler_434_khz": 418, "doppler_144_khz": 139}, + {"time_sec": 329, "doppler_434_khz": 277, "doppler_144_khz": 92}, + {"time_sec": 330, "doppler_434_khz": 137, "doppler_144_khz": 46}, + {"time_sec": 331, "doppler_434_khz": -2, "doppler_144_khz": 0}, + {"time_sec": 332, "doppler_434_khz": -143, "doppler_144_khz": -47}, + {"time_sec": 333, "doppler_434_khz": -427, "doppler_144_khz": -142}, + {"time_sec": 334, "doppler_434_khz": -569, "doppler_144_khz": -189}, + {"time_sec": 335, "doppler_434_khz": -709, "doppler_144_khz": -236}, + {"time_sec": 336, "doppler_434_khz": -848, "doppler_144_khz": -282}, + {"time_sec": 337, "doppler_434_khz": -987, "doppler_144_khz": -328}, + {"time_sec": 338, "doppler_434_khz": -1263, "doppler_144_khz": -420}, + {"time_sec": 339, "doppler_434_khz": -1400, "doppler_144_khz": -466}, + {"time_sec": 340, "doppler_434_khz": -1537, "doppler_144_khz": -512}, + {"time_sec": 341, "doppler_434_khz": -1672, "doppler_144_khz": -557}, + {"time_sec": 342, "doppler_434_khz": -1806, "doppler_144_khz": -601}, + {"time_sec": 343, "doppler_434_khz": -2072, "doppler_144_khz": -690}, + {"time_sec": 344, "doppler_434_khz": -2204, "doppler_144_khz": -734}, + {"time_sec": 345, "doppler_434_khz": -2335, "doppler_144_khz": -778}, + {"time_sec": 346, "doppler_434_khz": -2471, "doppler_144_khz": -823}, + {"time_sec": 347, "doppler_434_khz": -2599, "doppler_144_khz": -866}, + {"time_sec": 348, "doppler_434_khz": -2851, "doppler_144_khz": -950}, + {"time_sec": 349, "doppler_434_khz": -2975, "doppler_144_khz": -991}, + {"time_sec": 350, "doppler_434_khz": -3098, "doppler_144_khz": -1032}, + {"time_sec": 351, "doppler_434_khz": -3220, "doppler_144_khz": -1073}, + {"time_sec": 352, "doppler_434_khz": -3458, "doppler_144_khz": -1152}, + {"time_sec": 353, "doppler_434_khz": -3574, "doppler_144_khz": -1191}, + {"time_sec": 354, "doppler_434_khz": -3693, "doppler_144_khz": -1230}, + {"time_sec": 355, "doppler_434_khz": -3807, "doppler_144_khz": -1268}, + {"time_sec": 356, "doppler_434_khz": -3921, "doppler_144_khz": -1306}, + {"time_sec": 357, "doppler_434_khz": -4141, "doppler_144_khz": -1380}, + {"time_sec": 358, "doppler_434_khz": -4249, "doppler_144_khz": -1416}, + {"time_sec": 359, "doppler_434_khz": -4356, "doppler_144_khz": -1451}, + {"time_sec": 360, "doppler_434_khz": -4460, "doppler_144_khz": -1486}, + {"time_sec": 361, "doppler_434_khz": -4563, "doppler_144_khz": -1520}, + {"time_sec": 362, "doppler_434_khz": -4763, "doppler_144_khz": -1587}, + {"time_sec": 363, "doppler_434_khz": -4861, "doppler_144_khz": -1620}, + {"time_sec": 364, "doppler_434_khz": -4956, "doppler_144_khz": -1651}, + {"time_sec": 365, "doppler_434_khz": -5050, "doppler_144_khz": -1683}, + {"time_sec": 366, "doppler_434_khz": -5142, "doppler_144_khz": -1713}, + {"time_sec": 367, "doppler_434_khz": -5323, "doppler_144_khz": -1774}, + {"time_sec": 368, "doppler_434_khz": -5410, "doppler_144_khz": -1803}, + {"time_sec": 369, "doppler_434_khz": -5497, "doppler_144_khz": -1832}, + {"time_sec": 370, "doppler_434_khz": -5582, "doppler_144_khz": -1860}, + {"time_sec": 371, "doppler_434_khz": -5665, "doppler_144_khz": -1888}, + {"time_sec": 372, "doppler_434_khz": -5825, "doppler_144_khz": -1941}, + {"time_sec": 373, "doppler_434_khz": -5904, "doppler_144_khz": -1967}, + {"time_sec": 374, "doppler_434_khz": -5981, "doppler_144_khz": -1993}, + {"time_sec": 375, "doppler_434_khz": -6056, "doppler_144_khz": -2018}, + {"time_sec": 376, "doppler_434_khz": -6203, "doppler_144_khz": -2067}, + {"time_sec": 377, "doppler_434_khz": -6275, "doppler_144_khz": -2091}, + {"time_sec": 378, "doppler_434_khz": -6344, "doppler_144_khz": -2114}, + {"time_sec": 379, "doppler_434_khz": -6413, "doppler_144_khz": -2137}, + {"time_sec": 380, "doppler_434_khz": -6479, "doppler_144_khz": -2159}, + {"time_sec": 381, "doppler_434_khz": -6609, "doppler_144_khz": -2202}, + {"time_sec": 382, "doppler_434_khz": -6676, "doppler_144_khz": -2225}, + {"time_sec": 383, "doppler_434_khz": -6738, "doppler_144_khz": -2245}, + {"time_sec": 384, "doppler_434_khz": -6798, "doppler_144_khz": -2265}, + {"time_sec": 385, "doppler_434_khz": -6858, "doppler_144_khz": -2285}, + {"time_sec": 386, "doppler_434_khz": -6974, "doppler_144_khz": -2324}, + {"time_sec": 387, "doppler_434_khz": -7031, "doppler_144_khz": -2343}, + {"time_sec": 388, "doppler_434_khz": -7086, "doppler_144_khz": -2361}, + {"time_sec": 389, "doppler_434_khz": -7139, "doppler_144_khz": -2379}, + {"time_sec": 390, "doppler_434_khz": -7191, "doppler_144_khz": -2396}, + {"time_sec": 391, "doppler_434_khz": -7292, "doppler_144_khz": -2430}, + {"time_sec": 392, "doppler_434_khz": -7342, "doppler_144_khz": -2447}, + {"time_sec": 393, "doppler_434_khz": -7390, "doppler_144_khz": -2463}, + {"time_sec": 394, "doppler_434_khz": -7437, "doppler_144_khz": -2478}, + {"time_sec": 395, "doppler_434_khz": -7483, "doppler_144_khz": -2494}, + {"time_sec": 396, "doppler_434_khz": -7573, "doppler_144_khz": -2524}, + {"time_sec": 397, "doppler_434_khz": -7617, "doppler_144_khz": -2538}, + {"time_sec": 398, "doppler_434_khz": -7659, "doppler_144_khz": -2552}, + {"time_sec": 399, "doppler_434_khz": -7701, "doppler_144_khz": -2566}, + {"time_sec": 400, "doppler_434_khz": -7742, "doppler_144_khz": -2580}, + {"time_sec": 401, "doppler_434_khz": -7821, "doppler_144_khz": -2606}, + {"time_sec": 402, "doppler_434_khz": -7860, "doppler_144_khz": -2619}, + {"time_sec": 403, "doppler_434_khz": -7898, "doppler_144_khz": -2632}, + {"time_sec": 404, "doppler_434_khz": -7935, "doppler_144_khz": -2644}, + {"time_sec": 405, "doppler_434_khz": -7971, "doppler_144_khz": -2656}, + {"time_sec": 406, "doppler_434_khz": -8041, "doppler_144_khz": -2680}, + {"time_sec": 407, "doppler_434_khz": -8076, "doppler_144_khz": -2691}, + {"time_sec": 408, "doppler_434_khz": -8109, "doppler_144_khz": -2702}, + {"time_sec": 409, "doppler_434_khz": -8142, "doppler_144_khz": -2713}, + {"time_sec": 410, "doppler_434_khz": -8205, "doppler_144_khz": -2734}, + {"time_sec": 411, "doppler_434_khz": -8236, "doppler_144_khz": -2745}, + {"time_sec": 412, "doppler_434_khz": -8266, "doppler_144_khz": -2755}, + {"time_sec": 413, "doppler_434_khz": -8296, "doppler_144_khz": -2765}, + {"time_sec": 414, "doppler_434_khz": -8325, "doppler_144_khz": -2774}, + {"time_sec": 415, "doppler_434_khz": -8381, "doppler_144_khz": -2793}, + {"time_sec": 416, "doppler_434_khz": -8408, "doppler_144_khz": -2802}, + {"time_sec": 417, "doppler_434_khz": -8435, "doppler_144_khz": -2811}, + {"time_sec": 418, "doppler_434_khz": -8462, "doppler_144_khz": -2820}, + {"time_sec": 419, "doppler_434_khz": -8487, "doppler_144_khz": -2828}, + {"time_sec": 420, "doppler_434_khz": -8539, "doppler_144_khz": -2846}, + {"time_sec": 421, "doppler_434_khz": -8563, "doppler_144_khz": -2854}, + {"time_sec": 422, "doppler_434_khz": -8587, "doppler_144_khz": -2862}, + {"time_sec": 423, "doppler_434_khz": -8610, "doppler_144_khz": -2869}, + {"time_sec": 424, "doppler_434_khz": -8633, "doppler_144_khz": -2877}, + {"time_sec": 425, "doppler_434_khz": -8678, "doppler_144_khz": -2892}, + {"time_sec": 426, "doppler_434_khz": -8700, "doppler_144_khz": -2899}, + {"time_sec": 427, "doppler_434_khz": -8721, "doppler_144_khz": -2906}, + {"time_sec": 428, "doppler_434_khz": -8742, "doppler_144_khz": -2913}, + {"time_sec": 429, "doppler_434_khz": -8762, "doppler_144_khz": -2920}, + {"time_sec": 430, "doppler_434_khz": -8802, "doppler_144_khz": -2933}, + {"time_sec": 431, "doppler_434_khz": -8822, "doppler_144_khz": -2940}, + {"time_sec": 432, "doppler_434_khz": -8841, "doppler_144_khz": -2946}, + {"time_sec": 433, "doppler_434_khz": -8860, "doppler_144_khz": -2953}, + {"time_sec": 434, "doppler_434_khz": -8878, "doppler_144_khz": -2959}, + {"time_sec": 435, "doppler_434_khz": -8915, "doppler_144_khz": -2971}, + {"time_sec": 436, "doppler_434_khz": -8932, "doppler_144_khz": -2977}, + {"time_sec": 437, "doppler_434_khz": -8949, "doppler_144_khz": -2982}, + {"time_sec": 438, "doppler_434_khz": -8966, "doppler_144_khz": -2988}, + {"time_sec": 439, "doppler_434_khz": -8982, "doppler_144_khz": -2993}, + {"time_sec": 440, "doppler_434_khz": -9015, "doppler_144_khz": -3004}, + {"time_sec": 441, "doppler_434_khz": -9030, "doppler_144_khz": -3009}, + {"time_sec": 442, "doppler_434_khz": -9045, "doppler_144_khz": -3014}, + {"time_sec": 443, "doppler_434_khz": -9061, "doppler_144_khz": -3020}, + {"time_sec": 444, "doppler_434_khz": -9075, "doppler_144_khz": -3024}, + {"time_sec": 445, "doppler_434_khz": -9104, "doppler_144_khz": -3034}, + {"time_sec": 446, "doppler_434_khz": -9118, "doppler_144_khz": -3039}, + {"time_sec": 447, "doppler_434_khz": -9132, "doppler_144_khz": -3043}, + {"time_sec": 448, "doppler_434_khz": -9146, "doppler_144_khz": -3048}, + {"time_sec": 449, "doppler_434_khz": -9172, "doppler_144_khz": -3057}, + {"time_sec": 450, "doppler_434_khz": -9185, "doppler_144_khz": -3061}, + {"time_sec": 451, "doppler_434_khz": -9197, "doppler_144_khz": -3065}, + {"time_sec": 452, "doppler_434_khz": -9210, "doppler_144_khz": -3069}, + {"time_sec": 453, "doppler_434_khz": -9222, "doppler_144_khz": -3073}, + {"time_sec": 454, "doppler_434_khz": -9246, "doppler_144_khz": -3081}, + {"time_sec": 455, "doppler_434_khz": -9258, "doppler_144_khz": -3085}, + {"time_sec": 456, "doppler_434_khz": -9270, "doppler_144_khz": -3089}, + {"time_sec": 457, "doppler_434_khz": -9281, "doppler_144_khz": -3093}, + {"time_sec": 458, "doppler_434_khz": -9292, "doppler_144_khz": -3097}, + {"time_sec": 459, "doppler_434_khz": -9313, "doppler_144_khz": -3104}, + {"time_sec": 460, "doppler_434_khz": -9324, "doppler_144_khz": -3107}, + {"time_sec": 461, "doppler_434_khz": -9334, "doppler_144_khz": -3111}, + {"time_sec": 462, "doppler_434_khz": -9344, "doppler_144_khz": -3114}, + {"time_sec": 463, "doppler_434_khz": -9354, "doppler_144_khz": -3117}, + {"time_sec": 464, "doppler_434_khz": -9374, "doppler_144_khz": -3124}, + {"time_sec": 465, "doppler_434_khz": -9383, "doppler_144_khz": -3127}, + {"time_sec": 466, "doppler_434_khz": -9393, "doppler_144_khz": -3130}, + {"time_sec": 467, "doppler_434_khz": -9402, "doppler_144_khz": -3133}, + {"time_sec": 468, "doppler_434_khz": -9411, "doppler_144_khz": -3136}, + {"time_sec": 469, "doppler_434_khz": -9429, "doppler_144_khz": -3142}, + {"time_sec": 470, "doppler_434_khz": -9438, "doppler_144_khz": -3145}, + {"time_sec": 471, "doppler_434_khz": -9446, "doppler_144_khz": -3148}, + {"time_sec": 472, "doppler_434_khz": -9454, "doppler_144_khz": -3151}, + {"time_sec": 473, "doppler_434_khz": -9470, "doppler_144_khz": -3156}, + {"time_sec": 474, "doppler_434_khz": -9478, "doppler_144_khz": -3159}, + {"time_sec": 475, "doppler_434_khz": -9486, "doppler_144_khz": -3161}, + {"time_sec": 476, "doppler_434_khz": -9494, "doppler_144_khz": -3164}, + {"time_sec": 477, "doppler_434_khz": -9501, "doppler_144_khz": -3166}, + {"time_sec": 478, "doppler_434_khz": -9516, "doppler_144_khz": -3171}, + {"time_sec": 479, "doppler_434_khz": -9523, "doppler_144_khz": -3174}, + {"time_sec": 480, "doppler_434_khz": -9530, "doppler_144_khz": -3176}, + {"time_sec": 481, "doppler_434_khz": -9537, "doppler_144_khz": -3178}, + {"time_sec": 482, "doppler_434_khz": -9551, "doppler_144_khz": -3183}, + {"time_sec": 483, "doppler_434_khz": -9557, "doppler_144_khz": -3185}, + {"time_sec": 484, "doppler_434_khz": -9564, "doppler_144_khz": -3187}, + {"time_sec": 485, "doppler_434_khz": -9570, "doppler_144_khz": -3189}, + {"time_sec": 486, "doppler_434_khz": -9583, "doppler_144_khz": -3194}, + {"time_sec": 487, "doppler_434_khz": -9589, "doppler_144_khz": -3196}, + {"time_sec": 488, "doppler_434_khz": -9595, "doppler_144_khz": -3198}, + {"time_sec": 489, "doppler_434_khz": -9601, "doppler_144_khz": -3200}, + {"time_sec": 490, "doppler_434_khz": -9607, "doppler_144_khz": -3202}, + {"time_sec": 491, "doppler_434_khz": -9619, "doppler_144_khz": -3206}, + {"time_sec": 492, "doppler_434_khz": -9625, "doppler_144_khz": -3208}, + {"time_sec": 493, "doppler_434_khz": -9630, "doppler_144_khz": -3209}, + {"time_sec": 494, "doppler_434_khz": -9636, "doppler_144_khz": -3211}, + {"time_sec": 495, "doppler_434_khz": -9642, "doppler_144_khz": -3213}, + {"time_sec": 496, "doppler_434_khz": -9652, "doppler_144_khz": -3217}, + {"time_sec": 497, "doppler_434_khz": -9658, "doppler_144_khz": -3219}, + {"time_sec": 498, "doppler_434_khz": -9663, "doppler_144_khz": -3220}, + {"time_sec": 499, "doppler_434_khz": -9668, "doppler_144_khz": -3222}, + {"time_sec": 500, "doppler_434_khz": -9678, "doppler_144_khz": -3225}, + {"time_sec": 501, "doppler_434_khz": -9683, "doppler_144_khz": -3227}, + {"time_sec": 502, "doppler_434_khz": -9687, "doppler_144_khz": -3228}, + {"time_sec": 503, "doppler_434_khz": -9692, "doppler_144_khz": -3230}, + {"time_sec": 504, "doppler_434_khz": -9697, "doppler_144_khz": -3232}, + {"time_sec": 505, "doppler_434_khz": -9706, "doppler_144_khz": -3235}, + {"time_sec": 506, "doppler_434_khz": -9710, "doppler_144_khz": -3236}, + {"time_sec": 507, "doppler_434_khz": -9715, "doppler_144_khz": -3238}, + {"time_sec": 508, "doppler_434_khz": -9719, "doppler_144_khz": -3239}, + {"time_sec": 509, "doppler_434_khz": -9727, "doppler_144_khz": -3242}, + {"time_sec": 510, "doppler_434_khz": -9732, "doppler_144_khz": -3243}, + {"time_sec": 511, "doppler_434_khz": -9736, "doppler_144_khz": -3245}, + {"time_sec": 512, "doppler_434_khz": -9740, "doppler_144_khz": -3246}, + {"time_sec": 513, "doppler_434_khz": -9747, "doppler_144_khz": -3248}, + {"time_sec": 514, "doppler_434_khz": -9751, "doppler_144_khz": -3250}, + {"time_sec": 515, "doppler_434_khz": -9755, "doppler_144_khz": -3251}, + {"time_sec": 516, "doppler_434_khz": -9759, "doppler_144_khz": -3252}, + {"time_sec": 517, "doppler_434_khz": -9763, "doppler_144_khz": -3254}, + {"time_sec": 518, "doppler_434_khz": -9770, "doppler_144_khz": -3256}, + {"time_sec": 519, "doppler_434_khz": -9773, "doppler_144_khz": -3257}, + {"time_sec": 520, "doppler_434_khz": -9777, "doppler_144_khz": -3258}, + {"time_sec": 521, "doppler_434_khz": -9780, "doppler_144_khz": -3259}, + {"time_sec": 522, "doppler_434_khz": -9787, "doppler_144_khz": -3262}, + {"time_sec": 523, "doppler_434_khz": -9791, "doppler_144_khz": -3263}, + {"time_sec": 524, "doppler_434_khz": -9794, "doppler_144_khz": -3264}, + {"time_sec": 525, "doppler_434_khz": -9797, "doppler_144_khz": -3265}, + {"time_sec": 526, "doppler_434_khz": -9800, "doppler_144_khz": -3266}, + {"time_sec": 527, "doppler_434_khz": -9807, "doppler_144_khz": -3268}, + {"time_sec": 528, "doppler_434_khz": -9810, "doppler_144_khz": -3269}, + {"time_sec": 529, "doppler_434_khz": -9813, "doppler_144_khz": -3270}, + {"time_sec": 530, "doppler_434_khz": -9816, "doppler_144_khz": -3271}, + {"time_sec": 531, "doppler_434_khz": -9822, "doppler_144_khz": -3273}, + {"time_sec": 532, "doppler_434_khz": -9825, "doppler_144_khz": -3274}, + {"time_sec": 533, "doppler_434_khz": -9827, "doppler_144_khz": -3275}, + {"time_sec": 534, "doppler_434_khz": -9830, "doppler_144_khz": -3276}, + {"time_sec": 535, "doppler_434_khz": -9833, "doppler_144_khz": -3277}, + {"time_sec": 536, "doppler_434_khz": -9838, "doppler_144_khz": -3279}, + {"time_sec": 537, "doppler_434_khz": -9841, "doppler_144_khz": -3280}, + {"time_sec": 538, "doppler_434_khz": -9843, "doppler_144_khz": -3280}, + {"time_sec": 539, "doppler_434_khz": -9846, "doppler_144_khz": -3281}, + {"time_sec": 540, "doppler_434_khz": -9851, "doppler_144_khz": -3283}, + {"time_sec": 541, "doppler_434_khz": -9853, "doppler_144_khz": -3284}, + {"time_sec": 542, "doppler_434_khz": -9856, "doppler_144_khz": -3285}, + {"time_sec": 543, "doppler_434_khz": -9858, "doppler_144_khz": -3285}, + {"time_sec": 544, "doppler_434_khz": -9861, "doppler_144_khz": -3286}, + {"time_sec": 545, "doppler_434_khz": -9865, "doppler_144_khz": -3288}, + {"time_sec": 546, "doppler_434_khz": -9867, "doppler_144_khz": -3288}, + {"time_sec": 547, "doppler_434_khz": -9870, "doppler_144_khz": -3289}, + {"time_sec": 548, "doppler_434_khz": -9872, "doppler_144_khz": -3290}, + {"time_sec": 549, "doppler_434_khz": -9876, "doppler_144_khz": -3291}, + {"time_sec": 550, "doppler_434_khz": -9878, "doppler_144_khz": -3292}, + {"time_sec": 551, "doppler_434_khz": -9880, "doppler_144_khz": -3293}, + {"time_sec": 552, "doppler_434_khz": -9882, "doppler_144_khz": -3293}, + {"time_sec": 553, "doppler_434_khz": -9886, "doppler_144_khz": -3295}, + {"time_sec": 554, "doppler_434_khz": -9888, "doppler_144_khz": -3295}, + {"time_sec": 555, "doppler_434_khz": -9890, "doppler_144_khz": -3296}, + {"time_sec": 556, "doppler_434_khz": -9892, "doppler_144_khz": -3297}, + {"time_sec": 557, "doppler_434_khz": -9894, "doppler_144_khz": -3297}, + {"time_sec": 558, "doppler_434_khz": -9898, "doppler_144_khz": -3299}, + {"time_sec": 559, "doppler_434_khz": -9899, "doppler_144_khz": -3299}, + {"time_sec": 560, "doppler_434_khz": -9901, "doppler_144_khz": -3300}, + {"time_sec": 561, "doppler_434_khz": -9903, "doppler_144_khz": -3300}, + {"time_sec": 562, "doppler_434_khz": -9906, "doppler_144_khz": -3301}, + {"time_sec": 563, "doppler_434_khz": -9908, "doppler_144_khz": -3302}, + {"time_sec": 564, "doppler_434_khz": -9910, "doppler_144_khz": -3303}, + {"time_sec": 565, "doppler_434_khz": -9911, "doppler_144_khz": -3303}, + {"time_sec": 566, "doppler_434_khz": -9913, "doppler_144_khz": -3304}, + {"time_sec": 567, "doppler_434_khz": -9916, "doppler_144_khz": -3305}, + {"time_sec": 568, "doppler_434_khz": -9918, "doppler_144_khz": -3305}, + {"time_sec": 569, "doppler_434_khz": -9919, "doppler_144_khz": -3306}, + {"time_sec": 570, "doppler_434_khz": -9921, "doppler_144_khz": -3306}, + {"time_sec": 571, "doppler_434_khz": -9923, "doppler_144_khz": -3307}, + {"time_sec": 572, "doppler_434_khz": -9925, "doppler_144_khz": -3308}, + {"time_sec": 573, "doppler_434_khz": -9926, "doppler_144_khz": -3308}, + {"time_sec": 574, "doppler_434_khz": -9928, "doppler_144_khz": -3309}, + {"time_sec": 575, "doppler_434_khz": -9930, "doppler_144_khz": -3309}, + {"time_sec": 576, "doppler_434_khz": -9932, "doppler_144_khz": -3310}, + {"time_sec": 577, "doppler_434_khz": -9933, "doppler_144_khz": -3310}, + {"time_sec": 578, "doppler_434_khz": -9934, "doppler_144_khz": -3311}, + {"time_sec": 579, "doppler_434_khz": -9936, "doppler_144_khz": -3311}, + {"time_sec": 580, "doppler_434_khz": -9938, "doppler_144_khz": -3312}, + {"time_sec": 581, "doppler_434_khz": -9939, "doppler_144_khz": -3312}, + {"time_sec": 582, "doppler_434_khz": -9940, "doppler_144_khz": -3313}, + {"time_sec": 583, "doppler_434_khz": -9942, "doppler_144_khz": -3313}, + {"time_sec": 584, "doppler_434_khz": -9944, "doppler_144_khz": -3314}, + {"time_sec": 585, "doppler_434_khz": -9945, "doppler_144_khz": -3314}, + {"time_sec": 586, "doppler_434_khz": -9946, "doppler_144_khz": -3315}, + {"time_sec": 587, "doppler_434_khz": -9947, "doppler_144_khz": -3315}, + {"time_sec": 588, "doppler_434_khz": -9949, "doppler_144_khz": -3316}, + {"time_sec": 589, "doppler_434_khz": -9950, "doppler_144_khz": -3316}, + {"time_sec": 590, "doppler_434_khz": -9951, "doppler_144_khz": -3316}, + {"time_sec": 591, "doppler_434_khz": -9952, "doppler_144_khz": -3317}, + {"time_sec": 592, "doppler_434_khz": -9953, "doppler_144_khz": -3317}, + {"time_sec": 593, "doppler_434_khz": -9955, "doppler_144_khz": -3318}, + {"time_sec": 594, "doppler_434_khz": -9956, "doppler_144_khz": -3318}, + {"time_sec": 595, "doppler_434_khz": -9957, "doppler_144_khz": -3318}, + {"time_sec": 596, "doppler_434_khz": -9958, "doppler_144_khz": -3319}, + {"time_sec": 597, "doppler_434_khz": -9960, "doppler_144_khz": -3319}, + {"time_sec": 598, "doppler_434_khz": -9961, "doppler_144_khz": -3320}, + {"time_sec": 599, "doppler_434_khz": -9961, "doppler_144_khz": -3320}, + {"time_sec": 600, "doppler_434_khz": -9962, "doppler_144_khz": -3320}, + {"time_sec": 601, "doppler_434_khz": -9963, "doppler_144_khz": -3320}, + {"time_sec": 602, "doppler_434_khz": -9965, "doppler_144_khz": -3321}, + {"time_sec": 603, "doppler_434_khz": -9965, "doppler_144_khz": -3321}, + {"time_sec": 604, "doppler_434_khz": -9966, "doppler_144_khz": -3321}, + {"time_sec": 605, "doppler_434_khz": -9967, "doppler_144_khz": -3322}, + {"time_sec": 606, "doppler_434_khz": -9968, "doppler_144_khz": -3322}, + {"time_sec": 607, "doppler_434_khz": -9969, "doppler_144_khz": -3322}, + {"time_sec": 608, "doppler_434_khz": -9970, "doppler_144_khz": -3323}, + {"time_sec": 609, "doppler_434_khz": -9970, "doppler_144_khz": -3323}, + {"time_sec": 610, "doppler_434_khz": -9972, "doppler_144_khz": -3323}, + {"time_sec": 611, "doppler_434_khz": -9972, "doppler_144_khz": -3323}, + {"time_sec": 612, "doppler_434_khz": -9973, "doppler_144_khz": -3324}, + {"time_sec": 613, "doppler_434_khz": -9974, "doppler_144_khz": -3324}, + {"time_sec": 614, "doppler_434_khz": -9974, "doppler_144_khz": -3324}, + {"time_sec": 615, "doppler_434_khz": -9975, "doppler_144_khz": -3324}, + {"time_sec": 616, "doppler_434_khz": -9976, "doppler_144_khz": -3325}, + {"time_sec": 617, "doppler_434_khz": -9976, "doppler_144_khz": -3325}, + {"time_sec": 618, "doppler_434_khz": -9977, "doppler_144_khz": -3325}, + {"time_sec": 619, "doppler_434_khz": -9978, "doppler_144_khz": -3325}, + {"time_sec": 620, "doppler_434_khz": -9978, "doppler_144_khz": -3325}, + {"time_sec": 621, "doppler_434_khz": -9979, "doppler_144_khz": -3326}, + {"time_sec": 622, "doppler_434_khz": -9979, "doppler_144_khz": -3326}, + {"time_sec": 623, "doppler_434_khz": -9980, "doppler_144_khz": -3326}, + {"time_sec": 624, "doppler_434_khz": -9981, "doppler_144_khz": -3326}, + {"time_sec": 625, "doppler_434_khz": -9981, "doppler_144_khz": -3326}, + {"time_sec": 626, "doppler_434_khz": -9982, "doppler_144_khz": -3327}, + {"time_sec": 627, "doppler_434_khz": -9982, "doppler_144_khz": -3327}, + {"time_sec": 628, "doppler_434_khz": -9983, "doppler_144_khz": -3327}, + {"time_sec": 629, "doppler_434_khz": -9983, "doppler_144_khz": -3327}, + {"time_sec": 630, "doppler_434_khz": -9984, "doppler_144_khz": -3327}, + {"time_sec": 631, "doppler_434_khz": -9984, "doppler_144_khz": -3327}, + {"time_sec": 632, "doppler_434_khz": -9985, "doppler_144_khz": -3328}, + {"time_sec": 633, "doppler_434_khz": -9985, "doppler_144_khz": -3328}, + {"time_sec": 634, "doppler_434_khz": -9985, "doppler_144_khz": -3328}, + {"time_sec": 635, "doppler_434_khz": -9986, "doppler_144_khz": -3328}, + {"time_sec": 636, "doppler_434_khz": -9986, "doppler_144_khz": -3328}, + {"time_sec": 637, "doppler_434_khz": -9986, "doppler_144_khz": -3328}, + {"time_sec": 638, "doppler_434_khz": -9987, "doppler_144_khz": -3328}, + {"time_sec": 639, "doppler_434_khz": -9987, "doppler_144_khz": -3328}, + {"time_sec": 640, "doppler_434_khz": -9987, "doppler_144_khz": -3328}, + {"time_sec": 641, "doppler_434_khz": -9988, "doppler_144_khz": -3329}, + {"time_sec": 642, "doppler_434_khz": -9988, "doppler_144_khz": -3329}, + {"time_sec": 643, "doppler_434_khz": -9988, "doppler_144_khz": -3329}, + {"time_sec": 644, "doppler_434_khz": -9988, "doppler_144_khz": -3329}, + {"time_sec": 645, "doppler_434_khz": -9988, "doppler_144_khz": -3329}, + {"time_sec": 646, "doppler_434_khz": -9989, "doppler_144_khz": -3329}, + {"time_sec": 647, "doppler_434_khz": -9989, "doppler_144_khz": -3329}, + {"time_sec": 648, "doppler_434_khz": -9989, "doppler_144_khz": -3329}, + {"time_sec": 649, "doppler_434_khz": -9989, "doppler_144_khz": -3329}, + {"time_sec": 650, "doppler_434_khz": -9990, "doppler_144_khz": -3329}, + {"time_sec": 651, "doppler_434_khz": -9990, "doppler_144_khz": -3329}, + {"time_sec": 652, "doppler_434_khz": -9990, "doppler_144_khz": -3329}, + {"time_sec": 653, "doppler_434_khz": -9990, "doppler_144_khz": -3329}, + {"time_sec": 654, "doppler_434_khz": -9990, "doppler_144_khz": -3329}, + {"time_sec": 655, "doppler_434_khz": -9990, "doppler_144_khz": -3329}, + {"time_sec": 656, "doppler_434_khz": -9990, "doppler_144_khz": -3329}, + {"time_sec": 657, "doppler_434_khz": -9990, "doppler_144_khz": -3329}, + {"time_sec": 658, "doppler_434_khz": -9990, "doppler_144_khz": -3329}, + {"time_sec": 659, "doppler_434_khz": -9990, "doppler_144_khz": -3329}, + {"time_sec": 660, "doppler_434_khz": -9990, "doppler_144_khz": -3329}, + {"time_sec": 661, "doppler_434_khz": -9990, "doppler_144_khz": -3329} + ] +} + +try: + tx_value = '0' + rx_value = '0' + sq = '0' + tx = '434.9000' + rx = '435.0000' + txr = '144.9000' + sim_mode = False + sim_config = False + doppler_mode = "off" + debug_mode = True + + try: + file = open("/home/pi/CubeSatSim/.mode") + mode = file.read(1) + except: + mode = 'f' + if (debug_mode == 1): + print("Can't open .mode file, defaulting to FSK") + file.close() + print("Mode is: ") + print(mode) + + try: + file = open("/home/pi/CubeSatSim/sim.cfg") + config = file.readline().split() + if len(config) > 6: + txf = float(config[6]) + tx = "{:.4f}".format(txf) +# if (mode == 'e'): +# txrf = (txf - 290.0) # - 0.1 # Cross Band Repeater mode transmit frequency in 2m band +# txr = "{:.4f}".format(txrf) +# print("Transmit frequency: ",txr) +# else: +# print("Transmit frequency: ",tx) + print("Transmit frequency: ",tx) + if len(config) > 7: + rxf = float(config[7]) + rx = "{:.4f}".format(rxf) + print(rx) + if len(config) > 9: + rxpl = float(config[9]) +# print(rxpl) +# print( "{:.0f}".format(rxpl)) + rxpl_value = "{:.0f}".format(rxpl) + print(rxpl_value) + if len(config) > 10: + txpl = float(config[10]) +# print(txpl) +# print( "{:.0f}".format(txpl)) + txpl_value = "{:.0f}".format(txpl) + print(txpl_value) + if len(config) > 13: + if config[13] == 'sim': + doppler_mode = 'sim' + print("Simulated Doppler frequency shift is enabled.") + elif config[13] == 'rig': + doppler_mode = 'rig' + print("rigctl Doppler frequency shift is enabled.") + else: + doppler_mode = 'off' + print("Doppler frequency shift is disabled.") + else: + doppler_mode = 'off' + print("Doppler frequency shift is disabled.") + print(config) + print +# print(callsign) + print(sq) +# if sq == '8': +# print("squelch set to 8, no command input!") +# no_command = True +# else: + no_command = False + print(no_command) + except Exception as e: + print(f"An error occurred: {e}") + if (debug_mode == 1): + print("Can't read sim.cfg file") + file.close() + +except Exception as e: + print(f"An error occurred: {e}") + +if (doppler_mode == 'off'): + tx_freq_hz = txf * 1e6 + rx_freq_hz = rxf * 1e6 + check_frequency() + print("writing sim.cfg frequency to frequency.txt") + with open("/home/pi/CubeSatSim/frequency.txt", "w") as file: + file.write(f"{tx_freq_hz:.0f} {rx_freq_hz:.0f}") + while True: + sleep(1) + +if (doppler_mode == 'sim'): + print("Sim mode") + +# if (mode == 'e'): +# tx_doppler_start_hz = txrf * 1e6 +# else: +# tx_doppler_start_hz = txf * 1e6 + tx_doppler_start_hz = txf * 1e6 + tx_doppler_shift_hz = 0 + print(f"Tx center frequency: {tx_doppler_start_hz}") + rx_doppler_start_hz = rxf * 1e6 + rx_doppler_shift_hz = 0 + print(f"Rx center frequency: {rx_doppler_start_hz}") + + TARGET_PASS = 88 # Maximum elevation profile + doppler_table = iss_doppler_passes[TARGET_PASS] + print(f"Pass Max Elevation: {TARGET_PASS}°") + + start_time = time.perf_counter() + current_index = 0; + while True: + relative_time = (time.perf_counter() - start_time) +# index = int(relative_time/10) % 37 + index = int(relative_time) + if (index > current_index): + current_index = index + index = index % 661 + print(f"relative time: {relative_time:.1f} seconds after start is AOS index: {index}") + table_row = doppler_table[index] + rx_doppler_shift_hz = table_row["doppler_434_khz"] # * 1000 + if (mode == 'e'): + tx_doppler_shift_hz = table_row["doppler_144_khz"] # * 1000 + else: + tx_doppler_shift_hz = rx_doppler_shift_hz + tx_doppler_freq_hz = tx_doppler_start_hz + tx_doppler_shift_hz + rx_doppler_freq_hz = rx_doppler_start_hz + rx_doppler_shift_hz + check_frequency() + print(f"Tx Doppler shift: {tx_doppler_freq_hz:.0f}") + print(f"Rx Doppler shift: {rx_doppler_freq_hz:.0f}") + + with open("/home/pi/CubeSatSim/frequency.txt", "w") as file: + file.write(f"{tx_doppler_freq_hz:.0f} {rx_doppler_freq_hz:.0f}") + sleep(1) + +if (doppler_mode == 'rig'): + print("rig mode") + while True: + + system("sudo killall -9 ft857d &>/dev/null") + system("udo killall -9 socat &>/dev/null") + system("sudo killall -9 rigctld &>/dev/null") + + print("Starting virtual serial ports /tmp/vttyA and /tmp/vttyB") + + system("socat -d -d PTY,raw,echo=0,link=/tmp/vttyA PTY,raw,echo=0,link=/tmp/vttyB &") + + sleep(1.0) + + print("Starting CubeSatSim FT857 emulation") + system("/home/pi/FT857d/examples/FT857d/ft857d &") + + sleep(1.0) + + print("Starting rigctl emulating FT857 rig using virtual serial port /tmp/vttyB") + system("rigctld -m 1022 -r /tmp/vttyB -t 4532 -vvv") + + print("rigctld ended") + diff --git a/frequency.sh b/frequency.sh new file mode 100755 index 00000000..7a81fd07 --- /dev/null +++ b/frequency.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +echo "Starting frequency control" + +python3 /home/pi/CubeSatSim/frequency.py diff --git a/groundstation/gpredict.sh b/groundstation/gpredict.sh new file mode 100755 index 00000000..6f926dc8 --- /dev/null +++ b/groundstation/gpredict.sh @@ -0,0 +1,21 @@ +#!/bin/bash +# + +if [ ! $(systemctl get-default | grep graphical) ]; then + + echo "Graphical User Interface not running!" + echo + echo "Do you want to reboot and switch to GUI so you can run Gpredict?" + read answer + + if [ "$answer" = "y" ] || [ "$answer" = "yes" ]; then + echo "Rebooting!" + sudo raspi-config nonint do_boot_behaviour B4 + sudo reboot now + else + echo "You can run Gpredict next time you run the GUI." + exit + fi +fi + +nohup /usr/bin/gpredict /dev/null 2>&1 & diff --git a/groundstation/pacsat-run.sh b/groundstation/pacsat-run.sh index 37139874..2c71944f 100755 --- a/groundstation/pacsat-run.sh +++ b/groundstation/pacsat-run.sh @@ -15,6 +15,23 @@ sudo killall -9 direwolf &>/dev/null sudo killall -9 aplay &>/dev/null +if [ ! $(systemctl get-default | grep graphical) ]; then + + echo "Graphical User Interface not running!" + echo + echo "Do you want to reboot and switch to GUI so you can run the Pacsat Ground Station" + read answer + + if [ "$answer" = "y" ] || [ "$answer" = "yes" ]; then + echo "Rebooting!" + sudo raspi-config nonint do_boot_behaviour B4 + sudo reboot now + else + echo "You can run the Pacsat Ground Station next time you run the GUI." + exit + fi +fi + #FILE=/home/pi/.pacsatprofile #if [ ! -f "$FILE" ]; then diff --git a/install b/install index 44196645..4957dc4e 100755 --- a/install +++ b/install @@ -39,7 +39,7 @@ else touch /home/pi/CubeSatSim/command_control_direwolf echo "creating $FILE" - echo "AMSAT 0 0 0 no 3 434.9 435 no 0 0 no 60" > /home/pi/CubeSatSim/sim.cfg + echo "AMSAT 0 0 0 no 3 434.9 435 no 0 0 no 60 no" > /home/pi/CubeSatSim/sim.cfg /home/pi/CubeSatSim/config -c -n @@ -295,21 +295,22 @@ if [ -f "$FILE" ]; then if [ -z "${11}" ] ; then m2="0" ; changed=1 ; else m2=${11} ; fi # tx pl code if [ -z "${12}" ] ; then m3="no" ; changed=1 ; else m3=${12} ; fi # random fail if [ -z "${13}" ] ; then m4="60" ; changed=1 ; else m4=${13} ; fi # random fail period + if [ -z "${14}" ] ; then m5="no" ; changed=1 ; else m5=${14} ; fi # doppler mode if [ $changed -eq 1 ]; then echo -e "Current sim.cfg configuration file:" echo - echo $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} ${12} ${13} + echo $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} ${12} ${13} ${14} echo -e "\nCubeSatSim configuration sim.cfg file updated to: \n" echo - echo $n1 $n2 $n3 $n4 $n5 $n6 $n7 $n8 $n9 $m1 $m2 $m3 $m4 - echo $n1 $n2 $n3 $n4 $n5 $n6 $n7 $n8 $n9 $m1 $m2 $m3 $m4> /home/pi/CubeSatSim/sim.cfg + echo $n1 $n2 $n3 $n4 $n5 $n6 $n7 $n8 $n9 $m1 $m2 $m3 $m4 $m5 + echo $n1 $n2 $n3 $n4 $n5 $n6 $n7 $n8 $n9 $m1 $m2 $m3 $m4 $m5 > /home/pi/CubeSatSim/sim.cfg echo fi else echo "creating $FILE" - echo "AMSAT 0 0 0 no 3 434.9 435 no 0 0 no 60" > /home/pi/CubeSatSim/sim.cfg + echo "AMSAT 0 0 0 no 3 434.9 435 no 0 0 no 60 no" > /home/pi/CubeSatSim/sim.cfg fi if [[ $(grep 'cubesatsim' /etc/motd) ]]; then @@ -343,6 +344,7 @@ sudo apt-get update && sudo apt-get dist-upgrade -y # fi cp /home/pi/CubeSatSim/groundstation/pacsat.desktop /home/pi/Desktop/pacsat.desktop +cp /home/pi/CubeSatSim/groundstation/gpredict.desktop /home/pi/Desktop/gpredict.desktop if [ ! -d "/home/pi/venv" ]; then @@ -671,6 +673,13 @@ if [ -f "$FILE" ]; then sudo rm /etc/systemd/system/rpitx.service fi +if [[ -z $(sudo systemctl is-active packagekit | grep inactive) ]]; then + echo "Removing packagekit so won't auto check for updates on boot" + sudo systemctl stop packagekit + sudo systemctl disable packagekit + sudo apt-get remove -y packagekit +fi + FILE=/etc/systemd/system/transmit.service if [ -f "$FILE" ]; then if [[ $(diff /home/pi/CubeSatSim/systemd/transmit.service /etc/systemd/system/transmit.service) ]]; then @@ -717,6 +726,22 @@ else FLAG=1 fi +FILE=/etc/systemd/system/frequency.service +if [ -f "$FILE" ]; then + if [[ $(diff /home/pi/CubeSatSim/systemd/frequency.service /etc/systemd/system/frequency.service) ]]; then + echo "changed frequency.service." + sudo cp /home/pi/CubeSatSim/systemd/frequency.service /etc/systemd/system/frequency.service + FLAG=1 + else + echo "no change to frequency.service." + fi +else + echo "creating frequency.service." + sudo cp /home/pi/CubeSatSim/systemd/frequency.service /etc/systemd/system/frequency.service + FLAG=1 +fi + + FILE=/etc/asound.conf if [ -f "$FILE" ]; then if [[ $(diff /home/pi/CubeSatSim/asound.conf /etc/asound.conf) ]]; then @@ -833,6 +858,30 @@ if [ ! -f "/home/pi/ssdv/ssdv" ]; then make fi +if [ ! -f "/home/pi/FT857d/examples/FT857d/ft857d" ]; then + cd + echo "Installing FT857d for Doppler rigctld control mode" + git clone https://github.com/alanbjohnston/FT857d.git + cd FT857d + git checkout pi + cd examples/FT857d + g++ main.c ../../src/ft857d.cpp -lwiringPi -o ft857d + + sudo apt-get install -y libhamlib-utils socat gpredict +fi + +cd /home/pi/FT857d +git checkout pi +git pull --no-rebase > .updated_p + +if [[ $(grep 'changed' //home/pi/FT857d/.updated_p) ]]; then + echo "updating FT857d" + cd examples/FT857d + g++ main.c ../../src/ft857d.cpp -lwiringPi -o ft857d +else + echo "nothing to do for FT857d." +fi + cd #echo "Would you like to reboot to complete the installation (y/n)?" @@ -851,6 +900,15 @@ cd sed -i 's/quick_exec=0/quick_exec=1/' ~/.config/libfm/libfm.conf +if [ ! -d "/home/pi/Icons" ]; then + cd + mkdir Icons + cd Icons + #wget http://cubesatsim.org/icons/* + #wget -r -nd --no-parent -A 'bar.*.tar.gz' http://url/dir/ + wget -r -nd --no-parent -A '*' https://cubesatsim.org/icons/ +fi + sudo apt install -y raspberrypi-ui-mods sudo apt autoremove -y diff --git a/log b/log index a516a3c0..c4017153 100755 --- a/log +++ b/log @@ -8,6 +8,8 @@ if [ "$1" = "-h" ] ; then echo " -t transmit" echo " -c command and control" echo " -p pacsat" + echo " -r frequency control" + echo " -f frequency display" echo "Default is the log is dumpted to the screen and written to a file." echo "If an additional r is included, the log is realtime, and exits with a Control-C" echo @@ -25,7 +27,7 @@ if [ "$REALTIME" = "1" ] ; then echo sleep 2 - if [ "$1" = "-r" ] || [ "$1" = "-t" ] ; then + if [ "$1" = "-t" ] ; then sudo journalctl -af -u transmit # > /home/pi/CubeSatSim/logt.txt # cat /home/pi/CubeSatSim/logt.txt # echo -e "\nTransmit Log file also saved as /home/pi/CubeSatSim/logt.txt" @@ -37,6 +39,15 @@ if [ "$REALTIME" = "1" ] ; then sudo journalctl -af -u pacsatsim # > /home/pi/CubeSatSim/logp.txt cat /home/pi/CubeSatSim/logp.txt # echo -e "\nCommand and Control Log file also saved as /home/pi/CubeSatSim/logp.txt" + elif [ "$1" = "-r" ]; then + sudo journalctl -af -u frequency # > /home/pi/CubeSatSim/logr.txt + elif [ "$1" = "-f" ] ; then + while true; do + cat /home/pi/CubeSatSim/frequency.txt | tr -d '\n' +# echo + sleep 1 + printf "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b" + done else sudo journalctl -af -u cubesatsim # > /home/pi/CubeSatSim/log.txt # cat /home/pi/CubeSatSim/log.txt @@ -45,7 +56,7 @@ if [ "$REALTIME" = "1" ] ; then else - if [ "$1" = "-r" ] || [ "$1" = "-t" ] ; then + if [ "$1" = "-t" ] ; then sudo journalctl -a -u transmit > /home/pi/CubeSatSim/logt.txt cat /home/pi/CubeSatSim/logt.txt echo -e "\nTransmit Log file also saved as /home/pi/CubeSatSim/logt.txt" @@ -57,6 +68,13 @@ else sudo journalctl -a -u pacsatsim > /home/pi/CubeSatSim/logp.txt cat /home/pi/CubeSatSim/logp.txt echo -e "\nCommand and Control Log file also saved as /home/pi/CubeSatSim/logp.txt" + elif [ "$1" = "-r" ]; then + sudo journalctl -a -u frequency > /home/pi/CubeSatSim/logr.txt + cat /home/pi/CubeSatSim/logr.txt + echo -e "\nFrequency Log file also saved as /home/pi/CubeSatSim/logf.txt" + elif [ "$1" = "-f" ] ; then + cat /home/pi/CubeSatSim/frequency.txt + echo else sudo journalctl -a -u cubesatsim > /home/pi/CubeSatSim/log.txt cat /home/pi/CubeSatSim/log.txt diff --git a/main.c b/main.c index 3152e021..08478b4a 100644 --- a/main.c +++ b/main.c @@ -42,11 +42,11 @@ int main(int argc, char * argv[]) { // char * cfg_buf[100]; - fscanf(config_file, "%s %d %f %f %s %d %s %s %s %d %d %s %d", - call, &reset_count, &lat_file, &long_file, sim_yes, &squelch, tx, rx, hab_yes, &rx_pl, &tx_pl, fail_yes, &fail_time); + fscanf(config_file, "%s %d %f %f %s %d %s %s %s %d %d %s %d %s", + call, &reset_count, &lat_file, &long_file, sim_yes, &squelch, tx, rx, hab_yes, &rx_pl, &tx_pl, fail_yes, &fail_time, doppler_mode); fclose(config_file); - fprintf(stderr,"Config file /home/pi/CubeSatSim/sim.cfg contains %s %d %f %f %s %d %s %s %s %d %d %s %d\n", - call, reset_count, lat_file, long_file, sim_yes, squelch, tx, rx, hab_yes, rx_pl, tx_pl, fail_yes, fail_time); + fprintf(stderr,"Config file /home/pi/CubeSatSim/sim.cfg contains %s %d %f %f %s %d %s %s %s %d %d %s %d %s\n", + call, reset_count, lat_file, long_file, sim_yes, squelch, tx, rx, hab_yes, rx_pl, tx_pl, fail_yes, fail_time, doppler_mode); fprintf(stderr, "Transmit on %s MHz Receive on %s MHz\n", tx, rx); @@ -321,8 +321,8 @@ int main(int argc, char * argv[]) { } config_file = fopen("sim.cfg", "w"); - fprintf(config_file, "%s %d %8.4f %8.4f %s %d %s %s %s %d %d %s %d", - call, reset_count, lat_file, long_file, sim_yes, squelch, tx, rx, hab_yes, rx_pl, tx_pl, fail_yes, fail_time); + fprintf(config_file, "%s %d %8.4f %8.4f %s %d %s %s %s %d %d %s %d %s", + call, reset_count, lat_file, long_file, sim_yes, squelch, tx, rx, hab_yes, rx_pl, tx_pl, fail_yes, fail_time, doppler_mode); // fprintf(config_file, "%s %d", call, reset_count); fclose(config_file); config_file = fopen("sim.cfg", "r"); diff --git a/main.h b/main.h index 08a9ad5e..60e534b8 100644 --- a/main.h +++ b/main.h @@ -170,6 +170,7 @@ char sim_yes[10]; char hab_yes[10]; char fail_yes[10]; int fail_time = 60; +char doppler_mode[10]; int squelch = 3; // default squelch char rx[12], tx[12]; int tx_pl = 0; diff --git a/systemd/frequency.service b/systemd/frequency.service new file mode 100644 index 00000000..03ecb550 --- /dev/null +++ b/systemd/frequency.service @@ -0,0 +1,14 @@ +[Unit] +Description=frequency + +[Service] +TimeoutStopSec=5 +ExecStart=python3 -u /home/pi/CubeSatSim/frequency.py +WorkingDirectory=/home/pi/CubeSatSim +StandardOutput=inherit +StandardError=inherit +Restart=always +User=pi + +[Install] +WantedBy=default.target diff --git a/transmit.py b/transmit.py index 75f59de0..3a4448e7 100644 --- a/transmit.py +++ b/transmit.py @@ -17,6 +17,20 @@ def output(pin, value): system(command) print(command) +def uptime_seconds(): + try: + system("sudo cat /proc/uptime > /home/pi/CubeSatSim/uptime") + file = open("/home/pi/CubeSatSim/uptime") + up = file.read().split(" ")[0] + print(up) + uptime = float(up) + print(uptime) + file.close() + return uptime + except Exception as e: + print(f"An error occurred: {e}") + print(" failed") + def input(pin): # command = "gpio -g read " + str(pin) query = ["gpio", "-g", "read", str(pin)] # Read GPIO pin @@ -216,15 +230,325 @@ def camera_photo(): return True else: return False + +def program_fm(rx, tx, rxpl_value, sq, txpl_value): + + try: + global gpsd_status + global pd + global ptt + global two_meter_rpitx + global txc + global restore_txc + + if (gpsd_status == "active"): + print("Stopping gpsd.socket") + system("sudo systemctl stop gpsd.socket") + print("Programming FM module!\n"); + txf = float(tx) + rxf = float(rx) + + if (txf > 144.0) and (txf < 148.0): + two_meter_rpitx = True + print("Transmitting in 2m band using rptix") +# if (txc): +# restore_txc = True +# print("Restore FM with 70cm band") + txc = False + tx = "434.9000" +# elif (two_meter_rpitx): +# two_meter_rpitx = False +# print("Stop transmitting in 2m bacnd using rptix") +# if (restore_txc): +# txc = True +# restore_txc = False +# print("Restoring FM with 70cm band") +# print("Rebooting") +# system("sudo reboot now") + + if (txf > 450.0) or ((txf < 420.0) and (txf > 148.0)) or (txf < 144.0) : + tx = "434.9000" + print("Transmit frequency out of amateur bands") + if (rxf > 450.0) or (rxf < 420.0): + rx = "435.0000" + print("Receive frequency out of FM bounds") + output(pd, 1) + output (ptt, 1) + try: + ser = serial.Serial("/dev/ttyAMA0", 9600) + print(ser.portstr) + # uhf_string = "AT+DMOSETGROUP=0," + rx +"," + tx + ",0,3,0,0\r\n" + uhf_string = "AT+DMOSETGROUP=0," + rx + "," + tx + "," + rxpl_value + "," + sq + "," + txpl_value + ",0\r\n" + print(uhf_string) + for i in range(6): + # ser.write(b"AT+DMOSETGROUP=0,435.0000,434.9000,0,3,0,0\r\n") + ser.write(uhf_string.encode()) + sleep(0.1) + ser.close() + ser = serial.Serial("/dev/ttyAMA0", 115200) # reset back to 115200 for cubesatsim code for payload sensor data + except Exception as e: + print(f"An error occurred: {e}") + print("Error in serial write") + # output(pd, 0) # Don't turn off receiver + if (gpsd_status == "active"): + print("Restarting gpsd.socket") + system("sudo systemctl restart gpsd.socket") + except Exception as e: + print(f"An error occurred: {e}") + print("program_fm failed") + +def start_repeater(tx_freq_hz, rx_freq_hz): + global txLed + print("Starting repeater") + + if abs(rx_freq_hz - 3 * tx_freq_hz) < 10000: + tx_freq_hz = tx_freq_hz + 30000 + print("Adjusting Repeater TX frequency to avoid 3rd harmonic RX") + + output(txLed, 1) + txr = "{:.3f}".format(tx_freq_hz/1e3) + print(txr) + system("sudo nc -l 8011 | csdr convert_i16_f | csdr gain_ff 4000 | csdr convert_f_samplerf 20833 | sudo rpitx -i- -m RF -f " + txr + " > /dev/null 2>&1 &") + sleep(0.5) + system("sudo arecord -D shared_mic -r48000 -fS16_LE -c1 | nc localhost 8011 &") + +def stop_repeater(): + global txLed +# print("No carrier detected, stopping repeater") + output(txLed, 0) + system("sudo rpitx -i null > /dev/null 2>&1") + system("sudo killall -9 arecord > /dev/null 2>&1") + system("sudo killall -9 nc > /dev/null 2>&1") +# system("sudo killall -9 rpitx > /dev/null 2>&1") + print("Resetting audio") + system("sudo /etc/init.d/alsa-utils stop") + system("sudo /etc/init.d/alsa-utils start") + print("Finished resetting audio") +# print("Ready to detect carrier") + +def update_doppler(fm="yes"): + + try: + global start_time + global tx_doppler_freq_hz + global rx_doppler_freq_hz + global rxpl_value + global txpl_value + global sq + global mode + global tx + global rxf + global txr + global rigctl + print("update_doppler") + + with open("/home/pi/CubeSatSim/frequency.txt", "r") as file: + frequencies = file.read().split() + + tx_frequency = int(frequencies[0]) + rx_frequency = int(frequencies[1]) # Not used right now as FT857 emulation only updates transmit frequency + + print(f"New TX Frequency: {tx_frequency}, new RX Frequency: {rx_frequency}") + + if rigctl: + if (tx_frequency > 145955000) and (tx_frequency <= 145965000): + tx_center = 145960000 # AO-91 + rx_center = 435250000 + print("AO-91 detected!") + elif (tx_frequency > 145965000) and (tx_frequency < 145975000): + tx_center = 145970000 # AO-73 is shifted up 10kHz to avoid overlap with AO-91 + rx_center = 435140000 + print("AO-73 detected!") + elif (tx_frequency > 145795000) and (tx_frequency < 145805000): + tx_center = 145800000 # ISS U/V Repeater + rx_center = 437800000 + print("ISS U/V detected!") + elif (tx_frequency > 145945000) and (tx_frequency <= 145955000): + tx_center = 145950000 # AO-7 + rx_center = 432150000 + print("AO-7 detected!") + else: + tx_center = tx_frequency + rx_center = rxf * 1e6 # default RX requency + print("No Satellite detected. Using default RX frequency with no doppler shift") + + if (rx_center != rxf * 1e6): # don't Doppler shift default RX frequency since don't know the shift + tx_doppler_shift = tx_frequency - tx_center + rx_doppler_shift = -1 * (rx_center/tx_center) * tx_doppler_shift + new_tx_frequency = tx_frequency + new_rx_frequency = rx_center + rx_doppler_shift + print("Calculating RX frequency using offset from TX frequency!") + print(f"Tx Doppler Shift: {tx_doppler_shift:.0f} Frequency: {new_tx_frequency:.0f}") + print(f"Rx Doppler Shift: {rx_doppler_shift:.0f} Frequency: {new_rx_frequency:.0f}") + else: + new_tx_frequency = tx_frequency + new_rx_frequency = rxf * 1e6 # default RX frequency or should we use same as tx frequency with doppler shift? + print(f"Tx Frequency: {new_tx_frequency:.0f}") + print(f"Rx Frequency: {new_rx_frequency:.0f}") + else: + new_tx_frequency = tx_frequency + new_rx_frequency = rx_frequency + print(f"Tx Frequency: {new_tx_frequency:.0f}") + print(f"Rx Frequency: {new_rx_frequency:.0f}") + + if (tx_doppler_freq_hz != new_tx_frequency) or (rx_doppler_freq_hz != new_rx_frequency): + tx_doppler_freq_hz = new_tx_frequency + rx_doppler_freq_hz = new_rx_frequency + print("Applying Doppler shift!") +# print(f"Tx Doppler shift: {tx_doppler_freq_hz:.0f}") +# rx_doppler_freq_hz = rx_doppler_start_hz + rx_doppler_shift_hz +# print(f"Tx Doppler shift: {tx_doppler_freq_hz:.0f}") + rx = "{:.4f}".format(rx_doppler_freq_hz/1e6) + if (mode != 'e'): + tx = "{:.4f}".format(tx_doppler_freq_hz/1e6) +# print(tx) + else: + txr = "{:.3f}".format(tx_doppler_freq_hz/1e6) + if (fm != "no"): + program_fm(rx,tx,rxpl_value,sq,txpl_value) + else: + print("Not applying Doppler shift!") + except Exception as e: + print(f"An error occurred: {e}") + print("update_doppler failed") + +morse_table = [ # 0-9, A-Z only by (ASCII - 48) + [ 3, 3, 3, 3, 3, 0 ], # 0 + [ 1, 3, 3, 3, 3, 0 ], # 1 + [ 1, 1, 3, 3, 3, 0 ], # 2 + [ 1, 1, 1, 3, 3, 0 ], # 3 + [ 1, 1, 1, 1, 3, 0 ], # 4 + [ 1, 1, 1, 1, 1, 0 ], # 5 + [ 3, 1, 1, 1, 1, 0 ], # 6 + [ 3, 3, 1, 1, 1, 0 ], # 7 + [ 3, 3, 3, 1, 1, 0 ], # 8 + [ 3, 3, 3, 3, 1, 0 ], # 9 + [ 0, 0, 0, 0, 0, 0 ], # - + [ 0, 0, 0, 0, 0, 0 ], # - + [ 0, 0, 0, 0, 0, 0 ], # - + [ 0, 0, 0, 0, 0, 0 ], # - + [ 0, 0, 0, 0, 0, 0 ], # - + [ 0, 0, 0, 0, 0, 0 ], # - + [ 0, 0, 0, 0, 0, 0 ], # - + [ 1, 3, 0, 0, 0, 0 ], # A + [ 3, 1, 1, 1, 0, 0 ], # B + [ 3, 1, 3, 1, 0, 0 ], # C + [ 3, 1, 1, 0, 0, 0 ], # D + [ 1, 0, 0, 0, 0, 0 ], # E + [ 1, 1, 3, 1, 0, 0 ], # F + [ 3, 3, 1, 0, 0, 0 ], # G + [ 1, 1, 1, 1, 0, 0 ], # H + [ 1, 1, 0, 0, 0, 0 ], # I + [ 1, 3, 3, 3, 0, 0 ], # J + [ 3, 1, 3, 0, 0, 0 ], # K + [ 1, 3, 1, 1, 0, 0 ], # L + [ 3, 3, 0, 0, 0, 0 ], # M + [ 3, 1, 0, 0, 0, 0 ], # N + [ 3, 3, 3, 0, 0, 0 ], # O + [ 1, 3, 3, 1, 0, 0 ], # P + [ 3, 3, 1, 3, 0, 0 ], # Q + [ 1, 3, 1, 0, 0, 0 ], # R + [ 1, 1, 1, 0, 0, 0 ], # S + [ 3, 0, 0, 0, 0, 0 ], # T + [ 1, 1, 3, 0, 0, 0 ], # U + [ 1, 1, 1, 3, 0, 0 ], # V + [ 1, 3, 3, 0, 0, 0 ], # W + [ 3, 1, 1, 3, 0, 0 ], # X + [ 3, 1, 3, 3, 0, 0 ], # Y + [ 3, 3, 1, 1, 0, 0 ] # Z +] + +def cw_transmit_fm(morse, tx): + global txLed +# global no_command + global debug_mode +# global sim_mode +# global callsign +# global tx +# global txr + + try: + output(txLed, 1) + print("Transmit FM CW " + morse) +# status = "" +# if not no_command: +# status = status + " C" +# if sim_mode: +# status = status + " S" +# if (mode != 'e'): + if (debug_mode == 1): + system("echo 'hi hi de " + morse + "' > id.txt && gen_packets -M 20 /home/pi/CubeSatSim/id.txt -o /home/pi/CubeSatSim/morse.wav -r 48000 > /dev/null 2>&1 && cat /home/pi/CubeSatSim/morse.wav | csdr convert_i16_f | csdr gain_ff 7000 | csdr convert_f_samplerf 20833 | sudo /home/pi/rpitx/rpitx -i- -m RF -f " + tx + "e3") + else: + system("echo 'hi hi de " + morse + "' > id.txt && gen_packets -M 20 /home/pi/CubeSatSim/id.txt -o /home/pi/CubeSatSim/morse.wav -r 48000 > /dev/null 2>&1 && cat /home/pi/CubeSatSim/morse.wav | csdr convert_i16_f | csdr gain_ff 7000 | csdr convert_f_samplerf 20833 | sudo /home/pi/rpitx/rpitx -i- -m RF -f " + tx + "e3 > /dev/null 2>&1") +# else: +# if (debug_mode == 1): +# system("echo 'hi hi de " + morse + "' > id.txt && gen_packets -M 20 /home/pi/CubeSatSim/id.txt -o /home/pi/CubeSatSim/morse.wav -r 48000 > /dev/null 2>&1 && cat /home/pi/CubeSatSim/morse.wav | csdr convert_i16_f | csdr gain_ff 7000 | csdr convert_f_samplerf 20833 | sudo /home/pi/rpitx/rpitx -i- -m RF -f " + txr + "e3") +# else: +# system("echo 'hi hi de " + morse + "' > id.txt && gen_packets -M 20 /home/pi/CubeSatSim/id.txt -o /home/pi/CubeSatSim/morse.wav -r 48000 > /dev/null 2>&1 && cat /home/pi/CubeSatSim/morse.wav | csdr convert_i16_f | csdr gain_ff 7000 | csdr convert_f_samplerf 20833 | sudo /home/pi/rpitx/rpitx -i- -m RF -f " + txr + "e3 > /dev/null 2>&1") + + output(txLed, 0) + except Exception as e: + print(f"An error occurred: {e}") + print("cw_transmit_fm failed") + +def cw_transmit_string(string): + global morse_timing + for character in string: + if (character != ' '): + update_doppler() + cw_transmit_char(character); + else: + sleep(7.0 * morse_timing); + +def cw_transmit_char(character): + global morse_timing +# update_doppler("no") + i = 0 + duration = morse_table[(ord(character.upper()) - ord('0')) % 44][i] + if duration == 1: + duration = 1.2 +# print(duration) + while (duration != 0): + transmit_carrier(duration * morse_timing) + sleep(morse_timing * 0.4) # 6) + i=i+1 + duration = morse_table[(ord(character.upper()) - ord('0')) % 44][i] + if duration == 1: + duration = 1.2 + sleep(morse_timing * 2.0) # 3) # 1.5); + +def transmit_carrier(duration): + global tx_doppler_freq_hz + global txLed + update_doppler("no") + command = "timeout -k 0.5 " + str(duration) + " sudo tune -f " + str(tx_doppler_freq_hz) + " > /dev/null 2>&1" # 434.9e6 + start = "sudo tune -f " + str(tx_doppler_freq_hz) + " &" # + " & > /dev/null 2>&1" # 434.9e6 + stop = "sudo rpitx -f 434.9e6 &" +# killrpitx = "sudo killall -9 rpitx &" + killtune = "sudo killall -9 tune &" + output(txLed, 1) +# system(start) + system(command) +# sleep(duration) +# system(stop) + output(txLed, 0) +# system(killrpitx) +# system(killtune) + print("CubeSatSim v2.2 transmit.py starting...") +system("sudo systemctl restart frequency") + pd = 21 ptt = 20 txc_pin = 7 squelch = 6 green = 16 powerPin = 16 +morse_timing = 0.09 # 0.1 +two_meter_rpitx = False +restore_txc = False command_tx = True @@ -272,6 +596,9 @@ debug_mode = 0 # change to 1 to debug transmit skip = False +tx_doppler_freq_hz = 0 +rx_doppler_freq_hz = 0 + if __name__ == "__main__": mode = "y" if (len(sys.argv)) > 1: @@ -296,22 +623,22 @@ if __name__ == "__main__": except: print("Pi Zero 2 not detected") - try: - system("sudo cat /proc/uptime > /home/pi/CubeSatSim/uptime") - file = open("/home/pi/CubeSatSim/uptime") - up = file.read().split(" ")[0] - print(up) - uptime = float(up) - print(uptime) - if (uptime < uptime_time): - print("Uptime < threshold seconds") - else: - print("Uptime > threshold seconds") - print("Skip CW ID") - skip = True - file.close() - except: - print("Can't open /proc/uptime") +# try: +# system("sudo cat /proc/uptime > /home/pi/CubeSatSim/uptime") +# file = open("/home/pi/CubeSatSim/uptime") +# up = file.read().split(" ")[0] +# print(up) +# uptime = float(up) +# print(uptime) + if (uptime_seconds() < uptime_time): + print("Uptime < threshold seconds") + else: + print("Uptime > threshold seconds") + print("Skip CW ID") + skip = True +# file.close() +# except: +# print("Can't open /proc/uptime") print(skip) if ( mode == "y"): @@ -363,6 +690,8 @@ if __name__ == "__main__": sim_mode = False sim_config = False hab_mode = False + doppler_mode = False + rigctl = False try: file = open("/home/pi/CubeSatSim/sim.cfg") @@ -389,34 +718,55 @@ if __name__ == "__main__": print(f'squelch: {sq}') if len(config) > 6: txf = float(config[6]) + tx = "{:.4f}".format(txf) + txrf = 0 if (mode == 'e'): - txr = (txf - 290.0) # - 0.1 # Cross Band Repeater mode transmit frequency in 2m band - tx = "{:.4f}".format(txr) + if (txf > 420.0) and (txf < 450.0): + txrf = (txf - 290.0) # - 0.1 # Cross Band Repeater mode transmit frequency in 2m band + print("Repeater mode subtracting 290 MHz from TX Frequency") + elif (txf > 144.0) and (txf < 148.0): + txrf = txf # Cross Band Repeater mode transmit frequency is already in 2m band + print("Repeater mode using 2m TX Frequency") + else: + txf = 144.9 + txr = "{:.4f}".format(txrf) + print("Transmit frequency: ",txr) else: - tx = "{:.4f}".format(txf) - print("Transmit frequency: ",tx) + print("Transmit frequency: ",tx) if len(config) > 7: - rxf = float(config[7]) -# print(rxf) -# print( "{:.4f}".format(rxf)) - rx = "{:.4f}".format(rxf) - print(rx) + rxf = float(config[7]) + rx = "{:.4f}".format(rxf) + print(rx) if len(config) > 8: if config[8] == 'y' or config[8] == 'yes': hab_mode = True print("Balloon (HAB) mode is configured.") if len(config) > 9: - rxpl = float(config[9]) - # print(rxpl) - # print( "{:.0f}".format(rxpl)) - rxpl_value = "{:.0f}".format(rxpl) - print(rxpl_value) + rxpl = float(config[9]) +# print(rxpl) +# print( "{:.0f}".format(rxpl)) + rxpl_value = "{:.0f}".format(rxpl) + print(rxpl_value) if len(config) > 10: - txpl = float(config[10]) + txpl = float(config[10]) # print(txpl) # print( "{:.0f}".format(txpl)) - txpl_value = "{:.0f}".format(txpl) - print(txpl_value) + txpl_value = "{:.0f}".format(txpl) + print(txpl_value) + if len(config) > 13: + if config[13] == 'sim': + doppler_mode = True +# system("sudo systemctl restart frequency") + print("Simulated Doppler frequency shift is enabled.") + elif config[13] == 'rig': + doppler_mode = True + rigctl = True +# system("sudo systemctl restart frequency") + print("rigctl Doppler frequency shift is enabled.") +# else: +# system("sudo systemctl stop rigctld") + else: + system("sudo systemctl stop rigctld") print(config) print # print(callsign) @@ -488,50 +838,77 @@ if __name__ == "__main__": print(f"Output of the command (stdout): {e.stdout}") # print(f"Error output of the command (stderr): {e.stderr}") - if (mode != 'e'): - - if (gpsd_status == "active"): - print("Stopping gpsd.socket") - system("sudo systemctl stop gpsd.socket") - print("Programming FM module!\n"); - output(pd, 1) - output (ptt, 1) - try: - ser = serial.Serial("/dev/ttyAMA0", 9600) - print(ser.portstr) - # uhf_string = "AT+DMOSETGROUP=0," + rx +"," + tx + ",0,3,0,0\r\n" - uhf_string = "AT+DMOSETGROUP=0," + rx + "," + tx + "," + rxpl_value + "," + sq + "," + txpl_value + ",0\r\n" - print(uhf_string) - for i in range(6): - # ser.write(b"AT+DMOSETGROUP=0,435.0000,434.9000,0,3,0,0\r\n") - ser.write(uhf_string.encode()) - sleep(0.1) - ser.close() - ser = serial.Serial("/dev/ttyAMA0", 115200) # reset back to 115200 for cubesatsim code for payload sensor data - except: - print("Error in serial write") - output(pd, 0) - if (gpsd_status == "active"): - print("Restarting gpsd.socket") - system("sudo systemctl restart gpsd.socket") +# if (mode != 'e'): + program_fm(rx,tx,rxpl_value,sq,txpl_value) + + if ((doppler_mode == True) and (command_tx == True) and (skip == False)) or (mode == 'e'): + cw_transmit_fm("QSY", tx) + + if (doppler_mode == True): + +# if (command_tx == True) and (skip == False): +# cw_transmit_fm("QSY", tx) + if (mode == 'e'): + tx_doppler_start_hz = txrf * 1e6 + else: + tx_doppler_start_hz = txf * 1e6 + tx_doppler_shift_hz = 0 + print(f"Tx center frequency: {tx_doppler_start_hz}") + rx_doppler_start_hz = rxf * 1e6 + rx_doppler_shift_hz = 0 + print(f"Rx center frequency: {rx_doppler_start_hz}") + +# TARGET_PASS = 85 # Maximum elevation profile + +# doppler_table = iss_doppler_passes[TARGET_PASS] +# print(f"Pass Max Elevation: {TARGET_PASS}°") + + print("MODE: ") + print(mode) + + update_doppler() + if (mode == 'm') and (skip == False): + print("Sleeping 15 seconds") + sleep(15) # avoid CW jumping around at start + + result = subprocess.run("systemctl get-default | grep graphical.target", shell=True, capture_output=True, text=True) + gui_result = result.stdout.strip() + print(gui_result) + if gui_result == "graphical.target": + print("Sleep another 30 seconds") + sleep(30) # sleep another 30 seconds for cpu to settle down + sim_failure_check() + + status = "" + if not no_command: + status = status + " C" + if sim_mode: + status = status + " S" + if (hab_mode == True) and (mode == 'a'): print("Don't transmit CW ID since APRS HAB mode is active") else: if (((mode == 'a') or (mode == 'b') or (mode == 'f') or (mode == 's') or (mode == 'j') or (mode == 'p') or (mode == 'P')) and (command_tx == True) and (skip == False)) or ((mode == 'e') and (command_tx == True)): # battery_saver_mode - output(txLed, 1) - print("Transmit CW ID") - status = "" - if not no_command: - status = status + " C" - if sim_mode: - status = status + " S" - if (debug_mode == 1): - system("echo 'hi hi de " + callsign + status + "' > id.txt && gen_packets -M 20 /home/pi/CubeSatSim/id.txt -o /home/pi/CubeSatSim/morse.wav -r 48000 > /dev/null 2>&1 && cat /home/pi/CubeSatSim/morse.wav | csdr convert_i16_f | csdr gain_ff 7000 | csdr convert_f_samplerf 20833 | sudo /home/pi/rpitx/rpitx -i- -m RF -f " + tx + "e3") + +# output(txLed, 1) +# print("Transmit CW ID") + + if (mode != 'e'): + cw_transmit_fm(callsign + status, tx) +# if (debug_mode == 1): +# system("echo 'hi hi de " + callsign + status + "' > id.txt && gen_packets -M 20 /home/pi/CubeSatSim/id.txt -o /home/pi/CubeSatSim/morse.wav -r 48000 > /dev/null 2>&1 && cat /home/pi/CubeSatSim/morse.wav | csdr convert_i16_f | csdr gain_ff 7000 | csdr convert_f_samplerf 20833 | sudo /home/pi/rpitx/rpitx -i- -m RF -f " + tx + "e3") +# else: +# system("echo 'hi hi de " + callsign + status + "' > id.txt && gen_packets -M 20 /home/pi/CubeSatSim/id.txt -o /home/pi/CubeSatSim/morse.wav -r 48000 > /dev/null 2>&1 && cat /home/pi/CubeSatSim/morse.wav | csdr convert_i16_f | csdr gain_ff 7000 | csdr convert_f_samplerf 20833 | sudo /home/pi/rpitx/rpitx -i- -m RF -f " + tx + "e3 > /dev/null 2>&1") else: - system("echo 'hi hi de " + callsign + status + "' > id.txt && gen_packets -M 20 /home/pi/CubeSatSim/id.txt -o /home/pi/CubeSatSim/morse.wav -r 48000 > /dev/null 2>&1 && cat /home/pi/CubeSatSim/morse.wav | csdr convert_i16_f | csdr gain_ff 7000 | csdr convert_f_samplerf 20833 | sudo /home/pi/rpitx/rpitx -i- -m RF -f " + tx + "e3 > /dev/null 2>&1") - output(txLed, 0) + cw_transmit_fm(callsign + status, txr) +# if (debug_mode == 1): +# system("echo 'hi hi de " + callsign + status + "' > id.txt && gen_packets -M 20 /home/pi/CubeSatSim/id.txt -o /home/pi/CubeSatSim/morse.wav -r 48000 > /dev/null 2>&1 && cat /home/pi/CubeSatSim/morse.wav | csdr convert_i16_f | csdr gain_ff 7000 | csdr convert_f_samplerf 20833 | sudo /home/pi/rpitx/rpitx -i- -m RF -f " + txr + "e3") +# else: +# system("echo 'hi hi de " + callsign + status + "' > id.txt && gen_packets -M 20 /home/pi/CubeSatSim/id.txt -o /home/pi/CubeSatSim/morse.wav -r 48000 > /dev/null 2>&1 && cat /home/pi/CubeSatSim/morse.wav | csdr convert_i16_f | csdr gain_ff 7000 | csdr convert_f_samplerf 20833 | sudo /home/pi/rpitx/rpitx -i- -m RF -f " + txr + "e3 > /dev/null 2>&1") +# +# output(txLed, 0) sleep(1) else: @@ -560,12 +937,13 @@ if __name__ == "__main__": output(txLed, 0) print("0") rpitx = "arecord -D plughw:CARD=Loopback,DEV=1 -f S16_LE -r 48000 -c 1 | csdr convert_s16_f | csdr gain_ff 4000 | csdr convert_f_samplerf 20833 | sudo rpitx -i- -m RF -f " + tx + "e3 > /dev/null 2>&1 &" - stop_rpitx = "sudo killall -9 rpitx && sudo killall -9 arecord && sudo rpitx -m RF -f 434.9e3 > /dev/null 2>&1" +# stop_rpitx = "sudo killall -9 rpitx && sudo killall -9 arecord && sudo rpitx -m RF -f 434.9e3 > /dev/null 2>&1" + stop_rpitx = "sudo killall -9 arecord && sudo rpitx -m RF -f 434.9e3 > /dev/null 2>&1" if not txc: print("txc is:") print(txc) system(stop_rpitx) - system(rpitx) +# system(rpitx) print("Safe Mode!!") while (True): if (txc): @@ -577,18 +955,24 @@ if __name__ == "__main__": while (input(ptt) != 1): sleep(0.2) output(txLed, 0) + if (mode == 'p') and (doppler_mode): + update_doppler() # print("0") else: # sleep(0.1) while (input(17) == 0): sleep(0.05) -## system(rpitx) + system(rpitx) output(txLed, 1) # print("1") while (input(17) == 1): sleep(0.05) -## system(stop_rpitx) + system(stop_rpitx) output(txLed, 0) + if (mode == 'p') and (doppler_mode): + update_doppler() # "no") + rpitx = "arecord -D plughw:CARD=Loopback,DEV=1 -f S16_LE -r 48000 -c 1 | csdr convert_s16_f | csdr gain_ff 4000 | csdr convert_f_samplerf 20833 | sudo rpitx -i- -m RF -f " + tx + "e3 > /dev/null 2>&1 &" + # print("0") # sleep(10) @@ -611,11 +995,10 @@ if __name__ == "__main__": system("cat /home/pi/CubeSatSim/t.txt") if (command_tx == True): output(txLed, 1) -# output(pd, 1) -# output (ptt, 0) -# sleep(.1) -# -# battery_saver_check() + if (doppler_mode == True): + update_doppler() + txf = tx_doppler_freq_hz / 1e6 + tx = "{:.4f}".format(txf) if (txc): sim_failure_check() # output(pd, 1) @@ -627,7 +1010,9 @@ if __name__ == "__main__": output (ptt, 1) # output(pd, 0) else: - system("echo 'AMSAT-11>APCSS:010101/hi hi ' >> t.txt") +# system("echo 'AMSAT-11>APCSS:010101/hi hi ' >> t.txt") + system("echo 'AMSAT-11>APCSS:010101/hi hi ' | sudo tee -a /home/pi/CubeSatSim/t.txt") + if (debug_mode == 1): system("gen_packets -o /home/pi/CubeSatSim/telem.wav /home/pi/CubeSatSim/t.txt -r 48000 > /dev/null 2>&1 && cat /home/pi/CubeSatSim/telem.wav | csdr convert_i16_f | csdr gain_ff 7000 | csdr convert_f_samplerf 20833 | sudo /home/pi/rpitx/rpitx -i- -m RF -f " + tx + "e3") else: @@ -645,7 +1030,8 @@ if __name__ == "__main__": sleep(0.5) - except: + except Exception as e: +# print(f"An error occurred: {e}") # command_control_check() sleep(1) elif (mode == 'm'): @@ -654,42 +1040,59 @@ if __name__ == "__main__": while True: # command_control_check() output (pd, 1) - output (ptt, 1) + output (ptt, 1) try: f = open("/home/pi/CubeSatSim/cwready") f.close() system("sudo rm /home/pi/CubeSatSim/cwready") ## ch = 1 for chan in range(7): - command = "gen_packets -M 20 -o /home/pi/CubeSatSim/morse.wav /home/pi/CubeSatSim/cw" + str(chan) + ".txt -r 48000 > /dev/null 2>&1" - print(command) - system(command) -## chan = chan + 1 - if (command_tx == True): - output(txLed, 1) - - if (txc): - sim_failure_check() -# output (pd, 1) - sleep(0.3) - output (ptt, 0) - system("aplay -D plughw:CARD=" + card + ",DEV=0 /home/pi/CubeSatSim/morse.wav") - sleep(0.1) - output (ptt, 1) -# output (pd, 0) - else: - if (debug_mode == 1): - system("cat /home/pi/CubeSatSim/morse.wav | csdr convert_i16_f | csdr gain_ff 7000 | csdr convert_f_samplerf 20833 | sudo /home/pi/rpitx/rpitx -i- -m RF -f " + tx + "e3") + if (doppler_mode): + try: +# update_doppler() + filename="/home/pi/CubeSatSim/cw" + str(chan) + ".txt" + print(filename) + file = open(filename) + cw_string = file.readline() + print(cw_string) + cw_transmit_string(cw_string) + except Exception as e: + print(f"An error occurred: {e}") + print("error reading cw string " + str(chan)) + else: + command = "gen_packets -M 20 -o /home/pi/CubeSatSim/morse.wav /home/pi/CubeSatSim/cw" + str(chan) + ".txt -r 48000 > /dev/null 2>&1" + print(command) + system(command) + ## chan = chan + 1 + if (command_tx == True): + output(txLed, 1) + if (doppler_mode == True): + update_doppler() + txf = tx_doppler_freq_hz / 1e6 + tx = "{:.4f}".format(txf) + if (txc): + sim_failure_check() + # output (pd, 1) + sleep(0.3) + output (ptt, 0) + system("aplay -D plughw:CARD=" + card + ",DEV=0 /home/pi/CubeSatSim/morse.wav") + sleep(0.1) + output (ptt, 1) + # output (pd, 0) else: - system("cat /home/pi/CubeSatSim/morse.wav | csdr convert_i16_f | csdr gain_ff 7000 | csdr convert_f_samplerf 20833 | sudo /home/pi/rpitx/rpitx -i- -m RF -f " + tx + "e3 > /dev/null 2>&1") - output(txLed, 0) - + if (debug_mode == 1): + system("cat /home/pi/CubeSatSim/morse.wav | csdr convert_i16_f | csdr gain_ff 7000 | csdr convert_f_samplerf 20833 | sudo /home/pi/rpitx/rpitx -i- -m RF -f " + tx + "e3") + else: + system("cat /home/pi/CubeSatSim/morse.wav | csdr convert_i16_f | csdr gain_ff 7000 | csdr convert_f_samplerf 20833 | sudo /home/pi/rpitx/rpitx -i- -m RF -f " + tx + "e3 > /dev/null 2>&1") + output(txLed, 0) + # command_control_check() sleep(2) f.close() sleep(10) except: # command_control_check() +# print("cw not ready") sleep(1) elif (mode == 's'): print("SSTV") @@ -728,6 +1131,10 @@ if __name__ == "__main__": if (command_tx == True): print ("Sending SSTV image") + if (doppler_mode): + update_doppler() + txf = tx_doppler_freq_hz / 1e6 + tx = "{:.4f}".format(txf) output(txLed, 1) # battery_saver_check() @@ -755,10 +1162,13 @@ if __name__ == "__main__": system("/home/pi/PiSSTVpp/pisstvpp -r 48000 -p s2 /home/pi/CubeSatSim/camera_out.jpg") system("sudo rm /home/pi/CubeSatSim/camera_out.jpg > /dev/null 2>&1") -# command_control_check() - if (command_tx == True): print ("Sending SSTV image") + if (doppler_mode): + update_doppler() + txf = tx_doppler_freq_hz / 1e6 + tx = "{:.4f}".format(txf) + output(txLed, 1) # battery_saver_check() @@ -795,6 +1205,10 @@ if __name__ == "__main__": if (command_tx == True): print ("Sending SSTV image") + if (doppler_mode): + update_doppler() + txf = tx_doppler_freq_hz / 1e6 + tx = "{:.4f}".format(txf) output(txLed, 1) # battery_saver_check() @@ -826,11 +1240,13 @@ if __name__ == "__main__": system("/home/pi/PiSSTVpp/pisstvpp -r 48000 -p s2 /home/pi/CubeSatSim/sstv_image_2_320_x_256.jpg") while 1: - -# command_control_check() - if (command_tx == True): print ("Sending SSTV image") + if (doppler_mode): + update_doppler() + txf = tx_doppler_freq_hz / 1e6 + tx = "{:.4f}".format(txf) + output(txLed, 1) # battery_saver_check() @@ -858,11 +1274,11 @@ if __name__ == "__main__": system("(while true; do (sleep 10 && cat /home/pi/CubeSatSim/wav/sstv.wav); done) | csdr convert_i16_f | csdr gain_ff 7000 | csdr convert_f_samplerf 20833 | sudo rpitx -i- -m RF -f " + tx + "e3 &") while 1: if (command_tx == True): -# command_control_check() - + if (doppler_mode): + update_doppler() + txf = tx_doppler_freq_hz / 1e6 + tx = "{:.4f}".format(txf) output(txLed, 1) - -# battery_saver_check() if (txc): sim_failure_check() @@ -882,9 +1298,11 @@ if __name__ == "__main__": elif (mode == 'b') or (mode == 'j'): # command_control_check() if (mode == 'b'): - print("BPSK") + print("BPSK") else: print("FUNcube") + if (doppler_mode): + print("No doppler shift in this mode") print("turn on FM rx") output(pd, 1) output(ptt, 1) @@ -949,28 +1367,31 @@ if __name__ == "__main__": print("Beacon mode off so no repeater transmission") print("Ready to detect carrier") +# if (doppler_mode): +# update_doppler() +# txr = "{:.3f}".format(tx_doppler_freq_hz/1e6) +# cw_transmit_fm(callsign + status, txr) + start_time = time.perf_counter() + while True: if (input(squelch) == False) and (command_tx == True): - print("Carrier detected, starting repeater") - output(txLed, 1) - system("sudo nc -l 8011 | csdr convert_i16_f | csdr gain_ff 4000 | csdr convert_f_samplerf 20833 | sudo rpitx -i- -m RF -f " + tx + "e3 > /dev/null 2>&1 &") - sleep(0.5) - system("sudo arecord -D shared_mic -r48000 -fS16_LE -c1 | nc localhost 8011 &") + print("Carrier detected") + if (doppler_mode): + update_doppler() + start_repeater(tx_doppler_freq_hz, rx_doppler_freq_hz) + else: + start_repeater(txrf * 1e6, rxf * 1e6) while (input(squelch) == False): sleep(1) - print("No carrier detected, stopping repeater") - output(txLed, 0) - system("sudo rpitx -i null > /dev/null 2>&1") - system("sudo killall -9 arecord > /dev/null 2>&1") - system("sudo killall -9 nc > /dev/null 2>&1") - system("sudo killall -9 rpitx > /dev/null 2>&1") - print("Resetting audio") - system("sudo /etc/init.d/alsa-utils stop") - system("sudo /etc/init.d/alsa-utils start") - print("Finished resetting audio") - print("Ready to detect carrier") + print("No carrier detected") + stop_repeater() + if ((time.perf_counter() - start_time) > 10) and doppler_mode: + update_doppler() + start_time = time.perf_counter() else: print("FSK") + if (doppler_mode): + print("No doppler shift in this mode") print("turn on FM rx") output(pd, 1) output(ptt, 1)