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