Могу ли я создать обработчики сообщений OSC, содержащие подстановочные знаки?

Я пытаюсь создать обработчик сообщений OSC, использующий pyosc, который может прослушивать входящие сообщения с несколькими переключателями от TouchOSC.

Мультитоггл - это сетка переключателей. Входящие сообщения имеют форму "/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), похоже, не работает.

Эта проблема похожа на эту, но я не могу реализовать подразумеваемое решение.

3 ответа

Решение

У меня была такая же проблема, и это было мое решение:

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()

Я зарегистрировал все обработчики, но использовал только один обратный вызов, работал отлично

OSC поддерживает подстановочные знаки в шаблонах адресов (OSC означает то, что вы называете обработчиками).

Они работают аналогично подстановочным знакам имен файлов командной строки Windows или Unix, а не как регулярные выражения. Подробности смотрите в разделе Диспетчеризация сообщений OSC и сопоставление с образцом в спецификациях OSC 1.0.

В вашем примере вы можете определить шаблон адреса "/ 1 / multitoggle1 / * / *", который позволит вам получать "/1/multitoggle1/5/8" и подобные сообщения.

Или еще лучше, извлекая вещи и предотвращая жесткое кодирование:

# 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 и т. Д., Соответствуют одной и той же функции. Они используют параметр пути для выполнения определенных действий для обработки этих данных.

Другие вопросы по тегам