commit-gnuradio
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Commit-gnuradio] r6347 - in grc/trunk: notes src src/Graphics src/Signa


From: jblum
Subject: [Commit-gnuradio] r6347 - in grc/trunk: notes src src/Graphics src/SignalBlockDefs
Date: Fri, 7 Sep 2007 01:44:09 -0600 (MDT)

Author: jblum
Date: 2007-09-07 01:44:08 -0600 (Fri, 07 Sep 2007)
New Revision: 6347

Modified:
   grc/trunk/notes/notes.txt
   grc/trunk/src/ActionHandler.py
   grc/trunk/src/ExecFlowGraph.py
   grc/trunk/src/Graphics/MainWindow.py
   grc/trunk/src/SignalBlockDefs/Filters.py
   grc/trunk/src/SignalBlockDefs/Packet.py
   grc/trunk/src/SignalBlockDefs/SignalBlockTree.py
Log:
removed old packet mods, file descriptor for tuntap, moved page access methods 
into page class, fixed window resize bug

Modified: grc/trunk/notes/notes.txt
===================================================================
--- grc/trunk/notes/notes.txt   2007-09-06 19:53:33 UTC (rev 6346)
+++ grc/trunk/notes/notes.txt   2007-09-07 07:44:08 UTC (rev 6347)
@@ -1,9 +1,7 @@
 ############   Blocks to Add:  ####################
 -ofdm
--usrp misc settings
+-usrp misc settings?
 -usrp quad souce, set z == 1 to ignore Q inputs 
--blks blocks, add filesave for logging
--combine add/mult with add/mult vector
 -multi-channel scope
 
 ############   Known Problems: ####################
@@ -12,6 +10,7 @@
 -usrp transmit dies in lock/unlock
 -packet blocks freeze in lock/unlock
 -packet: remove flush when freezes fixed
+-audio dies lock/unlock
 
 ############   Features to Add:        ####################
 -startup tips

Modified: grc/trunk/src/ActionHandler.py
===================================================================
--- grc/trunk/src/ActionHandler.py      2007-09-06 19:53:33 UTC (rev 6346)
+++ grc/trunk/src/ActionHandler.py      2007-09-07 07:44:08 UTC (rev 6347)
@@ -52,6 +52,7 @@
                self.main_window = Graphics.MainWindow(self.handle_states)
                Preferences.load(self.main_window)
                self.get_flow_graph = self.main_window.get_flow_graph
+               self.get_page = self.main_window.get_page
                Messages.register_messenger(self.main_window.add_report_line)
                Messages.register_messenger(sys.stdout.write)
                Messages.send_init()
@@ -162,7 +163,7 @@
                        if not self.init_file_paths and 
Preferences.restore_files(): self.init_file_paths = Preferences.files_open()
                        if not self.init_file_paths: self.init_file_paths = ['']
                        for file_path in self.init_file_paths: 
self.main_window.new_page(file_path) #load pages from file paths
-                       if not self.main_window.get_page():     
self.main_window.new_page() #ensure that at least a blank page exists
+                       if not self.get_page(): self.main_window.new_page() 
#ensure that at least a blank page exists
                elif state == APPLICATION_QUIT:
                        if self.main_window.close_pages():
                                Preferences.save(self.main_window)
@@ -186,41 +187,41 @@
                #       Move/Rotate/Delete/Create
                
##############################################################################################
          
                elif state == SIGNAL_BLOCK_MOVE:                        
-                       
self.main_window.get_state_cache().save_new_state(self.get_flow_graph().to_nested_data())
-                       self.main_window.set_saved(False)
+                       
self.get_page().get_state_cache().save_new_state(self.get_flow_graph().to_nested_data())
+                       self.get_page().set_saved(False)
                elif state == SIGNAL_BLOCK_ROTATE_LEFT:
                        if self.get_flow_graph().rotate_selected(DIR_LEFT):     
                        
-                               
self.main_window.get_state_cache().save_new_state(self.get_flow_graph().to_nested_data())
       
-                               self.main_window.set_saved(False)               
+                               
self.get_page().get_state_cache().save_new_state(self.get_flow_graph().to_nested_data())
        
+                               self.get_page().set_saved(False)                
                elif state == SIGNAL_BLOCK_ROTATE_RIGHT:
                        if self.get_flow_graph().rotate_selected(DIR_RIGHT):    
                        
-                               
self.main_window.get_state_cache().save_new_state(self.get_flow_graph().to_nested_data())
       
-                               self.main_window.set_saved(False)               
+                               
self.get_page().get_state_cache().save_new_state(self.get_flow_graph().to_nested_data())
        
+                               self.get_page().set_saved(False)                
                elif state == ELEMENT_DELETE:
                        if self.get_flow_graph().delete_selected():             
                
-                               
self.main_window.get_state_cache().save_new_state(self.get_flow_graph().to_nested_data())
                               
+                               
self.get_page().get_state_cache().save_new_state(self.get_flow_graph().to_nested_data())
                                
                                self.handle_states(NOTHING_SELECT)
-                               self.main_window.set_saved(False)
+                               self.get_page().set_saved(False)
                elif state == CONNECTION_CREATE or state == 
SIGNAL_BLOCK_CREATE:                        
-                       
self.main_window.get_state_cache().save_new_state(self.get_flow_graph().to_nested_data())
+                       
self.get_page().get_state_cache().save_new_state(self.get_flow_graph().to_nested_data())
                        self.handle_states(NOTHING_SELECT)      
