def _execute_lumen_degas(self, controller, pattern): from pychron.core.pid import PID from pychron.core.ui.gui import invoke_in_main_thread from pychron.lasers.pattern.mv_viewer import MVViewer from pychron.graph.stream_graph import StreamStackedGraph from pychron.mv.mv_image import MVImage lm = self.laser_manager sm = lm.stage_manager g = StreamStackedGraph() img = MVImage() img.setup_images(2, sm.get_frame_size()) mvviewer = MVViewer(graph=g, image=img) mvviewer.edit_traits() # g.edit_traits() g.new_plot(xtitle='Time', ytitle='Lumens') g.new_series() g.new_plot(xtitle='Time', ytitle='Error') g.new_series(plotid=1) g.new_plot(xtitle='Time', ytitle='Power') g.new_series(plotid=2) duration = pattern.duration lumens = pattern.lumens dt = pattern.period st = time.time() pid = PID() def update(c, e, o, cs, ss): g.record(c, plotid=0) g.record(e, plotid=1) g.record(o, plotid=2) img.set_image(cs, 0) img.set_image(ss, 1) while self._alive: if duration and time.time() - st > duration: break with PeriodCTX(dt): csrc, src, cl = sm.get_brightness() err = lumens - cl out = pid.get_value(err, dt) lm.set_laser_power(out) invoke_in_main_thread(update, (cl, err, out, csrc, src))
def degas(self, lumens, duration): """ degas for duration trying to maintain lumens """ if self.laser_manager: self.laser_manager.fiber_light.power_off() g = self._make_graph(lumens, duration) if self._testing: self._test_graph = g else: self.laser_manager.auxilary_graph = g.plotcontainer cw, ch = 2 * self.crop_width * self.pxpermm, 2 * self.crop_height * self.pxpermm # if not cw % 5 == 0: # cw += cw % 5 # if not ch % 5 == 0: # ch += ch % 5 # # cw, ch = 200, 200 im = MVImage() im.setup_images(1, (cw, ch)) if self._testing: self._test_image = im else: self.view_image(im) self._detector = LumenDetector() dt = self._period pid = self.pid st = time.time() i = 0 while 1: ct = time.time() tt = ct - st if not self.isAlive(): break cl = self._get_current_lumens(im, cw, ch) err = lumens - cl out = pid.get_value(err, dt) g.add_data(((tt, out), (tt, err), (tt, cl))) self._set_power(out, i) if tt > duration: break et = time.time() - ct time.sleep(max(0, dt - et)) i += 1 if i > 1e6: i = 0 if self.laser_manager: self.laser_manager.fiber_light.power_on() self.executing = False
def degas(self, lumens, duration): ''' degas for duration trying to maintain lumens ''' if self.laser_manager: self.laser_manager.fiber_light.power_off() g = self._make_graph(lumens, duration) if self._testing: self._test_graph = g else: self.laser_manager.auxilary_graph = g.plotcontainer cw, ch = 2 * self.crop_width * self.pxpermm, 2 * self.crop_height * self.pxpermm # print cw, ch if not cw % 5 == 0: cw += cw % 5 if not ch % 5 == 0: ch += ch % 5 cw, ch = 200, 200 # im = self.new_image( # # frame=zeros((ch, cw)), # title='Luminosity', view_id='lumens') im = MVImage() im.setup_images(1, (cw, ch)) if self._testing: self._test_image = im else: self.view_image(im) self._detector = LumenDetector() dt = self._period pid = self.pid st = time.time() i = 0 while 1: ct = time.time() tt = ct - st if not self.isAlive(): break cl = self._get_current_lumens(im, cw, ch) err = lumens - cl out = pid.get_value(err, dt) # err = random.random() g.add_data(((tt, out), (tt, err), (tt, cl))) # g.redraw() # if i % 5 == 0: self._set_power(out, i) if tt > duration: break et = time.time() - ct time.sleep(max(0, dt - et)) i += 1 if i > 1e6: i = 0 if self.laser_manager: self.laser_manager.fiber_light.power_on() self.executing = False