#!/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 antlr4 import configparser import logging import sys 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.1"), server.getint("port", 6600)) oscMacro = OscCommentMacroListener(servers) walker = antlr4.ParseTreeWalker() def comment(text): input_stream = antlr4.InputStream(text) lexer = CommentMacroLexer(input_stream) stream = antlr4.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)