#!/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)