-                       self.main_window.set_saved(False)
+                       self.get_page().set_saved(False)
                elif state == SIGNAL_BLOCK_INC_TYPE:
                        if 
self.get_flow_graph().type_controller_modify_selected(1):
-                               
self.main_window.get_state_cache().save_new_state(self.get_flow_graph().to_nested_data())
       
-                               self.main_window.set_saved(False)
+                               
self.get_page().get_state_cache().save_new_state(self.get_flow_graph().to_nested_data())
        
+                               self.get_page().set_saved(False)
                elif state == SIGNAL_BLOCK_DEC_TYPE:
                        if 
self.get_flow_graph().type_controller_modify_selected(-1):
-                               
self.main_window.get_state_cache().save_new_state(self.get_flow_graph().to_nested_data())
       
-                               self.main_window.set_saved(False)       
+                               
self.get_page().get_state_cache().save_new_state(self.get_flow_graph().to_nested_data())
        
+                               self.get_page().set_saved(False)        
                elif state == SOCKET_CONTROLLER_INC:
                        if 
self.get_flow_graph().socket_controller_modify_selected(1):
-                               
self.main_window.get_state_cache().save_new_state(self.get_flow_graph().to_nested_data())
       
-                               self.main_window.set_saved(False)
+                               
self.get_page().get_state_cache().save_new_state(self.get_flow_graph().to_nested_data())
        
+                               self.get_page().set_saved(False)
                elif state == SOCKET_CONTROLLER_DEC:
                        if 
self.get_flow_graph().socket_controller_modify_selected(-1):
-                               
self.main_window.get_state_cache().save_new_state(self.get_flow_graph().to_nested_data())
       
-                               self.main_window.set_saved(False)               
+                               
self.get_page().get_state_cache().save_new_state(self.get_flow_graph().to_nested_data())
        
+                               self.get_page().set_saved(False)                
                
##############################################################################################
                #       Window stuff
                
##############################################################################################
@@ -238,66 +239,66 @@
                elif state == MATH_EXPR_WINDOW_DISPLAY:
                        Graphics.MathExprDialog()
                elif state == FLOW_GRAPH_WINDOW_RESIZE:
-                       dimensions = 
Graphics.FlowGraphWindowSizeDialog(self.main_window.get_size_request()).run()
-                       if dimensions != None:
-                               
self.main_window.set_size_request(dimensions[0], dimensions[1])
-                               
self.main_window.get_state_cache().save_new_state(self.get_flow_graph().to_nested_data())
                                       
-                               self.main_window.set_saved(False)
+                       dimensions = 
Graphics.FlowGraphWindowSizeDialog(self.get_flow_graph().get_size_request()).run()
+                       if dimensions:
+                               
self.get_flow_graph().set_size_request(*dimensions)
+                               
self.get_page().get_state_cache().save_new_state(self.get_flow_graph().to_nested_data())
                                        
+                               self.get_page().set_saved(False)
                
##############################################################################################
                #       Variable and Param Modifications
                
##############################################################################################
                elif state == SIGNAL_BLOCK_PARAM_MODIFY:
                        if self.get_flow_graph().param_modify_selected():
-                               
self.main_window.get_state_cache().save_new_state(self.get_flow_graph().to_nested_data())
       
-                               self.main_window.set_saved(False)               
+                               
self.get_page().get_state_cache().save_new_state(self.get_flow_graph().to_nested_data())
        
+                               self.get_page().set_saved(False)                
                elif state == VARIABLE_MODIFY:
-                       
self.main_window.get_state_cache().save_new_state(self.get_flow_graph().to_nested_data())
       
-                       self.main_window.set_saved(False)       
+                       
self.get_page().get_state_cache().save_new_state(self.get_flow_graph().to_nested_data())
        
+                       self.get_page().set_saved(False)        
                        self.get_flow_graph().update()
                elif state == VARIABLE_REORDER:
-                       
self.main_window.get_state_cache().save_new_state(self.get_flow_graph().to_nested_data())
       
-                       self.main_window.set_saved(False)       
+                       
self.get_page().get_state_cache().save_new_state(self.get_flow_graph().to_nested_data())
        
+                       self.get_page().set_saved(False)        
                
##############################################################################################
                #       Undo/Redo
                
##############################################################################################
                elif state == FLOW_GRAPH_UNDO:          
-                       nested_data = 
self.main_window.get_state_cache().get_prev_state()
+                       nested_data = 
self.get_page().get_state_cache().get_prev_state()
                        if nested_data  != None:                
                                self.handle_states(NOTHING_SELECT)
                                
self.get_flow_graph().from_nested_data(nested_data)
-                               self.main_window.set_saved(False)
+                               self.get_page().set_saved(False)
                elif state == FLOW_GRAPH_REDO:                                  
        
-                       nested_data = 
self.main_window.get_state_cache().get_next_state()
+                       nested_data = 
self.get_page().get_state_cache().get_next_state()
                        if nested_data  != None:                
                                self.handle_states(NOTHING_SELECT)
                                
self.get_flow_graph().from_nested_data(nested_data)
-                               self.main_window.set_saved(False)
+                               self.get_page().set_saved(False)
                
##############################################################################################
-               #       New/Open/Save
+               #       New/Open/Save/Close
                
