140 lines
3.9 KiB
Python
Executable File
140 lines
3.9 KiB
Python
Executable File
import math
|
|
import time
|
|
import pypredict
|
|
import subprocess
|
|
|
|
children = []
|
|
|
|
def pollall():
|
|
global children
|
|
try:
|
|
dead = [child for child in children if child.poll() is not None];
|
|
for child in dead:
|
|
children.remove(child)
|
|
except Exception as e:
|
|
print "Exception: "+str(e)
|
|
|
|
def runForDuration(cmdline, duration):
|
|
try:
|
|
child = subprocess.Popen(cmdline)
|
|
time.sleep(duration)
|
|
child.terminate()
|
|
except OSError as e:
|
|
print "OS Error during command: "+" ".join(cmdline)
|
|
print "OS Error: "+e.strerror
|
|
|
|
|
|
def recordSDR(freq, fname, duration):
|
|
sdrOffset = -50000
|
|
sdrRate = 20800*11
|
|
cmdline = ['rtl_sdr',\
|
|
'-f', str(freq+sdrOffset),\
|
|
'-s', str(sdrRate),\
|
|
fname+'.sdr']
|
|
runForDuration(cmdline, duration)
|
|
|
|
|
|
def decode(fname):
|
|
# cmdline = ['atpdec',fname+'.wav']
|
|
# subprocess.call(cmdline)
|
|
cmdline = ['python','-m','cqwx.APT',fname+'X5.wav',fname+'R.png',fname+'F.png']
|
|
try:
|
|
children.append(subprocess.Popen(cmdline)) # run in background
|
|
except OSError as e:
|
|
print e.strerror
|
|
|
|
def spectrum(fname,freq,duration):
|
|
flow = freq - 10000
|
|
fhigh = freq + 10000
|
|
fstep = 100
|
|
fparam = ":".join(map(str,[flow,fhigh,fstep]))
|
|
cmdline = ['rtl_power','-f',fparam,'-i','1m','-g','40',fname+'.csv']
|
|
runForDuration(cmdline,duration)
|
|
|
|
satellites = [\
|
|
{'name': 'NOAA-18',\
|
|
'freq': 137912500,\
|
|
'postProcess': decode },\
|
|
{'name': 'NOAA-19',\
|
|
'freq': 137100000,\
|
|
'postProcess': decode },\
|
|
{'name': 'NOAA-15',\
|
|
'freq': 137620000,\
|
|
'postProcess': decode },\
|
|
{'name': 'OSCAR-7',\
|
|
'freq': 145950000, \
|
|
'listen': recordSDR },\
|
|
{'name': 'FUNCUBE-1',\
|
|
'freq': 145950000, \
|
|
'listen': recordSDR },\
|
|
{'name': 'OSCAR-29',
|
|
'freq': 435850000, \
|
|
'listen': recordSDR },\
|
|
# {'name': 'OSCAR-50',\
|
|
# 'freq': 436795000,\
|
|
# },\
|
|
# {'name': 'ISS',\
|
|
# 'freq': 145800000 }\
|
|
]
|
|
|
|
sample = '20800'
|
|
wavrate='11025'
|
|
wav5rate ='20800'
|
|
|
|
def recordFM(freq, fname, duration):
|
|
# still experimenting with options - unsure as to best settings
|
|
cmdline = ['rtl_fm',\
|
|
'-f',str(freq),\
|
|
'-s',sample,\
|
|
'-g', '47',\
|
|
'-F','9',\
|
|
# '-A','fast',\
|
|
'-E','dc',\
|
|
fname+'.raw']
|
|
runForDuration(cmdline, duration)
|
|
|
|
def transcode(fname):
|
|
# todolist = [('.wav', wavrate), ('X5.wav', wav5rate)]
|
|
todolist = [('X5.wav', wav5rate)]
|
|
for (ext,rate) in todolist:
|
|
try:
|
|
cmdline = ['sox','-t','raw','-r',sample,'-es','-b','16','-c','1','-V1',fname+'.raw',fname+ext,'rate',rate]
|
|
subprocess.call(cmdline)
|
|
except OSError, e:
|
|
print "OSError on :"+" ".join(cmdline)
|
|
print "OSError:"+e.strerror
|
|
|
|
def recordWAV(freq,fname,duration):
|
|
recordFM(freq,fname,duration)
|
|
transcode(fname)
|
|
|
|
def findNextPass():
|
|
predictions = [pypredict.aoslos(s['name']) for s in satellites]
|
|
aoses = [p[0] for p in predictions]
|
|
nextIndex = aoses.index(min(aoses))
|
|
return (satellites[nextIndex],\
|
|
predictions[nextIndex])
|
|
|
|
while True:
|
|
pollall()
|
|
(sat, (aosTime, losTime)) = findNextPass()
|
|
satName = sat['name']
|
|
freq = sat['freq']
|
|
now = time.time()
|
|
towait = aosTime-now
|
|
if towait>0:
|
|
print "waiting "+str(towait)+" seconds for "+satName
|
|
time.sleep(towait)
|
|
# dir= sat name and filename = start time
|
|
fname='./'+satName+'/'+str(aosTime)
|
|
print "beginning pass "+fname+" predicted end "+str(losTime)
|
|
if 'listen' in sat:
|
|
sat['listen'](fname, freq, losTime-aosTime)
|
|
else:
|
|
recordWAV(freq,fname,losTime-aosTime)
|
|
if 'postProcess' in sat:
|
|
sat['postProcess'](fname) # analyze, make pictures, graphs, etc.
|
|
print "finished pass "+fname+" at "+str(time.time())
|
|
time.sleep(60.0)
|
|
|