Beispiel #1
0
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)
Beispiel #2
0
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()
Beispiel #3
0
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)