Example #1
0
 def _on_incr_dynamic_range(self, event):
     self.parent[DYNAMIC_RANGE_KEY] = min(MAX_DYNAMIC_RANGE, common.get_clean_incr(self.parent[DYNAMIC_RANGE_KEY]))
 def _on_incr_db_div(self, event):
     self.parent[constants.Y_PER_DIV_KEY] = min(DB_DIV_MAX, common.get_clean_incr(self.parent[constants.Y_PER_DIV_KEY]))
Example #3
0
    def handle_samples(self):
        """
		Handle the cached samples from the scope input.
		Perform ac coupling, triggering, and auto ranging.
		"""
        if not self.sampleses: return
        sampleses = self.sampleses
        #if self[XY_MODE_KEY]:
        if True:
            self[DECIMATION_KEY] = 1
            x_samples = sampleses[self[X_CHANNEL_KEY]]
            y_samples = sampleses[self[Y_CHANNEL_KEY]]
            z_samples = sampleses[2]
            #autorange
            if self[AUTORANGE_KEY] and time.time(
            ) - self.autorange_ts > AUTORANGE_UPDATE_RATE:
                x_min, x_max = common.get_min_max(x_samples)
                y_min, y_max = common.get_min_max(y_samples)
                #adjust the x per div
                x_per_div = common.get_clean_num(
                    (x_max - x_min) / self[X_DIVS_KEY])
                if x_per_div != self[X_PER_DIV_KEY]:
                    self[X_PER_DIV_KEY] = x_per_div
                    return
                #adjust the x offset
                x_off = x_per_div * round((x_max + x_min) / 2 / x_per_div)
                if x_off != self[X_OFF_KEY]:
                    self[X_OFF_KEY] = x_off
                    return
                #adjust the y per div
                y_per_div = common.get_clean_num(
                    (y_max - y_min) / self[Y_DIVS_KEY])
                if y_per_div != self[Y_PER_DIV_KEY]:
                    self[Y_PER_DIV_KEY] = y_per_div
                    return
                #adjust the y offset
                y_off = y_per_div * round((y_max + y_min) / 2 / y_per_div)
                if y_off != self[Y_OFF_KEY]:
                    self[Y_OFF_KEY] = y_off
                    return
                self.autorange_ts = time.time()
            #plot xy channel
            self.plotter.set_waveform(
                channel='XY',
                samples=(x_samples, y_samples, z_samples),
                color_spec=CHANNEL_COLOR_SPECS[0],
                marker=self[XY_MARKER_KEY],
            )
            #turn off each waveform
            for i, samples in enumerate(sampleses):
                self.plotter.clear_waveform(channel='Ch%d' % (i + 1))
        else:
            #autorange
            if self[AUTORANGE_KEY] and time.time(
            ) - self.autorange_ts > AUTORANGE_UPDATE_RATE:
                bounds = [common.get_min_max(samples) for samples in sampleses]
                y_min = numpy.min([bound[0] for bound in bounds])
                y_max = numpy.max([bound[1] for bound in bounds])
                #adjust the y per div
                y_per_div = common.get_clean_num(
                    (y_max - y_min) / self[Y_DIVS_KEY])
                if y_per_div != self[Y_PER_DIV_KEY]:
                    self[Y_PER_DIV_KEY] = y_per_div
                    return
                #adjust the y offset
                y_off = y_per_div * round((y_max + y_min) / 2 / y_per_div)
                if y_off != self[Y_OFF_KEY]:
                    self[Y_OFF_KEY] = y_off
                    return
                self.autorange_ts = time.time()
            #number of samples to scale to the screen
            actual_rate = self.get_actual_rate()
            time_span = self[T_PER_DIV_KEY] * self[T_DIVS_KEY]
            num_samps = int(round(time_span * actual_rate))
            #handle the time offset
            t_off = self[T_FRAC_OFF_KEY] * (len(sampleses[0]) / actual_rate -
                                            time_span)
            if t_off != self[T_OFF_KEY]:
                self[T_OFF_KEY] = t_off
                return
            samps_off = int(round(actual_rate * self[T_OFF_KEY]))
            #adjust the decim so that we use about half the samps
            self[DECIMATION_KEY] = int(
                round(time_span * self[SAMPLE_RATE_KEY] /
                      (0.5 * len(sampleses[0]))))
            #num samps too small, auto increment the time
            if num_samps < 2:
                self[T_PER_DIV_KEY] = common.get_clean_incr(
                    self[T_PER_DIV_KEY])
                #num samps in bounds, plot each waveform
            elif num_samps <= len(sampleses[0]):
                for i, samples in enumerate(sampleses):
                    #plot samples
                    self.plotter.set_waveform(
                        channel='Ch%d' % (i + 1),
                        samples=samples[samps_off:num_samps + samps_off],
                        color_spec=CHANNEL_COLOR_SPECS[i],
                        marker=self[common.index_key(MARKER_KEY, i)],
                        trig_off=self.trigger_offset,
                    )
            #turn XY channel off
            self.plotter.clear_waveform(channel='XY')
        #keep trigger level within range
        if self[TRIGGER_LEVEL_KEY] > self.get_y_max():
            self[TRIGGER_LEVEL_KEY] = self.get_y_max()
            return
        if self[TRIGGER_LEVEL_KEY] < self.get_y_min():
            self[TRIGGER_LEVEL_KEY] = self.get_y_min()
            return
        #disable the trigger channel
        if not self[TRIGGER_SHOW_KEY] or self[XY_MODE_KEY] or self[
                TRIGGER_MODE_KEY] == wxgui.TRIG_MODE_FREE:
            self.plotter.clear_waveform(channel='Trig')
        else:  #show trigger channel
            trigger_level = self[TRIGGER_LEVEL_KEY]
            trigger_point = (len(self.sampleses[0]) -
                             1) / self.get_actual_rate() / 2.0
            self.plotter.set_waveform(
                channel='Trig',
                samples=([
                    self.get_t_min(), trigger_point, trigger_point,
                    trigger_point, trigger_point,
                    self.get_t_max()
                ], [
                    trigger_level, trigger_level,
                    self.get_y_max(),
                    self.get_y_min(), trigger_level, trigger_level
                ]),
                color_spec=TRIGGER_COLOR_SPEC,
            )
        #update the plotter
        self.plotter.update()
