Могу ли я создавать обработчики сообщений 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) не работает.

Это аналогичная проблема с этой но я не могу реализовать подразумеваемое решение.


person user1714819    schedule 07.10.2013    source источник
comment
проблема, с которой вы связались в конце, отличается тем, что он только что отправил сообщение с неправильным путем к серверу, в то время как вы хотите обработать ряд похожих путей сообщений с помощью одного метода/обработчика.   -  person hoijui    schedule 07.08.2014


Ответы (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()

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

person Emilio Bool    schedule 16.12.2013
comment
Замечательно! Большое спасибо. - person user1714819; 12.02.2014

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

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

person Wes Modes    schedule 24.04.2014

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

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

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

person hoijui    schedule 06.08.2014