mirror of
https://github.com/f4exb/sdrangel.git
synced 2024-11-26 01:39:05 -05:00
REST API examples: Added a randomize channel colors utility as a way to answer to issue #275
This commit is contained in:
parent
a0478d0f73
commit
cdfc72a859
193
swagger/sdrangel/examples/randomize_colors.py
Executable file
193
swagger/sdrangel/examples/randomize_colors.py
Executable file
@ -0,0 +1,193 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
|
||||||
|
''' Randomize channel colors for a specified device set
|
||||||
|
-a: address and port of SDRangel REST API (default: 127.0.0.1:8091)
|
||||||
|
-d: index of device set to apply changes to (default 0)
|
||||||
|
By default colors are changed randomly (hue, saturation, value). Optionally you can change one or several of the
|
||||||
|
hue, saturation and value parameters with these options:
|
||||||
|
-H: change hue randomly
|
||||||
|
-s: change saturation randomly
|
||||||
|
-v: change value (luminance) randomly
|
||||||
|
'''
|
||||||
|
|
||||||
|
import requests, json, traceback, sys, random
|
||||||
|
import colorsys
|
||||||
|
from optparse import OptionParser
|
||||||
|
|
||||||
|
base_url = "http://127.0.0.1:8091/sdrangel"
|
||||||
|
|
||||||
|
|
||||||
|
# ======================================================================
|
||||||
|
def getInputOptions():
|
||||||
|
|
||||||
|
parser = OptionParser(usage="usage: %%prog [-adsvH]\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("-s", "--saturation", dest="saturation", help="change channels color saturation", metavar="SATURATION", action="store_true", default=False)
|
||||||
|
parser.add_option("-v", "--value", dest="value", help="change channels color value", metavar="VALUE", action="store_true", default=False)
|
||||||
|
parser.add_option("-H", "--hue", dest="hue", help="change channels color hue", metavar="HUE", action="store_true", default=False)
|
||||||
|
|
||||||
|
(options, args) = parser.parse_args()
|
||||||
|
|
||||||
|
if options.address is None:
|
||||||
|
options.address = "127.0.0.1:8091"
|
||||||
|
|
||||||
|
if options.device_index is None or options.device_index < 0:
|
||||||
|
options.device_index = 0
|
||||||
|
|
||||||
|
return options
|
||||||
|
|
||||||
|
# ======================================================================
|
||||||
|
def get_channel_static_data(channel_info):
|
||||||
|
if channel_info["id"] == "AMDemod":
|
||||||
|
settings_key = "AMDemodSettings"
|
||||||
|
tx = 0
|
||||||
|
elif channel_info["id"] == "AMMod":
|
||||||
|
settings_key = "AMModSettings"
|
||||||
|
tx = 1
|
||||||
|
elif channel_info["id"] == "ATVMod":
|
||||||
|
settings_key = "ATVModSettings"
|
||||||
|
tx = 1
|
||||||
|
elif channel_info["id"] == "BFMDemod":
|
||||||
|
settings_key = "BFMDemodSettings"
|
||||||
|
tx = 0
|
||||||
|
elif channel_info["id"] == "DSDDemod":
|
||||||
|
settings_key = "DSDDemodSettings"
|
||||||
|
tx = 0
|
||||||
|
elif channel_info["id"] == "NFMDemod":
|
||||||
|
settings_key = "NFMDemodSettings"
|
||||||
|
tx = 0
|
||||||
|
elif channel_info["id"] == "NFMMod":
|
||||||
|
settings_key = "NFMModSettings"
|
||||||
|
tx = 1
|
||||||
|
elif channel_info["id"] == "DaemonSink":
|
||||||
|
settings_key = "DaemonSinkSettings"
|
||||||
|
tx = 0
|
||||||
|
elif channel_info["id"] == "DaemonSource":
|
||||||
|
settings_key = "DaemonSourceSettings"
|
||||||
|
tx = 1
|
||||||
|
elif channel_info["id"] == "SSBMod":
|
||||||
|
settings_key = "SSBModSettings"
|
||||||
|
tx = 1
|
||||||
|
elif channel_info["id"] == "SSBDemod":
|
||||||
|
settings_key = "SSBDemodSettings"
|
||||||
|
tx = 0
|
||||||
|
elif channel_info["id"] == "UDPSource":
|
||||||
|
settings_key = "UDPSourceSettings"
|
||||||
|
tx = 1
|
||||||
|
elif channel_info["id"] == "UDPSink":
|
||||||
|
settings_key = "UDPSinkSettings"
|
||||||
|
tx = 0
|
||||||
|
elif channel_info["id"] == "WFMDemod":
|
||||||
|
settings_key = "WFMDemodSettings"
|
||||||
|
tx = 0
|
||||||
|
elif channel_info["id"] == "WFMMod":
|
||||||
|
settings_key = "WFMModSettings"
|
||||||
|
tx = 1
|
||||||
|
else:
|
||||||
|
settings_key = None
|
||||||
|
tx = None
|
||||||
|
return settings_key, tx
|
||||||
|
|
||||||
|
# ======================================================================
|
||||||
|
def randomize_channels_colors(options, channels):
|
||||||
|
for channel_info in channels:
|
||||||
|
settings_key, tx = get_channel_static_data(channel_info)
|
||||||
|
if settings_key is None:
|
||||||
|
continue
|
||||||
|
color = random.randint(0, (1<<24))
|
||||||
|
rn, gn, bn = color_to_rgb(color)
|
||||||
|
payload_json = {
|
||||||
|
"channelType": channel_info["id"],
|
||||||
|
"tx": tx,
|
||||||
|
settings_key: {
|
||||||
|
"rgbColor": color
|
||||||
|
}
|
||||||
|
}
|
||||||
|
settings_url = base_url + ("/deviceset/{0}/channel/{1}/settings".format(options.device_index, channel_info["index"]))
|
||||||
|
rep = requests.patch(url=settings_url, json=payload_json)
|
||||||
|
if rep.status_code / 100 == 2:
|
||||||
|
print("Changed channel {0} color to rgb({1},{2},{3})".format(channel_info["index"], rn, gn, bn))
|
||||||
|
else:
|
||||||
|
print("Error changing channel {0} color to rgb({1},{2},{3})".format(channel_info["index"], rn, gn, bn))
|
||||||
|
|
||||||
|
# ======================================================================
|
||||||
|
def randomize_channels_hsv(options, channels):
|
||||||
|
for channel_info in channels:
|
||||||
|
settings_key, tx = get_channel_static_data(channel_info)
|
||||||
|
settings_url = base_url + ("/deviceset/{0}/channel/{1}/settings".format(options.device_index, channel_info["index"]))
|
||||||
|
rep = requests.get(url=settings_url)
|
||||||
|
if rep.status_code / 100 == 2:
|
||||||
|
rj = rep.json()
|
||||||
|
channel_settings = rj.get(settings_key)
|
||||||
|
if channel_settings is None:
|
||||||
|
print("Cannot get channel {0} settings with key {1}".format(channel_info["index"], settings_key))
|
||||||
|
continue
|
||||||
|
color = channel_settings["rgbColor"]
|
||||||
|
r, g, b = color_to_rgb(color)
|
||||||
|
h, s, v = colorsys.rgb_to_hsv(r/255., g/255., b/255.)
|
||||||
|
if options.hue:
|
||||||
|
h = random.random()
|
||||||
|
if options.saturation:
|
||||||
|
s = random.random()
|
||||||
|
if options.value:
|
||||||
|
v = random.random()
|
||||||
|
r, g, b = colorsys.hsv_to_rgb(h, s, v)
|
||||||
|
rn = int(r * 255.9999)
|
||||||
|
gn = int(g * 255.9999)
|
||||||
|
bn = int(b * 255.9999)
|
||||||
|
new_color = rgb_to_color(rn, gn, bn)
|
||||||
|
payload_json = {
|
||||||
|
"channelType": channel_info["id"],
|
||||||
|
"tx": tx,
|
||||||
|
settings_key: {
|
||||||
|
"rgbColor": new_color
|
||||||
|
}
|
||||||
|
}
|
||||||
|
settings_url = base_url + ("/deviceset/{0}/channel/{1}/settings".format(options.device_index, channel_info["index"]))
|
||||||
|
rep = requests.patch(url=settings_url, json=payload_json)
|
||||||
|
if rep.status_code / 100 == 2:
|
||||||
|
print("Changed channel {0} color to rgb({1},{2},{3})".format(channel_info["index"], rn, gn, bn))
|
||||||
|
else:
|
||||||
|
print("Error changing channel {0} color to rgb({1},{2},{3})".format(channel_info["index"], rn, gn, bn))
|
||||||
|
else:
|
||||||
|
print("Cannot get channel {0} info".format(channel_info["index"]))
|
||||||
|
continue
|
||||||
|
|
||||||
|
# ======================================================================
|
||||||
|
def color_to_rgb(color):
|
||||||
|
r = (color & 0xFF0000)>>16
|
||||||
|
g = (color & 0x00FF00)>>8
|
||||||
|
b = (color & 0x0000FF)
|
||||||
|
return r, g, b
|
||||||
|
|
||||||
|
# ======================================================================
|
||||||
|
def rgb_to_color(r, g, b):
|
||||||
|
return r*(1<<16) + g*(1<<8) + b
|
||||||
|
|
||||||
|
# ======================================================================
|
||||||
|
def main():
|
||||||
|
try:
|
||||||
|
options = getInputOptions()
|
||||||
|
global base_url
|
||||||
|
base_url = "http://%s/sdrangel" % options.address
|
||||||
|
deviceset_url = base_url + ("/deviceset/%d" % options.device_index)
|
||||||
|
r = requests.get(url=deviceset_url)
|
||||||
|
if r.status_code / 100 == 2:
|
||||||
|
rj = r.json()
|
||||||
|
channels = rj.get("channels")
|
||||||
|
if options.saturation or options.value or options.hue:
|
||||||
|
randomize_channels_hsv(options, channels)
|
||||||
|
else:
|
||||||
|
randomize_channels_colors(options, channels) # full randomization (identical to -Hsv)
|
||||||
|
else:
|
||||||
|
print("Error getting deviceset %d info. HTTP: %d" % (options.device_index, r.status_code))
|
||||||
|
print json.dumps(r.json(), indent=4, sort_keys=True)
|
||||||
|
|
||||||
|
except Exception as ex:
|
||||||
|
tb = traceback.format_exc()
|
||||||
|
print >> sys.stderr, tb
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
Loading…
Reference in New Issue
Block a user