滤镜轮APIs

在这个文档中,我们假设滤镜轮的孔位为从1到N。QHYCFW3S-7(1.25英寸)滤镜轮有7个孔位,分别为1、2、3、4、5、6、7。对于QHYCFW2和QHYCFW3,滤镜轮的孔位被标记在转盘上。
1.了解QHYCFW端口上是否有连接滤轮
uint32_t ret;
ret = IsQHYCCDCFWPlugged(h);
if (ret==QHYCCD_SUCCESS ) printf(“Found CFW”);
else prinf(“no CFW found”):
支持CFW: QHYCFW2,QHYCFW3, QHY“A”系列内部CFW, miniCAM5F/6F
支持相机:带有四PIN滤镜轮接口的相机。“A”系列相机,miniCAM5F/6F
对于QHY9,无论是连接哪一代的滤镜轮(QHYCFW1/2/3),都没有方法来检测CFW是否已连接,函数默认返回QHYCCD_SUCCESS (滤镜轮已连接)

2.了解所连接的滤镜轮有多少个滤槽

double maxslot;

maxslot=GetQHYCCDParam(h, CONTROL_CFWSLOTSNUM);

例如,如果滤镜轮有5个位置。maxslot的值将是5。
注:目前只支持QHY 4PIN接口+外部CFW(如QHY183M+CFW2/3等)和QHY16803A QHY09000A QHY90A。对于所有不支持的相机,默认返回9(9个位置)

3.发送控制命令
您可以发送一个ASCII字符。范围是’0’到’f’。’0’是位置1,’f’在第16位。

uint32_t ret;
char targetpos[1];
cfwcommand[0]=’0′;
ret = SendOrder2QHYCCDCFW(m_CameraHandle, &targetpos, 1);

请注意currentPos是ASCII字符。范围从’0’到’f’。

ASCII FilterPos ASCII FilterPos
‘0’ 1 ‘8’ 9
‘1’ 2 ‘9’ 10
‘2’ 3 ‘a’ 11
‘3’ 4 ‘b’ 12
‘4’ 5 ‘c’ 13
‘5’ 6 ‘d’ 14
‘6’ 7 ‘e’ 15
‘7’ 8 ‘f’ 16

4.获取滤镜轮的当前位置

uint32_t ret;
char currentPos[64];
ret = GetQHYCCDCFWStatus(h, currentPos);
printf (“current Position in ASCII %c”,);
请注意currentPos是ASCII字符。范围从’0’到’f’。
ASCII FilterPos ASCII FilterPos
‘0’ 1 ‘8’ 9
‘1’ 2 ‘9’ 10
‘2’ 3 ‘a’ 11
‘3’ 4 ‘b’ 12
‘4’ 5 ‘c’ 13
‘5’ 6 ‘d’ 14
‘6’ 7 ‘e’ 15
‘7’ 8 ‘f’ 16

 

5.当发送命令到CFW开始旋转。如何知道CFW是否已到达目标位置?
您可以在循环中使用GetQHYCCDCFWStatus来检查当前位置。如果当前位置==目标位置(均为ASCII字符),则显示CFW到达目标位置。
避免死循环。您可以设置一个超时,以便在超时期间到来时释放它。但最好让循环时间足够长。对于一些缓慢的CFW,它可能需要一些时间。我们建议暂停25秒。
避免USB IO调用过快。您可以在此循环检查期间添加睡眠。
这里是一些用于INDI QHYCCD的示例代码,供参考。
bool QHYCCD::SelectFilter(int position)
{
char targetpos = 0;
char currentpos[64] = {0};
int checktimes = 0;
int ret = 0;
if (isSimulation())
ret = QHYCCD_SUCCESS;
else
{
// JM: THIS WILL CRASH! I am using another method with same result!
//sprintf(&targetpos,”%d”,position – 1);
targetpos = ‘0’ + (position – 1);
ret = SendOrder2QHYCCDCFW(m_CameraHandle, &targetpos, 1);
}
if (ret == QHYCCD_SUCCESS)
{
while (checktimes < 50)
{
ret = GetQHYCCDCFWStatus(m_CameraHandle, currentpos);
LOGF_DEBUG(“%s: checking position %c target position(int) %d target position(char) %c”, camid,currentpos[0],position,targetpos);
if (ret == QHYCCD_SUCCESS){if (targetpos == currentpos[0]){break;}}
usleep(1000*500); checktimes++;
}
CurrentFilter = position;
SelectFilterDone(position);
LOGF_DEBUG(“%s: Filter changed to %d”, camid, position);
return true;
}
else LOGF_ERROR(“Changing filter failed (%d)”, ret); return false;
}