def initProperties(self): self.logger.info("initProperties "+self.getDefaultName()) super(CCDSimulator, self).initProperties() PyIndiDriver.IUFillNumber(self.SimulatorSettingsN[0],"SIM_XRES","CCD X resolution","%4.0f",0,2048,0,1280) PyIndiDriver.IUFillNumber(self.SimulatorSettingsN[1],"SIM_YRES","CCD Y resolution","%4.0f",0,2048,0,1024) PyIndiDriver.IUFillNumber(self.SimulatorSettingsN[2],"SIM_XSIZE","CCD X Pixel Size","%4.2f",0,60,0,5.2) PyIndiDriver.IUFillNumber(self.SimulatorSettingsN[3],"SIM_YSIZE","CCD Y Pixel Size","%4.2f",0,60,0,5.2) PyIndiDriver.IUFillNumber(self.SimulatorSettingsN[4],"SIM_MAXVAL","CCD Maximum ADU","%4.0f",0,65000,0,65000) PyIndiDriver.IUFillNumber(self.SimulatorSettingsN[5],"SIM_BIAS","CCD Bias","%4.0f",0,6000,0,10) PyIndiDriver.IUFillNumber(self.SimulatorSettingsN[6],"SIM_SATURATION","Saturation Mag","%4.1f",0,20,0,1.0) PyIndiDriver.IUFillNumber(self.SimulatorSettingsN[7],"SIM_LIMITINGMAG","Limiting Mag","%4.1f",0,20,0,17.0) PyIndiDriver.IUFillNumber(self.SimulatorSettingsN[8],"SIM_NOISE","CCD Noise","%4.0f",0,6000,0,10) PyIndiDriver.IUFillNumber(self.SimulatorSettingsN[9],"SIM_SKYGLOW","Sky Glow (magnitudes)","%4.1f",0,6000,0,19.5) PyIndiDriver.IUFillNumber(self.SimulatorSettingsN[10],"SIM_OAGOFFSET","Oag Offset (arcminutes)","%4.1f",0,6000,0,0) PyIndiDriver.IUFillNumber(self.SimulatorSettingsN[11],"SIM_POLAR","PAE (arcminutes)","%4.1f",-600,600,0,0) PyIndiDriver.IUFillNumber(self.SimulatorSettingsN[12],"SIM_POLARDRIFT","PAE Drift (minutes)","%4.1f",0,6000,0,0) cnumbers=PyIndiDriver.new_INumberArray(13) for i in range(len(self.SimulatorSettingsN)): PyIndiDriver.INumberArray_setitem(cnumbers, i, self.SimulatorSettingsN[i]) PyIndiDriver.IUFillNumberVector(self.SimulatorSettingsNV,cnumbers,13,self.getDeviceName(),"SIMULATOR_SETTINGS","Simulator Settings","Simulator Config",PyIndi.IP_RW,60,PyIndi.IPS_IDLE) PyIndiDriver.IUFillSwitch(self.TimeFactorS[0],"1X","Actual Time",PyIndi.ISS_ON) PyIndiDriver.IUFillSwitch(self.TimeFactorS[1],"10X","10x",PyIndi.ISS_OFF) PyIndiDriver.IUFillSwitch(self.TimeFactorS[2],"100X","100x",PyIndi.ISS_OFF) cswitchs=PyIndiDriver.new_ISwitchArray(3) for i in range(len(self.TimeFactorS)): PyIndiDriver.ISwitchArray_setitem(cswitchs, i, self.TimeFactorS[i]) PyIndiDriver.IUFillSwitchVector(self.TimeFactorSV,cswitchs,3,self.getDeviceName(),"ON_TIME_FACTOR","Time Factor","Simulator Config",PyIndi.IP_RW,PyIndi.ISR_1OFMANY,60,PyIndi.IPS_IDLE) self.addDebugControl() logProperties(self) return True
def ISNewNumber(self, dev, name, values, names, n): if (dev != self.name): return False self.logger.info("ISNewNumber " + dev + " property " + name) nvp = self.getNumber(name) if not nvp: return False if name == 'SIMULATOR_SETTINGS': cvalues = PyIndiDriver.new_doubleArray(n) for i in range(len(values)): self.logger.info(' ' + names[i] + ' = ' + str(values[i])) PyIndiDriver.doubleArray_setitem(cvalues, i, values[i]) PyIndiDriver.IUUpdateNumber(nvp, cvalues, names, n) nvp.s = PyIndi.IPS_OK # Reset our parameters now #SetupParms(); PyIndiDriver.IDSetNumber(nvp, None) #saveConfig(); #IDLog("Frame set to %4.0f,%4.0f %4.0f x %4.0f\n",CcdFrameN[0].value,CcdFrameN[1].value,CcdFrameN[2].value,CcdFrameN[3].value); #self.seeing=nvp[0].value return True cvalues = PyIndiDriver.new_doubleArray(n) for i in range(len(values)): self.logger.info(' ' + names[i] + ' = ' + str(values[i])) PyIndiDriver.doubleArray_setitem(cvalues, i, values[i]) if super(CCDSimulator, self).ISNewNumber(dev, name, cvalues, names, n): return True return False
def __init__(self): super(CCDSimulator, self).__init__() #PyIndiDriver.PyCCD.__init__(self) #self.RA=0.0 self.name = 'PyCCD Simulator' self.AbortGuideFrame = False self.AbortPrimaryFrame = False self.ShowStarField = True self.timefactor = 1.0 self.InExposure = False self.ExposureRequest = 1.0 # CCD Capability is nested structure in C++ class: capability not supported by swig self.cap = PyIndiDriver.CCDCapability() self.cap.canAbort = True self.cap.canBin = True self.cap.canSubFrame = True self.cap.hasCooler = False self.cap.hasGuideHead = True self.cap.hasShutter = True self.cap.hasST4Port = True # no way: capability is private, SetCapability is protected (can not extend for Python) #self.setCCDCapability(self.cap) #self.SetCapability(self.cap) # it is unuseful to keep these objetcs as they are not synchronized with C++ real data self.SimulatorSettingsNV = PyIndi.INumberVectorProperty() self.SimulatorSettingsN = [PyIndi.INumber() for x in range(13)] self.TimeFactorSV = PyIndi.ISwitchVectorProperty() self.TimeFactorS = [PyIndi.ISwitch() for x in range(3)] self.logger = logging.getLogger('PyIndiDriver.CCD') self.logger.info('creating an instance of PyIndiDriver.CCD')
def ISNewSwitch (self, dev, name, states, names, n): if (dev != self.name): return False self.logger.info("ISNewSwitch " + dev + " property " + name) # Always fetch data from C++ world svp=self.getSwitch(name) if not svp: return False cstates=PyIndiDriver.new_ISStateArray(n) for i in range(len(states)): self.logger.info(' '+names[i] + ' = ' + str(states[i])) PyIndiDriver.ISStateArray_setitem(cstates, i, states[i]) if name == 'ON_TIME_FACTOR': svp.s=PyIndi.IPS_OK PyIndiDriver.IUUpdateSwitch(svp,cstates,names,n) # Update client display PyIndiDriver.IDSetSwitch(svp,None) #saveConfig(); if svp[0].s==PyIndi.ISS_ON: PyIndiDriver.IDLog("CCDSim:: Time Factor 1\n") self.timefactor=1.0 if svp[1].s==PyIndi.ISS_ON: PyIndiDriver.IDLog("CCDSim:: Time Factor 0.1\n") self.timefactor=0.1 if svp[2].s==PyIndi.ISS_ON: PyIndiDriver.IDLog("CCDSim:: Time Factor 0.01\n") self.timefactor=0.01 return True if super(CCDSimulator, self).ISNewSwitch(dev, name, cstates, names, n): return True return False
def ISNewSwitch(self, dev, name, states, names, n): if (dev != self.name): return False self.logger.info("ISNewSwitch " + dev + " property " + name) # Always fetch data from C++ world svp = self.getSwitch(name) if not svp: return False cstates = PyIndiDriver.new_ISStateArray(n) for i in range(len(states)): self.logger.info(' ' + names[i] + ' = ' + str(states[i])) PyIndiDriver.ISStateArray_setitem(cstates, i, states[i]) if name == 'ON_TIME_FACTOR': svp.s = PyIndi.IPS_OK PyIndiDriver.IUUpdateSwitch(svp, cstates, names, n) # Update client display PyIndiDriver.IDSetSwitch(svp, None) #saveConfig(); if svp[0].s == PyIndi.ISS_ON: PyIndiDriver.IDLog("CCDSim:: Time Factor 1\n") self.timefactor = 1.0 if svp[1].s == PyIndi.ISS_ON: PyIndiDriver.IDLog("CCDSim:: Time Factor 0.1\n") self.timefactor = 0.1 if svp[2].s == PyIndi.ISS_ON: PyIndiDriver.IDLog("CCDSim:: Time Factor 0.01\n") self.timefactor = 0.01 return True if super(CCDSimulator, self).ISNewSwitch(dev, name, cstates, names, n): return True return False
def logProperties(d): # print a list of all device properties lp = d.getProperties() for p in lp: PyIndiDriver.IDLog('Property ' + p.getName() + ' - ' + p.getLabel() + '\n') if p.getType() == PyIndi.INDI_TEXT: tpy = p.getText() for t in tpy: PyIndiDriver.IDLog(" " + t.name + "(" + t.label + ")= " + t.text + '\n') elif p.getType() == PyIndi.INDI_NUMBER: tpy = p.getNumber() for t in tpy: PyIndiDriver.IDLog(" " + t.name + "(" + t.label + ")= " + str(t.value) + '\n') elif p.getType() == PyIndi.INDI_SWITCH: tpy = p.getSwitch() for t in tpy: PyIndiDriver.IDLog(" " + t.name + "(" + t.label + ")= " + strISState(t.s) + '\n') elif p.getType() == PyIndi.INDI_LIGHT: tpy = p.getLight() for t in tpy: PyIndiDriver.IDLog(" " + t.name + "(" + t.label + ")= " + strIPState(t.s) + '\n') elif p.getType() == PyIndi.INDI_BLOB: tpy = p.getBLOB() for t in tpy: PyIndiDriver.IDLog(" " + t.name + "(" + t.label + ")= <blob " + str(t.size) + " bytes>" + '\n')
def ISNewNumber (self, dev, name, values, names, n): if (dev != self.name): return False self.logger.info("ISNewNumber " + dev + " property " + name) nvp=self.getNumber(name) if not nvp: return False if name == 'SIMULATOR_SETTINGS': cvalues=PyIndiDriver.new_doubleArray(n) for i in range(len(values)): self.logger.info(' ' + names[i] + ' = ' + str(values[i])) PyIndiDriver.doubleArray_setitem(cvalues, i, values[i]) PyIndiDriver.IUUpdateNumber(nvp, cvalues, names, n) nvp.s=PyIndi.IPS_OK # Reset our parameters now #SetupParms(); PyIndiDriver.IDSetNumber(nvp,None) #saveConfig(); #IDLog("Frame set to %4.0f,%4.0f %4.0f x %4.0f\n",CcdFrameN[0].value,CcdFrameN[1].value,CcdFrameN[2].value,CcdFrameN[3].value); #self.seeing=nvp[0].value return True cvalues=PyIndiDriver.new_doubleArray(n) for i in range(len(values)): self.logger.info(' ' + names[i] + ' = ' + str(values[i])) PyIndiDriver.doubleArray_setitem(cvalues, i, values[i]) if super(CCDSimulator, self).ISNewNumber(dev, name, cvalues, names, n): return True return False
def ISNewSwitch (self, dev, name, states, names, n): self.logger.info("ISNewSwitch " + dev + " property " + name) if (dev != self.name): return False # Build Clike array to call C++ method # names is handled by swig (see %typemap(in) char *[]) cstates=PyIndiDriver.new_ISStateArray(n) for i in range(len(states)): self.logger.info(' '+names[i] + ' = ' + str(states[i])) PyIndiDriver.ISStateArray_setitem(cstates, i, states[i]) if super(IndiDriver, self).ISNewSwitch(dev, name, cstates, names, n): return True svp=self.getSwitch(name) lvp=self.getLight('Light Property') if not svp: return False if not self.isConnected(): svp.s=PyIndi.IPS_ALERT PyIndiDriver.IDSetSwitch(svp, "Cannot change property while device is disconnected.") return False if not lvp: return False if (name == "Menu"): # Use the Clike array to call C methods PyIndiDriver.IUUpdateSwitch(svp, cstates, names, n) onSW=PyIndiDriver.IUFindOnSwitch(svp) lightIndex=PyIndiDriver.IUFindOnSwitchIndex(svp) if (lightIndex < 0 or lightIndex > lvp.nlp): return False if (onSW): lightState=random.randint(0,3) lvp[lightIndex].s=lightState # direct indexing of the vector, do not use lvp.lp svp.s=PyIndi.IPS_OK lvp.s=PyIndi.IPS_OK PyIndiDriver.IDSetSwitch(svp, 'Setting to switch '+onSW.name+' is successful. Changing corresponding light property to '+strIPState(lvp[lightIndex].s)) PyIndiDriver.IDSetLight(lvp, None) return True PyIndiDriver.delete_ISStateArray(cstates) return False
def initProperties(self): self.logger.info("initProperties "+self.getDefaultName()) super(IndiDriver, self).initProperties() #self.logger.info("initProperties loading skeleton") self.skelFileName = "tutorial_four_sk.xml" self.skel = os.getenv("INDISKEL") if self.skel: self.buildSkeleton(self.skel) else: try: os.stat(self.skelFileName) self.buildSkeleton(self.skelFileName) except OSError as e: PyIndiDriver.IDLog("No skeleton file was specified. Set environment variable INDISKEL to the skeleton path and try again.\n"); # Optional: Add aux controls for configuration, debug & simulation that get added in the Options tab # of the driver. self.addAuxControls() # Let's print a list of all device properties lp=self.getProperties() for p in lp: PyIndiDriver.IDLog('Property '+p.getName()+' - ' + p.getLabel() + '\n') if p.getType()==PyIndi.INDI_TEXT: tpy=p.getText() for t in tpy: PyIndiDriver.IDLog(" "+t.name+"("+t.label+")= "+t.text + '\n') elif p.getType()==PyIndi.INDI_NUMBER: tpy=p.getNumber() for t in tpy: PyIndiDriver.IDLog(" "+t.name+"("+t.label+")= "+str(t.value) + '\n') elif p.getType()==PyIndi.INDI_SWITCH: tpy=p.getSwitch() for t in tpy: PyIndiDriver.IDLog(" "+t.name+"("+t.label+")= "+strISState(t.s) + '\n') elif p.getType()==PyIndi.INDI_LIGHT: tpy=p.getLight() for t in tpy: PyIndiDriver.IDLog(" "+t.name+"("+t.label+")= "+strIPState(t.s) + '\n') elif p.getType()==PyIndi.INDI_BLOB: tpy=p.getBLOB() for t in tpy: PyIndiDriver.IDLog(" "+t.name+"("+t.label+")= <blob "+str(t.size)+" bytes>" + '\n') return True
def ISNewNumber (self, dev, name, values, names, n): self.logger.info("ISNewNumber " + dev + " property " + name) if (dev != self.name): return False nvp=self.getNumber(name) if not nvp: return False if not self.isConnected(): nvp.s=PyIndi.IPS_ALERT PyIndiDriver.IDSetNumber(nvp, "Cannot change property while device is disconnected.") return False if (name == "Number Property"): cvalues=PyIndiDriver.new_doubleArray(n) for i in range(len(values)): self.logger.info(' ' + names[i] + ' = ' + str(values[i])) PyIndiDriver.doubleArray_setitem(cvalues, i, values[i]) PyIndiDriver.IUUpdateNumber(nvp, cvalues, names, n) print names nvp.s=PyIndi.IPS_OK PyIndiDriver.IDSetNumber(nvp, None) return True return False
def initProperties(self): self.logger.info("initProperties " + self.getDefaultName()) super(CCDSimulator, self).initProperties() PyIndiDriver.IUFillNumber(self.SimulatorSettingsN[0], "SIM_XRES", "CCD X resolution", "%4.0f", 0, 2048, 0, 1280) PyIndiDriver.IUFillNumber(self.SimulatorSettingsN[1], "SIM_YRES", "CCD Y resolution", "%4.0f", 0, 2048, 0, 1024) PyIndiDriver.IUFillNumber(self.SimulatorSettingsN[2], "SIM_XSIZE", "CCD X Pixel Size", "%4.2f", 0, 60, 0, 5.2) PyIndiDriver.IUFillNumber(self.SimulatorSettingsN[3], "SIM_YSIZE", "CCD Y Pixel Size", "%4.2f", 0, 60, 0, 5.2) PyIndiDriver.IUFillNumber(self.SimulatorSettingsN[4], "SIM_MAXVAL", "CCD Maximum ADU", "%4.0f", 0, 65000, 0, 65000) PyIndiDriver.IUFillNumber(self.SimulatorSettingsN[5], "SIM_BIAS", "CCD Bias", "%4.0f", 0, 6000, 0, 10) PyIndiDriver.IUFillNumber(self.SimulatorSettingsN[6], "SIM_SATURATION", "Saturation Mag", "%4.1f", 0, 20, 0, 1.0) PyIndiDriver.IUFillNumber(self.SimulatorSettingsN[7], "SIM_LIMITINGMAG", "Limiting Mag", "%4.1f", 0, 20, 0, 17.0) PyIndiDriver.IUFillNumber(self.SimulatorSettingsN[8], "SIM_NOISE", "CCD Noise", "%4.0f", 0, 6000, 0, 10) PyIndiDriver.IUFillNumber(self.SimulatorSettingsN[9], "SIM_SKYGLOW", "Sky Glow (magnitudes)", "%4.1f", 0, 6000, 0, 19.5) PyIndiDriver.IUFillNumber(self.SimulatorSettingsN[10], "SIM_OAGOFFSET", "Oag Offset (arcminutes)", "%4.1f", 0, 6000, 0, 0) PyIndiDriver.IUFillNumber(self.SimulatorSettingsN[11], "SIM_POLAR", "PAE (arcminutes)", "%4.1f", -600, 600, 0, 0) PyIndiDriver.IUFillNumber(self.SimulatorSettingsN[12], "SIM_POLARDRIFT", "PAE Drift (minutes)", "%4.1f", 0, 6000, 0, 0) cnumbers = PyIndiDriver.new_INumberArray(13) for i in range(len(self.SimulatorSettingsN)): PyIndiDriver.INumberArray_setitem(cnumbers, i, self.SimulatorSettingsN[i]) PyIndiDriver.IUFillNumberVector(self.SimulatorSettingsNV, cnumbers, 13, self.getDeviceName(), "SIMULATOR_SETTINGS", "Simulator Settings", "Simulator Config", PyIndi.IP_RW, 60, PyIndi.IPS_IDLE) PyIndiDriver.IUFillSwitch(self.TimeFactorS[0], "1X", "Actual Time", PyIndi.ISS_ON) PyIndiDriver.IUFillSwitch(self.TimeFactorS[1], "10X", "10x", PyIndi.ISS_OFF) PyIndiDriver.IUFillSwitch(self.TimeFactorS[2], "100X", "100x", PyIndi.ISS_OFF) cswitchs = PyIndiDriver.new_ISwitchArray(3) for i in range(len(self.TimeFactorS)): PyIndiDriver.ISwitchArray_setitem(cswitchs, i, self.TimeFactorS[i]) PyIndiDriver.IUFillSwitchVector(self.TimeFactorSV, cswitchs, 3, self.getDeviceName(), "ON_TIME_FACTOR", "Time Factor", "Simulator Config", PyIndi.IP_RW, PyIndi.ISR_1OFMANY, 60, PyIndi.IPS_IDLE) self.addDebugControl() logProperties(self) return True
self.PrimaryCCD.setExposureLeft(timeleft) if timeleft < 1.0: if timeleft <= 0.001: self.InExposure = False self.ExposureComplete(self.PrimaryCCD) else: self.nexttimer = int(timeleft * 1000) # set a shorter timer self.SetTimer(self.nexttimer) return def DrawCCDFrame(self, targetChip): return logging.basicConfig(format='%(asctime)s %(message)s', level=logging.INFO) ccd = CCDSimulator() PyIndiDriver.driver_run() #indidriver.ISNewSwitch("Python Simple Skeleton", "CONNECTION", [0, 1], ["CONNECT", "DISCONNECT"], 1) # test #import PyIndi #import PyIndiDriver #ion=[PyIndi.INumber() for x in range(13)] #PyIndiDriver.IUFillNumber(ion[0],"SIM_XRES","CCD X resolution","%4.0f",0,2048,0,1280) #PyIndiDriver.IUFillNumber(ion[1],"SIM_YRES","CCD Y resolution","%4.0f",0,2048,0,1024) #ionv=PyIndi.INumberVectorProperty() #PyIndiDriver.IUFillNumberVector(ionv, ion,13,"to","SI","Si","Sic",PyIndi.IP_RW, 60, PyIndi.IPS_IDLE)
timeleft=self.CalcTimeLeft(self.ExpStart, self.ExposureRequest) if timeleft < 0.0: timeleft=0.0 self.PrimaryCCD.setExposureLeft(timeleft) if timeleft < 1.0: if timeleft <= 0.001: self.InExposure=False self.ExposureComplete(self.PrimaryCCD) else: self.nexttimer=int(timeleft*1000) # set a shorter timer self.SetTimer(self.nexttimer) return def DrawCCDFrame(self, targetChip): return logging.basicConfig(format='%(asctime)s %(message)s', level=logging.INFO) ccd=CCDSimulator() PyIndiDriver.driver_run() #indidriver.ISNewSwitch("Python Simple Skeleton", "CONNECTION", [0, 1], ["CONNECT", "DISCONNECT"], 1) # test #import PyIndi #import PyIndiDriver #ion=[PyIndi.INumber() for x in range(13)] #PyIndiDriver.IUFillNumber(ion[0],"SIM_XRES","CCD X resolution","%4.0f",0,2048,0,1280) #PyIndiDriver.IUFillNumber(ion[1],"SIM_YRES","CCD Y resolution","%4.0f",0,2048,0,1024) #ionv=PyIndi.INumberVectorProperty() #PyIndiDriver.IUFillNumberVector(ionv, ion,13,"to","SI","Si","Sic",PyIndi.IP_RW, 60, PyIndi.IPS_IDLE)
def ISNewBLOB(dev, name, sizes, blobsizes, blobs, formats, names, n): PyIndiDriver.IDLog("Main ISNewBLOB\n") indidriver.ISNewBLOB(dev, name, sizes, blobsizes, blobs, formats, names, n)
def ISNewBLOB (self, dev, name, sizes, blobsizes, blobs, formats, names, n): self.logger.info("ISNewBLOB " + dev + " property " + name) if (dev != self.name): return False bvp=self.getBLOB(name) if not bvp: return False if not self.isConnected(): bvp.s=PyIndi.IPS_ALERT PyIndiDriver.IDSetNumber(bvp, "Cannot change property while device is disconnected.") return False if (bvp.name == "BLOB Test"): csizes=PyIndiDriver.new_intArray(n) for i in range(len(sizes)): PyIndiDriver.intArray_setitem(csizes, i, sizes[i]) #PyIndiDriver.IDLog('BLOB '+str(i)+' Content:\n##################################\n'+blobs[i]+'\n##################################\n') cblobsizes=PyIndiDriver.new_intArray(n) for i in range(len(blobsizes)): PyIndiDriver.intArray_setitem(cblobsizes, i, blobsizes[i]) PyIndiDriver.IUUpdateBLOB(bvp, csizes, cblobsizes, blobs, formats, names, n); bp = PyIndiDriver.IUFindBLOB(bvp, names[0]) if (not bp): return False PyIndiDriver.IDLog('Received BLOB with name '+bp.name+', format '+getattr(bp,'format')+', and size '+str(bp.size)+', and bloblen '+str(bp.bloblen)+'\n') #PyIndiDriver.IDLog('BLOB Content:\n##################################\n'+str(bp.getblobdata())+'\n##################################\n') bp.size=0 bvp.s = PyIndi.IPS_OK PyIndiDriver.IDSetBLOB(bvp, None) return True