commit-gnuradio
[Top][All Lists]
Advanced

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

[Commit-gnuradio] r5187 - in gnuradio/branches/developers/jcorgan/disc/g


From: jcorgan
Subject: [Commit-gnuradio] r5187 - in gnuradio/branches/developers/jcorgan/disc/gnuradio-core/src: lib/runtime python/gnuradio/gr
Date: Sat, 28 Apr 2007 14:39:47 -0600 (MDT)

Author: jcorgan
Date: 2007-04-28 14:39:47 -0600 (Sat, 28 Apr 2007)
New Revision: 5187

Modified:
   
gnuradio/branches/developers/jcorgan/disc/gnuradio-core/src/lib/runtime/gr_hier_block2_detail.cc
   
gnuradio/branches/developers/jcorgan/disc/gnuradio-core/src/lib/runtime/gr_hier_block2_detail.h
   
gnuradio/branches/developers/jcorgan/disc/gnuradio-core/src/python/gnuradio/gr/qa_hier_block2.py
Log:
Work in progress, block-level input, output disconnect.

Modified: 
gnuradio/branches/developers/jcorgan/disc/gnuradio-core/src/lib/runtime/gr_hier_block2_detail.cc
===================================================================
--- 
gnuradio/branches/developers/jcorgan/disc/gnuradio-core/src/lib/runtime/gr_hier_block2_detail.cc
    2007-04-28 18:28:03 UTC (rev 5186)
+++ 
gnuradio/branches/developers/jcorgan/disc/gnuradio-core/src/lib/runtime/gr_hier_block2_detail.cc
    2007-04-28 20:39:47 UTC (rev 5187)
