Конечный автомат для встроенных устройств

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

Его можно увидеть ЗДЕСЬ

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

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


person uMinded    schedule 18.07.2011    source источник
comment
Следует ли перенести это в код-ревью?   -  person Seth Carnegie    schedule 18.07.2011


Ответы (1)


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

По сути, это будет простой интерфейс с чем-то вроде этого в качестве методов:

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

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

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

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

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

person littleadv    schedule 18.07.2011
comment
Спасибо за информацию. Прошлой ночью я проснулся с мыслью, какого черта я реализую логику ввода в процедуре обработки событий?! Я должен кормить FSM событиями из моего перечисления, только я собираюсь потратить некоторое время и немного перепроектировать. - person uMinded; 18.07.2011
comment
Я собираюсь изложить структуру моего кода так, как я хотел бы реализовать его в псевдокоде, а затем реализовывать его по частям. На каком сайте stackExchange это можно сделать? - person uMinded; 19.07.2011