1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2025-05-31 06:12:26 -04:00

REST API Python examples: source formatting and exception Python3 compatibility

This commit is contained in:
f4exb 2018-09-09 19:52:27 +02:00
parent 7e97f62615
commit 5dfc60331c
12 changed files with 347 additions and 305 deletions

View File

@ -5,6 +5,7 @@ from optparse import OptionParser
base_url = "http://127.0.0.1:8091/sdrangel"
# ======================================================================
def getInputOptions():
@ -43,7 +44,7 @@ def main():
print("Error adding channel. HTTP: %d" % r.status_code)
print json.dumps(r.json(), indent=4, sort_keys=True)
except Exception, msg:
except Exception as ex:
tb = traceback.format_exc()
print >> sys.stderr, tb

View File

@ -73,7 +73,7 @@ def main():
print("All done!")
except Exception, msg:
except Exception as ex:
tb = traceback.format_exc()
print >> sys.stderr, tb

View File

@ -13,6 +13,7 @@ requests_methods = {
"DELETE": requests.delete
}
# ======================================================================
def getInputOptions():
@ -30,6 +31,7 @@ def getInputOptions():
return options
# ======================================================================
def printResponse(response):
content_type = response.headers.get("Content-Type", None)
@ -39,20 +41,22 @@ def printResponse(response):
elif "text/plain" in content_type:
print(response.text)
# ======================================================================
def callAPI(url, method, params, json, text):
request_method = requests_methods.get(method, None)
if request_method is not None:
r = request_method(url=base_url+url, params=params, json=json)
r = request_method(url=base_url + url, params=params, json=json)
if r.status_code / 100 == 2:
print(text + " succeeded")
printResponse(r)
return r.json() # all 200 yield application/json response
return r.json() # all 200 yield application/json response
else:
print(text + " failed")
printResponse(r)
return None
# ======================================================================
def main():
try:
@ -97,8 +101,8 @@ def main():
settings["NFMModSettings"]["cwKeyer"]["text"] = "VVV DE F4EXB "
settings["NFMModSettings"]["cwKeyer"]["loop"] = 1
settings["NFMModSettings"]["cwKeyer"]["mode"] = 1 # text
settings["NFMModSettings"]["modAFInput"] = 4 # CW text
settings["NFMModSettings"]["cwKeyer"]["mode"] = 1 # text
settings["NFMModSettings"]["modAFInput"] = 4 # CW text
settings["NFMModSettings"]["toneFrequency"] = 600
r = callAPI(deviceset_url + "/channel/0/settings", "PATCH", None, settings, "Change NFM mod")
@ -109,7 +113,7 @@ def main():
if r is None:
exit(-1)
except Exception, msg:
except Exception as ex:
tb = traceback.format_exc()
print >> sys.stderr, tb

View File

@ -13,6 +13,7 @@ requests_methods = {
"DELETE": requests.delete
}
# ======================================================================
def getInputOptions():
@ -26,6 +27,7 @@ def getInputOptions():
return options
# ======================================================================
def printResponse(response):
content_type = response.headers.get("Content-Type", None)
@ -35,20 +37,22 @@ def printResponse(response):
elif "text/plain" in content_type:
print(response.text)
# ======================================================================
def callAPI(url, method, params, json, text):
request_method = requests_methods.get(method, None)
if request_method is not None:
r = request_method(url=base_url+url, params=params, json=json)
r = request_method(url=base_url + url, params=params, json=json)
if r.status_code / 100 == 2:
print(text + " succeeded")
printResponse(r)
return r.json() # all 200 yield application/json response
return r.json() # all 200 yield application/json response
else:
print(text + " failed")
printResponse(r)
return None
# ======================================================================
def main():
try:
@ -79,14 +83,14 @@ def main():
settings["NFMModSettings"]["inputFrequencyOffset"] = 12500
settings["NFMModSettings"]["cwKeyer"]["text"] = "VVV DE F4EXB "
settings["NFMModSettings"]["cwKeyer"]["loop"] = 1
settings["NFMModSettings"]["cwKeyer"]["mode"] = 1 # text
settings["NFMModSettings"]["modAFInput"] = 4 # CW text
settings["NFMModSettings"]["cwKeyer"]["mode"] = 1 # text
settings["NFMModSettings"]["modAFInput"] = 4 # CW text
r = callAPI("/deviceset/1/channel/0/settings", "PATCH", None, settings, "Change NFM mod")
if r is None:
exit(-1)
except Exception, msg:
except Exception as ex:
tb = traceback.format_exc()
print >> sys.stderr, tb

View File

