///////////////////////////////////////////////////////// /// Dedicated imaging thread ///////////////////////////////////////////////////////// void *ATIKCCD::imagingThreadEntry() { pthread_mutex_lock(&condMutex); threadState = StateIdle; pthread_cond_signal(&cv); while (true) { while (threadRequest == StateIdle) { pthread_cond_wait(&cv, &condMutex); } threadState = threadRequest; if (threadRequest == StateExposure) { checkExposureProgress(); } else if (threadRequest == StateRestartExposure) { threadRequest = StateIdle; pthread_mutex_unlock(&condMutex); StartExposure(ExposureRequest); pthread_mutex_lock(&condMutex); } else if (threadRequest == StateTerminate) { break; } else { threadRequest = StateIdle; pthread_cond_signal(&cv); } threadState = StateIdle; } threadState = StateTerminated; pthread_cond_signal(&cv); pthread_mutex_unlock(&condMutex); return nullptr; }
bool INDI::CCD::ISNewNumber (const char *dev, const char *name, double values[], char *names[], int n) { // first check if it's for our device //IDLog("INDI::CCD::ISNewNumber %s\n",name); if(strcmp(dev,getDeviceName())==0) { // This is for our device // Now lets see if it's something we process here if(strcmp(name,"CCD_EXPOSURE")==0) { float n; int rc; n=values[0]; PrimaryCCD.ImageExposureN[0].value=n; if (PrimaryCCD.ImageExposureNP->s==IPS_BUSY) AbortExposure(); PrimaryCCD.ImageExposureNP->s=IPS_BUSY; // now we have a new number, this is our requested exposure time // Tell the clients we are busy with this exposure // And now call the physical hardware layer to start the exposure rc=StartExposure(n); switch(rc) { case 0: // normal case, exposure running on timers, callbacks when it's finished PrimaryCCD.ImageExposureNP->s=IPS_BUSY; break; case 1: // Short exposure, it's already done PrimaryCCD.ImageExposureNP->s=IPS_OK; break; case -1: // error condition PrimaryCCD.ImageExposureNP->s=IPS_ALERT; break; } IDSetNumber(PrimaryCCD.ImageExposureNP,NULL); return true; } if(strcmp(name,"GUIDER_EXPOSURE")==0) { float n; int rc; n=values[0]; GuideCCD.ImageExposureN[0].value=n; GuideCCD.ImageExposureNP->s=IPS_BUSY; // now we have a new number, this is our requested exposure time // Tell the clients we are busy with this exposure // And now call the physical hardware layer to start the exposure // change of plans, this is just changing exposure time // the start/stop stream buttons do the rest rc=StartGuideExposure(n); //rc=1; // set it to ok switch(rc) { case 0: // normal case, exposure running on timers, callbacks when it's finished GuideCCD.ImageExposureNP->s=IPS_BUSY; break; case 1: // Short exposure, it's already done GuideCCD.ImageExposureNP->s=IPS_OK; break; case -1: // error condition GuideCCD.ImageExposureNP->s=IPS_ALERT; break; } IDSetNumber(GuideCCD.ImageExposureNP,NULL); return true; } if(strcmp(name,"CCD_BINNING")==0) { // We are being asked to set camera binning PrimaryCCD.ImageBinNP->s=IPS_OK; IUUpdateNumber(PrimaryCCD.ImageBinNP,values,names,n); if (updateCCDBin(PrimaryCCD.ImageBinN[0].value, PrimaryCCD.ImageBinN[1].value) == false) { PrimaryCCD.ImageBinNP->s = IPS_ALERT; IDSetNumber (PrimaryCCD.ImageBinNP, NULL); } return true; } if(strcmp(name,"CCD_FRAME")==0) { // We are being asked to set camera binning PrimaryCCD.ImageFrameNP->s=IPS_OK; IUUpdateNumber(PrimaryCCD.ImageFrameNP,values,names,n); if (updateCCDFrame(PrimaryCCD.ImageFrameN[0].value, PrimaryCCD.ImageFrameN[1].value, PrimaryCCD.ImageFrameN[2].value, PrimaryCCD.ImageFrameN[3].value) == false) { PrimaryCCD.ImageFrameNP->s = IPS_ALERT; IDSetNumber(PrimaryCCD.ImageFrameNP, NULL); } return true; } if(strcmp(name,"GUIDER_FRAME")==0) { // We are being asked to set camera binning GuideCCD.ImageFrameNP->s=IPS_OK; IUUpdateNumber(GuideCCD.ImageFrameNP,values,names,n); // Update client display //IDSetNumber(GuiderFrameNP,NULL); if (isDebug()) IDLog("GuiderFrame set to %4.0f,%4.0f %4.0f x %4.0f\n", GuideCCD.ImageFrameN[0].value,GuideCCD.ImageFrameN[1].value,GuideCCD.ImageFrameN[2].value,GuideCCD.ImageFrameN[3].value); //GSubX=GuiderFrameN[0].value; //GSubY=GuiderFrameN[1].value; //GSubW=GuiderFrameN[2].value; //GSubH=GuiderFrameN[3].value; GuideCCD.setFrame(GuideCCD.ImageFrameN[0].value, GuideCCD.ImageFrameN[1].value, GuideCCD.ImageFrameN[2].value,GuideCCD.ImageFrameN[3].value); return true; } if (!strcmp(name,GuideNSP.name) || !strcmp(name,GuideEWP.name)) { processGuiderProperties(name, values, names, n); return true; } } // if we didn't process it, continue up the chain, let somebody else // give it a shot return DefaultDevice::ISNewNumber(dev,name,values,names,n); }