class Osc: """Control switches via OSC.""" def __init__(self, machine): """Initialise switch player.""" self.log = logging.getLogger('OSC Plugin') self.machine = machine # type: MachineController if 'osc_plugin' not in machine.config: machine.log.debug('"osc_plugin:" section not found in ' 'machine configuration, so the OSC' 'plugin will not be used.') return if not Dispatcher: raise AssertionError( "To use the OSC plugin you need to install the pythonosc extension." ) self.config = self.machine.config['osc_plugin'] self.machine.config_validator.validate_config("osc_plugin", self.config) if not self.config['enabled']: return self.dispatcher = Dispatcher() self.dispatcher.map("/sw/*", self.handle_switch) self.server = AsyncIOOSCUDPServer( (self.config['server_ip'], self.config['server_port']), self.dispatcher, self.machine.clock.loop) self.machine.events.add_async_handler("init_phase_5", self._start) self.client = SimpleUDPClient(self.config['client_ip'], self.config['client_port']) @asyncio.coroutine def _start(self): yield from self.server.create_serve_endpoint() self.machine.switch_controller.add_monitor(self._notify_switch_changes) def __repr__(self): """Return string representation.""" return '<Osc>' def handle_switch(self, switch_name, state): """Handle Switch change from OSC.""" self.machine.switch_controller.process_switch(switch_name, bool(state), logical=True) def _notify_switch_changes(self, change: MonitoredSwitchChange): """Send switch change to OSC client.""" self.client.send_message("/sw/{}".format(change.name), change.state)
class OSCServer(): def __init__(self, server_address, maps=None): """ maps - collection of (osc_address_string, handler) mappings forward - collection of methods to forward raw OSC datagrams to """ self.maps = maps self.server_address = server_address loop = asyncio.get_event_loop() dsp = dispatcher.Dispatcher() for map in self.maps: dsp.map(map[0], map[1], needs_reply_address=(len(map)==3)) self.server = AsyncIOOSCUDPServer(server_address, dsp, loop) def serve(self): logging.info("OSCServer listening on {}".format(self.server_address)) return self.server.create_serve_endpoint()
def async_server(host, port): logger.info(f'listening on {host}:{port}') loop = asyncio.get_event_loop() server = AsyncIOOSCUDPServer((host, port), dsp, loop) transport, protocol = yield from server.create_serve_endpoint() yield from asyncio.sleep(86400 * 7)