Advertisement
Guest User

Untitled

a guest
Nov 29th, 2015
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.69 KB | None | 0 0
  1. -module(stupid_dog_fsm).
  2. -author('ryuone<ryuone@gmail.com>').
  3.  
  4. -behaviour(gen_fsm).
  5.  
  6. -export([start_link/0]).
  7. -export([init/1, handle_event/3, handle_sync_event/4, handle_info/3, terminate/3, code_change/4]).
  8. -export([sit/3, bark/3, wag_tail/3]).
  9. -export([get_sync_state/1]).
  10. -export([test/0]).
  11.  
  12. -record(state, {name}).
  13.  
  14. start_link() ->
  15. {ok, proc_lib:spawn_link(?MODULE, init, [self()])}.
  16.  
  17. init(_Args) ->
  18. process_flag(trap_exit, true),
  19. State = #state{name = ryuone},
  20. gen_fsm:enter_loop(?MODULE, [], sit, State).
  21.  
  22. handle_event(stop, _StateName, State) ->
  23. {stop, normal, State}.
  24.  
  25. handle_sync_event(get_state, _From, StateName, State) ->
  26. {reply, StateName, StateName, State};
  27. handle_sync_event(stop, _From, _StateName, State) ->
  28. {stop, normal, error, State};
  29. handle_sync_event(Event, _From, StateName, State) ->
  30. io:format("Event : ~p~n", [Event]),
  31. {reply, StateName, StateName, State}.
  32.  
  33. handle_info(_Info, StateName, State) ->
  34. {next_state, StateName, State}.
  35.  
  36. code_change(iOldVsn, StateName, State, _) ->
  37. {ok, StateName, State}.
  38.  
  39. terminate(Reason, _StateName, _State) ->
  40. io:format("terminate called with ~p~n", [Reason]),
  41. ok.
  42.  
  43. %%
  44. %% State
  45. %%
  46. sit(Event=see_squirrel, From, State) ->
  47. io:format("Current state is sit. Event is ~p~n", [Event]),
  48. gen_fsm:reply(From, " State will change to bark."),
  49. {next_state, bark, State}.
  50.  
  51. bark(Event=get_petted, From, State) ->
  52. io:format("Current state is bark. Event is ~p~n", [Event]),
  53. gen_fsm:reply(From, " State will change to get_petted."),
  54. {next_state, wag_tail, State}.
  55.  
  56. wag_tail(Event=wait, From, State) ->
  57. io:format("Current state is wag_tail. Event is ~p~n", [Event]),
  58. gen_fsm:reply(From, " State will change to bark."),
  59. {next_state, bark, State};
  60. wag_tail(Event=get_petted, From, State) ->
  61. io:format("Current state is wag_tail. Event is ~p~n", [Event]),
  62. gen_fsm:reply(From, " State will change to sit."),
  63. {next_state, sit, State}.
  64.  
  65. %%
  66. %% stupid_dog_fsm functins.
  67. %%
  68. get_sync_state(Pid) ->
  69. gen_fsm:sync_send_all_state_event(Pid, get_state).
  70.  
  71. %%
  72. %% Test function.
  73. %%
  74. test() ->
  75. {ok, Pid} = start_link(),
  76. Res = gen_fsm:sync_send_all_state_event(Pid, get_state),
  77. % * Current state : sit
  78. io:format("* Current state : ~p~n", [Res]),
  79. Ret1 = gen_fsm:sync_send_event(Pid, see_squirrel),
  80. % Current state is sit. Event is see_squirrel
  81. % State will change to bark.
  82. io:format("~s~n", [Ret1]),
  83. Ret2 = gen_fsm:sync_send_event(Pid, get_petted),
  84. % Current state is bark. Event is get_petted
  85. % State will change to get_petted.
  86. io:format("~s~n", [Ret2]),
  87. Ret3 = gen_fsm:sync_send_event(Pid, get_petted),
  88. % Current state is wag_tail. Event is get_petted
  89. % State will change to sit.
  90. io:format("~s~n", [Ret3]),
  91. ok = gen_fsm:stop(Pid),
  92. ok.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement