Вот мой "АГРЕГАТ" - эмулятор системы охраны. Это самый простой (с точки зрения логики) из тех, что я разрабатывал.
Например, вот часть логики которую необходимо реализовать:
1. Поворачиваем ключ №1.
2. Включается устройство.
3. Идет самотестирование, никакие кнопки не должны работать.
4. Тестирование закончилось. Кнопки начинают работать.
5. Производим выбор наблюдательного устройства с камерой (и так для каждого, пока их 4).
6. Подготовка устройства наблюдения 5 сек (и так для каждого, пока их 4).
7. Выключаем устройство. Вся индикация гаснет.
Для каждого действия должен вестись протокол событий (нажатий на кнопки с последующим отображением).
Я сейчас, только продумываю архитектуру приложения, пока придерживаюсь позиции, когда все стейты находятся в одном графе (я бы с удовольствием разместил их в разных, если бы они были глобальные и доступ к ним в FSM inspector был бы в виде иерархии с подгруппами, а не просто по группам). Если использовать локальные переменные и messages, то можно их конечно разделить, но, я так понимаю, - это двойная работа и дублирование данных по сравнению с тем, если сразу проверять состояние напрямую. Еще во всем быстро должны разобраться другие разработчики, чтобы все было прозрачно и можно было бы быстро найти, куда убежала логика. Можно конечно с помощью message "глобализировать" состояния... Пока думаю над этим. Возможно было бы проще действительно разделить их.
Вот пример использования стейтов.