Last active
August 29, 2015 14:13
-
-
Save brweber2/b37b416e550674c7db27 to your computer and use it in GitHub Desktop.
gen_fsm example
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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