##############################################################################################
                elif state == FLOW_GRAPH_NEW:
                        self.main_window.new_page()
                elif state == FLOW_GRAPH_OPEN:
-                       file_path = 
Graphics.OpenFlowGraphFileDialog(self.get_flow_graph() and 
self.main_window.get_file_path() or '').run()
+                       file_path = 
Graphics.OpenFlowGraphFileDialog(self.get_flow_graph() and 
self.get_page().get_file_path() or '').run()
                        if file_path != None: 
self.main_window.new_page(file_path)
                elif state == FLOW_GRAPH_CLOSE:
                        self.main_window.close_page()           
                elif state == FLOW_GRAPH_SAVE:
-                       if not self.main_window.get_file_path(): 
self.handle_states(FLOW_GRAPH_SAVE_AS)
+                       if not self.get_page().get_file_path(): 
self.handle_states(FLOW_GRAPH_SAVE_AS)
                        else:
                                try:
-                                       
ParseXML.to_file(ParseXML.to_xml(self.get_flow_graph().to_nested_data()), 
self.main_window.get_file_path())
-                                       self.main_window.set_saved(True)        
        
+                                       
ParseXML.to_file(ParseXML.to_xml(self.get_flow_graph().to_nested_data()), 
self.get_page().get_file_path())
+                                       self.get_page().set_saved(True)         
                                except IOError: 
-                                       
Messages.send_fail_save(self.main_window.get_file_path())
-                                       self.main_window.set_saved(False)
+                                       
Messages.send_fail_save(self.get_page().get_file_path())
+                                       self.get_page().set_saved(False)
                elif state == FLOW_GRAPH_SAVE_AS:
-                       file_path = 
Graphics.SaveFlowGraphFileDialog(self.main_window.get_file_path()).run()
+                       file_path = 
Graphics.SaveFlowGraphFileDialog(self.get_page().get_file_path()).run()
                        if file_path != None:                   
-                               self.main_window.set_file_path(file_path)
+                               self.get_page().set_file_path(file_path)
                                self.handle_states(FLOW_GRAPH_SAVE)     
                elif state == FLOW_GRAPH_SCREEN_CAPTURE:
-                       file_path = 
Graphics.SaveImageFileDialog(self.main_window.get_file_path()).run()
+                       file_path = 
Graphics.SaveImageFileDialog(self.get_page().get_file_path()).run()
                        if file_path != None: 
                                pixmap = self.get_flow_graph().pixmap
                                width, height = pixmap.get_size()
@@ -308,16 +309,16 @@
                #       Run/Stop
                
##############################################################################################
          
                elif state == FLOW_GRAPH_EXEC:
-                       if not self.main_window.get_pid_file():
-                               if not self.main_window.get_saved() or not 
self.main_window.get_file_path(): 
+                       if not self.get_page().get_pid_file():
+                               if not self.get_page().get_saved() or not 
self.get_page().get_file_path(): 
                                        self.handle_states(FLOW_GRAPH_SAVE) 
#only save if file path missing or not saved
-                               if self.main_window.get_saved() and 
self.main_window.get_file_path(): 
+                               if self.get_page().get_saved() and 
self.get_page().get_file_path(): 
                                        ExecFlowGraphThread(self)       #only 
exec if file path and saved
                elif state == FLOW_GRAPH_STOP:
                        MUTEX.lock()
-                       if self.main_window.get_pid_file(): 
-                               try: 
os.kill(int(open(self.main_window.get_pid_file(), 'r').read()), 9)
-                               except: print "could not kill pid file: 
%s"%self.main_window.get_pid_file()
+                       if self.get_page().get_pid_file(): 
+                               try: 
os.kill(int(open(self.get_page().get_pid_file(), 'r').read()), 9)
+                               except: print "could not kill pid file: 
%s"%self.get_page().get_pid_file()
                        MUTEX.unlock()
                elif state == '': #pass and run the global actions
                        pass
@@ -327,11 +328,11 @@
                
##############################################################################################
                #set the exec button if the flow graph is valid and is not 
already running
                MUTEX.lock()
-               
get_action_from_name(FLOW_GRAPH_EXEC).set_sensitive(self.get_flow_graph().is_valid()
 and not self.main_window.get_pid_file())
-               
get_action_from_name(FLOW_GRAPH_STOP).set_sensitive(self.main_window.get_pid_file()
 != '')      
+               
get_action_from_name(FLOW_GRAPH_EXEC).set_sensitive(self.get_flow_graph().is_valid()
 and not self.get_page().get_pid_file())
+               
get_action_from_name(FLOW_GRAPH_STOP).set_sensitive(self.get_page().get_pid_file()
 != '')       
                MUTEX.unlock()
                #saved status           
-               get_action_from_name(FLOW_GRAPH_SAVE).set_sensitive(not 
self.main_window.get_saved())
+               get_action_from_name(FLOW_GRAPH_SAVE).set_sensitive(not 
self.get_page().get_saved())
                self.main_window.set_title()
                Preferences.show_reports_window(self.main_window)               
                                
@@ -345,19 +346,18 @@
                Thread.__init__(self)
                self.handle_states = action_handler.handle_states
                self.flow_graph = action_handler.get_flow_graph()
-               self.main_window = action_handler.main_window
+               #store page and dont use main window calls in run
+               self.page = action_handler.get_page()
                #random id so multiple flow graphs can run w/o files 
intersecting
                rand_id = random.randint(10000, 99999) 
