1
0
Fork 0
baconscript/bacon/OscListener.py

310 lines
13 KiB
Python
Raw Normal View History

2020-11-23 12:31:44 -05:00
"""OscCommentMacroListener.py: Hog 4 comment macro antlr4 listener for OSC."""
2018-10-20 19:06:35 -04:00
2018-10-21 14:14:56 -04:00
import logging
2020-11-23 12:32:06 -05:00
from time import sleep
2018-10-20 15:55:24 -04:00
2019-11-18 13:21:36 -05:00
from .commentmacro.CommentMacroParser import CommentMacroParser
from .commentmacro.CommentMacroListener import CommentMacroListener
2022-05-12 19:16:44 -04:00
__all__ = [
"beautify_lisp_string",
"OscCommentMacroListener",
]
2018-10-20 15:55:24 -04:00
# https://raw.githubusercontent.com/jszheng/py3antlr4book/master/bin/pygrun
# this is a python version of TestRig
def beautify_lisp_string(in_string):
2020-11-23 12:31:44 -05:00
"""Prety output of a lisp string."""
# __author__ = 'jszheng'
2018-10-20 15:55:24 -04:00
indent_size = 2
add_indent = ' ' * indent_size
out_string = in_string[0] # no indent for 1st (
indent = ''
for i in range(1, len(in_string) - 1):
if in_string[i] == '(' and in_string[i + 1] != ' ':
indent += add_indent
out_string += "\n" + indent + '('
elif in_string[i] == ')':
out_string += ')'
if len(indent) > 0:
indent = indent.replace(add_indent, '', 1)
else:
out_string += in_string[i]
return out_string
class OscCommentMacroListener(CommentMacroListener):
2020-11-23 12:31:44 -05:00
"""antlr4 listener for comment macros."""
2019-11-18 22:23:51 -05:00
def __init__(self):
2020-11-23 12:31:44 -05:00
"""Initialize the listener."""
2019-11-18 22:23:51 -05:00
self.osc = None
2018-10-21 00:30:21 -04:00
2018-10-28 17:27:05 -04:00
def exitWait(self, ctx: CommentMacroParser.WaitContext):
2020-11-23 12:31:44 -05:00
"""On exiting the WAIT macro."""
logging.info("Waiting %d seconds.", ctx.number().value)
2018-10-28 17:27:05 -04:00
sleep(ctx.number().value)
def enterStatement(self, ctx: CommentMacroParser.StatementContext):
2020-11-23 12:31:44 -05:00
"""On entering a statement."""
2018-10-20 23:38:11 -04:00
# print the lisp tree of this macro
lisp_tree_str = ctx.toStringTree(recog=ctx.parser)
2019-11-18 20:07:48 -05:00
logging.debug(beautify_lisp_string(lisp_tree_str))
2018-10-20 15:55:24 -04:00
2018-10-25 12:52:22 -04:00
def enterTarget(self, ctx: CommentMacroParser.TargetContext):
2020-11-23 12:31:44 -05:00
"""On entering a target."""
2018-10-25 12:52:22 -04:00
ctx.targets = []
def exitTarget(self, ctx: CommentMacroParser.TargetContext):
2020-11-23 12:31:44 -05:00
"""On exiting a target."""
ctx.targets = set(ctx.targets)
2018-10-26 15:26:18 -04:00
if isinstance(ctx.parentCtx, CommentMacroParser.TargetContext):
ctx.parentCtx.targets.extend(ctx.targets) # add to parent targets
2018-10-25 12:52:22 -04:00
2018-10-20 18:01:29 -04:00
def exitNumber(self, ctx: CommentMacroParser.NumberContext):
2020-11-23 12:31:44 -05:00
"""On exiting a number."""
2018-10-25 16:26:15 -04:00
try:
ctx.value = int(ctx.getText())
except ValueError:
ctx.value = float(ctx.getText())
2018-10-20 18:01:29 -04:00
if isinstance(ctx.parentCtx, CommentMacroParser.TargetContext):
2018-10-20 18:10:21 -04:00
ctx.parentCtx.targets.append(ctx.value)
2018-10-20 18:01:29 -04:00
def exitSpan(self, ctx: CommentMacroParser.SpanContext):
2020-11-23 12:31:44 -05:00
"""On exiting a span."""
2018-10-29 23:19:18 -04:00
lower = min(ctx.n1.value, ctx.n2.value)
upper = max(ctx.n1.value, ctx.n2.value)
while lower <= upper:
ctx.parentCtx.targets.append(lower)
lower += 1
def exitMasterGo(self, ctx: CommentMacroParser.MasterGoContext):
2020-11-23 12:31:44 -05:00
"""On exiting a Go macro."""
if ctx.target() is None:
2019-11-18 20:07:48 -05:00
logging.info("Main GO")
self.osc.button_press(ctx.device(), "/hog/hardware/maingo")
return
for i in ctx.target().targets:
if isinstance(i, int) is not True:
2020-11-23 12:31:44 -05:00
logging.error("GO MASTER macro targets must be intigers.")
continue
2020-11-23 12:31:44 -05:00
if i < 0:
logging.error("Master %d is not greater than 0.", i)
continue
master = str(i)
2020-11-23 12:31:44 -05:00
logging.info("GO on master %s", master)
self.osc.button_press(ctx.device(), "/hog/hardware/go/" + master)
2020-11-25 09:39:42 -05:00
def exitMasterGoto(self, ctx: CommentMacroParser.MasterGotoContext):
"""On exiting a GOTO macro."""
if ctx.target() is not None:
logging.error("ERROR: limited to GOTO on current master only.")
return
logging.info("GOTO on current master.")
cue = str(ctx.number().value)
self.osc.button_press(ctx.device(), self.osc.buttonMap["goto"])
self.osc.number_entry(ctx.device(), cue)
self.osc.button_press(ctx.device(), self.osc.buttonMap["enter"])
def exitMasterHalt(self, ctx: CommentMacroParser.MasterHaltContext):
2020-11-23 12:31:44 -05:00
"""On exiting a Master Halt macro."""
if ctx.target() is None:
2019-11-18 20:07:48 -05:00
logging.info("Main HALT")
self.osc.button_press(ctx.device(), "/hog/hardware/mainhalt")
return
for i in ctx.target().targets:
if isinstance(i, int) is not True:
2020-11-23 12:31:44 -05:00
logging.error("GO MASTER macro targets must be intigers.")
continue
2020-11-23 12:31:44 -05:00
if i < 0:
logging.error("Master %d is not greater than 0.", i)
continue
master = str(i)
2020-11-23 12:31:44 -05:00
logging.info("HALT on master %s", master)
self.osc.button_press(ctx.device(), "/hog/hardware/pause/"+master)
def exitMasterAssert(self, ctx: CommentMacroParser.MasterAssertContext):
2020-11-23 12:31:44 -05:00
"""On exiting a Master Assert macro."""
if ctx.target() is not None:
2019-11-18 20:07:48 -05:00
logging.error("ERROR: limited to asserting current master only.")
return
2019-11-18 20:07:48 -05:00
logging.info("ASSERT on current master.")
self.osc.button_press(ctx.device(), "/hog/hardware/assert")
def exitMasterRelease(self, ctx: CommentMacroParser.MasterReleaseContext):
2020-11-23 12:31:44 -05:00
"""On exiting a Master Release macro."""
2018-10-28 16:58:01 -04:00
if ctx.target() is not None:
2019-11-18 20:07:48 -05:00
logging.error("ERROR: limited to releasing current master only.")
return
2019-11-18 20:07:48 -05:00
logging.info("RELEASE on current master.")
self.osc.button_press(ctx.device(), "/hog/hardware/release")
def exitMasterFade(self, ctx: CommentMacroParser.MasterFadeContext):
2020-11-23 12:31:44 -05:00
"""On exiting a Master Fade macro."""
if ctx.target() is None:
2019-11-18 20:07:48 -05:00
logging.error("ERROR: limited to fading specified masters only.")
2018-10-28 16:59:21 -04:00
return
level = ctx.number().value
if (level < 0 or level > 100):
2019-11-18 20:07:48 -05:00
logging.error("Level must be between 0 and 100.")
return
for i in ctx.target().targets:
if isinstance(i, int) is not True:
2020-11-23 12:31:44 -05:00
logging.error("FADE MASTER macro targets must be intigers.")
continue
2020-11-23 12:31:44 -05:00
if i < 0:
logging.error("Master %d is not greater than 0.", i)
continue
master = str(i)
2020-11-23 12:31:44 -05:00
logging.info("Fade Master %s to %d", master, level)
level *= 255 / 100 # percent in Macro, 0>255 in OSC
self.osc.send_message(ctx.device(),
"/hog/hardware/fader/" + master,
level)
def exitFadeGrandMaster(self,
ctx: CommentMacroParser.FadeGrandMasterContext):
2020-11-23 12:31:44 -05:00
"""On exiting a GM Fade Macro."""
level = ctx.number().value
if (level < 0 or level > 100):
2019-11-18 20:07:48 -05:00
logging.error("Level must be between 0 and 100.")
return
2020-11-23 12:31:44 -05:00
logging.info("Fading Grand Master to %d", level)
level *= 255 / 100 # percent in Macro, 0>255 in OSC
self.osc.send_message(ctx.device(), "/hog/hardware/fader/0", level)
def exitMasterChoose(self, ctx: CommentMacroParser.MasterChooseContext):
2020-11-23 12:31:44 -05:00
"""On exiting a Master Choose macro."""
if ctx.number().value < 0:
2019-11-18 20:07:48 -05:00
logging.error("Master must be greater than 0.")
return
master = str(ctx.number().value)
2020-11-23 12:31:44 -05:00
logging.info("Choose Master %s", master)
self.osc.button_press(ctx.device(), "/hog/hardware/choose/" + master)
def exitReleaseAll(self, ctx: CommentMacroParser.ReleaseAllContext):
2020-11-23 12:31:44 -05:00
"""On exiting a Release All Macro."""
2019-11-18 20:07:48 -05:00
logging.info("Release All")
self.osc.send_message(ctx.device(), "/hog/hardware/pig",
self.osc.buttonDOWN)
self.osc.button_press(ctx.device(), "/hog/hardware/release")
self.osc.send_message(ctx.device(), "/hog/hardware/pig",
self.osc.buttonUP)
def exitListGo(self, ctx: CommentMacroParser.ListGoContext):
2020-11-23 12:31:44 -05:00
"""On exiting a List GO macro."""
for i in ctx.target().targets:
2020-11-23 12:31:44 -05:00
logging.info("Go on List %d", i)
self.osc.send_message(ctx.device(), "/hog/playback/go/0", i)
def exitListGoto(self, ctx: CommentMacroParser.ListGotoContext):
2020-11-23 12:31:44 -05:00
"""On exiting a GOTO macro."""
for i in ctx.target().targets:
2020-11-23 12:31:44 -05:00
cuelist = str(i) + "." + str(ctx.number().value)
logging.info("Go on List %s", cuelist)
self.osc.send_message(ctx.device(), "/hog/playback/go/0", list)
def exitListHalt(self, ctx: CommentMacroParser.ListHaltContext):
2020-11-23 12:31:44 -05:00
"""On exiting a Halt macro."""
for i in ctx.target().targets:
2020-11-23 12:31:44 -05:00
logging.info("Halting List %d", i)
self.osc.send_message(ctx.device(), "/hog/playback/halt/0", i)
def exitListRelese(self, ctx: CommentMacroParser.ListReleseContext):
2020-11-23 12:31:44 -05:00
"""On exiting a Release macro."""
for i in ctx.target().targets:
2020-11-23 12:31:44 -05:00
logging.info("Releasing List %d", i)
self.osc.send_message(ctx.device(), "/hog/playback/release/0", i)
def exitSceneGo(self, ctx: CommentMacroParser.SceneGoContext):
2020-11-23 12:31:44 -05:00
"""On exiting a Scene GO macro."""
for i in ctx.target().targets:
2020-11-23 12:31:44 -05:00
logging.info("Go on Scene %d", i)
self.osc.send_message(ctx.device(), "/hog/playback/go/1", i)
def exitSceneHalt(self, ctx: CommentMacroParser.SceneHaltContext):
2020-11-23 12:31:44 -05:00
"""On exiting a Scene Halt macro."""
for i in ctx.target().targets:
2020-11-23 12:31:44 -05:00
logging.info("Halt Scene %d", i)
self.osc.send_message(ctx.device(), "/hog/playback/halt/1", i)
def exitSceneRelease(self, ctx: CommentMacroParser.SceneReleaseContext):
2020-11-23 12:31:44 -05:00
"""On exiting a Scene Release macro."""
for i in ctx.target().targets:
2020-11-23 12:31:44 -05:00
logging.info("Release Scene %d", i)
self.osc.send_message(ctx.device(), "/hog/playback/release/1", i)
def exitMacroGo(self, ctx: CommentMacroParser.MacroGoContext):
2020-11-23 12:31:44 -05:00
"""On exiting a Macro GO macro."""
for i in ctx.target().targets:
2020-11-23 12:31:44 -05:00
logging.info("Go on Macro %d", i)
self.osc.send_message(ctx.device(), "/hog/playback/go/2", i)
def exitMacroHalt(self, ctx: CommentMacroParser.MacroHaltContext):
2020-11-23 12:31:44 -05:00
"""On exiting a Macro Halt macro."""
for i in ctx.target().targets:
2020-11-23 12:31:44 -05:00
logging.info("Pause Macro %d", i)
self.osc.send_message(ctx.device(), "/hog/playback/halt/2", i)
def exitMacroStop(self, ctx: CommentMacroParser.MacroStopContext):
2020-11-23 12:31:44 -05:00
"""On exiting a Macro Stop macro."""
for i in ctx.target().targets:
2020-11-23 12:31:44 -05:00
logging.info("Stop Macro %d", i)
self.osc.send_message(ctx.device(), "/hog/playback/release/2", i)
def exitPageNext(self, ctx: CommentMacroParser.PageNextContext):
2020-11-23 12:31:44 -05:00
"""On exiting a Next Page macro."""
2019-11-18 20:07:48 -05:00
logging.info("Next Page")
self.osc.button_press(ctx.device(), "/hog/hardware/nextpage")
def exitPagePrev(self, ctx: CommentMacroParser.PagePrevContext):
2020-11-23 12:31:44 -05:00
"""On exiting a Previous Page macro."""
2019-11-18 20:07:48 -05:00
logging.info("Prev Page")
self.osc.button_press(ctx.device(), "/hog/hardware/backpage")
2020-11-25 09:39:42 -05:00
def exitSelectIntensity(self,
ctx: CommentMacroParser.SelectIntensityContext):
"""On exiting a Select Intensity macro."""
if ctx.number().value < 0:
logging.error("Pallet must be greater than 0.")
return
pallet = str(ctx.number().value)
logging.info("Selecting intensity pallet %s", pallet)
self.osc.button_press(ctx.device(), self.osc.buttonMap["intensity"])
self.osc.number_entry(ctx.device(), pallet)
self.osc.button_press(ctx.device(), self.osc.buttonMap["enter"])
def exitSelectPosition(self,
ctx: CommentMacroParser.SelectPositionContext):
"""On exiting a Select Intensity macro."""
if ctx.number().value < 0:
logging.error("Pallet must be greater than 0.")
return
pallet = str(ctx.number().value)
logging.info("Selecting position pallet %s", pallet)
self.osc.button_press(ctx.device(), self.osc.buttonMap["position"])
self.osc.number_entry(ctx.device(), pallet)
self.osc.button_press(ctx.device(), self.osc.buttonMap["enter"])
def exitSelectColour(self, ctx: CommentMacroParser.SelectColourContext):
"""On exiting a Select Intensity macro."""
if ctx.number().value < 0:
logging.error("Pallet must be greater than 0.")
return
pallet = str(ctx.number().value)
logging.info("Selecting colour pallet %s", pallet)
self.osc.button_press(ctx.device(), self.osc.buttonMap["colour"])
self.osc.number_entry(ctx.device(), pallet)
self.osc.button_press(ctx.device(), self.osc.buttonMap["enter"])
def exitSelectBeam(self, ctx: CommentMacroParser.SelectBeamContext):
"""On exiting a Select Intensity macro."""
if ctx.number().value < 0:
logging.error("Pallet must be greater than 0.")
return
pallet = str(ctx.number().value)
logging.info("Selecting beam pallet %s", pallet)
self.osc.button_press(ctx.device(), self.osc.buttonMap["beam"])
self.osc.number_entry(ctx.device(), pallet)
self.osc.button_press(ctx.device(), self.osc.buttonMap["enter"])