@ -16,6 +16,7 @@ from optparse import OptionParser
base_url = "http://127.0.0.1:8091/sdrangel"
# ======================================================================
def getInputOptions():
@ -34,9 +35,10 @@ def getInputOptions():
return options
# ======================================================================
def startDevice(deviceIndex):
dev_run_url = base_url+("/deviceset/%d/device/run" % deviceIndex)
dev_run_url = base_url + ("/deviceset/%d/device/run" % deviceIndex)
r = requests.get(url=dev_run_url)
if r.status_code / 100 == 2:
rj = r.json()
@ -55,9 +57,10 @@ def startDevice(deviceIndex):
else:
print("Error getting device %d running state" % deviceIndex)
# ======================================================================
def stopDevice(deviceIndex):
dev_run_url = base_url+("/deviceset/%d/device/run" % deviceIndex)
dev_run_url = base_url + ("/deviceset/%d/device/run" % deviceIndex)
r = requests.get(url=dev_run_url)
if r.status_code / 100 == 2:
rj = r.json()
@ -76,9 +79,10 @@ def stopDevice(deviceIndex):
else:
print("Error getting device %d running state" % deviceIndex)
# ======================================================================
def setFocus(deviceIndex):
dev_focus_url = base_url+("/deviceset/%d/focus" % deviceIndex)
dev_focus_url = base_url + ("/deviceset/%d/focus" % deviceIndex)
r = requests.patch(url=dev_focus_url)
if r.status_code / 100 == 2:
print("Focus set on device set %d" % deviceIndex)
@ -87,34 +91,35 @@ def setFocus(deviceIndex):
else:
print("Error setting focus on device set %d" % deviceIndex)
# ======================================================================
def main():
try:
options = getInputOptions()
global base_url
base_url = "http://%s/sdrangel" % options.address
r = requests.get(url=base_url+"/devicesets")
r = requests.get(url=base_url + "/devicesets")
if r.status_code / 100 == 2:
rj = r.json()
deviceSets = rj.get("deviceSets", None)
if deviceSets is not None:
if len(deviceSets) > 1:
if options.transmit:
if deviceSets[options.deviceset_index]["samplingDevice"]["tx"] == 0 and deviceSets[options.deviceset_index+1]["samplingDevice"]["tx"] == 1:
if deviceSets[options.deviceset_index]["samplingDevice"]["tx"] == 0 and deviceSets[options.deviceset_index + 1]["samplingDevice"]["tx"] == 1:
stopDevice(options.deviceset_index)
time.sleep(1)
startDevice(options.deviceset_index+1)
setFocus(options.deviceset_index+1)
startDevice(options.deviceset_index + 1)
setFocus(options.deviceset_index + 1)
else:
print("Incorrect configuration expecting Rx%d and Tx%d" % (options.deviceset_index, options.deviceset_index+1))
print("Incorrect configuration expecting Rx%d and Tx%d" % (options.deviceset_index, options.deviceset_index + 1))
else:
if deviceSets[options.deviceset_index-1]["samplingDevice"]["tx"] == 0 and deviceSets[options.deviceset_index]["samplingDevice"]["tx"] == 1:
if deviceSets[options.deviceset_index - 1]["samplingDevice"]["tx"] == 0 and deviceSets[options.deviceset_index]["samplingDevice"]["tx"] == 1:
stopDevice(options.deviceset_index)
time.sleep(1)
startDevice(options.deviceset_index-1)
setFocus(options.deviceset_index-1)
startDevice(options.deviceset_index - 1)
setFocus(options.deviceset_index - 1)
else:
print("Incorrect configuration expecting Rx%d and Tx%d" % (options.deviceset_index-1, options.deviceset_index))
print("Incorrect configuration expecting Rx%d and Tx%d" % (options.deviceset_index - 1, options.deviceset_index))
else:
print("Need at least a Rx and a Tx device set")
else:
@ -122,7 +127,7 @@ def main():
else:
print("Error getting device sets configuration")
except Exception, msg:
except Exception as ex:
tb = traceback.format_exc()
print >> sys.stderr, tb

View File

@ -11,29 +11,32 @@ requests_methods = {
"DELETE": requests.delete
}
def getHwType():
r = requests.get(url=base_url+"/deviceset/0")
if r.status_code / 100 == 2:
r = requests.get(url=base_url + "/deviceset/0")
if r.status_code / 100 == 2:
rj = r.json()
devj = rj.get('samplingDevice', None)
if devj is not None:
return devj.get('hwType' ,None)
return devj.get('hwType' , None)
else:
return None
else:
return None
def selectRtlSdr():
r = requests.put(url=base_url+"/deviceset/0/device", json={"hwType": "RTLSDR"})
if r.status_code / 100 == 2:
r = requests.put(url=base_url + "/deviceset/0/device", json={"hwType": "RTLSDR"})
if r.status_code / 100 == 2:
print json.dumps(r.json(), indent=4, sort_keys=True)
return True
else:
return False
def getRtlSdrSettings():
r = requests.get(url=base_url+"/deviceset/0/device/settings")
if r.status_code / 100 == 2:
r = requests.get(url=base_url + "/deviceset/0/device/settings")
if r.status_code / 100 == 2:
rj = r.json()
hwType = rj.get('deviceHwType', None)
if hwType is not None and hwType == "RTLSDR":
@ -44,20 +47,22 @@ def getRtlSdrSettings():
else:
return None
def patchRtlSdrSettings(settings):
new_settings = {"deviceHwType": "RTLSDR", "tx": 0, "rtlSdrSettings": settings}
r = requests.patch(url=base_url+"/deviceset/0/device/settings", json=new_settings)
if r.status_code / 100 == 2:
r = requests.patch(url=base_url + "/deviceset/0/device/settings", json=new_settings)
if r.status_code / 100 == 2:
print json.dumps(r.json(), indent=4, sort_keys=True)
else:
print "Error HTTP:", r.status_code
def deviceRun(run):
if run:
r = requests.post(url=base_url+"/deviceset/0/device/run")
r = requests.post(url=base_url + "/deviceset/0/device/run")
else:
r = requests.delete(url=base_url+"/deviceset/0/device/run")
if r.status_code / 100 == 2:
r = requests.delete(url=base_url + "/deviceset/0/device/run")
if r.status_code / 100 == 2:
print json.dumps(r.json(), indent=4, sort_keys=True)
else:
print "Error HTTP:", r.status_code
@ -83,4 +88,3 @@ def main():
if __name__ == "__main__":
main()

View File