-               #store page and dont use main window calls in run
-               self.page = self.main_window.get_page()
                #set files              
-               self.file_path = self.main_window.get_file_path()
+               self.file_path = self.page.get_file_path()
                self.report_file = '/tmp/grc-%d-%d.report'%(os.getpid(), 
rand_id)
                self.pid_file = '/tmp/grc-%d-%d.pid'%(os.getpid(), rand_id)     
        
-               self.main_window.set_pid_file(self.pid_file)
+               self.page.set_pid_file(self.pid_file)
                get_action_from_name(FLOW_GRAPH_EXEC).set_sensitive(False)
                get_action_from_name(FLOW_GRAPH_STOP).set_sensitive(True)
-               Messages.send_start_exec(self.main_window.get_file_path())
+               Messages.send_start_exec(self.page.get_file_path())
                self.start()
                
        def run(self):  
@@ -379,7 +379,7 @@
                try: os.remove(self.pid_file)
                except: print "could not remove pid file: %s"%self.pid_file
                MUTEX.lock()
-               self.page.pid_file = ''
+               self.page.set_pid_file('')
                MUTEX.unlock()
                self.handle_states()
                

Modified: grc/trunk/src/ExecFlowGraph.py
===================================================================
--- grc/trunk/src/ExecFlowGraph.py      2007-09-06 19:53:33 UTC (rev 6346)
+++ grc/trunk/src/ExecFlowGraph.py      2007-09-07 07:44:08 UTC (rev 6347)
@@ -111,7 +111,7 @@
                """For each call back, parse all of the data and 
                call the registered callback function on that data."""
                #MUTEX.lock()
-               print "***\n\nCallback Time BEGIN\n\n***"
+               #print "***\n\nCallback Time BEGIN\n\n***"
                if self.started:                        
                        if self.callbacks:      #parse regular callbacks
                                for function, data_type_params in 
self.callbacks:
@@ -121,7 +121,7 @@
                                for function, data_type_params in 
self.callbacks_locked + self.callbacks_cond:
                                        self._parse_callback(function, 
*data_type_params)
                                self.unlock()
-               print "***\n\nCallback Time END\n\n***"
+               #print "***\n\nCallback Time END\n\n***"
                #MUTEX.unlock()
                
        def _parse_nested_data(self, nested_data):

Modified: grc/trunk/src/Graphics/MainWindow.py
===================================================================
--- grc/trunk/src/Graphics/MainWindow.py        2007-09-06 19:53:33 UTC (rev 
6346)
+++ grc/trunk/src/Graphics/MainWindow.py        2007-09-07 07:44:08 UTC (rev 
6347)
@@ -43,17 +43,23 @@
 class Page(gtk.HBox):
        """A page in the notebook."""
        
-       def __init__(self, main_window):
+       def __init__(self, main_window, file_path=''):
                """
                Page constructor.
                @param main_window main window
+               @param file_path path to a flow graph file
                """             
+               #import the file
                self.main_window = main_window
+               initial_state = ParseXML.from_xml(ParseXML.from_file(file_path 
or INITIAL_FLOW_GRAPH_FILE))
+               
self.main_window.get_flow_graph().from_nested_data(initial_state)
+               self.state_cache = StateCache(initial_state)
+               self.set_pid_file('')
+               self.set_file_path(file_path)           
+               self.set_saved(True)    
+               #import success, initialize page                
                gtk.HBox.__init__(self, False, 0)
-               self.show()
-               self.pid_file = ''
-               self.file_path = ''             
-               self.saved = True       
+               self.show()             
                #tab box to hold label and close button
                self.tab = gtk.HBox(False, 0)                   
                #setup tab label
@@ -99,6 +105,56 @@
                """
                return self.tab
                
+       def get_pid_file(self):
+               """!
+               Get the pid file for the flow graph.
+               @return the pid file or ''
+               """
+               return self.pid_file
+       
+       def set_pid_file(self, pid_file=''):
+               """!
+               Set the pid file, '' for no pid file.
+               @param pid_file file path string
+               """
+               self.pid_file = pid_file
+       
+       def get_file_path(self):
+               """!
+               Get the file path for the flow graph.
+               @return the file path or ''
+               """
+               return self.file_path
+       
+       def set_file_path(self, file_path=''):
+               """!
+               Set the file path, '' for no file path.
+               @param file_path file path string
+               """
+               if file_path: self.file_path = os.path.abspath(file_path)
+               else: self.file_path = ''
+       
+       def get_saved(self):
+               """!
+               Get the saved status for the flow graph.
+               @return true if saved
+               """
+               return self.saved
+       
+       def set_saved(self, saved=True):
+               """!
+               Set the saved status.
+               @param saved boolean status
+               """
+               self.saved = saved 
+       
+       def get_state_cache(self):
+               """!
+               Get the state cache for the flow graph.
+               @return the state cache
+               """
+               return self.state_cache
+               
 ############################################################
 ##     Main window
 ############################################################           
@@ -188,8 +244,8 @@
                        title = ''.join((
                                        MAIN_WINDOW_PREFIX,
                                        ' - Editing: ',
-                                       (self.get_file_path() or 
NEW_FLOGRAPH_TITLE),
-                                       (self.get_saved() and ' ' or '*'), 
#blank must be non empty
+                                       (self.get_page().get_file_path() or 
NEW_FLOGRAPH_TITLE),
+                                       (self.get_page().get_saved() and ' ' or 
'*'), #blank must be non empty
                                )
                        )
                else: title = MAIN_WINDOW_PREFIX + ' - Editor '
@@ -222,7 +278,7 @@
                Get the file names for all the pages, in order.
                @return list of file paths
                """
