Конечный автомат для встраиваемых устройств - PullRequest
1 голос
/ 18 июля 2011

Я сделал несколько меню, используя FSM, но с ОЧЕНЬ неуклюжим интерфейсом. Я взял годичный перерыв от программирования, чтобы облегчить переезд, и только сегодня вечером переписал мой старый код FSM.

Видно ЗДЕСЬ

Проблема с моим кодом в том, что он требует серьезной переделки класса StateMachine и обработчика событий всякий раз, когда вы меняете реализацию. Поскольку это на встроенном устройстве, я не могу использовать BOOST :: FSM, поэтому я хочу написать свой собственный класс, достаточно надежный для обработки таких вещей, как меню и программирование антилогарифмов (например, ICSP для PIC - это простой FSM)

Как вы, ребята, посоветуете сделать мой конечный автомат более удобным для использования?

1 Ответ

1 голос
/ 18 июля 2011

Если вы пишете свой собственный класс - рассмотрите возможность реализации универсального FSM, а затем заполните его состояниями и событиями.

В основном это был бы простой интерфейс с чем-то вроде этого в качестве методов:

create();
addState(someState, stateFunction);
addEdge(someStateOrig, someStateDest, event);
processEvent(event);
start(startFromState);

Это должно покрыть это. Затем, когда вы создаете FSM - передайте его своим состояниям и функциям, выполняемым при достижении состояния, и событиям, которые заставляют FSM переходить из одного состояния в другое.

Затем вы просто запускаете FSM в каком-то состоянии, которое будет состоянием запуска, и подаете события.

Если вам нужно изменить события, функции или состояния - реализация FSM остается прежней, вы меняете код, который его использует, как и должно быть.

Это более или менее то, что дает вам Boost.FSM, но вы сказали, что не можете его использовать - так что делайте это самостоятельно: -)

...