Example #4
0
 def _on_incr_dynamic_range(self, event):
     self.parent[DYNAMIC_RANGE_KEY] = min(
         MAX_DYNAMIC_RANGE,
         common.get_clean_incr(self.parent[DYNAMIC_RANGE_KEY]))
Example #5
0
	def handle_samples(self):
		"""
		Handle the cached samples from the scope input.
		Perform ac coupling, triggering, and auto ranging.
		"""
		if not self.sampleses: return
		sampleses = self.sampleses
		#if self[XY_MODE_KEY]:
                if True:
			self[DECIMATION_KEY] = 1
			x_samples = sampleses[self[X_CHANNEL_KEY]]
			y_samples = sampleses[self[Y_CHANNEL_KEY]]
                        z_samples = sampleses[2]
			#autorange
			if self[AUTORANGE_KEY] and time.time() - self.autorange_ts > AUTORANGE_UPDATE_RATE:
				x_min, x_max = common.get_min_max(x_samples)
				y_min, y_max = common.get_min_max(y_samples)
				#adjust the x per div
				x_per_div = common.get_clean_num((x_max-x_min)/self[X_DIVS_KEY])
				if x_per_div != self[X_PER_DIV_KEY]: self[X_PER_DIV_KEY] = x_per_div; return
				#adjust the x offset
				x_off = x_per_div*round((x_max+x_min)/2/x_per_div)
				if x_off != self[X_OFF_KEY]: self[X_OFF_KEY] = x_off; return
				#adjust the y per div
				y_per_div = common.get_clean_num((y_max-y_min)/self[Y_DIVS_KEY])
				if y_per_div != self[Y_PER_DIV_KEY]: self[Y_PER_DIV_KEY] = y_per_div; return
				#adjust the y offset
				y_off = y_per_div*round((y_max+y_min)/2/y_per_div)
				if y_off != self[Y_OFF_KEY]: self[Y_OFF_KEY] = y_off; return
				self.autorange_ts = time.time()
			#plot xy channel
			self.plotter.set_waveform(
				channel='XY',
				samples=(x_samples, y_samples, z_samples),
				color_spec=CHANNEL_COLOR_SPECS[0],
				marker=self[XY_MARKER_KEY],
			)
			#turn off each waveform
			for i, samples in enumerate(sampleses):
				self.plotter.clear_waveform(channel='Ch%d'%(i+1))
		else:
			#autorange
			if self[AUTORANGE_KEY] and time.time() - self.autorange_ts > AUTORANGE_UPDATE_RATE:
				bounds = [common.get_min_max(samples) for samples in sampleses]
				y_min = numpy.min([bound[0] for bound in bounds])
				y_max = numpy.max([bound[1] for bound in bounds])
				#adjust the y per div
				y_per_div = common.get_clean_num((y_max-y_min)/self[Y_DIVS_KEY])
				if y_per_div != self[Y_PER_DIV_KEY]: self[Y_PER_DIV_KEY] = y_per_div; return
				#adjust the y offset
				y_off = y_per_div*round((y_max+y_min)/2/y_per_div)
				if y_off != self[Y_OFF_KEY]: self[Y_OFF_KEY] = y_off; return
				self.autorange_ts = time.time()
			#number of samples to scale to the screen
			actual_rate = self.get_actual_rate()
			time_span = self[T_PER_DIV_KEY]*self[T_DIVS_KEY]
			num_samps = int(round(time_span*actual_rate))
			#handle the time offset
			t_off = self[T_FRAC_OFF_KEY]*(len(sampleses[0])/actual_rate - time_span)
			if t_off != self[T_OFF_KEY]: self[T_OFF_KEY] = t_off; return
			samps_off = int(round(actual_rate*self[T_OFF_KEY]))
			#adjust the decim so that we use about half the samps
			self[DECIMATION_KEY] = int(round(
					time_span*self[SAMPLE_RATE_KEY]/(0.5*len(sampleses[0]))
				)
			)
			#num samps too small, auto increment the time
			if num_samps < 2: self[T_PER_DIV_KEY] = common.get_clean_incr(self[T_PER_DIV_KEY])
			#num samps in bounds, plot each waveform
			elif num_samps <= len(sampleses[0]):
				for i, samples in enumerate(sampleses):
					#plot samples
					self.plotter.set_waveform(
						channel='Ch%d'%(i+1),
						samples=samples[samps_off:num_samps+samps_off],
						color_spec=CHANNEL_COLOR_SPECS[i],
						marker=self[common.index_key(MARKER_KEY, i)],
						trig_off=self.trigger_offset,
					)
			#turn XY channel off
			self.plotter.clear_waveform(channel='XY')
		#keep trigger level within range
		if self[TRIGGER_LEVEL_KEY] > self.get_y_max():
			self[TRIGGER_LEVEL_KEY] = self.get_y_max(); return
		if self[TRIGGER_LEVEL_KEY] < self.get_y_min():
			self[TRIGGER_LEVEL_KEY] = self.get_y_min(); return
		#disable the trigger channel
		if not self[TRIGGER_SHOW_KEY] or self[XY_MODE_KEY] or self[TRIGGER_MODE_KEY] == wxgui.TRIG_MODE_FREE:
			self.plotter.clear_waveform(channel='Trig')
		else: #show trigger channel
			trigger_level = self[TRIGGER_LEVEL_KEY]
			trigger_point = (len(self.sampleses[0])-1)/self.get_actual_rate()/2.0
			self.plotter.set_waveform(
				channel='Trig',
				samples=(
					[self.get_t_min(), trigger_point, trigger_point, trigger_point, trigger_point, self.get_t_max()],
					[trigger_level, trigger_level, self.get_y_max(), self.get_y_min(), trigger_level, trigger_level]
				),
				color_spec=TRIGGER_COLOR_SPEC,
			)
		#update the plotter
		self.plotter.update()