-               return [self.notebook.get_nth_page(page_num).file_path for 
page_num in range(self.notebook.get_n_pages())]
+               return [self.notebook.get_nth_page(page_num).get_file_path() 
for page_num in range(self.notebook.get_n_pages())]
                
        def new_page(self, file_path=''):
                """!
@@ -233,23 +289,14 @@
                if file_path and file_path in self._get_files(): #already open
                        page = 
self.notebook.get_nth_page(self._get_files().index(file_path))
                        self.set_page(page)
-                       return
-               page = Page(self)
-               page.file_path = file_path
-               if page.file_path:
-                       try: #try to load from file
-                               Messages.send_start_load(page.file_path)
-                               initial_state = 
ParseXML.from_xml(ParseXML.from_file(page.file_path))
-                               
self.get_flow_graph().from_nested_data(initial_state)
-                               page.state_cache = StateCache(initial_state)
-                               Messages.send_end_load()
-                       except Exception, e: 
-                               Messages.send_fail_load(e)
-                               return
-               else:   #load the default       file                    
-                       initial_state = 
ParseXML.from_xml(ParseXML.from_file(INITIAL_FLOW_GRAPH_FILE))
-                       self.get_flow_graph().from_nested_data(initial_state)
-                       page.state_cache = StateCache(initial_state)
+                       return          
+               try: #try to load from file
+                       if file_path: Messages.send_start_load(file_path)
+                       page = Page(self, file_path)
+                       if file_path: Messages.send_end_load()
+               except Exception, e: 
+                       Messages.send_fail_load(e)
+                       return  
                self.notebook.append_page(page, page.get_tab())
                self.set_page(page)
                
@@ -263,7 +310,7 @@
                @param page_num new page number
                """             
                self.current_page = self.notebook.get_nth_page(page_num)
-               state = self.get_state_cache().get_current_state()
+               state = self.get_page().get_state_cache().get_current_state()
                self.get_flow_graph().from_nested_data(state)
                self.handle_states(NOTHING_SELECT) 
                        
@@ -321,11 +368,7 @@
                """
                self.current_page = page
                
self.notebook.set_current_page(self.notebook.page_num(self.current_page))       
                                
-                       
-       ############################################################
-       ##      Access flow graph variables
-       ############################################################    
-       
+                               
        def get_flow_graph(self):
                """
                Get the flow graph in this main window.
