bool QHYCCD::setupParams() { uint32_t nbuf,ret,imagew,imageh,bpp; double chipw,chiph,pixelw,pixelh; if (sim) { chipw=imagew=1280; chiph=imageh=1024; pixelh = pixelw = 5.4; bpp=8; } else { ret = GetQHYCCDChipInfo(camhandle,&chipw,&chiph,&imagew,&imageh,&pixelw,&pixelh,&bpp); /* JM: We need GetQHYCCDErrorString(ret) to get the string description of the error, please implement this in the SDK */ if (ret != QHYCCD_SUCCESS) { DEBUGF(INDI::Logger::DBG_ERROR, "Error: GetQHYCCDChipInfo() (%d)", ret); return false; } DEBUGF(INDI::Logger::DBG_DEBUG, "GetQHYCCDChipInfo: chipW :%g chipH: %g imageW: %g imageH: %g pixelW: %g pixelH: %g bbp %g", chipw,chiph,imagew,imageh,pixelw,pixelh,bpp); camroix = 0; camroiy = 0; camroiwidth = imagew; camroiheight = imageh; } SetCCDParams(imagew,imageh,bpp,pixelw,pixelh); nbuf = PrimaryCCD.getXRes() * PrimaryCCD.getYRes() * PrimaryCCD.getBPP() / 8; PrimaryCCD.setFrameBufferSize(nbuf); #ifndef OSX_EMBEDED_MODE streamer->setPixelFormat(V4L2_PIX_FMT_GREY); streamer->setRecorderSize(imagew,imageh); #endif return 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; }