2018-10-20 15:55:24 -04:00
|
|
|
#!/usr/bin/env python3
|
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
|
2018-10-20 19:06:35 -04:00
|
|
|
"""OscCommentMacroListener.py: Hog 4 comment macro antlr4 listener for OSC."""
|
|
|
|
|
|
|
|
__author__ = "Kevin Matz"
|
|
|
|
__copyright__ = "Copyright 2018, Company 235, LLC"
|
|
|
|
__credits__ = ["Kevin Matz"]
|
|
|
|
|
|
|
|
__license__ = "MIT"
|
2018-10-21 14:22:02 -04:00
|
|
|
__version__ = "3.9"
|
2018-10-20 19:06:35 -04:00
|
|
|
__maintainer__ = "Kevin Matz"
|
|
|
|
__email__ = "kevin@company235.com"
|
|
|
|
|
|
|
|
__status__ = "Prototype"
|
|
|
|
|
|
|
|
|
2018-10-21 14:14:56 -04:00
|
|
|
import logging
|
2018-10-25 12:58:14 -04:00
|
|
|
import OscMacroDefinitions
|
2018-10-20 15:55:24 -04:00
|
|
|
from CommentMacroParser import CommentMacroParser
|
|
|
|
from CommentMacroListener import CommentMacroListener
|
|
|
|
|
2018-10-21 14:14:56 -04:00
|
|
|
logger = logging.getLogger("CommentMacro")
|
|
|
|
|
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):
|
|
|
|
__author__ = 'jszheng'
|
|
|
|
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):
|
2018-10-21 15:52:14 -04:00
|
|
|
def __init__(self, servers):
|
2018-10-25 12:58:14 -04:00
|
|
|
self.osc = OscMacroDefinitions.HogDevice(servers)
|
2018-10-21 00:30:21 -04:00
|
|
|
|
2018-10-20 18:01:29 -04:00
|
|
|
def enterMacro(self, ctx: CommentMacroParser.MacroContext):
|
|
|
|
ctx.device = None
|
2018-10-20 18:11:52 -04:00
|
|
|
ctx.number = None
|
2018-10-20 19:06:35 -04:00
|
|
|
ctx.master = None
|
2018-10-20 18:11:52 -04:00
|
|
|
ctx.targets = []
|
2018-10-20 18:01:29 -04:00
|
|
|
ctx.time = None
|
|
|
|
|
2018-10-20 15:55:24 -04:00
|
|
|
def exitMacro(self, ctx: CommentMacroParser.MacroContext):
|
2018-10-20 23:38:11 -04:00
|
|
|
# print the lisp tree of this macro
|
2018-10-21 15:52:14 -04:00
|
|
|
lisp_tree_str = ctx.toStringTree(recog=ctx.parser)
|
2018-10-21 14:14:56 -04:00
|
|
|
logger.info(beautify_lisp_string(lisp_tree_str))
|
2018-10-20 15:55:24 -04:00
|
|
|
|
2018-10-25 12:27:03 -04:00
|
|
|
# disallow duplicate targets
|
|
|
|
ctx.targets = set(ctx.targets)
|
|
|
|
|
2018-10-20 23:38:11 -04:00
|
|
|
# execute macro from name
|
2018-10-20 15:55:24 -04:00
|
|
|
name = ctx.children[0].getText()
|
|
|
|
try:
|
2018-10-21 14:20:11 -04:00
|
|
|
self.osc.command[name](self, ctx)
|
2018-10-20 15:55:24 -04:00
|
|
|
except KeyError:
|
|
|
|
print(name + " macro is not compatable with OSC.")
|
2018-10-21 14:14:56 -04:00
|
|
|
logger.debug("Exiting Macro")
|
2018-10-20 18:01:29 -04:00
|
|
|
|
|
|
|
def enterMaster(self, ctx: CommentMacroParser.MasterContext):
|
|
|
|
ctx.targets = []
|
|
|
|
|
|
|
|
def exitMaster(self, ctx: CommentMacroParser.MasterContext):
|
2018-10-25 12:32:41 -04:00
|
|
|
ctx.parentCtx.master = ctx
|
2018-10-20 18:01:29 -04:00
|
|
|
|
2018-10-25 12:52:22 -04:00
|
|
|
def enterTarget(self, ctx: CommentMacroParser.TargetContext):
|
|
|
|
ctx.targets = []
|
|
|
|
|
|
|
|
def exitTarget(self, ctx: CommentMacroParser.TargetContext):
|
|
|
|
ctx.parentCtx.targets.extend(ctx.targets) # add to parent targets
|
|
|
|
|
2018-10-20 18:01:29 -04:00
|
|
|
def exitNumber(self, ctx: CommentMacroParser.NumberContext):
|
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-25 12:32:41 -04:00
|
|
|
else:
|
2018-10-21 00:30:21 -04:00
|
|
|
ctx.parentCtx.number = ctx
|
2018-10-20 18:01:29 -04:00
|
|
|
|
|
|
|
def exitSpan(self, ctx: CommentMacroParser.SpanContext):
|
2018-10-20 18:10:21 -04:00
|
|
|
number1 = ctx.children[0].value
|
|
|
|
number2 = ctx.children[2].value
|
2018-10-20 18:48:59 -04:00
|
|
|
if (isinstance(number1, int) and isinstance(number2, int)):
|
2018-10-25 12:32:41 -04:00
|
|
|
minimum = min(number1, number2)
|
|
|
|
maximum = max(number1, number2)
|
|
|
|
for i in (range(minimum, maximum + 1)):
|
|
|
|
ctx.parentCtx.targets.append(i)
|
2018-10-20 18:48:59 -04:00
|
|
|
else:
|
2018-10-21 14:14:56 -04:00
|
|
|
logger.error("ERROR: Spans must be ranged with intigers.")
|
2018-10-20 18:01:29 -04:00
|
|
|
|
2018-10-25 12:52:43 -04:00
|
|
|
def exitTime(self, ctx: CommentMacroParser.TimeContext):
|
|
|
|
ctx.parentCtx.time = ctx
|
2018-10-20 18:01:29 -04:00
|
|
|
|
2018-10-25 12:52:22 -04:00
|
|
|
def exitDevice(self, ctx: CommentMacroParser.DeviceContext):
|
|
|
|
ctx.parentCtx.device = ctx
|
2018-10-21 00:30:21 -04:00
|
|
|
|
|
|
|
def exitNodeType(self, ctx: CommentMacroParser.NodeTypeContext):
|
2018-10-25 16:39:41 -04:00
|
|
|
ctx.parentCtx.type = ctx.getText()
|