void QHYCCD::updateTemperature() { double ccdtemp = 0, coolpower = 0; double nextPoll = POLLMS; if (sim) { ccdtemp = TemperatureN[0].value; if (TemperatureN[0].value < TemperatureRequest) ccdtemp += TEMP_THRESHOLD; else if (TemperatureN[0].value > TemperatureRequest) ccdtemp -= TEMP_THRESHOLD; coolpower = 128; } else { ccdtemp = GetQHYCCDParam(camhandle, CONTROL_CURTEMP); coolpower = GetQHYCCDParam(camhandle, CONTROL_CURPWM); ControlQHYCCDTemp(camhandle, TemperatureRequest); } DEBUGF(INDI::Logger::DBG_DEBUG, "CCD Temp: %g CCD RAW Cooling Power: %g, CCD Cooling percentage: %g", ccdtemp, coolpower, coolpower / 255.0 * 100); TemperatureN[0].value = ccdtemp; CoolerN[0].value = coolpower / 255.0 * 100; if (coolpower > 0 && CoolerS[0].s == ISS_OFF) { CoolerNP.s = IPS_BUSY; CoolerSP.s = IPS_OK; CoolerS[0].s = ISS_ON; CoolerS[1].s = ISS_OFF; IDSetSwitch(&CoolerSP, NULL); } else if (coolpower <= 0 && CoolerS[0].s == ISS_ON) { CoolerNP.s = IPS_IDLE; CoolerSP.s = IPS_IDLE; CoolerS[0].s = ISS_OFF; CoolerS[1].s = ISS_ON; IDSetSwitch(&CoolerSP, NULL); } if (TemperatureNP.s == IPS_BUSY && fabs(TemperatureN[0].value - TemperatureRequest) <= TEMP_THRESHOLD) { TemperatureN[0].value = TemperatureRequest; TemperatureNP.s = IPS_OK; } /* //we need call ControlQHYCCDTemp every second to control temperature if (TemperatureNP.s == IPS_BUSY) nextPoll = TEMPERATURE_BUSY_MS; */ IDSetNumber(&TemperatureNP, NULL); IDSetNumber(&CoolerNP, NULL); temperatureID = IEAddTimer(nextPoll, QHYCCD::updateTemperatureHelper, this); }
bool QHYCCD::updateProperties() { double min=0, max=0, step=0; // This must be executed BEFORE INDI::CCD::updateProperties() // Since Primary CCD Exposure will be defined in there so we have to get its limits now { // Exposure limits in microseconds int ret = GetQHYCCDParamMinMaxStep(camhandle, CONTROL_EXPOSURE, &min, &max, &step); if (ret == QHYCCD_SUCCESS) PrimaryCCD.setMinMaxStep("CCD_EXPOSURE", "CCD_EXPOSURE_VALUE", min/1e6, max/1e6, step/1e6, false); else PrimaryCCD.setMinMaxStep("CCD_EXPOSURE", "CCD_EXPOSURE_VALUE", 0.001, 3600, 1, false); DEBUGF(INDI::Logger::DBG_DEBUG, "Exposure. Min: %g Max: %g Step %g", min, max, step); } // Define parent class properties INDI::CCD::updateProperties(); if (isConnected()) { if (HasCooler()) { defineSwitch(&CoolerSP); defineNumber(&CoolerNP); temperatureID = IEAddTimer(POLLMS, QHYCCD::updateTemperatureHelper, this); } if (HasUSBSpeed) { if (sim) { SpeedN[0].min = 1; SpeedN[0].max = 5; SpeedN[0].step = 1; SpeedN[0].value = 1; } else { int ret = GetQHYCCDParamMinMaxStep(camhandle, CONTROL_SPEED, &min, &max, &step); if (ret == QHYCCD_SUCCESS) { SpeedN[0].min = min; SpeedN[0].max = max; SpeedN[0].step = step; } SpeedN[0].value = GetQHYCCDParam(camhandle, CONTROL_SPEED); DEBUGF(INDI::Logger::DBG_DEBUG, "USB Speed. Value: %g Min: %g Max: %g Step %g", SpeedN[0].value, SpeedN[0].min, SpeedN[0].max, SpeedN[0].step); } defineNumber(&SpeedNP); } if (HasGain) { if (sim) { GainN[0].min = 0; GainN[0].max = 100; GainN[0].step = 10; GainN[0].value = 50; } else { int ret = GetQHYCCDParamMinMaxStep(camhandle, CONTROL_GAIN, &min, &max, &step); if (ret == QHYCCD_SUCCESS) { GainN[0].min = min; GainN[0].max = max; GainN[0].step = step; } GainN[0].value = GetQHYCCDParam(camhandle, CONTROL_GAIN); DEBUGF(INDI::Logger::DBG_DEBUG, "Gain. Value: %g Min: %g Max: %g Step %g", GainN[0].value, GainN[0].min, GainN[0].max, GainN[0].step); } defineNumber(&GainNP); } if (HasOffset) { if (sim) { OffsetN[0].min = 1; OffsetN[0].max = 10; OffsetN[0].step = 1; OffsetN[0].value = 1; } else { int ret = GetQHYCCDParamMinMaxStep(camhandle, CONTROL_OFFSET, &min, &max, &step); if (ret == QHYCCD_SUCCESS) { OffsetN[0].min = min; OffsetN[0].max = max; OffsetN[0].step = step; } OffsetN[0].value = GetQHYCCDParam(camhandle, CONTROL_OFFSET); DEBUGF(INDI::Logger::DBG_DEBUG, "Offset. Value: %g Min: %g Max: %g Step %g", OffsetN[0].value, OffsetN[0].min, OffsetN[0].max, OffsetN[0].step); } //Define the Offset defineNumber(&OffsetNP); } if (HasFilters) { INDI::FilterInterface::updateProperties(); } if (HasUSBTraffic) { if (sim) { USBTrafficN[0].min = 1; USBTrafficN[0].max = 100; USBTrafficN[0].step = 5; USBTrafficN[0].value = 20; } else { int ret = GetQHYCCDParamMinMaxStep(camhandle, CONTROL_USBTRAFFIC, &min, &max, &step); if (ret == QHYCCD_SUCCESS) { USBTrafficN[0].min = min; USBTrafficN[0].max = max; USBTrafficN[0].step = step; } USBTrafficN[0].value = GetQHYCCDParam(camhandle, CONTROL_USBTRAFFIC); DEBUGF(INDI::Logger::DBG_DEBUG, "USB Traffic. Value: %g Min: %g Max: %g Step %g", USBTrafficN[0].value, USBTrafficN[0].min, USBTrafficN[0].max, USBTrafficN[0].step); } defineNumber(&USBTrafficNP); } // Let's get parameters now from CCD setupParams(); //timerID = SetTimer(POLLMS); } else { if (HasCooler()) { deleteProperty(CoolerSP.name); deleteProperty(CoolerNP.name); } if (HasUSBSpeed) { deleteProperty(SpeedNP.name); } if (HasGain) { deleteProperty(GainNP.name); } if (HasOffset) { deleteProperty(OffsetNP.name); } if (HasFilters) { INDI::FilterInterface::updateProperties(); } if (HasUSBTraffic) deleteProperty(USBTrafficNP.name); RemoveTimer(timerID); } return true; }
bool QHYCCD::updateProperties() { INDI::CCD::updateProperties(); double min,max,step; if (isConnected()) { if (HasCooler()) { defineSwitch(&CoolerSP); defineNumber(&CoolerNP); temperatureID = IEAddTimer(POLLMS, QHYCCD::updateTemperatureHelper, this); } if(HasUSBSpeed) { if (sim) { SpeedN[0].min = 1; SpeedN[0].max = 5; SpeedN[0].step = 1; SpeedN[0].value = 1; } else { int ret = GetQHYCCDParamMinMaxStep(camhandle,CONTROL_SPEED,&min,&max,&step); if(ret == QHYCCD_SUCCESS) { SpeedN[0].min = min; SpeedN[0].max = max; SpeedN[0].step = step; } SpeedN[0].value = GetQHYCCDParam(camhandle,CONTROL_SPEED); DEBUGF(INDI::Logger::DBG_DEBUG, "USB Speed. Value: %g Min: %g Max: %g Step %g", SpeedN[0].value, SpeedN[0].min, SpeedN[0].max, SpeedN[0].step); } defineNumber(&SpeedNP); } if(HasGain) { if (sim) { GainN[0].min = 0; GainN[0].max = 100; GainN[0].step = 10; GainN[0].value = 50; } else { int ret = GetQHYCCDParamMinMaxStep(camhandle,CONTROL_GAIN,&min,&max,&step); if(ret == QHYCCD_SUCCESS) { GainN[0].min = min; GainN[0].max = max; GainN[0].step = step; } GainN[0].value = GetQHYCCDParam(camhandle,CONTROL_GAIN); DEBUGF(INDI::Logger::DBG_DEBUG, "Gain. Value: %g Min: %g Max: %g Step %g", GainN[0].value, GainN[0].min, GainN[0].max, GainN[0].step); } defineNumber(&GainNP); } if(HasOffset) { if (sim) { OffsetN[0].min = 1; OffsetN[0].max = 10; OffsetN[0].step = 1; OffsetN[0].value = 1; } else { int ret = GetQHYCCDParamMinMaxStep(camhandle,CONTROL_OFFSET,&min,&max,&step); if(ret == QHYCCD_SUCCESS) { OffsetN[0].min = min; OffsetN[0].max = max; OffsetN[0].step = step; } OffsetN[0].value = GetQHYCCDParam(camhandle,CONTROL_OFFSET); DEBUGF(INDI::Logger::DBG_DEBUG, "Offset. Value: %g Min: %g Max: %g Step %g", OffsetN[0].value, OffsetN[0].min, OffsetN[0].max, OffsetN[0].step); } //Define the Offset defineNumber(&OffsetNP); } if(HasFilters) { //Define the Filter Slot and name properties defineNumber(&FilterSlotNP); GetFilterNames(FILTER_TAB); defineText(FilterNameTP); } if (HasUSBTraffic) { if (sim) { USBTrafficN[0].min = 1; USBTrafficN[0].max = 100; USBTrafficN[0].step = 5; USBTrafficN[0].value = 20; } else { int ret = GetQHYCCDParamMinMaxStep(camhandle,CONTROL_USBTRAFFIC,&min,&max,&step); if(ret == QHYCCD_SUCCESS) { USBTrafficN[0].min = min; USBTrafficN[0].max = max; USBTrafficN[0].step = step; } USBTrafficN[0].value = GetQHYCCDParam(camhandle,CONTROL_USBTRAFFIC); DEBUGF(INDI::Logger::DBG_DEBUG, "USB Traffic. Value: %g Min: %g Max: %g Step %g", USBTrafficN[0].value, USBTrafficN[0].min, USBTrafficN[0].max, USBTrafficN[0].step); } defineNumber(&USBTrafficNP); } // Let's get parameters now from CCD setupParams(); //timerID = SetTimer(POLLMS); } else { if (HasCooler()) { deleteProperty(CoolerSP.name); deleteProperty(CoolerNP.name); } if(HasUSBSpeed) { deleteProperty(SpeedNP.name); } if(HasGain) { deleteProperty(GainNP.name); } if(HasOffset) { deleteProperty(OffsetNP.name); } if(HasFilters) { deleteProperty(FilterSlotNP.name); deleteProperty(FilterNameTP->name); } if (HasUSBTraffic) deleteProperty(USBTrafficNP.name); RemoveTimer(timerID); } return true; }