Обобщённая задача такова:
Оборудование (оно же «внешний мир»)
- Данные 1. частота 10 Гц.
- Данные 2. Частота опроса 1 Гц
- Данные 3. Приходят в случайное время (например, чтобы было понятнее: счётчик с внешним запуском, запуск происходит в случайное время)
- Исполнительный механизм 1. Время реакции на запрос неопределённо, получив команду, исполняет её и отправляет отчёт.
- Исполнительный механизм 2. аналогично.
- Ну и UI
- сост 1. отображение только новых данных 1, 2 и 3 (желательно только тот тип, что пришёл). Переход в 2 по команде пользователя.
- сост 2. анализ данных 1. при некоторых значениях перейти в 3. При других – в 4.
- сост 3 отправить команду на ИМ1. после прихода подтверждения перейти в 5
- сост 4 обработка Д3. переход в 5 или 2 в зависимости от значения
- сост 5. ИМ2. после прихода подтверждения перейти в 6
- сост 6. Диалог с пользователем. Переход в 7 или 2.
- сост 7. ИМ1. после прихода подтверждения перейти в 2.
Создаю юзер-события на каждый тип данных (Д1-3) и подтверждения от ИМ.
В машине состояний использую event-структуру. В shift-регистре храню состояние машины.
В разных евентах проверяю текущее состояние. Если «правильное», то выполняю требуемые действия (в том числе меняю значение состояния).
При этом, естественно, в каждом event есть case с пустыми кейсами «по умолчанию».