Packages
sippet
0.1.0
1.0.16
1.0.15
1.0.14
1.0.13
1.0.12
1.0.11
1.0.10
1.0.9
1.0.8
1.0.7
1.0.6
1.0.5
1.0.4
1.0.3
1.0.2
1.0.1
1.0.0
0.6.4
0.6.3
0.6.2
0.6.1
0.6.0
0.5.9
0.5.8
0.5.7
0.5.6
0.5.5
0.5.4
0.5.3
0.5.2
0.5.1
0.5.0
0.4.9
0.4.8
0.4.7
0.4.6
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.3.9
0.3.8
0.3.7
0.3.6
0.3.5
0.3.4
0.3.3
0.3.2
0.3.1
0.3.0
0.2.9
0.2.8
0.2.7
0.2.6
0.2.5
0.2.4
0.2.3
0.2.2
0.2.1
0.2.0
0.1.9
0.1.8
0.1.7
0.1.6
0.1.5
0.1.4
0.1.3
0.1.2
0.1.1
0.1.0
An Elixir Session Initiation Protocol (SIP) stack.
Current section
Files
Jump to
Current section
Files
lib/code_lock.ex
defmodule CodeLock do
def start_link(code) when is_list(code) do
:gen_statem.start_link({:local, :code_lock}, __MODULE__, code, [])
end
def button(digit) when is_integer(digit) do
:gen_statem.cast(:code_lock, {:button, digit})
end
def init(code) do
do_lock()
:erlang.start_timer(10000, self(), :kabum)
{:ok, :locked, %{code: code, remaining: code}}
end
def callback_mode() do
[:state_functions, :state_enter]
end
def locked(:enter, _old_state, _data) do
IO.puts("Entered 'locked' state")
:keep_state_and_data
end
def locked(:info, {:timeout, _timer, _key}, _data) do
IO.puts("Kabum in 'locked' state")
:keep_state_and_data
end
def locked(:cast, {:button, digit}, %{remaining: [digit]} = data) do
do_unlock()
{:next_state, :open, %{data | remaining: []}, [{:state_timeout, 5000, :lock}]}
end
def locked(:cast, {:button, digit}, %{remaining: [digit|rest]} = data) do
{:next_state, :locked, %{data | remaining: rest}, [{:state_timeout, 5000, :lock}]}
end
def locked(:cast, {:button, _digit}, %{code: code} = data) do
{:next_state, :locked, %{data | remaining: code}}
end
def locked(:state_timeout, :lock, %{code: code} = data) do
do_lock()
{:repeat_state, %{data | remaining: code}}
end
def open(:enter, _old_state, _data) do
IO.puts("Entered 'open' state")
:keep_state_and_data
end
def open(:state_timeout, :lock, %{code: code} = data) do
do_lock()
{:next_state, :locked, %{data | remaining: code}}
end
def open(:info, {:timeout, _timer, _key}, _data) do
IO.puts("Kabum in 'open' state")
:keep_state_and_data
end
def do_lock() do
IO.puts("Lock")
end
def do_unlock() do
IO.puts("Unlock")
end
def terminate(_reason, state, _data) do
if(state == :locked, do: do_lock())
:ok
end
def code_change(_vsn, state, data, _extra) do
{:ok, state, data}
end
end