diff --git a/script/device/Pixel.py b/script/device/Pixel.py index de25817..436b733 100644 --- a/script/device/Pixel.py +++ b/script/device/Pixel.py @@ -24,20 +24,18 @@ class Pixel(DeviceBase, Readable): self.PIX_THRESH1 = 40 self.PIX_THRESH2 = 500 self.PIX_THRESH3 = 8000 - self.PIX_THRESH4 = 100000 - + self.PIX_THRESH4 = 100000 + self.PIX_EXP_START_TIME = 0 self._update_header_length() - - self.show() - def _update_header_length(): - format = self_get_image_format(self) + def _update_header_length(self): + format = self.get_image_format() ext = format.split('.')[-1] - if (ext == "tif"): + if ext == "tif": self.IMAGE_HEADER_LENGTH = 4096 - else if (ext == "edf"): + elif ext == "edf": self.IMAGE_HEADER_LENGTH = 1024 else: self.IMAGE_HEADER_LENGTH = 0 @@ -53,6 +51,7 @@ class Pixel(DeviceBase, Readable): def set_image_format(self, fmt): caput(self.prefix + ":FNAM_FMT", fmt) + self._update_header_length(); def get_count_id(self): return caget (self.prefix + ":FNUM", 'i') @@ -67,9 +66,27 @@ class Pixel(DeviceBase, Readable): val = max(float(val), 0.000005) caput (self.prefix + ":EXPOSE", val * 1000) - def get_status(self): - return caget (self.prefix + ":STATUS") + def get_status(self): + ret = caget (self.prefix + ":STATUS", 's') + if ret in ["Ready0", "Ready1"]: + setState(State.Ready) + elif ret in ["Snapping", "Writing", "Updating"]: + setState(State.Busy) + elif ret in ["Error"]: + setState(State.Error) + elif ret in ["Time-out", "Disconnected"]: + setState(State.Offline) + elif ret in ["Undefined","Connected",]: + setState(State.Invalid) + else: + setState(State.Invalid) + return ret + def is_status_ready(self, status=None): + if status is None: + status = self.get_status() + return status in ["Ready0", "Ready1"] + def set_path(self, patha, pathb=""): caput(self.prefix + ":PATHa", patha) caput(self.prefix + ":PATHb", pathb) @@ -83,76 +100,62 @@ class Pixel(DeviceBase, Readable): return caget (self.prefix + ":TRIG") + def get_trigger_id(self): + return caget (self.prefix + ":TRIG", 'i') + + def pixsnap(self): + pixwait() # Wait until pixel detector is ready + PIX_EXPOSE = epics_get(PIX_EXPOSE_CHN) + slef.set_trigger ("Inc+Sn+Wr") + self.PIX_EXP_START_TIME = time.time() - def pixwait(): - cnt = 0 + def pixwait(self): + cnt = 0 + expose = self.get_expose() # # First wait for "TRIG" to go back to idle. This should # ensure that execution of the command has started. # - trig = epics_get (PIX_TRIG_CHN, "long") - while (trig != 0) { - cnt = cnt + 1 - if (cnt > 1000) { - printf("Triger signal still busy, pixwait timed-out!\n") - exit - } - sleep (0.05) trig = epics_get (PIX_TRIG_CHN, "long") - } + while (get_trigger_id() != 0): + cnt = cnt + 1 + if (cnt > 1000): + raise Exception("Trigger signal still busy, pixwait timed-out!\n") + time.sleep (0.05) # # Then wait for exposure time to elapse. # (PIX_EXPOSE is in milliseconds!) # - while (time() <= PIX_EXP_START_TIME+(PIX_EXPOSE/1000)){ - sleep(0.05) - } + while time.time() <= self.PIX_EXP_START_TIME + (expose * 1000) : + time.sleep(0.05) # # Then wait for the pixel detector to become ready. # Wait time is 1000 x 0.05 sec = 50 sec. # - smsFlag = 0 - stat = epics_get (PIX_STATUS_CHN, "string") - while ((stat != "Ready0") && (stat != "Ready1")) { - cnt = cnt + 1 - if (cnt > 1000) { - printf("%s %s", "pixwait: Pixel status did not return to \"Ready\" within 50", \\ - "seconds.\n") - beep; beep; beep; beep; beep; - if (smsFlag == 0) { - smsSendMessage ("Pixel detector problem in pixwait.") - } - smsFlag = 1 - printf ("\n") - secs=15 - while (secs > 0) { - printf ("\r\aHit any keyboard character within %3d secs to abort.", secs) - sleep (1.0) - _9 = input (-1) - if (length (_9) > 0) { - beep; printf ("\nAborted.\n") - exit - } - secs-- - } - printf ("Trying for another 50 secs\n") - } - if ((stat == "Undefined") || \ - (stat == "Time-out") || \ - (stat == "Error")) { - print "\aInvalid PIX status:", stat - exit - } - sleep (0.05) - stat = epics_get (PIX_STATUS_CHN, "string") - } - if (smsFlag == 1) { - smsSendMessage ("Pixel detector seems to have recovered from error.") - } - + sms_flag = 0 + while (True): + stat = self.get_status() + if is_status_ready(stat): + break + cnt = cnt + 1 + if cnt > 1000 : + if (smsFlag == 0): + print("pixwait: Pixel status did not return to 'Ready' within 50 seconds.") + notify ("Pixel detector problem in pixwait.") + sms_flag = 1 + + if stat in ("Undefined", "Time-out", "Error"): + raise Exception ("Invalid PIX status:", stat) + time.sleep (0.05) + + + if sms_flag == 1: + notify ("Pixel detector seems to have recovered from error.") + + def show(self): print ("\nThe current pixel detector settings are:\n") @@ -175,11 +178,11 @@ class Pixel(DeviceBase, Readable): printf(" Threshold values: Thresh1 = %d, Thresh2 = %d, Thresh3 = %d, Thresh4 = %d\n" % (PIX_THRESH1,PIX_THRESH2,PIX_THRESH3,PIX_THRESH4)) def doUpdate(self): - pass + self.get_status() def read(self): return None add_device( Pixel("pixel", "X04SA-ES3-CCD"), True) -#mythen.polling = 1000 +pixel.polling = 1000 pixel.update()