Переключатели и группы

Две задачи, которые на первый взгляд похожи, но решаются по-разному:

  • переключатель — кнопка «включено / выключено» (микрофон, звук). Программа должна узнать, в каком положении кнопка теперь, и отправить устройству «включить» или «выключить». Эти две задачи вы уже решали в блоках E и F «Первой программы»;

  • группа кнопок «выбирается одна» (источники, режимы, камеры): нажата одна — остальные гаснут; иногда подсветку должна менять программа.

Что нужно заранее: как оформляется и настраивается кнопка-переключатель и группа Interlock в UI-Designer (редактор интерфейсов) — «Кнопки и состояния»; как принять событие — «Приём событий»; как поменять вид кнопки из программы — «Изменение вида на панели».

Переключатель

Переключатель из UI-Designer и событие value_changed

Зачем. Кнопка-переключатель переключается на панели сама — программе для этого ничего не нужно. Программе нужно узнать новое положение. Его присылает сама кнопка.

Как сделать:

  1. В UI-Designer выделите кнопку и в «Свойства кнопки» включите флажок «Отметить как toggle» (тип обратной связи оставьте «Momentary»). Сохраните и опубликуйте интерфейс.

  2. В U-Logic (редактор программы управления) в ui - switch добавьте правило на эту кнопку. В событии выберите value_changed: оно приходит только у переключателя (список событий кнопки подробно — «Приём событий»).

  3. Дальше по значению msg.payload.value разберите «включено» и «выключено» и отправьте устройству нужную команду («Команды устройствам и ответы»). Это можно сделать двумя способами, оба разобраны по шагам в «Первой программе», блоки E и F.

Что приходит в программу при одном нажатии переключателя:

Событие

Когда

Значение

push, release

нажатие и отпускание

нет

tap

касание

нет

value_changed

сразу после tap

новое положение: pressed при включении, при выключении — состояние кнопки по умолчанию (обычно default)

Поэтому в правиле выбирайте именно value_changed: оно одно на переключение и несёт новое положение. push и release приходят и на включение, и на выключение, и по ним положение не узнать.

Что вы увидите: в отладке после UI - Panel in при каждом нажатии появляются push, release, tap и value_changed с "value":"pressed" или "value":"default".

../../_images/toggle-value-changed.png

Отладка при двух нажатиях переключателя: 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

Узел interlock - 2

Кто подсвечивает

сама панель, сразу при нажатии

программа, когда пришёл ответ устройства

Нужна ли программа

нет, подсветка работает без неё

да

Когда брать

устройство не отвечает, или подтверждение не важно: вкладки, режимы, выбор камеры

важно настоящее состояние: источник могли переключить пультом или с другой панели, команда могла не пройти

Пример

секция 1 «Первой программы»

секция 2 «Первой программы» и блок «Экран» «Демо-зала»

Interlock в UI-Designer: программа не нужна

В UI-Designer группа с флажком «Interlock» сама подсвечивает нажатую кнопку, остальные кнопки группы гасит. Для вкладок, режимов и выбора камеры этого хватает: программа вообще не участвует (подробно — «Кнопки и состояния»). Ваша программа только получает нажатие и делает то, что нужно.

interlock - 2: подсветка по ответу устройства

Зачем. Interlock в UI-Designer подсвечивает то, что нажато на этой панели. Узел interlock - 2 нужен, когда подсветку должна менять программа:

  • кнопка должна отражать состояние устройства, а не нажатие: источник выбрали пультом, сценарием или с другой панели;

  • нужно снять выбор со всей группы («Убрать источник»);

  • нажатие может не получиться, и подсвечивать надо только после ответа устройства.

Как настроить:

  1. В узле выберите «Интерфейс».

  2. «Тип события» оставьте uiState: в списке для него доступны только кнопки. Показать один элемент и скрыть остальные лучше узлом api - helper - 2 с событием «Видимость» (см. «Изменение вида на панели»).

  3. «Активное состояние» — состояние выбранной кнопки (обычно selected), «Состояние по умолчанию» — остальных (обычно default).

  4. «Источник входных данных» — где узел ищет имя активной кнопки; по умолчанию msg.payload.

  5. Через «Кнопки интерфейса» и «Добавить» внесите в «Список кнопок» все кнопки группы.

../../_images/interlock-edit.png

Окно узла 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» кнопка на касание не отвечает вовсе.

  • Кнопка включилась, а устройство выключено. Положение кнопки и положение устройства разошлись: переключатель могли включить с другой панели или сценарием. Ставьте вид кнопки по ответу устройства.