1
0
Fork 0

use rule labeling to simplify parser

This commit is contained in:
Kevin Matz 2018-10-26 15:26:18 -04:00
parent b114208743
commit 1fa50e0387
3 changed files with 63 additions and 94 deletions

View File

@ -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' ;

View File

@ -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()

View File

@ -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,