diff --git a/swagger/sdrangel/examples/randomize_colors.py b/swagger/sdrangel/examples/randomize_colors.py new file mode 100755 index 000000000..da0d13e10 --- /dev/null +++ b/swagger/sdrangel/examples/randomize_colors.py @@ -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()