#!/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 # empty server dictionary servers = {} # open config file config = configparser.ConfigParser(allow_no_value=True) config.read('server.cfg') # set up each hog device for name in config.get('network', 'hogs').split(','): try: # move to config section server = config[name] # read settings ip = server.get("ip", "10.0.0.100") port = server.getint("port", 7001) net = server.getint("net", 1) # osc clients are added to the dictionary with the net # as the key logger.info("Adding Hog device at net# " + str(net)) servers[net] = udp_client.SimpleUDPClient(ip, port) except KeyError as e: print('Error configuring button', b, e) continue oscMacro = OscCommentMacroListener(servers) walker = ParseTreeWalker() def comment(text): text = text.upper() 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)