Во-первых, я хочу поблагодарить вас за то, что вы узнали, что происходит, и сделали эти состояния явными (поскольку они на самом деле являются дополнительными состояниями в вашей модели, а не переходами с действием). Слишком часто я вижу конечные автоматы, которые заканчиваются как ваш последний пример (которого вы хотите избежать). Когда у вас есть тесты для «дополнительных» переменных состояния внутри ваших обработчиков событий, это признак того, что ваш конечный автомат имеет больше состояний, которые вы действительно внесли в проект - эти показы будут отражены в проекте, а не заклинивают в событие существующего состояния обработчики с кучей спагетти-кодированных проверок на дополнительные «состояния», закодированные в глобальных переменных.
Существует несколько платформ для C ++, которые моделируют иерархические конечные автоматы - HSM - (как звучит ваша идея вложенного конечного автомата), но единственная, о которой я знаю, которая поддерживает прямой C, - это Quantum Framework , и я думаю, что покупка в этом, вероятно, будет означать достойный уровень приверженности (то есть, вероятно, это не простое изменение). Однако, если вы хотите изучить эту возможность, Самек написал много статей ( и книгу ) о том, как поддерживать HSM в C.
Однако, если вам не нужны некоторые более сложные части моделей HSM (например, события, которые не обрабатываются «самым внутренним» состоянием), всплывают, чтобы, возможно, обрабатываться родительскими состояниями, полный ввод и выйдите из поддержки всей иерархии состояний), тогда довольно просто поддерживать вложенные конечные автоматы так же, как полностью независимые конечные автоматы, которые запускаются и останавливаются при входе / выходе из родительского состояния.
Модель большого конечного автомата, вероятно, немного проще реализовать (это всего лишь несколько состояний в существующей структуре). Я бы посоветовал, что если добавление состояний в текущий режим конечного автомата не сделает модель слишком сложной, просто продолжайте.
Другими словами, пусть то, что лучше всего подходит для вашей модели , показывает, как вы внедряете конечный автомат в программное обеспечение.