void FishCampCCD::TimerHit() { int timerHitID = -1, state = -1, rc = -1; float timeleft; double ccdTemp; if (!isConnected()) return; // No need to reset timer if we are not connected anymore if (InExposure) { timeleft = CalcTimeLeft(); if (timeleft < 1.0) { if (timeleft > 0.25) { // a quarter of a second or more // just set a tighter timer timerHitID = SetTimer(250); } else { if (timeleft > 0.07) { // use an even tighter timer timerHitID = SetTimer(50); } else { // it's real close now, so spin on it // We have to wait till the camera is ready to download bool ready = false; int slv; slv = fabs(100000 * timeleft); //0.05s (50000 us) is checked every 5000 us or so while (!sim && !ready) { state = fcUsb_cmd_getState(cameraNum); if (state == 0) ready = true; else usleep(slv); } /* We're done exposing */ LOG_DEBUG("Exposure done, downloading image..."); PrimaryCCD.setExposureLeft(0); InExposure = false; /* grab and save image */ grabImage(); } } } else { LOGF_DEBUG("Image not yet ready. With time left %ld\n", timeleft); PrimaryCCD.setExposureLeft(timeleft); } } switch (TemperatureNP.s) { case IPS_IDLE: case IPS_OK: rc = fcUsb_cmd_getTemperature(cameraNum); LOGF_DEBUG("fcUsb_cmd_getTemperature returns %d", rc); ccdTemp = rc / 100.0; LOGF_DEBUG("Temperature %g", ccdTemp); if (fabs(TemperatureN[0].value - ccdTemp) >= TEMP_THRESHOLD) { TemperatureN[0].value = ccdTemp; IDSetNumber(&TemperatureNP, nullptr); } break; case IPS_BUSY: if (sim) { TemperatureN[0].value = TemperatureRequest; } else { rc = fcUsb_cmd_getTemperature(cameraNum); LOGF_DEBUG("fcUsb_cmd_getTemperature returns %d", rc); TemperatureN[0].value = rc / 100.0; } // If we're within threshold, let's make it BUSY ---> OK if (fabs(TemperatureRequest - TemperatureN[0].value) <= TEMP_THRESHOLD) TemperatureNP.s = IPS_OK; IDSetNumber(&TemperatureNP, nullptr); break; case IPS_ALERT: break; } switch (CoolerNP.s) { case IPS_OK: CoolerN[0].value = fcUsb_cmd_getTECPowerLevel(cameraNum); IDSetNumber(&CoolerNP, nullptr); LOGF_DEBUG("Cooler power level %g %", CoolerN[0].value); break; default: break; } if (timerHitID == -1) SetTimer(POLLMS); return; }
void FishCampCCD::TimerHit() { int timerHitID = -1, state = -1, rc = -1; long timeleft; double ccdTemp; if (isConnected() == false) return; // No need to reset timer if we are not connected anymore if (InExposure) { timeleft = CalcTimeLeft(); if (timeleft < 1.0) { if (timeleft > 0.25) { // a quarter of a second or more // just set a tighter timer timerHitID = SetTimer(250); } else { if (timeleft > 0.07) { // use an even tighter timer timerHitID = SetTimer(50); } else { // it's real close now, so spin on it while (!sim && timeleft > 0) { state = fcUsb_cmd_getState(cameraNum); if (state == 0) timeleft = 0; int slv; slv = 100000 * timeleft; usleep(slv); } /* We're done exposing */ DEBUG(INDI::Logger::DBG_DEBUG, "Exposure done, downloading image..."); PrimaryCCD.setExposureLeft(0); InExposure = false; /* grab and save image */ grabImage(); } } } else { DEBUGF(INDI::Logger::DBG_DEBUG, "Image not yet ready. With time left %ld\n", timeleft); } PrimaryCCD.setExposureLeft(timeleft); } switch (TemperatureNP.s) { case IPS_IDLE: case IPS_OK: rc = fcUsb_cmd_getTemperature(cameraNum); DEBUGF(INDI::Logger::DBG_DEBUG, "fcUsb_cmd_getTemperature returns %d", rc); ccdTemp = rc / 100.0; DEBUGF(INDI::Logger::DBG_DEBUG, "Temperature %g", ccdTemp); if (fabs(TemperatureN[0].value - ccdTemp) >= TEMP_THRESHOLD) { TemperatureN[0].value = ccdTemp; IDSetNumber(&TemperatureNP, NULL); } break; case IPS_BUSY: if (sim) { TemperatureN[0].value = TemperatureRequest; } else { rc = fcUsb_cmd_getTemperature(cameraNum); DEBUGF(INDI::Logger::DBG_DEBUG, "fcUsb_cmd_getTemperature returns %d", rc); TemperatureN[0].value = rc / 100.0; } // If we're within threshold, let's make it BUSY ---> OK if (fabs(TemperatureRequest - TemperatureN[0].value) <= TEMP_THRESHOLD) TemperatureNP.s = IPS_OK; IDSetNumber(&TemperatureNP, NULL); break; case IPS_ALERT: break; } switch (CoolerNP.s) { case IPS_OK: CoolerN[0].value = fcUsb_cmd_getTECPowerLevel(cameraNum); IDSetNumber(&CoolerNP, NULL); DEBUGF(INDI::Logger::DBG_DEBUG, "Cooler power level %g %", CoolerN[0].value); break; default: break; } if (timerHitID == -1) SetTimer(POLLMS); return; }