@ -358,10 +358,7 @@ def main():
time.sleep(1)
setup_audio(options)
# if options.channel_id == "BFMDemod":
# channelsReport(deviceset_url)
except Exception, msg:
except Exception as ex:
tb = traceback.format_exc()
print >> sys.stderr, tb

View File

@ -13,6 +13,7 @@ requests_methods = {
"DELETE": requests.delete
}
# ======================================================================
def getInputOptions():
@ -59,6 +60,7 @@ def getInputOptions():
return options
# ======================================================================
def printResponse(response):
content_type = response.headers.get("Content-Type", None)
@ -68,20 +70,22 @@ def printResponse(response):
elif "text/plain" in content_type:
print(response.text)
# ======================================================================
def callAPI(url, method, params, json, text):
request_method = requests_methods.get(method, None)
if request_method is not None:
r = request_method(url=base_url+url, params=params, json=json)
r = request_method(url=base_url + url, params=params, json=json)
if r.status_code / 100 == 2:
print(text + " succeeded")
printResponse(r)
return r.json() # all 200 yield application/json response
return r.json() # all 200 yield application/json response
else:
print(text + " failed")
printResponse(r)
return None
# ======================================================================
def main():
try:
@ -96,12 +100,12 @@ def main():
nb_devicesets = r['devicesetcount']
if nb_devicesets == 0: # server starts without device set so add Rx device set
if nb_devicesets == 0: # server starts without device set so add Rx device set
r1 = callAPI("/deviceset", "POST", {"tx": 0}, None, "Add Rx device set")
if r1 is None:
exit(-1)
### Rx setup
# ## Rx setup
deviceset_index_rx = 0
deviceset_url = "/deviceset/%d" % deviceset_index_rx
@ -116,10 +120,10 @@ def main():
if options.device_hwid_rx == "LimeSDR":
settings["limeSdrInputSettings"]["antennaPath"] = options.antenna_path_rx
settings["limeSdrInputSettings"]["devSampleRate"] = options.sample_rate_rx*1000
settings["limeSdrInputSettings"]["devSampleRate"] = options.sample_rate_rx * 1000
settings["limeSdrInputSettings"]["log2HardDecim"] = 4
settings["limeSdrInputSettings"]["log2SoftDecim"] = 3
settings["limeSdrInputSettings"]["centerFrequency"] = options.device_freq*1000 + 500000
settings["limeSdrInputSettings"]["centerFrequency"] = options.device_freq * 1000 + 500000
settings["limeSdrInputSettings"]["ncoEnable"] = 1
settings["limeSdrInputSettings"]["ncoFrequency"] = -500000
settings["limeSdrInputSettings"]["lpfBW"] = 1450000
@ -127,17 +131,17 @@ def main():
settings["limeSdrInputSettings"]["lpfFIREnable"] = 1
settings['limeSdrInputSettings']['dcBlock'] = 1
elif options.device_hwid_rx == "RTLSDR":
settings['rtlSdrSettings']['devSampleRate'] = options.sample_rate_rx*1000
settings['rtlSdrSettings']['centerFrequency'] = options.device_freq*1000
settings['rtlSdrSettings']['devSampleRate'] = options.sample_rate_rx * 1000
settings['rtlSdrSettings']['centerFrequency'] = options.device_freq * 1000
settings['rtlSdrSettings']['gain'] = 496
settings['rtlSdrSettings']['log2Decim'] = 4
settings['rtlSdrSettings']['dcBlock'] = 1
settings['rtlSdrSettings']['agc'] = 1
elif options.device_hwid_rx == "HackRF":
settings['hackRFInputSettings']['LOppmTenths'] = -51
settings['hackRFInputSettings']['centerFrequency'] = options.device_freq*1000
settings['hackRFInputSettings']['centerFrequency'] = options.device_freq * 1000
settings['hackRFInputSettings']['dcBlock'] = 1
settings['hackRFInputSettings']['devSampleRate'] = options.sample_rate_rx*1000
settings['hackRFInputSettings']['devSampleRate'] = options.sample_rate_rx * 1000
settings['hackRFInputSettings']['lnaExt'] = 1
settings['hackRFInputSettings']['lnaGain'] = 32
settings['hackRFInputSettings']['log2Decim'] = 4
@ -179,7 +183,7 @@ def main():
if r is None:
exit(-1)
### Tx setup
# ## Tx setup
r = callAPI("/deviceset", "POST", {"tx": 1}, None, "Add Tx device set")
if r is None:
@ -197,10 +201,10 @@ def main():
if options.device_hwid_tx == "LimeSDR":
settings["limeSdrOutputSettings"]["antennaPath"] = options.antenna_path_tx
settings["limeSdrOutputSettings"]["devSampleRate"] = options.sample_rate_tx*1000
settings["limeSdrOutputSettings"]["devSampleRate"] = options.sample_rate_tx * 1000
settings["limeSdrOutputSettings"]["log2HardInterp"] = 4
settings["limeSdrOutputSettings"]["log2SoftInterp"] = 4
settings["limeSdrOutputSettings"]["centerFrequency"] = options.device_freq*1000 + 500000
settings["limeSdrOutputSettings"]["centerFrequency"] = options.device_freq * 1000 + 500000
settings["limeSdrOutputSettings"]["ncoEnable"] = 1
settings["limeSdrOutputSettings"]["ncoFrequency"] = -500000
settings["limeSdrOutputSettings"]["lpfBW"] = 4050000
@ -208,8 +212,8 @@ def main():
settings["limeSdrOutputSettings"]["lpfFIREnable"] = 1
elif options.device_hwid_tx == "HackRF":
settings['hackRFOutputSettings']['LOppmTenths'] = -51
settings['hackRFOutputSettings']['centerFrequency'] = options.device_freq*1000
settings['hackRFOutputSettings']['devSampleRate'] = options.sample_rate_tx*1000
settings['hackRFOutputSettings']['centerFrequency'] = options.device_freq * 1000
settings['hackRFOutputSettings']['devSampleRate'] = options.sample_rate_tx * 1000
settings['hackRFOutputSettings']['lnaExt'] = 0
settings['hackRFOutputSettings']['log2Interp'] = 4
settings['hackRFOutputSettings']['vgaGain'] = 24
@ -230,8 +234,8 @@ def main():
settings["NFMModSettings"]["inputFrequencyOffset"] = options.channel_freq
settings["NFMModSettings"]["cwKeyer"]["text"] = "VVV DE F4EXB "
settings["NFMModSettings"]["cwKeyer"]["loop"] = 1
settings["NFMModSettings"]["cwKeyer"]["mode"] = 1 # text
settings["NFMModSettings"]["modAFInput"] = 4 # CW text
settings["NFMModSettings"]["cwKeyer"]["mode"] = 1 # text
settings["NFMModSettings"]["modAFInput"] = 4 # CW text
settings["NFMModSettings"]["toneFrequency"] = 600
r = callAPI(deviceset_url + "/channel/0/settings", "PATCH", None, settings, "Change NFM mod")
@ -244,8 +248,7 @@ def main():
if r is None:
exit(-1)
except Exception, msg:
except Exception as ex:
tb = traceback.format_exc()
print >> sys.stderr, tb

