diff options
author | Benjamin Berg <benjamin@sipsolutions.net> | 2009-10-05 11:36:26 (GMT) |
---|---|---|
committer | Benjamin Berg <benjamin@sipsolutions.net> | 2009-10-05 11:36:26 (GMT) |
commit | b3681e2696d414cce0b7320ca8ad3a0ecc1ae80e (patch) | |
tree | 1a94c7d062d50f0f4a513c038749b0102d2d8027 | |
parent | 6bf7fb222e51f039575ee8fb528bdfdb54353d3f (diff) |
Add possibility to change trigger configuration.
-rw-r--r-- | drawwaveform.py | 95 | ||||
-rw-r--r-- | sensor_toolbar.py | 39 | ||||
-rw-r--r-- | sound_toolbar.py | 36 |
3 files changed, 139 insertions, 31 deletions
diff --git a/drawwaveform.py b/drawwaveform.py index bc0a788..a3c13df 100644 --- a/drawwaveform.py +++ b/drawwaveform.py @@ -45,13 +45,21 @@ class DrawWaveform(gtk.DrawingArea): __gtype_name__ = "MeasureDrawWaveform" + TRIGGER_NONE = 0 + TRIGGER_POS = 1 + TRIGGER_NEG = 2 + def __init__(self, input_frequency=48000): gtk.DrawingArea.__init__(self) + self.add_events(gtk.gdk.BUTTON_PRESS_MASK) + self._input_freq = input_frequency self.stroke_color = None - self.triggering = True + self.triggering = self.TRIGGER_NONE + self.trigger_xpos = 0.0 + self.trigger_ypos = 0.5 self.buffers = np.array([]) self.main_buffers = np.array([]) @@ -88,6 +96,7 @@ class DrawWaveform(gtk.DrawingArea): self.log_param5 = "" self._BACKGROUND_LINE_THICKNESS = 0.8 + self._TRIGGER_LINE_THICKNESS = 3 self._FOREGROUND_LINE_THICKNESS = 6 self.logging_status = False @@ -196,12 +205,14 @@ class DrawWaveform(gtk.DrawingArea): return True def set_context_on(self): - self.handler_unblock(self.expose_event_id) + if not self.context: + self.handler_unblock(self.expose_event_id) self.context = True def set_context_off(self): + if self.context: + self.handler_block(self.expose_event_id) self.context = False - self.handler_block(self.expose_event_id) def set_invert_state(self, invert_state): self.invert = invert_state @@ -235,6 +246,17 @@ class DrawWaveform(gtk.DrawingArea): self._line_gc[graph_id].set_foreground(clr) + r, g, b = self.get_stroke_color_from_sugar() + clr = colormap.alloc_color(r, g, b, False, False) + + self._trigger_line_gc = self.window.new_gc(foreground=clr) + self._trigger_line_gc.set_line_attributes( \ + self._TRIGGER_LINE_THICKNESS, gdk.LINE_SOLID, \ + gdk.CAP_ROUND, gdk.JOIN_BEVEL) + + self._trigger_line_gc.set_foreground(clr) + + # Background pixmap clr = colormap.alloc_color(0, 65535, 0, False, False) @@ -271,6 +293,11 @@ class DrawWaveform(gtk.DrawingArea): del cr self.window.set_back_pixmap(back_surf, False) + def do_button_press_event(self, event): + self.trigger_xpos = event.x / float(self.allocation.width) + self.trigger_ypos = event.y / float(self.allocation.height) + return True + def _expose(self, widget, event): """This function is the "expose" event handler and does all the drawing""" #######################Real time drawing################################### @@ -288,18 +315,43 @@ class DrawWaveform(gtk.DrawingArea): x_offset = 0 if (self.fft_show==False): - if self.triggering == True: - ints = buf[:-samples-3] <= 0 - ints &= buf[1:-samples-2] > 0 + if self.triggering != self.TRIGGER_NONE: + xpos = self.trigger_xpos + ypos = self.trigger_ypos + samples_to_end = int(samples*(1-xpos)) - ints = np.where(ints)[0] - if len(ints) == 0: - ints = len(buf) - samples + ypos -= 0.5 + ypos *= -32767.0 / self.y_mag + + x_offset = + self.allocation.width * xpos - (samples - samples_to_end) * self.draw_interval + + position = -1 + if self.triggering & self.TRIGGER_POS: + ints = buf[samples-samples_to_end:-samples_to_end-3] <= ypos + ints &= buf[samples-samples_to_end+1:-samples_to_end-2] > ypos + + ints = np.where(ints)[0] + if len(ints) > 0: + position = max(position, ints[-1]) + + if self.triggering & self.TRIGGER_NEG: + ints = buf[samples-samples_to_end:-samples_to_end-3] >= ypos + ints &= buf[samples-samples_to_end+1:-samples_to_end-2] < ypos + + ints = np.where(ints)[0] + if len(ints) > 0: + position = max(position, ints[-1]) + + if position == -1: + position = len(buf) - samples_to_end - 2 else: - ints = ints[-1] - x_offset = int((float(-buf[ints])/(buf[ints+1]-buf[ints]))*self.draw_interval+0.5) + position = position+samples-samples_to_end + try: + x_offset -= int((float(-buf[position]+ypos)/(buf[position+1]-buf[position]))*self.draw_interval+0.5) + except: + pass - data = buf[ints:ints+samples+2].astype(np.float64) + data = buf[position-samples+samples_to_end:position+samples_to_end+2].astype(np.float64) else: data = buf[-samples:].astype(np.float64) @@ -331,17 +383,26 @@ class DrawWaveform(gtk.DrawingArea): ##########The actual drawing of the graph################## - lines = (np.arange(len(data), dtype='float32') * self.draw_interval) - x_offset + lines = (np.arange(len(data), dtype='float32') * self.draw_interval) + x_offset # We must make sure its int, or draw_lines will throw warnings # and these warnings are slow (even though they are filtered)! lines = zip(lines.astype('int'), data.astype('int')) - if self.type[graph_id] ==0: + if (self.fft_show==False): + if self.triggering != self.TRIGGER_NONE: + x = int(self.trigger_xpos * self.allocation.width) + y = int(self.trigger_ypos * self.allocation.height) + length = int(self._TRIGGER_LINE_THICKNESS * 3.5) + self.window.draw_line(self._trigger_line_gc, x - length, y, x + length, y) + self.window.draw_line(self._trigger_line_gc, x, y - length, x, y + length) + + if self.type[graph_id] == 0: self.window.draw_lines(self._line_gc[graph_id], lines) else: self.window.draw_points(self._line_gc[graph_id], lines) ############################################################ + """ ## DISPLAYING FRAMERATE FOR DEBUGGGIN fr = 1.0/( time.time()-self.pr_time) @@ -373,6 +434,12 @@ class DrawWaveform(gtk.DrawingArea): self._update_mode() + def get_trigger(self): + return self.triggering + + def set_trigger(self, trigger): + self.triggering = trigger + def get_ticks(self): return self.allocation.width/float(self._tick_size) diff --git a/sensor_toolbar.py b/sensor_toolbar.py index 3e0beb5..2b144bb 100644 --- a/sensor_toolbar.py +++ b/sensor_toolbar.py @@ -72,7 +72,6 @@ class SensorToolbar(gtk.Toolbar): ####################### Voltage ###################### self._voltage = ToolButton('bias-off') self.insert(self._voltage, -1) - self._voltage.show() self._voltage.set_tooltip(_('Voltage Sensor')) self._voltage.connect('clicked', self.set_resistance_voltage_mode,\ 'voltage') @@ -81,7 +80,6 @@ class SensorToolbar(gtk.Toolbar): ####################### invert ####################### self._invert = ToolButton('invert') self.insert(self._invert, -1) - self._invert.show() self._invert.set_tooltip(_('Invert')) self._invert.connect('clicked', self._invert_control_cb) self.wave.set_invert_state(False) @@ -90,7 +88,6 @@ class SensorToolbar(gtk.Toolbar): separator = gtk.SeparatorToolItem() separator.props.draw = True self.insert(separator, -1) - separator.show() self.loginterval_img = gtk.Image() self.loginterval_img.set_from_file(config.ICONS_DIR + \ @@ -98,8 +95,6 @@ class SensorToolbar(gtk.Toolbar): self.loginterval_img_tool = gtk.ToolItem() self.loginterval_img_tool.add(self.loginterval_img) self.insert(self.loginterval_img_tool,-1) - self.loginterval_img.show() - self.loginterval_img_tool.show() ################### Logging Interval ################## self._loginterval_combo = ComboBox() @@ -116,14 +111,12 @@ class SensorToolbar(gtk.Toolbar): self._loginterval_tool = ToolComboBox(self._loginterval_combo) self.insert(self._loginterval_tool,-1) - self._loginterval_tool.show() self.logginginterval_status = '1second' ######################################################## ########### Start Logging/Stop Logging ################# self._record = ToolButton('media-record') self.insert(self._record, -1) - self._record.show() self._record.set_tooltip(_('Start Recording')) self._record.connect('clicked', self.record_control) ######################################################## @@ -133,16 +126,34 @@ class SensorToolbar(gtk.Toolbar): separator.props.draw = False separator.set_expand(True) self.insert(separator, -1) - separator.show() self.sample_value = gtk.Label("-") - self.sample_value.show() self.sample_value_toolitem = gtk.ToolItem() self.sample_value_toolitem.add(self.sample_value) self.insert(self.sample_value_toolitem, -1) - self.sample_value_toolitem.show() ######################################################## + separator = gtk.SeparatorToolItem() + separator.props.draw = True + self.insert(separator, -1) + + ################# Trigger Setup ################# + self._trigger_combo = ComboBox() + self.trigger = [_('None'), _('Rising Edge') , _('Falling Edge') ] + self.trigger_conf = [wave.TRIGGER_NONE, wave.TRIGGER_POS, \ + wave.TRIGGER_NEG] + + self._trigger_changed_id = self._trigger_combo.connect("changed",\ + self.update_trigger_control) + + for i, s in enumerate(self.trigger): + self._trigger_combo.append_item(i, s, None) + self._trigger_combo.set_active(0) + + self._trigger_tool = ToolComboBox(self._trigger_combo) + self.insert(self._trigger_tool,-1) + self.show_all() + def set_sample_value(self, label="x"): self.sample_value.set_text(label) self.sample_value.show() @@ -207,6 +218,13 @@ class SensorToolbar(gtk.Toolbar): if (self._loginterval_combo.get_active() == 3): self.logginginterval_status = '30minute' + def update_trigger_control(self, *args): + active = self._trigger_combo.get_active() + if active == -1: + return + + self.wave.set_trigger(self.trigger_conf[active]) + def set_resistance_voltage_mode(self, data=None, mode_to_set='resistance'): if mode_to_set == 'resistance' and self.get_mode()=='voltage' : self.set_mode('resistance') @@ -269,6 +287,7 @@ class SensorToolbar(gtk.Toolbar): #self.boost_state = self.ag.get_mic_boost() self.ag.set_capture_gain(0) self.ag.set_mic_boost(False) + self.update_trigger_control() def _update_string_for_textbox(self): self.string_for_textbox = "" diff --git a/sound_toolbar.py b/sound_toolbar.py index d20156b..5fb26d5 100644 --- a/sound_toolbar.py +++ b/sound_toolbar.py @@ -71,7 +71,6 @@ class SoundToolbar(gtk.Toolbar): ###################### time ######################## self._time = ToolButton('domain-time2') self.insert(self._time, -1) - self._time.show() self._time.set_tooltip(_('Time base')) self._time.connect('clicked', self._timefreq_control_cb, True) #################################################### @@ -124,12 +123,10 @@ class SoundToolbar(gtk.Toolbar): separator = gtk.SeparatorToolItem() separator.props.draw = True self.insert(separator, -1) - separator.show() ################## pause button #################### self._pause = ToolButton('media-playback-pause') self.insert(self._pause, -1) - self._pause.show() self._pause.set_tooltip(_('Freeze the display')) self._pause.connect('clicked', self._pauseplay_control_cb) #################################################### @@ -145,8 +142,6 @@ class SoundToolbar(gtk.Toolbar): self.loginterval_img_tool = gtk.ToolItem() self.loginterval_img_tool.add(self.loginterval_img) self.insert(self.loginterval_img_tool,-1) - self.loginterval_img.show() - self.loginterval_img_tool.show() ################# Logging Interval ################# self._loginterval_combo = ComboBox() @@ -163,18 +158,37 @@ class SoundToolbar(gtk.Toolbar): self._loginterval_tool = ToolComboBox(self._loginterval_combo) self.insert(self._loginterval_tool,-1) - self._loginterval_tool.show() self.logginginterval_status = 'picture' #################################################### ############## Start Logging/Stop Logging ########## self._record = ToolButton('media-record') self.insert(self._record, -1) - self._record.show() self._record.set_tooltip(_('Start Recording')) self._record.connect('clicked', self.record_control) #################################################### + separator = gtk.SeparatorToolItem() + separator.props.draw = True + self.insert(separator, -1) + + ################# Trigger Setup ################# + self._trigger_combo = ComboBox() + self.trigger = [_('None'), _('Rising Edge') , _('Falling Edge') ] + self.trigger_conf = [wave.TRIGGER_NONE, wave.TRIGGER_POS, \ + wave.TRIGGER_NEG] + + self._trigger_changed_id = self._trigger_combo.connect("changed",\ + self.update_trigger_control) + + for i, s in enumerate(self.trigger): + self._trigger_combo.append_item(i, s, None) + self._trigger_combo.set_active(0) + + self._trigger_tool = ToolComboBox(self._trigger_combo) + self.insert(self._trigger_tool,-1) + self.show_all() + self._update_page_size() def record_control(self, data=None): @@ -242,6 +256,13 @@ class SoundToolbar(gtk.Toolbar): if (self._loginterval_combo.get_active() == 4): self.logginginterval_status = '30minute' + def update_trigger_control(self, *args): + active = self._trigger_combo.get_active() + if active == -1: + return + + self.wave.set_trigger(self.trigger_conf[active]) + def _pauseplay_control_cb(self, data=None): if self.ag.get_freeze_the_display()==True: self.ag.set_freeze_the_display(False) @@ -328,6 +349,7 @@ class SoundToolbar(gtk.Toolbar): self.wave.set_fft_mode(False) self.wave.set_mag_params(self.g, self.y_mag) self._update_string_for_textbox() + self.update_trigger_control() def _update_string_for_textbox(self): if self.wave.get_fft_mode() == False: |