Basic terminal window that takes raw text on input msgq and appends it
authorJohnathan Corgan <jcorgan@corganenterprises.com>
Thu, 22 Oct 2009 00:11:03 +0000 (17:11 -0700)
committerJohnathan Corgan <jcorgan@corganenterprises.com>
Thu, 29 Oct 2009 14:00:35 +0000 (07:00 -0700)
Works, but needs "--line-buffered" mode for GR buffering between blocks

gr-wxgui/src/python/term_window.py
gr-wxgui/src/python/termsink.py
grc/blocks/wxgui_termsink.xml

index 8658e54a6e096396a097101b6ad4fc5e05057e5e..77270b1f36820e07648173a70b4b2626428df8e3 100644 (file)
 #
 
 import wx
-import pubsub
 
 DEFAULT_WIN_SIZE = (600, 300)
+APPEND_EVENT = wx.NewEventType()
+EVT_APPEND_EVENT = wx.PyEventBinder(APPEND_EVENT, 0)
 
-class term_window(wx.Panel, pubsub.pubsub):
+class AppendEvent(wx.PyEvent):
+    def __init__(self, text):
+        wx.PyEvent.__init__(self)
+        self.SetEventType(APPEND_EVENT)
+        self.text = text
+
+    def Clone(self): 
+        self.__class__(self.GetId())
+
+
+class term_window(wx.Panel):
        def __init__(self,
                     parent,
                     size,
                     ):
 
-               pubsub.pubsub.__init__(self)
                wx.Panel.__init__(self,
                                  parent,
                                  size=size,
@@ -39,7 +49,7 @@ class term_window(wx.Panel, pubsub.pubsub):
 
                self.text_ctrl = wx.TextCtrl(self,
                                             wx.ID_ANY,
-                                            value="BOO",
+                                            value="",
                                             size=size,
                                             style=wx.TE_MULTILINE|wx.TE_READONLY,
                                        )
@@ -47,3 +57,14 @@ class term_window(wx.Panel, pubsub.pubsub):
                main_sizer = wx.BoxSizer(wx.VERTICAL)
                main_sizer.Add(self.text_ctrl, 1, wx.EXPAND)
                self.SetSizerAndFit(main_sizer)
+
+                EVT_APPEND_EVENT(self, self.evt_append)
+
+        def append_text(self, text):
+            evt = AppendEvent(text)
+            wx.PostEvent(self, evt)
+            del evt
+
+        def evt_append(self, evt):
+            print "appending", len(evt.text), "bytes"
+            self.text_ctrl.AppendText(evt.text)
index 2c583b1150c66d4fcde6522d49dbc2142a0dbe00..addfa5810173d422e11535e9a3524fbe1343b657 100644 (file)
 #
 
 import term_window
-import common
-from gnuradio import gr
+from gnuradio import gru
 
-class termsink(gr.hier_block2, common.wxgui_hb):
+class termsink(object):
        def __init__(self,
                     parent,
+                    msgq,
+                    size=term_window.DEFAULT_WIN_SIZE,
                     ):
-
-               gr.hier_block2.__init__(
-                       self,
-                       "termsink",
-                       gr.io_signature(0, 0, 0),
-                       gr.io_signature(0, 0, 0),
-               )
-
+               
                self.win = term_window.term_window(
                        parent=parent,
-                       size=term_window.DEFAULT_WIN_SIZE,
+                       size=size,
                )
+
+               self.runner = gru.msgq_runner(msgq, self.handle_msg)
+
+       def handle_msg(self, msg):
+               # Just append text for now
+               text = msg.to_string()
+               print "handle_msg: received", len(text), "bytes"
+               self.win.append_text(text)
index e1d52cd175b6dcffdbb949166814b9e4ded2db33..fce7577de9cfd971458676d3f2124e16c18fad74 100644 (file)
@@ -7,26 +7,49 @@
 <block>
        <name>Terminal Sink</name>
        <key>wxgui_termsink</key>
+
        <import>from gnuradio.wxgui import termsink</import>
+
        <make>#set $parent = $notebook() and 'self.%s.GetPage(%s)'%$notebook() or 'self'
 termsink.termsink(
-       $(parent).GetWin(),
+       parent=$(parent).GetWin(),
+#if $win_size()
+       size=$win_size,
+#end if
+       msgq=$(id)_msgq,
 )
 #if not $grid_pos()
 $(parent).Add(self.$(id).win)
 #else
 $(parent).GridAdd(self.$(id).win, $(', '.join(map(str, $grid_pos()))))
 #end if</make>
+
+       <param>
+               <name>Window Size</name>
+               <key>win_size</key>
+               <value></value>
+               <type>int_vector</type>
+               <hide>#if $win_size() then 'none' else 'part'#</hide>
+       </param>
        <param>
                <name>Grid Position</name>
                <key>grid_pos</key>
                <value></value>
                <type>grid_pos</type>
        </param>
+
        <param>
                <name>Notebook</name>
                <key>notebook</key>
                <value></value>
                <type>notebook</type>
        </param>
+
+       <check>not $win_size or len($win_size) == 2</check>
+
+       <sink>
+               <name>in</name>
+               <type>msg</type>
+       </sink>
+       
 </block>