View File

@ -28,20 +28,23 @@ requests_methods = {
"DELETE": requests.delete
}
# ======================================================================
class ScanControl:
def __init__(self, num_channels, channel_step, start_freq, stop_freq, log2_decim):
self.channel_shifts = []
if num_channels < 2:
self.channel_shifts = [0]
limit = 0
else:
limit = ((num_channels-1)*channel_step) / 2
limit = ((num_channels - 1) * channel_step) / 2
self.channel_shifts = list(np.linspace(-limit, limit, num_channels))
self.device_start_freq = start_freq + limit
self.device_stop_freq = stop_freq - limit
self.device_step_freq = 2*limit + channel_step
self.device_sample_rate = (2*limit + channel_step)*(1<<log2_decim)
self.device_step_freq = 2 * limit + channel_step
self.device_sample_rate = (2 * limit + channel_step) * (1 << log2_decim)
# ======================================================================
def getInputOptions():
@ -56,7 +59,7 @@ def getInputOptions():
parser.add_option("-s", "--freq-step", dest="freq_step", help="frequency step (Hz)", metavar="FREQUENCY", type="float", default=12500)
parser.add_option("-S", "--freq-start", dest="freq_start", help="frequency start (Hz)", metavar="FREQUENCY", type="int", default=446006250)
parser.add_option("-T", "--freq-stop", dest="freq_stop", help="frequency stop (Hz)", metavar="FREQUENCY", type="int", default=446193750)
parser.add_option("-b", "--af-bw", dest="af_bw", help="audio babdwidth (kHz)", metavar="FREQUENCY_KHZ", type="int" ,default=3)
parser.add_option("-b", "--af-bw", dest="af_bw", help="audio babdwidth (kHz)", metavar="FREQUENCY_KHZ", type="int" , default=3)
parser.add_option("-r", "--rf-bw", dest="rf_bw", help="RF babdwidth (Hz). Sets to nearest available", metavar="FREQUENCY", type="int", default=10000)
parser.add_option("--vol", dest="volume", help="audio volume", metavar="VOLUME", type="float", default=1.0)
parser.add_option("-c", "--create", dest="create", help="create a new device set", metavar="BOOLEAN", action="store_true", default=False)
@ -71,8 +74,8 @@ def getInputOptions():
parser.add_option("--re-run", dest="rerun", help="re run with given parameters without setting up device and channels", metavar="BOOLEAN", action="store_true", default=False)
parser.add_option("-x", "--excl-list", dest="excl_fstr", help="frequencies (in Hz) exclusion comma separated list", metavar="LIST", type="string")
parser.add_option("--excl-tol", dest="excl_tol", help="match tolerance interval (in Hz) for exclusion frequencies", metavar="FREQUENCY", type="float", default=10.0)
parser.add_option("-v", "--verbosity", dest="verbosity", help="verbosity level", metavar="LEVEL_INT", type="int", default = 0)
parser.add_option("-L", "--delay", dest="delay", help="delay in number of settling time periods before resuming scan", metavar="NUMBER", type="int", default = 5)
parser.add_option("-v", "--verbosity", dest="verbosity", help="verbosity level", metavar="LEVEL_INT", type="int", default=0)
parser.add_option("-L", "--delay", dest="delay", help="delay in number of settling time periods before resuming scan", metavar="NUMBER", type="int", default=5)
(options, args) = parser.parse_args()
@ -82,7 +85,7 @@ def getInputOptions():
if options.excl_fstr is not None:
excl_flist_str = options.excl_fstr.split(',')
try:
options.excl_flist = list(map(lambda x:round(float(x)/options.excl_tol), excl_flist_str))
options.excl_flist = list(map(lambda x:round(float(x) / options.excl_tol), excl_flist_str))
print(options.excl_flist)
except ValueError:
print("Invalid exclusion frequencies list: %s" % options.excl_fstr)
@ -95,6 +98,7 @@ def getInputOptions():
return options
# ======================================================================
def setupDevice(scan_control, options):
settings = callAPI(deviceset_url + "/device/settings", "GET", None, None, "Get device settings")
@ -134,7 +138,7 @@ def setupDevice(scan_control, options):
settings['rtlSdrSettings']['loPpmCorrection'] = int(options.lo_ppm)
settings['rtlSdrSettings']['rfBandwidth'] = scan_control.device_step_freq + 100000
elif options.device_hwid == "HackRF":
settings['hackRFInputSettings']['LOppmTenths'] = int(options.lo_ppm * 10) # in tenths of PPM
settings['hackRFInputSettings']['LOppmTenths'] = int(options.lo_ppm * 10) # in tenths of PPM
settings['hackRFInputSettings']['centerFrequency'] = scan_control.device_start_freq
settings['hackRFInputSettings']['fcPos'] = options.fc_pos
settings['hackRFInputSettings']['dcBlock'] = options.fc_pos == 2
@ -149,6 +153,7 @@ def setupDevice(scan_control, options):
if r is None:
exit(-1)
# ======================================================================
def changeDeviceFrequency(fc, options):
settings = callAPI(deviceset_url + "/device/settings", "GET", None, None, "Get device settings")
@ -168,6 +173,7 @@ def changeDeviceFrequency(fc, options):
if r is None:
exit(-1)
# ======================================================================
def setupChannels(scan_control, options):
i = 0
@ -185,8 +191,8 @@ def setupChannels(scan_control, options):
settings["NFMDemodSettings"]["afBandwidth"] = options.af_bw * 1000
settings["NFMDemodSettings"]["rfBandwidth"] = options.rf_bw
settings["NFMDemodSettings"]["volume"] = options.volume
settings["NFMDemodSettings"]["squelch"] = options.squelch_db * 10 # centi-Bels
settings["NFMDemodSettings"]["squelchGate"] = options.squelch_gate / 10 # 10's of ms
settings["NFMDemodSettings"]["squelch"] = options.squelch_db * 10 # centi-Bels
settings["NFMDemodSettings"]["squelchGate"] = options.squelch_gate / 10 # 10's of ms
settings["NFMDemodSettings"]["title"] = "Channel %d" % i
elif options.channel_id == "AMDemod":
settings["AMDemodSettings"]["inputFrequencyOffset"] = int(shift)
@ -194,7 +200,7 @@ def setupChannels(scan_control, options):
settings["AMDemodSettings"]["volume"] = options.volume
settings["AMDemodSettings"]["squelch"] = options.squelch_db
settings["AMDemodSettings"]["title"] = "Channel %d" % i
settings["AMDemodSettings"]["bandpassEnable"] = 1 # bandpass filter
settings["AMDemodSettings"]["bandpassEnable"] = 1 # bandpass filter
elif options.channel_id == "DSDDemod":
settings["DSDDemodSettings"]["inputFrequencyOffset"] = int(shift)
settings["DSDDemodSettings"]["rfBandwidth"] = options.rf_bw
@ -212,6 +218,7 @@ def setupChannels(scan_control, options):
i += 1
# ======================================================================
def checkScanning(fc, options, display_message):
reports = callAPI(deviceset_url + "/channels/report", "GET", None, None, "Get channels report")
@ -222,18 +229,19 @@ def checkScanning(fc, options, display_message):
channel = reports["channels"][i]
if "report" in channel:
if reportKey in channel["report"]:
if options.channel_id == "DSDDemod": # DSD is special because it only stops on voice
if options.channel_id == "DSDDemod": # DSD is special because it only stops on voice
stopCondition = channel["report"][reportKey]["slot1On"] == 1 or channel["report"][reportKey]["slot2On"] == 1
else:
stopCondition = channel["report"][reportKey]["squelch"] == 1
if stopCondition:
f_channel = channel["deltaFrequency"]+fc
f_frac = round(f_channel/options.excl_tol)
f_channel = channel["deltaFrequency"] + fc
f_frac = round(f_channel / options.excl_tol)
if f_frac not in options.excl_flist:
if display_message: # display message only when stopping for the first time
print("%s Stopped at %d Hz" % (datetime.datetime.now().strftime("%H:%M:%S"),f_frac*options.excl_tol))
return False # stop scanning
return True # continue scanning
if display_message: # display message only when stopping for the first time
print("%s Stopped at %d Hz" % (datetime.datetime.now().strftime("%H:%M:%S"), f_frac * options.excl_tol))
return False # stop scanning
return True # continue scanning
# ======================================================================
def printResponse(response):
@ -244,17 +252,18 @@ def printResponse(response):
elif "text/plain" in content_type:
print(response.text)
# ======================================================================
def callAPI(url, method, params, json, text):
request_method = requests_methods.get(method, None)
if request_method is not None:
r = request_method(url=base_url+url, params=params, json=json)
r = request_method(url=base_url + url, params=params, json=json)
if r.status_code / 100 == 2:
if verbosity >= 1:
print(text + " succeeded")
if verbosity >= 2:
printResponse(r)
return r.json() # all 200 yield application/json response
return r.json() # all 200 yield application/json response
else:
if verbosity >= 1:
print(text + " failed")
@ -262,6 +271,7 @@ def callAPI(url, method, params, json, text):
printResponse(r)
return None
# ======================================================================
def main():
try:
@ -284,14 +294,14 @@ def main():
nb_steps = 0
fc = scan_control.device_start_freq
while fc <= scan_control.device_stop_freq:
freqs += [x+fc for x in scan_control.channel_shifts]
freqs += [x + fc for x in scan_control.channel_shifts]
fc += scan_control.device_step_freq
nb_steps += 1
print("Scanned frequencies: %s" % freqs)
print("Skipped frequencies: %s" % options.excl_flist)
print("In %d steps" % nb_steps)
if options.mock: # Stop there if we are just mocking (no API access)
if options.mock: # Stop there if we are just mocking (no API access)
exit(0)
global base_url
@ -302,7 +312,7 @@ def main():
global deviceset_url
deviceset_url = "/deviceset/%d" % options.device_index
if not options.rerun: # Skip device and channels settings in re-run mode
if not options.rerun: # Skip device and channels settings in re-run mode
if options.create:
r = callAPI("/deviceset", "POST", {"tx": 0}, None, "Add Rx device set")
if r is None:
@ -335,7 +345,7 @@ def main():
resume_delay = 0
while True:
time.sleep(options.settling_time)
scanning = checkScanning(fc, options, scanning and resume_delay == 0) # shall we move on ?
scanning = checkScanning(fc, options, scanning and resume_delay == 0) # shall we move on ?
if scanning:
if resume_delay > 0:
resume_delay -= 1
@ -361,7 +371,7 @@ def main():
except KeyboardInterrupt:
pass
except Exception, msg:
except Exception as ex:
tb = traceback.format_exc()
print >> sys.stderr, tb

