在這個文檔中,我們假設濾鏡輪的孔位為從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’。
請注意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;
}