@@ -55,20 +55,20 @@
   if (src.get() == dst.get())
     throw std::invalid_argument("src and destination blocks cannot be the 
same");
 
-  // Assignments to block inputs or outputs
+  // Connectments to block inputs or outputs
   int max_port;
   if (src.get() == d_owner) {
     max_port = src->input_signature()->max_streams();
     if ((max_port != -1 && (src_port >= max_port)) || src_port < 0)
       throw std::invalid_argument("source port out of range");
-    return assign_input(src_port, dst_port, dst);
+    return connect_input(src_port, dst_port, dst);
   }
 
   if (dst.get() == d_owner) {
     max_port = dst->output_signature()->max_streams();
     if ((max_port != -1 && (dst_port >= max_port)) || dst_port < 0)
       throw std::invalid_argument("source port out of range");
-    return assign_output(dst_port, src_port, src);
+    return connect_output(dst_port, src_port, src);
   }
 
   // Internal connections
@@ -81,13 +81,25 @@
 gr_hier_block2_detail::disconnect(gr_basic_block_sptr src, int src_port, 
                                   gr_basic_block_sptr dst, int dst_port)
 {
-  // Handle disconnecting inputs and outputs
+  if (GR_HIER_BLOCK2_DETAIL_DEBUG)
+    std::cout << "disconnecting: " << gr_endpoint(src, src_port)
+              << " -> " << gr_endpoint(dst, dst_port) << std::endl;
 
+  if (src.get() == dst.get())
+    throw std::invalid_argument("src and destination blocks cannot be the 
same");
+
+  if (src.get() == d_owner)
+    return disconnect_input(src_port, dst_port, dst);
+
+  if (dst.get() == d_owner)
+    return disconnect_output(dst_port, src_port, src);
+
+  // Internal connections
   d_fg->disconnect(src, src_port, dst, dst_port);
 }
 
 void
-gr_hier_block2_detail::assign_input(int my_port, int port, gr_basic_block_sptr 
block)
+gr_hier_block2_detail::connect_input(int my_port, int port, 
gr_basic_block_sptr block)
 {
   if (my_port < 0 || my_port >= (signed)d_inputs.size())
     throw std::invalid_argument("input port number out of range");
@@ -99,7 +111,7 @@
 }
 
 void
-gr_hier_block2_detail::assign_output(int my_port, int port, 
gr_basic_block_sptr block)
+gr_hier_block2_detail::connect_output(int my_port, int port, 
gr_basic_block_sptr block)
 {
   if (my_port < 0 || my_port >= (signed)d_outputs.size())
     throw std::invalid_argument("output port number out of range");
@@ -110,6 +122,30 @@
   d_outputs[my_port] = gr_endpoint(block, port);
 }
 
+void
+gr_hier_block2_detail::disconnect_input(int my_port, int port, 
gr_basic_block_sptr block)
+{
+  if (my_port < 0 || my_port >= (signed)d_inputs.size())
+    throw std::invalid_argument("input port number out of range");
+
+  if (d_inputs[my_port].block() != block)
+    throw std::invalid_argument("block not assigned to given input, can't 
disconnect");
+
+  d_inputs[my_port] = gr_endpoint();
+}
+
+void
+gr_hier_block2_detail::disconnect_output(int my_port, int port, 
gr_basic_block_sptr block)
+{
+  if (my_port < 0 || my_port >= (signed)d_outputs.size())
+    throw std::invalid_argument("input port number out of range");
+
+  if (d_outputs[my_port].block() != block)
+    throw std::invalid_argument("block not assigned to given output, can't 
disconnect");
+
+  d_outputs[my_port] = gr_endpoint();
+}
+
 gr_endpoint
 gr_hier_block2_detail::resolve_port(int port, bool is_input)
 {

Modified: 
gnuradio/branches/developers/jcorgan/disc/gnuradio-core/src/lib/runtime/gr_hier_block2_detail.h
===================================================================
--- 
gnuradio/branches/developers/jcorgan/disc/gnuradio-core/src/lib/runtime/gr_hier_block2_detail.h
     2007-04-28 18:28:03 UTC (rev 5186)
+++ 
gnuradio/branches/developers/jcorgan/disc/gnuradio-core/src/lib/runtime/gr_hier_block2_detail.h
     2007-04-28 20:39:47 UTC (rev 5187)
@@ -45,8 +45,10 @@
                  gr_basic_block_sptr dst, int dst_port);
     void disconnect(gr_basic_block_sptr, int src_port, 
                     gr_basic_block_sptr, int dst_port);
-    void assign_input(int my_port, int port, gr_basic_block_sptr block);
-    void assign_output(int my_port, int port, gr_basic_block_sptr block);
+    void connect_input(int my_port, int port, gr_basic_block_sptr block);
+    void connect_output(int my_port, int port, gr_basic_block_sptr block);
+    void disconnect_input(int my_port, int port, gr_basic_block_sptr block);
+    void disconnect_output(int my_port, int port, gr_basic_block_sptr block);
     void flatten(gr_simple_flowgraph_sptr sfg);
     gr_endpoint resolve_port(int port, bool is_input);
     gr_endpoint resolve_endpoint(const gr_endpoint &endp, bool is_input);

Modified: 
gnuradio/branches/developers/jcorgan/disc/gnuradio-core/src/python/gnuradio/gr/qa_hier_block2.py
===================================================================
--- 
gnuradio/branches/developers/jcorgan/disc/gnuradio-core/src/python/gnuradio/gr/qa_hier_block2.py
    2007-04-28 18:28:03 UTC (rev 5186)
+++ 
gnuradio/branches/developers/jcorgan/disc/gnuradio-core/src/python/gnuradio/gr/qa_hier_block2.py
    2007-04-28 20:39:47 UTC (rev 5187)
@@ -158,17 +158,77 @@
         self.assertEquals(expected, actual1)
         self.assertEquals(expected, actual2)
 
-    def test_015_connect_disconnect(self):
-        expected = (1.0, 2.0, 3.0, 4.0)
-        hblock = gr.top_block("test_block")
-        src = gr.vector_source_f(expected, False)
-        sink1 = gr.vector_sink_f()
-        sink2 = gr.vector_sink_f()
-        hblock.connect(src, sink1)
-        hblock.connect(src, sink2)
-        hblock.disconnect(src, sink2)
-        runtime = gr.runtime(hblock)
-        runtime.run()
-    
+    def test_015_disconnect_input(self):
+       hblock = gr.hier_block2("test_block", 
+                               gr.io_signature(1,1,gr.sizeof_int), 
+                               gr.io_signature(1,1,gr.sizeof_int))
+       nop1 = gr.nop(gr.sizeof_int)
+       hblock.connect(hblock, nop1)
+        hblock.disconnect(hblock, nop1)
+   
+    def test_016_disconnect_input_not_connected(self):
+       hblock = gr.hier_block2("test_block", 
+                               gr.io_signature(1,1,gr.sizeof_int), 
+                               gr.io_signature(1,1,gr.sizeof_int))
+       nop1 = gr.nop(gr.sizeof_int)
+        nop2 = gr.nop(gr.sizeof_int)
+       hblock.connect(hblock, nop1)
+        self.assertRaises(ValueError,
+            lambda: hblock.disconnect(hblock, nop2))
+   
+    def test_017_disconnect_input_neg(self):
+       hblock = gr.hier_block2("test_block", 
+                               gr.io_signature(1,1,gr.sizeof_int), 
+                               gr.io_signature(1,1,gr.sizeof_int))
+       nop1 = gr.nop(gr.sizeof_int)
+       hblock.connect(hblock, nop1)
+        self.assertRaises(ValueError,
+            lambda: hblock.disconnect((hblock, -1), nop1))
+
+    def test_018_disconnect_input_exceeds(self):
+       hblock = gr.hier_block2("test_block", 
+                               gr.io_signature(1,1,gr.sizeof_int), 
+                               gr.io_signature(1,1,gr.sizeof_int))
+       nop1 = gr.nop(gr.sizeof_int)
+       hblock.connect(hblock, nop1)
+        self.assertRaises(ValueError,
+            lambda: hblock.disconnect((hblock, 1), nop1))
+
+    def test_019_disconnect_output(self):
+       hblock = gr.hier_block2("test_block", 
+                               gr.io_signature(1,1,gr.sizeof_int), 
+                               gr.io_signature(1,1,gr.sizeof_int))
+       nop1 = gr.nop(gr.sizeof_int)
+       hblock.connect(nop1, hblock)
+        hblock.disconnect(nop1, hblock)
+   
+    def test_020_disconnect_output_not_connected(self):
+       hblock = gr.hier_block2("test_block", 
+                               gr.io_signature(1,1,gr.sizeof_int), 
+                               gr.io_signature(1,1,gr.sizeof_int))
+       nop1 = gr.nop(gr.sizeof_int)
+        nop2 = gr.nop(gr.sizeof_int)
+       hblock.connect(nop1, hblock)
+        self.assertRaises(ValueError,
+            lambda: hblock.disconnect(nop2, hblock))
+   
+    def test_021_disconnect_output_neg(self):
+       hblock = gr.hier_block2("test_block", 
+                               gr.io_signature(1,1,gr.sizeof_int), 
+                               gr.io_signature(1,1,gr.sizeof_int))
+       nop1 = gr.nop(gr.sizeof_int)
+       hblock.connect(hblock, nop1)
+        self.assertRaises(ValueError,
+            lambda: hblock.disconnect(nop1, (hblock, -1)))
+
+    def test_022_disconnect_output_exceeds(self):
+       hblock = gr.hier_block2("test_block", 
+                               gr.io_signature(1,1,gr.sizeof_int), 
+                               gr.io_signature(1,1,gr.sizeof_int))
+       nop1 = gr.nop(gr.sizeof_int)
+       hblock.connect(nop1, hblock)
+        self.assertRaises(ValueError,
+            lambda: hblock.disconnect(nop1, (hblock, 1)))
+
 if __name__ == "__main__":
     gr_unittest.main()





reply via email to

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