summaryrefslogtreecommitdiff
path: root/gnuradio-core/src/lib
diff options
context:
space:
mode:
Diffstat (limited to 'gnuradio-core/src/lib')
-rw-r--r--gnuradio-core/src/lib/runtime/gr_hier_block2.i5
-rw-r--r--gnuradio-core/src/lib/swig/gnuradio/coerce.scm56
2 files changed, 31 insertions, 30 deletions
diff --git a/gnuradio-core/src/lib/runtime/gr_hier_block2.i b/gnuradio-core/src/lib/runtime/gr_hier_block2.i
index 1b974fd6b..32b656e24 100644
--- a/gnuradio-core/src/lib/runtime/gr_hier_block2.i
+++ b/gnuradio-core/src/lib/runtime/gr_hier_block2.i
@@ -34,6 +34,11 @@ gr_hier_block2_sptr gr_make_hier_block2(const std::string name,
gr_io_signature_sptr output_signature)
throw (std::runtime_error);
+// Rename connect and disconnect so that we can more easily build a
+// better interface in scripting land.
+%rename(primitive_connect) gr_hier_block2::connect;
+%rename(primitive_disconnect) gr_hier_block2::disconnect;
+
class gr_hier_block2 : public gr_basic_block
{
private:
diff --git a/gnuradio-core/src/lib/swig/gnuradio/coerce.scm b/gnuradio-core/src/lib/swig/gnuradio/coerce.scm
index 2c508c6a4..81bc187a6 100644
--- a/gnuradio-core/src/lib/swig/gnuradio/coerce.scm
+++ b/gnuradio-core/src/lib/swig/gnuradio/coerce.scm
@@ -49,40 +49,36 @@
((false-if-exception (gr:to-hier-block2 block)) => (lambda (x) x))
(else (error "Cannot coerce to a gr_hier_block2: " block))))
-;;; The gr:connect variants
-;;; These work for anything derived from gr_hier_block2
-(define-method (gr:connect hb block)
- (let ((hb (coerce-to-hier-block2 hb))
- (bb (coerce-to-basic-block block)))
- (gr:connect hb bb)))
-(define-method (gr:connect hb (src <gr-endpoint>) (dst <gr-endpoint>))
- (let ((hb (coerce-to-hier-block2 hb)))
- (gr:connect hb (block src) (port src) (block dst) (port dst))))
+;;; Connect one or more block endpoints. An endpoint is either a <gr-endpoint>,
+;;; a 2-list (block port), or a block instance. In the latter case, the port number
+;;; is assumed to be zero.
+;;;
+;;; If multiple arguments are provided, connect will attempt to wire them in series,
+;;; interpreting the endpoints as inputs or outputs as appropriate.
+(define-method (gr:connect hb . points)
+ (dis/connect "connect" gr:primitive-connect hb points))
+
+;;; Disconnect one or more block endpoints...
+(define-method (gr:disconnect hb . points)
+ (dis/connect "disconnect" gr:primitive-disconnect hb points))
-(define-method (gr:connect hb src dst)
+(define (dis/connect name gf hb points)
(let ((hb (coerce-to-hier-block2 hb))
- (src (coerce-to-endpoint src))
- (dst (coerce-to-endpoint dst)))
- (gr:connect hb src dst)))
+ (points (list->vector (map coerce-to-endpoint points))))
-;;; The gr:disconnect variants
-;;; These work for anything derived from gr_hier_block2
-(define-method (gr:disconnect-all hb)
- (let ((hb (coerce-to-hier-block2 hb)))
- (gr:disconnect-all hb)))
+ (define (op2 p0 p1)
+ (gf hb (block p0) (port p0) (block p1) (port p1)))
-(define-method (gr:disconnect hb block)
- (let ((hb (coerce-to-hier-block2 hb))
- (bb (coerce-to-basic-block block)))
- (gr:disconnect hb bb)))
+ (let ((len (vector-length points)))
+ (case len
+ ((0) (error (string-append name " requires at least 1 endpoint; None provided.")))
+ ((1) (gf hb (vector-ref points 0)))
+ (else
+ (let loop ((n 1))
+ (cond ((< n len)
+ (op2 (vector-ref points (1- n)) (vector-ref points n))
+ (loop (1+ n))))))))))
-(define-method (gr:disconnect hb (src <gr-endpoint>) (dst <gr-endpoint>))
- (let ((hb (coerce-to-hier-block2 hb)))
- (gr:disconnect hb (block src) (port src) (block dst) (port dst))))
-(define-method (gr:disconnect hb src dst)
- (let ((hb (coerce-to-hier-block2 hb))
- (src (coerce-to-endpoint src))
- (dst (coerce-to-endpoint dst)))
- (gr:disconnect hb src dst)))
+(export-safely gr:connect gr:disconnect)