erlang OTP中的四大behaviour fsm的例子

 

下面是一个fsm的例子,代码如下:

 

 1 -module(code_lock2).
 2 
 3 -behaviour(gen_fsm).
 4 -export([start_link/1]).
 5 -export([button/1]).
 6 -export([init/1, locked/2, open/2]).
 7 -export([code_change/4, handle_event/3, handle_info/3, handle_sync_event/4, terminate/3]).
 8 
 9 -spec(start_link(Code::string()) -> {ok,pid()} | ignore | {error,term()}).
10 start_link(Code) ->
11     gen_fsm:start_link({local, code_lock2}, code_lock2, Code, []).
12 
13 -spec(button(Digit::string()) -> ok).
14 button(Digit) ->
15     gen_fsm:send_event(code_lock2, {button, Digit}).
16 
17 init(LockCode) ->
18     io:format("init: ~p~n", [LockCode]),
19     {ok, locked, {[], LockCode}}.
20 
21 locked({button, Digit}, {SoFar, Code}) ->
22     io:format("buttion: ~p, So far: ~p, Code: ~p~n", [Digit, [SoFar|Digit], Code]),
23     InputDigits = lists:append(SoFar, Digit),
24     io:format("Right now the password is ~p~n", [InputDigits]),
25     case InputDigits of
26         Code ->
27             do_unlock(),
28             {next_state, open, {[], Code}, 10000};
29         Incomplete when length(Incomplete)<length(Code) ->
30             {next_state, locked, {Incomplete, Code}, 5000};
31         Wrong ->
32             io:format("wrong passwd: ~p~n", [Wrong]),
33             {next_state, locked, {[], Code}}
34     end;
35 locked(timeout, {_SoFar, Code}) ->
36     io:format("timout when waiting button inputting, clean the input, button again plz~n"),
37     {next_state, locked, {[], Code}}.
38 
39 open(timeout, State) ->
40     do_lock(),
41     {next_state, locked, State}.
42 
43 code_change(_OldVsn, StateName, Data, _Extra) ->
44     {ok, StateName, Data}.
45 
46 terminate(normal, _StateName, _Data) ->
47     ok.
48 
49 handle_event(Event, StateName, Data) ->
50     io:format("handle_event... ~n"),
51     unexpected(Event, StateName),
52     {next_state, StateName, Data}.
53 
54 handle_sync_event(Event, From, StateName, Data) ->
55     io:format("handle_sync_event, for process: ~p... ~n", [From]),
56     unexpected(Event, StateName),
57     {next_state, StateName, Data}.
58 
59 handle_info(Info, StateName, Data) ->
60     io:format("handle_info...~n"),
61     unexpected(Info, StateName),
62     {next_state, StateName, Data}.
63 
64 %% Unexpected allows to log unexpected messages
65 unexpected(Msg, State) ->
66     io:format("~p RECEIVED UNKNOWN EVENT: ~p, while FSM process in state: ~p~n",
67               [self(), Msg, State]).
68 %%
69 %% actions
70 do_unlock() ->
71     io:format("passwd is right, open the DOOR.~n").
72 
73 do_lock() ->
74     io:format("over, close the DOOR.~n").

 

开锁过程如下:

 1 3> code_lock2:button([1]).
 2 buttion: [1], So far: [], Code: [1,3,5,3,1,7]
 3 Right now the password is [1]
 4 ok
 5 4> code_lock2:button([3]).
 6 buttion: [3], So far: [1], Code: [1,3,5,3,1,7]
 7 Right now the password is [1,3]
 8 ok
 9 5> code_lock2:button([5]).
10 buttion: [5], So far: [1,3], Code: [1,3,5,3,1,7]
11 Right now the password is [1,3,5]
12 ok
13 timout when waiting button inputting, clean the input, button again plz
14 6> code_lock2:button([3]).
15 buttion: [3], So far: [], Code: [1,3,5,3,1,7]
16 Right now the password is [3]
17 ok
18 timout when waiting button inputting, clean the input, button again plz
19 7> code_lock2:button([1]).
20 buttion: [1], So far: [], Code: [1,3,5,3,1,7]
21 Right now the password is [1]
22 ok
23 8> code_lock2:button([3]).
24 buttion: [3], So far: [[1],3], Code: [1,3,5,3,1,7]
25 Right now the password is [1,3]
26 ok
27 9> code_lock2:button([5]).
28 buttion: [5], So far: [[1,3],5], Code: [1,3,5,3,1,7]
29 Right now the password is [1,3,5]
30 ok
31 10> code_lock2:button([3]).
32 buttion: [3], So far: [1,3,5], Code: [1,3,5,3,1,7]
33 Right now the password is [1,3,5,3]
34 ok
35 11> code_lock2:button([1]).
36 buttion: [1], So far: [1,3,5,3], Code: [1,3,5,3,1,7]
37 Right now the password is [1,3,5,3,1]
38 ok
39 12> code_lock2:button([7]).
40 buttion: [7], So far: [1,3,5,3,1], Code: [1,3,5,3,1,7]
41 Right now the password is [1,3,5,3,1,7]
42 ok
43 passwd is right, open the DOOR.
44 over, close the DOOR.
45 13>

 

