Skip to content

Commit

Permalink
Implement OSCIn node
Browse files Browse the repository at this point in the history
  • Loading branch information
PhilippThoelke committed Jul 12, 2024
1 parent 44d0ffb commit c06d19a
Showing 1 changed file with 69 additions and 0 deletions.
69 changes: 69 additions & 0 deletions src/goofi/nodes/inputs/oscin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
import time

import numpy as np
from oscpy.server import OSCThreadServer

from goofi.data import Data, DataType
from goofi.node import Node
from goofi.params import IntParam, StringParam


class OSCIn(Node):
def config_params():
return {
"osc": {
"address": StringParam("0.0.0.0"),
"port": IntParam(9000, 0, 65535),
},
"common": {"autotrigger": True},
}

def config_output_slots():
return {"message": DataType.TABLE}

def setup(self):
self.server = OSCThreadServer(advanced_matching=True)
self.server.listen(address=self.params.osc.address.value, port=self.params.osc.port.value, default=True)

# bind to possible addresses of depth 10 (is there a better way to do this?)
for i in range(1, 11):
self.server.bind(b"/*" * i, self.callback, get_address=True)

self.messages = {}

def callback(self, address, *args):
if len(args) > 1:
raise ValueError(
"For now the OSCIn node only support a single argument per message. "
"Please open an issue if you need more (https://github.com/PhilippThoelke/goofi-pipe/issues)."
)

val = args[0]
if isinstance(val, bytes):
val = Data(DataType.STRING, val.decode(), {})
else:
val = Data(DataType.ARRAY, np.array([val]), {})

self.messages[address.decode()] = val

def process(self):
if len(self.messages) == 0:
return None

data = self.messages
meta = {}
self.messages = {}

return {"message": (data, meta)}

def osc_address_changed(self, address):
self.server.stop_all()
self.server.terminate_server()
self.server.join_server()
self.setup()

def osc_port_changed(self, port):
self.server.stop_all()
self.server.terminate_server()
self.server.join_server()
self.setup()

0 comments on commit c06d19a

Please sign in to comment.