diff --git a/OscCommentMacroListener.py b/OscCommentMacroListener.py index 6232bc0..9baa558 100644 --- a/OscCommentMacroListener.py +++ b/OscCommentMacroListener.py @@ -21,7 +21,6 @@ from CommentMacroListener import CommentMacroListener from OscMacroDefinitions import * from pythonosc import osc_message_builder from pythonosc import udp_client -from time import sleep def num(string): @@ -55,33 +54,9 @@ def beautify_lisp_string(in_string): class OscCommentMacroListener(CommentMacroListener): - - def __init__(self, parser, server): + def __init__(self, parser, servers): self.parser = parser - self.server = server - - def button_press(self, device, path, delay=0.05): - self.send_message(device, path, 1) # button down - sleep(delay) - self.send_message(device, path, 0) # button up - - def send_message(self, device, path, arg): - if device is None: - osc = list(self.server.values())[0] - else: - if (device.type.getText() != 'h'): - print("Only Hog type devices are curently supported.") - print("WARNIN: macro discarded!") - return -1 - else: - try: - osc = self.server[device.number.value] - except KeyError: - print("Net# "+str(device.number.value)+" not configured.") - print("WARNING: macro discarded!") - return -1 - osc.send_message(path, arg) - return 1 + self.osc = HogDevice(servers) def exitDevice(self, ctx: CommentMacroParser.DeviceContext): if isinstance(ctx.parentCtx, CommentMacroParser.MacroContext): @@ -103,7 +78,7 @@ class OscCommentMacroListener(CommentMacroListener): ret = -1 name = ctx.children[0].getText() try: - ret = command[name](self, ctx) + ret = self.osc.command[name](self, ctx) except KeyError: print(name + " macro is not compatable with OSC.") return -1 @@ -144,8 +119,8 @@ class OscCommentMacroListener(CommentMacroListener): ctx.targets = [] def exitTarget(self, ctx: CommentMacroParser.TargetContext): - ctx.target = set(ctx.targets) # no duplicates - ctx.parentCtx.targets.extend(ctx.targets) + ctx.target = set(ctx.targets) # no duplicates + ctx.parentCtx.targets.extend(ctx.targets) # add to parent targets def exitNodeType(self, ctx: CommentMacroParser.NodeTypeContext): if isinstance(ctx.parentCtx, CommentMacroParser.DeviceContext): diff --git a/OscMacroDefinitions.py b/OscMacroDefinitions.py index f0bdaa3..a5cca54 100644 --- a/OscMacroDefinitions.py +++ b/OscMacroDefinitions.py @@ -15,149 +15,175 @@ __email__ = "kevin@company235.com" __status__ = "Prototype" -def _master_go(self, ctx): - if ctx.number is not None: - print("GO MASTER doesn't support goto. " - + "Cue number " + str(ctx.number.value) + " will be ignored.") +from time import sleep - if (len(ctx.master.targets) == 0): - print("Main GO") - self.button_press(ctx.device, "/hog/hardware/maingo") + +class HogDevice(): + def __init__(self, servers): + self.servers = servers + + def button_press(self, device, path, delay=0.05): + self.send_message(device, path, 1) # button down + sleep(delay) + self.send_message(device, path, 0) # button up + + def send_message(self, device, path, arg): + if device is None: + osc = list(self.servers.values())[0] + else: + if (device.type.getText() != 'h'): + print("Only Hog type devices are curently supported.") + print("WARNIN: macro discarded!") + return -1 + else: + try: + osc = self.servers[device.number.value] + except KeyError: + print("Net# "+str(device.number.value)+" not configured.") + print("WARNING: macro discarded!") + return -1 + osc.send_message(path, arg) return 1 - else: - for i in ctx.master.targets: - if isinstance(i, int) is not True: - print("GO MASTER macro targets must be intigers. " - + str(i) + " is not an intigers.") - continue - if (i < 0): - print("Master " + str(i) + " should have been greater than 0.") - continue - master = str(i) - print("GO on master " + master) - self.button_press(ctx.device, "/hog/hardware/go/" + master) - return 1 - -def _master_halt(self, ctx): - if (len(ctx.master.targets) == 0): - print("Main HALT") - self.button_press(ctx.device, "/hog/hardware/mainhalt") - return 1 - else: - for i in ctx.master.targets: - if isinstance(i, int) is not True: - print("GO MASTER macro targets must be intigers. " - + str(i) + " is not an intigers.") - continue - if (i < 0): - print("Master " + str(i) + " should have been greater than 0.") - continue - master = str(i) - print("HALT on master " + master) - self.button_press(ctx.device, "/hog/hardware/pause/" + master) - return 1 - - -def _master_fade(self, ctx): - level = ctx.number.value - if (level < 0 or level > 100): - print("Level must be between 0 and 100.") - return -1 - if (len(ctx.master.targets) == 0): - print("MASTER FADE doesn't support unspecified current master.") - return -1 - else: - for i in ctx.master.targets: - if isinstance(i, int) is not True: - print("FADE MASTER macro targets must be intigers. " - + str(i) + " is not an intigers.") - continue - if (i < 0): - print("Master " + str(i) + " should have been greater than 0.") - continue - master = str(i) - print("Fade Master "+master+" to "+str(level)+"%") - level *= 255 / 100 # percent in Macro, 0>255 in OSC - self.send_message(ctx.device, "/hog/hardware/fader/"+master, level) - return 1 - - -def _master_fade_grand(self, ctx): - level = ctx.number.value - if (level < 0 or level > 100): - print("Level must be between 0 and 100.") - return -1 - print("Fading Grand Master to " + str(level) + "%") - level *= 255 / 100 # percent in Macro, 0>255 in OSC - self.send_message(ctx.device, "/hog/hardware/fader/0", level) - return 1 - - -def _master_choose(self, ctx): - if (ctx.number.value < 0): - print("Master must be greater than 0.") - return -1 - master = str(ctx.number.value) - print("Choose Master " + master) - self.button_press(ctx.device, "/hog/hardware/choose/" + master) - return 1 - - -def _list_go(self, ctx): - for i in ctx.targets: - list = str(i) + def _master_go(self, ctx): if ctx.number is not None: - list += "." + str(ctx.number.value) - print("Go on List " + list) - self.send_message(ctx.device, "/hog/playback/go/0", list) - return 1 + print("GO MASTER doesn't support goto. " + + "Cue number "+str(ctx.number.value)+" will be ignored.") + if (len(ctx.master.targets) == 0): + print("Main GO") + self.osc.button_press(ctx.device, "/hog/hardware/maingo") + return 1 + else: + for i in ctx.master.targets: + if isinstance(i, int) is not True: + print("GO MASTER macro targets must be intigers. " + + str(i) + " is not an intigers.") + continue + if (i < 0): + print("Master "+str(i)+" should have been greater than 0.") + continue + master = str(i) + print("GO on master " + master) + self.osc.button_press(ctx.device, "/hog/hardware/go/" + master) + return 1 -def _list_halt(self, ctx): - for i in ctx.targets: - print("Halting List " + str(i)) - self.send_message(ctx.device, "/hog/playback/halt/0", i) - return 1 + def _master_halt(self, ctx): + if (len(ctx.master.targets) == 0): + print("Main HALT") + self.osc.button_press(ctx.device, "/hog/hardware/mainhalt") + return 1 + else: + for i in ctx.master.targets: + if isinstance(i, int) is not True: + print("GO MASTER macro targets must be intigers. " + + str(i) + " is not an intigers.") + continue + if (i < 0): + print("Master "+str(i)+" should have been greater than 0.") + continue + master = str(i) + print("HALT on master " + master) + self.osc.button_press(ctx.device, + "/hog/hardware/pause/" + master) + return 1 + def _master_fade(self, ctx): + if (ctx.number) is None: + print("ERROR: Missing required argument for LEVEL") + return -1 + else: + level = ctx.number.value + if (level < 0 or level > 100): + print("Level must be between 0 and 100.") + return -1 + if (len(ctx.master.targets) == 0): + print("MASTER FADE doesn't support unspecified current master.") + return -1 + else: + for i in ctx.master.targets: + if isinstance(i, int) is not True: + print("FADE MASTER macro targets must be intigers. " + + str(i) + " is not an intigers.") + continue + if (i < 0): + print("Master "+str(i)+" should have been greater than 0.") + continue + master = str(i) + print("Fade Master "+master+" to "+str(level)+"%") + level *= 255 / 100 # percent in Macro, 0>255 in OSC + self.osc.send_message(ctx.device, + "/hog/hardware/fader/" + master, + level) + return 1 -def _list_release(self, ctx): - for i in ctx.targets: - print("Releasing List " + str(i)) - self.send_message(ctx.device, "/hog/playback/release/0", i) - return 1 + def _master_fade_grand(self, ctx): + level = ctx.number.value + if (level < 0 or level > 100): + print("Level must be between 0 and 100.") + return -1 + print("Fading Grand Master to " + str(level) + "%") + level *= 255 / 100 # percent in Macro, 0>255 in OSC + self.osc.send_message(ctx.device, "/hog/hardware/fader/0", level) + return 1 + def _master_choose(self, ctx): + if (ctx.number.value < 0): + print("Master must be greater than 0.") + return -1 + master = str(ctx.number.value) + print("Choose Master " + master) + self.osc.button_press(ctx.device, "/hog/hardware/choose/" + master) + return 1 -def _scene_go(self, ctx): - for i in ctx.targets: - print("Go on Scene " + str(i)) - self.send_message(ctx.device, "/hog/playback/go/1", i) - return 1 + def _list_go(self, ctx): + for i in ctx.targets: + list = str(i) + if ctx.number is not None: + list += "." + str(ctx.number.value) + print("Go on List " + list) + self.osc.send_message(ctx.device, "/hog/playback/go/0", list) + return 1 + def _list_halt(self, ctx): + for i in ctx.targets: + print("Halting List " + str(i)) + self.osc.send_message(ctx.device, "/hog/playback/halt/0", i) + return 1 -def _scene_halt(self, ctx): - for i in ctx.targets: - print("Halt Scene " + str(i)) - self.send_message(ctx.device, "/hog/playback/halt/1", i) - return 1 + def _list_release(self, ctx): + for i in ctx.targets: + print("Releasing List " + str(i)) + self.osc.send_message(ctx.device, "/hog/playback/release/0", i) + return 1 + def _scene_go(self, ctx): + for i in ctx.targets: + print("Go on Scene " + str(i)) + self.osc.send_message(ctx.device, "/hog/playback/go/1", i) + return 1 -def _scene_release(self, ctx): - for i in ctx.targets: - print("Release Scene " + str(i)) - self.send_message(ctx.device, "/hog/playback/release/1", i) - return 1 + def _scene_halt(self, ctx): + for i in ctx.targets: + print("Halt Scene " + str(i)) + self.osc.send_message(ctx.device, "/hog/playback/halt/1", i) + return 1 + def _scene_release(self, ctx): + for i in ctx.targets: + print("Release Scene " + str(i)) + self.osc.send_message(ctx.device, "/hog/playback/release/1", i) + return 1 -command = {"GM": _master_go, - "HM": _master_halt, - "FM": _master_fade, - "FGM": _master_fade_grand, - "CM": _master_choose, - "GL": _list_go, - "HL": _list_halt, - "RL": _list_release, - "GS": _scene_go, - "HS": _scene_halt, - "RS": _scene_release - } + command = {"GM": _master_go, + "HM": _master_halt, + "FM": _master_fade, + "FGM": _master_fade_grand, + "CM": _master_choose, + "GL": _list_go, + "HL": _list_halt, + "RL": _list_release, + "GS": _scene_go, + "HS": _scene_halt, + "RS": _scene_release + }