最近参加的培训有点多,需要看的东西有点多,没时间更新第二篇博文,很抱歉。
-------------------------------------------------------------------------------------------------------------------
首先我们回顾下前一篇博文所做的工作:
1.在Panel界面新建了一个用于用户登入的Panel界面。
2.在System Variables中创建了用于后续CAPL编程的变量,并在Panel界面中实现了变量与Panel控件之间的连接。
最后我们要做的就是编写CAPL脚本,实现登入功能。
(一)CAPL介绍
CAPL语言是一种类C的面向对象的语言,主要用于Vector公司开发的工具链。
CAPL最重要的一个特征是事件触发,这一特点在我看来十分重要,对向我一样的初学者可能第一次看到CAPL脚本有点奇怪--为什么没有main函数?不是类C吗?
第一次看到CAPL,我以为是像python一样一行一行向下执行的,但发现只有很多类似于函数的代码块,在这些代码块外部并没有代码啊?这时候我们就要记住CAPL是事件触发的。个人认为可能是因为CAPL是用于汽车总线的仿真,测试的,而这种应用场景常常需要对出现特定的事件做出相应的处理,所以vector公司采取了这种独特的方式(以上是个人的猜想,纯属胡扯)。
(二)代码
- /*@!Encoding:936*/
- includes
- {
- //#include "string.h"
- }
- variables
- {
- char buf[10];
- char buf2[10];
- char user[10][2][10]; //账号,密码最多为9位字符,最多存储10个人的账号密码
- int i;
- int status;
- int IO;
- Timer t1;
- char Panel2[10];
- }
- on start
- {
- setTimer(t1,10000);
- }
- on timer t1
- {
- if(IO==0)
- {
- stop();
- }
- }
- on sysvar Login::Login
- {
- strncpy(user[0][0],"amber",10); //输入账号密码的数据
- strncpy(user[0][1],"1234",10);
- strncpy(user[1][0],"baby",10);
- strncpy(user[1][1],"2345",10);
- strncpy(user[2][0],"carry",10);
- strncpy(user[2][1],"6789",10);
- sysGetVariableString(sysvar::Login::ID, buf, elcount(buf)); //得到ID和Password
- sysGetVariableString(sysvar::Login::Password, buf2, elcount(buf2));
- status = 0; //确定账号密码是否正确
- for(i=0;i<10;i++)
- {
- if((!strncmp(user[i][0],buf,10))&&(!strncmp(user[i][1],buf2,10)))
- {
- status = 1;
- break;
- }
- }
- if(status==1)
- {
- write("OK"); //TRUE
- IO = 1;
- }
- if(status==0)
- {
- write("ERROR"); //ERROR
- SetControlForeColor("", "", MakeRGB(255,0,0));
- stop();
- }
- }
因为复制粘贴的缘故,行缩进消失了,嫌麻烦就不改了,将就着看吧
首先在第一次打开时,会出现如下界面
学过C语言的都知道第一个大括号中的内容是头文件,这里由于代码量较小,无须在这里编写任何代码,细心的同学可能发现我include了"string.h",然后又注释掉了,注意这里和C存在极大的区别,在C中能用的头文件,并不一定能在CAPL中使用,这给我们的学习带来了极大的不便,希望哪位大神用CAPL实现下这些常用的头文件吧!!!所以切记不要想当然把CAPL当成C语言的用。第二个大括号中写的就是变量,由于后面都是基于事件的代码块,没有定义变量的地方,所以变量的定义就挪到了最前面,需要有些奇怪,但不得不说这样的设计也是非常便利的。毕竟我们写C的时候把变量写在前面也非常的利于我们的阅读。
在前面反复强调CAPL是事件触发的,那么怎么写呢?
这段代码及其简单,但却是在我们编程过程中时常用到的两个重要函数
on start顾名思义是在CAPL开始运行时执行,但这里还有另一个on prestart 这两者之间也存在一定区别,这里不做过多介绍,有需要去看具体的help文档就可以了。
setTimer这个是个极其重要的函数,可以说无论是在那个CAPL的编程中,这个函数的使用都是极为广泛的。这个函数的作用是设置一个计时器,第一个实参是作为计时器的变量名,第二个是时间,时间单位为ms。这里很奇怪,help文档中明明demo显示单位是s的,但是实验证明单位是ms,不知道是什么缘故。后面弄清楚后会专门出个博文。
这里的stop()是停止CANoe运行的函数,了解即可,不必关系我这里这么写的逻辑。
这是核心的代码,写了用户的登入信息和如何对用户的输入信息进行核对,确认是否正确。
on sysvar Login::Login是极重要的代码,代表当系统变量发生变化时,执行指定的代码块,使用系统变量的话建议直接从系统变量栏中拖取,这样不容易出现错误,毕竟当系统变量多的时候谁都记不住那么多的变量名(哪怕已经取了很清楚的名字了)。
strncpy()函数用法如下:
简单来说就是,第一个实参是目标变量,第二个实参是要复制的字符串,第三个变量是字符串长度,注意理论上来说,最大能复制的字符串应该是len-1,因为在字符串的最后需要'/0'作为字符串的结束符号,但是在实验过程中就算我字符串用了len长度仍然成功复制了,没有出错,就很奇怪,所以后续会研究下,要是有结果,也会和前一个问题一样重新开一个博文。
在这里strncpy()起到的作用就是将用户的信息存储在一个三维数组中。
要完成比对的过程我们还需要获取用户的输入信息,这就用到了sysGetVariableString()函数,函数用法如下:
我们在这里采用第二种形式,我们将Panel界面中输入的信息获取,并存储到一个buffer中。
下面代码较为简单,就是个比对,和C语言几乎一模一样,这里不做叙述了。
stop()函数就是终止CANoe运行的函数。其他的IO,status就是我做的一些flag,相信大家也能理解。
这里我大致说下逻辑,以便大家更好的理解:CANoe在加载了这个配置文件后,会有一个Panel界面,当用户点击运行开始使用CANoe后,需要在一定时间内完成登入,否则CAPL会自动关闭CANoe。
谢谢!