我正在使用 Pointgrey Firefly MV(准确地说是 FFMV-03M2M/C),并且希望在每次快门启动时触发一些外部设备。根据数据表,该相机支持 IIDC 1.31,还提供四个可用作触发和/或频闪信号输出的 GPIO。如IIDC 标准第 4.11.3 节所述,应该可以使用 IIDC 配置这些选通信号输出。
我的应用程序是用 C++ 实现的,并使用libdc1394来访问和控制相机。到目前为止,一切都很好,但我无法配置频闪信号输出。据我了解 libdc 和 IIDC 应该可以按如下方式启用第一个输出(camera
是指向有效的指针dc1394camera_t
):
dc1394error_t err;
uint64_t strobe_offset = 0x200;
uint32_t strobe_settings = 0;
err = dc1394_get_strobe_register(camera, strobe_offset, &strobe_settings);
if (err == DC1394_SUCCESS) {
/* Set bits 6 (strobe on) and 7 (active-high level)
IIDC uses msb 0, so we need to shift by 25/24 instead of 6/7 */
strobe_settings = strobe_settings | (1 << 25) | (1 << 24);
err = dc1394_set_strobe_register(camera, strobe_offset, strobe_settings);
}
if (err != DC1394_SUCCESS) {
log(LOG_ERROR, "Failed to set strobe.");
}
这不会产生任何错误,但也不会打开频闪信号输出(即使相机正在捕捉帧)。我还通过使用不同的偏移量(0x204、0x208 和 0x20C)尝试了所有其他输出,但无济于事。然后我检查了所有可用性查询字段,Strobe_CTRL_Inq
但Strobe_[0123]_Inq
它们都报告存在选通信号输出。但有趣的是,中的On/Off_Inq
字段Strobe_[0123]_Inq
告诉我无法打开或关闭输出,而Polarity_Inq
告诉我可以更改极性设置(实际上我不能,因为您只能在选通信号输出为切换到)。我尝试使用 Pointgrey 提供的基于 Windows 的驱动程序实用程序配置输出,它可以正常工作。
有什么想法我可能做错了吗?或者这台相机在这方面不兼容IIDC?
更新:好的,我尝试了三种启用频闪输出的方法:使用我的原始代码,使用答案中建议的绝对偏移量 0x1300,并使用 PointGrey 寄存器参考手册中所写的偏移量 0x1110/0x1114。我还尝试设置延迟、持续时间和/或方向(即使不要将 PIO 与频闪输出混淆)。到目前为止,还没有寄存器和标志的组合起作用。也许这是 libdc1394 中的一个错误,或者 PointGrey 在他们的专有驱动程序中做了一些其他的魔法。现在我放弃了,将尝试找到一种不同的解决方案来触发外部设备。