在这个文档中,我们假设滤镜轮的孔位为从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’。
请注意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调用过快。您可以在此循环检查期间添加睡眠。
避免USB IO调用过快。您可以在此循环检查期间添加睡眠。
这里是一些用于INDI QHYCCD的示例代码,供参考。
bool QHYCCD::SelectFilter(int position)
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;
}