Skip to content

Commit

Permalink
Add osc support for presets
Browse files Browse the repository at this point in the history
  • Loading branch information
nocarryr committed Jan 24, 2017
1 parent d4808ce commit 3d596a8
Show file tree
Hide file tree
Showing 2 changed files with 120 additions and 2 deletions.
50 changes: 48 additions & 2 deletions tests/test_osc.py
Expand Up @@ -127,8 +127,6 @@ async def test_interface():

await asyncio.sleep(2)

await client.stop()
await interface.stop()

for i, lbl in enumerate(vidhub.output_labels):
assert lbl == 'FOO OUT {}'.format(i)
Expand All @@ -138,3 +136,51 @@ async def test_interface():

for xpt in vidhub.crosspoints:
assert xpt == 2


# Test presets
preset_node = client_node.add_child('vidhubs/by-id/dummy/presets')
preset_node.add_child('recall')
preset_node.add_child('store')
crosspoint_node = client_node.find('vidhubs/by-id/dummy/crosspoints')

class PresetAwait(object):
def __init__(self, event_name):
self.event = asyncio.Event()
self.args = None
self.kwargs = None
vidhub.bind(**{event_name:self.on_vidhub_event})
def on_vidhub_event(self, *args, **kwargs):
self.args = args
self.kwargs = kwargs
self.event.set()
async def wait(self):
await self.event.wait()
self.event.clear()
return self.args, self.kwargs

waiter = PresetAwait('on_preset_stored')

for i in range(vidhub.num_inputs):
xpts = [i]*vidhub.num_outputs
crosspoint_node.ensure_message(server_addr, *xpts)
await asyncio.sleep(.2)
assert vidhub.crosspoints == xpts
name = 'preset_{}'.format(i)
preset_node.find('store').ensure_message(server_addr, i, name)
await waiter.wait()
assert vidhub.presets[i].name == name
assert vidhub.presets[i].crosspoints == {i:v for i, v in enumerate(xpts)}

assert len(vidhub.presets) == vidhub.num_inputs

waiter = PresetAwait('on_preset_active')

for preset in vidhub.presets:
assert not preset.active
preset_node.find('recall').ensure_message(server_addr, preset.index)
await waiter.wait()
assert preset.active

await client.stop()
await interface.stop()
72 changes: 72 additions & 0 deletions vidhubcontrol/interfaces/osc/interface.py
Expand Up @@ -98,6 +98,7 @@ def __init__(self, vidhub, use_device_id=True):
self.label_node.add_child('input', cls=VidhubLabelNode, vidhub=vidhub)
self.label_node.add_child('output', cls=VidhubLabelNode, vidhub=vidhub)
self.crosspoint_node = self.add_child('crosspoints', cls=VidhubCrosspointNode, vidhub=vidhub)
self.preset_node = self.add_child('presets', cls=VidhubPresetGroupNode, vidhub=vidhub)
def get_device_info(self):
d = {}
for vidhub_attr, key in self._info_properties:
Expand Down Expand Up @@ -161,3 +162,74 @@ def on_child_message_received(self, node, client_address, *messages):
asyncio.ensure_future(self.vidhub.set_crosspoint(i, messages[0]))
#node.ensure_message(client_address, self.vidhub.crosspoints[i])
super().on_child_message_received(self, node, client_address, *messages)

class VidhubPresetGroupNode(OscNode):
def __init__(self, name, parent, **kwargs):
super().__init__(name, parent, **kwargs)
self.vidhub = kwargs.get('vidhub')
self.preset_nodes = {}
self.add_child(name='recall')
self.add_child(name='store')
self.build_preset_nodes()
self.vidhub.bind(presets=self.build_preset_nodes)
def build_preset_nodes(self, *args, **kwargs):
for preset in self.vidhub.presets:
name = str(preset.index)
if name in self.preset_nodes:
continue
self.add_child(name=name, cls=VidhubPresetNode, preset=preset)
def on_child_message_received(self, node, client_address, *messages):
if node.name == 'recall':
for i in messages:
try:
preset = self.vidhub.presets[i]
except IndexError:
continue
asyncio.ensure_future(preset.recall())
elif node.name == 'store':
# args:
# preset_index (int, optional)
# name (str, optional)
# outputs_to_store (*ints, optional)
if not len(messages):
asyncio.ensure_future(self.vidhub.store_preset())
else:
i = messages[0]
try:
name = messages[1]
except IndexError:
name = None
if len(messages) > 2:
outputs_to_store = messages[2:]
else:
outputs_to_store = None
asyncio.ensure_future(self.vidhub.store_preset(
outputs_to_store=outputs_to_store,
name=name,
index=i,
))
super().on_child_message_received(node, client_address, *messages)

class VidhubPresetNode(OscNode):
def __init__(self, name, parent, **kwargs):
super().__init__(name, parent, **kwargs)
self.preset = kwargs.get('preset')
for name in ['name', 'active', 'recall', 'store']:
self.add_child(name)
def on_child_message_received(self, node, client_address, *messages):
if node.name == 'name':
if not len(messages):
node.ensure_message(client_address, self.preset.name)
else:
self.preset.name = messages[0]
elif node.name == 'active':
node.ensure_message(client_address, self.preset.active)
elif node.name == 'recall':
asyncio.ensure_future(self.preset.recall())
elif node.name == 'store':
if not len(messages):
outputs_to_store = None
else:
outputs_to_store = list(messages)
asyncio.ensure_future(self.preset.store(outputs_to_store=outputs_to_store))
super().on_child_message_received(node, client_address, *messages)

0 comments on commit 3d596a8

Please sign in to comment.