濾鏡輪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濾鏡輪接口的相機?!癆”系列相機,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;
}