bool QHYCCD::UpdateCCDBin(int hor, int ver) { int ret = QHYCCD_ERROR; if (hor != ver) { DEBUG(INDI::Logger::DBG_ERROR, "Invalid binning mode. Asymmetrical binning not supported."); return false; } if (hor == 3) { DEBUG(INDI::Logger::DBG_ERROR, "Invalid binning mode. Only 1x1, 2x2, and 4x4 binning modes supported."); return false; } if (hor > 1 && GetCCDCapability() & CCD_HAS_BAYER) { DEBUG(INDI::Logger::DBG_ERROR, "Binning not supported for color CCDs."); return false; } //PrimaryCCD.setBin(hor,ver); //camxbin = hor; //camybin = ver; //return UpdateCCDFrame(PrimaryCCD.getSubX(), PrimaryCCD.getSubY(), PrimaryCCD.getSubW(), PrimaryCCD.getSubH()); if(hor == 1 && ver == 1) { ret = IsQHYCCDControlAvailable(camhandle,CAM_BIN1X1MODE); } else if(hor == 2 && ver == 2) { ret = IsQHYCCDControlAvailable(camhandle,CAM_BIN2X2MODE); } else if(hor == 3 && ver == 3) { ret = IsQHYCCDControlAvailable(camhandle,CAM_BIN3X3MODE); } else if(hor == 4 && ver == 4) { ret = IsQHYCCDControlAvailable(camhandle,CAM_BIN4X4MODE); } if(ret == QHYCCD_SUCCESS) { PrimaryCCD.setBin(hor,ver); camxbin = hor; camybin = ver; return UpdateCCDFrame(PrimaryCCD.getSubX(), PrimaryCCD.getSubY(), PrimaryCCD.getSubW(), PrimaryCCD.getSubH()); } DEBUGF(INDI::Logger::DBG_ERROR, "SetBin mode failed. Invalid bin requested %dx%d",hor,ver); return false; }
bool QHYCCD::UpdateCCDBin(int hor, int ver) { int ret = QHYCCD_ERROR; if (hor != ver) { DEBUG(INDI::Logger::DBG_ERROR, "Invalid binning mode. Asymmetrical binning not supported."); return false; } if (hor == 3) { DEBUG(INDI::Logger::DBG_ERROR, "Invalid binning mode. Only 1x1, 2x2, and 4x4 binning modes supported."); return false; } if (hor > 1 && GetCCDCapability() & CCD_HAS_BAYER) { DEBUG(INDI::Logger::DBG_ERROR, "Binning not supported for color CCDs."); return false; } if (useSoftBin) ret = QHYCCD_SUCCESS; else if (hor == 1 && ver == 1) { ret = IsQHYCCDControlAvailable(camhandle, CAM_BIN1X1MODE); } else if (hor == 2 && ver == 2) { ret = IsQHYCCDControlAvailable(camhandle, CAM_BIN2X2MODE); } else if (hor == 3 && ver == 3) { ret = IsQHYCCDControlAvailable(camhandle, CAM_BIN3X3MODE); } else if (hor == 4 && ver == 4) { ret = IsQHYCCDControlAvailable(camhandle, CAM_BIN4X4MODE); } // Binning ALWAYS succeeds if (ret != QHYCCD_SUCCESS) { useSoftBin = true; } // We always use software binning so QHY binning is always at 1x1 camxbin = 1; camybin = 1; PrimaryCCD.setBin(hor, ver); return UpdateCCDFrame(PrimaryCCD.getSubX(), PrimaryCCD.getSubY(), PrimaryCCD.getSubW(), PrimaryCCD.getSubH()); }
bool INovaCCD::Connect() { const char *Sn; if(iNovaSDK_MaxCamera() > 0) { Sn = iNovaSDK_OpenCamera(1); LOGF_DEBUG("Serial Number: %s", Sn); if(Sn[0] >= '0' && Sn[0] < '3') { iNovaSDK_InitST4(); LOGF_INFO("Camera model is %s", iNovaSDK_GetName()); iNovaSDK_InitCamera(RESOLUTION_FULL); //maxW = iNovaSDK_GetImageWidth(); //maxH = iNovaSDK_GetImageHeight(); iNovaSDK_SetFrameSpeed(FRAME_SPEED_LOW); iNovaSDK_CancelLongExpTime(); iNovaSDK_OpenVideo(); CameraPropertiesNP.s = IPS_IDLE; // Set camera capabilities uint32_t cap = CCD_CAN_ABORT | CCD_CAN_BIN | CCD_CAN_SUBFRAME | (iNovaSDK_HasST4() ? CCD_HAS_ST4_PORT : 0); SetCCDCapability(cap); if(iNovaSDK_HasColorSensor()) { IUSaveText(&BayerT[2], "RGGB"); IDSetText(&BayerTP, nullptr); SetCCDCapability(GetCCDCapability() | CCD_HAS_BAYER); } return true; } iNovaSDK_CloseCamera(); } LOG_ERROR("No cameras opened."); return false; }
bool QHYCCD::StartExposure(float duration) { unsigned int ret = QHYCCD_ERROR; if (Streamer->isBusy()) { DEBUG(INDI::Logger::DBG_ERROR, "Cannot take exposure while streaming/recording is active."); return false; } //AbortPrimaryFrame = false; /* if (duration < MINIMUM_CCD_EXPOSURE) { DEBUGF(INDI::Logger::DBG_WARNING, "Exposure shorter than minimum duration %g s requested. Setting exposure time to %g s.", duration, MINIMUM_CCD_EXPOSURE); duration = MINIMUM_CCD_EXPOSURE; }*/ imageFrameType = PrimaryCCD.getFrameType(); /*if (imageFrameType == CCDChip::BIAS_FRAME) { duration = MINIMUM_CCD_EXPOSURE; DEBUGF(INDI::Logger::DBG_SESSION, "Bias Frame (s) : %g", duration); } else*/ if (GetCCDCapability() & CCD_HAS_SHUTTER) { if (imageFrameType == INDI::CCDChip::DARK_FRAME || imageFrameType == INDI::CCDChip::BIAS_FRAME) ControlQHYCCDShutter(camhandle, MACHANICALSHUTTER_CLOSE); else ControlQHYCCDShutter(camhandle, MACHANICALSHUTTER_FREE); } DEBUGF(INDI::Logger::DBG_DEBUG, "Current exposure time is %f us", duration * 1000 * 1000); ExposureRequest = duration; PrimaryCCD.setExposureDuration(duration); if (sim) ret = QHYCCD_SUCCESS; else { if (LastExposureRequest != ExposureRequest) { ret = SetQHYCCDParam(camhandle, CONTROL_EXPOSURE, ExposureRequest * 1000 * 1000); if (ret != QHYCCD_SUCCESS) { DEBUGF(INDI::Logger::DBG_ERROR, "Set expose time failed (%d).", ret); return false; } LastExposureRequest = ExposureRequest; } } if (sim) ret = QHYCCD_SUCCESS; else ret = SetQHYCCDBinMode(camhandle, camxbin, camybin); if (ret != QHYCCD_SUCCESS) { DEBUGF(INDI::Logger::DBG_SESSION, "Set QHYCCD Bin mode failed (%d)", ret); return false; } DEBUGF(INDI::Logger::DBG_DEBUG, "SetQHYCCDBinMode (%dx%d).", camxbin, camybin); if (sim) ret = QHYCCD_SUCCESS; else ret = SetQHYCCDResolution(camhandle, camroix, camroiy, camroiwidth, camroiheight); if (ret != QHYCCD_SUCCESS) { DEBUGF(INDI::Logger::DBG_SESSION, "Set QHYCCD ROI resolution (%d,%d) (%d,%d) failed (%d)", camroix, camroiy, camroiwidth, camroiheight, ret); return false; } DEBUGF(INDI::Logger::DBG_DEBUG, "SetQHYCCDResolution camroix %d camroiy %d camroiwidth %d camroiheight %d", camroix, camroiy, camroiwidth, camroiheight); if (sim) ret = QHYCCD_SUCCESS; else ret = ExpQHYCCDSingleFrame(camhandle); if (ret == QHYCCD_ERROR) { DEBUGF(INDI::Logger::DBG_SESSION, "Begin QHYCCD expose failed (%d)", ret); return false; } gettimeofday(&ExpStart, NULL); DEBUGF(INDI::Logger::DBG_DEBUG, "Taking a %g seconds frame...", ExposureRequest); InExposure = true; // if (ExposureRequest*1000 < POLLMS) // SetTimer(ExposureRequest*1000); // else SetTimer(POLLMS); return true; }