View File

@ -5,6 +5,7 @@ from optparse import OptionParser
base_url = "http://127.0.0.1:8091/sdrangel"
# ======================================================================
def getInputOptions():
@ -32,11 +33,12 @@ def getInputOptions():
return options
# ======================================================================
def startDevice(deviceIndex):
dev_run_url = base_url+("/deviceset/%d/device/run" % deviceIndex)
dev_run_url = base_url + ("/deviceset/%d/device/run" % deviceIndex)
r = requests.get(url=dev_run_url)
if r.status_code / 100 == 2:
if r.status_code / 100 == 2:
rj = r.json()
state = rj.get("state", None)
if state is not None:
@ -53,11 +55,12 @@ def startDevice(deviceIndex):
else:
print("Error getting device %d running state" % deviceIndex)
# ======================================================================
def stopDevice(deviceIndex):
dev_run_url = base_url+("/deviceset/%d/device/run" % deviceIndex)
dev_run_url = base_url + ("/deviceset/%d/device/run" % deviceIndex)
r = requests.get(url=dev_run_url)
if r.status_code / 100 == 2:
if r.status_code / 100 == 2:
rj = r.json()
state = rj.get("state", None)
if state is not None:
@ -74,14 +77,15 @@ def stopDevice(deviceIndex):
else:
print("Error getting device %d running state" % deviceIndex)
# ======================================================================
def main():
try:
options = getInputOptions()
global base_url
base_url = "http://%s/sdrangel" % options.address
r = requests.get(url=base_url+"/devicesets")
if r.status_code / 100 == 2:
r = requests.get(url=base_url + "/devicesets")
if r.status_code / 100 == 2:
rj = r.json()
deviceSets = rj.get("deviceSets", None)
if deviceSets is not None:
@ -97,7 +101,7 @@ def main():
else:
print("Error getting device sets configuration")
except Exception, msg:
except Exception as ex:
tb = traceback.format_exc()
print >> sys.stderr, tb