@@ -333,53 +376,6 @@
                """
                return self.flow_graph
        
-       def get_pid_file(self):
-               """!
-               Get the pid file for the flow graph.
-               @return the pid file or ''
-               """
-               return self.get_page().pid_file
-       
-       def set_pid_file(self, pid_file=''):
-               """!
-               Set the pid file, '' for no pid file.
-               @param pid_file file path string
-               """
-               self.get_page().pid_file = pid_file
-       
-       def get_file_path(self):
-               """!
-               Get the file path for the flow graph.
-               @return the file path or ''
-               """
-               return self.get_page().file_path
-       
-       def set_file_path(self, file_path=''):
-               """!
-               Set the file path, '' for no file path.
-               @param file_path file path string
-               """
-               self.get_page().file_path = os.path.abspath(file_path)
-       
-       def get_saved(self):
-               """!
-               Get the saved status for the flow graph.
-               @return true if saved
-               """
-               return self.get_page().saved
-       
-       def set_saved(self, saved=True):
-               """!
-               Set the saved status.
-               @param saved boolean status
-               """
-               self.get_page().saved = saved 
-       
-       def get_state_cache(self):
-               """!
-               Get the state cache for the flow graph.
-               @return the state cache
-               """
-               return self.get_page().state_cache
+
                
                        
\ No newline at end of file

Modified: grc/trunk/src/SignalBlockDefs/Filters.py
===================================================================
--- grc/trunk/src/SignalBlockDefs/Filters.py    2007-09-06 19:53:33 UTC (rev 
6346)
+++ grc/trunk/src/SignalBlockDefs/Filters.py    2007-09-07 07:44:08 UTC (rev 
6347)
@@ -142,13 +142,23 @@
        fcn = blks2.channel_model
        sb.add_input_socket('in', Complex())
        sb.add_output_socket('out', Complex())
-       sb.add_param('Noise Voltage', Float(0.0))
-       sb.add_param('Freq Offset', Float(0.0))
+       sb.add_param('Noise Voltage', Float(0.0), variable=True)
+       sb.add_param('Freq Offset', Float(0.0), variable=True)
        sb.add_param('Epsilon', Float(1.0))
-       sb.add_param('Taps', ComplexVector('1.0,0.0'))
-       sb.set_docs('''Simulate channel distortion.''')
+       sb.add_param('Taps', ComplexVector('1.0,0.0'), variable=True)
+       sb.set_docs('''\
+Creates a channel model that includes:
+       - AWGN noise power in terms of noise voltage
+       - A frequency offest in the channel in ratio
+       - A timing offset ratio to model clock difference (epsilon)
+       - Multipath taps
+''')
        def make(fg, noise_voltage, frequency_offset, epsilon, taps):
-               return fcn(noise_voltage.parse(), frequency_offset.parse(), 
epsilon.parse(), taps.parse())
+               block = fcn(noise_voltage.parse(), frequency_offset.parse(), 
epsilon.parse(), taps.parse())
+               fg.add_callback(block.set_noise_voltage, noise_voltage)
+               fg.add_callback(block.set_frequency_offset, frequency_offset)
+               fg.add_callback(block.set_taps, taps)
+               return block
        return sb, make
 
 ###########################################################################

Modified: grc/trunk/src/SignalBlockDefs/Packet.py
===================================================================
--- grc/trunk/src/SignalBlockDefs/Packet.py     2007-09-06 19:53:33 UTC (rev 
6346)
+++ grc/trunk/src/SignalBlockDefs/Packet.py     2007-09-07 07:44:08 UTC (rev 
6347)
@@ -22,209 +22,14 @@
 
 import struct
 import os
-import gnuradio.gr.gr_threading as threading
 from DataTypes import *
-from gnuradio import gr,blks,packet_utils
-from SignalBlockConstants import all_choices,DEFAULT_QUEUE_LIMIT
+from gnuradio import gr
+from SignalBlockConstants import all_choices
 
-MAX_ACCESS_CODE_LENGTH = 64
-MAX_PACKET_LENGTH = len(packet_utils.random_mask_tuple)#4096
-DEFAULT_PACKET_LENGTH = 512
-
 
#######################################################################################
-##     Packet Modulator and Demodulator Hier Block
+##     TUN/TAP 
 
#######################################################################################
 
-class PacketModThread(threading.Thread):
-       """
-       Thread to forward data between the message queue and the packet 
modulator.
-       Read messages from the message queue, slice them up to the packet 
length, 
-       and pass them to the send packet function.
-       """
-       def __init__(self, msgq, send_packet, packet_length):
-               """!
-               PacketModThread contructor.
-               @param msgq the message queue with incoming data
-               @param send_packet a function of one argument to send a packet
-               """
-               self.msgq = msgq
-               self.send_packet = send_packet
-               self.packet_length = packet_length
-               threading.Thread.__init__(self)
-               self.setDaemon(1)
-               self.keep_running = True
-               self.start()
-               print 'Created packet modulator thread.'
-               
-       def run(self):
-               """In an endless while loop: read the msgq and call send 
packet."""
-               r = '' #residual message
-               while self.keep_running:
-                       msg = self.msgq.delete_head()  # blocking read of 
message queue
-                       sr = r + msg.to_string()
-                       num_packets = len(sr)/int(self.packet_length) #integer 
arithmetic
-                       r_index = self.packet_length*num_packets
-                       s = sr[0:r_index]       #portion of message divisible 
by packet size                            
-                       r = sr[r_index:]        #residual portion of message 
smaller then packet size   
-                       #print len(s), len(r), msg.type(), msg.arg1(), 
msg.arg2()               
-                       for i in range(num_packets): 
self.send_packet(s[i*self.packet_length:(i+1)*self.packet_length])
-               
-class PacketModHelper(gr.hier_block2):
-       """Forward data from the gr data stream to the mod packet."""
-       def __init__(self, item_size, packet_length, samples_per_symbol, 
bits_per_symbol, access_code, pad_for_usrp):
-               """!
-               PacketModHelper constructor.
-               @param item_size the size in bytes of the input data stream
-               @param packet_length the length in bytes of the packets
-               @param *args the arguments for blks.mod_pkts
-               """
-               #create hier block
-               gr.hier_block2.__init__(
-                       self, 'packet_mod', 
-                       gr.io_signature(1, 1, item_size), 
-                       gr.io_signature(1, 1, Byte().get_num_bytes())
-               )
-               #dummy modulator with access functions          
-               modulator = gr.skiphead(Byte().get_num_bytes(), 0)      
-               modulator.samples_per_symbol = lambda: samples_per_symbol
-               modulator.bits_per_symbol = lambda: bits_per_symbol
-               #create the packet modulator (handles the output data stream)
-               self.packet_mod = blks.mod_pkts(        
-                       fg=self,
-                       modulator=modulator, 
-                       access_code=access_code, 
-                       msgq_limit=DEFAULT_QUEUE_LIMIT, 
-                       pad_for_usrp=pad_for_usrp, 
-               )
-               #the message sink (handles the input data stream)
-               self.msgq = gr.msg_queue(DEFAULT_QUEUE_LIMIT)
-               msg_sink = gr.message_sink(item_size, self.msgq, False)         
-               #connections
-               self.connect(self.packet_mod.tail, self)
-               self.connect(self, msg_sink)            
-               #create/start the thread
-               PacketModThread(self.msgq, self.packet_mod.send_pkt, 
packet_length)
-
-class PacketDemodHelper(gr.hier_block2):
-       """Forward data from demod packet to the gr data stream."""
-       def __init__(self, item_size, access_code, threshold):
-               """!
-               PacketDemodHelper constructor.
-               @param item_size the size in bytes of the output data stream
-               @param *args the arguments for blks.demod_pkts
-               @param msgq_limit the queue limit for the message source
-               """
-               #create hier block
-               gr.hier_block2.__init__(
-                       self, 'packet_demod', 
-                       gr.io_signature(1, 1, Byte().get_num_bytes()), 
-                       gr.io_signature(1, 1, item_size)
-               )
-               #the message source (handles the output data stream)
-               msg_source = gr.message_source(item_size, DEFAULT_QUEUE_LIMIT)
-               msgq = msg_source.msgq()
-               def callback(ok, payload):
-                       if ok: msgq.insert_tail(gr.message_from_string(payload, 
0, item_size, len(payload)/item_size))
-               #dummy demodulator
-               demodulator = gr.skiphead(Byte().get_num_bytes(), 0)    
-               #create the packet demodulator (handles the input data stream)
-               packet_demod = blks.demod_pkts( 
-                       fg=self,
-                       demodulator=demodulator, 
-                       access_code=access_code, 
-                       callback=callback,
-                       threshold=threshold,
-               )
-               #connections
-               self.connect(msg_source, self)
-               self.connect(self, packet_demod.head)
-
-#######################################################################################
-##     Packet Modulator and Demodulator Defs
-#######################################################################################
-
-def PacketMod(sb):
-       blks.mod_pkts, gr.throttle, gr.message_sink     #uses
-       type = Enum(all_choices, 1)
-       sb.add_input_socket('in', Variable(type))               #packet input
-       sb.add_output_socket('out', Byte())
-       sb.add_param('Type', type, False, type=True)
-       sb.add_param('Modulator Type', Enum([
-               ('GMSK', blks.gmsk_mod),
-               ('DBPSK', blks.dbpsk_mod),
-               ('DQPSK', blks.dqpsk_mod),
-               ('D8PSK', blks.d8psk_mod),
-               ('QAM 8', blks.qam8_mod),
-               ('QAM 64', blks.qam64_mod),
-               ('QAM 256', blks.qam256_mod),
-       ]))
-       sb.add_param('Samples/Symbol', Int(2, min=2))
-       sb.add_param('Packet Length', Int(DEFAULT_PACKET_LENGTH, min=1, 
max=MAX_PACKET_LENGTH))
-       sb.add_param('Access Code', String('', max=MAX_ACCESS_CODE_LENGTH))
-       sb.add_param('Pad for USRP', Bool(true='Yes', false='No', default=True))
-       sb.set_docs('''\
-The packet modulator wraps a data stream into packets.
----
-Modulator type: tells the packet modulator how many bits per symbol to use. \
-A modulator block should still be connected to the output of this block.
-
-Packet length: length of a packet in bytes, must be a multiple of the size of 
the input data stream, and no greater than %d.
-
-Access code/sync vector: string of 1's and 0's between 1 and %d long. Leave 
blank for default.
-
-Pad for USRP: If true, packets are padded such that they end up a multiple of 
128 samples.
-
-Use whitener offset: If true, start of whitener XOR string is incremented each 
packet.
-'''%(MAX_PACKET_LENGTH, MAX_ACCESS_CODE_LENGTH))
-       def make(fg, type, mod_type, samples_per_symbol, packet_length, 
access_code, pad_for_usrp):
-               access_code = access_code.parse()
-               if access_code == '': access_code = None        #access code 
should be None if blank
-               item_size = type.parse().get_num_bytes()                        
-               packet_length = packet_length.parse()
-               if packet_length%item_size != 0:        #verify that packet 
length is a multiple of the stream size
-                       raise ValueError('The packet length: "%d" is not a 
mutiple of the stream size: "%d".'%(packet_length, item_size))
-               block = PacketModHelper(
-                       item_size=item_size, 
-                       packet_length=packet_length,
-                       samples_per_symbol=samples_per_symbol.parse(), 
-                       bits_per_symbol=mod_type.parse().bits_per_symbol(),
-                       access_code=access_code, 
-                       pad_for_usrp=pad_for_usrp.parse(), 
-               )       #build packet modulator
-               return block
-       return sb, make
-       
-def PacketDemod(sb):
-       blks.demod_pkts, gr.throttle, gr.message_source #uses
-       type = Enum(all_choices, 1)
-       sb.add_output_socket('out', Variable(type))             #packet output
-       sb.add_input_socket('in', Byte())       
-       sb.add_param('Type', type, False, type=True)
-       sb.add_param('Access Code', String('', max=MAX_ACCESS_CODE_LENGTH))
-       sb.add_param('Threshold', Int(-1))      
-       sb.set_docs('''\
-The packet demodulator unwraps packets from a data stream.
----
-Access code/sync vector: string of 1's and 0's between 1 and %d long. Leave 
blank for default.
-
-Threshold: detect access_code with up to threshold bits wrong.
-
-Queue limit: maximum number of messages in message queue.
-'''%MAX_ACCESS_CODE_LENGTH)
-       def make(fg, type, access_code, threshold):
-               access_code = access_code.parse()
-               if access_code == '': access_code = None        #access code 
should be None if blank
-               return PacketDemodHelper(
-                       item_size=type.parse().get_num_bytes(),
-                       access_code=access_code, 
-                       threshold=threshold.parse(),
-               )       #build packet demodulator               
-       return sb, make
-
-#######################################################################################
-##     TUN/TAP Access Threads
-#######################################################################################
-
 IFF_TUN                = 0x0001   # tunnel IP packets
 IFF_TAP                = 0x0002   # tunnel ethernet frames
 IFF_NO_PI      = 0x1000   # don't pass extra packet info
@@ -250,13 +55,12 @@
        return tun_fd, ifname
 
 class TunTapHelper(gr.hier_block2):
-       """Make the tun tap hier2 block and start threads."""
-       def __init__(self, item_size, tun_fd, ifname):
+       """Make the tun tap hier2 block."""
+       def __init__(self, item_size, tun_fd):
                """!
                TunTapHelper constructor.
                @param item_size the size in bytes of the IO data stream
                @param tun_fd the file descriptor for the virtual device
