use rule labeling to simplify parser
This commit is contained in:
parent
b114208743
commit
1fa50e0387
|
@ -72,7 +72,6 @@ macro
|
||||||
| op='RK' t=target (dev=device)? // Stop Keystroke Macro
|
| op='RK' t=target (dev=device)? // Stop Keystroke Macro
|
||||||
;
|
;
|
||||||
|
|
||||||
master : (target | CURRENT) ;
|
|
||||||
time : TIME n=number ;
|
time : TIME n=number ;
|
||||||
device : ntype=nodeType n=number ;
|
device : ntype=nodeType n=number ;
|
||||||
|
|
||||||
|
@ -101,10 +100,7 @@ number : NUMBER ;
|
||||||
fragment DIGIT : [0-9] ;
|
fragment DIGIT : [0-9] ;
|
||||||
NUMBER : DIGIT+ ('.' DIGIT+)? ;
|
NUMBER : DIGIT+ ('.' DIGIT+)? ;
|
||||||
|
|
||||||
SLASH : '/' ;
|
|
||||||
THRU : '>' ;
|
THRU : '>' ;
|
||||||
NEXT : '+' ;
|
|
||||||
PREV : '-' ;
|
|
||||||
CURRENT : '*' ;
|
CURRENT : '*' ;
|
||||||
TIME : 't' ;
|
TIME : 't' ;
|
||||||
|
|
||||||
|
|
|
@ -48,40 +48,29 @@ class OscCommentMacroListener(CommentMacroListener):
|
||||||
def __init__(self, servers):
|
def __init__(self, servers):
|
||||||
self.osc = OscMacroDefinitions.HogDevice(servers)
|
self.osc = OscMacroDefinitions.HogDevice(servers)
|
||||||
|
|
||||||
def enterMacro(self, ctx: CommentMacroParser.MacroContext):
|
|
||||||
ctx.device = None
|
|
||||||
ctx.number = None
|
|
||||||
ctx.master = None
|
|
||||||
ctx.targets = []
|
|
||||||
ctx.time = None
|
|
||||||
|
|
||||||
def exitMacro(self, ctx: CommentMacroParser.MacroContext):
|
def exitMacro(self, ctx: CommentMacroParser.MacroContext):
|
||||||
# print the lisp tree of this macro
|
# print the lisp tree of this macro
|
||||||
lisp_tree_str = ctx.toStringTree(recog=ctx.parser)
|
lisp_tree_str = ctx.toStringTree(recog=ctx.parser)
|
||||||
logger.info(beautify_lisp_string(lisp_tree_str))
|
logger.info(beautify_lisp_string(lisp_tree_str))
|
||||||
|
|
||||||
# disallow duplicate targets
|
# disallow duplicate targets
|
||||||
ctx.targets = set(ctx.targets)
|
if ctx.t is not None:
|
||||||
|
ctx.t.targets = set(ctx.t.targets)
|
||||||
|
|
||||||
# execute macro from name
|
# execute macro from name
|
||||||
name = ctx.children[0].getText()
|
name = ctx.op.text
|
||||||
try:
|
try:
|
||||||
self.osc.command[name](self, ctx)
|
self.osc.command[name](self, ctx)
|
||||||
except KeyError:
|
except KeyError:
|
||||||
print(name + " macro is not compatable with OSC.")
|
print(name + " macro is not compatable with OSC.")
|
||||||
logger.debug("Exiting Macro")
|
logger.debug("Exiting Macro")
|
||||||
|
|
||||||
def enterMaster(self, ctx: CommentMacroParser.MasterContext):
|
|
||||||
ctx.targets = []
|
|
||||||
|
|
||||||
def exitMaster(self, ctx: CommentMacroParser.MasterContext):
|
|
||||||
ctx.parentCtx.master = ctx
|
|
||||||
|
|
||||||
def enterTarget(self, ctx: CommentMacroParser.TargetContext):
|
def enterTarget(self, ctx: CommentMacroParser.TargetContext):
|
||||||
ctx.targets = []
|
ctx.targets = []
|
||||||
|
|
||||||
def exitTarget(self, ctx: CommentMacroParser.TargetContext):
|
def exitTarget(self, ctx: CommentMacroParser.TargetContext):
|
||||||
ctx.parentCtx.targets.extend(ctx.targets) # add to parent targets
|
if isinstance(ctx.parentCtx, CommentMacroParser.TargetContext):
|
||||||
|
ctx.parentCtx.targets.extend(ctx.targets) # add to parent targets
|
||||||
|
|
||||||
def exitNumber(self, ctx: CommentMacroParser.NumberContext):
|
def exitNumber(self, ctx: CommentMacroParser.NumberContext):
|
||||||
try:
|
try:
|
||||||
|
@ -91,25 +80,14 @@ class OscCommentMacroListener(CommentMacroListener):
|
||||||
|
|
||||||
if isinstance(ctx.parentCtx, CommentMacroParser.TargetContext):
|
if isinstance(ctx.parentCtx, CommentMacroParser.TargetContext):
|
||||||
ctx.parentCtx.targets.append(ctx.value)
|
ctx.parentCtx.targets.append(ctx.value)
|
||||||
else:
|
|
||||||
ctx.parentCtx.number = ctx
|
|
||||||
|
|
||||||
def exitSpan(self, ctx: CommentMacroParser.SpanContext):
|
def exitSpan(self, ctx: CommentMacroParser.SpanContext):
|
||||||
number1 = ctx.children[0].value
|
n1 = ctx.n1.value
|
||||||
number2 = ctx.children[2].value
|
n2 = ctx.n2.value
|
||||||
if (isinstance(number1, int) and isinstance(number2, int)):
|
if (isinstance(n1, int) and isinstance(n2, int)):
|
||||||
minimum = min(number1, number2)
|
minimum = min(n1, n2)
|
||||||
maximum = max(number1, number2)
|
maximum = max(n1, n2)
|
||||||
for i in (range(minimum, maximum + 1)):
|
for i in (range(minimum, maximum + 1)):
|
||||||
ctx.parentCtx.targets.append(i)
|
ctx.parentCtx.targets.append(i)
|
||||||
else:
|
else:
|
||||||
logger.error("ERROR: Spans must be ranged with intigers.")
|
logger.error("ERROR: Spans must be ranged with intigers.")
|
||||||
|
|
||||||
def exitTime(self, ctx: CommentMacroParser.TimeContext):
|
|
||||||
ctx.parentCtx.time = ctx
|
|
||||||
|
|
||||||
def exitDevice(self, ctx: CommentMacroParser.DeviceContext):
|
|
||||||
ctx.parentCtx.device = ctx
|
|
||||||
|
|
||||||
def exitNodeType(self, ctx: CommentMacroParser.NodeTypeContext):
|
|
||||||
ctx.parentCtx.type = ctx.getText()
|
|
||||||
|
|
|
@ -47,14 +47,14 @@ class HogDevice():
|
||||||
if device is None:
|
if device is None:
|
||||||
osc = list(self.servers.values())[0]
|
osc = list(self.servers.values())[0]
|
||||||
else:
|
else:
|
||||||
if (device.type != 'h'):
|
if (device.ntype.getText().lower() != 'h'):
|
||||||
logger.error("ERROR: Only Hog type devices are supported.")
|
logger.error("ERROR: Only Hog type devices are supported.")
|
||||||
return
|
return
|
||||||
else:
|
else:
|
||||||
try:
|
try:
|
||||||
osc = self.servers[device.number.value]
|
osc = self.servers[device.n.value]
|
||||||
except KeyError:
|
except KeyError:
|
||||||
logger.error("ERROR: Net# " + str(device.number.value) +
|
logger.error("ERROR: Net# " + str(device.n.value) +
|
||||||
" not found.")
|
" not found.")
|
||||||
return
|
return
|
||||||
try:
|
try:
|
||||||
|
@ -63,15 +63,15 @@ class HogDevice():
|
||||||
logger.error(e)
|
logger.error(e)
|
||||||
|
|
||||||
def _master_go(self, ctx):
|
def _master_go(self, ctx):
|
||||||
if ctx.number is not None:
|
if ctx.n is not None:
|
||||||
logger.warn("GO MASTER doesn't support goto. " +
|
logger.warn("GO MASTER doesn't support goto. " +
|
||||||
"Cue number "+str(ctx.number.value)+" is ignored.")
|
"Cue number "+str(ctx.n.value)+" is ignored.")
|
||||||
if (len(ctx.master.targets) == 0):
|
if ctx.t is None:
|
||||||
logger.info("Main GO")
|
logger.info("Main GO")
|
||||||
self.osc.button_press(ctx.device, "/hog/hardware/maingo")
|
self.osc.button_press(ctx.dev, "/hog/hardware/maingo")
|
||||||
return
|
return
|
||||||
else:
|
else:
|
||||||
for i in ctx.master.targets:
|
for i in ctx.t.targets:
|
||||||
if isinstance(i, int) is not True:
|
if isinstance(i, int) is not True:
|
||||||
logger.warn("GO MASTER macro targets must be intigers. "
|
logger.warn("GO MASTER macro targets must be intigers. "
|
||||||
+ str(i) + " is not an intigers.")
|
+ str(i) + " is not an intigers.")
|
||||||
|
@ -81,15 +81,15 @@ class HogDevice():
|
||||||
continue
|
continue
|
||||||
master = str(i)
|
master = str(i)
|
||||||
logger.info("GO on master " + master)
|
logger.info("GO on master " + master)
|
||||||
self.osc.button_press(ctx.device, "/hog/hardware/go/" + master)
|
self.osc.button_press(ctx.dev, "/hog/hardware/go/" + master)
|
||||||
|
|
||||||
def _master_halt(self, ctx):
|
def _master_halt(self, ctx):
|
||||||
if (len(ctx.master.targets) == 0):
|
if ctx.t is None:
|
||||||
logger.info("Main HALT")
|
logger.info("Main HALT")
|
||||||
self.osc.button_press(ctx.device, "/hog/hardware/mainhalt")
|
self.osc.button_press(ctx.dev, "/hog/hardware/mainhalt")
|
||||||
return
|
return
|
||||||
else:
|
else:
|
||||||
for i in ctx.master.targets:
|
for i in ctx.t.targets:
|
||||||
if isinstance(i, int) is not True:
|
if isinstance(i, int) is not True:
|
||||||
logger.warn("GO MASTER macro targets must be intigers. "
|
logger.warn("GO MASTER macro targets must be intigers. "
|
||||||
+ str(i) + " is not an intigers.")
|
+ str(i) + " is not an intigers.")
|
||||||
|
@ -99,29 +99,25 @@ class HogDevice():
|
||||||
continue
|
continue
|
||||||
master = str(i)
|
master = str(i)
|
||||||
logger.info("HALT on master " + master)
|
logger.info("HALT on master " + master)
|
||||||
self.osc.button_press(ctx.device,
|
self.osc.button_press(ctx.dev,
|
||||||
"/hog/hardware/pause/" + master)
|
"/hog/hardware/pause/" + master)
|
||||||
|
|
||||||
def _master_assert(self, ctx):
|
def _master_assert(self, ctx):
|
||||||
if (len(ctx.master.targets) != 0):
|
if ctx.t is None:
|
||||||
logger.error("ERROR: limited to asserting current master only.")
|
logger.error("ERROR: limited to asserting current master only.")
|
||||||
return
|
return
|
||||||
logger.info("ASSERT on current master.")
|
logger.info("ASSERT on current master.")
|
||||||
self.osc.button_press(ctx.device, "/hog/hardware/assert")
|
self.osc.button_press(ctx.dev, "/hog/hardware/assert")
|
||||||
|
|
||||||
def _master_release(self, ctx):
|
def _master_release(self, ctx):
|
||||||
if (len(ctx.master.targets) != 0):
|
if ctx.t is None:
|
||||||
logger.error("ERROR: limited to releasing current master only.")
|
logger.error("ERROR: limited to releasing current master only.")
|
||||||
return
|
return
|
||||||
logger.info("RELEASE on current master.")
|
logger.info("RELEASE on current master.")
|
||||||
self.osc.button_press(ctx.device, "/hog/hardware/release")
|
self.osc.button_press(ctx.dev, "/hog/hardware/release")
|
||||||
|
|
||||||
def _master_fade(self, ctx):
|
def _master_fade(self, ctx):
|
||||||
if (ctx.number) is None:
|
level = ctx.n.value
|
||||||
logger.error("ERROR: Missing required argument for LEVEL")
|
|
||||||
return
|
|
||||||
else:
|
|
||||||
level = ctx.number.value
|
|
||||||
if (level < 0 or level > 100):
|
if (level < 0 or level > 100):
|
||||||
logger.error("Level must be between 0 and 100.")
|
logger.error("Level must be between 0 and 100.")
|
||||||
return
|
return
|
||||||
|
@ -129,7 +125,7 @@ class HogDevice():
|
||||||
logger.error("MASTER FADE doesn't support * current master.")
|
logger.error("MASTER FADE doesn't support * current master.")
|
||||||
return
|
return
|
||||||
else:
|
else:
|
||||||
for i in ctx.master.targets:
|
for i in ctx.t.targets:
|
||||||
if isinstance(i, int) is not True:
|
if isinstance(i, int) is not True:
|
||||||
logger.warn("FADE MASTER macro targets must be intigers. "
|
logger.warn("FADE MASTER macro targets must be intigers. "
|
||||||
+ str(i) + " is not an intigers.")
|
+ str(i) + " is not an intigers.")
|
||||||
|
@ -140,95 +136,94 @@ class HogDevice():
|
||||||
master = str(i)
|
master = str(i)
|
||||||
logger.info("Fade Master "+master+" to "+str(level)+"%")
|
logger.info("Fade Master "+master+" to "+str(level)+"%")
|
||||||
level *= 255 / 100 # percent in Macro, 0>255 in OSC
|
level *= 255 / 100 # percent in Macro, 0>255 in OSC
|
||||||
self.osc.send_message(ctx.device,
|
self.osc.send_message(ctx.dev,
|
||||||
"/hog/hardware/fader/" + master,
|
"/hog/hardware/fader/" + master,
|
||||||
level)
|
level)
|
||||||
|
|
||||||
def _master_fade_grand(self, ctx):
|
def _master_fade_grand(self, ctx):
|
||||||
level = ctx.number.value
|
level = ctx.n.value
|
||||||
if (level < 0 or level > 100):
|
if (level < 0 or level > 100):
|
||||||
logger.error("Level must be between 0 and 100.")
|
logger.error("Level must be between 0 and 100.")
|
||||||
return
|
return
|
||||||
logger.info("Fading Grand Master to " + str(level) + "%")
|
logger.info("Fading Grand Master to " + str(level) + "%")
|
||||||
level *= 255 / 100 # percent in Macro, 0>255 in OSC
|
level *= 255 / 100 # percent in Macro, 0>255 in OSC
|
||||||
self.osc.send_message(ctx.device, "/hog/hardware/fader/0", level)
|
self.osc.send_message(ctx.dev, "/hog/hardware/fader/0", level)
|
||||||
|
|
||||||
def _master_choose(self, ctx):
|
def _master_choose(self, ctx):
|
||||||
if (ctx.number.value < 0):
|
if (ctx.n.value < 0):
|
||||||
logger.error("Master must be greater than 0.")
|
logger.error("Master must be greater than 0.")
|
||||||
return
|
return
|
||||||
master = str(ctx.number.value)
|
master = str(ctx.n.value)
|
||||||
logger.info("Choose Master " + master)
|
logger.info("Choose Master " + master)
|
||||||
self.osc.button_press(ctx.device, "/hog/hardware/choose/" + master)
|
self.osc.button_press(ctx.dev, "/hog/hardware/choose/" + master)
|
||||||
|
|
||||||
def _release_all(self, ctx):
|
def _release_all(self, ctx):
|
||||||
logger.info("Release All")
|
logger.info("Release All")
|
||||||
self.osc.send_message(ctx.device, "/hog/hardware/pig",
|
self.osc.send_message(ctx.dev, "/hog/hardware/pig",
|
||||||
HogDevice.buttonDOWN)
|
HogDevice.buttonDOWN)
|
||||||
self.osc.button_press(ctx.device, "/hog/hardware/release")
|
self.osc.button_press(ctx.dev, "/hog/hardware/release")
|
||||||
self.osc.send_message(ctx.device, "/hog/hardware/pig",
|
self.osc.send_message(ctx.dev, "/hog/hardware/pig",
|
||||||
HogDevice.buttonUP)
|
HogDevice.buttonUP)
|
||||||
|
|
||||||
def _list_go(self, ctx):
|
def _list_go(self, ctx):
|
||||||
for i in ctx.targets:
|
for i in ctx.t.targets:
|
||||||
if ctx.number is not None:
|
if ctx.n is not None:
|
||||||
list = str(i) + "." + str(ctx.number.value)
|
list = str(i) + "." + str(ctx.n.value)
|
||||||
else:
|
else:
|
||||||
list = i
|
list = i
|
||||||
logger.info("Go on List " + str(list))
|
logger.info("Go on List " + str(list))
|
||||||
self.osc.send_message(ctx.device, "/hog/playback/go/0", list)
|
self.osc.send_message(ctx.dev, "/hog/playback/go/0", list)
|
||||||
|
|
||||||
def _list_halt(self, ctx):
|
def _list_halt(self, ctx):
|
||||||
for i in ctx.targets:
|
for i in ctx.t.targets:
|
||||||
logger.info("Halting List " + str(i))
|
logger.info("Halting List " + str(i))
|
||||||
self.osc.send_message(ctx.device, "/hog/playback/halt/0", i)
|
self.osc.send_message(ctx.dev, "/hog/playback/halt/0", i)
|
||||||
|
|
||||||
def _list_release(self, ctx):
|
def _list_release(self, ctx):
|
||||||
for i in ctx.targets:
|
for i in ctx.t.targets:
|
||||||
logger.info("Releasing List " + str(i))
|
logger.info("Releasing List " + str(i))
|
||||||
self.osc.send_message(ctx.device, "/hog/playback/release/0", i)
|
self.osc.send_message(ctx.dev, "/hog/playback/release/0", i)
|
||||||
|
|
||||||
def _scene_go(self, ctx):
|
def _scene_go(self, ctx):
|
||||||
for i in ctx.targets:
|
for i in ctx.t.targets:
|
||||||
logger.info("Go on Scene " + str(i))
|
logger.info("Go on Scene " + str(i))
|
||||||
self.osc.send_message(ctx.device, "/hog/playback/go/1", i)
|
self.osc.send_message(ctx.dev, "/hog/playback/go/1", i)
|
||||||
|
|
||||||
def _scene_halt(self, ctx):
|
def _scene_halt(self, ctx):
|
||||||
for i in ctx.targets:
|
for i in ctx.t.targets:
|
||||||
logger.info("Halt Scene " + str(i))
|
logger.info("Halt Scene " + str(i))
|
||||||
self.osc.send_message(ctx.device, "/hog/playback/halt/1", i)
|
self.osc.send_message(ctx.dev, "/hog/playback/halt/1", i)
|
||||||
|
|
||||||
def _scene_release(self, ctx):
|
def _scene_release(self, ctx):
|
||||||
for i in ctx.targets:
|
for i in ctx.t.targets:
|
||||||
logger.info("Release Scene " + str(i))
|
logger.info("Release Scene " + str(i))
|
||||||
self.osc.send_message(ctx.device, "/hog/playback/release/1", i)
|
self.osc.send_message(ctx.dev, "/hog/playback/release/1", i)
|
||||||
|
|
||||||
def _macro_go(self, ctx):
|
def _macro_go(self, ctx):
|
||||||
for i in ctx.targets:
|
for i in ctx.t.targets:
|
||||||
logger.info("Go on Macro " + str(i))
|
logger.info("Go on Macro " + str(i))
|
||||||
self.osc.send_message(ctx.device, "/hog/playback/go/2", i)
|
self.osc.send_message(ctx.dev, "/hog/playback/go/2", i)
|
||||||
|
|
||||||
def _macro_halt(self, ctx):
|
def _macro_halt(self, ctx):
|
||||||
for i in ctx.targets:
|
for i in ctx.t.targets:
|
||||||
logger.info("Pause Macro " + str(i))
|
logger.info("Pause Macro " + str(i))
|
||||||
self.osc.send_message(ctx.device, "/hog/playback/halt/2", i)
|
self.osc.send_message(ctx.dev, "/hog/playback/halt/2", i)
|
||||||
|
|
||||||
def _macro_release(self, ctx):
|
def _macro_release(self, ctx):
|
||||||
for i in ctx.targets:
|
for i in ctx.t.targets:
|
||||||
logger.info("Stop Macro " + str(i))
|
logger.info("Stop Macro " + str(i))
|
||||||
self.osc.send_message(ctx.device, "/hog/playback/release/2", i)
|
self.osc.send_message(ctx.dev, "/hog/playback/release/2", i)
|
||||||
|
|
||||||
def _page_change(self, ctx):
|
def _page_change(self, ctx):
|
||||||
if ctx.number is not None:
|
if ctx.d is None:
|
||||||
logger.error("ERROR: changing page by number is unsupported.")
|
logger.error("ERROR: changing page by number is unsupported.")
|
||||||
return
|
return
|
||||||
dir = ctx.children[1].getText()
|
if ctx.d.text == '+':
|
||||||
if dir == '+':
|
|
||||||
logger.info("Next Page")
|
logger.info("Next Page")
|
||||||
self.osc.button_press(ctx.device, "/hog/hardware/nextpage")
|
self.osc.button_press(ctx.dev, "/hog/hardware/nextpage")
|
||||||
elif dir == '-':
|
elif ctx.d.text == '-':
|
||||||
logger.info("Previous Page")
|
logger.info("Previous Page")
|
||||||
self.osc.button_press(ctx.device, "/hog/hardware/backpage")
|
self.osc.button_press(ctx.dev, "/hog/hardware/backpage")
|
||||||
|
|
||||||
command = {"GM": _master_go,
|
command = {"GM": _master_go,
|
||||||
"HM": _master_halt,
|
"HM": _master_halt,
|
||||||
|
|
Loading…
Reference in New Issue