void ISInit() { static bool isInit = false; if (isInit) return; for (int i = 0; i < MAX_DEVICES; ++i) cameras[i] = nullptr; #if !defined(USE_SIMULATION) int ret = InitQHYCCDResource(); if (ret != QHYCCD_SUCCESS) { IDLog("Init QHYCCD SDK failed (%d)\n", ret); isInit = true; return; } #endif #if defined(OSX_EMBEDED_MODE) char firmwarePath[128]; sprintf(firmwarePath, "%s/Contents/Resources", getenv("INDIPREFIX")); OSXInitQHYCCDFirmware(firmwarePath); #elif defined(__APPLE__) char firmwarePath[128] = "/usr/local/lib/qhy"; if (getenv("QHY_FIRMWARE_DIR") != NULL) strncpy(firmwarePath, getenv("QHY_FIRMWARE_DIR"), 128); OSXInitQHYCCDFirmware(firmwarePath); #endif std::vector<std::string> devices = GetDevicesIDs(); cameraCount = (int)devices.size(); for (int i = 0; i < cameraCount; i++) { cameras[i] = new QHYCCD(devices[i].c_str()); } if (cameraCount > 0) { atexit(QhyCCDCleanup); isInit = true; } }
bool QHYCCD::Connect() { unsigned int ret = 0; uint32_t cap; sim = isSimulation(); if (sim) { cap = CCD_CAN_SUBFRAME | CCD_CAN_ABORT | CCD_CAN_BIN | CCD_HAS_COOLER | CCD_HAS_ST4_PORT; SetCCDCapability(cap); HasUSBTraffic = true; HasUSBSpeed = true; HasGain = true; HasOffset = true; HasFilters = true; return true; } // Query the current CCD cameras. This method makes the driver more robust and // it fixes a crash with the new QHC SDK when the INDI driver reopens the same camera // with OpenQHYCCD() without a ScanQHYCCD() call before. std::vector<std::string> devices = GetDevicesIDs(); // The CCD device is not available anymore if (std::find(devices.begin(), devices.end(), std::string(camid)) == devices.end()) { DEBUGF(INDI::Logger::DBG_ERROR, "Error: Camera %s is not connected", camid); return false; } camhandle = OpenQHYCCD(camid); if (camhandle != NULL) { DEBUGF(INDI::Logger::DBG_SESSION, "Connected to %s.", camid); #ifdef __APPLE__ cap = CCD_CAN_ABORT | CCD_CAN_SUBFRAME; #else cap = CCD_CAN_ABORT | CCD_CAN_SUBFRAME | CCD_HAS_STREAMING; #endif // Disable the stream mode before connecting ret = SetQHYCCDStreamMode(camhandle, 0); if (ret != QHYCCD_SUCCESS) { DEBUGF(INDI::Logger::DBG_ERROR, "Error: Can not disable stream mode (%d)", ret); } ret = InitQHYCCD(camhandle); if (ret != QHYCCD_SUCCESS) { DEBUGF(INDI::Logger::DBG_ERROR, "Error: Init Camera failed (%d)", ret); return false; } ret = IsQHYCCDControlAvailable(camhandle, CAM_MECHANICALSHUTTER); if (ret == QHYCCD_SUCCESS) { cap |= CCD_HAS_SHUTTER; } DEBUGF(INDI::Logger::DBG_DEBUG, "Shutter Control: %s", cap & CCD_HAS_SHUTTER ? "True" : "False"); ret = IsQHYCCDControlAvailable(camhandle, CONTROL_COOLER); if (ret == QHYCCD_SUCCESS) { cap |= CCD_HAS_COOLER; } DEBUGF(INDI::Logger::DBG_DEBUG, "Cooler Control: %s", cap & CCD_HAS_COOLER ? "True" : "False"); ret = IsQHYCCDControlAvailable(camhandle, CONTROL_ST4PORT); if (ret == QHYCCD_SUCCESS) { cap |= CCD_HAS_ST4_PORT; } DEBUGF(INDI::Logger::DBG_DEBUG, "Guider Port Control: %s", cap & CCD_HAS_ST4_PORT ? "True" : "False"); ret = IsQHYCCDControlAvailable(camhandle, CONTROL_SPEED); if (ret == QHYCCD_SUCCESS) { HasUSBSpeed = true; // Force a certain speed on initialization of QHY5PII-C: // CONTROL_SPEED = 2 - Fastest, but the camera gets stuck with long exposure times. // CONTROL_SPEED = 1 - This is safe with the current driver. // CONTROL_SPEED = 0 - This is safe, but slower than 1. if (isQHY5PIIC()) SetQHYCCDParam(camhandle, CONTROL_SPEED, 1); } DEBUGF(INDI::Logger::DBG_DEBUG, "USB Speed Control: %s", HasUSBSpeed ? "True" : "False"); ret = IsQHYCCDControlAvailable(camhandle, CONTROL_GAIN); if (ret == QHYCCD_SUCCESS) { HasGain = true; } DEBUGF(INDI::Logger::DBG_DEBUG, "Gain Control: %s", HasGain ? "True" : "False"); ret = IsQHYCCDControlAvailable(camhandle, CONTROL_OFFSET); if (ret == QHYCCD_SUCCESS) { HasOffset = true; } DEBUGF(INDI::Logger::DBG_DEBUG, "Offset Control: %s", HasOffset ? "True" : "False"); ret = IsQHYCCDControlAvailable(camhandle, CONTROL_CFWPORT); if (ret == QHYCCD_SUCCESS) { HasFilters = true; } DEBUGF(INDI::Logger::DBG_DEBUG, "Has Filters: %s", HasFilters ? "True" : "False"); // Using software binning cap |= CCD_CAN_BIN; camxbin = 1; camybin = 1; // Always use INDI software binning useSoftBin = true; /* ret = IsQHYCCDControlAvailable(camhandle,CAM_BIN1X1MODE); if(ret == QHYCCD_SUCCESS) { camxbin = 1; camybin = 1; } DEBUGF(INDI::Logger::DBG_DEBUG, "Bin 1x1: %s", (ret == QHYCCD_SUCCESS) ? "True" : "False"); ret &= IsQHYCCDControlAvailable(camhandle,CAM_BIN2X2MODE); ret &= IsQHYCCDControlAvailable(camhandle,CAM_BIN3X3MODE); ret &= IsQHYCCDControlAvailable(camhandle,CAM_BIN4X4MODE); // Only use software binning if NOT supported by hardware useSoftBin = !(ret == QHYCCD_SUCCESS); */ DEBUGF(INDI::Logger::DBG_DEBUG, "Binning Control: %s", cap & CCD_CAN_BIN ? "True" : "False"); ret = IsQHYCCDControlAvailable(camhandle, CONTROL_USBTRAFFIC); if (ret == QHYCCD_SUCCESS) { HasUSBTraffic = true; // Force the USB traffic value to 30 on initialization of QHY5PII-C otherwise // the camera has poor transfer speed. if (isQHY5PIIC()) SetQHYCCDParam(camhandle, CONTROL_USBTRAFFIC, 30); } DEBUGF(INDI::Logger::DBG_DEBUG, "USB Traffic Control: %s", HasUSBTraffic ? "True" : "False"); ret = IsQHYCCDControlAvailable(camhandle, CAM_COLOR); //if(ret != QHYCCD_ERROR && ret != QHYCCD_ERROR_NOTSUPPORT) if (ret != QHYCCD_ERROR) { if (ret == BAYER_GB) IUSaveText(&BayerT[2], "GBRG"); else if (ret == BAYER_GR) IUSaveText(&BayerT[2], "GRBG"); else if (ret == BAYER_BG) IUSaveText(&BayerT[2], "BGGR"); else IUSaveText(&BayerT[2], "RGGB"); DEBUGF(INDI::Logger::DBG_DEBUG, "Color CCD: %s", BayerT[2].text); cap |= CCD_HAS_BAYER; } SetCCDCapability(cap); terminateThread = false; #ifndef __APPLE__ pthread_create(&primary_thread, NULL, &streamVideoHelper, this); #endif return true; } DEBUGF(INDI::Logger::DBG_ERROR, "Connecting to CCD failed (%s)", camid); return false; }