void MICCD::updateTemperature() { float ccdtemp = 0; float ccdpower = 0; int err = 0; if (isSimulation()) { ccdtemp = TemperatureN[0].value; if (TemperatureN[0].value < TemperatureRequest) ccdtemp += TEMP_THRESHOLD; else if (TemperatureN[0].value > TemperatureRequest) ccdtemp -= TEMP_THRESHOLD; ccdpower = 30; } else { if (gxccd_get_value(cameraHandle, GV_CHIP_TEMPERATURE, &ccdtemp) < 0) { char errorStr[MAX_ERROR_LEN]; gxccd_get_last_error(cameraHandle, errorStr, sizeof(errorStr)); LOGF_ERROR("Getting temperature failed: %s.", errorStr); err |= 1; } if (gxccd_get_value(cameraHandle, GV_POWER_UTILIZATION, &ccdpower) < 0) { char errorStr[MAX_ERROR_LEN]; gxccd_get_last_error(cameraHandle, errorStr, sizeof(errorStr)); LOGF_ERROR("Getting voltage failed: %s.", errorStr); err |= 2; } } TemperatureN[0].value = ccdtemp; CoolerN[0].value = ccdpower * 100.0; if (TemperatureNP.s == IPS_BUSY && fabs(TemperatureN[0].value - TemperatureRequest) <= TEMP_THRESHOLD) { // end of temperature ramp TemperatureN[0].value = TemperatureRequest; TemperatureNP.s = IPS_OK; } if (err) { if (err & 1) TemperatureNP.s = IPS_ALERT; if (err & 2) CoolerNP.s = IPS_ALERT; } else { CoolerNP.s = IPS_OK; } IDSetNumber(&TemperatureNP, nullptr); IDSetNumber(&CoolerNP, nullptr); temperatureID = IEAddTimer(POLLMS, MICCD::updateTemperatureHelper, this); }
bool MICCD::setupParams() { bool sim = isSimulation(); if (sim) { SetCCDParams(4032, 2688, 16, 9, 9); } else { int chipW, chipD, pixelW, pixelD; gxccd_get_integer_parameter(cameraHandle, GIP_CHIP_W, &chipW); gxccd_get_integer_parameter(cameraHandle, GIP_CHIP_D, &chipD); gxccd_get_integer_parameter(cameraHandle, GIP_PIXEL_W, &pixelW); gxccd_get_integer_parameter(cameraHandle, GIP_PIXEL_D, &pixelD); SetCCDParams(chipW, chipD, 16, pixelW / 1000.0, pixelD / 1000.0); } int nbuf = PrimaryCCD.getXRes() * PrimaryCCD.getYRes() * PrimaryCCD.getBPP() / 8; nbuf += 512; PrimaryCCD.setFrameBufferSize(nbuf); int expTime = 0; gxccd_get_integer_parameter(cameraHandle, GIP_MINIMAL_EXPOSURE, &expTime); minExpTime = expTime / 1000000.0; // convert to seconds PrimaryCCD.setMinMaxStep("CCD_EXPOSURE", "CCD_EXPOSURE_VALUE", minExpTime, 3600, 1, false); gxccd_get_integer_parameter(cameraHandle, GIP_MAX_BINNING_X, &maxBinX); gxccd_get_integer_parameter(cameraHandle, GIP_MAX_BINNING_Y, &maxBinY); if (!sim && hasGain) { float gain = 0; if (gxccd_get_value(cameraHandle, GV_ADC_GAIN, &gain) < 0) { char errorStr[MAX_ERROR_LEN]; gxccd_get_last_error(cameraHandle, errorStr, sizeof(errorStr)); DEBUGF(INDI::Logger::DBG_ERROR, "Getting gain failed: %s.", errorStr); GainN[0].value = 0; GainNP.s = IPS_ALERT; IDSetNumber(&GainNP, NULL); return false; } else { GainN[0].value = gain; GainNP.s = IPS_OK; IDSetNumber(&GainNP, NULL); } } return true; }