用CAPL在CANoe中创建用户登入界面(二)

  最近参加的培训有点多,需要看的东西有点多,没时间更新第二篇博文,很抱歉。

-------------------------------------------------------------------------------------------------------------------

  首先我们回顾下前一篇博文所做的工作:

    1.在Panel界面新建了一个用于用户登入的Panel界面。

              2.在System Variables中创建了用于后续CAPL编程的变量,并在Panel界面中实现了变量与Panel控件之间的连接。

  最后我们要做的就是编写CAPL脚本,实现登入功能。

  (一)CAPL介绍

    CAPL语言是一种类C的面向对象的语言,主要用于Vector公司开发的工具链。

    CAPL最重要的一个特征是事件触发,这一特点在我看来十分重要,对向我一样的初学者可能第一次看到CAPL脚本有点奇怪--为什么没有main函数?不是类C吗?

    第一次看到CAPL,我以为是像python一样一行一行向下执行的,但发现只有很多类似于函数的代码块,在这些代码块外部并没有代码啊?这时候我们就要记住CAPL是事件触发的。个人认为可能是因为CAPL是用于汽车总线的仿真,测试的,而这种应用场景常常需要对出现特定的事件做出相应的处理,所以vector公司采取了这种独特的方式(以上是个人的猜想,纯属胡扯)。

  (二)代码

  1. /*@!Encoding:936*/
  2. includes
  3. {
  4. //#include "string.h"
  5. }
  6. variables
  7. {
  8. char buf[10];
  9. char buf2[10];
  10. char user[10][2][10]; //账号,密码最多为9位字符,最多存储10个人的账号密码
  11. int i;
  12. int status;
  13. int IO;
  14. Timer t1;
  15. char Panel2[10];
  16. }
  17. on start
  18. {
  19. setTimer(t1,10000);
  20. }
  21. on timer t1
  22. {
  23. if(IO==0)
  24. {
  25. stop();
  26. }
  27. }
  28. on sysvar Login::Login
  29. {
  30. strncpy(user[0][0],"amber",10); //输入账号密码的数据
  31. strncpy(user[0][1],"1234",10);
  32. strncpy(user[1][0],"baby",10);
  33. strncpy(user[1][1],"2345",10);
  34. strncpy(user[2][0],"carry",10);
  35. strncpy(user[2][1],"6789",10);
  36. sysGetVariableString(sysvar::Login::ID, buf, elcount(buf)); //得到ID和Password
  37. sysGetVariableString(sysvar::Login::Password, buf2, elcount(buf2));
  38. status = 0; //确定账号密码是否正确
  39. for(i=0;i<10;i++)
  40. {
  41. if((!strncmp(user[i][0],buf,10))&&(!strncmp(user[i][1],buf2,10)))
  42. {
  43. status = 1;
  44. break;
  45. }
  46. }
  47. if(status==1)
  48. {
  49. write("OK"); //TRUE
  50. IO = 1;
  51. }
  52. if(status==0)
  53. {
  54. write("ERROR"); //ERROR
  55. SetControlForeColor("", "", MakeRGB(255,0,0));
  56. stop();
  57. }
  58. }

    因为复制粘贴的缘故,行缩进消失了,嫌麻烦就不改了,将就着看吧

    首先在第一次打开时,会出现如下界面

    

    学过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。

    谢谢!

猜你喜欢

转载自www.cnblogs.com/tangsiwei/p/9719859.html