需求 具体描述 (待)实现方式(/ 思路)
不同相机工作状态指示灯 字母代表不同的相机,相机工作对应的指示灯变为绿色 采集卡 API 检测相机状态

查阅采集卡的开发文档,对应 API

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
IKapGetCameraStatus  获取当前相机状态
c++:
int IKapGetCameraStatus(HANDLE hDev, int* npValue)
对应c#:
int IKapGetCameraStatus(IntPtr hDev, ref int npValue);


参数说明
hDev 设备句柄
npValue 相机当前状态

返 回 值
0:调用失败
1:调用成功

说 明
用户可以在任意时刻调用该函数查询当前相机状态判断采集发生异常的原因。
如果返回 0 或相机状态 npValue 为 0xFFFFFFFF,则采集卡获取相机信号失败,用户可以在间隔一段时间后(e.g.100ms),重新调用该函数获取相机状态。
相机状态 npValue 可能是下列比特位的异或组合:
0x00000001:时钟信号无效
0x00000002:Line 信号无效
0x00000004:Frame 信号无效
0x00000008:行像素个数设置值大于 LVAL 实际有效值
0x00000010:行数设置值大于 FVAL 实际有效值
0xFFFFFFFF:获取相机信号失败


函数调用返回 0,调用 IKapGetLastError 返回错误码
IKStatus_BoardNotOpen 采集卡设备未打开
IKStatus_TimeOut 操作超时
IKStatus_Invalid_Handle 无效的句柄

实现思路:

指示灯 A、B、C、D 由四个 Label 标签表示,默认颜色为黄色,打开相机时调用上面的 API 得到 camera 当前状态,并修改 Label 的 BackColor 属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
using IKapBoardClassLibary;

//获取调用返回值
int sta = 0;
int ret = 0;
ret = IkapBoard.IKapGetCameraStatus(hDev,ref sta);
//检测返回值
CheckIKapBoard(ret);

//工作状态
camera1_sta.BackColor = Color.Green;
//停止状态
camera1_sta.BackColor = Color.Yellow;

具体实现:

由于 camera 相关操作都在 Devices 模块中的 Grabber 类中实现,该模块无法直接修改 MainWnd 中的控件属性,因此考虑在 Grabber 类中添加相机状态属性,然后在相关事件中检测 Grabber 类中的对应属性值来判断 camera 状态,然后在 MainWnd 模块的事件回调中对相应控件进行修改。

在 Grabber.cs 中添加函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public int CheckStatus(int i,IntPtr hDev) 
{
//检测相机状态
int sta = 0;
int ret;
ret = IKapBoard.IKapGetCameraStatus(hDev, ref sta);
CheckIKapBoard(ret);

if ((sta & 0x1F) > 0)
{
//检测是否有异常位
nCamera[i] = 1;
return 1;
}
else
{
log._.Info($"camera {i}:{hDev} ERROR!");
nCamera[i] = 0;
return 0;
}
}

并在 GrabStart () 和 GraberStop () 相关流程中添加 CheckStatus () 的调用

在 MainWnd.cs 中添加控件控制数组

1
2
3

//相机状态图标
LabelGroup labelCamera;

在 label_init () 中进行初始化

添加控件控制函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
//更新相机状态图标
private void UpdateLabelCameraStatus()
{
if (grabber == null)
return;
if (grabber.nCamera == null)
{
for (int i = 0; i < labelCamera.Count; i++)
{
labelCamera[i].BackColor = Color.Red;
}
return;
}
for (int i = 0;i< grabber.nCamera.Length;i++)
{
int sta = grabber.nCamera[i];
switch (sta)
{
case 0:
labelCamera[i].BackColor = Color.Yellow;
break;
case 1:
labelCamera[i].BackColor = Color.Green;
break;
default:
labelCamera[i].BackColor = Color.Yellow;
break;
}
}
}

目前只控制 0,1 两种状态,但可以为其他状态留出扩展。

实现效果:

当采集卡未初始化和采集时

image-20221016141953112

当正在采集时

image-20221016142025346

当任务暂停时

image-20221016142037394

由于暂时没有使用实机采集,所以只有一个虚拟设备 A 工作。

需求 具体描述 (待)实现方式(/ 思路)
归零按钮对应功能 卷长归零 增加卷长归零事件

添加卷长归零函数,并将其添加到按钮单击事件中