Skip to content

Instantly share code, notes, and snippets.

@brweber2
Last active August 29, 2015 14:13
Show Gist options
  • Save brweber2/b37b416e550674c7db27 to your computer and use it in GitHub Desktop.
Save brweber2/b37b416e550674c7db27 to your computer and use it in GitHub Desktop.
gen_fsm example
defmodule Exflow do
@behaviour :gen_fsm
def start_link(code) do
IO.puts "starting fsm"
:gen_fsm.start_link({:local, Exflow}, Exflow, :lists.reverse(code), [])
end
def button(digit) do
IO.puts "pushing button #{digit}"
:gen_fsm.send_event(Exflow, {:button, digit})
end
def init(code) do
IO.puts "fms init"
{:ok, :locked, {[], code}}
end
def get_status() do
:sys.get_status(Exflow)
end
def locked({:button, digit}, {soFar, code}) do
IO.puts "checking if the device is locked"
case [digit|soFar] do
^code ->
do_unlock()
{:next_state, :open, {[], code}, 30000}
incomplete when length(incomplete)<length(code) ->
{:next_state, :locked, {incomplete, code}}
_wrong ->
{:next_state, :locked, {[], code}}
end
end
def open(:timeout, state) do
IO.puts "opening device"
do_lock()
{:next_state, :locked, state}
end
defp do_unlock() do
IO.puts "unlocking"
end
defp do_lock() do
IO.puts "locking"
end
def code_change(oldVsn, stateName, stateData, extra) do
IO.puts "changing out code"
new_state_data = ["bar"]
{:ok, :locked, new_state_data}
end
def handle_event(:stop, _state_name, state_data) do
IO.puts "handling event"
{:stop, :normal, state_data}
end
def handle_info({"EXIT", pid, reason}, state_name, state_data) do
IO.puts "exiting"
state_data_1 = ["a", "b", "c"]
{:exit, :locked, state_data_1}
end
def handle_sync_event(a, b, c, d) do
IO.puts "sync event"
end
def terminate(a, b, c) do
IO.puts "terminating"
:ok
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment