Skip to content

Instantly share code, notes, and snippets.

@leandrosilva
Created October 30, 2009 22:20
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save leandrosilva/222776 to your computer and use it in GitHub Desktop.
Save leandrosilva/222776 to your computer and use it in GitHub Desktop.
A simple finite state machine implemented with gen_fsm
%% finite state machine
-module(simples_fsm).
-behaviour(gen_fsm).
-export([start_link/1, dispara_evento/1]).
-export([init/1]).
-export([estado_um/2, estado_dois/2, estado_tres/2]).
%% api
start_link(DadosEstadoInicial) ->
gen_fsm:start_link({local, ?MODULE}, ?MODULE, DadosEstadoInicial, []).
dispara_evento(Evento) ->
gen_fsm:send_event(?MODULE, {evento, Evento}).
%% callbacks
init(DadosEstadoInicial) ->
io:format("init: ~s~n", [DadosEstadoInicial]),
{ok, estado_um, {dados_estado, DadosEstadoInicial}}.
%% estados
estado_um({evento, evento_um} = EventoOcorrido, {dados_estado, DadosEstadoAtual} = EstadoAtual) ->
NovoEstado = {dados_estado, DadosEstadoAtual ++ "+1"},
imprime_estado(estado_um, EventoOcorrido, EstadoAtual, NovoEstado),
{next_state, estado_dois, NovoEstado, 10000}.
estado_dois({evento, evento_dois} = EventoOcorrido, {dados_estado, DadosEstadoAtual} = EstadoAtual) ->
NovoEstado = {dados_estado, DadosEstadoAtual ++ "+2"},
imprime_estado(estado_dois, EventoOcorrido, EstadoAtual, NovoEstado),
{next_state, estado_tres, NovoEstado};
estado_dois(timeout, {dados_estado, DadosEstadoAtual} = _EstadoAtual) ->
NovoEstado = {dados_estado, DadosEstadoAtual ++ "+X"},
{next_state, estado_um, NovoEstado}.
estado_tres({evento, evento_tres} = EventoOcorrido, {dados_estado, DadosEstadoAtual} = EstadoAtual) ->
NovoEstado = {dados_estado, DadosEstadoAtual ++ "+3"},
imprime_estado(estado_tres, EventoOcorrido, EstadoAtual, NovoEstado),
{next_state, estado_um, NovoEstado}.
imprime_estado(NomeEstadoAtual, EventoOcorrido, EstadoAtual, NovoEstado) ->
{_, DadosEstadoAtual} = EstadoAtual,
{_, DadosNovoEstado} = NovoEstado,
io:format("~s => evento: ~w, estado atual: ~s, novo estado: ~s~n",
[NomeEstadoAtual, EventoOcorrido, DadosEstadoAtual, DadosNovoEstado]).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment