Merge pull request #423 from alanbjohnston/master-b-p

PacSat Mode
master-b
Alan Johnston 2 days ago committed by GitHub
commit 7c70d34d1d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

3
.gitignore vendored

@ -47,3 +47,6 @@ logt.txt
telem.txt.bk telem.txt.bk
failure_mode.txt failure_mode.txt
sim_mode_auto sim_mode_auto
direwolf-pacsatsim-tmp.conf
groundstation/direwolf-pacsat-tmp.conf
tlm.bin

@ -22,6 +22,7 @@ pcm.softvol {
pcm.shared_speaker { pcm.shared_speaker {
type dmix type dmix
ipc_key 1024 ipc_key 1024
ipc_perm 0666
slave { slave {
pcm "hw:CARD=Device,DEV=0" pcm "hw:CARD=Device,DEV=0"
rate 48000 rate 48000
@ -35,6 +36,7 @@ pcm.shared_speaker {
pcm.shared_mic { pcm.shared_mic {
type dsnoop type dsnoop
ipc_key 2048 ipc_key 2048
ipc_perm 0666
slave { slave {
pcm "hw:CARD=Device,DEV=0" pcm "hw:CARD=Device,DEV=0"
# channels 1 # channels 1

@ -1,9 +1,17 @@
#!/bin/bash #!/bin/bash
echo -e "\nCommand and Control script for CubeSatSim v2.1\n" echo -e "\nCommand and Control script for CubeSatSim v2.2\n"
sudo modprobe snd-aloop sudo modprobe snd-aloop
sudo modprobe snd-aloop
value=`cat /home/pi/CubeSatSim/.mode`
echo "$value" > /dev/null
set -- $value
MODE=$1
FILE=/home/pi/CubeSatSim/command_control FILE=/home/pi/CubeSatSim/command_control
if [ -f "$FILE" ]; then if [ -f "$FILE" ]; then
echo "Radio command and control is ON" echo "Radio command and control is ON"
@ -58,11 +66,11 @@ if [[ $(arecord -l | grep "USB Audio Device") ]] && [ -f "$FILE" ]; then
echo "debug mode" echo "debug mode"
direwolf -c /home/pi/CubeSatSim/direwolf-cc.conf -t 0l | python3 /home/pi/CubeSatSim/dtmf_aprs_cc.py d direwolf -P+ -D1 -r 48000 -c /home/pi/CubeSatSim/direwolf-cc.conf -t 0l | /home/pi/venv/bin/python3 /home/pi/CubeSatSim/dtmf_aprs_cc.py d
else else
direwolf -c /home/pi/CubeSatSim/direwolf-cc.conf -t 0l | python3 /home/pi/CubeSatSim/dtmf_aprs_cc.py direwolf -P+ -D1 -r 48000 -c /home/pi/CubeSatSim/direwolf-cc.conf -t 0l | /home/pi/venv/bin/python3 /home/pi/CubeSatSim/dtmf_aprs_cc.py
fi fi
else else
@ -107,11 +115,11 @@ else
# echo "debug mode" # echo "debug mode"
# direwolf -r 48000 -c /home/pi/CubeSatSim/direwolf/direwolf.conf -t 0l | python3 /home/pi/CubeSatSim/dtmf_aprs_cc.py d # direwolf -r 48000 -c /home/pi/CubeSatSim/direwolf/direwolf.conf -t 0l | /home/pi/venv/bin/python3 /home/pi/CubeSatSim/dtmf_aprs_cc.py d
# else # else
# direwolf -r 48000 -c /home/pi/CubeSatSim/direwolf/direwolf.conf -t 0l | python3 /home/pi/CubeSatSim/dtmf_aprs_cc.py # direwolf -r 48000 -c /home/pi/CubeSatSim/direwolf/direwolf.conf -t 0l | /home/pi/venv/bin/python3 /home/pi/CubeSatSim/dtmf_aprs_cc.py
# fi # fi
@ -124,15 +132,30 @@ else
fi fi
if [ "$1" = "d" ]; then value=`cat /home/pi/CubeSatSim/.mode`
echo "$value" > /dev/null
set -- $value
echo "debug mode" MODE=$1
if [ ! "$MODE" = "P" ] && [ ! "$MODE" = "P" ] ; then
if [ "$1" = "d" ]; then
python3 /home/pi/CubeSatSim/squelch_cc.py d echo "debug mode"
/home/pi/venv/bin/python3 /home/pi/CubeSatSim/squelch_cc.py d
else
/home/pi/venv/bin/python3 /home/pi/CubeSatSim/squelch_cc.py
fi
else else
python3 /home/pi/CubeSatSim/squelch_cc.py echo "Not running Carrier (squelch) Command and Control since PacSat or PacSat Ground Station mode!"
sleep 60
fi fi
fi fi

191
config

@ -43,6 +43,9 @@ function transmit_command {
j) j)
number=7 number=7
;; ;;
p)
number=8
;;
o) o)
number=10 number=10
;; ;;
@ -92,7 +95,9 @@ function check_restart {
echo "$value" > /dev/null echo "$value" > /dev/null
set -- $value set -- $value
if [ "$1" == "f" ] || [ "$1" == "b" ] || [ "$1" == "e" ] || [ "$1" == "j" ] ; then if [ "$1" = "p" ] || [ "$1" = "P" ] ; then
reboot=1
elif [ "$1" == "f" ] || [ "$1" == "b" ] || [ "$1" == "e" ] || [ "$1" == "j" ] ; then
FILE=/home/pi/CubeSatSim/battery_saver FILE=/home/pi/CubeSatSim/battery_saver
if [ -f "$FILE" ]; then if [ -f "$FILE" ]; then
restart=1 restart=1
@ -139,6 +144,7 @@ if [ "$1" = "" ]; then
value=`cat /home/pi/CubeSatSim/.mode` value=`cat /home/pi/CubeSatSim/.mode`
echo "$value" > /dev/null echo "$value" > /dev/null
set -- $value set -- $value
MODE=$1
if [ "$1" = "a" ]; then if [ "$1" = "a" ]; then
echo "Mode is APRS" echo "Mode is APRS"
@ -162,6 +168,10 @@ if [ "$1" = "" ]; then
else else
echo -n "APRS" echo -n "APRS"
fi fi
elif [ "$1" = "p" ]; then
echo "Mode is Pacsat"
elif [ "$1" = "P" ]; then
echo "Mode is Pacsat Ground Station"
else else
echo echo
fi fi
@ -270,8 +280,13 @@ if [ "$1" = "" ]; then
# cat /home/pi/CubeSatSim/command_tx # cat /home/pi/CubeSatSim/command_tx
# echo # echo
echo -n "Squelch level is: " # echo $MODE
echo $6 if [ "$MODE" = "p" ] || [ "$MODE" = "P" ] ; then
echo "Squelch is off since PacSat or PacSat Ground Station mode"
else
echo -n "Squelch level is: "
echo $6
fi
# echo # echo
FILE=/home/pi/CubeSatSim/command_control FILE=/home/pi/CubeSatSim/command_control
@ -282,10 +297,18 @@ if [ "$1" = "" ]; then
if [ -f "$FILE" ]; then if [ -f "$FILE" ]; then
echo "Radio DTMF/APRS command and control is ON" echo "Radio DTMF/APRS command and control is ON"
else else
echo "Radio carrier command and control is ON" if [ "$MODE" = "p" ] || [ "$MODE" = "P" ] ; then
echo "Radio carrier command and control is off since PacSat or PacSat Ground Station mode"
else
echo "Radio carrier command and control is ON"
fi
fi fi
else else
echo "Radio carrier command and control is ON" if [ "$MODE" = "p" ] || [ "$MODE" = "P" ] ; then
echo "Radio carrier command and control is off since PacSat or PacSat Ground Station mode"
else
echo "Radio carrier command and control is ON"
fi
fi fi
else else
echo "Radio command and control is OFF" echo "Radio command and control is OFF"
@ -315,6 +338,32 @@ if [ "$1" = "" ]; then
echo "Transmit beacon telemetry is ON" echo "Transmit beacon telemetry is ON"
fi fi
if [[ $(arecord -l | grep "USB Audio Device") ]] ; then
echo "USB Sound Card detected"
soundcard=1
else
echo "No USB Sound Card detected"
soundcard=0
fi
gpio -g mode 7 up
if [[ $(gpio -g read 7 | grep 0) ]] ; then
echo "FM TXC is present"
txc=1
else
echo "FM TXC not present"
txc=0
fi
timeout 1 rtl_test &> out.txt
if [[ $(grep "No supported" out.txt) ]] ; then
# echo "No RTL-SDR detected"
rtl=0
else
echo "RTL-SDR detected"
rtl=1
fi
echo echo
echo -e "Current sim.cfg configuration file:" echo -e "Current sim.cfg configuration file:"
# echo # echo
@ -383,7 +432,11 @@ elif [ "$1" = "-f" ]; then
echo "changing CubeSatSim to FSK mode" echo "changing CubeSatSim to FSK mode"
sudo echo "f" > /home/pi/CubeSatSim/.mode sudo echo "f" > /home/pi/CubeSatSim/.mode
restart=1 if [ "$1" = "p" ] || [ "$1" = "P" ] ; then
reboot=1
else
restart=1
fi
fi fi
elif [ "$1" = "-b" ]; then elif [ "$1" = "-b" ]; then
@ -400,7 +453,11 @@ elif [ "$1" = "-b" ]; then
echo "changing CubeSatSim to BPSK mode" echo "changing CubeSatSim to BPSK mode"
sudo echo "b" > /home/pi/CubeSatSim/.mode sudo echo "b" > /home/pi/CubeSatSim/.mode
restart=1 if [ "$1" = "p" ] || [ "$1" = "P" ] ; then
reboot=1
else
restart=1
fi
fi fi
elif [ "$1" = "-s" ]; then elif [ "$1" = "-s" ]; then
@ -482,8 +539,10 @@ elif [ "$1" = "-c" ]; then
echo "$value" > /dev/null echo "$value" > /dev/null
set -- $value set -- $value
oldcallsign="$1"
echo "Current value of CALLSIGN is" echo "Current value of CALLSIGN is"
echo $1 echo $oldcallsign
echo 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}
@ -669,6 +728,7 @@ elif [ "$1" = "-C" ]; then
sudo systemctl stop cubesatsim sudo systemctl stop cubesatsim
sudo systemctl stop transmit sudo systemctl stop transmit
sudo systemctl stop command sudo systemctl stop command
sudo systemctl stop pacsatsim
sudo mv -f /home/pi/CubeSatSim/telem.txt /home/pi/CubeSatSim/telem.txt.bk sudo mv -f /home/pi/CubeSatSim/telem.txt /home/pi/CubeSatSim/telem.txt.bk
@ -856,7 +916,7 @@ elif [ "$1" = "-R" ]; then
echo echo
echo "Current commands count is:" echo "Current commands count is:"
cat /home/pi/CubeSatSim/commands_count.txt cat /home/pi/CubeSatSim/command_count.txt
echo echo
echo "Do you want to reset the commands count to zero (y/n) " echo "Do you want to reset the commands count to zero (y/n) "
@ -1119,8 +1179,9 @@ elif [ "$1" = "-o" ]; then
value=`cat /home/pi/CubeSatSim/.mode` value=`cat /home/pi/CubeSatSim/.mode`
echo "$value" > /dev/null echo "$value" > /dev/null
set -- $value set -- $value
MODE=$1
if [ "$1" == "n" ]; then if [ "$MODE" == "n" ]; then
transmit_command "o" transmit_command "o"
@ -1131,35 +1192,19 @@ elif [ "$1" = "-o" ]; then
FILE=/home/pi/CubeSatSim/beacon_off FILE=/home/pi/CubeSatSim/beacon_off
if [ -f "$FILE" ]; then if [ -f "$FILE" ]; then
echo "Transmit beacon telemetry is off" echo "Transmit beacon telemetry is off"
# echo
# echo "Do you want to turn beacon telemetry ON (y/n) "
# read reset
reset="y"
echo echo
if [ "$reset" = "y" ] || [ "$reset" = "yes" ] ; then echo "Turn beacon telemetry ON"
echo "Turn beacon telemetry ON" sudo rm /home/pi/CubeSatSim/beacon_off > /dev/null 2>&1
sudo rm /home/pi/CubeSatSim/beacon_off > /dev/null 2>&1 sudo systemctl restart transmit
sudo systemctl restart transmit
# restart=1
fi
else else
echo "Transmit beacon telemetry is on" echo "Transmit beacon telemetry is on"
# echo
# echo "Do you want to turn beacon telemetry OFF (y/n) "
# read reset
reset="y"
echo echo
if [ "$reset" = "y" ] || [ "$reset" = "yes" ] ; then echo "Turn beacon telemetry OFF"
echo "Turn beacon telemetry OFF" touch /home/pi/CubeSatSim/beacon_off
touch /home/pi/CubeSatSim/beacon_off sudo systemctl restart transmit
sudo systemctl restart transmit
# restart=1
fi
fi fi
sleep 3 sleep 3
fi fi
@ -1239,7 +1284,11 @@ elif [ "$1" = "-e" ]; then
echo "changing CubeSatSim to Repeater mode" echo "changing CubeSatSim to Repeater mode"
sudo echo "e" > /home/pi/CubeSatSim/.mode sudo echo "e" > /home/pi/CubeSatSim/.mode
restart=1 if [ "$1" = "p" ] || [ "$1" = "P" ] ; then
reboot=1
else
restart=1
fi
fi fi
elif [ "$1" = "-n" ]; then elif [ "$1" = "-n" ]; then
@ -1262,6 +1311,10 @@ elif [ "$1" = "-n" ]; then
echo "Switching to mode "$new echo "Switching to mode "$new
sudo echo $new > /home/pi/CubeSatSim/.mode sudo echo $new > /home/pi/CubeSatSim/.mode
restart=1 restart=1
elif [ "$1" = "p" ] || [ "$1" = "P" ] ; then
echo "Switching to PacSat mode"
sudo echo $new > /home/pi/CubeSatSim/.mode
reboot=1
else else
echo "Switching to BPSK mode" echo "Switching to BPSK mode"
sudo echo "b" > /home/pi/CubeSatSim/.mode sudo echo "b" > /home/pi/CubeSatSim/.mode
@ -1314,7 +1367,7 @@ elif [ "$1" = "-A" ]; then
sudo systemctl stop cubesatsim sudo systemctl stop cubesatsim
sudo systemctl stop transmit sudo systemctl stop transmit
sudo python3 -u /home/pi/CubeSatSim/transmit.py x > /dev/null 2>&1 & # Force APRS mode # sudo python3 -u /home/pi/CubeSatSim/transmit.py x > /dev/null 2>&1 & # Force APRS mode
fi fi
sudo systemctl stop command sudo systemctl stop command
@ -1323,7 +1376,7 @@ elif [ "$1" = "-A" ]; then
while [ "$MODE" != "x" ]; while [ "$MODE" != "x" ];
do do
echo "Enter the mode to change: a=APRS, f=FSK, b=BPSK, s=SSTV, m=CW, e=Repeater, j=FUNcube, o=Beacon on/off x=Exit this mode" echo "Enter the mode to change: a=APRS, f=FSK, b=BPSK, s=SSTV, m=CW, e=Repeater, j=FUNcube, p=PacSat, o=Beacon on/off x=Exit this mode"
read MODE read MODE
if [ "$MODE" != "x" ]; then if [ "$MODE" != "x" ]; then
@ -1747,6 +1800,61 @@ reboot=1
fi fi
elif [ "$1" = "-G" ]; then
echo "Changing to PacSatSim mode"
value=`cat /home/pi/CubeSatSim/.mode`
echo "$value" > /dev/null
set -- $value
# echo "changing CubeSatSim to Pacsat mode"
reboot=1
sudo echo "p" > /home/pi/CubeSatSim/.mode
# if [ "$1" == "f" ] || [ "$1" == "b" ] || [ "$1" == "e" ] ; then
# FILE=/home/pi/CubeSatSim/battery_saver
# if [ -f "$FILE" ]; then
# restart=1
# else
# reboot=1
# fi
# else
# restart=1
# fi
elif [ "$1" = "-I" ]; then
echo "Changing to PacSat Ground Station mode"
echo
echo "Run the Pacsat Ground Station in the Desktop"
value=`cat /home/pi/CubeSatSim/.mode`
echo "$value" > /dev/null
set -- $value
# echo "changing CubeSatSim to Pacsat mode"
reboot=1
sudo echo "P" > /home/pi/CubeSatSim/.mode
# if [ "$1" == "f" ] || [ "$1" == "b" ] || [ "$1" == "e" ] ; then
# FILE=/home/pi/CubeSatSim/battery_saver
# if [ -f "$FILE" ]; then
# restart=1
# else
# reboot=1
# fi
# else
# restart=1
# fi
elif [ "$1" = "-k" ]; then
echo
echo "Reset PacSatSim configuration"
echo
sudo systemctl stop pacsatsim &>/dev/null
sudo rm -r /home/pi/PacSat
reboot=1
elif [ "$1" = "-h" ]; then elif [ "$1" = "-h" ]; then
echo "config OPTION" echo "config OPTION"
@ -1762,13 +1870,16 @@ elif [ "$1" = "-h" ]; then
echo " -j Change to FUNcube mode" echo " -j Change to FUNcube mode"
echo " -n Change to Transmit Commands mode" echo " -n Change to Transmit Commands mode"
echo " -e Change to Repeater mode" echo " -e Change to Repeater mode"
echo " -j Change to FUNcube mode"
echo " -G Change to PacSatSim mode"
echo " -I Change to PacSat Ground Station mode"
echo " -i Restart CubeSatsim software" echo " -i Restart CubeSatsim software"
echo " -c Change the CALLSIGN in the configuration file sim.cfg" echo " -c Change the CALLSIGN in the configuration file sim.cfg"
echo " -t Change the Simulated Telemetry setting in sim.cfg" echo " -t Change the Simulated Telemetry setting in sim.cfg"
echo " -r Change the Resets Count in the configuration file sim.cfg" echo " -r Change the Resets Count in the configuration file sim.cfg"
echo " -l Change the Latitude and Longitude in the configuration file sim.cfg" echo " -l Change the Latitude and Longitude in the configuration file sim.cfg"
echo " -S Scan both I2C buses on the Raspberry Pi" echo " -S Scan both I2C buses on the Raspberry Pi"
echo " -C Clear logs" echo " -C Clear logs and reboot"
echo " -T Change command and control state" echo " -T Change command and control state"
echo " -d Change command and control Direwolf state" echo " -d Change command and control Direwolf state"
echo " -R Change the Commands Count in the file command_count.txt" echo " -R Change the Commands Count in the file command_count.txt"
@ -1779,7 +1890,7 @@ elif [ "$1" = "-h" ]; then
echo " -H Change the Balloon (HAB) mode" echo " -H Change the Balloon (HAB) mode"
echo " -p Display payload sensor data for 3 seconds" echo " -p Display payload sensor data for 3 seconds"
echo " -v Display voltage and current data" echo " -v Display voltage and current data"
echo " -P Change the PL (Private Line) CTCSS/CDCSS codes for RX and TX" echo " -P Change the PL (Private Line) CTCSS/CDCSS codes for FM RX and TX"
echo " -A Transmit APRS control packets to control another CubeSatSim" echo " -A Transmit APRS control packets to control another CubeSatSim"
echo " -D Change Transmit Commands state APRS or DTMF" echo " -D Change Transmit Commands state APRS or DTMF"
echo " -o Change telemetry beacon transmit state" echo " -o Change telemetry beacon transmit state"
@ -1789,6 +1900,8 @@ elif [ "$1" = "-h" ]; then
echo " -U Change the random failure mode setting" echo " -U Change the random failure mode setting"
echo " -N Set next mode or failure" echo " -N Set next mode or failure"
echo " -u Change gpsd state" echo " -u Change gpsd state"
echo " -k Reset the PacSatSim Configuration"
echo echo
exit exit

@ -1,2 +1,9 @@
ADEVICE shared_mic hw:CARD=Loopback,DEV=1 ADEVICE shared_mic hw:CARD=Loopback,DEV=1
DTMF DTMF
MYCALL AMSAT
CHANNEL 0
MODEM 1200
FULLDUP OFF
TXDELAY 0
AGWPORT 8200
KISSPORT 8201

@ -0,0 +1,9 @@
CHANNEL 0
MODEM 1200
DWAIT 0
SLOTTIME 10
PERSIST 63
TXDELAY 1000
TXTAIL 10
FULLDUP OFF
DIGIPEAT 0 0 ^WIDE[3-7]-[1-7]$|^TEST$ ^WIDE[12]-[12]$ TRACE

@ -1,4 +1,5 @@
ADEVICE hw:CARD=Loopback,DEV=0 hw:CARD=Headphones,DEV=0 ADEVICE hw:CARD=Loopback,DEV=0 hw:CARD=Headphones,DEV=0
PTT GPIO 20
MYCALL AMSAT MYCALL AMSAT
CHANNEL 0 CHANNEL 0
MODEM 1200 MODEM 1200

@ -1 +0,0 @@
ADEVICE plughw:CARD=Loopback,DEV=1 plughw:CARD=Loopback,DEV=0

@ -1,7 +1,5 @@
import sys import sys
from os import system from os import system
# import RPi.GPIO as GPIO
# from RPi.GPIO import output
from time import sleep from time import sleep
import logging import logging
logging.basicConfig(format='%(message)s') logging.basicConfig(format='%(message)s')
@ -10,10 +8,8 @@ logging.basicConfig(format='%(message)s')
def blink(times): def blink(times):
for i in range(times): for i in range(times):
system("gpio write 27 0") system("gpio write 27 0")
# GPIO.output(27, 0)
sleep(0.1) sleep(0.1)
system("gpio write 27 1") system("gpio write 27 1")
# GPIO.output(27, 1)
sleep(0.1) sleep(0.1)
if __name__ == "__main__": if __name__ == "__main__":
@ -27,151 +23,165 @@ if __name__ == "__main__":
if ('d' == sys.argv[1]): if ('d' == sys.argv[1]):
debug_mode = True debug_mode = True
for line in sys.stdin: while True:
# if (debug_mode): try:
print(line, end =" ") for line in sys.stdin:
logging.warning(line) # if (debug_mode):
print(line, end =" ")
# if '^c' == line.rstrip(): logging.warning(line)
# break
# if '^c' == line.rstrip():
if ((line.find("MODE=a")) > 0): # break
system("echo '\nAPRS Mode!!\n'")
mode = 'a' if ((line.find("MODE=a")) > 0):
change_mode = True system("echo '\nAPRS Mode!!\n'")
if ((line.find("DTMF>APDW15:t1#")) > 0): mode = 'a'
system("echo '\nAPRS Mode!!\n'") change_mode = True
mode = 'a'
change_mode = True elif ((line.find(":t1#")) > 0):
if ((line.find("MODE=f")) > 0): system("echo '\nAPRS Mode!!\n'")
system("echo '\nFSK Mode!!\n'") mode = 'a'
mode = 'f' change_mode = True
change_mode = True elif ((line.find("MODE=f")) > 0):
if ((line.find("DTMF>APDW15:t2#")) > 0): system("echo '\nFSK Mode!!\n'")
system("echo '\nFSK Mode!!\n'") mode = 'f'
mode = 'f' change_mode = True
change_mode = True
if ((line.find("MODE=b")) > 0): elif ((line.find(":t2#")) > 0):
system("echo '\nBPSK Mode!!\n'") system("echo '\nFSK Mode!!\n'")
mode = 'b' mode = 'f'
change_mode = True change_mode = True
if ((line.find("DTMF>APDW15:t3#")) > 0):
system("echo '\nBPSK Mode!!\n'") elif ((line.find("MODE=b")) > 0):
mode = 'b' system("echo '\nBPSK Mode!!\n'")
change_mode = True mode = 'b'
if ((line.find("MODE=s")) > 0): change_mode = True
system("echo '\nSSTV Mode!!\n'")
mode = 's' elif ((line.find(":t3#")) > 0):
change_mode = True system("echo '\nBPSK Mode!!\n'")
if ((line.find("DTMF>APDW15:t4#")) > 0): mode = 'b'
system("echo '\nSSTV Mode!!\n'") change_mode = True
mode = 's' elif ((line.find("MODE=s")) > 0):
change_mode = True system("echo '\nSSTV Mode!!\n'")
if ((line.find("MODE=m")) > 0): mode = 's'
system("echo '\nCW Mode!!\n'") change_mode = True
mode = 'm'
change_mode = True elif ((line.find(":t4#")) > 0):
if ((line.find("DTMF>APDW15:t5#")) > 0): system("echo '\nSSTV Mode!!\n'")
system("echo '\nCW Mode!!\n'") mode = 's'
mode = 'm' change_mode = True
change_mode = True
if ((line.find("MODE=e")) > 0): elif ((line.find("MODE=m")) > 0):
system("echo '\nRepeater Mode!!\n'") system("echo '\nCW Mode!!\n'")
mode = 'e' mode = 'm'
change_mode = True change_mode = True
if ((line.find("DTMF>APDW15:t6#")) > 0):
system("echo '\nRepeater Mode!!\n'") elif ((line.find(":t5#")) > 0):
mode = 'e' system("echo '\nCW Mode!!\n'")
change_mode = True mode = 'm'
if ((line.find("MODE=j")) > 0): change_mode = True
system("echo '\nFUNcube Mode!!\n'")
mode = 'j' elif ((line.find("MODE=e")) > 0):
change_mode = True system("echo '\nRepeater Mode!!\n'")
if ((line.find("DTMF>APDW15:t7#")) > 0): mode = 'e'
system("echo '\nFUNcube Mode!!\n'") change_mode = True
mode = 'j'
change_mode = True elif ((line.find(":t6#")) > 0):
if ((line.find("MODE=n")) > 0): system("echo '\nFUNcube Mode!!\n'")
system("echo '\nTransmit Commands Mode!!\n'") mode = 'j'
mode = 'n' change_mode = True
change_mode = True
if ((line.find("DTMF>APDW15:t11#")) > 0): elif ((line.find("MODE=G")) > 0):
system("echo '\nTransmit Commands Mode!!\n'") system("echo '\nPacSatSim Mode!!\n'")
mode = 'n' mode = 'p'
change_mode = True change_mode = True
if ((line.find("MODE=o")) > 0):
counter = (counter + 1) % 2 # Direwolf prints it twice, only do once elif ((line.find(":t8#")) > 0):
if (counter == 1): system("echo '\nPacSatSim Mode!!\n'")
system("echo '\nBeacon Mode toggle!!\n'") mode = 'p'
mode = 'o' change_mode = True
change_mode = True
counter = 1 elif ((line.find("MODE=n")) > 0):
if ((line.find("DTMF>APDW15:t10#")) > 0): system("echo '\nTransmit Commands Mode!!\n'")
system("echo '\nBeacon Mode toggle!!\n'") mode = 'n'
mode = 'o' change_mode = True
change_mode = True
elif ((line.find(":t11#")) > 0):
# if ((debug_mode == False) and (change_mode == True) and (counter == 1): # skip every other APRS command since Direwolf prints them twice system("echo '\nTransmit Commands Mode!!\n'")
if (debug_mode == False) and (change_mode == True): # skip every other APRS command since Direwolf prints them twice mode = 'n'
if (mode == 'f'): change_mode = True
blink(2)
sleep(1) elif ((line.find("MODE=o")) > 0):
system("echo '\nBeacon Mode toggle!!\n'")
elif (mode == 'b'): mode = 'o'
blink(3) change_mode = True
sleep(1) # counter = (counter + 1) % 2
elif (mode == 's'): elif ((line.find(":t10#")) > 0):
blink(4) system("echo '\nBeacon Mode toggle!!\n'")
sleep(1) mode = 'o'
change_mode = True
elif (mode == 'm'):
blink(5) if (debug_mode == False) and (change_mode == True) and (counter == 1): # skip every other APRS command since Direwolf prints them twice
sleep(1)
if (mode == 'f'):
elif (mode == 'e'): blink(2)
blink(6) sleep(1)
sleep(1)
elif (mode == 'b'):
elif (mode == 'j'): blink(3)
blink(7) sleep(1)
sleep(1)
elif (mode == 's'):
elif (mode == 'a'): blink(4)
mode = 'a' sleep(1)
blink(1)
sleep(1) elif (mode == 'm'):
blink(5)
try: sleep(1)
file = open("/home/pi/CubeSatSim/command_count.txt", "r")
string = file.read() elif (mode == 'e'):
file.close() blink(6)
command_count = int(string) sleep(1)
command_count += 1
filec = open("/home/pi/CubeSatSim/command_count.txt", "w") elif (mode == 'j'):
command_count_string = str(command_count) blink(7)
print(command_count_string) sleep(1)
string = filec.write(command_count_string)
filec.close() elif (mode == 'p'):
except: blink(8)
print("Can't write command_count file!") sleep(1)
print("Command_count: ")
print(command_count) elif (mode == 'a'):
blink(1)
# GPIO.output(txLed, 0) sleep(1)
# GPIO.output(powerPin, 0)
system("gpio write 27 1") try:
system("gpio write 0 0") file = open("/home/pi/CubeSatSim/command_count.txt", "r")
system("gpio write 2 0") string = file.read()
file.close()
system("sudo systemctl stop transmit") command_count = int(string)
# system("sudo systemctl stop cubesatsim") command_count += 1
filec = open("/home/pi/CubeSatSim/command_count.txt", "w")
print("\n/home/pi/CubeSatSim/config -" + mode) command_count_string = str(command_count)
system("/home/pi/CubeSatSim/config -" + mode) print(command_count_string)
string = filec.write(command_count_string)
filec.close()
change_mode = False except:
print("Can't write command_count file!")
print("Command_count: ")
print(command_count)
system("gpio write " + str(txLed) + " 0")
system("gpio write " + str(powerPin) + " 0")
system("sudo systemctl stop transmit")
# system("sudo systemctl stop cubesatsim")
print("\n/home/pi/CubeSatSim/config -" + mode)
system("/home/pi/CubeSatSim/config -" + mode)
change_mode = False
except:
print("Error reading line (probably due to UTF-8 issue)")
print("Waiting 5 seconds to allow unplug and plug of soundcard") print("Waiting 5 seconds to allow unplug and plug of soundcard")
sleep(5) sleep(5)

@ -0,0 +1,10 @@
[Desktop Entry]
Type=Application
Exec=/home/pi/CubeSatSim/groundstation/sdrpp.sh
Name=SDRpp
Comment=SDRpp
Icon=/home/pi/Icons/sdrpp.png
Path=/home/pi
Terminal=true
Categories=HamRadio
Keywords=Ham Radio;SDR

@ -2,7 +2,7 @@
Name=APRS Decode using Direwolf Name=APRS Decode using Direwolf
GenericName=Decodes APRS using rtl_fm and Direwolf GenericName=Decodes APRS using rtl_fm and Direwolf
Comment=APRS signals Comment=APRS signals
Exec=/home/pi/CubeSatSim/groundstation/aprs.sh Exec=/usr/bin/x-terminal-emulator --geometry=120x40 -e "/home/pi/CubeSatSim/groundstation/packet.sh"
Icon=/home/pi/Icons/aprs.png Icon=/home/pi/Icons/aprs.png
Terminal=true Terminal=true
Type=Application Type=Application

@ -3,12 +3,14 @@
sudo modprobe snd-aloop sudo modprobe snd-aloop
sudo systemctl stop openwebrx sudo systemctl stop openwebrx &>/dev/null
sudo systemctl stop rtl_tcp sudo systemctl stop rtl_tcp &>/dev/null
pkill -o chromium &>/dev/null pkill -o chromium &>/dev/null
sudo killall -9 sdrpp &>/dev/null
sudo killall -9 rtl_fm &>/dev/null sudo killall -9 rtl_fm &>/dev/null
sudo killall -9 direwolf &>/dev/null sudo killall -9 direwolf &>/dev/null
@ -78,7 +80,7 @@ echo -e "Auto decoding APRS packets on $frequency Hz"
#sudo rtl_fm -f 144.39M -s 22050 -g 48 - | multimon-ng -a AFSK1200 -A -t raw - #sudo rtl_fm -f 144.39M -s 22050 -g 48 - | multimon-ng -a AFSK1200 -A -t raw -
direwolf -r 48000 -t 0 & direwolf -c /home/pi/CubeSatSim/groundstation/direwolf.conf -r 48000 -t 0 &
sleep 5 sleep 5
@ -87,6 +89,7 @@ echo "$value" > /dev/null
set -- $value set -- $value
#rtl_fm -M fm -f 144.39M -s 48k | aplay -D hw:${2:0:1},0,0 -r 48000 -t raw -f S16_LE -c 1 #rtl_fm -M fm -f 144.39M -s 48k | aplay -D hw:${2:0:1},0,0 -r 48000 -t raw -f S16_LE -c 1
rtl_fm -M fm -f $frequency -s 48k | tee >(aplay -D hw:${2:0:1},0,0 -r 48000 -t raw -f S16_LE -c 1) | aplay -D hw:0,0 -r 48000 -t raw -f S16_LE -c 1 #rtl_fm -M fm -f $frequency -s 48k | tee >(aplay -D hw:${2:0:1},0,0 -r 48000 -t raw -f S16_LE -c 1) | aplay -D hw:0,0 -r 48000 -t raw -f S16_LE -c 1
rtl_fm -M fm -f $frequency -s 48k | aplay -D hw:${2:0:1},0,0 -r 48000 -t raw -f S16_LE -c 1
sleep 5 sleep 5

@ -2,4 +2,4 @@
[Desktop Entry] [Desktop Entry]
Type=Application Type=Application
Name=Chromium with WebSDR Name=Chromium with WebSDR
Exec=chromium-browser --check-for-update-interval=1 --simulate-critical-update --noerrdialogs --disable-infobars http://127.0.0.1:8073 Exec=chromium-browser --check-for-update-interval=1 --simulate-critical-update --noerrdialogs --disable-infobars --app=http://localhost:8073

@ -1,137 +1,57 @@
[ [
{ {
"name": "ISS APRS", "name": "NOAA WX Radio 1",
"frequency": 145825000, "frequency": 162400000,
"modulation": "nfm" "modulation": "nfm"
}, },
{ {
"name": "ISS SSTV/Voice", "name": "NOAA WX Radio 2",
"frequency": 145800000, "frequency": 162425000,
"modulation": "nfm" "modulation": "nfm"
}, },
{ {
"name": "ARISS Repeater Downlink", "name": "NOAA WX Radio 3",
"frequency": 437800000, "frequency": 162450000,
"modulation": "nfm" "modulation": "nfm"
}, },
{ {
"name": "AO-27", "name": "NOAA WX Radio 4",
"frequency": 436795000, "frequency": 162475000,
"modulation": "nfm" "modulation": "nfm"
}, },
{ {
"name": "AO-73", "name": "NOAA WX Radio 5",
"frequency": 145815000, "frequency": 162500000,
"modulation": "usb" "modulation": "nfm"
}, },
{ {
"name": "Fox-1B AO-91", "name": "NOAA WX Radio 6",
"frequency": 145960000, "frequency": 162525000,
"modulation": "nfm" "modulation": "nfm"
}, },
{ {
"name": "Fox-1D AO-92", "name": "NOAA WX Radio 7",
"frequency": 145880000, "frequency": 162550000,
"modulation": "nfm" "modulation": "nfm"
}, },
{ {
"name": "HuskySat-1 HO-107", "name": "CubeSatSim",
"frequency": 435800000, "frequency": 434900000,
"modulation": "usb" "modulation": "packet"
}, },
{ {
"name": "Fox-1E", "name": "ISS SSTV/Voice",
"frequency": 435750000, "frequency": 145800000,
"modulation": "usb" "modulation": "nfm"
}, },
{ {
"name": "MAX VALIER", "name": "ISS APRS",
"frequency": 145860000, "frequency": 145825000,
"modulation": "usb" "modulation": "packet"
}, },
{ {
"name": "NOAA WX Radio 1", "name": "ISS Voice Repeater",
"frequency": 162400000, "frequency": 437800000,
"modulation": "nfm" "modulation": "nfm"
}, }
{
"name": "NOAA WX Radio 2",
"frequency": 162425000,
"modulation": "nfm"
},
{
"name": "NOAA WX Radio 3",
"frequency": 162450000,
"modulation": "nfm"
},
{
"name": "NOAA WX Radio 4",
"frequency": 162475000,
"modulation": "nfm"
},
{
"name": "NOAA WX Radio 5",
"frequency": 162500000,
"modulation": "nfm"
},
{
"name": "NOAA WX Radio 6",
"frequency": 162525000,
"modulation": "nfm"
},
{
"name": "NOAA WX Radio 7",
"frequency": 162550000,
"modulation": "nfm"
},
{
"name": "CAS-4A",
"frequency": 145855000,
"modulation": "usb"
},
{
"name": "CAS-4B",
"frequency": 145910000,
"modulation": "usb"
},
{
"name": "XW-2A",
"frequency": 145660000,
"modulation": "usb"
},
{
"name": "XW-2B",
"frequency": 145725000,
"modulation": "usb"
},
{
"name": "XW-2C",
"frequency": 145790000,
"modulation": "usb"
},
{
"name": "XW-2F",
"frequency": 145975000,
"modulation": "usb"
},
{
"name": "NOAA-19",
"frequency": 137100000,
"modulation": "nfm"
},
{
"name": "NOAA-18",
"frequency": 137912500,
"modulation": "nfm"
},
{
"name": "NOAA-15",
"frequency": 137620000,
"modulation": "nfm"
},
{
"name": "CubeSatSim",
"frequency": 434900000,
"modulation": "packet"
}
] ]

@ -3,7 +3,7 @@ Type=Application
Exec=/home/pi/CubeSatSim/groundstation/cubicsdr.sh Exec=/home/pi/CubeSatSim/groundstation/cubicsdr.sh
Name=SDR FM Broadcast Name=SDR FM Broadcast
Comment=CubicSDR FM Broadcast Comment=CubicSDR FM Broadcast
Icon=/home/pi/Downloads/cubicsdr.png Icon=/home/pi/Icons/cubicsdr.png
Path=/home/pi Path=/home/pi
Terminal=true Terminal=true
Categories=HamRadio Categories=HamRadio

@ -9,19 +9,21 @@ echo "Note: Select Generic RTL2832 device then click Start to begin"
echo echo
sudo systemctl stop openwebrx sudo systemctl stop openwebrx &>/dev/null
sudo killall -9 java &>/dev/null sudo killall -9 java &>/dev/null
sudo systemctl stop rtl_tcp sudo systemctl stop rtl_tcp &>/dev/null
pkill -o chromium &>/dev/null pkill -o chromium &>/dev/null
sudo killall -9 sdrpp &>/dev/null
sudo killall -9 rtl_fm &>/dev/null sudo killall -9 rtl_fm &>/dev/null
sudo killall -9 direwolf &>/dev/null sudo killall -9 direwolf &>/dev/null
sudo killall -9 aplay &>/dev/null #sudo killall -9 aplay &>/dev/null
sudo killall -9 qsstv &>/dev/null sudo killall -9 qsstv &>/dev/null
@ -39,11 +41,28 @@ sudo killall -9 sdrpp &>/dev/null
sudo killall -9 zenity &>/dev/null sudo killall -9 zenity &>/dev/null
sudo /etc/init.d/alsa-utils stop
sudo /etc/init.d/alsa-utils start
sudo killall -9 rtl_fm &>/dev/null sudo killall -9 rtl_fm &>/dev/null
zenity --info --width=650 --height=140 --title="Instructions" --text="When CubicSDR opens, select <i>Generic RTL2832U</i> device then click <b>Start</b> to begin.\n\nThen click on a signal in the watefall to listen." & zenity --info --width=650 --height=140 --title="Instructions" --text="When CubicSDR opens, select <i>Generic RTL2832U</i> device then click <b>Start</b> to begin.\n\nThen click on a signal in the watefall to listen." &
sleep 5
setsid CubicSDR
sleep 10
#$SHELL
#sudo kill `ps -aux | grep sstv_decode_prompt| grep -v grep | awk '{ print $2 }'` &>/dev/null && killall inotifywait &>/dev/null
sudo killall -9 zenity &>/dev/null
sudo /etc/init.d/alsa-utils stop
sudo /etc/init.d/alsa-utils start
zenity --info --width=650 --height=140 --title="Instructions" --text="When CubicSDR opens, select <i>Generic RTL2832U</i> device then click <b>Start</b> to begin.\n\nThen click on a signal in the watefall to listen." &
sleep 5 sleep 5

@ -1 +1 @@
ADEVICE plughw:CARD=Loopback,DEV=1 plughw:CARD=b1,DEV=0 ADEVICE plughw:CARD=Loopback,DEV=1 default

@ -0,0 +1,9 @@
CHANNEL 0
MODEM 1200
KISSPORT 8100
AGWPORT 8002
DWAIT 20
SLOTTIME 300
PERSIST 63
TXDELAY 1000
FULLDUP OFF

@ -2,7 +2,7 @@
Type=Application Type=Application
Exec=/home/pi/CubeSatSim/groundstation/fox-download.sh Exec=/home/pi/CubeSatSim/groundstation/fox-download.sh
Name=FoxTelem Download Name=FoxTelem Download
Comment=FIAB-v3 Comment=FIAB-v4
Icon=/home/pi/Icons/FoxTelemDownload.png Icon=/home/pi/Icons/FoxTelemDownload.png
Path=/home/pi Path=/home/pi
Terminal=true Terminal=true

@ -2,8 +2,8 @@
Type=Application Type=Application
Exec=/home/pi/CubeSatSim/groundstation/fox-profile.sh Exec=/home/pi/CubeSatSim/groundstation/fox-profile.sh
Name=Change FoxTelem Profile Name=Change FoxTelem Profile
Comment=FIAB-v3 Comment=FIAB-v4
Icon=/home/pi/Downloads/foxtelem.png Icon=/home/pi/Icons/foxtelem.png
Path=/home/pi Path=/home/pi
Terminal=true Terminal=true
Categories=HamRadio Categories=HamRadio

@ -5,6 +5,8 @@ echo "Startup script to run FoxTelem for FIAB v4"
echo echo
source /home/pi/venv/bin/activate
sudo killall -9 FoxTelem &>/dev/null sudo killall -9 FoxTelem &>/dev/null
sudo killall -9 zenity &>/dev/null sudo killall -9 zenity &>/dev/null
@ -12,7 +14,7 @@ sudo killall -9 zenity &>/dev/null
FILE=/home/pi/FoxTelemetryData/.foxprofile FILE=/home/pi/FoxTelemetryData/.foxprofile
if [ ! -f "$FILE" ]; then if [ ! -f "$FILE" ]; then
profile=$(zenity --text="Choose your default FoxTelem profile:" --list 2>/dev/null --width=410 --height=120 --title="Set FoxTelem Profile" --column="Profile" --column="Receive and decode telemetry from" Fox-in-a-Box "AMSAT Fox satellites" "CubeSatSim" "AMSAT CubeSat Simulator") profile=$(zenity --text="Choose your default FoxTelem profile:" --list 2>/dev/null --width=410 --height=120 --title="Set FoxTelem Profile" --column="Profile" --column="Receive and decode telemetry from" Fox-in-a-Box "AMSAT Satellites" "CubeSatSim" "AMSAT CubeSat Simulator")
echo $profile echo $profile

@ -5,12 +5,14 @@ echo "Script to run FoxTelem for ARISS Radio Pi"
echo echo
sudo systemctl stop openwebrx sudo systemctl stop openwebrx &>/dev/null
sudo systemctl stop rtl_tcp sudo systemctl stop rtl_tcp &>/dev/null
pkill -o chromium &>/dev/null pkill -o chromium &>/dev/null
sudo killall -9 sdrpp &>/dev/null
sudo killall -9 rtl_tcp &>/dev/null sudo killall -9 rtl_tcp &>/dev/null
sudo killall -9 rtl_fm &>/dev/null sudo killall -9 rtl_fm &>/dev/null
@ -23,12 +25,15 @@ sudo killall -9 sdrpp &>/dev/null
sudo killall -9 direwolf &>/dev/null sudo killall -9 direwolf &>/dev/null
sudo killall -9 aplay &>/dev/null #sudo killall -9 aplay &>/dev/null
sudo killall -9 qsstv &>/dev/null sudo killall -9 qsstv &>/dev/null
sudo killall -9 zenity &>/dev/null sudo killall -9 zenity &>/dev/null
sudo /etc/init.d/alsa-utils stop
sudo /etc/init.d/alsa-utils start
sudo killall -9 rtl_fm &>/dev/null sudo killall -9 rtl_fm &>/dev/null
sleep 5 sleep 5

@ -2,8 +2,8 @@
Type=Application Type=Application
Exec=/home/pi/CubeSatSim/groundstation/fox-run.sh Exec=/home/pi/CubeSatSim/groundstation/fox-run.sh
Name=FoxTelem Name=FoxTelem
Comment=FIAB-v3 Comment=FIAB-v4
Icon=/home/pi/Downloads/foxtelem.png Icon=/home/pi/Icons/foxtelem.png
Path=/home/pi Path=/home/pi
Terminal=true Terminal=true
Categories=HamRadio Categories=HamRadio

@ -3,7 +3,7 @@ Type=Application
Exec=/usr/bin/gpredict Exec=/usr/bin/gpredict
Name=Gpredict Name=Gpredict
Comment=ISS and Satellite Tracking for ARISS Radio Pi Comment=ISS and Satellite Tracking for ARISS Radio Pi
Icon=/home/pi/Downloads/gpredict.png Icon=/home/pi/Icons/gpredict.png
Path=/home/pi Path=/home/pi
Terminal=false Terminal=false
Categories=HamRadio Categories=HamRadio

@ -119,6 +119,16 @@ if (latitude != 0) and (longitude != 0):
print("\nKLAtracker configuration updated with your latitude and longitude") print("\nKLAtracker configuration updated with your latitude and longitude")
latSedStr = 'sed -i "s/latitude=.*/latitude=' + str(latitude) + '/g" /home/pi/PacSatGround/PacSatGround.properties'
#print (latSedStr)
system(latSedStr)
longSedStr = 'sed -i "s/longitude=.*/longitude=' + str(longitude) + '/g" /home/pi/PacSatGround/PacSatGround.properties'
#print (longSedStr)
system(longSedStr)
print("\nPacsat configuration updated with your latitude and longitude")
receiver_gpsSedStr = 'sudo sed -i "s/ ' + dquote + 'lat' + dquote + ': .*/ ' + dquote + 'lat' + dquote + ': ' + str(latitude) + ',/g" /var/lib/openwebrx/settings.json' receiver_gpsSedStr = 'sudo sed -i "s/ ' + dquote + 'lat' + dquote + ': .*/ ' + dquote + 'lat' + dquote + ': ' + str(latitude) + ',/g" /var/lib/openwebrx/settings.json'
#print (receiver_gpsSedStr) #print (receiver_gpsSedStr)
system(receiver_gpsSedStr) system(receiver_gpsSedStr)

@ -12,4 +12,3 @@ python3 /home/pi/CubeSatSim/groundstation/loc-foxtelem.py
#/usr/bin/gpredict #/usr/bin/gpredict
nohup /usr/bin/gpredict </dev/null >/dev/null 2>&1 & nohup /usr/bin/gpredict </dev/null >/dev/null 2>&1 &

@ -14,6 +14,8 @@ pkill -o chromium &>/dev/null
sudo killall -9 rtl_fm &>/dev/null sudo killall -9 rtl_fm &>/dev/null
sudo killall -9 sdrpp &>/dev/null
sudo killall -9 direwolf &>/dev/null sudo killall -9 direwolf &>/dev/null
sudo killall -9 aplay &>/dev/null sudo killall -9 aplay &>/dev/null
@ -166,5 +168,4 @@ rtl_fm -M fm -f $frequency -s 48k | tee >(aplay -D hw:${2:0:1},0,0 -r 48000 -t r
rtl_fm -M fm -f $frequency -s 48k | aplay -D hw:${2:0:1},0,0 -r 48000 -t raw -f S16_LE -c 1 rtl_fm -M fm -f $frequency -s 48k | aplay -D hw:${2:0:1},0,0 -r 48000 -t raw -f S16_LE -c 1
sleep 5 sleep 5

@ -0,0 +1,206 @@
#!/bin/bash
# script to run FoxTelem
echo "Script to configure the PacSat Ground Station for FIAB v4"
echo
#source /home/pi/venv/bin/activate
sudo killall -9 java &>/dev/null
sudo killall -9 zenity &>/dev/null
sudo killall -9 direwolf &>/dev/null
#FILE=/home/pi/.pacsatprofile
#if [ ! -f "$FILE" ]; then
# profile=$(zenity --text="Choice:" --list 2>/dev/null --width=410 --height=120 --title="PacSat Ground Station Choice" --column="Choice" --column="Result" "PacSat" "Receive from CubeSatSim PacSatSim" "Configure" "Configure PacSat Ground Station" "Loopback" "Run a Locally Simulated PacSat")
# echo $profile
echo "Here are the PacSat configuration choices:"
echo
echo " 1. PacSat Ground Station Configuration"
echo
echo " 2. PacSat Ground Station Simulation Configuration"
echo
echo " 3. Set Frequencies"
echo
echo " 4. Reset PacSat Satellite"
echo
echo "Which do you choose? Enter 1 - 4"
echo
read -r ANS
if [ -z "$ANS" ]; then
echo "No choice made. Exiting."
sleep 3
exit
fi
if [ "$ANS" = "1" ] || [ "$ANS" = "2" ] ; then
if [ "$ANS" = "1" ] ; then
echo "Here are your PacSat Ground Station Configuration choices:"
else
echo "Here are your PacSat Ground Station Simulation Configuration choices:"
fi
echo
echo " 1. PacSat Ground Station Callsign"
echo
echo " 2. Set Remote PacSat Satellite Callsign in Ground Station configuration"
echo
echo " 3. Reset PacSat Ground Station Configuration"
echo
read -r CH
if [ -z "$CH" ]; then
echo "No choice made. Exiting."
sleep 3
exit
fi
if [ "$CH" = "1" ] ; then
echo
if [ "$ANS" = "1" ] ; then
oldcallsign=$(grep -oP '(?<=callsign=).*$' /home/pi/PacSatGround/PacSatGround.properties)
else
oldcallsign=$(grep -oP '(?<=callsign=).*$' /home/pi/PacSatGroundLoop/PacSatGround.properties)
fi
echo "Callsign in PacSatGround.properties is "
echo $oldcallsign
echo "Enter new callsign in all capitals: "
echo
read callsign
if [ -z $callsign ] ; then
callsign="$1"
echo "Keeping value of" $oldcallsign
else
echo "Configured callsign is "
echo $callsign
if [ ! "$callsign" = "$oldcallsign" ] ; then
if [ "$ANS" = "1" ] ; then
sudo sed -i "s/callsign=$oldcallsign/callsign=$callsign/g" /home/pi/PacSatGround/PacSatGround.properties
cat /home/pi/PacSatGround/PacSatGround.properties
else
sudo sed -i "s/callsign=$oldcallsign/callsign=$callsign/g" /home/pi/PacSatGroundLoop/PacSatGround.properties
cat /home/pi/PacSatGroundLoop/PacSatGround.properties
fi
fi
fi
elif [ "$CH" = "2" ] ; then
echo "You have chosen to set the remote CubeSatSim PacSat Satellite callsign in ground station configuration"
echo
PROPERTIES=/home/pi/PacSatGround/spacecraft/PacSatSim.properties
PROPERTIES_L=/home/pi/PacSatGroundLoop/spacecraft/PacSatSim.properties
if [ "$ANS" = "1" ] ; then
oldcallsign=$(grep -oP '(?<=bbsCallsign=).*(?=-)' $PROPERTIES )
else
oldcallsign=$(grep -oP '(?<=bbsCallsign=).*(?=-)' $PROPERTIES_L )
fi
echo "Current value of remote PacSat callsign is"
echo $oldcallsign
echo
echo "Enter new callsign in all capitals: "
echo
read callsign
if [ -z $callsign ] ; then
callsign="$1"
echo "Keeping value of" $oldcallsign
else
if [ "$ANS" = "1" ] ; then
sudo sed -i "s/$oldcallsign/$callsign/g" $PROPERTIES
else
sudo sed -i "s/$oldcallsign/$callsign/g" $PROPERTIES_L
fi
echo
echo "Changing callsign to "
echo $callsign
echo
echo "You will see the change next time you run the PacSat Ground Station"
echo "You can close this window"
fi
elif [ "$CH" = "3" ] ; then
echo "You have chosen to reset the PacSat Ground Station Configuration"
echo
# echo "Next time you run the Ground Station you will need to Add the PacSatSim spacecraft"
# echo
if [ "$ANS" = "1" ] ; then
sudo rm -r /home/pi/PacSatGround
# cd
# sudo rm PacSatGround.zip
# wget https://github.com/alanbjohnston/CubeSatSim/raw/refs/heads/master-b-p-s/spacecraft/PacSatGround_0.46o/PacSatGround.zip
# unzip PacSatGround.zip -d PacSatGround
# sudo rm PacSatGround.zip
else
sudo rm -r /home/pi/PacSatGroundLoop
# cd
# sudo rm PacSatGround.zip
# wget https://github.com/alanbjohnston/CubeSatSim/raw/refs/heads/master-b-p-s/spacecraft/PacSatGround_0.46o/PacSatGround.zip
# unzip PacSatGround.zip -d PacSatGroundLoop
# sudo rm PacSatGround.zip
fi
echo "You can close this window now"
else
echo "Please choose an option 1-3"
echo
fi
elif [ "$ANS" = "3" ] ; then
echo "You have chosen to set the Frequency of the PacSat Ground Station"
echo
/home/pi/CubeSatSim/config -F n
elif [ "$ANS" = "4" ] ; then
echo "You have chosen to reset the PacSat Satellite"
echo
/home/pi/CubeSatSim/config -k n
else
echo "Please enter only 1 to 4"
fi
# sleep 10
#$SHELL

@ -0,0 +1,85 @@
#!/bin/bash
# script to run FoxTelem
echo "Startup script to run the PacSat Ground Station for FIAB v4"
echo
# source /home/pi/venv/bin/activate
sudo killall -9 java &>/dev/null
sudo killall -9 zenity &>/dev/null
sudo killall -9 direwolf &>/dev/null
#FILE=/home/pi/.pacsatprofile
#if [ ! -f "$FILE" ]; then
profile=$(zenity --text="Choose what you want to do:" --list 2>/dev/null --width=410 --height=220 --title="PacSat Ground Station" --column="Choice" --column="Result" "PacSat" "Run PacSat Ground Station" "Configure" "Configure the Pacsat Ground Station" "Simulate" "Run a Locally Simulated PacSat")
echo $profile
if [ -z "$profile" ]; then
echo "No choice made. Exiting."
sleep 3
exit
#echo "You need to choose your default FoxTelem profile."
#echo
#echo "The choices are:"
#echo
#echo "1. Fox-in-a-Box. Use this profile if you want to receive and decode telemetry from the AMSAT Fox satellites. If you enter a callsign and a grid square, you can upload to the AMSAT telemetry server."
#echo
#echo "2. CubeSatSim Ground Station. Use this profile if you want to receive and decode telemetry from an AMSAT CubeSatSim or CubeSatSim Lite."
#echo
#echo "Which profile do you choose? Enter 1 or 2"
#read -r ANS
fi
if [ "$ANS" = "1" ] || [ "$profile" = "PacSat" ] ; then
echo "You have chosen to run the PacSat Ground Station"
# echo "p" > /home/pi/.pacsatprofile
echo
/home/pi/CubeSatSim/groundstation/pacsat.sh
elif [ "$ANS" = "2" ] || [ "$profile" = "Configure" ] ; then
echo "You have chosen to configure the PacSat Ground Station"
echo
/home/pi/CubeSatSim/groundstation/pacsat-config.sh
elif [ "$ANS" = "3" ] || [ "$profile" = "Simulate" ] ; then
sudo systemctl stop transmit
echo "You have chosen the PacSat Ground Station with Local Simulated Satellite"
sleep 1
/usr/bin/x-terminal-emulator --geometry=120x40 -e "bash /home/pi/CubeSatSim/pacsatsim.sh l"
sleep 1
/home/pi/CubeSatSim/groundstation/pacsat.sh l
else
echo "Please enter only 1 or 2 or 3"
fi
sudo killall -9 direwolf &>/dev/null
sleep 10
#$SHELL

@ -0,0 +1,10 @@
[Desktop Entry]
Name=Pacsat
GenericName=Pacsat Loopback
Comment=Pacsat
Exec=/usr/bin/x-terminal-emulator --geometry=120x40 -e "/home/pi/CubeSatSim/groundstation/pacsat-run.sh"
Icon=/home/pi/Icons/pacsat.png
Terminal=true
Type=Application
Categories=HamRadio;
Keywords=APRS;

@ -0,0 +1,302 @@
#!/bin/bash
# script to auto decode packets using Direwolf and FM TXC and run Pacsat Ground Station
sudo pkill -f "/home/pi/CubeSatSim/groundstation/direwolf-pacsat-tmp.conf"
loopback=0
vox=0
safe=0
card=0
pwm=0
if [ "$1" = "l" ] ; then
loopback=1
elif [ "$1" = "v" ] ; then
vox=1
elif [ "$1" = "c" ] ; then
card=1
else
pwm=1
fi
if [[ $(arecord -l | grep "USB Audio Device") ]] ; then
echo "USB Sound Card detected"
soundcard=1
else
echo "No USB Sound Card detected"
soundcard=0
fi
gpio -g mode 7 up
if [[ $(gpio -g read 7 | grep 0) ]] ; then
echo "TXC is present"
txc=1
else
echo "TXC not present"
txc=0
fi
timeout 1 rtl_test &> out.txt
if [[ $(grep "No supported" out.txt) ]] ; then
echo "No RTL-SDR detected"
rtl=0
else
echo "RTL-SDR detected."
rtl=1
fi
FILE=/home/pi/CubeSatSim/battery_saver
if [ -f "$FILE" ]; then
safe=1
fi
value=`cat /home/pi/CubeSatSim/.mode`
echo "$value" > /dev/null
set -- $value
MODE=$1
if [ ! "$MODE" = "P" ] && [ ! "$loopback" = "1" ] ; then
echo
echo "Mode is not PacSat Ground Station"
echo
echo "Would you like to change to PacSat Ground Station mode and reboot? (y/n)?"
read -r ANS
if [ "$ANS" = "y" ]; then
/home/pi/CubeSatSim/config -I
exit
else
echo
echo "You can run the PacSat Ground Station after you change mode and reboot."
sleep 10
exit
fi
elif [ "$loopback" = "1" ] ; then
# if [ ! "$MODE" = "p" ] ; then
echo
echo "Switching to PacSat mode for the Simulated PacSat Satellite"
echo
/home/pi/CubeSatSim/config -G n
# fi
if [ ! -d "/home/pi/PacSatGroundLoop" ] ; then
# if [ ! "$loopback" = "1" ] ; then # don't do this for now.
cd
sudo rm PacSatGroundLoop.zip &>/dev/null
wget https://github.com/alanbjohnston/CubeSatSim/raw/refs/heads/master-b-p/spacecraft/PacSatGround_0.46o/PacSatGroundLoop.zip
unzip PacSatGroundLoop.zip -d PacSatGroundLoop
sudo rm PacSatGroundLoop.zip
echo
echo "The first time you run the Ground Station, you will need to select Yes to override files, then put in your callsign"
sleep 10
fi
else
echo
echo "Mode is PacSat Ground Station"
echo
if [ ! -d "/home/pi/PacSatGround" ] ; then
cd
sudo rm PacSatGround.zip &>/dev/null
wget https://github.com/alanbjohnston/CubeSatSim/raw/refs/heads/master-b-p/spacecraft/PacSatGround_0.46o/PacSatGround.zip
unzip PacSatGround.zip -d PacSatGround
sudo rm PacSatGround.zip
echo
echo "The first time you run the Ground Station, you will need to select Yes to override files, then put in your callsign"
sleep 10
fi
fi
value=`cat /home/pi/CubeSatSim/sim.cfg`
echo "$value" > /dev/null
set -- $value
callsign="$1"
txfrequency="$7e3"
rxfrequency="$8e3"
echo -n "Callsign is "
echo $callsign
echo -n "Transmit Frequency is "
echo $txfrequency
echo -n "Receive Frequency is "
echo $rxfrequency
echo
sleep 2
sudo sed -i "s/TNC_TX_DELAY=.*$/TNC_TX_DELAY=750/g" /home/pi/PacSatGround/PacSatGround.properties
sudo sed -i "s/TNC_TX_DELAY=.*$/TNC_TX_DELAY=750/g" /home/pi/PacSatGroundLoop/PacSatGround.properties
sudo modprobe snd-aloop
#sudo systemctl stop cubesatsim >/dev/null 2>&1
#sudo systemctl stop transmit >/dev/null 2>&1
sudo systemctl stop command >/dev/null 2>&1
#/home/pi/CubeSatSim/config -I
sudo systemctl stop command >/dev/null 2>&1
sudo systemctl stop openwebrx >/dev/null 2>&1
sudo systemctl stop rtl_tcp >/dev/null 2>&1
pkill -o chromium &>/dev/null
sudo killall -9 rtl_fm &>/dev/null
#sudo killall -9 direwolf &>/dev/null
sudo killall -9 sdrpp &>/dev/null
#sudo killall -9 aplay &>/dev/null
sudo killall -9 qsstv &>/dev/null
sudo killall -9 rtl_tcp &>/dev/null
sudo killall -9 java &>/dev/null
sudo killall -9 CubicSDR &>/dev/null
sudo killall -9 zenity &>/dev/null
#sudo systemctl restart pacsatsim
#sudo /etc/init.d/alsa-utils stop
#sudo /etc/init.d/alsa-utils start
sudo usermod -a -G gpio pi
if [ "$loopback" = "1" ] ; then
echo "Using Audio Loopback"
ADEVICE="ADEVICE plughw:CARD=Loopback,DEV=1"
PTT="PTT GPIOD gpiochip0 17"
elif [ "$safe" = "1" ] ; then
ADEVICE="ADEVICE shared_mic plughw:CARD=Loopback,DEV=0"
PTT="PTT GPIOD gpiochip0 17"
if [ ! "$txc" = "1" ] ; then
echo "Safe mode - battery saver won't work since no TXC present"
sleep 5
elif [ ! "$soundcard" = "1" ] ; then
echo "Safe mode - battery saver won't work since no sound card present"
sleep 5
else
echo "Safe mode - battery saver"
fi
elif [ "$vox" = "1" ] ; then
ADEVICE="ADEVICE plughw:CARD=Device,DEV=0"
PTT="PTT GPIOD gpiochip0 17"
if [ "$soundcard" = "1" ] ; then
echo "Using Soundcard Audio TX and RX (VOX, no PTT)"
else
echo "Soundcard Audio TX and RX (VOX, no PTT) will not work since no sound card present"
sleep 5
fi
elif [ "$pwm" = "1" ] ; then
ADEVICE="ADEVICE shared_mic plughw:CARD=Headphones,DEV=0"
PTT="PTT GPIOD gpiochip0 -20"
if [ ! "$txc" = "1" ] ; then
echo "FM TXC using Soundcard input (JP13), PWM output won't work since no TXC present"
sleep 5
elif [ ! "$soundcard" = "1" ] ; then
echo "FM TXC using Soundcard input (JP13), PWM output won't work since no sound card present"
sleep 5
else
echo "FM TXC using Soundcard input (JP13), PWM output"
fi
else
echo "FM TXC using Soundcard input (JP13) and output (JP14)"
ADEVICE="ADEVICE shared_mic plughw:CARD=Device,DEV=0"
PTT="PTT GPIOD gpiochip0 -20"
if [ ! "$txc" = "1" ] ; then
echo "FM TXC using Soundcard input (JP13) and output (JP14) won't work since no TXC present"
sleep 5
elif [ ! "$soundcard" = "1" ] ; then
echo "FM TXC using Soundcard input (JP13), output (JP14) won't work since no sound card present"
sleep 5
else
echo "FM TXC using Soundcard input (JP13), output JP14"
fi
fi
DIREWOLF_CONF="/home/pi/CubeSatSim/groundstation/direwolf-pacsat-tmp.conf"
echo "$ADEVICE" > $DIREWOLF_CONF
echo "MYCALL $callsign-1" >> $DIREWOLF_CONF
echo "$PTT" >> $DIREWOLF_CONF
cat /home/pi/CubeSatSim/groundstation/direwolf/direwolf-pacsat.conf >> $DIREWOLF_CONF
echo
echo "$DIREWOLF_CONF"
echo
cat $DIREWOLF_CONF
echo
direwolf -r 48000 -c $DIREWOLF_CONF -t 0 &
cd /home/pi/Desktop/PacsatGround/
if [ "$loopback" = "1" ] ; then
setsid java -Xmx512M -jar PacSatGround.jar "/home/pi/PacSatGroundLoop" # removed &
else
setsid java -Xmx512M -jar PacSatGround.jar "/home/pi/PacSatGround" # removed &
fi
sleep 10
#echo "Stopping Pacsatsim"
#$SHELL

@ -3,7 +3,7 @@ Type=Application
Exec=/home/pi/CubeSatSim/groundstation/rtl-tcp.sh Exec=/home/pi/CubeSatSim/groundstation/rtl-tcp.sh
Name=RTL-TCP Name=RTL-TCP
Comment=RTL-TCP for SDR# Comment=RTL-TCP for SDR#
Icon=/home/pi/Downloads/SDRSharp.png Icon=/home/pi/Icons/SDRSharp.png
Path=/home/pi Path=/home/pi
Terminal=true Terminal=true
Categories=HamRadio Categories=HamRadio

@ -23,13 +23,15 @@ echo "Note: you need to be on the Wifi network: $ssid"
echo echo
sudo systemctl stop openwebrx sudo systemctl stop openwebrx &>/dev/null
sleep 2 sleep 2
pkill -o chromium &>/dev/null pkill -o chromium &>/dev/null
sudo systemctl stop rtl_tcp sudo systemctl stop rtl_tcp &>/dev/null
sudo killall -9 sdrpp &>/dev/null
sudo killall -9 java &>/dev/null sudo killall -9 java &>/dev/null
@ -45,10 +47,13 @@ sudo killall -9 qsstv &>/dev/null
sudo killall -9 direwolf &>/dev/null sudo killall -9 direwolf &>/dev/null
sudo killall -9 aplay &>/dev/null #sudo killall -9 aplay &>/dev/null
sudo killall -9 zenity &>/dev/null sudo killall -9 zenity &>/dev/null
sudo /etc/init.d/alsa-utils stop
sudo /etc/init.d/alsa-utils start
sudo killall -9 rtl_fm &>/dev/null sudo killall -9 rtl_fm &>/dev/null
sudo /bin/sh -c 'rtl_tcp -a $(hostname -I|cut -f1 -d " ")' sudo /bin/sh -c 'rtl_tcp -a $(hostname -I|cut -f1 -d " ")'

@ -3,7 +3,7 @@ Description=RTL-TCP
[Service] [Service]
TimeoutStopSec = 5 TimeoutStopSec = 5
ExecStart=/bin/sh -c '/usr/local/bin/rtl_tcp -a $(hostname -I)' ExecStart=/bin/sh -c 'rtl_tcp -a $(hostname -I|cut -f1 -d " ")'
WorkingDirectory=/home/pi WorkingDirectory=/home/pi
StandardOutput=inherit StandardOutput=inherit
StandardError=inherit StandardError=inherit

@ -0,0 +1,9 @@
[Unit]
Description=RTL TCP Socket
PartOf=rtltcp.service
[Socket]
ListenStream=[::]:1234
[Install]
WantedBy=sockets.target

@ -24,6 +24,8 @@ echo "Note: you need to be on the Wifi network: $ssid"
echo echo
sudo killall -9 sdrpp &>/dev/null
sudo killall -9 java &>/dev/null sudo killall -9 java &>/dev/null
sudo killall -9 rtl_fm &>/dev/null sudo killall -9 rtl_fm &>/dev/null
@ -38,13 +40,18 @@ sudo killall -9 sdrpp &>/dev/null
sudo killall -9 qsstv &>/dev/null sudo killall -9 qsstv &>/dev/null
sudo killall -9 aplay &>/dev/null #sudo killall -9 aplay &>/dev/null
sudo killall -9 direwolf &>/dev/null sudo killall -9 direwolf &>/dev/null
sudo killall -9 zenity &>/dev/null sudo killall -9 zenity &>/dev/null
sudo systemctl stop rtl_tcp sudo systemctl stop rtl_tcp &>/dev/null
sudo /etc/init.d/alsa-utils stop
sudo /etc/init.d/alsa-utils start
sudo killall -9 rtl_fm &>/dev/null
sudo killall -9 rtl_fm &>/dev/null sudo killall -9 rtl_fm &>/dev/null
@ -52,7 +59,7 @@ sudo systemctl restart openwebrx
sleep 10 sleep 10
setsid chromium-browser --check-for-update-interval=1 --simulate-critical-update --noerrdialogs --disable-infobars http://127.0.0.1:8073 &>/dev/null & setsid chromium-browser --check-for-update-interval=1 --simulate-critical-update --noerrdialogs --disable-infobars --app=http://localhost:8073 &>/dev/null &
sleep 10 sleep 10

@ -0,0 +1,47 @@
#!/bin/bash
# script to run sdrpp
echo "Script to run SDRpp for ARISS Radio Pi"
echo
sudo systemctl stop openwebrx
sudo killall -9 java &>/dev/null
sudo killall -9 sdrpp &>/dev/null
sudo systemctl stop rtl_tcp
pkill -o chromium &>/dev/null
sudo killall -9 rtl_fm &>/dev/null
sudo killall -9 direwolf &>/dev/null
#sudo killall -9 aplay &>/dev/null
sudo killall -9 qsstv &>/dev/null
sudo killall -9 rtl_tcp &>/dev/null
sudo killall -9 CubicSDR &>/dev/null
#sudo kill `ps -aux | grep cubicsdr-packet | grep -v grep | awk '{ print $2 }'` &>/dev/null && killall inotifywait &>/dev/null
#sudo kill `ps -aux | grep packet | grep -v grep | awk '{ print $2 }'` &>/dev/null && killall inotifywait &>/dev/null
#sudo kill `ps -aux | grep sstv_decode_prompt| grep -v grep | awk '{ print $2 }'` &>/dev/null && killall inotifywait &>/dev/null
sudo killall -9 zenity &>/dev/null
sudo /etc/init.d/alsa-utils stop
sudo /etc/init.d/alsa-utils start
sleep 5
setsid sdrpp &
sleep 10
#$SHELL

@ -3,7 +3,7 @@ Type=Application
Exec=/home/pi/CubeSatSim/groundstation/loc.sh Exec=/home/pi/CubeSatSim/groundstation/loc.sh
Name=Set My Location Name=Set My Location
Comment=Set Location for Gpredict Comment=Set Location for Gpredict
Icon=/home/pi/Downloads/gpredict.png Icon=/home/pi/Icons/gpredict.png
Path=/home/pi Path=/home/pi
Terminal=true Terminal=true
Categories=HamRadio Categories=HamRadio

@ -0,0 +1,808 @@
{
"version": 8,
"sdrs": {
"rtlsdr": {
"name": "RTL-SDR",
"type": "rtl_sdr",
"profiles": {
"70cm": {
"name": "70cm Ham Band 435 MHz (CubeSatSim)",
"center_freq": 435000000,
"rf_gain": 10.0,
"samp_rate": 2400000,
"start_freq": 434900000,
"start_mod": "nfm",
"tuning_step": 1000,
"direct_sampling": 0
},
"2m": {
"name": "WX Band 161 MHz",
"center_freq": 162400000,
"rf_gain": 29,
"samp_rate": 2048000,
"start_freq": 157000000,
"start_mod": "nfm"
},
"e59a4765-4139-4ab8-89c5-d8ac3343ba70": {
"name": "2m Ham Band 146 MHz (ISS)",
"center_freq": 145000000,
"samp_rate": 2400000,
"start_freq": 145000000,
"start_mod": "nfm",
"rf_gain": 42.0,
"direct_sampling": 0
},
"faf80b0b-1a96-4a9b-96fa-ce40b109c7e0": {
"name": "70cm Ham Band 438 MHz (ISS)",
"rf_gain": 29.0,
"center_freq": 438000000,
"samp_rate": 2400000,
"start_freq": 437800000,
"start_mod": "nfm"
},
"a4fd4a5d-d2d0-4949-87e2-bda83cd83a37": {
"name": "FM Band 95 MHz",
"rf_gain": 29.0,
"center_freq": 95000000,
"samp_rate": 2400000,
"start_freq": 94000000,
"start_mod": "wfm"
},
"ce2bca29-78cb-45d8-ab46-8dea3135981c": {
"name": "10m Ham Band 28 MHz",
"rf_gain": 29.0,
"center_freq": 28000000,
"samp_rate": 2400000,
"start_freq": 28000000,
"start_mod": "usb",
"direct_sampling": 0
},
"d6cdbf2d-74e4-4cac-aaa8-e793103a8e89": {
"name": "6m Ham Band 51 MHz",
"rf_gain": 29.0,
"center_freq": 51000000,
"samp_rate": 2400000,
"start_freq": 51000000,
"start_mod": "nfm",
"direct_sampling": 0
},
"e2aba387-1d3b-4ca8-b280-e119282b8812": {
"name": "90 MHz FM Band",
"rf_gain": 29.0,
"center_freq": 90000000,
"samp_rate": 2400000,
"start_freq": 90000000,
"start_mod": "wfm"
},
"f700b99d-3c51-4524-b151-a0809b868ecc": {
"name": "92 MHz FM Band",
"rf_gain": 29.0,
"center_freq": 92000000,
"samp_rate": 2400000,
"start_freq": 92000000,
"start_mod": "wfm"
},
"dc6af94f-d607-4fee-a522-7f375f66a62c": {
"name": "94 MHz FM Band",
"rf_gain": 29.0,
"center_freq": 94000000,
"samp_rate": 2400000,
"start_freq": 94000000,
"start_mod": "wfm"
},
"6887e85a-a4dc-4245-810f-99801fc5e824": {
"name": "96 MHz FM Band",
"rf_gain": 29.0,
"center_freq": 96000000,
"samp_rate": 2400000,
"start_freq": 96000000,
"start_mod": "wfm"
},
"a2182ed6-70a8-4377-b233-ac6f8ccc91d7": {
"name": "98 MHz FM Band",
"rf_gain": 29.0,
"center_freq": 96000000,
"samp_rate": 2400000,
"start_freq": 96000000,
"start_mod": "wfm"
},
"57e38353-fb86-4935-899b-e365228b8ae5": {
"name": "100 MHz FM Band",
"center_freq": 100000000,
"samp_rate": 2400000,
"start_freq": 100000000,
"start_mod": "wfm"
},
"5e9ec6dd-905d-4781-bd13-9cb702f58e84": {
"name": "102 MHz FM Band",
"rf_gain": 29.0,
"center_freq": 102000000,
"samp_rate": 2400000,
"start_freq": 102000000,
"start_mod": "wfm"
},
"ef2c703c-2e22-4e87-82b5-581420d704bd": {
"name": "104 MHz FM Band",
"rf_gain": 29.0,
"center_freq": 104000000,
"samp_rate": 2400000,
"start_freq": 104000000,
"start_mod": "wfm"
},
"34cc3ddf-8018-4288-acb9-29e6940bc37e": {
"name": "106 MHz FM Band",
"rf_gain": 29.0,
"center_freq": 106000000,
"samp_rate": 2400000,
"start_freq": 106000000,
"start_mod": "wfm"
},
"b4693683-ccf5-474d-a2d9-9a47b0a18ee2": {
"name": "108 MHz FM Band",
"rf_gain": 29.0,
"center_freq": 108000000,
"samp_rate": 2400000,
"start_freq": 108000000,
"start_mod": "wfm"
},
"34224d77-7b61-467c-b78f-18c7f3af1a0c": {
"name": "110 MHz FM Band",
"rf_gain": 29.0,
"center_freq": 110000000,
"samp_rate": 2400000,
"start_freq": 110000000,
"start_mod": "wfm"
},
"8dd82d97-73db-4fa7-ac41-263c3026ea1d": {
"name": "112 MHz",
"rf_gain": 29.0,
"center_freq": 112000000,
"samp_rate": 2400000,
"start_freq": 112000000,
"start_mod": "nfm"
},
"79304b30-f10d-469e-9617-50a19bfdb435": {
"name": "114 MHz",
"rf_gain": 29.0,
"center_freq": 114000000,
"samp_rate": 2400000,
"start_freq": 114000000,
"start_mod": "nfm"
},
"c00bf096-27b8-4262-832c-df1a308d7eb9": {
"name": "116 MHz",
"rf_gain": 29.0,
"center_freq": 116000000,
"samp_rate": 2400000,
"start_freq": 116000000,
"start_mod": "nfm"
},
"669d25a6-6c15-4131-a330-3c33dd2147f0": {
"name": "118 Mhz Air Band",
"rf_gain": 29.0,
"center_freq": 118000000,
"samp_rate": 2400000,
"start_freq": 118000000,
"start_mod": "am"
},
"948248fa-43d9-4e7d-bf86-afaadd391779": {
"name": "120 MHz Air Band",
"rf_gain": 29.0,
"center_freq": 120000000,
"samp_rate": 2400000,
"start_freq": 120000000,
"start_mod": "am"
},
"b634273b-8fc8-4e87-b5c4-e6226d4be0ac": {
"name": "122 MHz Air Band",
"rf_gain": 42.0,
"center_freq": 122000000,
"samp_rate": 2400000,
"start_freq": 121000000,
"start_mod": "nfm"
},
"c55289a2-8286-4a3d-a505-37ba2867571a": {
"name": "124 Mhz Air Band",
"rf_gain": 42.0,
"center_freq": 124000000,
"samp_rate": 2400000,
"start_freq": 124000000,
"start_mod": "am"
},
"4fe488b7-f369-43ba-bb49-91e1a185be7a": {
"name": "126 MHz Air Band",
"rf_gain": 29.0,
"center_freq": 126000000,
"samp_rate": 2400000,
"start_freq": 126000000,
"start_mod": "am"
},
"e79639a2-1384-4e92-8e46-f6e5670ec9fd": {
"name": "128 MHz Air Band",
"rf_gain": 42.0,
"center_freq": 128000000,
"samp_rate": 2400000,
"start_freq": 128000000,
"start_mod": "am"
},
"319f3fb2-b98a-4620-85a7-a99d5a722bd5": {
"name": "130 MHz Air Band",
"rf_gain": 42.0,
"center_freq": 130000000,
"samp_rate": 2400000,
"start_freq": 130000000,
"start_mod": "am"
},
"63c5c2ce-07de-496c-81f6-b188a7adbf39": {
"name": "132 MHz Air Band",
"rf_gain": 42.0,
"center_freq": 132000000,
"samp_rate": 2400000,
"start_freq": 132000000,
"start_mod": "am"
},
"386bdc7b-eb10-4e05-972a-69d730a23cd8": {
"name": "134 MHz Air Band",
"rf_gain": 29.0,
"center_freq": 134000000,
"samp_rate": 2400000,
"start_freq": 134000000,
"start_mod": "am"
},
"ae8ea8b1-23de-45ef-b8c4-3b83a188e65d": {
"name": "136 MHz Air Band",
"rf_gain": 42.0,
"center_freq": 136000000,
"samp_rate": 2400000,
"start_freq": 136000000,
"start_mod": "am"
},
"c0b1a28c-5e07-400a-a5f3-07c62db27587": {
"name": "138 MHz NOAA Weather Satellite Band",
"rf_gain": 42.0,
"center_freq": 138000000,
"samp_rate": 2400000,
"start_freq": 138000000,
"start_mod": "nfm"
},
"20f7ce56-fd85-4b3e-8fac-94cbe9ba0e1d": {
"name": "140 MHz ",
"rf_gain": 42.0,
"center_freq": 140000000,
"samp_rate": 2400000,
"start_freq": 140000000,
"start_mod": "nfm"
},
"882079f8-5697-428a-ae9d-bcc091269c7f": {
"name": "142 MHz ",
"rf_gain": 42.0,
"center_freq": 142000000,
"samp_rate": 2400000,
"start_freq": 142000000,
"start_mod": "nfm"
},
"da1b3f12-2eba-40e9-8c62-33493adf74b3": {
"name": "144 MHz 2m Ham Band",
"rf_gain": 42.0,
"center_freq": 144000000,
"samp_rate": 2400000,
"start_freq": 144000000,
"start_mod": "nfm"
},
"8d9cf1e1-44c5-41c4-bcea-7b1c69446e62": {
"name": "146 MHz 2m Ham Band",
"rf_gain": 42.0,
"center_freq": 146000000,
"samp_rate": 2400000,
"start_freq": 146000000,
"start_mod": "nfm"
},
"eec8aa0d-3485-43d2-baa4-82f7d9e14df6": {
"name": "148 MHz 2m Ham Band",
"rf_gain": 42.0,
"center_freq": 148000000,
"samp_rate": 2400000,
"start_freq": 148000000,
"start_mod": "nfm"
},
"bf66a908-1988-4aec-b998-06e2bc7d0a84": {
"name": "150 MHz",
"rf_gain": 42.0,
"center_freq": 150000000,
"samp_rate": 2400000,
"start_freq": 150000000,
"start_mod": "nfm"
},
"0389f270-b919-4aae-a313-f73697059f70": {
"name": "152 MHz",
"rf_gain": 42.0,
"center_freq": 152000000,
"samp_rate": 2400000,
"start_freq": 152000000,
"start_mod": "nfm"
},
"6ef9d955-76aa-46c0-8463-2c23def5e37b": {
"name": "154 MHz",
"rf_gain": 42.0,
"center_freq": 154000000,
"samp_rate": 2400000,
"start_freq": 154000000,
"start_mod": "nfm"
},
"5d0a64c7-3bce-408e-94d9-c8315bef7540": {
"name": "156 MHz",
"rf_gain": 42.0,
"center_freq": 156000000,
"samp_rate": 2400000,
"start_freq": 156000000,
"start_mod": "nfm"
},
"5b869cae-ffa7-4554-96af-7acd497bbaf3": {
"name": "158 MHz",
"rf_gain": 42.0,
"center_freq": 158000000,
"samp_rate": 2400000,
"start_freq": 158000000,
"start_mod": "nfm"
},
"0de7c5d4-14fc-4655-9a81-2bcebb2f4147": {
"name": "160 MHz",
"rf_gain": 42.0,
"center_freq": 160000000,
"samp_rate": 2400000,
"start_freq": 160000000,
"start_mod": "nfm"
},
"8ca54821-8b80-4938-a35c-9fe25e2320d1": {
"name": "162 MHz",
"rf_gain": 42.0,
"center_freq": 162000000,
"samp_rate": 2400000,
"start_freq": 162000000,
"start_mod": "nfm"
},
"f74d262d-9e98-4030-86b2-45676121ff1e": {
"name": "164 MHz",
"rf_gain": 42.0,
"center_freq": 164000000,
"samp_rate": 2400000,
"start_freq": 164000000,
"start_mod": "nfm"
},
"bfc9c686-6c06-4de2-b1d5-c8f012131042": {
"name": "168 MHz",
"rf_gain": 42.0,
"center_freq": 168000000,
"samp_rate": 2400000,
"start_freq": 167000000,
"start_mod": "nfm"
},
"5468e597-d529-42fe-9fcf-0ff4fa9e2d06": {
"name": "170 MHz",
"rf_gain": 42.0,
"center_freq": 170000000,
"samp_rate": 2400000,
"start_freq": 170000000,
"start_mod": "nfm"
},
"e124cc6e-7177-4d5f-ae5b-2ec6a6fa2956": {
"name": "172 MHz",
"rf_gain": 42.0,
"center_freq": 172000000,
"samp_rate": 2400000,
"start_freq": 172000000,
"start_mod": "nfm"
},
"1ce0f3ed-4763-4f00-916a-4f72d29ba410": {
"name": "174 MHz ",
"rf_gain": 42.0,
"center_freq": 174000000,
"samp_rate": 2400000,
"start_freq": 174000000,
"start_mod": "nfm"
},
"639b1496-a2b9-4a42-ad28-3cda89fbe2fb": {
"name": "420 MHz 70cm Ham Band",
"rf_gain": 42.0,
"center_freq": 420000000,
"samp_rate": 2400000,
"start_freq": 420000000,
"start_mod": "nfm"
},
"bbc9b57e-ea86-43ef-be65-cb2337615ae5": {
"name": "422 MHz 70cm Ham Band",
"rf_gain": 42.0,
"center_freq": 422000000,
"samp_rate": 2400000,
"start_freq": 422000000,
"start_mod": "nfm",
"direct_sampling": 0
},
"3aed286d-7d13-4338-8621-d1c0dfdf3ac6": {
"name": "424 MHz 70cm Ham Band",
"rf_gain": 42.0,
"center_freq": 424000000,
"samp_rate": 2400000,
"start_freq": 424000000,
"start_mod": "nfm",
"direct_sampling": 0
},
"9ae664b4-48f3-410a-8995-edc60127d746": {
"name": "426 MHz 70cm Ham Band",
"rf_gain": 42.0,
"center_freq": 426000000,
"samp_rate": 2400000,
"start_freq": 426000000,
"start_mod": "nfm",
"direct_sampling": 0
},
"24d2467b-6740-42b5-8d3f-8f389fc0860b": {
"name": "428 MHz 70cm Ham Band",
"rf_gain": 42.0,
"center_freq": 428000000,
"samp_rate": 2400000,
"start_freq": 428000000,
"start_mod": "nfm",
"direct_sampling": 0
},
"debbc3ab-081d-41e7-80fe-7d564838154e": {
"name": "430 MHz 70cm Ham Band",
"rf_gain": 42.0,
"center_freq": 430000000,
"samp_rate": 2400000,
"start_freq": 430000000,
"start_mod": "nfm",
"direct_sampling": 0
},
"649233e0-fc85-415d-b88e-94750f49ca4b": {
"name": "432 MHz 70cm Ham Band",
"rf_gain": 42.0,
"center_freq": 432000000,
"samp_rate": 2400000,
"start_freq": 432000000,
"start_mod": "nfm",
"direct_sampling": 0
},
"bed3b482-fd3b-45ee-b924-200aa4223ace": {
"name": "434 MHz 70cm Ham Band",
"rf_gain": 42.0,
"center_freq": 434000000,
"samp_rate": 2400000,
"start_freq": 434000000,
"start_mod": "nfm",
"direct_sampling": 0
},
"58dfac9e-6030-4bb3-ba28-465285baa25e": {
"name": "436 MHz 70cm Ham Band",
"rf_gain": 42.0,
"center_freq": 436000000,
"samp_rate": 2400000,
"start_freq": 436000000,
"start_mod": "nfm",
"direct_sampling": 0
},
"4c293b84-cd43-495f-95a5-1fcabfe4e4c7": {
"name": "438 MHz 70cm Ham Band",
"rf_gain": 42.0,
"center_freq": 438000000,
"samp_rate": 2400000,
"start_freq": 438000000,
"start_mod": "nfm",
"direct_sampling": 0
},
"0e763161-a0e8-411a-abe6-c1af13045f27": {
"name": "440 MHz 70cm Ham Band",
"rf_gain": 42.0,
"center_freq": 440000000,
"samp_rate": 2400000,
"start_freq": 440000000,
"start_mod": "nfm",
"direct_sampling": 0
},
"6dda77d3-e859-41b7-9b0b-22c2dee47472": {
"name": "442 MHz 70cm Ham Band",
"rf_gain": 42.0,
"center_freq": 442000000,
"samp_rate": 2400000,
"start_freq": 442000000,
"start_mod": "nfm",
"direct_sampling": 0
},
"285813ef-aa6d-433f-a316-074f47e02073": {
"name": "444 MHz 70cm Ham Band",
"rf_gain": 42.0,
"center_freq": 444000000,
"samp_rate": 2400000,
"start_freq": 444000000,
"start_mod": "nfm",
"direct_sampling": 0
},
"e0842b63-6857-4554-874b-fad99e4db03a": {
"name": "446 MHz 70cm Ham Band",
"rf_gain": 42.0,
"center_freq": 446000000,
"samp_rate": 2400000,
"start_freq": 446000000,
"start_mod": "nfm",
"direct_sampling": 0
},
"c7b21c80-cfef-42e8-a6fe-c5eea4556c7e": {
"name": "448 MHz 70cm Ham Band",
"rf_gain": 42.0,
"center_freq": 448000000,
"samp_rate": 2400000,
"start_freq": 448000000,
"start_mod": "nfm",
"direct_sampling": 0
},
"d98b4d4a-8247-4a99-9fc7-89780e5e1fef": {
"name": "450 MHz 70cm Ham Band",
"rf_gain": 42.0,
"center_freq": 450000000,
"samp_rate": 2400000,
"start_freq": 450000000,
"start_mod": "nfm",
"direct_sampling": 0
},
"a09a546f-c56f-41b5-ae34-c5511afbcef5": {
"name": "460 MHz",
"rf_gain": 42.0,
"center_freq": 460000000,
"samp_rate": 2400000,
"start_freq": 460000000,
"start_mod": "nfm",
"direct_sampling": 0
},
"232b2ae6-88dd-4e58-b489-37f310e5e204": {
"name": "462 MHz FRS/GMRS",
"rf_gain": 42.0,
"center_freq": 462000000,
"samp_rate": 2400000,
"start_freq": 462000000,
"start_mod": "nfm",
"direct_sampling": 0
},
"41db9b38-87d7-40a0-9f90-1f0c77c054d9": {
"name": "464 MHz FRS/GMRS",
"rf_gain": 42.0,
"center_freq": 464000000,
"samp_rate": 2400000,
"start_freq": 464000000,
"start_mod": "nfm",
"direct_sampling": 0
},
"e9bb7781-eb9b-4314-b399-2d96c52716f0": {
"name": "466 MHz FRS/GMRS",
"rf_gain": 42.0,
"center_freq": 466000000,
"samp_rate": 2400000,
"start_freq": 466000000,
"start_mod": "nfm",
"direct_sampling": 0
},
"5d9e07e8-eb42-4832-82c9-016f05d89027": {
"name": "468 MHz FRS/GMRS",
"rf_gain": 42.0,
"center_freq": 468000000,
"samp_rate": 2400000,
"start_freq": 468000000,
"start_mod": "nfm",
"direct_sampling": 0
},
"20m": {
"name": "20m",
"center_freq": 14150000,
"samp_rate": 384000,
"start_freq": 14070000,
"start_mod": "usb",
"tuning_step": "500",
"rf_gain": 42.0,
"direct_sampling": 1
},
"30m": {
"name": "30m",
"center_freq": 10125000,
"samp_rate": 192000,
"start_freq": 10142000,
"start_mod": "usb",
"tuning_step": "500",
"rf_gain": 42.0,
"direct_sampling": 1
},
"40m": {
"name": "40m",
"center_freq": 7100000,
"samp_rate": 256000,
"start_freq": 7070000,
"start_mod": "lsb",
"tuning_step": "500",
"rf_gain": 42.0,
"direct_sampling": 1
},
"80m": {
"name": "80m",
"center_freq": 3650000,
"samp_rate": 384000,
"start_freq": 3570000,
"start_mod": "lsb",
"tuning_step": "500",
"rf_gain": 42.0,
"direct_sampling": 1
},
"49m": {
"name": "49m Broadcast",
"center_freq": 6050000,
"samp_rate": 384000,
"start_freq": 6070000,
"start_mod": "am",
"tuning_step": "1000",
"rf_gain": 42.0,
"direct_sampling": 1
},
"c1982ce1-7504-455e-908c-dc097fa031a8": {
"name": "1090 MHz ADS-B Band",
"rf_gain": 42.0,
"center_freq": 1090000000,
"samp_rate": 2400000,
"start_freq": 1090000000,
"start_mod": "adsb",
"tuning_step": 1,
"direct_sampling": 0
},
"cb7f2f8e-e317-4a5e-9504-826dd3781791": {
"name": "978 MHz ADS-B Band",
"rf_gain": 42.0,
"center_freq": 978000000,
"samp_rate": 2400000,
"start_freq": 978000000,
"start_mod": "adsb",
"tuning_step": 1
}
}
},
"airspy": {
"name": "Airspy HF+",
"type": "airspyhf",
"rf_gain": "auto",
"profiles": {
"20m": {
"name": "20m",
"center_freq": 14150000,
"samp_rate": 384000,
"start_freq": 14070000,
"start_mod": "usb",
"tuning_step": "500"
},
"30m": {
"name": "30m",
"center_freq": 10125000,
"samp_rate": 192000,
"start_freq": 10142000,
"start_mod": "usb",
"tuning_step": "500"
},
"40m": {
"name": "40m",
"center_freq": 7100000,
"samp_rate": 256000,
"start_freq": 7070000,
"start_mod": "lsb",
"tuning_step": "500"
},
"80m": {
"name": "80m",
"center_freq": 3650000,
"samp_rate": 384000,
"start_freq": 3570000,
"start_mod": "lsb",
"tuning_step": "500"
},
"49m": {
"name": "49m Broadcast",
"center_freq": 6050000,
"samp_rate": 384000,
"start_freq": 6070000,
"start_mod": "am",
"tuning_step": "1000"
}
}
},
"sdrplay": {
"name": "SDRPlay device",
"type": "sdrplay",
"antenna": "Antenna A",
"rf_gain": "auto",
"profiles": {
"20m": {
"name": "20m",
"center_freq": 14150000,
"samp_rate": 500000,
"start_freq": 14070000,
"start_mod": "usb",
"tuning_step": "500"
},
"30m": {
"name": "30m",
"center_freq": 10125000,
"samp_rate": 250000,
"start_freq": 10142000,
"start_mod": "usb",
"tuning_step": "500"
},
"40m": {
"name": "40m",
"center_freq": 7100000,
"samp_rate": 500000,
"start_freq": 7070000,
"start_mod": "lsb",
"tuning_step": "500"
},
"80m": {
"name": "80m",
"center_freq": 3650000,
"samp_rate": 500000,
"start_freq": 3570000,
"start_mod": "lsb",
"tuning_step": "500"
},
"49m": {
"name": "49m Broadcast",
"center_freq": 6000000,
"samp_rate": 500000,
"start_freq": 6070000,
"start_mod": "am",
"tuning_step": "1000"
}
}
}
},
"receiver_name": "ARISS Radio Pi",
"receiver_location": "Budapest, Hungary",
"receiver_asl": 200,
"receiver_admin": "example@example.com",
"receiver_gps": {
"lat": 39.95233,
"lon": -75.16379
},
"photo_title": "Panorama of Budapest from Sch\u00f6nherz Zolt\u00e1n Dormitory",
"photo_desc": "",
"max_clients": 20,
"keep_files": 20,
"session_timeout": 0,
"usage_policy_url": "policy",
"allow_chat": true,
"allow_audio_recording": true,
"allow_center_freq_changes": false,
"magic_key": "memagic",
"receiver_keys": [],
"waterfall_scheme": "GoogleTurboWaterfall",
"fft_fps": 9,
"fft_size": 4096,
"fft_voverlap_factor": 0.3,
"waterfall_levels": {
"min": -88.0,
"max": -20.0
},
"waterfall_auto_levels": {
"min": 3.0,
"max": 10.0
},
"waterfall_auto_level_default_mode": false,
"waterfall_auto_min_range": 50,
"audio_compression": "adpcm",
"fft_compression": "adpcm",
"tuning_precision": 2,
"eibi_bookmarks_range": 0,
"repeater_range": 0,
"map_type": "google",
"google_maps_api_key": "",
"openweathermap_api_key": "",
"map_position_retention_time": 7200,
"map_ignore_indirect_reports": false,
"map_prefer_recent_reports": true,
"callsign_url": "https://www.qrzcq.com/call/{}",
"vessel_url": "https://www.vesselfinder.com/vessels/details/{}",
"flight_url": "https://flightaware.com/live/flight/{}",
"modes_url": "https://flightaware.com/live/modes/{}/redirect"
}

@ -4,10 +4,12 @@ echo "Script to decode SSTV using QSSTV with rtl_fm"
echo echo
sudo systemctl stop openwebrx sudo systemctl stop openwebrx &>/dev/null
sudo modprobe snd-aloop sudo modprobe snd-aloop
sudo killall -9 sdrpp &>/dev/null
sudo killall -9 qsstv &>/dev/null sudo killall -9 qsstv &>/dev/null
sudo killall -9 rtl_fm &>/dev/null sudo killall -9 rtl_fm &>/dev/null
@ -16,7 +18,7 @@ sudo killall -9 aplay &>/dev/null
sudo killall -9 direwolf &>/dev/null sudo killall -9 direwolf &>/dev/null
sudo systemctl stop rtl_tcp sudo systemctl stop rtl_tcp &>/dev/null
pkill -o chromium &>/dev/null pkill -o chromium &>/dev/null
@ -30,6 +32,9 @@ sudo killall -9 sdrpp &>/dev/null
sudo killall -9 zenity &>/dev/null sudo killall -9 zenity &>/dev/null
sudo /etc/init.d/alsa-utils stop
sudo /etc/init.d/alsa-utils start
sudo killall -9 rtl_fm &>/dev/null sudo killall -9 rtl_fm &>/dev/null
#echo "s" >> .mode #echo "s" >> .mode

@ -3,7 +3,7 @@ Type=Application
Exec=/home/pi/CubeSatSim/groundstation/sdr.sh Exec=/home/pi/CubeSatSim/groundstation/sdr.sh
Name=Web SDR Name=Web SDR
Comment=openwebrx for Web SDR Comment=openwebrx for Web SDR
Icon=/home/pi/Downloads/openwebrx.png Icon=/home/pi/Icons/openwebrx.png
Path=/home/pi Path=/home/pi
Terminal=true Terminal=true
Categories=HamRadio Categories=HamRadio

@ -12,6 +12,10 @@ if [ -f "$FILE" ]; then
echo -e "\nUpdate script for CubeSatSim v2.2\n" echo -e "\nUpdate script for CubeSatSim v2.2\n"
sudo rm /home/pi/CubeSatSim/telem.wav &>/dev/null
sudo rm /home/pi/CubeSatSim/t.txt &>/dev/null
sudo rm /home/pi/CubeSatSim/uptime &>/dev/null
if [ -z "$1" ] ; then if [ -z "$1" ] ; then
checkout=0 checkout=0
else else
@ -61,9 +65,10 @@ if [[ $(grep '11.' /etc/debian_version) ]]; then
sudo sed -i 's/console=serial0,115200 //g' /boot/cmdline.txt sudo sed -i 's/console=serial0,115200 //g' /boot/cmdline.txt
sudo sed -i 's/console=tty1 r/console=tty1 maxcpus=1 r/g' /boot/cmdline.txt # single core if Pi Zero 2 # sudo sed -i 's/console=tty1 r/console=tty1 maxcpus=1 r/g' /boot/cmdline.txt # single core if Pi Zero 2
sudo sed -i 's/console=tty1 maxcpus=1 r/console=tty1 r/g' /boot/cmdline.txt
sudo sed -i 's/maxcpus=2/maxcpus=1/g' /boot/cmdline.txt # single core if Pi Zero 2 # sudo sed -i 's/maxcpus=2/maxcpus=1/g' /boot/cmdline.txt # single core if Pi Zero 2
sudo sed -i 's/#dtparam=i2c_arm=on/dtparam=i2c_arm=on/g' /boot/config.txt sudo sed -i 's/#dtparam=i2c_arm=on/dtparam=i2c_arm=on/g' /boot/config.txt
@ -158,12 +163,18 @@ if [[ $(grep 'bookworm' /etc/os-release) ]]; then
sudo sed -i 's/console=serial0,115200 //g' /boot/firmware/cmdline.txt sudo sed -i 's/console=serial0,115200 //g' /boot/firmware/cmdline.txt
sudo sed -i 's/console=tty1 r/console=tty1 maxcpus=1 r/g' /boot/firmware/cmdline.txt # single core if Pi Zero 2 # sudo sed -i 's/console=tty1 r/console=tty1 maxcpus=1 r/g' /boot/firmware/cmdline.txt # single core if Pi Zero 2
sudo sed -i 's/console=tty1 maxcpus=1 r/console=tty1 r/g' /boot/firmware/cmdline.txt
sudo sed -i 's/maxcpus=2/maxcpus=1/g' /boot/firmware/cmdline.txt # single core if Pi Zero 2 # sudo sed -i 's/maxcpus=2/maxcpus=1/g' /boot/firmware/cmdline.txt # single core if Pi Zero 2
sudo sed -i 's/#dtparam=i2c_arm=on/dtparam=i2c_arm=on/g' /boot/firmware/config.txt sudo sed -i 's/#dtparam=i2c_arm=on/dtparam=i2c_arm=on/g' /boot/firmware/config.txt
sudo sed -i 's/#dtoverlay=vc4-fkms-v3d/dtoverlay=vc4-fkms-v3d/g' /boot/firmware/config.txt
sudo sed -i 's/#dtoverlay=vc4-kms-v3d/dtoverlay=vc4-kms-v3d/g' /boot/firmware/config.txt
if [[ $(grep 'dtoverlay=i2c-gpio,bus=3,i2c_gpio_delay_us=1,i2c_gpio_sda=23,i2c_gpio_scl=24' /boot/firmware/config.txt) ]]; then if [[ $(grep 'dtoverlay=i2c-gpio,bus=3,i2c_gpio_delay_us=1,i2c_gpio_sda=23,i2c_gpio_scl=24' /boot/firmware/config.txt) ]]; then
echo "dtoverlay=i2c-gpio already in /boot/firmware/config.txt" echo "dtoverlay=i2c-gpio already in /boot/firmware/config.txt"
else else
@ -332,6 +343,8 @@ sudo apt-get update && sudo apt-get dist-upgrade -y
# sudo apt install -y python3-pip # sudo apt install -y python3-pip
# fi # fi
cp /home/pi/CubeSatSim/groundstation/pacsat.desktop /home/pi/Desktop/pacsat.desktop
if [ ! -d "/home/pi/venv" ]; then if [ ! -d "/home/pi/venv" ]; then
cd cd
@ -353,14 +366,39 @@ sudo apt-get install -y gcc g++ make cmake libasound2-dev libudev-dev libavahi-c
# removed wiringpi and python-picamera python3-picamera # removed wiringpi and python-picamera python3-picamera
sudo apt-get install -y git libasound2-dev i2c-tools build-essential libgd-dev libmagic-dev minicom sudo apt-get install -y git libasound2-dev i2c-tools build-essential libgd-dev libmagic-dev minicom
if [ -d "/home/pi/direwolf" ]; then
cd
cd direwolf
# Get the URL of the 'origin' remote
REPO_URL=$(git config --get remote.origin.url)
# Check if the command was successful and a URL was retrieved
if [ $? -eq 0 ] && [ -n "$REPO_URL" ]; then
if [ ! "$REPO_URL" = "https://github.com/wb2osz/direwolf.git" ]; then
echo "Current Direwolf git repository URL is $REPO_URL"
sudo rm -r /home/pi/direwolf
fi
else
echo "Could not find the URL for the 'origin' remote for Direwolf"
fi
fi
if [ ! -d "/home/pi/direwolf" ]; then if [ ! -d "/home/pi/direwolf" ]; then
echo "Installing Direwolf from https://github.com/wb2osz/direwolf.git"
cd cd
git clone https://github.com/alanbjohnston/direwolf.git git clone https://github.com/wb2osz/direwolf.git
cd direwolf cd direwolf
make -j mkdir build
cd build
cmake ..
make -j4
sudo make install sudo make install
make install-rpi make install-conf
fi fi
sudo apt-get install -y gpsd gpsd-clients libgps-dev python3-gps sudo apt-get install -y gpsd gpsd-clients libgps-dev python3-gps
@ -399,8 +437,16 @@ if [ $checkout -eq 1 ]; then
git checkout $branch git checkout $branch
git pull --no-rebase > .updated git pull --no-rebase > .updated
FLAG=1 FLAG=1
echo "Running update script again" echo "Running update again"
/home/pi/CubeSatSim/install
exit
fi
grep 'install' /home/pi/CubeSatSim/.updated
if [[ $(grep 'install' /home/pi/CubeSatSim/.updated) ]]; then
echo "install script updated, running again"
/home/pi/CubeSatSim/install /home/pi/CubeSatSim/install
exit
fi fi
make debug make debug
@ -436,6 +482,121 @@ if [[ $(grep 'changed' /home/pi/pi-power-button/.updated_p) ]]; then
FLAG=1 FLAG=1
fi fi
if [ ! -d "/home/pi/g0kla_common" ]; then
cd
git clone https://github.com/alanbjohnston/g0kla_common.git
cd g0kla_common/Debug/
make clean
make all
sudo ./install.sh
else
cd /home/pi/g0kla_common/Debug/
git pull --no-rebase > .updated
grep 'changed' /home/pi/g0kla_common/Debug/.updated
if [[ $(grep 'changed' /home/pi/g0kla_common/Debug/.updated) ]]; then
echo "updating g0kla_common"
make clean
make all
FLAG=1
fi
fi
FILE=/home/pi/pi_pacsat/Debug/pi_pacsat # code has already been compiled
if [ ! -f "$FILE" ]; then
cd
#git clone https://github.com/alanbjohnston/pi_pacsat.git
git clone https://github.com/ac2cz/pi_pacsat.git
cd pi_pacsat
#git checkout master-debug
cd Debug
make clean
make all
# mkdir /home/pi/PacSat
# mkdir /home/pi/PacSat/pacsat
# mkdir /home/pi/PacSat/pacsat/dir
# export LD_LIBRARY_PATH=/mnt/usb-disk/ariss/lib:/usr/local/lib/iors_common:$LD_LIBRARY_PATH
# #value=`cat /home/pi/CubeSatSim/sim.cfg`
# #echo "$value" > /dev/null
# #set -- $value
# echo "bit_rate=9600" > pacsat.config
# echo "bbs_callsign=AMSAT-12" >> pacsat.config
# echo "broadcast_callsign=AMSAT-11" >> pacsat.config
# echo "digi_callsign=AMSAT-1" >> pacsat.config
# echo "max_frames_in_tx_buffer=5" >> pacsat.config
# echo "pb_open=1" > pacsat.state
# echo "uplink_open=1" >> pacsat.state
# echo "pb_max_period_for_client_in_seconds=60" >> pacsat.state
# echo "uplink_max_period_for_client_in_seconds=60" >> pacsat.state
else
cd /home/pi/pi_pacsat/Debug/
git pull --no-rebase > .updated
grep 'changed' /home/pi/pi_pacsat/Debug/.updated
if [[ $(grep 'changed' /home/pi/pi_pacsat/Debug/.updated) ]]; then
echo "updating pi_pacsat"
make clean
make all
FLAG=1
fi
fi
FILE=/home/pi/pacsat_telem/Debug/pacsat_telem # code has already been compiled
if [ ! -f "$FILE" ]; then
cd
sudo apt-get install -y libbsd-dev
git clone https://github.com/alanbjohnston/pacsat_telem.git
cd pacsat_telem
git checkout master-fox
cd Debug
make clean
make all
fi
cd /home/pi/pacsat_telem/Debug/
git pull --no-rebase > .updated
# git checkout master-fox
grep 'changed' /home/pi/pacsat_telem/Debug/.updated
if [[ $(grep 'changed' /home/pi/pacsat_telem/Debug/.updated) ]]; then
echo "updating pacsat_telem"
make clean
make all
FLAG=1
fi
sudo sed -i 's/#hdmi_group=1/hdmi_group=2/g' /boot/config.txt
sudo sed -i 's/#hdmi_mode=1/hdmi_mode=16/g' /boot/config.txt
sudo sed -i 's/#hdmi_force_hotplug=1/hdmi_force_hotplug=1/g' /boot/config.txt
sudo raspi-config nonint do_vnc 0
if [ ! -d "/home/pi/Desktop/PacsatGround" ]; then
cd /tmp
wget https://www.g0kla.com/pacsat/downloads/test/PacsatGround_unix_0_46o.tar.gz
tar -xzf PacsatGround_unix_0_46o.tar.gz -C /home/pi/Desktop
rm PacsatGround_unix_0_46o.tar.gz
cp /home/pi/CubeSatSim/spacecraft/PacSatGround_0.46o/* /home/pi/Desktop/PacsatGround/spacecraft/
# mkdir /home/pi/PacSatGround
sudo usermod -a -G gpio pi
sudo apt-get install default-jdk -y
fi
cd cd
if [ ! -d "/home/pi/PiSSTVpp" ]; then if [ ! -d "/home/pi/PiSSTVpp" ]; then
@ -481,7 +642,7 @@ if [ -f "$FILE" ]; then
else else
echo "creating cubesatsim.service." echo "creating cubesatsim.service."
sudo cp /home/pi/CubeSatSim/systemd/cubesatsim.service /etc/systemd/system/cubesatsim.service sudo cp /home/pi/CubeSatSim/systemd/cubesatsim.service /etc/systemd/system/cubesatsim.service
sudo systemctl enable command sudo systemctl enable cubesatsim
FLAG=1 FLAG=1
fi fi
@ -523,6 +684,21 @@ else
FLAG=1 FLAG=1
fi fi
FILE=/etc/systemd/system/pacsatsim.service
if [ -f "$FILE" ]; then
if [[ $(diff /home/pi/CubeSatSim/systemd/pacsatsim.service /etc/systemd/system/pacsatsim.service) ]]; then
echo "changed pacsatsim.service."
sudo cp /home/pi/CubeSatSim/systemd/pacsatsim.service /etc/systemd/system/pacsatsim.service
FLAG=1
else
echo "no change to pacsatsim.service."
fi
else
echo "creating pacsatsim.service."
sudo cp /home/pi/CubeSatSim/systemd/pacsatsim.service /etc/systemd/system/pacsatsim.service
FLAG=1
fi
FILE=/etc/asound.conf FILE=/etc/asound.conf
if [ -f "$FILE" ]; then if [ -f "$FILE" ]; then
if [[ $(diff /home/pi/CubeSatSim/asound.conf /etc/asound.conf) ]]; then if [[ $(diff /home/pi/CubeSatSim/asound.conf /etc/asound.conf) ]]; then
@ -655,9 +831,15 @@ cd
#fi #fi
sed -i 's/quick_exec=0/quick_exec=1/' ~/.config/libfm/libfm.conf
sudo apt install -y raspberrypi-ui-mods
sudo apt autoremove -y
if [ "$noreboot" = "0" ] ; then if [ "$noreboot" = "0" ] ; then
if [ $FLAG -eq 1 ]; then if [ $FLAG -eq 1 ]; then # Not sure if this is needed
echo "systemctl daemon-reload and reboot" echo "systemctl daemon-reload and reboot"
sudo systemctl daemon-reload sudo systemctl daemon-reload
sudo reboot -h now sudo reboot -h now

71
log

@ -2,16 +2,65 @@
echo -e "\nLog file script for CubeSatSim\n" echo -e "\nLog file script for CubeSatSim\n"
if [ "$1" = "-r" ] || [ "$1" = "-t" ] ; then if [ "$1" = "-h" ] ; then
sudo journalctl -a -u transmit > /home/pi/CubeSatSim/logt.txt echo "Displays systemd logs for the chose process. The choices are:"
cat /home/pi/CubeSatSim/logt.txt echo " -d cubesatsim (also no choice gives you this)"
echo -e "\nTransmit Log file also saved as /home/pi/CubeSatSim/logt.txt" echo " -t transmit"
elif [ "$1" = "-c" ]; then echo " -c command and control"
sudo journalctl -a -u command > /home/pi/CubeSatSim/logc.txt echo " -p pacsat"
cat /home/pi/CubeSatSim/logc.txt echo "Default is the log is dumpted to the screen and written to a file."
echo -e "\nCommand and Control Log file also saved as /home/pi/CubeSatSim/logc.txt" echo "If an additional r is included, the log is realtime, and exits with a Control-C"
echo
exit
fi
REALTIME=0
if [ "$2" = "r" ] ; then
REALTIME=1
fi
if [ "$REALTIME" = "1" ] ; then
echo "To exit, type Control-C"
echo
sleep 2
if [ "$1" = "-r" ] || [ "$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"
elif [ "$1" = "-c" ]; then
sudo journalctl -af -u command # > /home/pi/CubeSatSim/logc.txt
cat /home/pi/CubeSatSim/logc.txt
# echo -e "\nCommand and Control Log file also saved as /home/pi/CubeSatSim/logc.txt"
elif [ "$1" = "-p" ]; 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"
else
sudo journalctl -af -u cubesatsim # > /home/pi/CubeSatSim/log.txt
# cat /home/pi/CubeSatSim/log.txt
# echo -e "\nLog file also saved as /home/pi/CubeSatSim/log.txt"
fi
else else
sudo journalctl -a -u cubesatsim > /home/pi/CubeSatSim/log.txt
cat /home/pi/CubeSatSim/log.txt if [ "$1" = "-r" ] || [ "$1" = "-t" ] ; then
echo -e "\nLog file also saved as /home/pi/CubeSatSim/log.txt" 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"
elif [ "$1" = "-c" ]; then
sudo journalctl -a -u command > /home/pi/CubeSatSim/logc.txt
cat /home/pi/CubeSatSim/logc.txt
echo -e "\nCommand and Control Log file also saved as /home/pi/CubeSatSim/logc.txt"
elif [ "$1" = "-p" ]; then
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"
else
sudo journalctl -a -u cubesatsim > /home/pi/CubeSatSim/log.txt
cat /home/pi/CubeSatSim/log.txt
echo -e "\nLog file also saved as /home/pi/CubeSatSim/log.txt"
fi
fi fi

125
main.c

@ -262,12 +262,27 @@ int main(int argc, char * argv[]) {
} else if ( mode_string == 'n') { } else if ( mode_string == 'n') {
mode = TXCOMMAND; mode = TXCOMMAND;
printf("Mode is Transmit Command\n"); printf("Mode is Transmit Command\n");
} else { } else if ( mode_string == 'p') {
mode = PACSAT;
printf("Mode is Pacsat\n");
} else if ( mode_string == 'P') {
mode = PACSATGND;
printf("Mode is Pacsat Ground Station\n");
} else {
printf("Mode is BPSK\n"); printf("Mode is BPSK\n");
} }
} }
} }
/*
if ( mode == PACSAT) {
FILE * pacsat_file = popen("sudo systemctl restart pacsatsim", "r");
pclose(pacsat_file);
}
else {
FILE * pacsat_file = popen("sudo systemctl stop pacsatsim", "r");
pclose(pacsat_file);
}
*/
// Open telemetry file with STEM Payload Data // Open telemetry file with STEM Payload Data
telem_file = fopen("/home/pi/CubeSatSim/telem.txt", "a"); telem_file = fopen("/home/pi/CubeSatSim/telem.txt", "a");
if (telem_file == NULL) if (telem_file == NULL)
@ -315,13 +330,15 @@ int main(int argc, char * argv[]) {
map[MINUS_X] = MINUS_Y; map[MINUS_X] = MINUS_Y;
map[PLUS_Z] = MINUS_X; map[PLUS_Z] = MINUS_X;
map[MINUS_Y] = PLUS_Z; map[MINUS_Y] = PLUS_Z;
/*
if (access("/dev/i2c-11", W_OK | R_OK) >= 0) { // Test if I2C Bus 11 is present if (access("/dev/i2c-11", W_OK | R_OK) >= 0) { // Test if I2C Bus 11 is present
printf("/dev/i2c-11 is present\n\n"); printf("/dev/i2c-11 is present\n\n");
snprintf(busStr, 10, "%d %d", test_i2c_bus(1), test_i2c_bus(11)); snprintf(busStr, 10, "%d %d", test_i2c_bus(1), test_i2c_bus(11));
} else { } else {
snprintf(busStr, 10, "%d %d", i2c_bus1, i2c_bus3); snprintf(busStr, 10, "%d %d", i2c_bus1, i2c_bus3);
} }
*/
snprintf(busStr, 10, "%d %d", i2c_bus1, i2c_bus3);
FILE * os_test = popen("cat /etc/os-release", "r"); FILE * os_test = popen("cat /etc/os-release", "r");
fgets(cmdbuffer, 1000, os_test); fgets(cmdbuffer, 1000, os_test);
@ -503,8 +520,9 @@ int main(int argc, char * argv[]) {
printf("\n FSK Mode, %d bits per frame, %d bits per second, %d ms per frame, %d ms sample period\n", printf("\n FSK Mode, %d bits per frame, %d bits per second, %d ms per frame, %d ms sample period\n",
bufLen / (samples * frameCnt), bitRate, frameTime, samplePeriod); bufLen / (samples * frameCnt), bitRate, frameTime, samplePeriod);
} else if ((mode == BPSK) || (mode == PACSAT) || (mode == PACSATGND)) {
//// } else {
} else if (mode == BPSK) {
bitRate = 1200; bitRate = 1200;
rsFrames = 3; rsFrames = 3;
payloads = 6; payloads = 6;
@ -526,8 +544,11 @@ int main(int argc, char * argv[]) {
frameTime = ((float)((float)bufLen / (samples * frameCnt * bitRate))) * 1000; // frame time in ms frameTime = ((float)((float)bufLen / (samples * frameCnt * bitRate))) * 1000; // frame time in ms
printf("\n BPSK Mode, bufLen: %d, %d bits per frame, %d bits per second, %d ms per frame %d ms sample period\n", if (mode == BPSK)
bufLen, bufLen / (samples * frameCnt), bitRate, frameTime, samplePeriod); printf("\n BPSK Mode, bufLen: %d, %d bits per frame, %d bits per second, %d ms per frame %d ms sample period\n",
bufLen, bufLen / (samples * frameCnt), bitRate, frameTime, samplePeriod);
else
printf("\n dataLen: %d \n", dataLen);
sin_samples = S_RATE/freq_Hz; sin_samples = S_RATE/freq_Hz;
// printf("Sin map: "); // printf("Sin map: ");
@ -580,15 +601,8 @@ int main(int argc, char * argv[]) {
memset(sensor, 0, sizeof(sensor)); memset(sensor, 0, sizeof(sensor));
memset(other, 0, sizeof(other)); memset(other, 0, sizeof(other));
// if (((mode == FSK) || (mode == BPSK))) // && !sim_mode) if ((mode == FSK) || (mode == BPSK) || (mode == PACSAT) || (mode == PACSATGND)) // && !sim_mode)
if (mode == FSK) { // && !sim_mode)
get_tlm_fox();
// get_tlm_fox();
}
if (mode == BPSK) { // && !sim_mode)
get_tlm_fox(); // fill transmit buffer with reset count 0 packets that will be ignored get_tlm_fox(); // fill transmit buffer with reset count 0 packets that will be ignored
// get_tlm_fox();
}
else if (mode == FC) // && !sim_mode) else if (mode == FC) // && !sim_mode)
get_tlm_fc(); // fill transmit buffer with reset count 0 packets that will be ignored get_tlm_fc(); // fill transmit buffer with reset count 0 packets that will be ignored
else if (mode == CW) else if (mode == CW)
@ -606,6 +620,8 @@ int main(int argc, char * argv[]) {
fprintf(stderr, "pythonConfigStr: %s\n", pythonConfigStr); fprintf(stderr, "pythonConfigStr: %s\n", pythonConfigStr);
FILE *file2 = sopen(pythonVenv); // activate venv
file1 = sopen(pythonConfigStr); // python sensor polling function file1 = sopen(pythonConfigStr); // python sensor polling function
fgets(cmdbuffer, 1000, file1); fgets(cmdbuffer, 1000, file1);
@ -1028,6 +1044,7 @@ int main(int argc, char * argv[]) {
} }
if (sim_mode) { // simulated telemetry if (sim_mode) { // simulated telemetry
printf("Simulated telemetry mode\n");
double time = ((long int)millis() - time_start) / 1000.0; double time = ((long int)millis() - time_start) / 1000.0;
@ -1066,9 +1083,9 @@ int main(int argc, char * argv[]) {
// float charging = eclipse * (fabs(amps_max[0] * 0.707) + fabs(amps_max[1] * 0.707) + rnd_float(-4.0, 4.0)); // float charging = eclipse * (fabs(amps_max[0] * 0.707) + fabs(amps_max[1] * 0.707) + rnd_float(-4.0, 4.0));
// current[map[BAT]] = ((current[map[BAT2]] * voltage[map[BAT2]]) / batt) - charging; // current[map[BAT]] = ((current[map[BAT2]] * voltage[map[BAT2]]) / batt) - charging;
current[map[BAT]] = rnd_float(320, 510) - charging; current[map[BAT]] = rnd_float(320, 510) - charging;
printf("charging: %f bat curr: %f bus curr: %f bat volt: %f bus volt: %f \n",charging, current[map[BAT]], current[map[BAT2]], batt, voltage[map[BAT2]]); printf("charging: %f bat curr: %f bus curr: %f bat volt: %f bus volt: %f \n",charging, current[map[BAT]], current[map[BAT2]], batt, voltage[map[BAT2]]);
batt -= (batt > 3.5) ? current[map[BAT]] / 300000 : current[map[BAT]] / 30000; batt -= (batt > 3.5) ? current[map[BAT]] / 300000 : current[map[BAT]] / 30000;
if (batt < 3.6) { if (batt < 3.6) {
@ -1275,11 +1292,11 @@ int main(int argc, char * argv[]) {
sleep(rand_sleep); sleep(rand_sleep);
// fprintf(stderr, "INFO: Sleeping for extra %d sec\n", rand_sleep); // fprintf(stderr, "INFO: Sleeping for extra %d sec\n", rand_sleep);
} else if ((mode == FSK) || (mode == BPSK)) {// FSK or BPSK } else if ((mode == FSK) || (mode == BPSK) || (mode == PACSAT) || (mode == PACSATGND)) {// FSK or BPSK
get_tlm_fox(); get_tlm_fox();
} else if ((mode == FC)) { } else if ((mode == FC)) {
get_tlm_fc(); get_tlm_fc();
} else { // SSTV } else { // SSTV or PACSATGND
// fprintf(stderr, "Sleeping\n"); // fprintf(stderr, "Sleeping\n");
sleep(30); sleep(30);
} }
@ -1560,6 +1577,8 @@ void get_tlm_fox() {
smaller = (int)(S_RATE / (2 * freq_Hz)); smaller = (int)(S_RATE / (2 * freq_Hz));
// if (mode == PACSAT)
// dataLen = 78;
short int b[dataLen]; short int b[dataLen];
short int b_max[dataLen]; short int b_max[dataLen];
short int b_min[dataLen]; short int b_min[dataLen];
@ -1629,7 +1648,10 @@ void get_tlm_fox() {
sampleTime = (unsigned int)millis(); sampleTime = (unsigned int)millis();
} else } else
printf("first or second time - no sleep\n"); {
printf("first time - no sleep\n");
firstTime = OFF;
}
printf("++++ Loop time: %5.3f sec +++++\n", (millis() - loopTime) / 1000.0); printf("++++ Loop time: %5.3f sec +++++\n", (millis() - loopTime) / 1000.0);
fflush(stdout); fflush(stdout);
@ -1640,7 +1662,6 @@ void get_tlm_fox() {
for (int count1 = 0; count1 < 8; count1++) { for (int count1 = 0; count1 < 8; count1++) {
if (voltage[count1] < voltage_min[count1]) voltage_min[count1] = voltage[count1]; if (voltage[count1] < voltage_min[count1]) voltage_min[count1] = voltage[count1];
if (current[count1] < current_min[count1]) current_min[count1] = current[count1]; if (current[count1] < current_min[count1]) current_min[count1] = current[count1];
if (voltage[count1] > voltage_max[count1]) voltage_max[count1] = voltage[count1]; if (voltage[count1] > voltage_max[count1]) voltage_max[count1] = voltage[count1];
if (current[count1] > current_max[count1]) current_max[count1] = current[count1]; if (current[count1] > current_max[count1]) current_max[count1] = current[count1];
@ -1998,8 +2019,8 @@ void get_tlm_fox() {
encodeB(b, 52 + head_offset, rxAntennaDeployed + txAntennaDeployed * 2 + c2cStatus * 4); encodeB(b, 52 + head_offset, rxAntennaDeployed + txAntennaDeployed * 2 + c2cStatus * 4);
encodeA(b, 53 + head_offset, groundCommandCount); encodeA(b, 53 + head_offset, groundCommandCount);
if (mode == BPSK) { if ((mode == BPSK) || (mode == PACSAT) || (mode == PACSATGND)) {
encodeA(b_max, 51 + head_offset, status); encodeA(b_max, 51 + head_offset, status);
encodeA(b_min, 51 + head_offset, status); encodeA(b_min, 51 + head_offset, status);
encodeB(b_max, 52 + head_offset, rxAntennaDeployed + txAntennaDeployed * 2 + c2cStatus * 4); encodeB(b_max, 52 + head_offset, rxAntennaDeployed + txAntennaDeployed * 2 + c2cStatus * 4);
encodeB(b_min, 52 + head_offset, rxAntennaDeployed + txAntennaDeployed * 2 + c2cStatus * 4); encodeB(b_min, 52 + head_offset, rxAntennaDeployed + txAntennaDeployed * 2 + c2cStatus * 4);
@ -2022,6 +2043,36 @@ void get_tlm_fox() {
encodeA(b, 62 + head_offset, 0x01); encodeA(b, 62 + head_offset, 0x01);
encodeB(b, 74 + head_offset, 0xfff); encodeB(b, 74 + head_offset, 0xfff);
} }
if ((mode == PACSAT) || (mode == PACSATGND))
{
FILE *telem_binary = fopen("/home/pi/CubeSatSim/tlm.bin", "wb");
if (telem_binary != NULL) {
int bytes_written = 4;
unsigned int now = (unsigned int)time(0);
fwrite(&now, sizeof(now), 1, telem_binary);
int count;
char byte;
printf("b is: \n");
for (count = 0; count < dataLen; count++) {
byte = b[count];
fwrite(&byte, 1, 1, telem_binary);
printf("%02X ", byte);
bytes_written++;
}
printf("\n");
printf("Writing %d bytes to tlm.bin\n", bytes_written + 4);
fclose(telem_binary);
}
else
printf("Error opening tlm.bin\n");
}
else
{ // extra bracket for some reason?
{
short int data10[headerLen + rsFrames * (rsFrameLen + parityLen)]; short int data10[headerLen + rsFrames * (rsFrameLen + parityLen)];
short int data8[headerLen + rsFrames * (rsFrameLen + parityLen)]; short int data8[headerLen + rsFrames * (rsFrameLen + parityLen)];
@ -2310,22 +2361,25 @@ void get_tlm_fox() {
// max -= 1; // max -= 1;
} }
/// if (sock_ret == -1) { if (socket_open == 1)
/// printf("Error: %s \n", strerror(errno)); firstTime = 0;
/// socket_open = 0; // else if (frames_sent > 0) //5)
// transmitStatus = -1; // firstTime = 0;
/// }
/// } }
} // extra bracket for some reason?
if (!transmit) { if (!transmit) {
fprintf(stderr, "\nNo CubeSatSim Band Pass Filter detected. No transmissions after the CW ID.\n"); fprintf(stderr, "\nNo CubeSatSim Band Pass Filter detected. No transmissions after the CW ID.\n");
fprintf(stderr, " See http://cubesatsim.org/wiki for info about building a CubeSatSim\n\n"); fprintf(stderr, " See http://cubesatsim.org/wiki for info about building a CubeSatSim\n\n");
} }
/// if (socket_open == 1) // if (firstTime && (mode == PACSAT))
/// firstTime = 0; // {
// else if (frames_sent > 0) //5) // firstTime = OFF;
// firstTime = 0; // fprintf(stderr, "No longer first time\n");
// fflush(stdout);
// }
return; return;
} }
@ -2665,8 +2719,7 @@ if (setting == ON) {
pclose(command); pclose(command);
fprintf(stderr,"Turning Safe Mode ON\n"); fprintf(stderr,"Turning Safe Mode ON\n");
fprintf(stderr,"Turning Battery saver mode ON\n"); fprintf(stderr,"Turning Battery saver mode ON\n");
battery_saver_mode = ON; if ((mode == AFSK) || (mode == SSTV) || (mode == CW) || (mode == PACSAT) || (mode == PACSATGND)) {
if ((mode == AFSK) || (mode == SSTV) || (mode == CW)) {
command = popen("echo 'reboot due to turning ON Safe Mode!' | wall", "r"); command = popen("echo 'reboot due to turning ON Safe Mode!' | wall", "r");
pclose(command); pclose(command);
command = popen("sudo reboot now", "r"); command = popen("sudo reboot now", "r");
@ -2683,7 +2736,7 @@ if (setting == ON) {
pclose(command); pclose(command);
fprintf(stderr,"Turning Battery saver mode OFF\n"); fprintf(stderr,"Turning Battery saver mode OFF\n");
battery_saver_mode = OFF; battery_saver_mode = OFF;
if ((mode == AFSK) || (mode == SSTV) || (mode == CW)) { if ((mode == AFSK) || (mode == SSTV) || (mode == CW) || (mode == PACSAT) || (mode == PACSATGND)) {
command = popen("echo 'reboot due to turning OFF Safe Mode!' | wall", "r"); command = popen("echo 'reboot due to turning OFF Safe Mode!' | wall", "r");
pclose(command); pclose(command);
command = popen("sudo reboot now", "r"); command = popen("sudo reboot now", "r");

@ -125,7 +125,9 @@ FILE *image_file;
#define CW 5 #define CW 5
#define FC 6 #define FC 6
#define REPEATER 7 #define REPEATER 7
#define PACSAT 8
#define TXCOMMAND 12 #define TXCOMMAND 12
#define PACSATGND 13
#define FAIL_COUNT 11 #define FAIL_COUNT 11
#define FAIL_NONE -1 #define FAIL_NONE -1
@ -200,6 +202,7 @@ char sensor_string[SENSOR_FIELDS][32];
int test_i2c_bus(int bus); int test_i2c_bus(int bus);
//const char pythonCmd[] = "python3 -u /home/pi/CubeSatSim/python/voltcurrent.py "; //const char pythonCmd[] = "python3 -u /home/pi/CubeSatSim/python/voltcurrent.py ";
const char pythonVenv[] = "source /home/pi/venv/bin/activate";
const char pythonCmd[] = "/home/pi/venv/bin/python3 -u /home/pi/CubeSatSim/ina219.py "; const char pythonCmd[] = "/home/pi/venv/bin/python3 -u /home/pi/CubeSatSim/ina219.py ";
char pythonStr[100], pythonConfigStr[100], busStr[10]; char pythonStr[100], pythonConfigStr[100], busStr[10];
int map[8] = {0, 1, 2, 3, 4, 5, 6, 7}; int map[8] = {0, 1, 2, 3, 4, 5, 6, 7};

@ -0,0 +1,322 @@
#!/bin/bash
# script to run PacsatSim
loopback=0
vox=0
safe=0
card=0
pwm=0
if [ "$1" = "l" ] ; then
loopback=1
elif [ "$1" = "v" ] ; then
vox=1
elif [ "$1" = "c" ] ; then
card=1
else
pwm=1
fi
FILE=/home/pi/CubeSatSim/battery_saver
if [ -f "$FILE" ]; then
safe=1
fi
if [[ $(arecord -l | grep "USB Audio Device") ]] ; then
echo "USB Sound Card detected"
soundcard=1
else
echo "No USB Sound Card detected"
soundcard=0
fi
gpio -g mode 7 up
if [[ $(gpio -g read 7 | grep 0) ]] ; then
echo "TXC is present"
txc=1
else
echo "TXC not present"
txc=0
fi
timeout 1 rtl_test &> out.txt
if [[ $(grep "No supported" out.txt) ]] ; then
echo "No RTL-SDR detected"
rtl=0
else
echo "RTL-SDR detected."
rtl=1
fi
value=`cat /home/pi/CubeSatSim/sim.cfg`
echo "$value" > /dev/null
set -- $value
callsign="$1"
txfrequency="$7e3"
rxfrequency="$8e3"
echo -n "PacSat allsign is "
echo $callsign
echo -n "Transmit Frequency is "
echo $txfrequency
echo -n "Receive Frequency is "
echo $rxfrequency
echo
sleep 2
if [ ! -d "/home/pi/PacSat" ]; then
echo "Setting up PacSatSim default configuration"
echo
cd
sudo rm pacsat-dir.zip
mkdir PacSat
mkdir PacSat/pacsat
mkdir PacSat/pacsat/dir
wget https://github.com/alanbjohnston/pi_pacsat/releases/download/v0.1/pacsat-dir.zip
unzip pacsat-dir.zip -d PacSat/pacsat/dir
sudo rm pacsat-dir.zip
cd
sudo rm /home/pi/pi_pacsat/Debug/pacsat.config
sudo rm /home/pi/pi_pacsat/Debug/pacsat.state
sudo rm /home/pi/pi_pacsat/Debug/pacsat_upload_table.dat
sudo rm pi_pacsat.zip
wget https://github.com/alanbjohnston/pi_pacsat/releases/download/v0.1/pi_pacsat.zip
unzip pi_pacsat.zip -d /home/pi/pi_pacsat/Debug
sudo rm pi_pacsat.zip
# mkdir /home/pi/PacSat
# mkdir /home/pi/PacSat/pacsat
# mkdir /home/pi/PacSat/pacsat/dir
# cd /home/pi/pi_pacsat/Debug
# sudo rm pacsat_last_command_time.dat
# sudo rm pacsat_upload_table.dat
# sudo rm pacsat.state
# echo "bit_rate=9600" > pacsat.config
# echo "bbs_callsign=AMSAT-12" >> pacsat.config
# echo "broadcast_callsign=AMSAT-11" >> pacsat.config
# echo "digi_callsign=AMSAT-1" >> pacsat.config
# echo "max_frames_in_tx_buffer=5" >> pacsat.config
# echo "pb_open=1" > pacsat.state
# echo "uplink_open=1" >> pacsat.state
# echo "pb_max_period_for_client_in_seconds=60" >> pacsat.state
# echo "uplink_max_period_for_client_in_seconds=60" >> pacsat.state
# touch /home/pi/pi_pacsat/Debug/pacsat_upload_table.dat
fi
value=`cat /home/pi/CubeSatSim/sim.cfg`
echo "$value" > /dev/null
set -- $value
callsign="$1"
frequency="$7e3"
echo "Configured callsign is "
echo $callsign
oldcallsign=$(grep -oP '(?<=bbs_callsign=).*(?=-)' /home/pi/pi_pacsat/Debug/pacsat.config)
echo "Callsign in pacsat.config is "
echo $oldcallsign
if [ ! "$callsign" = "$oldcallsign" ] ; then
sudo sed -i "s/bbs_callsign=$oldcallsign/bbs_callsign=$callsign/g" /home/pi/pi_pacsat/Debug/pacsat.config
sudo sed -i "s/broadcast_callsign=$oldcallsign/broadcast_callsign=$callsign/g" /home/pi/pi_pacsat/Debug/pacsat.config
sudo sed -i "s/digi_callsign=$oldcallsign/digi_callsign=$callsign/g" /home/pi/pi_pacsat/Debug/pacsat.config
echo "New pacsat.confg is"
echo
cat /home/pi/pi_pacsat/Debug/pacsat.config
fi
sudo /etc/init.d/alsa-utils stop
sudo /etc/init.d/alsa-utils start
# export LD_LIBRARY_PATH=/mnt/usb-disk/ariss/lib:/usr/local/lib/iors_common:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH=/usr/local/lib/:$LD_LIBRARY_PATH
#sudo systemctl stop cubesatsim
#sudo systemctl stop transmit
#sudo systemctl stop command &>/dev/null
sudo modprobe snd-aloop
#sudo systemctl stop openwebrx
#sudo systemctl stop rtl_tcp &>/dev/null
#pkill -o chromium &>/dev/null
#sudo killall -9 rtl_fm &>/dev/null
#sudo killall -9 direwolf &>/dev/null
#udo killall -9 aplay &>/dev/null
#sudo killall -9 qsstv &>/dev/null
#sudo killall -9 rtl_tcp &>/dev/null
#sudo killall -9 java &>/dev/null
#sudo killall -9 CubicSDR &>/dev/null
#sudo killall -9 zenity &>/dev/null
sudo killall -9 pacsat_telem &>/dev/null
sudo killall -9 pi_pacsat &>/dev/null
echo
#choice=2
#fi
# frequency=434900000
echo
echo "If your Pacsat Ground Station is transmitting packets, you will see them here"
echo
#echo
#echo "Note that the 'Tuned to' frequency will be different from the chosen frequency due to the way SDRs work."
# echo -e "Auto decoding APRS Pacsat packets on $frequency Hz"
# direwolf -P+ -D1 -qd -dp -r 48000 -c /home/pi/CubeSatSim/direwolf/direwolf-pacsatsim-loopback.conf -t 0 &
# /usr/bin/x-terminal-emulator --geometry=120x40 -e "/home/pi/CubeSatSim/pacsatsim-df.sh"
sudo usermod -a -G gpio pi
if [ "$loopback" = "1" ] ; then
echo "Using audio loopback"
ADEVICE="ADEVICE plughw:CARD=Loopback,DEV=0"
PTT="PTT GPIOD gpiochip0 17"
value=`cat /home/pi/CubeSatSim/.mode`
echo "$value" > /dev/null
set -- $value
MODE=$1
if [ ! "$MODE" = "P" ] ; then
/home/pi/CubeSatSim/config -I n
fi
# sudo /home/pi/CubeSatSim/pacsatsim-d.sh &
# direwolf -P+ -D1 -qd -dp -r 48000 -c /home/pi/CubeSatSim/direwolf/direwolf-pacsatsim-loopback.conf -t 0 &
elif [ "$safe" = "1" ] ; then
echo "Safe mode - battery saver"
# sudo /home/pi/CubeSatSim/pacsatsim-d.sh &
ADEVICE="ADEVICE shared_mic plughw:CARD=Loopback,DEV=0"
PTT="PTT GPIOD gpiochip0 17"
# direwolf -P+ -D1 -qd -dp -r 48000 -c /home/pi/CubeSatSim/direwolf/direwolf-pacsatsim-pwm-loopback.conf -t 0 &
# 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 434900 &
# 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 $frequency &
elif [ "$vox" = "1" ]; then
echo "Using Soundcard Audio TX and RX (VOX, no PTT)"
ADEVICE="ADEVICE plughw:CARD=Device,DEV=0"
PTT="PTT GPIOD gpiochip0 17"
# sudo /home/pi/CubeSatSim/pacsatsim-dj.sh &
# direwolf -P+ -D1 -qd -dp -r 48000 -c /home/pi/CubeSatSim/direwolf/direwolf-pacsatsim-jp14-half.conf -t 0 &
elif [ "$pwm" = "1" ] ; then
echo "FM TXC using Soundcard input (JP13), PWM output"
ADEVICE="ADEVICE shared_mic plughw:CARD=Headphones,DEV=0"
PTT="PTT GPIOD gpiochip0 -20"
# direwolf -P+ -D1 -qd -dp -r 48000 -c /home/pi/CubeSatSim/direwolf/direwolf-pacsatsim-pwm.conf -t 0 &
else
echo "FM TXC using Soundcard input (JP13) and output (JP14)"
ADEVICE="ADEVICE shared_mic plughw:CARD=Device,DEV=0"
PTT="PTT GPIOD gpiochip0 -20"
# direwolf -P+ -D1 -qd -dp -r 48000 -c /home/pi/CubeSatSim/direwolf/direwolf-pacsatsim-jp14.conf -t 0 &
fi
DIREWOLF_CONF="/home/pi/CubeSatSim/direwolf-pacsatsim-tmp.conf"
echo "$ADEVICE" > $DIREWOLF_CONF
echo "MYCALL $callsign-1" >> $DIREWOLF_CONF
echo "$PTT" >> $DIREWOLF_CONF
cat /home/pi/CubeSatSim/direwolf/direwolf-pacsatsim.conf >> $DIREWOLF_CONF
echo
echo "$DIREWOLF_CONF"
echo
cat $DIREWOLF_CONF
echo
direwolf -P+ -D1 -qd -dp -r 48000 -c $DIREWOLF_CONF -t 0 &
# arecord -D plughw:CARD=Loopback,DEV=1 -f S16_LE -r 48000 -c 1 | csdr convert_s16_f | csdr gain_ff 14000 | csdr convert_f_samplerf 20833 | sudo rpitx -i- -m RF -f 434900 &
## 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 434900 &
## echo "Don't close the direwolf window or the Pacsatsim will stop running."
export LD_LIBRARY_PATH=/usr/local/lib/:$LD_LIBRARY_PATH
/home/pi/pacsat_telem/Debug/pacsat_telem -v -d /home/pi/PacSat/pacsat &
sleep 5
value=`aplay -l | grep "Loopback"`
echo "$value" > /dev/null
set -- $value
#rtl_fm -M fm -f $frequency -s 48k | tee >(aplay -D hw:${2:0:1},0,0 -r 48000 -t raw -f S16_LE -c 1) | aplay -D hw:0,0 -r 48000 -t raw -f S16_LE -c 1 &
cd /home/pi/pi_pacsat/Debug
./pi_pacsat -c pacsat.config -d /home/pi/PacSat
sleep 60

@ -0,0 +1,15 @@
Pacsat Telemetry Decoder Properties
#Sat Nov 26 18:12:20 EST 2016
numberOfLookupTables=0
measurementsFileName=measurements.csv
model=1
layout0.filename=PACSAT_rttelemetry.csv
layout0.name=TLMI_LAYOUT
passMeasurementsFileName=passmeasurements.csv
name=PacSatSim
description=PacSatSim
numberOfLayouts=1
satId=3
catalogNumber=0
conversionCoefficients=pacsat-coef.csv
layoutsUseBits=True

@ -0,0 +1,20 @@
#PacSat Ground Station Properties
#Sun Feb 17 18:25:06 EST 2019
sequence_num=3
name=PacSatSim
digiCallsign=AMSAT-1
description=PacSatSim
broadcastCallsign=AMSAT-11
DIR_AGE=10
bbsCallsign=AMSAT-12
telemLayoutFile=PacSatSim.dat
telem_server=tlm.amsatfox.org
web_site_url=http://CubeSatSim.org
show_system_files_on_dir_tab=false
show_user_files=true
supports_file_upload=true
norad_id=30776
psf_header_check_sums=false
commandsFile=pacsat.commands
is_command_station=true
secret_key=ScKQLp2ZMvCaCTK5jAmOmKmA0JiSyJ6Y15+Yfg\=\=

@ -0,0 +1,41 @@
0,-,NONE,0,1,0,0,0,0,None,0,4096,None
1,-,Boolean,0,1,0,0,0,0,Boolean,0,1,A Boolean value that prints TRUE or FALSE
2,-,Counts,0,1,0,0,0,0,Counts,0,4096,An integer count value
3,-,Date,0,1,0,0,0,0,Date,0,4096,A Unix epoch date time integer
4,-,TXPower,0,1,0,0,0,0,None,0,4096,None
5,-,IHUSpeed,0,0.1,0,0,0,0,None,0,4096,None
6,-,RSSI_1,0,-1,0,0,0,0,Counts,0,4096,Signed 8 bit
7,-,Mode,0,0,0,0,0,0,Enum,0,4096,SAFE:CREW:TELEM:X BAND RPT:APRS:SSTV:FS
8,-,Battery,0,0.001,0,0,0,0,None,0,4096,Battery Voltage
9,-,IHUTemp,0,0.1,0,0,0,0,None,0,4096,None
10,-,Mode,0,1,0,0,0,0,None,0,4096,The spacecraft Mode
11,-,FS_BYTES_PER_BLK,0,128,0,0,0,0,Counts,0,4096,The number of bytes per block in RED FS
12,-,FS_FILE_NUMBER,-4,1,0,0,0,0,Counts,0,4096,The number of files in the FS excluding core OS folders
13,-,SHTC3Temp,-45,0.002670288,0,0,0,0,None,0,4096,SHTC3 Temperature sensor
14,-,SHTC3Humidity,0,0.001525879,0,0,0,0,None,0,4096,SHTC3 Humidity sensor
15,-,LPS22Pressure,0,0.000244141,0,0,0,0,None,0,4096,LPS22 Pressure sensor
16,-,LPS22Temp,0,0.01,0,0,0,0,None,0,4096,LPS22 Temperature of sensor
17,-,IMUTemp,0,0.00390625,0,0,0,0,None,0,4096,Temperature of IMU = raw/256
18,-,Acc,0,6.10E-05,0,0,0,0,Sint16,0,4096,Accelerometer is 2g full scale
19,-,Gyro,0,0.000976563,0,0,0,0,Sint16,0,4096,Gyro scale for 32dps
20,-,Mag,0,0.149975574,0,0,0,0,Sint16,0,4096,Mag is 4912 full scale
21,-,AntMode,0,0,0,0,0,0,Enum,0,4096,MANUAL:AUTO:ORBIT
22,-,ResetReason,0,0,0,0,0,0,Enum,0,4096,NONE:SHUTDOWN:REBOOT:RADIO:TNC:TNC LISTEN:RUN TWICE:RADIO REBOOT:TNC PS REBOOT:TNC REBOOT:SOFT:THERMAL
23,-,LogLevel,0,0,0,0,0,0,Enum,0,4096,NONE:ERROR:WARN:INFO
24,-,O2FromVolts,86.434,-0.0354,0,0,0,0,None,0,4096,O2 Conc from raw voltage as a percentage
25,-,SensorState,0,0,0,0,0,0,Enum,0,4096,OFF:ON:ERR
26,-,SPARE2,0,0,0,0,0,0,Counts,0,4096,SPARE
27,-,O2Conc,0,0.01,0,0,0,0,Sint16,0,4096,O2 concentration as percentage
28,-,SSTVMode,0,0,0,0,0,0,Enum,0,4096,MartinM1:MartinM2:ScottieS1:ScottieS2:Robot36:PasokonP3:PasokonP5:PasokonP7:PD90:PD120:PD160:PD180:PD240:PD290:Robot8BW:Robot24BW
29,-,DivideBy100,0,0.01,0,0,0,0,None,0,4096,Divide by 100
30,-,DivideBy100Offset,-20.48,0.01,0,0,0,0,None,0,4096,Divide by 100 with Offset
31,-,Offset,-2048,1,0,0,0,0,Counts,0,4096,Offset
32,-,DivideBy10Offset,-204.8,0.1,0,0,0,0,None,0,4096,Divide by 10 with Offset
33,-,Status,0,0,0,0,0,0,Enum,0,4096,OFF:ON
34,-,CommandStatus,0,0,0,0,0,0,Enum,0,4096,OFF:Carrier:DTMF/APRS
35,-,FailStatus,0,0,0,0,0,0,Enum,0,4096,OK:FAIL
36,-,AntStatus,0,0,0,0,0,0,Enum,0,4096,STOWED:DEPLOYED
37,-,Times10,0,10.0,0,0,0,0,Counts,0,4096,Multiply by 10
NOTES:,,,,,,,,,,,,
Serial,Ignore,name,a,b,c,d,e,f,format,low limit,high limit,Comment
Echo value = a + bx + cx^2 + dx^3 + ex^4 + fx^5,Echo value = a + bx + cx^2 + dx^3 + ex^4 + fx^5,,,,,,,,,,,
1 0 - NONE 0 1 0 0 0 0 None 0 4096 None
2 1 - Boolean 0 1 0 0 0 0 Boolean 0 1 A Boolean value that prints TRUE or FALSE
3 2 - Counts 0 1 0 0 0 0 Counts 0 4096 An integer count value
4 3 - Date 0 1 0 0 0 0 Date 0 4096 A Unix epoch date time integer
5 4 - TXPower 0 1 0 0 0 0 None 0 4096 None
6 5 - IHUSpeed 0 0.1 0 0 0 0 None 0 4096 None
7 6 - RSSI_1 0 -1 0 0 0 0 Counts 0 4096 Signed 8 bit
8 7 - Mode 0 0 0 0 0 0 Enum 0 4096 SAFE:CREW:TELEM:X BAND RPT:APRS:SSTV:FS
9 8 - Battery 0 0.001 0 0 0 0 None 0 4096 Battery Voltage
10 9 - IHUTemp 0 0.1 0 0 0 0 None 0 4096 None
11 10 - Mode 0 1 0 0 0 0 None 0 4096 The spacecraft Mode
12 11 - FS_BYTES_PER_BLK 0 128 0 0 0 0 Counts 0 4096 The number of bytes per block in RED FS
13 12 - FS_FILE_NUMBER -4 1 0 0 0 0 Counts 0 4096 The number of files in the FS excluding core OS folders
14 13 - SHTC3Temp -45 0.002670288 0 0 0 0 None 0 4096 SHTC3 Temperature sensor
15 14 - SHTC3Humidity 0 0.001525879 0 0 0 0 None 0 4096 SHTC3 Humidity sensor
16 15 - LPS22Pressure 0 0.000244141 0 0 0 0 None 0 4096 LPS22 Pressure sensor
17 16 - LPS22Temp 0 0.01 0 0 0 0 None 0 4096 LPS22 Temperature of sensor
18 17 - IMUTemp 0 0.00390625 0 0 0 0 None 0 4096 Temperature of IMU = raw/256
19 18 - Acc 0 6.10E-05 0 0 0 0 Sint16 0 4096 Accelerometer is 2g full scale
20 19 - Gyro 0 0.000976563 0 0 0 0 Sint16 0 4096 Gyro scale for 32dps
21 20 - Mag 0 0.149975574 0 0 0 0 Sint16 0 4096 Mag is 4912 full scale
22 21 - AntMode 0 0 0 0 0 0 Enum 0 4096 MANUAL:AUTO:ORBIT
23 22 - ResetReason 0 0 0 0 0 0 Enum 0 4096 NONE:SHUTDOWN:REBOOT:RADIO:TNC:TNC LISTEN:RUN TWICE:RADIO REBOOT:TNC PS REBOOT:TNC REBOOT:SOFT:THERMAL
24 23 - LogLevel 0 0 0 0 0 0 Enum 0 4096 NONE:ERROR:WARN:INFO
25 24 - O2FromVolts 86.434 -0.0354 0 0 0 0 None 0 4096 O2 Conc from raw voltage as a percentage
26 25 - SensorState 0 0 0 0 0 0 Enum 0 4096 OFF:ON:ERR
27 26 - SPARE2 0 0 0 0 0 0 Counts 0 4096 SPARE
28 27 - O2Conc 0 0.01 0 0 0 0 Sint16 0 4096 O2 concentration as percentage
29 28 - SSTVMode 0 0 0 0 0 0 Enum 0 4096 MartinM1:MartinM2:ScottieS1:ScottieS2:Robot36:PasokonP3:PasokonP5:PasokonP7:PD90:PD120:PD160:PD180:PD240:PD290:Robot8BW:Robot24BW
30 29 - DivideBy100 0 0.01 0 0 0 0 None 0 4096 Divide by 100
31 30 - DivideBy100Offset -20.48 0.01 0 0 0 0 None 0 4096 Divide by 100 with Offset
32 31 - Offset -2048 1 0 0 0 0 Counts 0 4096 Offset
33 32 - DivideBy10Offset -204.8 0.1 0 0 0 0 None 0 4096 Divide by 10 with Offset
34 33 - Status 0 0 0 0 0 0 Enum 0 4096 OFF:ON
35 34 - CommandStatus 0 0 0 0 0 0 Enum 0 4096 OFF:Carrier:DTMF/APRS
36 35 - FailStatus 0 0 0 0 0 0 Enum 0 4096 OK:FAIL
37 36 - AntStatus 0 0 0 0 0 0 Enum 0 4096 STOWED:DEPLOYED
38 37 - Times10 0 10.0 0 0 0 0 Counts 0 4096 Multiply by 10
39 NOTES:
40 Serial Ignore name a b c d e f format low limit high limit Comment
41 Echo value = a + bx + cx^2 + dx^3 + ex^4 + fx^5 Echo value = a + bx + cx^2 + dx^3 + ex^4 + fx^5

@ -0,0 +1,37 @@
# This is a list of commands that can be sent to the spacecraft
# args are 16 bit except the special code 99099099 which is replaced with the unix time, or when special code MSB32BIT is used to combine two fields
LIST, namespaces, None, Operations, Telem, File System
LIST, IMAGE FOLDER, sstv_queue 1, sstv_queue 2, sstv_queue 3, sstv_queue 4, sstv_queue 5, sstv_queue 6, sstv_queue 7, sstv_queue 8, sstv_queue 9
LIST, FOLDER, bin, lib, config, PACSAT dir, upload queue, wod queue, log queue, text queue, sensor wod queue, data1, data2, data3, data4, data5, data6, data7, data8, data9
LIST, ENABLE, false, true
LIST, ROLL AT STARTUP, false, true
LIST, OVERWRITE, false, true
LIST, FSK, false, true
LIST, REMOVE ORPHAN FILES, false, true
LIST, STATE, stop, start
LIST, UPLINK MODE, Off, All stations, Command Stations Only
LIST, FILENAME, use id for file name, user file name
LIST, SHUTDOWN, reboot, shutdown
LIST, RESET, reboot
LIST, RATE, 1200, 9600
LIST, FEC, Off, On
LIST, FULL DUPLEX, false, true
LIST, LOG NAME, Log, WOD
LIST, LOG LEVEL, None, Error, Warnings, Info
# Name, Name space, cmd, arg0, arg1, arg2, arg3, argName0, argName1, argName2, argName3, confirm, use reset/uptime, description
#
# PACSAT
#
Pacsat Broadcast,3,1,0,0,0,0,State,Period(sec),Timeout(sec),NONE,false,false,Enable or disable the Pacsat Broadcast module. The directory entries and individual files will be broadcast based on commands from ground stations.
File Uploads,3,2,0,0,0,0,Uplink Mode,Period(sec),Timeout(sec),NONE,false,false,Enable or disable File Uploads. Limit file uploads to command stations that authenticate with a secret key.
Install File,3,3,0,0,0,0,FileId,MSB32BIT,Folder,NONE,false,false,Copy a file from the PACSAT Directory to a folder and name it with a 4 byte hex name that matches the id or the user filename.
Execute File,3,13,0,0,0,0,FileId,MSB32BIT,Arg1,Arg2,true,false,Execute a file on the ARISS-PI. The file must already be installed in the bin folder
Delete File,3,4,0,0,0,0,FileId,MSB32BIT,Folder,NONE,true,false,Delete a file on the ARISS-PI. Typically this leaves the original copy in the PACSAT dir. To delete the original copy specify the PACSAT Dir folder
Delete Folder Contents,3,5,0,0,0,0,Folder,Remove Orphan Files,NONE,NONE,true,false,Remove all files from the folder. The original files will remain in the PACSAT Directory unless deleted seperately. Orphan files are files in a folder without a corresponding Pacsat Dir file. NB: Deleting the entire Pacsat Dir is a desperate measure perhaps only useful in testing!
Default File Expiry Period,3,6,0,0,0,0,Period(days),NONE,NONE,NONE,false,false,Set the default expiry period for files without a specific expiry time. The new value will be applied to all files.
File Expiry Period,3,7,0,0,0,0,FileId,MSB32BIT,Date,MSB32BIT,false,false,Set the expiry date for a specific file`.
Directory Maintenence Period,3,8,0,0,0,0,Period(s),NONE,NONE,NONE,false,false,Period between checks to each node in the directory for file expiry.
Uplink queue maintenance Period,3,9,0,0,0,0,Period(s),NONE,NONE,NONE,false,false,Period to check the entire uplink queue for expired files.
Int File Que Check Period,3,10,0,0,0,0,Period(s),NONE,NONE,NONE,false,false,Period to check the ingestion queues for newly generated internal files.
Max File Size,3,11,0,0,0,0,Size(kb),NONE,NONE,NONE,false,false,Maximum size for an uploaded file
Max Upload File Age,3,12,0,0,0,0,Age(days),NONE,NONE,NONE,false,false,Partially uploaded files not modified for more than this period will be removed from the upload queue.

@ -0,0 +1,18 @@
#Pacsat Telemetry Decoder Properties
#Fri Feb 6 18:12:20 EST 2026
numberOfLookupTables=0
measurementsFileName=measurements.csv
model=1
layoutsUseToCallsignAsType=true
numberOfLayouts=2
layout0.filename=PacSatSim_rttelemetry.csv
layout0.name=TLMP1
layout1.filename=PacSatSim_rttelemetry.csv
layout1.name=WOD
passMeasurementsFileName=passmeasurements.csv
name=CubeSatSim
description=PacSatSim
satId=3
catalogNumber=0
conversionCoefficients=PacSatSim-coef.csv
layoutsUseBits=True

@ -0,0 +1,21 @@
#PacSat Ground Station Properties
#Fri Feb 6 18:25:06 EST 2026
sequence_num=3
name=PacSatSim
digiCallsign=AMSAT-1
description=PacSatSim
broadcastCallsign=AMSAT-11
DIR_AGE=10
bbsCallsign=AMSAT-12
telemLayoutFile=PacSatSim.dat
telem_server=tlm.amsatfox.org
web_site_url=http://CubeSatSim.org
show_system_files_on_dir_tab=false
show_user_files=true
supports_file_upload=true
norad_id=30776
psf_header_check_sums=false
is_command_station=true
secret_key=Not-required
commandsFile=PacSatSim.commands
echo_to_stdout=true

@ -0,0 +1,13 @@
CurveName,a,bx,cx^2,dx^3,ex^4,fx^5,Description
cubesatsim_voltage,0,0.01,0,0,0,0,Converts voltages read from the INA219 sensors
cubesatsim_current,-2048,1,0,0,0,0,Converts positive and negative currents read from the INA219 sensors
cubesatsim_temperature,0,0.1,0,0,0,0,Converts temperature of Pi
cubesatsim_rotation,-2048,1,0,0,0,0,Converts positive and negative dps rotation
cubesatsim_acceleration,-20.48,0.01,0,0,0,0,Converts positive and negative g acceleration
cubesatsim_altitude,0,0.1,0,0,0,0,Converts altitude
cubesatsim_pressure,0,1,0,0,0,0,Converts pressure
cubesatsim_sensor1,0,1,0,0,0,0,Conversion of Sensor 1
cubesatsim_sensor2,-2048,1,0,0,0,0,Conversion of Sensor 2
cubesatsim_sensor3,-20.48,0.01,0,0,0,0,Conversion of Sensor 3
cubesatsim_rpm,-204.8,0.1,0,0,0,0,Conversion of calculated RPM
cubesatsim_rssi,-2048,1,0,0,0,0,Conversion of Received Signal Strength
1 CurveName a bx cx^2 dx^3 ex^4 fx^5 Description
2 cubesatsim_voltage 0 0.01 0 0 0 0 Converts voltages read from the INA219 sensors
3 cubesatsim_current -2048 1 0 0 0 0 Converts positive and negative currents read from the INA219 sensors
4 cubesatsim_temperature 0 0.1 0 0 0 0 Converts temperature of Pi
5 cubesatsim_rotation -2048 1 0 0 0 0 Converts positive and negative dps rotation
6 cubesatsim_acceleration -20.48 0.01 0 0 0 0 Converts positive and negative g acceleration
7 cubesatsim_altitude 0 0.1 0 0 0 0 Converts altitude
8 cubesatsim_pressure 0 1 0 0 0 0 Converts pressure
9 cubesatsim_sensor1 0 1 0 0 0 0 Conversion of Sensor 1
10 cubesatsim_sensor2 -2048 1 0 0 0 0 Conversion of Sensor 2
11 cubesatsim_sensor3 -20.48 0.01 0 0 0 0 Conversion of Sensor 3
12 cubesatsim_rpm -204.8 0.1 0 0 0 0 Conversion of calculated RPM
13 cubesatsim_rssi -2048 1 0 0 0 0 Conversion of Received Signal Strength

@ -0,0 +1,63 @@
62,TYPE,FIELD,BITS,UNIT,CONVERSION,MODULE,MODULE_NUM,MODULE_LINE,LINE_TYPE,SHORT_NAME,DESCRIPTION
0,long,timestamp,32,Sec,0,NONE,0,0,0,timestamp,This is the unix time in seconds
1,int,Sensor 2,12,integer,2,Experiments,6,8,3,Sensor 2,STEM Payload Extra Sensor 2
2,int,Sensor 3,12,integer,2,Experiments,6,9,3,Sensor 3,STEM Payload Extra Sensor 3
3,float,BATT_V,12,V,29,Battery,4,1,3,Battery Voltage,INA219 Battery Voltage
4,float,SatelliteXAxisAcceleration,12,g,30,+X Panel,7,4,3,Acceleration,STEM Payload Board MPU6050 Acceleration around X Axis
5,float,SatelliteYAxisAcceleration,12,g,30,+Y Panel,8,4,3,Acceleration,STEM Payload Board MPU6050 Acceleration around Y Axis
6,float,SatelliteZAxisAcceleration,12,g,30,+Z Panel,9,4,3,Acceleration,STEM Payload Board MPU6050 Acceleration around Z Axis
7,int,BATT_I,12,mA,31,Battery,4,2,3,Battery Current,INA219 Battery Current
8,float,Temperature,12,C,5,Experiments,6,2,3,BME280 Temp,BME280 STEM Payload sensor temperature
9,float,posXv,12,V,29,+X Panel,7,1,3,Voltage,INA219 +X solar panel Voltage
10,float,posYv,12,V,29,+Y Panel,8,1,3,Voltage,INA219 +Y solar panel Voltage
11,float,posZv,12,V,29,+Z Panel,9,1,3,Voltage,INA219 +Z solar panel Voltage
12,float,negXv,12,V,29,-X Panel,10,1,3,Voltage,INA219 -X solar panel Voltage
13,float,negYv,12,V,29,-Y Panel,11,1,3,Voltage,INA219 -Y solar panel Voltage
14,float,negZv,12,V,29,-Z Panel,12,1,3,Voltage,INA219 -Z solar panel Voltage
15,int,posXi,12,mA,31,+X Panel,7,2,3,Current,INA219 +X solar panel Current
16,int,posYi,12,mA,31,+Y Panel,8,2,3,Current,INA219 +Y solar panel Current
17,int,posZi,12,mA,31,+Z Panel,9,2,3,Current,INA219 +Z solar panel Current
18,int,negXi,12,mA,31,-X Panel,10,2,3,Current,INA219 -X solar panel Current
19,int,negYi,12,mA,31,-Y Panel,11,2,3,Current,INA219 -Y solar panel Current
20,int,negZi,12,mA,31,-Z Panel,12,2,3,Current,INA219 -Z solar panel Current
21,float,BATT2_V,12,V,29,Battery2,5,1,3,Battery2 Voltage,INA219 Battery2 Voltage
22,float,spin,12,rpm,32,Computer Software,3,1,3,Spacecraft Spin,Calculated spin rate using solar cells
23,int,Pressure,12,hPa,2,Experiments,6,3,3,BME280 Pressure,BME280 STEM Payload sensor pressure
24,float,Altitude,12,m,37,Experiments,6,4,3,BME280 Altitude,BME280 STEM Payload sensor altitude
25,float,Resets,12,-,12,NONE,3,2,3,Reset Count, Software Reset Count
26,float,rssi,12,dBm,31,Radio,1,1,3,RSSI,Received Signal Strength Indication
27,float,IHUcpuTemp,12,C,5,Computer Hardware,2,1,3,IHU Temp (Pi),Internal temperature of IHU from Pi
28,float,SatelliteXAxisAngularVelocity,12,dps,31,+X Panel,7,3,3,Rotation,STEM Payload Board MPU6050 Angular veolcity around X Axis
29,float,SatelliteYAxisAngularVelocity,12,dps,31,+Y Panel,8,3,3,Rotation,STEM Payload Board MPU6050 Angular veolcity around Y Axis
30,float,SatelliteZAxisAngularVelocity,12,dps,31,+Z Panel,9,3,3,Rotation,STEM Payload Board MPU6050 Angular veolcity around Z Axis
31,float,Humidity,12,%,5,Experiments,6,5,3,BME280 Humidity,BME280 Humidity
32,int,BAT2_I,12,mA,31,Battery2,5,2,3,Battery2 Current,INA219 Battery2 Current
33,float,DiodeTemp,12,C,32,Experiments,6,6,3,Diode Temp,STEM Payload Diode Temperature
34,int,Sensor 1,12,integer,2,Experiments,6,7,3,Sensor 1,STEM Payload Extra Sensor 1
35,float,STEMPayloadStatus,1,-,35,Experiments,6,1,0,STEM Payload Status, STEM Payload STEM Payload board failure Indicator
36,float,SafeMode,1,-,33,Computer Software,3,2,0,Safe Mode, Safe Mode (Low Battery Voltage)
37,float,SimulatedTelemetry,1,-,33,Computer Software,3,4,0,Simulated Telemetry,Simulated Telemetry Indicator
38,float,PayloadStatus1,1,-,35,NONE,6,8,0,Exp 3,STEM Payload status 1 failure indicator
39,float,I2CBus0Failure,1,-,35,NONE,2,2,0,I2C Bus 0,I2C bus 0 failure indicator
40,float,I2CBus1Failure,1,-,35,Computer Hardware,2,2,0,I2C Bus 1,I2C bus 1 failure indicator
41,float,I2CBus3Failure,1,-,35,Computer Hardware,2,3,0,I2C Bus 3,I2C bus 3 failure indicator
42,float,CameraFailure,1,-,35,Computer Hardware,2,4,0,Camera,Camera failure indicator
43,int,GroundCommands,4,-,2,Computer Software,3,3,0,Ground Commands,Number of ground commands received
44,float,RxAntenna,1,-,36,Radio,1,3,0,RX Antenna,Receive antenna status
45,float,TxAntenna,1,-,36,Radio,1,2,0,TX Antenna,Transmit antenna status
46,float,C2CStatus,2,-,34,Computer Software,3,5,0,Command Control, Command & Control Status
47,float,ICR3VProt,12,V,0,NONE,7,2,3,3V Prot,ICR 3V Proteted
48,float,ICR2dot5V,12,V,0,NONE,7,3,3,2.5V,ICR 2.5V
49,float,ICR2dot5VProt,12,V,0,NONE,7,4,3,2.5V Prot,ICR 2.5V Protected
50,float,rf6,12,-,0,NONE,0,0,0,None,None
51,float,rf7,12,-,0,NONE,0,0,0,None,None
52,float,MuxTest,12,V,0,NONE,7,5,3,Sensor Power,Sensor Power Voltage at the ICR
53,float,LtVGACtl,12,V,0,NONE,1,4,3,VGA Control,Control Voltage to the Variable Gain Amplifier (VGA)
54,float,pad,4,-,34,NONE,0,0,0,None,Unused
55,float,IHUdiagData,32,-,18,NONE,3,2,0,Diagnostic Info,Diagnostic Data on IHU Performance
56,float,pad1,1,-,0,NONE,0,0,0,NONE,Filler
57,float,wodSize,8,000s,36,NONE,3,3,0,WOD Stored,Number of WOD data payloads kept for each of Science and Housekeeping. In hundreds
58,float,swCmds,32,-,35,NONE,7,6,0,Diagnostic,ICR Diagnostic information
59,float,hwCmdCnt,6,-,1,NONE,7,7,0,HW Command Count,Number of hardware commands since last reset
60,float,swCmdCnt,6,-,1,NONE,7,8,0,SW Command Count,Number of software commands since last reset
61,float,pad2,27,-,0,NONE,0,0,0,NONE,Filler
1 62 TYPE FIELD BITS UNIT CONVERSION MODULE MODULE_NUM MODULE_LINE LINE_TYPE SHORT_NAME DESCRIPTION
2 0 long timestamp 32 Sec 0 NONE 0 0 0 timestamp This is the unix time in seconds
3 1 int Sensor 2 12 integer 2 Experiments 6 8 3 Sensor 2 STEM Payload Extra Sensor 2
4 2 int Sensor 3 12 integer 2 Experiments 6 9 3 Sensor 3 STEM Payload Extra Sensor 3
5 3 float BATT_V 12 V 29 Battery 4 1 3 Battery Voltage INA219 Battery Voltage
6 4 float SatelliteXAxisAcceleration 12 g 30 +X Panel 7 4 3 Acceleration STEM Payload Board MPU6050 Acceleration around X Axis
7 5 float SatelliteYAxisAcceleration 12 g 30 +Y Panel 8 4 3 Acceleration STEM Payload Board MPU6050 Acceleration around Y Axis
8 6 float SatelliteZAxisAcceleration 12 g 30 +Z Panel 9 4 3 Acceleration STEM Payload Board MPU6050 Acceleration around Z Axis
9 7 int BATT_I 12 mA 31 Battery 4 2 3 Battery Current INA219 Battery Current
10 8 float Temperature 12 C 5 Experiments 6 2 3 BME280 Temp BME280 STEM Payload sensor temperature
11 9 float posXv 12 V 29 +X Panel 7 1 3 Voltage INA219 +X solar panel Voltage
12 10 float posYv 12 V 29 +Y Panel 8 1 3 Voltage INA219 +Y solar panel Voltage
13 11 float posZv 12 V 29 +Z Panel 9 1 3 Voltage INA219 +Z solar panel Voltage
14 12 float negXv 12 V 29 -X Panel 10 1 3 Voltage INA219 -X solar panel Voltage
15 13 float negYv 12 V 29 -Y Panel 11 1 3 Voltage INA219 -Y solar panel Voltage
16 14 float negZv 12 V 29 -Z Panel 12 1 3 Voltage INA219 -Z solar panel Voltage
17 15 int posXi 12 mA 31 +X Panel 7 2 3 Current INA219 +X solar panel Current
18 16 int posYi 12 mA 31 +Y Panel 8 2 3 Current INA219 +Y solar panel Current
19 17 int posZi 12 mA 31 +Z Panel 9 2 3 Current INA219 +Z solar panel Current
20 18 int negXi 12 mA 31 -X Panel 10 2 3 Current INA219 -X solar panel Current
21 19 int negYi 12 mA 31 -Y Panel 11 2 3 Current INA219 -Y solar panel Current
22 20 int negZi 12 mA 31 -Z Panel 12 2 3 Current INA219 -Z solar panel Current
23 21 float BATT2_V 12 V 29 Battery2 5 1 3 Battery2 Voltage INA219 Battery2 Voltage
24 22 float spin 12 rpm 32 Computer Software 3 1 3 Spacecraft Spin Calculated spin rate using solar cells
25 23 int Pressure 12 hPa 2 Experiments 6 3 3 BME280 Pressure BME280 STEM Payload sensor pressure
26 24 float Altitude 12 m 37 Experiments 6 4 3 BME280 Altitude BME280 STEM Payload sensor altitude
27 25 float Resets 12 - 12 NONE 3 2 3 Reset Count Software Reset Count
28 26 float rssi 12 dBm 31 Radio 1 1 3 RSSI Received Signal Strength Indication
29 27 float IHUcpuTemp 12 C 5 Computer Hardware 2 1 3 IHU Temp (Pi) Internal temperature of IHU from Pi
30 28 float SatelliteXAxisAngularVelocity 12 dps 31 +X Panel 7 3 3 Rotation STEM Payload Board MPU6050 Angular veolcity around X Axis
31 29 float SatelliteYAxisAngularVelocity 12 dps 31 +Y Panel 8 3 3 Rotation STEM Payload Board MPU6050 Angular veolcity around Y Axis
32 30 float SatelliteZAxisAngularVelocity 12 dps 31 +Z Panel 9 3 3 Rotation STEM Payload Board MPU6050 Angular veolcity around Z Axis
33 31 float Humidity 12 % 5 Experiments 6 5 3 BME280 Humidity BME280 Humidity
34 32 int BAT2_I 12 mA 31 Battery2 5 2 3 Battery2 Current INA219 Battery2 Current
35 33 float DiodeTemp 12 C 32 Experiments 6 6 3 Diode Temp STEM Payload Diode Temperature
36 34 int Sensor 1 12 integer 2 Experiments 6 7 3 Sensor 1 STEM Payload Extra Sensor 1
37 35 float STEMPayloadStatus 1 - 35 Experiments 6 1 0 STEM Payload Status STEM Payload STEM Payload board failure Indicator
38 36 float SafeMode 1 - 33 Computer Software 3 2 0 Safe Mode Safe Mode (Low Battery Voltage)
39 37 float SimulatedTelemetry 1 - 33 Computer Software 3 4 0 Simulated Telemetry Simulated Telemetry Indicator
40 38 float PayloadStatus1 1 - 35 NONE 6 8 0 Exp 3 STEM Payload status 1 failure indicator
41 39 float I2CBus0Failure 1 - 35 NONE 2 2 0 I2C Bus 0 I2C bus 0 failure indicator
42 40 float I2CBus1Failure 1 - 35 Computer Hardware 2 2 0 I2C Bus 1 I2C bus 1 failure indicator
43 41 float I2CBus3Failure 1 - 35 Computer Hardware 2 3 0 I2C Bus 3 I2C bus 3 failure indicator
44 42 float CameraFailure 1 - 35 Computer Hardware 2 4 0 Camera Camera failure indicator
45 43 int GroundCommands 4 - 2 Computer Software 3 3 0 Ground Commands Number of ground commands received
46 44 float RxAntenna 1 - 36 Radio 1 3 0 RX Antenna Receive antenna status
47 45 float TxAntenna 1 - 36 Radio 1 2 0 TX Antenna Transmit antenna status
48 46 float C2CStatus 2 - 34 Computer Software 3 5 0 Command Control Command & Control Status
49 47 float ICR3VProt 12 V 0 NONE 7 2 3 3V Prot ICR 3V Proteted
50 48 float ICR2dot5V 12 V 0 NONE 7 3 3 2.5V ICR 2.5V
51 49 float ICR2dot5VProt 12 V 0 NONE 7 4 3 2.5V Prot ICR 2.5V Protected
52 50 float rf6 12 - 0 NONE 0 0 0 None None
53 51 float rf7 12 - 0 NONE 0 0 0 None None
54 52 float MuxTest 12 V 0 NONE 7 5 3 Sensor Power Sensor Power Voltage at the ICR
55 53 float LtVGACtl 12 V 0 NONE 1 4 3 VGA Control Control Voltage to the Variable Gain Amplifier (VGA)
56 54 float pad 4 - 34 NONE 0 0 0 None Unused
57 55 float IHUdiagData 32 - 18 NONE 3 2 0 Diagnostic Info Diagnostic Data on IHU Performance
58 56 float pad1 1 - 0 NONE 0 0 0 NONE Filler
59 57 float wodSize 8 000s 36 NONE 3 3 0 WOD Stored Number of WOD data payloads kept for each of Science and Housekeeping. In hundreds
60 58 float swCmds 32 - 35 NONE 7 6 0 Diagnostic ICR Diagnostic information
61 59 float hwCmdCnt 6 - 1 NONE 7 7 0 HW Command Count Number of hardware commands since last reset
62 60 float swCmdCnt 6 - 1 NONE 7 8 0 SW Command Count Number of software commands since last reset
63 61 float pad2 27 - 0 NONE 0 0 0 NONE Filler

@ -0,0 +1,14 @@
[Unit]
Description=PacsatSim
[Service]
TimeoutStopSec=5
ExecStart=/home/pi/CubeSatSim/pacsatsim.sh
WorkingDirectory=/home/pi/CubeSatSim
StandardOutput=inherit
StandardError=inherit
Restart=always
User=pi
[Install]
WantedBy=default.target

@ -8,7 +8,7 @@ WorkingDirectory=/home/pi/CubeSatSim
StandardOutput=inherit StandardOutput=inherit
StandardError=inherit StandardError=inherit
Restart=always Restart=always
User=root User=pi
[Install] [Install]
WantedBy=default.target WantedBy=default.target

@ -30,6 +30,9 @@ int main(int argc, char *argv[]) {
strcat(pythonConfigStr, " s"); strcat(pythonConfigStr, " s");
char cmdbuffer[1000]; char cmdbuffer[1000];
FILE *file2 = sopen(pythonVenv); // activate venv
FILE *file1 = sopen(pythonConfigStr); // try new function FILE *file1 = sopen(pythonConfigStr); // try new function
fgets(cmdbuffer, 1000, file1); fgets(cmdbuffer, 1000, file1);
if (debug == ON) if (debug == ON)

@ -1,7 +1,5 @@
#!/usr/bin/env python #!/usr/bin/env python
#import RPi.GPIO as GPIO
#from RPi.GPIO import output
#import subprocess #import subprocess
import time import time
from time import sleep from time import sleep
@ -22,17 +20,20 @@ def output(pin, value):
def input(pin): def input(pin):
# command = "gpio -g read " + str(pin) # command = "gpio -g read " + str(pin)
query = ["gpio", "-g", "read", str(pin)] # Read GPIO pin query = ["gpio", "-g", "read", str(pin)] # Read GPIO pin
command = "gpio -g read " + str(pin)
try: try:
result = subprocess.run(query, capture_output=True, text=True, check=True) result = subprocess.run(query, capture_output=True, text=True, check=True)
print(f"Command run was: {query}") # print(f"Command run was: {query}")
print("Sucess!") # print("Sucess!")
print(f"Output of the command (stdout): {result.stdout}") # print(f"Output of the command (stdout): {result.stdout}")
# print(f"{command}: {result.stdout}")
return int(result.stdout) return int(result.stdout)
except subprocess.CalledProcessError as e: except subprocess.CalledProcessError as e:
print(f"Command failed with return code: {e.returncode}") # print(f"Command failed with return code: {e.returncode}")
print(f"Command run was: {e.cmd}") # print(f"Command run was: {e.cmd}")
print(f"Output of the command (stdout): {e.stdout}") # print(f"Output of the command (stdout): {e.stdout}")
print(f"Error output of the command (stderr): {e.stderr}") # print(f"Error output of the command (stderr): {e.stderr}")
print(f"{command}: -1")
return -1 return -1
def setup(pin, config): def setup(pin, config):
@ -41,7 +42,7 @@ def setup(pin, config):
system(command) system(command)
print(command) print(command)
else: else:
print(f"Unknown GPIO setup configuration: {config}") print(f"Unknown gpio setup configuration: {config}")
def blink(times): def blink(times):
powerPin = 16 powerPin = 16
@ -150,11 +151,9 @@ def increment_mode():
file.close() file.close()
print(".mode file written") print(".mode file written")
# GPIO.setwarnings(False)
output(txLed, 0) output(txLed, 0)
output(powerPin, 0) output(powerPin, 0)
print("sudo reboot -h now") print("sudo reboot -h now")
# GPIO.setwarnings(False)
setup(powerPin, "out") setup(powerPin, "out")
output(powerPin, 0); output(powerPin, 0);
# system("reboot -h now") # system("reboot -h now")
@ -229,8 +228,6 @@ powerPin = 16
command_tx = True command_tx = True
# GPIO.setmode(GPIO.BCM)
# GPIO.setwarnings(False)
setup(13, "up") setup(13, "up")
setup(12, "up") setup(12, "up")
setup(27, "up") setup(27, "up")
@ -246,28 +243,22 @@ if input(12) == False:
else: else:
print("No LPF") print("No LPF")
# GPIO.setup(txLed, GPIO.OUT)
# output(txLed, 0)
# GPIO.setmode(GPIO.BCM) # Repeat to make LED work on Pi 4
# GPIO.setwarnings(False)
setup(txLed, "out") setup(txLed, "out")
setup(pd, "out") setup(pd, "out")
#output(pd, 1) #output(pd, 1)
output(pd, 0) output(pd, 0)
setup(ptt, "out") setup(ptt, "out")
output (ptt, 1) output(ptt, 1)
txc = False txc = False
if input(txc_pin) == False: if input(txc_pin) == False:
print("TXC is present") print("TXC is present")
txc = True; txc = True
else: else:
print("TXC not present") print("TXC not present")
# txc = False # forcing it off # False # forcing it off
output(txLed, 1) output(txLed, 1)
sleep(1) sleep(1)
output(txLed, 0) output(txLed, 0)
@ -276,8 +267,6 @@ battery_saver_check()
# print(1) # print(1)
print(txLed) print(txLed)
# GPIO.setup(27, GPIO.OUT)
# GPIO.output(27, 0)
debug_mode = 0 # change to 1 to debug transmit debug_mode = 0 # change to 1 to debug transmit
@ -308,7 +297,7 @@ if __name__ == "__main__":
print("Pi Zero 2 not detected") print("Pi Zero 2 not detected")
try: try:
system("cat /proc/uptime > /home/pi/CubeSatSim/uptime") system("sudo cat /proc/uptime > /home/pi/CubeSatSim/uptime")
file = open("/home/pi/CubeSatSim/uptime") file = open("/home/pi/CubeSatSim/uptime")
up = file.read().split(" ")[0] up = file.read().split(" ")[0]
print(up) print(up)
@ -347,6 +336,9 @@ if __name__ == "__main__":
print("Command_tx: ") print("Command_tx: ")
print(command_tx) print(command_tx)
if (mode != "p") or (command_tx == False):
system("sudo systemctl stop pacsatsim")
try: try:
file = open("/home/pi/CubeSatSim/command_count.txt", "r") file = open("/home/pi/CubeSatSim/command_count.txt", "r")
string = file.read() string = file.read()
@ -383,18 +375,6 @@ if __name__ == "__main__":
sim_config = True sim_config = True
print("Simulated telemetry mode is configured") print("Simulated telemetry mode is configured")
else: else:
# query = ["timeout", "2", "i2cdetect", "-y", "3"] # Test if Solar board is present
# try:
# result = subprocess.run(query, capture_output=True, text=True, check=True)
# print(f"Command run was: {query}")
# print("Sucess!")
# print(f"Output of the command (stdout): {result}")
# except subprocess.CalledProcessError as e:
# print(f"Command failed with return code: {e.returncode}")
# print(f"Command run was: {e.cmd}")
# print(f"Output of the command (stdout): {e.stdout}")
# print(f"Error output of the command (stderr): {e.stderr}")
try: try:
if path.isfile("/home/pi/CubeSatSim/sim_mode_auto"): if path.isfile("/home/pi/CubeSatSim/sim_mode_auto"):
print("Simulated telemetry mode automatically turned on!") print("Simulated telemetry mode automatically turned on!")
@ -404,10 +384,9 @@ if __name__ == "__main__":
if (debug_mode == 1): if (debug_mode == 1):
print("/home/pi/CubeSatSim/sim_mode_auto not found") print("/home/pi/CubeSatSim/sim_mode_auto not found")
if len(config) > 5: if len(config) > 5:
sq = config[5] if (mode != 'p') and (mode != 'P'): # squelch off for Pacsat
if (mode == 'p') or (mode == 'P'): sq = config[5]
sq = 0 # turn off squelch for Pacsat print(f'squelch: {sq}')
print(sq)
if len(config) > 6: if len(config) > 6:
txf = float(config[6]) txf = float(config[6])
if (mode == 'e'): if (mode == 'e'):
@ -457,29 +436,23 @@ if __name__ == "__main__":
no_command = True no_command = True
try: try:
f = open("/home/pi/CubeSatSim/command_control", "r") f = open("/home/pi/CubeSatSim/command_control", "r")
no_command = False
f.close() f.close()
# GPIO.setmode(GPIO.BCM) # setup(squelch, "up") ## pull up in case pin is not connected
# GPIO.setwarnings(False) # if input(squelch) == False:
setup(squelch, "up") ## pull up in case pin is not connected # print("squelch not set correctly, no command input!")
if input(squelch) == False: # else:
print("squelch not set correctly, no command input!") # if (mode != 'n') and (mode != 'x'):
else: # print("command and control is activated")
if (mode != 'n') and (mode != 'x'): # no_command = False
print("command and control is activated") # system("sudo systemctl start command")
no_command = False # else:
system("sudo systemctl start command") # print("Command and control not activated since Transmit Commands mode")
else: # txc = True # Transmit commands only works with FM transceiver, so bypass Battery Saver if activated
print("Command and control not activated since Transmit Commands mode")
txc = True # Transmit commands only works with FM transceiver, so bypass Battery Saver if activated
except: except:
print("command and control not activated") print("command and control not activated")
print(callsign) print(callsign)
# GPIO.setmode(GPIO.BCM) # added to make Tx LED work on Pi 4
# print(txLed)
# print(1)
# setup(txLed, "out")
query = ["grep", "VERSION_CODENAME=bullseye", "/etc/os-release"] query = ["grep", "VERSION_CODENAME=bullseye", "/etc/os-release"]
try: try:
@ -546,9 +519,7 @@ if __name__ == "__main__":
if (hab_mode == True) and (mode == 'a'): if (hab_mode == True) and (mode == 'a'):
print("Don't transmit CW ID since APRS HAB mode is active") print("Don't transmit CW ID since APRS HAB mode is active")
else: else:
if (((mode == 'a') or (mode == 'b') or (mode == 'f') or (mode == 's') or (mode == 'j')) and (command_tx == True) and (skip == False)) or ((mode == 'e') and (command_tx == True)): # battery_saver_mode 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
# GPIO.setmode(GPIO.BCM) # added to make Tx LED work on Pi Zero 2 and Pi 4
# setup(txLed, "out")
output(txLed, 1) output(txLed, 1)
print("Transmit CW ID") print("Transmit CW ID")
status = "" status = ""
@ -572,14 +543,57 @@ if __name__ == "__main__":
# if (len(sys.argv)) > 1: # if (len(sys.argv)) > 1:
# print("There are arguments!") # print("There are arguments!")
if (mode == 'a') or (mode == 'x') or (mode == 'n'): if (mode == 'a') or (mode == 'x') or (mode == 'n') or (mode == 'p') or (mode == 'P'):
# command_control_check() # command_control_check()
output(pd, 1) output(pd, 1)
output(ptt, 1) output(ptt, 1)
if (mode == 'a'): if (mode == 'a'):
print("AFSK") print("AFSK")
elif (mode == 'p') or (mode == 'P'):
if (mode == 'P'):
print("Pacsat Ground Station")
else:
print("Pacsat")
if (command_tx == True):
system("sudo systemctl restart pacsatsim")
print("Starting PacSatSim")
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"
if not txc:
print("txc is:")
print(txc)
system(stop_rpitx)
system(rpitx)
print("Safe Mode!!")
while (True):
if (txc):
sleep(0.1)
while (input(ptt) != 0):
sleep(0.2)
output(txLed, 1)
# print("1")
while (input(ptt) != 1):
sleep(0.2)
output(txLed, 0)
# print("0")
else:
# sleep(0.1)
while (input(17) == 0):
sleep(0.05)
## system(rpitx)
output(txLed, 1)
# print("1")
while (input(17) == 1):
sleep(0.05)
## system(stop_rpitx)
output(txLed, 0)
# print("0")
# sleep(10)
else: else:
# GPIO.output(powerPin, 0)
print("Transmit APRS Commands") print("Transmit APRS Commands")
system("sudo systemctl stop command") system("sudo systemctl stop command")
# while True: # while True:
@ -596,8 +610,6 @@ if __name__ == "__main__":
system("gen_packets -o /home/pi/CubeSatSim/telem.wav /home/pi/CubeSatSim/t.txt -r 48000 > /dev/null 2>&1") system("gen_packets -o /home/pi/CubeSatSim/telem.wav /home/pi/CubeSatSim/t.txt -r 48000 > /dev/null 2>&1")
system("cat /home/pi/CubeSatSim/t.txt") system("cat /home/pi/CubeSatSim/t.txt")
if (command_tx == True): if (command_tx == True):
# GPIO.setmode(GPIO.BCM) # added to make Tx LED work on Pi Zero 2 and Pi 4
# setup(txLed, "out")
output(txLed, 1) output(txLed, 1)
# output(pd, 1) # output(pd, 1)
# output (ptt, 0) # output (ptt, 0)
@ -654,8 +666,6 @@ if __name__ == "__main__":
system(command) system(command)
## chan = chan + 1 ## chan = chan + 1
if (command_tx == True): if (command_tx == True):
# GPIO.setmode(GPIO.BCM) # added to make Tx LED work on Pi Zero 2 and Pi 4
# setup(txLed, "out")
output(txLed, 1) output(txLed, 1)
if (txc): if (txc):
@ -718,8 +728,6 @@ if __name__ == "__main__":
if (command_tx == True): if (command_tx == True):
print ("Sending SSTV image") print ("Sending SSTV image")
# GPIO.setmode(GPIO.BCM) # added to make Tx LED work on Pi Zero 2 and Pi 4
# setup(txLed, "out")
output(txLed, 1) output(txLed, 1)
# battery_saver_check() # battery_saver_check()
@ -751,8 +759,6 @@ if __name__ == "__main__":
if (command_tx == True): if (command_tx == True):
print ("Sending SSTV image") print ("Sending SSTV image")
# GPIO.setmode(GPIO.BCM) # added to make Tx LED work on Pi Zero 2 and Pi 4
# setup(txLed, "out")
output(txLed, 1) output(txLed, 1)
# battery_saver_check() # battery_saver_check()
@ -789,8 +795,6 @@ if __name__ == "__main__":
if (command_tx == True): if (command_tx == True):
print ("Sending SSTV image") print ("Sending SSTV image")
# GPIO.setmode(GPIO.BCM) # added to make Tx LED work on Pi Zero 2 and Pi 4
# setup(txLed, "out")
output(txLed, 1) output(txLed, 1)
# battery_saver_check() # battery_saver_check()
@ -827,8 +831,6 @@ if __name__ == "__main__":
if (command_tx == True): if (command_tx == True):
print ("Sending SSTV image") print ("Sending SSTV image")
# GPIO.setmode(GPIO.BCM) # added to make Tx LED work on Pi Zero 2 and Pi 4
# setup(txLed, "out")
output(txLed, 1) output(txLed, 1)
# battery_saver_check() # battery_saver_check()
@ -858,8 +860,6 @@ if __name__ == "__main__":
if (command_tx == True): if (command_tx == True):
# command_control_check() # command_control_check()
# GPIO.setmode(GPIO.BCM) # added to make Tx LED work on Pi Zero 2 and Pi 4
# setup(txLed, "out")
output(txLed, 1) output(txLed, 1)
# battery_saver_check() # battery_saver_check()
@ -889,9 +889,6 @@ if __name__ == "__main__":
output(pd, 1) output(pd, 1)
output(ptt, 1) output(ptt, 1)
# GPIO.setmode(GPIO.BCM) # added to make Tx LED work on Pi 4
# setup(txLed, "out")
if (command_tx == True): if (command_tx == True):
# system("sudo nc -l 8080 | csdr convert_i16_f | csdr fir_interpolate_cc 2 | csdr dsb_fc | csdr bandpass_fir_fft_cc 0.002 0.06 0.01 | csdr fastagc_ff | sudo /home/pi/rpitx/sendiq -i /dev/stdin -s 96000 -f 434.9e6 -t float &") # system("sudo nc -l 8080 | csdr convert_i16_f | csdr fir_interpolate_cc 2 | csdr dsb_fc | csdr bandpass_fir_fft_cc 0.002 0.06 0.01 | csdr fastagc_ff | sudo /home/pi/rpitx/sendiq -i /dev/stdin -s 96000 -f 434.9e6 -t float &")
system("sudo nc -l 8080 | csdr convert_i16_f | csdr fir_interpolate_cc 2 | csdr dsb_fc | csdr bandpass_fir_fft_cc 0.002 0.06 0.01 | csdr fastagc_ff | sudo /home/pi/rpitx/sendiq -i /dev/stdin -s 96000 -f " + tx + "e6 -t float &") system("sudo nc -l 8080 | csdr convert_i16_f | csdr fir_interpolate_cc 2 | csdr dsb_fc | csdr bandpass_fir_fft_cc 0.002 0.06 0.01 | csdr fastagc_ff | sudo /home/pi/rpitx/sendiq -i /dev/stdin -s 96000 -f " + tx + "e6 -t float &")
@ -909,11 +906,7 @@ if __name__ == "__main__":
# command_control_check() # command_control_check()
if (command_tx == True): if (command_tx == True):
# GPIO.setmode(GPIO.BCM) # added to make Tx LED work on Pi Zero 2 and Pi 4
# setup(txLed, "out")
output(txLed, 1) output(txLed, 1)
# print(txLed)
# print(1)
if (mode == 'b'): if (mode == 'b'):
sleep(4.2) sleep(4.2)
@ -949,11 +942,7 @@ if __name__ == "__main__":
print("turn on FM rx") print("turn on FM rx")
output(pd, 1) output(pd, 1)
output(ptt, 1) output(ptt, 1)
# GPIO.setmode(GPIO.BCM) # added to make Tx LED work on Pi 4
# setup(txLed, "out")
# GPIO.setup(powerPin, GPIO.OUT)
setup(squelch, "up") ## pull up in case pin is not connected setup(squelch, "up") ## pull up in case pin is not connected
# GPIO.output(powerPin, 1) # was 0
# txf = float(tx) - 288.9 # txf = float(tx) - 288.9
# print("Transmit frequency: ",txf) # print("Transmit frequency: ",txf)
if (command_tx != True): if (command_tx != True):
@ -963,10 +952,8 @@ if __name__ == "__main__":
while True: while True:
if (input(squelch) == False) and (command_tx == True): if (input(squelch) == False) and (command_tx == True):
print("Carrier detected, starting repeater") print("Carrier detected, starting repeater")
# GPIO.setmode(GPIO.BCM) # added to make Tx LED work on Pi Zero 2 and Pi 4
# setup(txLed, "out")
output(txLed, 1) output(txLed, 1)
system("sudo nc -l 8011 | csdr convert_i16_f | csdr gain_ff 16000 | csdr convert_f_samplerf 20833 | sudo rpitx -i- -m RF -f " + tx + "e3 > /dev/null 2>&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) sleep(0.5)
system("sudo arecord -D shared_mic -r48000 -fS16_LE -c1 | nc localhost 8011 &") system("sudo arecord -D shared_mic -r48000 -fS16_LE -c1 | nc localhost 8011 &")
while (input(squelch) == False): while (input(squelch) == False):
@ -988,9 +975,6 @@ if __name__ == "__main__":
output(pd, 1) output(pd, 1)
output(ptt, 1) output(ptt, 1)
# GPIO.setmode(GPIO.BCM) # added to make Tx LED work on Pi 4
# setup(txLed, "out")
if (command_tx == True): if (command_tx == True):
system("sudo nc -l 8080 | csdr convert_i16_f | csdr gain_ff 7000 | csdr convert_f_samplerf 20833 | sudo /home/pi/rpitx/rpitx -i- -m RF -f " + tx + "e3 &") system("sudo nc -l 8080 | csdr convert_i16_f | csdr gain_ff 7000 | csdr convert_f_samplerf 20833 | sudo /home/pi/rpitx/rpitx -i- -m RF -f " + tx + "e3 &")
print("Turning LED on/off and listening for carrier") print("Turning LED on/off and listening for carrier")
@ -1003,11 +987,7 @@ if __name__ == "__main__":
# output(txLed, 0) # output(txLed, 0)
# command_control_check() # command_control_check()
if (command_tx == True): if (command_tx == True):
# GPIO.setmode(GPIO.BCM) # added to make Tx LED work on Pi Zero 2 and Pi 4
# setup(txLed, "out")
output(txLed, 1) output(txLed, 1)
# print(txLed)
# print(1)
sleep(4.2) sleep(4.2)
else: else:
print("No Low Pass Filter so no telemetry transmit. See http://cubesatsim.org/wiki for instructions on how to build the LPF.") print("No Low Pass Filter so no telemetry transmit. See http://cubesatsim.org/wiki for instructions on how to build the LPF.")

Loading…
Cancel
Save

Powered by TurnKey Linux.