有一个地方解释一下,使用fsm:send_event(code_lock2, {button, Digit})相当于发送了一个消息,这个消息怎么处理呢?

如果没有fsm,这样的一个问题几乎没法回答!

 

这个消息先交给fsm,由fsm判断该交给谁去处理?众所周知,fsm是有限状态机的那种behaviour,当然有多个不同状态,按照fsm的约定这个消息会交给“当前的状态”。

因为start_link启动fsm,然后init执行后的状态是locked,所以,上面的消息就交道locked函数!

 

其他的代码,看起来就很明白,不说了。

 

抄代码,执行一下,纯玩。

 

转载于:https://www.cnblogs.com/andypeker/p/4807523.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/431366.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

node python复用代码_python-代码复用(函数、lambda、递归、PyInstaller库)

一、函数1、函数定义def 函数名(参数列表)&#xff1a;2、返回值 return返回值可以有多个&#xff0c;其实是返回一个tuple##多个返回值def sumDiff(x,y):return xy,x-yn1,n2 eval(input(输入两个数&#xff1a;))s,d sumDiff(n1,n2)print(和为{}&#xff0c;差为{}.format(…

关于linux内核的有关叙述中,下列关于嵌入式Linux系统内核的叙述正确的是()。

听力原文&#xff1a; A $150 million project to replace all of the vertical suspension cables on the 100-year-old Manhattan Bridge will cause occasional weekend disruptions in subway service and require closings of the bikeway and some traffic lanes for par…

WebStorm 预览时把浏览器地址localhost 改成IP

最近在使用WebStorm时&#xff0c;预览网页时地址总是显示的 http://localhost:63342/... &#xff0c;如果要调试其它设备感觉很不方法&#xff0c;此时肯定首先想到的亲爱的度娘&#xff0c;但是貌似没有真正很解决问题的&#xff08;可能是我搜索方法不对&#xff09;。最后…

通用即插即用监视器驱动下载_电脑设备驱动程序有问题,教你3招,快速修复...

驱动程序允许你的设备与Windows 10进行通信。计算机必须安装最新版本的驱动程序才能正常运行。设备驱动程序是一种特殊的软件程序&#xff0c;它控制连接到计算机的特定硬件设备&#xff0c;设备驱动程序对于计算机促进系统与所有已安装程序或应用程序之间的通信至关重要&#…

python在线投票系统讲解_在线投票系统功能分析

网上投票系统的功能一、功能概述(1)客户模块客户模块主要是添加投票项目信息&#xff0c;比如投票项目的题目&#xff0c;选项以及系统配置的要求。(2)新闻模块新闻模块主要是一些关于本系统的新闻信息&#xff0c;其中包括新闻显示和添加删除模块。(3)留言薄模块留言薄模块主要…

linux内存管理的主要概念是虚拟内存,你知道linux内存管理基础及方法?

描述一、基本概念(1)物理内存和虚拟内存物理内存&#xff1a;系统硬件提供的真实物理内存虚拟内存&#xff1a;利用磁盘空间虚拟出的一块逻辑内存&#xff0c;用作虚拟内存的磁盘空间被称为swap&#xff0c;swap类似于windows的虚拟内存。1、linux的内存管理采取的分页存取机制…

R plot图片背景设置为透明_R语言入门第十二讲:基础绘图(二)------plot与par函数(1)...

上一次给大家简单展示了plot函数的用法&#xff0c;以及par函数的使用。今天我们继续应用这两个函数&#xff0c;看看它的其他功能。下面这个图是数据的一部分[1]。我一直认为&#xff0c;作图简单&#xff0c;但关键是要知道数据在数据库中的格式&#xff0c;才能更好的应用到…

qqkey获取原理_【逆向】QQkey盗号木马原理分析

一、简介QQkey是一段字符串&#xff0c;通过这段字符串在没有QQ登录密码的前提下你依然能够在浏览器中对别人QQ空间、邮箱等应用进行随意访问和操作。现在市面上已经有很多使用易语言编写的盗号木马&#xff0c;专门盗取别人的QQkey&#xff0c;通过QQkey改绑关联了该邮箱的Ste…

visual studio 2015 搭建python开发环境,python入门到精通[三]

在上一篇博客Windows搭建python开发环境&#xff0c;python入门到精通[一]很多园友提到希望使用visual studio 2013/visual studio 2015 python做demo&#xff0c;这里略带一句&#xff0c;其实就"学习python"而言&#xff0c;比较建议使用pycharm&#xff0c;pychar…

