茫茫人海,相遇是一种缘分,欢迎欢迎!
从零开始学习CANoe(一)—— 新建工程
从零开始学习CANoe(二)—— CANdb++ 创建 dbc文件
从零开始学习CANoe(三)—— 系统变量的创建和使用
2、打开panel designer
3、拖着控件右下角可以调节大小
4,选中 Group Box
控件 ,在面板中需要的地方双击左键 可以放置一个控件
5,在上一步骤基础上,选中Properties
更改控件名字。
6,再添加几个控件,如下图。
7,添加一个Switch 控件
8,按照下图设置属性
9,右键选择 Fit image Size 可以 调增控件图片的大小。
10,添加一个Trace Bar
控件
11,添加一个Swicth 控件,注意下图的Mouse Activetion type
要选择 Left ,下图的选择是错误的
12,添加第二个Swicth 控件,注意下图的Mouse Activetion type
要选择 Left ,下图的选择是错误的
13,添加两个Static Text 说明下图的两个控件
14,选择 Add Panel,将上面创建的panel加载到工程中。
15,如下图所以看以看到Control panel已经被添加了,
16,然后可以run下工程,操作下control panel,看下write窗口打印的结果。
17,然后可以run下工程,操作下control panel,看下write窗口打印的结果。
18,为了统一名称,我们把上一个博客中test.can更改为 Engine.can ,代码如下:
/*@!Encoding:ASCII*/
On key 'a'
{
@Engine::EngineStateSwitch = 0;
write("close the engine...");
@Engine::EngineStateSwitch = 1;
write("open the engine...");
@Engine::EngineSpeedEntry =1000;
}
on sysvar sysvar::Engine::EngineStateSwitch
{
$EngineState::OnOff = @this;
if(@this)
{
$EngineState::EngineSpeed = @sysvar::Engine::EngineSpeedEntry;
write("EngineSpeed is %f...", @this);
}
else
$EngineState::EngineSpeed = 0;
}
on sysvar sysvar::Engine::EngineSpeedEntry //
{
if(@sysvar::Engine::EngineStateSwitch) //
{
$EngineState::EngineSpeed = @this;
write("EngineSpeed is %f...", @this);
}
}
18,我们再再Light 节点上新建一个simulation can ,名字为Light.can
19,Light.can 中的代码如下
/*@!Encoding:1252*/
variables
{
msTimer tFlashLightFrequency;
const int gFlashLightFrequency = 500;
int gHazardLightsStatus = 0;
}
on timer tFlashLightFrequency
{
//定时器实现的功能是:500ms闪烁灯
gHazardLightsStatus = (gHazardLightsStatus == 1 ? 0 : 1);
$LightState::FlashLight = gHazardLightsStatus;
setTimer(this, gFlashLightFrequency);
write("current light state is : %d ...",gHazardLightsStatus);
}
on sysvar sysvar::Lights::HazardLightsSwitch
{
if (@this)
{
gHazardLightsStatus = 1;
setTimer(tFlashLightFrequency, gFlashLightFrequency);
}
else
{
cancelTimer(tFlashLightFrequency);
gHazardLightsStatus = 0;
}
$LightState::FlashLight = gHazardLightsStatus;
}
20,点击 Light 里面的下面的那个按钮Hazard Flasher
,可以看到write窗口在500ms间隔的打印0和1
21,新建一个panel,起名为Display
22,添加如下图的Group Box
23,添加一个仪表盘 控件,用来显示当前速度值
24,添加一个输入输出控件,用来显示当前速度值
25,添加一个 图片控件
26,添加一个Switch控件,用作左边的车灯
27,按下图完成配置
28,添加有车灯,按下图完成配置
29,再在 dispaly 节点,添加一个 simulation can ,命名为display.can ,代码如下图
/*@!Encoding:1252*/
variables
{
const long kOFF = 0;
const long kON = 1;
int gDebugCounter = 0;
}
on message EngineState
{
// engine state received
if (this.dir == RX)
{
@sysvar::Engine::EngineSpeedDspMeter = this.EngineSpeed / 1000.0;
}
}
on message LightState
{
gDebugCounter++;
if (this.dir == RX)
{
SetLightDsp(this.HeadLight,this.FlashLight);
if(gDebugCounter == 10)
{
write("LightState RX received by node %NODE_NAME%");
gDebugCounter = 0;
}
}
else
{
if(gDebugCounter == 10)
{
write("Error: LightState TX received by node %NODE_NAME%");
gDebugCounter = 0;
}
}
}
SetLightDsp (long headLight, long hazardFlasher)
{
if(headLight == kON)
{
if(hazardFlasher == kON)
{
@sysvar::Lights::LightDisplay = 7;
}
else if(hazardFlasher == kOFF)
{
@sysvar::Lights::LightDisplay = 4;
}
}
else if(headLight == kOFF)
{
if(hazardFlasher == kON)
{
@sysvar::Lights::LightDisplay = 3;
}
else if(hazardFlasher == kOFF)
{
@sysvar::Lights::LightDisplay = 0;
}
}
}
30,下图是完成后的最后效果图。
- 好记性,不如烂笔头,技术探索路漫漫,携手志同道合之人上下求索是件很快乐的事。
- 如果这篇博客对你有帮助,请 “点赞” “评论”“收藏”一键三连 哦!码字不易,大家的支持就是我坚持下去的动力。