1
0
Fork 0
baconscript/comment.py

90 lines
2.9 KiB
Python
Executable File

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""comment.py: Hog 4 comment macro interpreter and OSC bridge."""
__author__ = "Kevin Matz"
__copyright__ = "Copyright 2018, Company 235, LLC"
__credits__ = ["Kevin Matz"]
__license__ = "MIT"
__version__ = "3.9"
__maintainer__ = "Kevin Matz"
__email__ = "kevin@company235.com"
__status__ = "Prototype"
import configparser
import logging
import sys
from antlr4 import CommonTokenStream
from antlr4 import InputStream
from antlr4 import ParseTreeWalker
from antlr4.error.ErrorListener import ErrorListener
from .CommentMacroLexer import CommentMacroLexer
from .CommentMacroParser import CommentMacroParser
from .OscCommentMacroListener import OscCommentMacroListener
from pythonosc import udp_client
# define an error listener that raises SyntaxError exceptions
class SyntaxErrorListener(ErrorListener):
def syntaxError(self, recognizer, offendingSymbol, line, column, msg, e):
raise SyntaxError("line "+str(line)+":"+str(column)+" "+msg)
# setup logging
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
ch = logging.StreamHandler() # create console handler and
ch.setLevel(logging.INFO) # set console log level to INFO
logger.addHandler(ch) # add console log handler
# TODO: refactor this to support multiple net#s
config = configparser.ConfigParser(allow_no_value=True)
config.read('server.cfg') # open config file
servers = {} # init an empty dictionary
server = config['hog4'] # section of config file
net = server.getint("net", 1) # default to net #1
logger.info("Adding Hog device at net# " + str(net))
# osc clients are added to the dictionary with the net # as the key
servers[net] = udp_client.SimpleUDPClient(server.get("ip", "10.0.0.100"),
server.getint("port", 7001))
oscMacro = OscCommentMacroListener(servers)
walker = ParseTreeWalker()
def comment(text):
input_stream = InputStream(text)
lexer = CommentMacroLexer(input_stream)
stream = CommonTokenStream(lexer)
parser = CommentMacroParser(stream)
parser._listeners.append(SyntaxErrorListener())
try:
tree = parser.prog()
walker.walk(oscMacro, tree)
except SyntaxError as e:
logger.debug(e) # antlr internal listener prints the error
# # log it to the debug logger anyway
if __name__ == '__main__':
if len(sys.argv) > 1:
logger.debug("found macro at argv[1]")
comment(sys.argv[1])
else:
import readline # for input history and line editing
while True:
try:
text = input("comment# ")
except (KeyboardInterrupt, EOFError):
text = 'exit'
print(text)
if text == 'exit':
break
else:
comment(text)