summaryrefslogtreecommitdiff
path: root/gnuradio-core/src/lib/swig/gnuradio/coerce.scm
diff options
context:
space:
mode:
Diffstat (limited to 'gnuradio-core/src/lib/swig/gnuradio/coerce.scm')
-rw-r--r--gnuradio-core/src/lib/swig/gnuradio/coerce.scm56
1 files changed, 26 insertions, 30 deletions
diff --git a/gnuradio-core/src/lib/swig/gnuradio/coerce.scm b/gnuradio-core/src/lib/swig/gnuradio/coerce.scm
index 2c508c6a49..81bc187a6c 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)