1
0
Fork 0
baconscript/comment.py

103 lines
3.0 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
# 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)