Программа «Демо-зал»: обзор
«Демо-зал» — учебная программа для U-Logic (редактор программы управления) к интерфейсам «Демо-зал» и «Рецепты». Она управляет залом: матрицей видео, звуковым процессором, кодеком видеоконференцсвязи (ВКС) и тремя камерами. Программа собрана так, чтобы каждый приём работы с панелью можно было увидеть отдельно: один блок — один приём.
Это большой пример, в котором все приёмы раздела работают вместе. Если вы ещё не собирали программу сами, начните с «Первой программы по шагам»: там те же приёмы на маленьком примере. Откройте «Демо-зал» после неё: вы увидите знакомые узлы (блоки программы U-Logic) в большой программе.
Здесь описано, как загрузить программу на контроллер и как пройтись по её блокам: что делает каждый и где про него читать подробно. Как узлы настраиваются по отдельности — на следующих страницах раздела. Здесь — общая картина.
Загрузка программы «Демо-зал»
Программе нужны две вещи. Первая — интерфейсы «Демо-зал» и «Рецепты»: они есть в том же проекте UI-Designer (редактор интерфейсов), что и «Первая программа». Вторая — драйверы (описания протоколов устройств: команды, их параметры и разбор ответов) четырёх устройств зала: матрица AVCiT PHINX — avcit-phinx, звуковой процессор Biamp Tesira — Tesira, кодек VINTEO — vinteo-st, камеры VISCA — visca-generic. Сначала загрузите на контроллер проект UI-Designer с интерфейсами (см. «UI-Designer»): достаточно загрузить проект, публиковать после «Загрузить проект» не нужно. Иначе узлы не найдут элементов.
Программа выложена в двух видах — выберите способ:
Способ |
Файл |
Когда подходит |
|---|---|---|
Проект целиком |
|
учебный или чистый контроллер: проект заменяет все потоки и все драйверы на контроллере |
Только поток |
|
на контроллере уже есть своя программа, которую нужно сохранить |
В обоих случаях адреса устройств в программе — заглушки: что поменять после загрузки, написано в первом блоке программы, в комментарии «0. Что настроить после импорта».
Способ 1. Проект целиком
Предупреждение
«Загрузить проект» заменяет все потоки и все драйверы контроллера содержимым архива; слияния нет, подтверждения перед заменой тоже нет. Ваши вкладки и драйверы, которых нет в архиве, пропадут. Перед загрузкой обязательно скачайте свой проект (шаг 3): вернуть потоки и драйверы можно, загрузив эту копию тем же способом. Пароли подключений устройств в копию не входят, их придётся ввести заново; неразвёрнутые правки в копию тоже не попадут.
Откройте U-Logic.
Откройте меню справа сверху → «Вид» → «Редактор драйверов». Редактор откроется на боковой панели справа.
Нажмите «Скачать проект» и сохраните файл: это копия ваших потоков и драйверов.
Нажмите «Загрузить проект» и укажите файл
demo-hall-project.zip. Загрузка начнётся сразу после выбора файла.
Меню U-Logic: 1 — «Вид», 2 — «Редактор драйверов»
«Редактор драйверов»: 1 — «Режим», 2 — «Драйвер», 3 — «Скачать проект», 4 — «Загрузить проект»
Дождитесь сообщения об успешной загрузке и обновите страницу U-Logic. Программа перезапускается сама, нажимать «Развернуть» (кнопку, которая запускает правки программы в работу) не нужно.
Впишите адреса ваших устройств (как в шаге 9 способа 2) и нажмите «Развернуть».
Что вы увидите: в U-Logic две вкладки — «Демо-зал» и «Первая программа» (её разбор — на странице «Первая программа по шагам»); в списке «Драйвер» редактора драйверов — avcit-phinx, Tesira, vinteo-st, visca-generic. У узлов «События панели» и «Команды панели» горит зелёная точка, когда открыта хотя бы одна панель; узлы устройств, пока адреса не вписаны, — «Отключено».
Способ 2. Только поток
Этот способ добавляет программу отдельной вкладкой и не трогает остальные. Архив demo-hall-project.zip здесь нужен только как источник кода драйверов: не загружайте его через «Загрузить проект», он заменит вашу программу (см. способ 1).
Откройте U-Logic.
Убедитесь, что в «Редакторе драйверов» (меню → «Вид» → «Редактор драйверов», список «Драйвер») есть четыре драйвера:
avcit-phinx,Tesira,vinteo-st,visca-generic. Без драйверов узлы соединений не смогут работать. Если какого-то нет, возьмите его код из архиваdemo-hall-project.zip(папкаdrivers, файл<имя>.js): в редакторе драйверов выберите в поле «Режим» значение «Создать новый», введите имя драйвера (как имя файла, без.js), вставьте содержимое файла и нажмите «Сохранить». Подробнее о драйверах — в «Dynamic Driver».Сохраните копию действующих потоков: меню справа сверху → «Экспорт» → все потоки → «Скачать». «Развернуть» заменяет работающую программу, а восстановить её можно только из копии.
В меню справа сверху выберите «Импорт» (или нажмите
Ctrl+I).В окне «Импортировать узлы» нажмите «выберите файл для импорта» и укажите файл программы.
В «Импортировать в» нажмите «новый поток», чтобы программа открылась отдельной вкладкой «Демо-зал».
Нажмите «Импорт».
Подключение к UI-Panel (странице, на которой оператор работает с интерфейсом): файл создаёт своё подключение «Демо: UI-Panel». Если на контроллере такое подключение уже есть, откройте узлы «События панели» (
UI - Panel in) и «Команды панели» (UI - Panel out), выберите в поле «Path» уже существующее подключение, а «Демо: UI-Panel» удалите (меню → «Конфигурационные узлы»). Если подключения не было, ничего менять не нужно.Впишите адреса ваших устройств: меню → «Конфигурационные узлы» → откройте по очереди «Демо: матрица», «Демо: звуковой процессор», «Демо: кодек ВКС», «Демо: камера 1», «Демо: камера 2», «Демо: камера 3». Адреса и порты в файле тестовые: впишите адрес каждого устройства и его порт управления из документации устройства. Если устройство требует входа (например, кодек ВКС), укажите в подключении логин и пароль устройства.
Нажмите «Развернуть». Вверху должно появиться «Успешно развернуто».
Окно «Импортировать узлы»: 1 — «выберите файл для импорта», 2 — «Импортировать в», 3 — «Импорт»
Что вы увидите: новая вкладка «Демо-зал» с подписанными блоками. Пока устройств нет, узлы соединений «Демо: …» раз в несколько секунд пытаются подключиться; это нормально. События панели при этом уже приходят в программу (их видно в отладке), но кнопки не подсветятся: подсветка идёт по ответам устройств.
Если вкладка «Демо-зал» уже есть и вы хотите загрузить новую версию, удалите вкладку (меню → «Потоки» → «Удалить») и импортируйте файл заново. В окне «Некоторые узлы уже существуют» нажмите «Показать узлы…», в списке отметьте прежние узлы «Демо: …» и действие «заменить», затем нажмите «Импортировать выбранные». После замены адреса и подключение к UI-Panel вернутся к значениям из файла: повторите шаги 8 и 9 и нажмите «Развернуть».
Если загрузка не удалась
В списке драйверов нет нужных. Загружался только поток. Добавьте драйверы по шагу 2 способа 2.
Узлы «Демо: …» показывают «Отключено» или «Ошибка». Адреса устройств в файле — заглушки; впишите свои (шаг 9).
На панели пусто или точки загрузки. Не загружен проект UI-Designer или
UI - Panel inне развёрнут; см. «Частые ошибки» на странице «Связь интерфейса с программой».Кнопки не подсвечиваются. Устройств в сети нет — подсветка идёт по их ответам.
Как читать вкладку
Программа лежит на одной вкладке «Демо-зал». Каждый приём показан в отдельном подписанном блоке — группе узлов с комментарием-заголовком. Блоки пронумерованы и идут сверху вниз, а внутри блока узлы идут слева направо, провода — только вперёд. Между блоками — не длинные провода через всю вкладку, а пары узлов link out и link in: у такой пары общее имя, и сообщение, вошедшее в один, выходит из другого.
В таблице ниже названия даны так, как они подписаны на вкладке; дальше блок назван по первым словам названия (например, блок «Экран» — это «4. Экран: источник — подсветка по ответу матрицы»).
Блок на вкладке |
Какой приём показывает |
|---|---|
0. Что настроить после импорта |
комментарий со списком того, что поменять в загруженной программе: адреса устройств и подключение к UI-Panel (только в файле для загрузки) |
1. Старт: настройки зала и адресная книга |
настройки зала и две карты («кнопка → параметры матрицы», «вход → кнопка и название») собраны в одном узле и при запуске записываются в память потока |
2. Связь с панелью |
один узел |
3. Главная: сценарии и «Выключить всё?» |
кнопка запускает список шагов для нескольких устройств |
4. Экран: источник — подсветка по ответу матрицы |
одно правило на семь кнопок и карта вместо узла на каждую; фильтр ответа матрицы; подсветка по ответу |
5. ВКС: кнопки и список → кодек |
выбор строки списка, звонок, кнопка-переключатель ( |
6. ВКС: ответы кодека → список и состояние звонка |
заполнение списка, опрос, изменение надписей и цвета |
7. Микрофоны: 13 мест — одно правило |
порядок правил в |
8. Звук: ползунки и кнопки → звуковой процессор |
ползунок, масштаб значений, команды звука |
9. Звуковой процессор: ответы → вид элементов |
уведомления процессора перекрашивают кнопки и двигают ползунок |
10. Камеры: выбор и управление |
события «нажата» и «отпущена»; выбор устройства по памяти потока |
11. Шаги сценариев и подписки |
выполнение списка шагов с паузами; подписки после подключения |
12. Рецепты: живые значения для второго интерфейса |
второй интерфейс в той же программе |
13. Ввод с клавиатуры: инпут → программа |
текст из поля ввода попадает в программу |
14. Скриптер: сценарий «Перерыв» |
один узел |
Общее правило, которое видно во всей программе: нажатие запускает команду, а вид на панели меняет ответ устройства. Так на панели видно то, что действительно произошло: источник мог переключиться и с пульта, а команда могла не пройти.
Правила, по которым собран «Демо-зал»
Держитесь этих правил — тогда программу легко читать и чинить.
Один блок — один приём. Блок — группа узлов с комментарием-заголовком. Блоки идут сверху вниз, узлы внутри блока — слева направо, провода — только вперёд. Между блоками — пары
link inиlink out, а не длинные провода через всю вкладку.Один вход и один выход панели. Один
UI - Panel inи одинUI - Panel outна вкладку; остальные блоки подключены черезlink.Настройки зала — в одном узле, а логика читает их по ключу. Номера входов и имена лежат в картах — таблицах «имя кнопки → параметры» и «вход → кнопка и название». Их записывает при запуске один узел
change(блок 1), а остальные берут нужную строку по ключу:changeс выражением видаdemoMatrix[msg.payload.object](«Первая программа», блоки A и C). Логика не держит чисел у себя.Имя элемента — ключ всего. Настройки, правила, подписки процессора используют то же имя, что в UI-Designer.
Шаблон вместо копий. Группа кнопок с общей частью имени — одно правило. Вид группы кнопок с одинаковым поведением — один шаблон.
Один
device - commandна устройство. Команда — вmsg.command, параметры — вmsg.parameters.Вид кнопок — по ответу устройства. Нажатие запускает команду, а подсвечивает кнопку ответ. Ответ фильтруется узлом
switch(подтверждён ли, по какому выходу). Исключение — устройство, которое о состоянии не сообщает.Сценарий — список шагов. Список
[{устройство, команда, параметры}]в одномchange, исполнение — в одном блоке шагов с паузами. Время задавайте узламиdelayиtrigger.Простое делайте узлами
changeиswitch. Узелfunctionнужен только для сложной логики (например, выбор из нескольких источников); дайте ему имя и комментарий «вход / выход».Переключатели — средствами UI-Designer. Кнопку отмечают флажком «Отметить как toggle», программа получает
value_changedи разбирает егоswitchилиchange. Узелtoggle - helperне используется.Состояние — в памяти потока. Старайтесь, чтобы одно имя в памяти записывал один узел, а остальные его только читали: так проще понять, кто менял значение.
Подписки и опрос — после подключения. Запускайте их от первого выхода
device - command: пока соединения нет, команда теряется.
Экскурсия по блокам
Для каждого блока ниже: что он делает, какой приём показывает и где читать про этот приём подробно. Снимки — крупные куски вкладки, по одному на блок.
Блок 1. Старт: настройки зала и адресная книга
Через 3 секунды после запуска узел inject «Старт» запускает цепочку. Узел change записывает в память потока настройки зала: номера входов матрицы, имена, список шагов и две карты (demoMatrix: кнопка → параметры матрицы; demoInputs: вход → кнопка и название). Логика дальше читает их оттуда по ключу и не держит чисел у себя. Затем узел device - command «Кодек: адресная книга» просит у кодека список контактов, и список ВКС заполнен с самого начала.
Блок 1: 1 — inject «Старт», 2 — change «Настройки «Демо-зала»», 3 — device - command «Кодек: адресная книга»
Приём: настройки и карты в одном узле. Где читать: «Первая программа», блок A, и «Команды устройствам и ответы».
Блок 2. Связь с панелью
Один UI - Panel in и один UI - Panel out на всю вкладку. UI - Panel in ведёт в link out, который разносит события по блокам; блоки возвращают результат в общий link in, подключённый к UI - Panel out. Один вход и один выход проще проверить: если сломалась связь с панелью, смотрите в одно место. Выключенный по умолчанию узел debug «Что прислала панель» показывает все события.
Блок 2: 1 — UI - Panel in «События панели», 2 — link out в блоки экранов, 3 — link in от блоков, 4 — UI - Panel out «Команды панели»
Приём: вход и выход панели в одном месте. Где читать: «Приём событий».
Блок 3. Главная: сценарии и «Выключить всё?»
Кнопки «Начало совещания», «Начало видеоконференции» и «Выключить» запускают сценарий — список шагов для нескольких устройств сразу. Список лежит в узле change, а выполняется в блоке 11. Четвёртый сценарий, «Перерыв», собран иначе: его выполняет один узел Скриптера (блок 14). Окно подтверждения «Выключить всё?» — это фрейм (область на странице, в которой показан оверлей) в интерфейсе: программа получает только нажатие «Выключить».
Блок 3: 1 — ui - switch «Главная», 2 — узлы change «Шаги: …» со списками шагов, 3 — api - helper - 2 «Микрофон ВКС: кнопка обычная», 4 — link out «→ шаги»
Приём: сценарий — список шагов, а не десяток проводов. Где читать: «Команды устройствам и ответы».
Кнопка «Выключить» запускает ещё один узел api - helper - 2 — «Микрофон ВКС: кнопка обычная»: он ставит переключателю микрофона состояние default, чтобы после «Выключить всё» кнопка на панели не оставалась нажатой. Сам микрофон кодека выключает один из шагов сценария.
Блок 4. Экран: источник — подсветка по ответу матрицы
Кнопки выбора источника на экране «Экран»: нажатие отправляет матрице команду, а подсветка кнопки и надпись «На экране» меняются по ответу матрицы, а не по нажатию.
Вперёд. Одно правило ui - switch по шаблону Src_*_b ловит все семь кнопок. Узел change «Кнопка → параметры матрицы» достаёт из карты demoMatrix по имени нажатой кнопки параметры {input, output} и кладёт их в msg.parameters (с «глубокой копией»). Затем один device - command «Матрица: подать вход» отправляет команду route. Кнопка «Убрать источник» — тоже строка карты: вход 0.
Назад. Ответ матрицы приходит в device - response - listener «Матрица: ответы» и проходит два узла switch: «Подтверждено?» (payload.ack равно true — настоящий ответ, а не отправка) и «Какой выход?» (payload.output равно 1 — только выход экрана зала; ответ по другому выходу отбрасывается). Дальше две ветки. change «Вход → кнопка» берёт из карты demoInputs имя кнопки по номеру входа и ведёт в interlock - 2 «Источники» (подсветка). change «Вход → название» берёт название и ведёт в api - helper - 2 «На экране» (две надписи — на экране «Экран» и на главной).
Блок 4 «Экран»: 1 — change «Кнопка → параметры матрицы», 2 — device - response - listener «Матрица: ответы», 3 — switch «Какой выход?», 4 — change «Вход → кнопка», 5 — interlock - 2 «Источники», 6 — api - helper - 2 «На экране»
Приёмы: карта вместо узла на каждую кнопку; фильтр ответа; подсветка по ответу устройства. Где читать: «Первая программа», блоки C и D, «Команды устройствам и ответы», «Переключатели и группы».
Блок 5. ВКС: кнопки и список → кодек
Кнопки «Контакты», «История», «Позвонить», «Завершить», «Микрофон в ВКС» и список контактов. Выбор строки списка приходит событием item_selected; команды уходят кодеку через один device - command «Кодек: команда». «Контакты», «История» и «Завершить» — узлы change с константами (msg.command); «Позвонить» требует выбора строки из памяти, поэтому там function.
«Микрофон в ВКС» — кнопка-переключатель (флажок «Отметить как toggle» в UI-Designer). Правило ui - switch на неё ловит value_changed, а switch «Микрофон: вкл или выкл?» по msg.payload.value направляет pressed в change «Микрофон: включить» и default в change «Микрофон: выключить»; оба ставят команду setMute. Другое решение того же — одним change с выражением JSONata — разобрано в «Первой программе», блок F.
Блок 5 «ВКС: кнопки и список → кодек»: 1 — ui - switch «ВКС», 2 — change «Список: контакты», 3 — function «Позвонить выбранному», 4 — switch «Микрофон: вкл или выкл?», 5 — change «Микрофон: включить» и «Микрофон: выключить», 6 — device - command «Кодек: команда»
Приёмы: команда из константы, переключатель через value_changed. Где читать: «Переключатели и группы», «Команды устройствам и ответы».
Блок 6. ВКС: ответы кодека → список и состояние звонка
Ответы кодека contacts и history превращаются в строки списка и попадают в api - helper - 2 «Список ВКС» с событием «Список (JSON)». Кодек сам не сообщает о состоянии звонка, поэтому узел inject каждые 5 секунд спрашивает его (getCallInfo), а ответ callInfo меняет надписи «Идёт разговор» и «Нет звонка» и цвет плашки двумя узлами api - helper - 2.
Блок 6: 1 — inject «Раз в 5 с», 2 — device - response - listener «Кодек: ответы», 3 — функция «Ответ кодека → строки списка», 4 — api - helper - 2 «Список ВКС», 5 — api - helper - 2 «Звонок: подписи»
Приёмы: заполнение списка, опрос устройства, которое само не сообщает, «Источник входных данных». Где читать: «Изменение вида на панели» и «Команды устройствам и ответы».
Блок 7. Микрофоны: 13 мест — одно правило
13 кнопок мест за столом обслуживает одно правило Mic_*_b. Правило для кнопки «Выключить все» стоит выше: оно тоже подошло бы под шаблон. Состояние мест программа хранит в памяти потока и по нему считает надпись «Говорят».
Блок 7: 1 — ui - switch с двумя правилами, 2 — функция «Место → канал», 3 — link in «места: «Говорят»», 4 — api - helper - 2 «Говорят»
Приёмы: порядок правил, состояние в памяти потока. Где читать: «Приём событий».
Блок 8. Звук: ползунки и кнопки → звуковой процессор
Ползунки громкости ловятся событием slide_end: команда уходит один раз, когда оператор отпустил ползунок. Узел range переводит значение 0…1 в децибелы, а функция по имени кнопки выбирает команду звука.
Блок 8: 1 — ui - switch «Звук», 2 — range, 3 — функция «Элемент → команда звука», 4 — device - command «Звук: команда»
Приём: событие ползунка, масштаб значений. Где читать: «Приём событий», «Команды устройствам и ответы».
Блок 9. Звуковой процессор: ответы → вид элементов
Процессор присылает уведомления по подписке. Подписки названы именами кнопок и ползунков (Mic_04_b, Snd_Hall_vol_sl), поэтому уведомление само указывает, какой элемент менять. Один шаблон вида { "{{payload.publishToken}}": { "uiState": "default" или "pressed" } } ставит состояние всем кнопкам mute, а узел api - helper - 2 «Кнопки по имени» работает без списка элементов.
Блок 9: 1 — «Звук: уведомления», 2 — «Чьё уведомление», 3 — шаблоны по имени кнопки «Кнопка: обычная» и «Кнопка: нажата», 4 — api - helper - 2 «Кнопки по имени», 5 — ветки ползунков и подписей «Зал» и «ВКС»
Приём: имя подписки равно имени элемента; одно состояние ведёт несколько кнопок. Где читать: «Изменение вида на панели».
Блок 10. Камеры: выбор и управление
Кнопки Cam_1_b…Cam_3_b выбирают, какой камерой управлять: номер записывается в память потока, а подпись «Управляемая камера» обновляется. Шесть кнопок движения ловят два события — push (начать) и release (стоп). Куда уйдёт команда, решает switch «Какая камера» по номеру из памяти.
Блок 10: 1 — ui - switch «Камеры», 2 — change «Камера 1» (рядом — такие же для камер 2 и 3), 3 — api - helper - 2 с подписью «Управляемая камера», 4 — функция «Кнопка → команда камеры», 5 — switch «Какая камера» и три device - command «Камера 1…3»
Приём: события «нажата» и «отпущена»; выбор устройства по памяти потока. Где читать: «Приём событий».
Блок 11. Шаги сценариев и подписки
Здесь выполняются списки шагов из блоков 3 и 7. Узел split разбирает список, delay (0,4 с) делает паузу между шагами, change превращает шаг в команду, switch выбирает устройство, и шаг уходит в device - command этого устройства. Тем же путём после подключения звукового процессора уходят его подписки: их запускает первый выход device - command («connected»).
Блок 11: 1 — link in, 2 — split, 3 — delay, 4 — change «Шаг → команда», 5 — switch «Какому устройству» и три device - command
Приём: выполнение списка шагов с паузами. Где читать: «Команды устройствам и ответы».
Блок 12. Рецепты: живые значения для второго интерфейса
Тот же поток управляет вторым интерфейсом, «Рецепты»: узел api - helper - 2 задаёт значения спидометров, ползунков и подписей, а ui - switch ловит нажатия на вкладки. UI-Panel запоминает значения, поэтому панель, открытая позже запуска потока, всё равно их показывает.
Блок 12: 1 — ui - switch «Вкладки «Рецептов»», 2 — change «Значения для снимка», 3 — api - helper - 2 «Рецепты: значения»
Приём: ui - switch и api - helper - 2 выбирают интерфейс по имени. Где читать: «Изменение вида на панели».
Блок 13. Ввод с клавиатуры: инпут → программа
Текст из поля ввода приходит событием value_changed после «Кнопки отправки». Программа показывает полученное в надписи («В программу: 1003»). Второе правило ловит остальные события инпута и ведёт в выключенный debug.
Блок 13: 1 — ui - switch «Инпуты «Рецептов»», 2 — template «В программу: …», 3 — api - helper - 2 «Эхо ввода», 4 — выключенный debug
Приём: текст от инпута в программу. Где читать: «Клавиатура и поле ввода».
Блок 14. Скриптер: сценарий «Перерыв»
Кнопка «Перерыв» на главной — четвёртый сценарий, и в отличие от остальных он собран не цепочкой узлов, а одним узлом scripter. Проводов у узла нет: код на вкладке On Start сам слушает нажатие кнопки Home_Break_b и сам отправляет команды устройствам по именам их подключений. Шаги идут с паузами: сразу — подсветка кнопки и выключенные микрофоны, через 1 с — экран без источника, через 2 с — камера 1 «Домой», через 3 с — надпись в шапке «Демо-зал — перерыв». Кнопку «Перерыв» не ловит ни один узел ui - switch — её обрабатывает только Скриптер.
Блок 14: 1 — комментарий блока, 2 — узел scripter «Сценарий «Перерыв»»
Приём: логика кодом вместо цепочки узлов. Где читать: «Скриптер», раздел «Пример: сценарий «Перерыв» в «Демо-зале»».
Частые ошибки
Не вижу блок на вкладке. Откройте вкладку «Демо-зал» и найдите комментарий-заголовок блока. Блоки идут сверху вниз по номерам; если нужен блок 11, прокрутите вниз.
Блок не работает без устройств. Подсветка идёт по ответам устройств: пока адреса не вписаны, кнопки подсвечиваться не будут. События панели при этом приходят.
После «Развернуть» «На экране» показывает текст по умолчанию. Матрица состояние сама не присылает, поток после перезапуска его не запрашивает. Пока оператор не выберет источник, надпись не обновится; это ограничение учебного потока.