Переключатели и группы
Две задачи, которые на первый взгляд похожи, но решаются по-разному:
переключатель — кнопка «включено / выключено» (микрофон, звук). Программа должна узнать, в каком положении кнопка теперь, и отправить устройству «включить» или «выключить». Эти две задачи вы уже решали в блоках E и F «Первой программы»;
группа кнопок «выбирается одна» (источники, режимы, камеры): нажата одна — остальные гаснут; иногда подсветку должна менять программа.
Что нужно заранее: как оформляется и настраивается кнопка-переключатель и группа Interlock в UI-Designer (редактор интерфейсов) — «Кнопки и состояния»; как принять событие — «Приём событий»; как поменять вид кнопки из программы — «Изменение вида на панели».
Переключатель
Переключатель из UI-Designer и событие value_changed
Зачем. Кнопка-переключатель переключается на панели сама — программе для этого ничего не нужно. Программе нужно узнать новое положение. Его присылает сама кнопка.
Как сделать:
В UI-Designer выделите кнопку и в «Свойства кнопки» включите флажок «Отметить как toggle» (тип обратной связи оставьте «Momentary»). Сохраните и опубликуйте интерфейс.
В U-Logic (редактор программы управления) в
ui - switchдобавьте правило на эту кнопку. В событии выберитеvalue_changed: оно приходит только у переключателя (список событий кнопки подробно — «Приём событий»).Дальше по значению
msg.payload.valueразберите «включено» и «выключено» и отправьте устройству нужную команду («Команды устройствам и ответы»). Это можно сделать двумя способами, оба разобраны по шагам в «Первой программе», блоки E и F.
Что приходит в программу при одном нажатии переключателя:
Событие |
Когда |
Значение |
|---|---|---|
|
нажатие и отпускание |
нет |
|
касание |
нет |
|
сразу после |
новое положение: |
Поэтому в правиле выбирайте именно value_changed: оно одно на переключение и несёт новое положение. push и release приходят и на включение, и на выключение, и по ним положение не узнать.
Что вы увидите: в отладке после UI - Panel in при каждом нажатии появляются push, release, tap и value_changed с "value":"pressed" или "value":"default".
Отладка при двух нажатиях переключателя: 1 — value_changed со значением pressed (включили), 2 — value_changed со значением default (выключили)
Примечание
Если переключатель входит в группу Interlock (см. ниже), value_changed у него не приходит: нажатие выбирает кнопку (selected), повторное — снимает выбор, но события с положением не будет. Для включения и выключения не используйте переключатели в группе Interlock.
Вид переключателя из программы. Положение запоминает UI-Panel (страница, на которой оператор работает с интерфейсом). Программа может принудительно поставить положение: она отправляет кнопке сообщение uiState («Изменение вида на панели»), и следующее нажатие переключит уже от этого положения. Если положение должно зависеть от ответа устройства (микрофон включили с другой панели), ведите вид кнопки по ответу устройства: uiState pressed или default. На принудительную установку событие value_changed не приходит, оно только от нажатия на панели.
Способ 1. Узел switch
switch проверяет msg.payload.value: правило «== pressed» (строка) — на один выход, «== default» (строка) — на другой. К выходам подключены два узла change: «Микрофон: включить» (msg.command = setMute, msg.parameters = {"mute": false}) и «Микрофон: выключить» ({"mute": true}). Оба ведут в один device - command. Так сделана кнопка «Микрофон в ВКС» (Vcs_Mic_b) в «Демо-зале», блок «ВКС»: нажатая кнопка (зелёная) — микрофон включён.
Как выглядит блок на вкладке — в «Программе «Демо-зал»: обзор», блок 5.
Способ 2. Узел change и JSONata
Те же два положения можно разобрать одним change. Правило «Установить» msg.parameters с типом «выражение» (JSONata) и текстом {"mute": payload.value = "default"}: выражение сравнивает значение с "default" и получает true или false. Что такое JSONata и как читать это выражение по частям — в «Первой программе», блок F.
Выбирайте switch, когда на каждое положение нужны разные действия, и выражение — когда различие только в одном значении.
Узел toggle - helper
Примечание
Узел toggle - helper есть в палитре, но для переключателей использовать его не рекомендуется: он хранит своё положение отдельно от панели, и два положения (в узле и на панели) приходится синхронизировать. После «Развернуть» (кнопка, которая запускает правки программы в работу) узел считает кнопку обычной, даже если панель помнит её нажатой, и нажатия начинают переключать «не туда». Положение приходит само, событием value_changed; вид кнопки при необходимости ставьте узлом api - helper - 2 («Изменение вида на панели»).
Группы кнопок «выбирается одна»
Есть два способа сделать «выбирается одна». Выбор зависит от того, чья подсветка важнее — нажатия на панели или реального состояния устройства.
Группа «Interlock» в UI-Designer |
Узел |
|
|---|---|---|
Кто подсвечивает |
сама панель, сразу при нажатии |
программа, когда пришёл ответ устройства |
Нужна ли программа |
нет, подсветка работает без неё |
да |
Когда брать |
устройство не отвечает, или подтверждение не важно: вкладки, режимы, выбор камеры |
важно настоящее состояние: источник могли переключить пультом или с другой панели, команда могла не пройти |
Пример |
секция 1 «Первой программы» |
секция 2 «Первой программы» и блок «Экран» «Демо-зала» |
Interlock в UI-Designer: программа не нужна
В UI-Designer группа с флажком «Interlock» сама подсвечивает нажатую кнопку, остальные кнопки группы гасит. Для вкладок, режимов и выбора камеры этого хватает: программа вообще не участвует (подробно — «Кнопки и состояния»). Ваша программа только получает нажатие и делает то, что нужно.
interlock - 2: подсветка по ответу устройства
Зачем. Interlock в UI-Designer подсвечивает то, что нажато на этой панели. Узел interlock - 2 нужен, когда подсветку должна менять программа:
кнопка должна отражать состояние устройства, а не нажатие: источник выбрали пультом, сценарием или с другой панели;
нужно снять выбор со всей группы («Убрать источник»);
нажатие может не получиться, и подсвечивать надо только после ответа устройства.
Как настроить:
В узле выберите «Интерфейс».
«Тип события» оставьте
uiState: в списке для него доступны только кнопки. Показать один элемент и скрыть остальные лучше узломapi - helper - 2с событием «Видимость» (см. «Изменение вида на панели»).«Активное состояние» — состояние выбранной кнопки (обычно
selected), «Состояние по умолчанию» — остальных (обычноdefault).«Источник входных данных» — где узел ищет имя активной кнопки; по умолчанию
msg.payload.Через «Кнопки интерфейса» и «Добавить» внесите в «Список кнопок» все кнопки группы.
Окно узла interlock - 2 «Источники»: 1 — «Интерфейс», 2 — «Тип события», 3 — «Активное состояние» и «Состояние по умолчанию», 4 — «Источник входных данных», 5 — «Список кнопок»
Как подать данные:
в
msg.payload— строка с точным именем кнопки из списка. Объект события изui - switchдля этого не годится: сначала достаньте имя (msg.payload.object) узломchange;msg.reset = true(или строкаreset stateв источнике) — всем кнопкам списка ставится состояние по умолчанию.
Что вы увидите: выбранная кнопка перешла в selected, остальные кнопки списка — в default. Если имя не совпало ни с одной кнопкой списка, узел молча ничего не отправляет.
Как это сделано в «Демо-зале»: в блоке «Экран» ответ матрицы проходит два switch — «Подтверждено?» (только настоящий ответ) и «Какой выход?» (только выход 1, экран зала). Затем change «Вход → кнопка» берёт из карты в памяти имя кнопки по номеру входа (demoInputs[msg.payload.input].button) и кладёт его в msg.payload. interlock - 2 «Источники» подсвечивает эту кнопку, остальные гаснут; для входа 0 («Убрать источник») карта отдаёт строку reset state, и подсветка снимается со всей группы. Тот же приём в маленьком виде — блок D «Первой программы»; как выглядит блок «Экран» на вкладке — в «Программе «Демо-зал»: обзор», блок 4.
Примечание
В палитре есть ещё узел interlock с подписями окна на английском. Он тоже подсвечивает одну кнопку и сбрасывает группу, но имена кнопок в нём вписываются вручную, источник данных всегда msg.payload, а сброс — только строкой reset state. Используйте interlock - 2: он выбирает кнопки из списка интерфейса, позволяет выбрать «Источник входных данных» и принимает msg.reset.
Частые ошибки
В
interlock - 2пришёл объект вместо строки. Выходui - switch— это объект события; передinterlock - 2достаньте из негоobjectузломchange.interlock - 2ничего не делает. Имя на входе не равно ни одной кнопке из «Списка кнопок». Проверьте регистр и пробелы.value_changedне приходит. Кнопка не отмечена как toggle в UI-Designer, интерфейс не опубликован заново или кнопка входит в группу Interlock. Проверьте также «Тип обратной связи»: событие с положением приходит при «Momentary» и «Triggered»; при «None» кнопка на касание не отвечает вовсе.Кнопка включилась, а устройство выключено. Положение кнопки и положение устройства разошлись: переключатель могли включить с другой панели или сценарием. Ставьте вид кнопки по ответу устройства.