Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBenjamin Berg <benjamin@sipsolutions.net>2009-10-05 11:36:26 (GMT)
committer Benjamin Berg <benjamin@sipsolutions.net>2009-10-05 11:36:26 (GMT)
commitb3681e2696d414cce0b7320ca8ad3a0ecc1ae80e (patch)
tree1a94c7d062d50f0f4a513c038749b0102d2d8027
parent6bf7fb222e51f039575ee8fb528bdfdb54353d3f (diff)
Add possibility to change trigger configuration.
-rw-r--r--drawwaveform.py95
-rw-r--r--sensor_toolbar.py39
-rw-r--r--sound_toolbar.py36
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: