PDA

Просмотр полной версии : Модуль Screen, реализация screensaver



walhi
05.10.2021, 22:20
Добрый день. В модуле Screen есть режимы "погашен" и "притушен". Я рассматриваю их, как screensaver. Однако, есть проблема, красивое решение которой мне в голову пока не приходит.

Нет возможности удерживать экран в основном режиме. В модуле есть переменная "Wake up", которая по фронту выводит экран из спячки. Но вот её переключение никак не сбрасывает таймер бездействия пользователя.

Демонстрационный код достаточно простой. Дискретный сигнал под кодовым именем "наличие аварии" заведен в BLINK. Выход BLINK привязан к "Wake up". Полный цикл BLINK в несколько раз меньше времени перехода в режим "притушен".

Получается следующая ситуация: пришло событие "wake up", экран показал основную визуализацию, подождал N секунд, перешел в режим "притушен", возврат к первому пункту цепочки.

А хотелось бы сделать удержание основной визуализации. Попробую сделать переключение из кода с нужной мне логикой, но это костыль выходит. Думаю, что описанное поведение - это баг, а не фича.

P.S. При пустом имени визуализации для режима "притужен" все равно происходит переход в этот режим, далее "Wake up" и сброс на основную визуализацию. Тут можно было бы сказать "так поставь время 0, чтобы отключить функцию", но при этом предоставлена возможность менять значение из кода, а проверку аргументов не завезли.

Евгений Кислов
06.10.2021, 06:28
Добрый день.


Нет возможности удерживать экран в основном режиме. В модуле есть переменная "Wake up", которая по фронту выводит экран из спячки. Но вот её переключение никак не сбрасывает таймер бездействия пользователя.

Как вы это определяете?


Получается следующая ситуация: пришло событие "wake up", экран показал основную визуализацию, подождал N секунд, перешел в режим "притушен", возврат к первому пункту цепочки.
А хотелось бы сделать удержание основной визуализации. Попробую сделать переключение из кода с нужной мне логикой, но это костыль выходит. Думаю, что описанное поведение - это баг, а не фича.

Описанное поведение, на мой взгляд, выглядит совершенно корректным.
Что вы называете "удержанием основной визуализации"?
Опишите подробно задачу, которую вы пытаетесь решить.
При необходимости выложите проект, с помощью которого можно воспроизвести то поведение, которое вы считаете ошибочным.


P.S. При пустом имени визуализации для режима "притужен" все равно происходит переход в этот режим, далее "Wake up" и сброс на основную визуализацию. Тут можно было бы сказать "так поставь время 0, чтобы отключить функцию", но при этом предоставлена возможность менять значение из кода, а проверку аргументов не завезли.

Это запланированное поведение. Основная цель компонента - реализовать гашение подсветки, а оно может происходить и без переключения экранов.
В этом случае имя экрана визуализации в компоненте оставляется пустым.

walhi
06.10.2021, 09:04
Спасибо за быстрый ответ.


Опишите подробно задачу, которую вы пытаетесь решить.

Я пытаюсь сделать screensaver, когда все нормально и нет активных аварий. При наличии аварии экран должен отображать основную визуализацию. Для этого идеально подходит модуль Screen.


...не сбрасывает таймер бездействия... Как вы это определяете?

Если при периодическом сигнале "Wake up" (напомню, что интервалы переключения в несколько раз меньше времени перехода) включился режим "притушено", то делаю вывод, что этот таймер не сбрасывается. К сожалению, не нашел где посмотреть сколько времени осталось до перехода, хотя было желание "для поиграть" сделать анимацию таймаута.


Описанное поведение, на мой взгляд, выглядит совершенно корректным.

Возможно, я некорректно объяснил. У меня получилась мигалка. Сигнал "Wake up" обрабатывается только при активных режимах "притушен" и "погашен". В обычном режиме сделал вывод, что игнорируется. Прикладываю пример проекта-мигалки.


Это запланированное поведение. Основная цель компонента - реализовать гашение подсветки, а оно может происходить и без переключения экранов.

Тут я соглашусь. У меня была указана визуализация выхода из режимов "притушен" и "погашен". Отсюда и подобное поведение.

Евгений Кислов
06.10.2021, 10:13
Я посмотрел проект - вероятнее всего, бит Wake Up обрабатывается только в состояниях Погашено и Притушено (т.е. нельзя использовать его "превентивно").

Поэтому в вашем случае разумно вообще отказаться от переключения экранов через узел Screen и использовать



переключение из кода с нужной мне логикой

walhi
06.10.2021, 10:26
Я посмотрел проект - вероятнее всего, бит Wake Up обрабатывается только в состояниях Погашено и Притушено (т.е. нельзя использовать его "превентивно").

Поэтому в вашем случае разумно вообще отказаться от переключения экранов через узел Screen и использовать

Ну я это поведение и описал. Вроде и не совсем ошибка, но и неприятно. Возможно, в будущем исправят.

Мне в голову пришло решение: послать сигнал "wake up" и установить время отключения в 0, чтобы заблокировать. После снятия сигнала аварии вернуть нормальное значение в таймер и продолжить работу. Пока этот костыль не проверял.

Евгений Кислов
06.10.2021, 10:41
Возможно, в будущем исправят.

Пока не вижу предпосылок.
Вашу задачу можно решить так:



VAR
// ФБ из библиотеки OSCAT Basic
// генерирует единичный импульс при каждом изменении входного значения
fbChangeValue: BASIC.D_TRIG;
fbUserInactivityTimer: TON;
xAlarm: BOOL;
END_VAR

// генерируем импульс при каждом нажатии на экран, чтобыо отслеживать активность пользователя
fbChangeValue(IN := SCREEN.countTouch);

// здесь определяем период неактивности пользователя
fbUserInactivityTimer(IN := NOT(fbChangeValue.Q), PT := T#10S);

IF NOT(xAlarm) AND fbUserInactivityTimer.Q THEN

// переключаем экран только на таргет-визуализации
VisuElems.g_VisuManager.SetMainVisuGlobally(VisuEl ems.Visu_ClientType.Targetvisualization, 'Screensaver');

ELSIF xAlarm THEN

VisuElems.g_VisuManager.SetMainVisuGlobally(VisuEl ems.Visu_ClientType.Targetvisualization, 'Main');
fbUserInactivityTimer(IN := FALSE);

END_IF