【问题标题】:Can I create OSC message handlers containing wildcards?我可以创建包含通配符的 OSC 消息处理程序吗?
【发布时间】:2013-10-07 21:41:26
【问题描述】:

我正在尝试使用 pyosc 创建一个 OSC msg 处理程序,它可以侦听来自 TouchOSC 的传入多切换消息。

multitoggle 是一个切换开关的网格。传入消息的格式为“/1/multitoggle1/5/8”或“/1/multitoggle1/x/y”,其中 x 和 y 是与网格位置对应的整数。

server.addMsgHandler( "/1/multitoggle1/5/8", toggle_callback ) 工作正常,但我需要将 5 和 8 作为在处理程序中读取的参数,这样我就可以得到它们而无需添加单独的处理程序对于每个单独的切换。

s.addMsgHandler("/1/multitoggle1/", toggle_callback) 似乎不起作用。

这是与this one 类似的问题,但我无法实现隐含的解决方案。

【问题讨论】:

  • 你最后链接的问题不一样,他只是向服务器发送了一条路径错误的消息,而你想用一个方法处理一系列类似的消息路径/处理程序。

标签: python osc


【解决方案1】:

我遇到了同样的问题,这是我的解决方案:

for x in range(1,9):
    for y in range(1,6):
        s.addMsgHandler("/Channels/toggleChannels/"+`y`+"/"+`x`, toggleChannels)

def toggleChannels(addr,tags,data,source):
    split = addr.split("/")
    x = split.pop()
    y = split.pop()

我注册了所有处理程序,但只使用了一个回调,效果很好

【讨论】:

  • 太好了!非常感谢。
【解决方案2】:

或者更好的是,提取内容并防止硬编码:

# this is put into a config file for easy mod'ing
OSCPATH = {
    # Incoming OSC from the tracking subsys
    'ping': "/ping",
    'start': "/pf/started",
    'entry': "/pf/entry",
    'exit': "/pf/exit",
    'update': "/pf/update",
    'frame': "/pf/frame",
    'stop': "/pf/stopped",
    'set': "/pf/set/",
    'minx': "/pf/set/minx",
    'maxx': "/pf/set/maxx",
    'miny': "/pf/set/miny",
    'maxy': "/pf/set/maxy",
    'npeople': "/pf/set/npeople",
    # Outgoing OSC updates from the conductor
    'attribute': "/conducter/attribute",
    'rollcall': "/conducter/rollcall",
    'event': "/conducter/event",
    'conx': "/conducter/conx",
}


class OSCHandler(object):

    """Set up OSC server and other handlers."""

    def __init__(self, field):
        self.m_server = OSCServer( (OSCHOST, OSCPORT) )

        self.EVENTFUNC = {
            'ping': self.event_tracking_ping,
            'start': self.event_tracking_start,
            'stop': self.event_tracking_stop,
            'entry': self.event_tracking_entry,
            'exit': self.event_tracking_exit,
            'update': self.event_tracking_update,
            'frame': self.event_tracking_frame,
            'minx': self.event_tracking_set,
            'miny': self.event_tracking_set,
            'maxx': self.event_tracking_set,
            'maxy': self.event_tracking_set,
            'npeople': self.event_tracking_set,
        }

        for i in self.EVENTFUNC:
            self.m_server.addMsgHandler(OSCPATH[i], self.EVENTFUNC[i])

您会看到包括 minx、miny 等在内的多个路径映射到同一个函数。这些使用路径参数来采取特定的行动来处理这些数据。

【讨论】:

    【解决方案3】:

    OSC 确实在方法的地址模式中支持通配符(OSC 代表您所谓的处理程序)。

    它们的工作方式类似于 windows 或 unix 命令行文件名通配符, 像正则表达式。有关详细信息,请查看OSC 1.0 specifications 中的 OSC 消息调度和模式匹配

    在您的示例中,您可以定义一个地址模式"/1/multitoggle1/*/*", 这将允许您接收 "/1/multitoggle1/5/8" 和类似的消息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-11
      • 2014-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多