55 lines
1.9 KiB
Python
55 lines
1.9 KiB
Python
"""hog4.py: Class methods for Hog 4 representation."""
|
|
|
|
import logging
|
|
from time import sleep
|
|
from typing import Any, Dict, Union
|
|
from pythonosc import udp_client, osc_message_builder, osc_bundle, osc_message
|
|
from antlr4 import ParserRuleContext
|
|
|
|
|
|
class HogNet:
|
|
"""Class definition of a hognet participant."""
|
|
|
|
# button state constants
|
|
buttonDOWN = 1
|
|
buttonUP = 0
|
|
|
|
def __init__(self, servers: Dict[int, object]) -> None:
|
|
"""Init method."""
|
|
self.servers = servers
|
|
|
|
def button_press(self, device: ParserRuleContext,
|
|
path: str, delay: float = 0.05) -> None:
|
|
"""Button presses are a pair of up/down OSC."""
|
|
self.send_message(device, path, self.buttonDOWN)
|
|
sleep(delay)
|
|
self.send_message(device, path, self.buttonUP)
|
|
|
|
def send_message(self, device: ParserRuleContext,
|
|
path: str, arg: Any) -> None:
|
|
"""Send a simple OSC message with one argument."""
|
|
msg = osc_message_builder.OscMessageBuilder(address=path)
|
|
msg.add_arg(arg)
|
|
self.send(device, msg.build())
|
|
|
|
def send(self, device: ParserRuleContext,
|
|
msg: Union[osc_message.OscMessage, osc_bundle.OscBundle]) -> None:
|
|
"""Send python-osc messages."""
|
|
if device is None:
|
|
# first configured server
|
|
osc: udp_client = list(self.servers.values())[0]
|
|
else:
|
|
if device.nodeType().getText().lower() != 'h':
|
|
logging.error("ERROR: Only Hog type devices are supported.")
|
|
return
|
|
try:
|
|
osc = self.servers[device.number().value]
|
|
except KeyError:
|
|
logging.error("ERROR: Net# %d not found.",
|
|
device.number().value)
|
|
return
|
|
try:
|
|
osc.send(msg)
|
|
except OSError as exception:
|
|
logging.error(exception)
|