<span style="color: rgb(1, 78, 164);">-</span><span style="color: rgb(84, 0, 179);">module</span><span style="color: rgb(16, 154, 184);">(</span>code_lock<span style="color: rgb(16, 154, 184);">)</span><span style="color: rgb(107, 184, 16);">.</span>
<span style="color: rgb(1, 78, 164);">-</span><span style="color: rgb(84, 0, 179);">behaviour</span><span style="color: rgb(16, 154, 184);">(</span>gen_fsm<span style="color: rgb(16, 154, 184);">)</span><span style="color: rgb(107, 184, 16);">.</span>
<span style="color: rgb(1, 78, 164);">-</span><span style="color: rgb(84, 0, 179);">export</span><span style="color: rgb(16, 154, 184);">(</span><span style="color: rgb(16, 154, 184);">[</span>start_link<span style="color: rgb(1, 78, 164);">/</span><span style="color: rgb(255, 150, 0);">1</span><span style="color: rgb(16, 154, 184);">]</span><span style="color: rgb(16, 154, 184);">)</span><span style="color: rgb(107, 184, 16);">.</span>
<span style="color: rgb(1, 78, 164);">-</span><span style="color: rgb(84, 0, 179);">export</span><span style="color: rgb(16, 154, 184);">(</span><span style="color: rgb(16, 154, 184);">[</span>button<span style="color: rgb(1, 78, 164);">/</span><span style="color: rgb(255, 150, 0);">1</span><span style="color: rgb(16, 154, 184);">]</span><span style="color: rgb(16, 154, 184);">)</span><span style="color: rgb(107, 184, 16);">.</span>
<span style="color: rgb(1, 78, 164);">-</span><span style="color: rgb(84, 0, 179);">export</span><span style="color: rgb(16, 154, 184);">(</span><span style="color: rgb(16, 154, 184);">[</span>init<span style="color: rgb(1, 78, 164);">/</span><span style="color: rgb(255, 150, 0);">1</span><span style="color: rgb(107, 184, 16);">,</span> locked<span style="color: rgb(1, 78, 164);">/</span><span style="color: rgb(255, 150, 0);">2</span><span style="color: rgb(107, 184, 16);">,</span> open<span style="color: rgb(1, 78, 164);">/</span><span style="color: rgb(255, 150, 0);">2</span><span style="color: rgb(16, 154, 184);">]</span><span style="color: rgb(16, 154, 184);">)</span><span style="color: rgb(107, 184, 16);">.</span>
<span style="color: rgb(255, 60, 0);">start_link</span><span style="color: rgb(16, 154, 184);">(</span><span style="color: rgb(69, 179, 230);">Code</span><span style="color: rgb(16, 154, 184);">)</span> <span style="color: rgb(107, 184, 16);">-></span>
<span style="color: rgb(255, 78, 24);">gen_fsm</span>:<span style="color: rgb(255, 60, 0);">start_link</span><span style="color: rgb(16, 154, 184);">(</span><span style="color: rgb(16, 154, 184);">{</span>local<span style="color: rgb(107, 184, 16);">,</span> code_lock<span style="color: rgb(16, 154, 184);">}</span><span style="color: rgb(107, 184, 16);">,</span> code_lock<span style="color: rgb(107, 184, 16);">,</span> <span style="color: rgb(69, 179, 230);">Code</span><span style="color: rgb(107, 184, 16);">,</span> <span style="color: rgb(16, 154, 184);">[</span><span style="color: rgb(16, 154, 184);">]</span><span style="color: rgb(16, 154, 184);">)</span><span style="color: rgb(107, 184, 16);">.</span>
<span style="color: rgb(255, 60, 0);">button</span><span style="color: rgb(16, 154, 184);">(</span><span style="color: rgb(69, 179, 230);">Digit</span><span style="color: rgb(16, 154, 184);">)</span> <span style="color: rgb(107, 184, 16);">-></span>
<span style="color: rgb(255, 78, 24);">gen_fsm</span>:<span style="color: rgb(255, 60, 0);">send_event</span><span style="color: rgb(16, 154, 184);">(</span>code_lock<span style="color: rgb(107, 184, 16);">,</span> <span style="color: rgb(16, 154, 184);">{</span>button<span style="color: rgb(107, 184, 16);">,</span> <span style="color: rgb(69, 179, 230);">Digit</span><span style="color: rgb(16, 154, 184);">}</span><span style="color: rgb(16, 154, 184);">)</span><span style="color: rgb(107, 184, 16);">.</span>
<span style="color: rgb(255, 60, 0);">init</span><span style="color: rgb(16, 154, 184);">(</span><span style="color: rgb(69, 179, 230);">Code</span><span style="color: rgb(16, 154, 184);">)</span> <span style="color: rgb(107, 184, 16);">-></span>
<span style="color: rgb(16, 154, 184);">{</span>ok<span style="color: rgb(107, 184, 16);">,</span> locked<span style="color: rgb(107, 184, 16);">,</span> <span style="color: rgb(16, 154, 184);">{</span><span style="color: rgb(16, 154, 184);">[</span><span style="color: rgb(16, 154, 184);">]</span><span style="color: rgb(107, 184, 16);">,</span> <span style="color: rgb(69, 179, 230);">Code</span><span style="color: rgb(16, 154, 184);">}</span><span style="color: rgb(16, 154, 184);">}</span><span style="color: rgb(107, 184, 16);">.</span>
<span style="color: rgb(255, 60, 0);">locked</span><span style="color: rgb(16, 154, 184);">(</span><span style="color: rgb(16, 154, 184);">{</span>button<span style="color: rgb(107, 184, 16);">,</span> <span style="color: rgb(69, 179, 230);">Digit</span><span style="color: rgb(16, 154, 184);">}</span><span style="color: rgb(107, 184, 16);">,</span> <span style="color: rgb(16, 154, 184);">{</span><span style="color: rgb(69, 179, 230);">SoFar</span><span style="color: rgb(107, 184, 16);">,</span> <span style="color: rgb(69, 179, 230);">Code</span><span style="color: rgb(16, 154, 184);">}</span><span style="color: rgb(16, 154, 184);">)</span> <span style="color: rgb(107, 184, 16);">-></span>
<span style="color: rgb(24, 104, 149);">case</span> <span style="color: rgb(16, 154, 184);">[</span><span style="color: rgb(69, 179, 230);">Digit</span>|SoFar<span style="color: rgb(16, 154, 184);">]</span> <span style="color: rgb(24, 104, 149);">of</span>
<span style="color: rgb(69, 179, 230);">Code</span> <span style="color: rgb(107, 184, 16);">-></span>
<span style="color: rgb(255, 60, 0);">do_unlock</span><span style="color: rgb(16, 154, 184);">(</span><span style="color: rgb(16, 154, 184);">)</span><span style="color: rgb(107, 184, 16);">,</span>
<span style="color: rgb(16, 154, 184);">{</span>next_state<span style="color: rgb(107, 184, 16);">,</span> open<span style="color: rgb(107, 184, 16);">,</span> <span style="color: rgb(16, 154, 184);">{</span><span style="color: rgb(16, 154, 184);">[</span><span style="color: rgb(16, 154, 184);">]</span><span style="color: rgb(107, 184, 16);">,</span> <span style="color: rgb(69, 179, 230);">Code</span><span style="color: rgb(16, 154, 184);">}</span><span style="color: rgb(107, 184, 16);">,</span> <span style="color: rgb(255, 150, 0);">3000</span><span style="color: rgb(16, 154, 184);">}</span><span style="color: rgb(107, 184, 16);">;</span>
<span style="color: rgb(69, 179, 230);">Incomplete</span> <span style="color: rgb(24, 104, 149);">when</span> <span style="color: rgb(255, 60, 0);">length</span><span style="color: rgb(16, 154, 184);">(</span><span style="color: rgb(69, 179, 230);">Incomplete</span><span style="color: rgb(16, 154, 184);">)</span><span style="color: rgb(1, 78, 164);"><</span><span style="color: rgb(255, 60, 0);">length</span><span style="color: rgb(16, 154, 184);">(</span><span style="color: rgb(69, 179, 230);">Code</span><span style="color: rgb(16, 154, 184);">)</span> <span style="color: rgb(107, 184, 16);">-></span>
<span style="color: rgb(16, 154, 184);">{</span>next_state<span style="color: rgb(107, 184, 16);">,</span> locked<span style="color: rgb(107, 184, 16);">,</span> <span style="color: rgb(16, 154, 184);">{</span><span style="color: rgb(69, 179, 230);">Incomplete</span><span style="color: rgb(107, 184, 16);">,</span> <span style="color: rgb(69, 179, 230);">Code</span><span style="color: rgb(16, 154, 184);">}</span><span style="color: rgb(16, 154, 184);">}</span><span style="color: rgb(107, 184, 16);">;</span>
<span style="color: rgb(69, 179, 230);">_Wrong</span> <span style="color: rgb(107, 184, 16);">-></span>
<span style="color: rgb(16, 154, 184);">{</span>next_state<span style="color: rgb(107, 184, 16);">,</span> locked<span style="color: rgb(107, 184, 16);">,</span> <span style="color: rgb(16, 154, 184);">{</span><span style="color: rgb(16, 154, 184);">[</span><span style="color: rgb(16, 154, 184);">]</span><span style="color: rgb(107, 184, 16);">,</span> <span style="color: rgb(69, 179, 230);">Code</span><span style="color: rgb(16, 154, 184);">}</span><span style="color: rgb(16, 154, 184);">}</span>
<span style="color: rgb(24, 104, 149);">end</span><span style="color: rgb(107, 184, 16);">.</span>
<span style="color: rgb(255, 60, 0);">open</span><span style="color: rgb(16, 154, 184);">(</span>timeout<span style="color: rgb(107, 184, 16);">,</span> <span style="color: rgb(69, 179, 230);">State</span><span style="color: rgb(16, 154, 184);">)</span> <span style="color: rgb(107, 184, 16);">-></span>
<span style="color: rgb(255, 60, 0);">do_lock</span><span style="color: rgb(16, 154, 184);">(</span><span style="color: rgb(16, 154, 184);">)</span><span style="color: rgb(107, 184, 16);">,</span>
<span style="color: rgb(16, 154, 184);">{</span>next_state<span style="color: rgb(107, 184, 16);">,</span> locked<span style="color: rgb(107, 184, 16);">,</span> <span style="color: rgb(69, 179, 230);">State</span><span style="color: rgb(16, 154, 184);">}</span><span style="color: rgb(107, 184, 16);">.</span>