Страница 1 из 1

Машина состояний: взаимодействие While Loop и Case

Добавлено: 15 дек 2016, 15:46
LEO_NIK
Здравствуйте! Разрабатывая модель радиостанции с использованием МАШИНЫ СОСТОЯНИЙ для разных режимов работы, столкнулся с вопросами. Привожу простой пример, на котором покажу свои вопросы. В примере нужно сделать так, чтобы после нажатия на кнопку ВКЛ на лицевой панели появилось идущее вперёд время и дальше две ситуации: либо регулятор звука в нулевом, либо в каком-то другом положении от предыдущего включения ВП. Если регулятор звука в нулевом положении, то мигает предупредительная надпись и надо регулятор звука (пока самого звука нет, но для вопроса это и не важно) поставить в любое положение (1, 2...). Исчезнет мигающее предупреждение и появится индикация выставленного уровня в виде прямоугольников, пропорционально положению регулятора. Вот на этом надо бы остановиться, но чтобы и время двигалось вперёд и была возможность выставить на лицевой панели любой другой уровень. Это дежурный режим, в котором и уровень звука должен регулироваться с описанным выше условием, и время должно "идти", и чтобы можно было выключить прибор. Как остановить выполнение программы на дежурном режиме? Куда надо отправить программу селектором Case Structure после выполнения в моём примере селектора "Индикатор звука"? На лицевой панели будет ещё несколько кнопок и они должны быть доступны в дежурном режиме для работы, т.е. программа должна отслеживать состояние элементов на лицевой панели. Намеренно делал маленькими фрагменты машины состояний, чтобы быть близко к реальному проекту, где внутри каждых Case содержится фрагмент кода.
И более мелкий вопрос. После первого же положения регулятора звука перестаёт мигать надпись и программа идёт дальше. А как сделать так, чтобы программа выжидала, когда закончится вращение потенциометра (пользователь может вращать регулятор как на увеличение, так и на уменьшение: 2-й, 3-й, ... ЛЮБОЙ уровень) и только потом выходила из этого цикла, отображая соответствующее количество "прямоугольников" установленного уровня. Спасибо.

Re: Машина состояний: взаимодействие While Loop и Case

Добавлено: 15 дек 2016, 19:36
Artem.spb
самое банальное - поменять местами case и event.
события-кнопки что-то желают, всё остальное происходит в таймауте, там и будет case по машине состояний.
В нынешней конфигурации система очень опасна. Попробуйте в состоянии "звук" выключить рубильник. Подозреваю, что вы опечалитесь тем фактом, что с программой больше ничего нельзя сделать, потому что она не заблокировала все контролы (точнее, панель управления).

Re: Машина состояний: взаимодействие While Loop и Case

Добавлено: 15 дек 2016, 20:22
LEO_NIK
Artem.spb писал(а):... поменять местами case и event
Спасибо. Проверю. А не автоматом ли появляется очередной case в машине состояний? Это к тому, что можно ли поменять местами case и event? Попробую.
Artem.spb писал(а):... Попробуйте в состоянии "звук" выключить рубильник
Спасибо, учту замечание. Пробовал. Да, система ни на что не реагирует и при повторном нажатии, если не ошибаюсь, весь цикл загрузки повторялся. Отключал RUN. Но я как-то на это не обратил внимания, поскольку кнопку ВКЛ/ВЫКЛ для ВЫКЛ собирался кодировать в самом конце программирования. Она должна выключать радиостанцию при нажатии на неё (если точно, то при отжатии) и удержании в нажатом состоянии не менее 3 сек. А если меньше, то она никак не должна проявлять себя.

Re: Машина состояний: взаимодействие While Loop и Case

Добавлено: 15 дек 2016, 20:39
Blackman
Пример

Re: Машина состояний: взаимодействие While Loop и Case

Добавлено: 15 дек 2016, 21:25
LEO_NIK
Спасибо, Blackman. Запустил программу, просто конфетка! Но пока не нашел, где устанавливаются цвета мигания Sound Volume? Если не ошибаюсь, то желтый/красный - это "по умолчанию"? А если поменять?
Как я понял, мне надо разобраться, как в деталях работает Event Structure. Спасибо ещё раз!