-               @param ifname the name of virtual interface
                """
                #create hier block
                gr.hier_block2.__init__(
@@ -264,80 +68,15 @@
                        gr.io_signature(1, 1, item_size), 
                        gr.io_signature(1, 1, item_size)
                )
-               msg_source = gr.message_source(item_size, DEFAULT_QUEUE_LIMIT)
-               msgq_source = msg_source.msgq()
-               msgq_sink = gr.msg_queue(DEFAULT_QUEUE_LIMIT)
-               msg_sink = gr.message_sink(item_size, msgq_sink, False)
-               #start threads  
-               TunSinkThread(msgq_sink, tun_fd, ifname)
-               TunSourceThread(msgq_source, item_size, tun_fd, ifname)
+               #I/O blocks
+               sink = gr.file_descriptor_sink(item_size, tun_fd)
+               source = gr.file_descriptor_source(item_size, tun_fd)
                #connect 
-               self.connect(self, msg_sink)
-               self.connect(msg_source, self)          
+               self.connect(self, sink)
+               self.connect(source, self)              
     
-class TunSinkThread(threading.Thread):
-       """
-       Thread to forward data from the message queue and to the virtual device.
-       """
-       def __init__(self, msgq, tun_fd, ifname):
-               """!
-               TunSinkThread contructor.
-               @param msgq the message queue with incoming data
-               @param tun_fd the file descriptor for the virtual device
-               @param ifname the name of virtual interface
-               """
-               self.msgq = msgq
-               self.tun_fd = tun_fd            
-               threading.Thread.__init__(self)
-               self.setDaemon(1)
-               self.keep_running = True
-               self.start()
-               print 'Created tun sink thread for device "%s".'%ifname
-               
-       def run(self):
-               """In an endless while loop: read the msgq and write to tun.""" 
        
-               while self.keep_running:
-                       msg = self.msgq.delete_head()  # blocking read of 
message queue
-                       os.write(self.tun_fd, msg.to_string())
-                       
-class TunSourceThread(threading.Thread):
-       """
-       Thread to forward data from the virtual device to the message queue.
-       """
-       def __init__(self, msgq, item_size, tun_fd, ifname):
-               """!
-               TunSourceThread contructor.
-               @param msgq the message queue for outgoing data
-               @param item_size the size of the stream in bytes
-               @param tun_fd the file descriptor for the virtual device
-               @param ifname the name of virtual interface
-               """
-               self.msgq = msgq
-               self.item_size = item_size
-               self.tun_fd = tun_fd            
-               threading.Thread.__init__(self)
-               self.setDaemon(1)
-               self.keep_running = True
-               self.start()
-               print 'Created tun source thread for device "%s".'%ifname
-               
-       def run(self):
-               """In an endless while loop: read the msgq and write to tun.""" 
        
-               r = ''
-               while self.keep_running:
-                       sr = r + os.read(self.tun_fd, 128)
-                       num_items = len(sr)/self.item_size
-                       r_index = self.item_size*num_items
-                       s = sr[0:r_index]       #portion of string divisible by 
item size                               
-                       r = sr[r_index:]        #residual portion of string 
smaller then item size      
-                       if s: self.msgq.insert_tail(gr.message_from_string(s, 
self.item_size))
-                                               
-#######################################################################################
-##     TUN/TAP Block Defs
-#######################################################################################
                        
-
 def TunTap(sb):
-       gr.message_sink #uses
+       gr.file_descriptor_sink, gr.file_descriptor_source      #uses
        type = Enum(all_choices, 1)
        sb.add_input_socket('in', Variable(type))
        sb.add_output_socket('out', Variable(type))             
@@ -357,12 +96,11 @@
 ''')
        def make(fg, type, tun, virt, ip_addr):
                item_size = type.parse().get_num_bytes()
-               msgq = gr.msg_queue(DEFAULT_QUEUE_LIMIT)
                tun_fd, ifname = open_tun_interface(tun.parse(), virt.parse())
                #try to set the ip address
                ip_addr = ip_addr.parse()
                if ip_addr: os.system('ifconfig %s %s'%(ifname, ip_addr))
-               return TunTapHelper(item_size, tun_fd, ifname)
+               return TunTapHelper(item_size, tun_fd)
        return sb, make
        
        
\ No newline at end of file

Modified: grc/trunk/src/SignalBlockDefs/SignalBlockTree.py
===================================================================
--- grc/trunk/src/SignalBlockDefs/SignalBlockTree.py    2007-09-06 19:53:33 UTC 
(rev 6346)
+++ grc/trunk/src/SignalBlockDefs/SignalBlockTree.py    2007-09-07 07:44:08 UTC 
(rev 6347)
@@ -158,8 +158,6 @@
                                ('GMSK Demodulator', Modulators.GMSKDemod),
                                ('QAM Modulator', Modulators.QAMMod),
                                ('QAM Demodulator', Modulators.QAMDemod),
-                               ('Packet Modulator', Packet.PacketMod),
-                               ('Packet Demodulator', Packet.PacketDemod),
                        ]),
                        ('Coders', [
                                ('Constellation Decoder', 
Coders.ConstellationDecoder),                         





reply via email to

[Prev in Thread] Current Thread [Next in Thread]