View File

@ -13,6 +13,7 @@ requests_methods = {
"DELETE": requests.delete
}
# ======================================================================
def getInputOptions():
@ -26,6 +27,7 @@ def getInputOptions():
return options
# ======================================================================
def printResponse(response):
content_type = response.headers.get("Content-Type", None)
@ -35,20 +37,22 @@ def printResponse(response):
elif "text/plain" in content_type:
print(response.text)
# ======================================================================
def callAPI(url, method, params, json, text):
request_method = requests_methods.get(method, None)
if request_method is not None:
r = request_method(url=base_url+url, params=params, json=json)
if r.status_code / 100 == 2:
r = request_method(url=base_url + url, params=params, json=json)
if r.status_code / 100 == 2:
print(text + " succeeded")
printResponse(r)
return r.json() # all 200 yield application/json response
return r.json() # all 200 yield application/json response
else:
print(text + " failed")
printResponse(r)
return None
# ======================================================================
def main():
try:
@ -61,7 +65,7 @@ def main():
if settings is None:
exit(-1)
except Exception, msg:
except Exception as ex:
tb = traceback.format_exc()
print >> sys.stderr, tb

View File

@ -14,6 +14,7 @@ requests_methods = {
"DELETE": requests.delete
}
# ======================================================================
def getInputOptions():
@ -64,6 +65,7 @@ def getInputOptions():
return options
# ======================================================================
def printResponse(response):
content_type = response.headers.get("Content-Type", None)
@ -73,36 +75,39 @@ def printResponse(response):
elif "text/plain" in content_type:
print(response.text)
# ======================================================================
def callAPI(url, method, params, json, text):
request_method = requests_methods.get(method, None)
if request_method is not None:
r = request_method(url=base_url+url, params=params, json=json)
r = request_method(url=base_url + url, params=params, json=json)
if r.status_code / 100 == 2:
print(text + " succeeded")
printResponse(r)
return r.json() # all 200 yield application/json response
return r.json() # all 200 yield application/json response
else:
print(text + " failed")
printResponse(r)
return None
# ======================================================================
def setupBladeRFXB200(fc):
if fc < 50000:
return 5 # BLADERF_XB200_AUTO_3DB
return 5 # BLADERF_XB200_AUTO_3DB
elif fc < 54000:
return 0 # BLADERF_XB200_50M
return 0 # BLADERF_XB200_50M
elif fc < 144000:
return 5 # BLADERF_XB200_AUTO_3DB
return 5 # BLADERF_XB200_AUTO_3DB
elif fc < 148000:
return 1 # BLADERF_XB200_144M
return 1 # BLADERF_XB200_144M
elif fc < 222000:
return 5 # BLADERF_XB200_AUTO_3DB
return 5 # BLADERF_XB200_AUTO_3DB
elif fc < 225000:
return 2 # BLADERF_XB200_222M
return 2 # BLADERF_XB200_222M
else:
return 5 # BLADERF_XB200_AUTO_3DB
return 5 # BLADERF_XB200_AUTO_3DB
# ======================================================================
def setupDevice(options):
@ -111,17 +116,17 @@ def setupDevice(options):
exit(-1)
# calculate RF analog and FIR optimal bandpass filters bandwidths
lpFIRBW = options.sample_rate / (1<<options.log2_interp)
lpFIRBW = options.sample_rate / (1 << options.log2_interp)
lpfBW = lpFIRBW * 1.2
if options.device_hwid == "BladeRF":
settings['bladeRFOutputSettings']['centerFrequency'] = options.device_freq*1000
settings['bladeRFOutputSettings']['centerFrequency'] = options.device_freq * 1000
settings['bladeRFOutputSettings']['devSampleRate'] = options.sample_rate
settings['bladeRFOutputSettings']['vga1'] = -20
settings['bladeRFOutputSettings']['vga2'] = 6
settings['bladeRFOutputSettings']['bandwidth'] = 1500*1000
settings['bladeRFOutputSettings']['bandwidth'] = 1500 * 1000
settings['bladeRFOutputSettings']['log2Interp'] = options.log2_interp
settings['bladeRFOutputSettings']['xb200'] = 1 # assume XB200 is mounted
settings['bladeRFOutputSettings']['xb200'] = 1 # assume XB200 is mounted
settings['bladeRFOutputSettings']['xb200Path'] = 1 if options.device_freq < 300000 else 0
settings['bladeRFOutputSettings']['xb200Filter'] = setupBladeRFXB200(options.device_freq)
elif options.device_hwid == "LimeSDR":
@ -129,7 +134,7 @@ def setupDevice(options):
settings["limeSdrOutputSettings"]["devSampleRate"] = options.sample_rate
settings["limeSdrOutputSettings"]["log2HardInterp"] = options.log2_interp_hard
settings["limeSdrOutputSettings"]["log2SoftInterp"] = options.log2_interp
settings["limeSdrOutputSettings"]["centerFrequency"] = options.device_freq*1000 + 500000
settings["limeSdrOutputSettings"]["centerFrequency"] = options.device_freq * 1000 + 500000
settings["limeSdrOutputSettings"]["ncoEnable"] = 1
settings["limeSdrOutputSettings"]["ncoFrequency"] = -500000
settings["limeSdrOutputSettings"]["lpfBW"] = 4050000
@ -141,14 +146,14 @@ def setupDevice(options):
settings["plutoSdrOutputSettings"]["devSampleRate"] = options.sample_rate
settings["plutoSdrOutputSettings"]["lpfFIRlog2Interp"] = options.log2_interp_hard
settings["plutoSdrOutputSettings"]["log2Interp"] = options.log2_interp
settings["plutoSdrOutputSettings"]["centerFrequency"] = options.device_freq*1000
settings["plutoSdrOutputSettings"]["centerFrequency"] = options.device_freq * 1000
settings["plutoSdrOutputSettings"]["lpfBW"] = lpfBW
settings["plutoSdrOutputSettings"]["lpfFIRBW"] = lpFIRBW
settings["plutoSdrOutputSettings"]["lpfFIREnable"] = 1
settings["plutoSdrOutputSettings"]["att"] = -24 # -6 dB
settings["plutoSdrOutputSettings"]["att"] = -24 # -6 dB
elif options.device_hwid == "HackRF":
settings['hackRFOutputSettings']['LOppmTenths'] = round(options.lo_ppm*10)
settings['hackRFOutputSettings']['centerFrequency'] = options.device_freq*1000
settings['hackRFOutputSettings']['LOppmTenths'] = round(options.lo_ppm * 10)
settings['hackRFOutputSettings']['centerFrequency'] = options.device_freq * 1000
settings['hackRFOutputSettings']['devSampleRate'] = options.sample_rate
settings['hackRFOutputSettings']['lnaExt'] = 0
settings['hackRFOutputSettings']['log2Interp'] = options.log2_interp
@ -158,6 +163,7 @@ def setupDevice(options):
if r is None:
exit(-1)
# ======================================================================
def setupChannel(options):
r = callAPI(deviceset_url + "/channel", "POST", None, {"channelType": options.channel_id, "tx": 1}, "Create modulator")
@ -173,16 +179,16 @@ def setupChannel(options):
settings["NFMModSettings"]["inputFrequencyOffset"] = options.channel_freq
settings["NFMModSettings"]["cwKeyer"]["text"] = "VVV DE F4EXB "
settings["NFMModSettings"]["cwKeyer"]["loop"] = 1
settings["NFMModSettings"]["cwKeyer"]["mode"] = 1 # text
settings["NFMModSettings"]["modAFInput"] = 4 # CW text
settings["NFMModSettings"]["cwKeyer"]["mode"] = 1 # text
settings["NFMModSettings"]["modAFInput"] = 4 # CW text
settings["NFMModSettings"]["toneFrequency"] = 600
elif options.channel_id == "AMMod":
settings["AMModSettings"]["title"] = "Test AM"
settings["AMModSettings"]["inputFrequencyOffset"] = options.channel_freq
settings["AMModSettings"]["cwKeyer"]["text"] = "VVV DE F4EXB "
settings["AMModSettings"]["cwKeyer"]["loop"] = 1
settings["AMModSettings"]["cwKeyer"]["mode"] = 1 # text
settings["AMModSettings"]["modAFInput"] = 4 # CW text
settings["AMModSettings"]["cwKeyer"]["mode"] = 1 # text
settings["AMModSettings"]["modAFInput"] = 4 # CW text
settings["AMModSettings"]["toneFrequency"] = 600
settings["AMModSettings"]["modFactor"] = 0.9
settings["AMModSettings"]["rfBandwidth"] = 7500
@ -190,25 +196,25 @@ def setupChannel(options):
settings["ATVModSettings"]["title"] = "Test ATV"
settings["ATVModSettings"]["inputFrequencyOffset"] = options.channel_freq
settings["ATVModSettings"]["rfBandwidth"] = 30000
settings["ATVModSettings"]["forceDecimator"] = 1 # This is to engage filter
settings["ATVModSettings"]["forceDecimator"] = 1 # This is to engage filter
if options.image_file is not None:
settings["ATVModSettings"]["imageFileName"] = options.image_file
settings["ATVModSettings"]["atvModInput"] = 6 # m_atvModulation
settings["ATVModSettings"]["atvModInput"] = 6 # m_atvModulation
elif options.video_file is not None:
settings["ATVModSettings"]["videoFileName"] = options.video_file
settings["ATVModSettings"]["atvModInput"] = 7 # ATVModInputVideo
settings["ATVModSettings"]["atvModInput"] = 7 # ATVModInputVideo
settings["ATVModSettings"]["videoPlayLoop"] = 1
settings["ATVModSettings"]["videoPlay"] = 1
else:
settings["ATVModSettings"]["atvModInput"] = 1 # ATVModInputHBars
settings["ATVModSettings"]["atvModInput"] = 1 # ATVModInputHBars
settings["ATVModSettings"]["atvStd"] = 5 # ATVStdHSkip
settings["ATVModSettings"]["atvModulation"] = 1 # ATVModulationFM
settings["ATVModSettings"]["atvStd"] = 5 # ATVStdHSkip
settings["ATVModSettings"]["atvModulation"] = 1 # ATVModulationFM
settings["ATVModSettings"]["fps"] = 2
settings["ATVModSettings"]["nbLines"] = 90
settings["ATVModSettings"]["uniformLevel"] = 1.0 # 100% white
settings["ATVModSettings"]["fmExcursion"] = 0.2 # FM excursion is 20% of channel bandwidth
settings["ATVModSettings"]["uniformLevel"] = 1.0 # 100% white
settings["ATVModSettings"]["fmExcursion"] = 0.2 # FM excursion is 20% of channel bandwidth
settings["ATVModSettings"]["overlayText"] = "F4EXB"
settings["ATVModSettings"]["showOverlayText"] = 1
elif options.channel_id == "SSBMod":
@ -216,8 +222,8 @@ def setupChannel(options):
settings["SSBModSettings"]["inputFrequencyOffset"] = options.channel_freq
settings["SSBModSettings"]["cwKeyer"]["text"] = "VVV DE F4EXB "
settings["SSBModSettings"]["cwKeyer"]["loop"] = 1
settings["SSBModSettings"]["cwKeyer"]["mode"] = 1 # text
settings["SSBModSettings"]["modAFInput"] = 4 # CW text
settings["SSBModSettings"]["cwKeyer"]["mode"] = 1 # text
settings["SSBModSettings"]["modAFInput"] = 4 # CW text
settings["SSBModSettings"]["toneFrequency"] = 600
settings["SSBModSettings"]["bandwidth"] = 1000
settings["SSBModSettings"]["lowCut"] = 300
@ -231,7 +237,7 @@ def setupChannel(options):
settings["UDPSinkSettings"]["udpAddress"] = "127.0.0.1"
settings["UDPSinkSettings"]["udpPort"] = 9998
settings["UDPSinkSettings"]["inputSampleRate"] = 48000
settings["UDPSinkSettings"]["sampleFormat"] = 1 # FormatNFM
settings["UDPSinkSettings"]["sampleFormat"] = 1 # FormatNFM
settings["UDPSinkSettings"]["gainIn"] = 2.5
settings["UDPSinkSettings"]["gainOut"] = 2.8
elif options.channel_id == "WFMMod":
@ -239,8 +245,8 @@ def setupChannel(options):
settings["WFMModSettings"]["inputFrequencyOffset"] = options.channel_freq
settings["WFMModSettings"]["cwKeyer"]["text"] = "VVV DE F4EXB "
settings["WFMModSettings"]["cwKeyer"]["loop"] = 1
settings["WFMModSettings"]["cwKeyer"]["mode"] = 1 # text
settings["WFMModSettings"]["modAFInput"] = 4 # CW text
settings["WFMModSettings"]["cwKeyer"]["mode"] = 1 # text
settings["WFMModSettings"]["modAFInput"] = 4 # CW text
settings["WFMModSettings"]["toneFrequency"] = 600
settings["WFMModSettings"]["fmDeviation"] = 25000
settings["WFMModSettings"]["rfBandwidth"] = 75000
@ -278,7 +284,7 @@ def main():
if r is None:
exit(-1)
except Exception, msg:
except Exception as ex:
tb = traceback.format_exc()
print >> sys.stderr, tb