mirror of
https://github.com/f4exb/sdrangel.git
synced 2024-11-25 17:28:50 -05:00
REST API Python examples: source formatting and exception Python3 compatibility
This commit is contained in:
parent
7e97f62615
commit
5dfc60331c
@ -5,22 +5,23 @@ from optparse import OptionParser
|
||||
|
||||
base_url = "http://127.0.0.1:8091/sdrangel"
|
||||
|
||||
|
||||
# ======================================================================
|
||||
def getInputOptions():
|
||||
|
||||
parser = OptionParser(usage="usage: %%prog [-t]\n")
|
||||
parser.add_option("-a", "--address", dest="address", help="address and port", metavar="ADDRESS", type="string")
|
||||
parser.add_option("-d", "--device-index", dest="device_index", help="device set index", metavar="INDEX", type="int")
|
||||
parser.add_option("-a", "--address", dest="address", help="address and port", metavar="ADDRESS", type="string")
|
||||
parser.add_option("-d", "--device-index", dest="device_index", help="device set index", metavar="INDEX", type="int")
|
||||
parser.add_option("-c", "--channel-id", dest="channel_id", help="channel ID of channel to add", metavar="ID", type="string")
|
||||
|
||||
(options, args) = parser.parse_args()
|
||||
|
||||
|
||||
if options.address is None:
|
||||
options.address = "127.0.0.1:8888"
|
||||
|
||||
|
||||
if options.device_index is None or options.device_index < 0:
|
||||
options.device_index = 0
|
||||
|
||||
|
||||
if options.channel_id is None:
|
||||
print("Please specify channel Id")
|
||||
exit(1)
|
||||
@ -42,8 +43,8 @@ def main():
|
||||
else:
|
||||
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
|
||||
|
||||
|
@ -73,7 +73,7 @@ def main():
|
||||
|
||||
print("All done!")
|
||||
|
||||
except Exception, msg:
|
||||
except Exception as ex:
|
||||
tb = traceback.format_exc()
|
||||
print >> sys.stderr, tb
|
||||
|
||||
|
@ -13,23 +13,25 @@ requests_methods = {
|
||||
"DELETE": requests.delete
|
||||
}
|
||||
|
||||
|
||||
# ======================================================================
|
||||
def getInputOptions():
|
||||
|
||||
parser = OptionParser(usage="usage: %%prog [-t]\n")
|
||||
parser.add_option("-a", "--address", dest="address", help="address and port", metavar="ADDRESS", type="string")
|
||||
parser.add_option("-d", "--device-index", dest="device_index", help="device set index", metavar="INDEX", type="int")
|
||||
parser.add_option("-a", "--address", dest="address", help="address and port", metavar="ADDRESS", type="string")
|
||||
parser.add_option("-d", "--device-index", dest="device_index", help="device set index", metavar="INDEX", type="int")
|
||||
|
||||
(options, args) = parser.parse_args()
|
||||
|
||||
|
||||
if options.address == None:
|
||||
options.address = "127.0.0.1:8091"
|
||||
|
||||
|
||||
if options.device_index == None:
|
||||
options.device_index = 1
|
||||
|
||||
|
||||
return options
|
||||
|
||||
|
||||
# ======================================================================
|
||||
def printResponse(response):
|
||||
content_type = response.headers.get("Content-Type", None)
|
||||
@ -39,38 +41,40 @@ 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:
|
||||
options = getInputOptions()
|
||||
|
||||
|
||||
global base_url
|
||||
base_url = "http://%s/sdrangel" % options.address
|
||||
|
||||
|
||||
r = callAPI("/deviceset", "POST", {"tx": 1}, None, "Add Tx device set")
|
||||
if r is None:
|
||||
exit(-1)
|
||||
|
||||
|
||||
deviceset_url = "/deviceset/%d" % options.device_index
|
||||
|
||||
|
||||
r = callAPI(deviceset_url + "/device", "PUT", None, {"hwType": "LimeSDR", "tx": 1}, "setup LimeSDR on Tx device set")
|
||||
if r is None:
|
||||
exit(-1)
|
||||
|
||||
|
||||
settings = callAPI(deviceset_url + "/device/settings", "GET", None, None, "Get LimeSDR Tx settings")
|
||||
if settings is None:
|
||||
exit(-1)
|
||||
@ -81,35 +85,35 @@ def main():
|
||||
settings["limeSdrOutputSettings"]["ncoEnable"] = 1
|
||||
settings["limeSdrOutputSettings"]["ncoFrequency"] = -500000
|
||||
settings["limeSdrOutputSettings"]["lpfFIRBW"] = 100000
|
||||
settings["limeSdrOutputSettings"]["lpfFIREnable"] = 1
|
||||
|
||||
settings["limeSdrOutputSettings"]["lpfFIREnable"] = 1
|
||||
|
||||
r = callAPI(deviceset_url + "/device/settings", "PATCH", None, settings, "Patch LimeSDR Tx settings")
|
||||
if r is None:
|
||||
exit(-1)
|
||||
|
||||
|
||||
r = callAPI(deviceset_url + "/channel", "POST", None, {"channelType": "NFMMod", "tx": 1}, "Create NFM mod")
|
||||
if r is None:
|
||||
exit(-1)
|
||||
|
||||
|
||||
settings = callAPI(deviceset_url + "/channel/0/settings", "GET", None, None, "Get NFM mod settings")
|
||||
if settings is None:
|
||||
exit(-1)
|
||||
|
||||
|
||||
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")
|
||||
if r is None:
|
||||
exit(-1)
|
||||
|
||||
|
||||
r = callAPI(deviceset_url + "/device/run", "POST", None, None, "Start device on deviceset R1")
|
||||
if r is None:
|
||||
exit(-1)
|
||||
|
||||
except Exception, msg:
|
||||
|
||||
except Exception as ex:
|
||||
tb = traceback.format_exc()
|
||||
print >> sys.stderr, tb
|
||||
|
||||
|
@ -13,19 +13,21 @@ requests_methods = {
|
||||
"DELETE": requests.delete
|
||||
}
|
||||
|
||||
|
||||
# ======================================================================
|
||||
def getInputOptions():
|
||||
|
||||
parser = OptionParser(usage="usage: %%prog [-t]\n")
|
||||
parser.add_option("-a", "--address", dest="address", help="address and port", metavar="ADDRESS", type="string")
|
||||
parser.add_option("-a", "--address", dest="address", help="address and port", metavar="ADDRESS", type="string")
|
||||
|
||||
(options, args) = parser.parse_args()
|
||||
|
||||
|
||||
if (options.address == None):
|
||||
options.address = "127.0.0.1:8091"
|
||||
|
||||
|
||||
return options
|
||||
|
||||
|
||||
# ======================================================================
|
||||
def printResponse(response):
|
||||
content_type = response.headers.get("Content-Type", None)
|
||||
@ -35,58 +37,60 @@ 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:
|
||||
options = getInputOptions()
|
||||
|
||||
|
||||
global base_url
|
||||
base_url = "http://%s/sdrangel" % options.address
|
||||
|
||||
|
||||
settings = callAPI("/deviceset/0/channel", "POST", None, {"channelType": "NFMDemod", "tx": 0}, "Create NFM demod")
|
||||
if settings is None:
|
||||
exit(-1)
|
||||
|
||||
settings["NFMDemodSettings"]["inputFrequencyOffset"] = 12500
|
||||
settings["NFMDemodSettings"]["afBandwidth"] = 5000
|
||||
|
||||
|
||||
r = callAPI("/deviceset/0/channel/0/settings", "PATCH", None, settings, "Change NFM demod")
|
||||
if r is None:
|
||||
exit(-1)
|
||||
|
||||
|
||||
r = callAPI("/deviceset", "POST", {"tx": 1}, None, "Add Tx device set")
|
||||
if r is None:
|
||||
exit(-1)
|
||||
|
||||
|
||||
settings = callAPI("/deviceset/1/channel", "POST", None, {"channelType": "NFMMod", "tx": 1}, "Create NFM mod")
|
||||
if settings is None:
|
||||
exit(-1)
|
||||
|
||||
|
||||
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
|
||||
|
||||
|
@ -16,27 +16,29 @@ from optparse import OptionParser
|
||||
|
||||
base_url = "http://127.0.0.1:8091/sdrangel"
|
||||
|
||||
|
||||
# ======================================================================
|
||||
def getInputOptions():
|
||||
|
||||
parser = OptionParser(usage="usage: %prog [-a address:port] [-d index][-t]\n")
|
||||
parser.add_option("-a", "--address", dest="address", help="address and port", metavar="ADDRESS", type="string")
|
||||
parser.add_option("-a", "--address", dest="address", help="address and port", metavar="ADDRESS", type="string")
|
||||
parser.add_option("-t", "--transmit", dest="transmit", help="transmit", metavar="TRANSMIT", action="store_true", default=False)
|
||||
parser.add_option("-d", "--deviceset-index", dest="deviceset_index", help="index of currently active device set (Rx or Tx)", metavar="INDEX", type="int")
|
||||
|
||||
(options, args) = parser.parse_args()
|
||||
|
||||
|
||||
if options.address == None:
|
||||
options.address = "127.0.0.1:8091"
|
||||
|
||||
|
||||
if options.deviceset_index == None:
|
||||
options.deviceset_index = 0
|
||||
|
||||
|
||||
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()
|
||||
@ -75,10 +78,11 @@ def stopDevice(deviceIndex):
|
||||
print("Cannot get device %d running state" % 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)
|
||||
@ -86,43 +90,44 @@ def setFocus(deviceIndex):
|
||||
print("Set focus on device set is not supported in a server instance")
|
||||
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:
|
||||
print("Cannot get device sets configuration")
|
||||
print("Cannot get device sets configuration")
|
||||
else:
|
||||
print("Error getting device sets configuration")
|
||||
|
||||
except Exception, msg:
|
||||
|
||||
except Exception as ex:
|
||||
tb = traceback.format_exc()
|
||||
print >> sys.stderr, tb
|
||||
|
||||
|
@ -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":
|
||||
@ -43,26 +46,28 @@ def getRtlSdrSettings():
|
||||
return None
|
||||
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
|
||||
|
||||
|
||||
|
||||
|
||||
def main():
|
||||
hwType = getHwType()
|
||||
if hwType is not None:
|
||||
@ -79,8 +84,7 @@ def main():
|
||||
settings["gain"] = 445
|
||||
settings["centerFrequency"] = 433900000
|
||||
patchRtlSdrSettings(settings)
|
||||
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
|
@ -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
|
||||
|
||||
|
@ -13,52 +13,54 @@ requests_methods = {
|
||||
"DELETE": requests.delete
|
||||
}
|
||||
|
||||
|
||||
# ======================================================================
|
||||
def getInputOptions():
|
||||
|
||||
parser = OptionParser(usage="usage: %%prog [-t]\n")
|
||||
parser.add_option("-a", "--address", dest="address", help="address and port", metavar="ADDRESS", type="string")
|
||||
parser.add_option("-R", "--device-hwid-rx", dest="device_hwid_rx", help="device hardware id for Rx", metavar="HWID", type="string")
|
||||
parser.add_option("-T", "--device-hwid-tx", dest="device_hwid_tx", help="device hardware id for Tx", metavar="HWID", type="string")
|
||||
parser.add_option("-F", "--device-freq", dest="device_freq", help="device center frequency (kHz)", metavar="FREQ", type="int")
|
||||
parser.add_option("-a", "--address", dest="address", help="address and port", metavar="ADDRESS", type="string")
|
||||
parser.add_option("-R", "--device-hwid-rx", dest="device_hwid_rx", help="device hardware id for Rx", metavar="HWID", type="string")
|
||||
parser.add_option("-T", "--device-hwid-tx", dest="device_hwid_tx", help="device hardware id for Tx", metavar="HWID", type="string")
|
||||
parser.add_option("-F", "--device-freq", dest="device_freq", help="device center frequency (kHz)", metavar="FREQ", type="int")
|
||||
parser.add_option("-f", "--channel-freq", dest="channel_freq", help="channel center frequency (Hz)", metavar="FREQ", type="int")
|
||||
parser.add_option("-U", "--copy-to-udp", dest="udp_copy", help="UDP audio copy to <address>[:<port>]", metavar="IP:PORT", type="string")
|
||||
parser.add_option("-s", "--sample-rate-rx", dest="sample_rate_rx", help="device to host (Rx) sample rate (kS/s)", metavar="RATE", type="int")
|
||||
parser.add_option("-S", "--sample-rate-tx", dest="sample_rate_tx", help="host to device (Tx) sample rate (kS/s)", metavar="RATE", type="int")
|
||||
parser.add_option("-n", "--antenna-path-rx", dest="antenna_path_rx", help="antenna path index (Rx)", metavar="INDEX", type="int")
|
||||
parser.add_option("-N", "--antenna-path-tx", dest="antenna_path_tx", help="antenna path index (Tx)", metavar="INDEX", type="int")
|
||||
parser.add_option("-S", "--sample-rate-tx", dest="sample_rate_tx", help="host to device (Tx) sample rate (kS/s)", metavar="RATE", type="int")
|
||||
parser.add_option("-n", "--antenna-path-rx", dest="antenna_path_rx", help="antenna path index (Rx)", metavar="INDEX", type="int")
|
||||
parser.add_option("-N", "--antenna-path-tx", dest="antenna_path_tx", help="antenna path index (Tx)", metavar="INDEX", type="int")
|
||||
|
||||
(options, args) = parser.parse_args()
|
||||
|
||||
|
||||
if options.address == None:
|
||||
options.address = "127.0.0.1:8091"
|
||||
|
||||
|
||||
if options.device_hwid_rx == None:
|
||||
options.device_hwid_rx = "FileSource"
|
||||
|
||||
|
||||
if options.device_hwid_tx == None:
|
||||
options.device_hwid_tx = "FileSink"
|
||||
|
||||
|
||||
if options.device_freq == None:
|
||||
options.device_freq = 435000
|
||||
|
||||
|
||||
if options.channel_freq == None:
|
||||
options.channel_freq = 0
|
||||
|
||||
|
||||
if options.sample_rate_rx == None:
|
||||
options.sample_rate_rx = 2600
|
||||
|
||||
|
||||
if options.sample_rate_tx == None:
|
||||
options.sample_rate_tx = 2600
|
||||
|
||||
|
||||
if options.antenna_path_rx == None:
|
||||
options.antenna_path_rx = 0
|
||||
|
||||
|
||||
if options.antenna_path_tx == None:
|
||||
options.antenna_path_tx = 0
|
||||
|
||||
|
||||
return options
|
||||
|
||||
|
||||
# ======================================================================
|
||||
def printResponse(response):
|
||||
content_type = response.headers.get("Content-Type", None)
|
||||
@ -68,44 +70,46 @@ 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:
|
||||
options = getInputOptions()
|
||||
|
||||
|
||||
global base_url
|
||||
base_url = "http://%s/sdrangel" % options.address
|
||||
|
||||
|
||||
r = callAPI("/devicesets", "GET", None, None, "Get device set configuration")
|
||||
if r is None:
|
||||
exit(-1)
|
||||
|
||||
|
||||
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
|
||||
|
||||
|
||||
r = callAPI(deviceset_url + "/device", "PUT", None, {"hwType": "%s" % options.device_hwid_rx, "tx": 0}, "setup device on Rx device set")
|
||||
if r is None:
|
||||
exit(-1)
|
||||
@ -113,13 +117,13 @@ def main():
|
||||
settings = callAPI(deviceset_url + "/device/settings", "GET", None, None, "Get device settings")
|
||||
if settings is None:
|
||||
exit(-1)
|
||||
|
||||
|
||||
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,34 +131,34 @@ 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
|
||||
settings['hackRFInputSettings']['vgaGain'] = 24
|
||||
|
||||
|
||||
r = callAPI(deviceset_url + "/device/settings", "PATCH", None, settings, "Patch device settings")
|
||||
if r is None:
|
||||
exit(-1)
|
||||
|
||||
|
||||
r = callAPI(deviceset_url + "/channel", "POST", None, {"channelType": "NFMDemod", "tx": 0}, "Create NFM demod")
|
||||
if r is None:
|
||||
exit(-1)
|
||||
|
||||
|
||||
settings = callAPI(deviceset_url + "/channel/0/settings", "GET", None, None, "Get NFM demod settings")
|
||||
if settings is None:
|
||||
exit(-1)
|
||||
|
||||
|
||||
settings["NFMDemodSettings"]["title"] = "Test NFM"
|
||||
settings["NFMDemodSettings"]["inputFrequencyOffset"] = options.channel_freq
|
||||
settings["NFMDemodSettings"]["rfBandwidth"] = 12500
|
||||
@ -162,7 +166,7 @@ def main():
|
||||
settings["NFMDemodSettings"]["afBandwidth"] = 4000
|
||||
settings["NFMDemodSettings"]["squelch"] = -700
|
||||
settings["NFMDemodSettings"]["volume"] = 2.0
|
||||
|
||||
|
||||
if options.udp_copy is not None:
|
||||
address_port = options.udp_copy.split(':')
|
||||
if len(address_port) > 1:
|
||||
@ -170,37 +174,37 @@ def main():
|
||||
if len(address_port) > 0:
|
||||
settings["NFMDemodSettings"]["udpAddress"] = address_port[0]
|
||||
settings["NFMDemodSettings"]["copyAudioToUDP"] = 1
|
||||
|
||||
|
||||
r = callAPI(deviceset_url + "/channel/0/settings", "PATCH", None, settings, "Change NFM demod")
|
||||
if r is None:
|
||||
exit(-1)
|
||||
|
||||
|
||||
r = callAPI(deviceset_url + "/device/run", "POST", None, None, "Start running device")
|
||||
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:
|
||||
exit(-1)
|
||||
|
||||
|
||||
deviceset_url = "/deviceset/%d" % (deviceset_index_rx + 1)
|
||||
|
||||
|
||||
r = callAPI(deviceset_url + "/device", "PUT", None, {"hwType": "%s" % options.device_hwid_tx, "tx": 1}, "setup device on Tx device set")
|
||||
if r is None:
|
||||
exit(-1)
|
||||
|
||||
|
||||
settings = callAPI(deviceset_url + "/device/settings", "GET", None, None, "Get device settings")
|
||||
if settings is None:
|
||||
exit(-1)
|
||||
|
||||
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,44 +212,43 @@ 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
|
||||
|
||||
|
||||
r = callAPI(deviceset_url + "/device/settings", "PATCH", None, settings, "Patch device settings")
|
||||
if r is None:
|
||||
exit(-1)
|
||||
|
||||
|
||||
r = callAPI(deviceset_url + "/channel", "POST", None, {"channelType": "NFMMod", "tx": 1}, "Create NFM mod")
|
||||
if r is None:
|
||||
exit(-1)
|
||||
|
||||
|
||||
settings = callAPI(deviceset_url + "/channel/0/settings", "GET", None, None, "Get NFM mod settings")
|
||||
if settings is None:
|
||||
exit(-1)
|
||||
|
||||
|
||||
settings["NFMModSettings"]["title"] = "Test NFM"
|
||||
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")
|
||||
if r is None:
|
||||
exit(-1)
|
||||
|
||||
|
||||
deviceset_url = "/deviceset/%d" % deviceset_index_rx
|
||||
|
||||
|
||||
r = callAPI(deviceset_url + "/focus", "PATCH", None, None, "set focus on Rx device set")
|
||||
if r is None:
|
||||
exit(-1)
|
||||
|
||||
|
||||
except Exception, msg:
|
||||
|
||||
except Exception as ex:
|
||||
tb = traceback.format_exc()
|
||||
print >> sys.stderr, tb
|
||||
|
||||
|
@ -28,41 +28,44 @@ requests_methods = {
|
||||
"DELETE": requests.delete
|
||||
}
|
||||
|
||||
|
||||
# ======================================================================
|
||||
class ScanControl:
|
||||
def __init__(self, num_channels, channel_step, start_freq, stop_freq, log2_decim):
|
||||
|
||||
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_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():
|
||||
|
||||
parser = OptionParser(usage="usage: %%prog [-t]\n")
|
||||
parser.add_option("-a", "--address", dest="address", help="address and port", metavar="ADDRESS", type="string")
|
||||
parser.add_option("-d", "--device-index", dest="device_index", help="device set index", metavar="INDEX", type="int", default=0)
|
||||
parser.add_option("-a", "--address", dest="address", help="address and port", metavar="ADDRESS", type="string")
|
||||
parser.add_option("-d", "--device-index", dest="device_index", help="device set index", metavar="INDEX", type="int", default=0)
|
||||
parser.add_option("-D", "--device-hwid", dest="device_hwid", help="device hardware id", metavar="ID", type="string", default="RTLSDR")
|
||||
parser.add_option("-C", "--channel-id", dest="channel_id", help="channel id", metavar="ID", type="string", default="NFMDemod")
|
||||
parser.add_option("-l", "--log2-decim", dest="log2_decim", help="log2 of the desired software decimation factor", metavar="LOG2", type="int", default=4)
|
||||
parser.add_option("-n", "--num-channels", dest="num_channels", help="number of parallel channels", metavar="NUMBER", type="int", default=8)
|
||||
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("-C", "--channel-id", dest="channel_id", help="channel id", metavar="ID", type="string", default="NFMDemod")
|
||||
parser.add_option("-l", "--log2-decim", dest="log2_decim", help="log2 of the desired software decimation factor", metavar="LOG2", type="int", default=4)
|
||||
parser.add_option("-n", "--num-channels", dest="num_channels", help="number of parallel channels", metavar="NUMBER", type="int", default=8)
|
||||
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("-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)
|
||||
parser.add_option("-m", "--mock", dest="mock", help="just print calculated values and exit", metavar="BOOLEAN", action="store_true", default=False)
|
||||
parser.add_option("--ppm", dest="lo_ppm", help="LO correction in PPM", metavar="PPM", type="float", default=0.0)
|
||||
parser.add_option("--fc-pos", dest="fc_pos", help="Center frequency position 0:inf 1:sup 2:cen", metavar="ENUM", default=2)
|
||||
parser.add_option("--fc-pos", dest="fc_pos", help="Center frequency position 0:inf 1:sup 2:cen", metavar="ENUM", default=2)
|
||||
parser.add_option("-t", "--settling-time", dest="settling_time", help="Scan step settling time in seconds", metavar="SECONDS", type="float", default=1.0)
|
||||
parser.add_option("--sq", dest="squelch_db", help="Squelsch threshold in dB", metavar="DECIBEL", type="float", default=-50.0)
|
||||
parser.add_option("--sq-gate", dest="squelch_gate", help="Squelsch gate in ms", metavar="MILLISECONDS", type="int", default=50)
|
||||
@ -70,37 +73,38 @@ def getInputOptions():
|
||||
parser.add_option("--fm-dev", dest="fm_dev", help="FM deviation for FM digial modulation (DV)", metavar="FREQUENCY", type="int", default=5400)
|
||||
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("--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)
|
||||
|
||||
(options, args) = parser.parse_args()
|
||||
|
||||
|
||||
if (options.address == None):
|
||||
options.address = "127.0.0.1:8091"
|
||||
|
||||
|
||||
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)
|
||||
options.excl_flist = []
|
||||
else:
|
||||
options.excl_flist = []
|
||||
|
||||
|
||||
if options.verbosity > 2:
|
||||
options.verbosity = 2
|
||||
|
||||
|
||||
return options
|
||||
|
||||
|
||||
# ======================================================================
|
||||
def setupDevice(scan_control, options):
|
||||
settings = callAPI(deviceset_url + "/device/settings", "GET", None, None, "Get device settings")
|
||||
if settings is None:
|
||||
exit(-1)
|
||||
|
||||
|
||||
if options.device_hwid == "AirspyHF":
|
||||
if scan_control.device_start_freq > 30000000:
|
||||
settings["airspyHFSettings"]["bandIndex"] = 1
|
||||
@ -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
|
||||
@ -148,7 +152,8 @@ def setupDevice(scan_control, options):
|
||||
r = callAPI(deviceset_url + "/device/settings", "PATCH", None, settings, "Patch device settings")
|
||||
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
|
||||
@ -205,13 +211,14 @@ def setupChannels(scan_control, options):
|
||||
settings["DSDDemodSettings"]["enableCosineFiltering"] = 1
|
||||
settings["DSDDemodSettings"]["pllLock"] = 1
|
||||
settings["DSDDemodSettings"]["title"] = "Channel %d" % i
|
||||
|
||||
|
||||
r = callAPI(deviceset_url + "/channel/%d/settings" % i, "PATCH", None, settings, "Change demod")
|
||||
if r is None:
|
||||
exit(-1)
|
||||
|
||||
i += 1
|
||||
|
||||
|
||||
i += 1
|
||||
|
||||
|
||||
# ======================================================================
|
||||
def checkScanning(fc, options, display_message):
|
||||
reports = callAPI(deviceset_url + "/channels/report", "GET", None, None, "Get channels report")
|
||||
@ -222,19 +229,20 @@ 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):
|
||||
content_type = response.headers.get("Content-Type", None)
|
||||
@ -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,12 +271,13 @@ def callAPI(url, method, params, json, text):
|
||||
printResponse(r)
|
||||
return None
|
||||
|
||||
|
||||
# ======================================================================
|
||||
def main():
|
||||
try:
|
||||
options = getInputOptions()
|
||||
scan_control = ScanControl(options.num_channels, options.freq_step, options.freq_start, options.freq_stop, options.log2_decim)
|
||||
|
||||
|
||||
# Print calculated scan parameters
|
||||
|
||||
print("Channel shifts: %s" % scan_control.channel_shifts)
|
||||
@ -275,43 +285,43 @@ def main():
|
||||
print("Start: %d" % scan_control.device_start_freq)
|
||||
print("Stop: %d" % scan_control.device_stop_freq)
|
||||
print("Step: %d" % scan_control.device_step_freq)
|
||||
|
||||
|
||||
if scan_control.device_stop_freq < scan_control.device_start_freq:
|
||||
print("Frequency error")
|
||||
exit(1)
|
||||
|
||||
|
||||
freqs = []
|
||||
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
|
||||
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
|
||||
base_url = "http://%s/sdrangel" % options.address
|
||||
|
||||
# Set Rx
|
||||
|
||||
|
||||
# Set Rx
|
||||
|
||||
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:
|
||||
exit(-1)
|
||||
|
||||
|
||||
r = callAPI(deviceset_url + "/device", "PUT", None, {"hwType": options.device_hwid, "tx": 0}, "setup device on Rx device set")
|
||||
if r is None:
|
||||
exit(-1)
|
||||
|
||||
|
||||
# Set device and channels
|
||||
|
||||
setupDevice(scan_control, options)
|
||||
@ -325,7 +335,7 @@ def main():
|
||||
fc = scan_control.device_start_freq
|
||||
|
||||
global verbosity
|
||||
verbosity = options.verbosity
|
||||
verbosity = options.verbosity
|
||||
|
||||
print("Move center to %d Hz" % fc)
|
||||
changeDeviceFrequency(fc, options)
|
||||
@ -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
|
||||
@ -354,14 +364,14 @@ def main():
|
||||
print("Terminated by user")
|
||||
pass
|
||||
finally:
|
||||
verbosity = 2
|
||||
verbosity = 2
|
||||
r = callAPI(deviceset_url + "/device/run", "DELETE", None, None, "Stop running device")
|
||||
if r is None:
|
||||
exit(-1)
|
||||
|
||||
|
||||
except KeyboardInterrupt:
|
||||
pass
|
||||
except Exception, msg:
|
||||
except Exception as ex:
|
||||
tb = traceback.format_exc()
|
||||
print >> sys.stderr, tb
|
||||
|
||||
|
@ -5,38 +5,40 @@ from optparse import OptionParser
|
||||
|
||||
base_url = "http://127.0.0.1:8091/sdrangel"
|
||||
|
||||
|
||||
# ======================================================================
|
||||
def getInputOptions():
|
||||
|
||||
parser = OptionParser(usage="usage: %%prog [-t]\n")
|
||||
parser.add_option("-a", "--address", dest="address", help="address and port", metavar="ADDRESS", type="string")
|
||||
parser.add_option("-d", "--device-index", dest="device_index", help="device set index", metavar="INDEX", type="int")
|
||||
parser.add_option("-a", "--address", dest="address", help="address and port", metavar="ADDRESS", type="string")
|
||||
parser.add_option("-d", "--device-index", dest="device_index", help="device set index", metavar="INDEX", type="int")
|
||||
parser.add_option("-t", "--stop", dest="stop", help="stop device", metavar="STOP", action="store_true", default=False)
|
||||
parser.add_option("-s", "--start", dest="start", help="start device", metavar="START", action="store_true", default=False)
|
||||
|
||||
(options, args) = parser.parse_args()
|
||||
|
||||
|
||||
if (options.address == None):
|
||||
options.address = "127.0.0.1:8888"
|
||||
|
||||
|
||||
if options.device_index < 0:
|
||||
otions.device_index = 0
|
||||
|
||||
|
||||
if options.start and options.stop:
|
||||
print("Cannot start and stop at the same time")
|
||||
exit(1)
|
||||
|
||||
|
||||
if not options.start and not options.stop:
|
||||
print("Must start or stop")
|
||||
exit(1)
|
||||
|
||||
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:
|
||||
@ -73,15 +76,16 @@ def stopDevice(deviceIndex):
|
||||
print("Cannot get device %d running state" % 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:
|
||||
@ -96,8 +100,8 @@ def main():
|
||||
print("Cannot get device sets configuration")
|
||||
else:
|
||||
print("Error getting device sets configuration")
|
||||
|
||||
except Exception, msg:
|
||||
|
||||
except Exception as ex:
|
||||
tb = traceback.format_exc()
|
||||
print >> sys.stderr, tb
|
||||
|
||||
|
@ -13,19 +13,21 @@ requests_methods = {
|
||||
"DELETE": requests.delete
|
||||
}
|
||||
|
||||
|
||||
# ======================================================================
|
||||
def getInputOptions():
|
||||
|
||||
parser = OptionParser(usage="usage: %%prog [-t]\n")
|
||||
parser.add_option("-a", "--address", dest="address", help="address and port", metavar="ADDRESS", type="string")
|
||||
parser.add_option("-a", "--address", dest="address", help="address and port", metavar="ADDRESS", type="string")
|
||||
|
||||
(options, args) = parser.parse_args()
|
||||
|
||||
|
||||
if (options.address == None):
|
||||
options.address = "127.0.0.1:8091"
|
||||
|
||||
return options
|
||||
|
||||
|
||||
# ======================================================================
|
||||
def printResponse(response):
|
||||
content_type = response.headers.get("Content-Type", None)
|
||||
@ -35,25 +37,27 @@ 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:
|
||||
options = getInputOptions()
|
||||
|
||||
|
||||
global base_url
|
||||
base_url = "http://%s/sdrangel" % options.address
|
||||
|
||||
@ -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
|
||||
|
||||
|
@ -14,15 +14,16 @@ requests_methods = {
|
||||
"DELETE": requests.delete
|
||||
}
|
||||
|
||||
|
||||
# ======================================================================
|
||||
def getInputOptions():
|
||||
|
||||
parser = OptionParser(usage="usage: %%prog [-t]\n")
|
||||
parser.add_option("-a", "--address", dest="address", help="address and port", metavar="ADDRESS", type="string")
|
||||
parser.add_option("-d", "--device-index", dest="device_index", help="device set index", metavar="INDEX", type="int")
|
||||
parser.add_option("-D", "--device-hwid", dest="device_hwid", help="device hardware id", metavar="HWID", type="string")
|
||||
parser.add_option("-C", "--channel-id", dest="channel_id", help="channel id", metavar="ID", type="string", default="NFMDemod")
|
||||
parser.add_option("-F", "--device-freq", dest="device_freq", help="device center frequency (kHz)", metavar="FREQ", type="int")
|
||||
parser.add_option("-a", "--address", dest="address", help="address and port", metavar="ADDRESS", type="string")
|
||||
parser.add_option("-d", "--device-index", dest="device_index", help="device set index", metavar="INDEX", type="int")
|
||||
parser.add_option("-D", "--device-hwid", dest="device_hwid", help="device hardware id", metavar="HWID", type="string")
|
||||
parser.add_option("-C", "--channel-id", dest="channel_id", help="channel id", metavar="ID", type="string", default="NFMDemod")
|
||||
parser.add_option("-F", "--device-freq", dest="device_freq", help="device center frequency (kHz)", metavar="FREQ", type="int")
|
||||
parser.add_option("-f", "--channel-freq", dest="channel_freq", help="channel center frequency (Hz)", metavar="FREQ", type="int")
|
||||
parser.add_option("-s", "--sample-rate", dest="sample_rate", help="host to device sample rate (S/s)", metavar="RATE", type="int")
|
||||
parser.add_option("-l", "--log2-interp", dest="log2_interp", help="log2 of interpolation factor", metavar="RATE", type="int")
|
||||
@ -34,25 +35,25 @@ def getInputOptions():
|
||||
parser.add_option("--video", dest="video_file", help="video file for ATV modulator (sends video)", metavar="FILENAME", type="string")
|
||||
|
||||
(options, args) = parser.parse_args()
|
||||
|
||||
|
||||
if options.address == None:
|
||||
options.address = "127.0.0.1:8091"
|
||||
|
||||
|
||||
if options.device_index == None:
|
||||
options.device_index = 1
|
||||
|
||||
|
||||
if options.device_hwid == None:
|
||||
options.device_hwid = "FileSource"
|
||||
|
||||
|
||||
if options.device_freq == None:
|
||||
options.device_freq = 435000
|
||||
|
||||
|
||||
if options.channel_freq == None:
|
||||
options.channel_freq = 0
|
||||
|
||||
|
||||
if options.sample_rate == None:
|
||||
options.sample_rate = 2600000
|
||||
|
||||
|
||||
if options.log2_interp == None:
|
||||
options.log2_interp = 4
|
||||
|
||||
@ -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,9 +134,9 @@ 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"]["ncoFrequency"] = -500000
|
||||
settings["limeSdrOutputSettings"]["lpfBW"] = 4050000
|
||||
settings["limeSdrOutputSettings"]["lpfFIRBW"] = 100000
|
||||
settings["limeSdrOutputSettings"]["lpfFIREnable"] = 1
|
||||
@ -141,48 +146,49 @@ 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
|
||||
settings['hackRFOutputSettings']['vgaGain'] = 24
|
||||
|
||||
|
||||
r = callAPI(deviceset_url + "/device/settings", "PATCH", None, settings, "Patch device settings")
|
||||
if r is None:
|
||||
exit(-1)
|
||||
|
||||
|
||||
# ======================================================================
|
||||
def setupChannel(options):
|
||||
r = callAPI(deviceset_url + "/channel", "POST", None, {"channelType": options.channel_id, "tx": 1}, "Create modulator")
|
||||
if r is None:
|
||||
exit(-1)
|
||||
|
||||
|
||||
settings = callAPI(deviceset_url + "/channel/0/settings", "GET", None, None, "Get modulator settings")
|
||||
if settings is None:
|
||||
exit(-1)
|
||||
|
||||
|
||||
if options.channel_id == "NFMMod":
|
||||
settings["NFMModSettings"]["title"] = "Test NFM"
|
||||
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,34 +196,34 @@ 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"]["atvStd"] = 5 # ATVStdHSkip
|
||||
settings["ATVModSettings"]["atvModulation"] = 1 # ATVModulationFM
|
||||
settings["ATVModSettings"]["atvModInput"] = 1 # ATVModInputHBars
|
||||
|
||||
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
|
||||
settings["ATVModSettings"]["showOverlayText"] = 1
|
||||
elif options.channel_id == "SSBMod":
|
||||
settings["SSBModSettings"]["title"] = "Test SSB"
|
||||
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,46 +245,46 @@ 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
|
||||
settings["WFMModSettings"]["afBandwidth"] = 3000
|
||||
|
||||
|
||||
r = callAPI(deviceset_url + "/channel/0/settings", "PATCH", None, settings, "Change modulator")
|
||||
if r is None:
|
||||
exit(-1)
|
||||
|
||||
|
||||
|
||||
# ======================================================================
|
||||
def main():
|
||||
try:
|
||||
options = getInputOptions()
|
||||
|
||||
|
||||
global base_url
|
||||
base_url = "http://%s/sdrangel" % options.address
|
||||
|
||||
|
||||
if options.create:
|
||||
r = callAPI("/deviceset", "POST", {"tx": 1}, None, "Add Tx device set")
|
||||
if r is None:
|
||||
exit(-1)
|
||||
|
||||
global deviceset_url
|
||||
|
||||
global deviceset_url
|
||||
deviceset_url = "/deviceset/%d" % options.device_index
|
||||
|
||||
|
||||
r = callAPI(deviceset_url + "/device", "PUT", None, {"hwType": "%s" % options.device_hwid, "tx": 1}, "setup device on Tx device set")
|
||||
if r is None:
|
||||
exit(-1)
|
||||
|
||||
|
||||
setupDevice(options)
|
||||
setupChannel(options)
|
||||
|
||||
|
||||
r = callAPI(deviceset_url + "/device/run", "POST", None, None, "Start running device")
|
||||
if r is None:
|
||||
exit(-1)
|
||||
|
||||
except Exception, msg:
|
||||
|
||||
except Exception as ex:
|
||||
tb = traceback.format_exc()
|
||||
print >> sys.stderr, tb
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user