mirror of
https://github.com/f4exb/sdrangel.git
synced 2024-11-25 17:28:50 -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