У нас есть довольно большое приложение USSD, которое использует модуль gen_fsm от Erlang для управления параметрами меню.Изменение состояния gen_fsm на функцию в другом модуле
В текущей версии есть один файл menus_fsm.erl
, содержащий более 5000 строк кода gen_fsm. Наша следующая версия дает нам возможность разделить menus_fsm.erl
на отдельные файлы, чтобы сделать его более удобным для обслуживания в будущем.
В старой версии, чтобы отобразить меню помощи мы сделать следующее (help_menu/1
вызывается из кода не показано, что отображает главное меню):
-module(menus_fsm).
% Snipped some irrelvant code
help_menu(StateData) ->
% Display the first menu
send_menu(StateData, "Please Select:\n1. Option 1\n2. Option 2"),
{next_state, waitHelpMenuChoice, StateData, ?MENU_TOUT};
waitHelpMenuChoice(Params, StateData) ->
io:format("Got Help menu response: ~p", [Params]),
doTerminate(ok,"Help Menu", StateData).
Я оставил вне много кода, показывает точку входа в FSM и т. д.
В новой версии, мы хотим двигаться help_menu/1
и waitHelpMenuChoice/2
нового модуля help_menu
, который вызывается из menus_fsm
, например, так:
-module(help_menu).
% Snipped some irrelevant code
help_menu(StateData) ->
menus_fsm:send_menu(StateData, "Please Select:\n1. Option 1\n2. Option 2"),
{next_state, waitHelpMenuChoice, StateData, ?MENU_TOUT};
waitHelpMenuChoice(Params, StateData) ->
io:format("Got Help menu response: ~p", [Params]),
menus_fsm:doTerminate(ok,"Help Menu", StateData).
Проблемы с линией {next_state, waitHelpMenuChoice, StateData, ?MENU_TOUT};
: gen_fsm
ожидает waitHelpMenuChoice
будет в модуле menus_fsm
, который вернет меня туда, где мы начали.
Я пытался заменить проблемную линию
{next_state, fun help_menu:waitHelpMenuChoice/2, StateData, ?MENU_TOUT};
, но это просто Leas ошибки вроде следующего: {badarg,[{erlang,apply,[conv_fsm,#Fun<help_menu.waitHelpMenuChoice.2>,[]]}
Кто-нибудь есть какие-либо предложения о том, как обойти это?