rtlsdr-automated-wxsat-capture/multicapture.py

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)