linux 用脚本建分区,脚本创建磁盘分区

首先最好添加一个空白的磁盘&#xff0c;以免对原数据产生破坏&#xff0c;若果不想添加磁盘也可以&#xff0c;用一个里面数据无关紧要的磁盘&#xff0c;当然前提是必须要对该磁盘内已有的分区进行清空&#xff0c;方法后面第三步会有1.先看脚本内容&#xff1a;[rootlocalho…

如何给打印机墨盒加墨

今天打印东西突然遇到问题了&#xff0c;显示墨盒黑色没墨了&#xff0c;网上一搜&#xff0c;整套的墨盒大几十&#xff0c;随手换了一个关键词 墨盒墨水 这下不到十块钱解决&#xff0c;正好锻炼下自己的动手能力&#xff08;其实就是穷嘛。。。&#xff09; 接下来就分享下动…

三轴加速度传感器和六轴惯性传感器_六轴传感器和三轴传感器的区别

六轴传感器和三轴传感器的区别重力重力传感器就是利用了其内部的由于加速度造成的晶体变形这个特性。由于这个变形会产生电压&#xff0c;只要计算出产生电压和所施加的加速度之间的关系&#xff0c;就可以将加速度转化成电压输出。当然&#xff0c;还有很多其它方法来制作加速…

全局莫兰指数_空间自相关 | 莫兰指数

空间自相关&#xff1a;是指一些变量在同一个分布区内的观测数据之间潜在的相互依赖性。其中&#xff0c;自相关中的“自”表示当你进行相关性观察统计量&#xff0c;是来源于不同对象的同一属性。Tobler(1970)曾指出“地理学第一定律&#xff1a;任何东西与别的东西之间都是相…

宏函数和函数的区别

转载自&#xff1a; http://www.ccidnet.com/2010/0709/2110463.shtml 1. 宏做的是简单的字符串替换(注意是字符串的替换,不是其他类型参数的替换),而函数的参数的传递,参数是有数据类型的,可以是各种各样的类型. 2. 宏的参数替换是不经计算而直接处理的,而函数调用是将实参的值…

linux vi 排序命令,10 个你必须掌握的超酷 VI 命令技巧

摘要&#xff1a;大部分Linux开发者对vi命相当熟悉&#xff0c;可是遗憾的是&#xff0c;大部分开发者都只能掌握一些最常用的Linux vi命令&#xff0c;下面介绍的10个vi命令虽然很多不为人知&#xff0c;但是在实际应用中又能让你大大提高效率。在使用vi 编辑器时—无论是初次…

python微信机器人部署服务器_玩法收藏/云服务器/零基础微信机器人实践( Python )...

最近想做个微信机器人&#xff0c;主要是为了个人方便。在腾云阁发现这个教程&#xff0c;得到了一些启发。(修改转载已取得腾讯云授权)技术路径和实现思路首先编程语言使用了 Python &#xff0c; Python 语法简洁、第三方扩展丰富&#xff0c;也因为这里采用的微信消息框架 i…

arduino 水位传感器_云南可信赖的威卡压力传感器哪里有

云南可信赖的威卡压力传感器哪里有 k52gh264云南可信赖的威卡压力传感器哪里有 在生产生活中&#xff0c;对压力表的正确使用为工业生产提供了一定程度的便利。.指针转动受阻在检修过程中&#xff0c;先给弹賛管式压力表施加压力&#xff0c;如果发现被检测表的指针成比例变快或…

小甲鱼Python笔记(下)

二十八 二十九 文件 打开文件 open(文件名[,模式][,缓冲])  注意open是个函数不是方法 模式&#xff1a; 缓冲&#xff1a; 大于1的数字代表缓冲区的大小&#xff08;单位是字节&#xff09;&#xff0c;-1&#xff08;或者是任何负数&#xff09;代表使用默认缓冲区大小 只…

linux内核编译后 make: 警告:检测到时钟错误.,系统时钟 make: 警告:检测到时钟错误。您的创建可能是不完整的。...

修改Linux的时间修改Linux时间一般涉及到3个命令&#xff1a; date&#xff0c; clock&#xff0c; hwclockdate&#xff1a; 修改系统当前的时间&#xff1a;[root]#date –s ‘2005/12/5 10:01:00系统当前的时间改成2005年12月5日&#xff0c;10点01分这个修改在系统重启后就…

linux服务器搭建_学linux可以做什么具体的就业方向是什么

学linux可以做什么当今世界流行的操作系统有3大类&#xff0c;Linux、Mac OS和Windows操作系统&#xff0c;Linux操作系统因其开源、免费、跨平台、良好的界面等特性&#xff0c;深受广大程序员们的青睐&#xff01;Linux操作系统被广泛的应用于企业服务器领域&#xff0c;目前…