void ISInit() { static bool isInit = false; if (!isInit) { #ifdef __APPLE__ UploadFW(); #endif char camid[MAXINDIDEVICE]; bool allCameraInit = true; int ret = QHYCCD_ERROR; #ifndef USE_SIMULATION ret = InitQHYCCDResource(); if(ret != QHYCCD_SUCCESS) { IDLog("Init QHYCCD SDK failed (%d)\n", ret); return; } cameraCount = ScanQHYCCD(); #else cameraCount = 2; #endif for(int i = 0;i < cameraCount;i++) { memset(camid,'\0', MAXINDIDEVICE); #ifndef USE_SIMULATION ret = GetQHYCCDId(i,camid); #else ret = QHYCCD_SUCCESS; snprintf(camid, MAXINDIDEVICE, "Model %d", i+1); #endif if(ret == QHYCCD_SUCCESS) { cameras[i] = new QHYCCD(camid); } else { IDLog("#%d GetQHYCCDId error (%d)\n", i, ret); allCameraInit = false; break; } } if(cameraCount > 0 && allCameraInit) { atexit(cleanup); isInit = true; } } }
bool Camera_QHY::Connect(const wxString& camId) { if (QHYSDKInit()) { wxMessageBox(_("Failed to initialize QHY SDK")); return true; } int num_cams = ScanQHYCCD(); std::vector<std::string> camids; for (int i = 0; i < num_cams; i++) { char camid[32] = ""; GetQHYCCDId(i, camid); bool st4 = false; qhyccd_handle *h = OpenQHYCCD(camid); if (h) { uint32_t ret = IsQHYCCDControlAvailable(h, CONTROL_ST4PORT); if (ret == QHYCCD_SUCCESS) st4 = true; //CloseQHYCCD(h); // CloseQHYCCD() would proform a reset, so the other software that use QHY camera would be impacted. // Do not call this,would not cause memory leak.The SDk has already process this. } Debug.Write(wxString::Format("QHY cam [%d] %s avail %s st4 %s\n", i, camid, h ? "Yes" : "No", st4 ? "Yes" : "No")); if (st4) camids.push_back(camid); } if (camids.size() == 0) { wxMessageBox(_("No compatible QHY cameras found")); return true; } std::string camid; if (camids.size() > 1) { wxArrayString names; int n = 1; for (auto it = camids.begin(); it != camids.end(); ++it, ++n) names.Add(wxString::Format("%d: %s", n, *it)); int i = wxGetSingleChoiceIndex(_("Select QHY camera"), _("Camera choice"), names); if (i == -1) return true; camid = camids[i]; } else camid = camids[0]; char *s = new char[camid.length() + 1]; memcpy(s, camid.c_str(), camid.length() + 1); m_camhandle = OpenQHYCCD(s); delete[] s; Name = camid; if (!m_camhandle) { wxMessageBox(_("Failed to connect to camera")); return true; } // before calling InitQHYCCD() we must call SetQHYCCDStreamMode(camhandle, 0 or 1) // 0: single frame mode // 1: live frame mode uint32_t ret = SetQHYCCDStreamMode(m_camhandle, 0); if (ret != QHYCCD_SUCCESS) { CloseQHYCCD(m_camhandle); m_camhandle = 0; wxMessageBox(_("SetQHYCCDStreamMode failed")); return true; } ret = InitQHYCCD(m_camhandle); if (ret != QHYCCD_SUCCESS) { CloseQHYCCD(m_camhandle); m_camhandle = 0; wxMessageBox(_("Init camera failed")); return true; } ret = GetQHYCCDParamMinMaxStep(m_camhandle, CONTROL_GAIN, &m_gainMin, &m_gainMax, &m_gainStep); if (ret != QHYCCD_SUCCESS) { CloseQHYCCD(m_camhandle); m_camhandle = 0; wxMessageBox(_("Failed to get gain range")); return true; } double chipw, chiph, pixelw, pixelh; uint32_t imagew, imageh, bpp; ret = GetQHYCCDChipInfo(m_camhandle, &chipw, &chiph, &imagew, &imageh, &pixelw, &pixelh, &bpp); if (ret != QHYCCD_SUCCESS) { CloseQHYCCD(m_camhandle); m_camhandle = 0; wxMessageBox(_("Failed to get camera chip info")); return true; } int bayer = IsQHYCCDControlAvailable(m_camhandle, CAM_COLOR); Debug.Write(wxString::Format("QHY: cam reports bayer type %d\n", bayer)); Color = false; switch ((BAYER_ID)bayer) { case BAYER_GB: case BAYER_GR: case BAYER_BG: case BAYER_RG: Color = true; } // check bin modes CONTROL_ID modes[] = { CAM_BIN2X2MODE, CAM_BIN3X3MODE, CAM_BIN4X4MODE, }; int bin[] = { 2, 3, 4, }; int maxBin = 1; for (int i = 0; i < WXSIZEOF(modes); i++) { ret = IsQHYCCDControlAvailable(m_camhandle, modes[i]); #if 0 // FIXME- IsQHYCCDControlAvailable is supposed to return QHYCCD_ERROR_NOTSUPPORT for a // bin mode that is not supported, but in fact it returns QHYCCD_ERROR, so we cannot // distinguish "not supported" from "error". if (ret != QHYCCD_SUCCESS && ret != QHYCCD_ERROR_NOTSUPPORT) { CloseQHYCCD(m_camhandle); m_camhandle = 0; wxMessageBox(_("Failed to get camera bin info")); return true; } #endif if (ret == QHYCCD_SUCCESS) maxBin = bin[i]; else break; } Debug.Write(wxString::Format("QHY: max binning = %d\n", maxBin)); MaxBinning = maxBin; if (Binning > MaxBinning) Binning = MaxBinning; Debug.Write(wxString::Format("QHY: call SetQHYCCDBinMode bin = %d\n", Binning)); ret = SetQHYCCDBinMode(m_camhandle, Binning, Binning); if (ret != QHYCCD_SUCCESS) { CloseQHYCCD(m_camhandle); m_camhandle = 0; wxMessageBox(_("Failed to set camera binning")); return true; } m_curBin = Binning; m_maxSize = wxSize(imagew, imageh); FullSize = wxSize(imagew / Binning, imageh / Binning); delete[] RawBuffer; size_t size = GetQHYCCDMemLength(m_camhandle); RawBuffer = new unsigned char[size]; m_devicePixelSize = sqrt(pixelw * pixelh); m_curGain = -1; m_curExposure = -1; m_roi = wxRect(0, 0, FullSize.GetWidth(), FullSize.GetHeight()); // binned coordinates Debug.Write(wxString::Format("QHY: call SetQHYCCDResolution roi = %d,%d\n", m_roi.width, m_roi.height)); ret = SetQHYCCDResolution(m_camhandle, 0, 0, m_roi.GetWidth(), m_roi.GetHeight()); if (ret != QHYCCD_SUCCESS) { CloseQHYCCD(m_camhandle); m_camhandle = 0; wxMessageBox(_("Init camera failed")); return true; } Debug.Write(wxString::Format("QHY: connect done\n")); Connected = true; return false; }
int main(void) { int num = 0; qhyccd_handle *camhandle; int ret; char id[32]; char camtype[16]; int found = 0; int ch = '0'; ret = InitQHYCCDResource(); if(ret == QHYCCD_SUCCESS) { printf("Init SDK success!\n"); } else { goto failure; } num = ScanQHYCCD(); if(num > 0) { printf("Yes!Found QHYCCD,the num is %d \n",num); } else { printf("Not Found QHYCCD,please check the usblink or the power\n"); } for(int i = 0;i < num;i++) { ret = GetQHYCCDId(i,id); if(ret == QHYCCD_SUCCESS) { strncpy(camtype,id,6); if(!strcmp(camtype,"IC8300")) { found = 1; break; } } } if(found == 1) { camhandle = OpenQHYCCD(id); if(camhandle != NULL) { printf("Open IC8300 success!\n"); } printf("Please enter the command you want to control:\n"); printf("Choice is 0 - 63\n"); scanf("%d",&ch); getchar(); if(ch >= 0 && ch <= 63) { ret = SetQHYCCDParam(camhandle,CONTROL_GAIN,ch); if(ret != QHYCCD_SUCCESS) { printf("Control the color filter wheel failure \n"); goto failure; } } } else { printf("The camera is not IC8300 or other error \n"); goto failure; } ret = CloseQHYCCD(camhandle); if(ret == QHYCCD_SUCCESS) { printf("Close IC8300 success!\n"); } else { goto failure; } ret = ReleaseQHYCCDResource(); if(ret == QHYCCD_SUCCESS) { printf("Rlease SDK Resource success!\n"); } else { goto failure; } return 0; failure: printf("some fatal error happened\n"); return 1; }