[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Commit-gnuradio] r4389 - gnuradio/branches/developers/eb/mb/mblock/src/
From: |
eb |
Subject: |
[Commit-gnuradio] r4389 - gnuradio/branches/developers/eb/mb/mblock/src/lib |
Date: |
Mon, 5 Feb 2007 16:39:39 -0700 (MST) |
Author: eb
Date: 2007-02-05 16:39:39 -0700 (Mon, 05 Feb 2007)
New Revision: 4389
Added:
gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_endpoint.cc
Modified:
gnuradio/branches/developers/eb/mb/mblock/src/lib/Makefile.am
gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_endpoint.h
gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_mblock_impl.cc
gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_mblock_impl.h
gnuradio/branches/developers/eb/mb/mblock/src/lib/qa_mblock_send.cc
gnuradio/branches/developers/eb/mb/mblock/src/lib/qa_mblock_send.h
Log:
work-in-progress on mblocks: port compatibility checks now working for RELAY
ports.
Modified: gnuradio/branches/developers/eb/mb/mblock/src/lib/Makefile.am
===================================================================
--- gnuradio/branches/developers/eb/mb/mblock/src/lib/Makefile.am
2007-02-05 22:15:17 UTC (rev 4388)
+++ gnuradio/branches/developers/eb/mb/mblock/src/lib/Makefile.am
2007-02-05 23:39:39 UTC (rev 4389)
@@ -33,6 +33,7 @@
# These are the source files that go into the mblock shared library
libmblock_la_SOURCES = \
mb_connection.cc \
+ mb_endpoint.cc \
mb_exception.cc \
mb_mblock.cc \
mb_mblock_impl.cc \
Added: gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_endpoint.cc
===================================================================
--- gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_endpoint.cc
(rev 0)
+++ gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_endpoint.cc
2007-02-05 23:39:39 UTC (rev 4389)
@@ -0,0 +1,49 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2007 Free Software Foundation, Inc.
+ *
+ * This file is part of GNU Radio
+ *
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <mb_endpoint.h>
+
+bool
+mb_endpoint::inside_of_relay_port_p() const
+{
+ return d_port->port_type() == mb_port::RELAY && d_component_name == "self";
+}
+
+pmt_t
+mb_endpoint::incoming_message_set() const
+{
+ if (inside_of_relay_port_p()) // swap incoming and
outgoing
+ return port()->outgoing_message_set();
+ else
+ return port()->incoming_message_set();
+}
+
+pmt_t
+mb_endpoint::outgoing_message_set() const
+{
+ if (inside_of_relay_port_p()) // swap incoming and
outgoing
+ return port()->incoming_message_set();
+ else
+ return port()->outgoing_message_set();
+}
Modified: gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_endpoint.h
===================================================================
--- gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_endpoint.h
2007-02-05 22:15:17 UTC (rev 4388)
+++ gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_endpoint.h
2007-02-05 23:39:39 UTC (rev 4389)
@@ -47,6 +47,12 @@
const std::string &component_name() const { return d_component_name; }
const std::string &port_name() const { return d_port_name; }
mb_port_sptr port() const { return d_port; }
+
+ //! Does this endpoint represent the inside of a relay port
+ bool inside_of_relay_port_p() const;
+
+ pmt_t incoming_message_set() const;
+ pmt_t outgoing_message_set() const;
};
#endif /* INCLUDED_MB_ENDPOINT_H */
Modified: gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_mblock_impl.cc
===================================================================
--- gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_mblock_impl.cc
2007-02-05 22:15:17 UTC (rev 4388)
+++ gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_mblock_impl.cc
2007-02-05 23:39:39 UTC (rev 4389)
@@ -107,7 +107,7 @@
mb_endpoint ep0 = check_and_resolve_endpoint(comp_name1, port_name1);
mb_endpoint ep1 = check_and_resolve_endpoint(comp_name2, port_name2);
- if (!ports_are_compatible(ep0.port(), ep1.port()))
+ if (!endpoints_are_compatible(ep0, ep1))
throw mbe_incompatible_ports(d_mb,
comp_name1, port_name1,
comp_name2, port_name2);
@@ -198,17 +198,15 @@
bool
-mb_mblock_impl::ports_are_compatible(mb_port_sptr p0, mb_port_sptr p1)
+mb_mblock_impl::endpoints_are_compatible(const mb_endpoint &ep0,
+ const mb_endpoint &ep1)
{
- using std::cout;
- using std::endl;
+ pmt_t p0_outgoing = ep0.outgoing_message_set();
+ pmt_t p0_incoming = ep0.incoming_message_set();
- pmt_t p0_outgoing = p0->outgoing_message_set();
- pmt_t p0_incoming = p0->incoming_message_set();
+ pmt_t p1_outgoing = ep1.outgoing_message_set();
+ pmt_t p1_incoming = ep1.incoming_message_set();
- pmt_t p1_outgoing = p1->outgoing_message_set();
- pmt_t p1_incoming = p1->incoming_message_set();
-
return (pmt_subsetp(p0_outgoing, p1_incoming)
&& pmt_subsetp(p1_outgoing, p0_incoming));
}
Modified: gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_mblock_impl.h
===================================================================
--- gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_mblock_impl.h
2007-02-05 22:15:17 UTC (rev 4388)
+++ gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_mblock_impl.h
2007-02-05 23:39:39 UTC (rev 4389)
@@ -183,7 +183,8 @@
const std::string &port_name);
static bool
- ports_are_compatible(mb_port_sptr p0, mb_port_sptr p1);
+ endpoints_are_compatible(const mb_endpoint &ep0,
+ const mb_endpoint &ep1);
//! Set the name of this block
void set_fullname(const std::string &name){ d_fullname = name; }
Modified: gnuradio/branches/developers/eb/mb/mblock/src/lib/qa_mblock_send.cc
===================================================================
--- gnuradio/branches/developers/eb/mb/mblock/src/lib/qa_mblock_send.cc
2007-02-05 22:15:17 UTC (rev 4388)
+++ gnuradio/branches/developers/eb/mb/mblock/src/lib/qa_mblock_send.cc
2007-02-05 23:39:39 UTC (rev 4389)
@@ -36,19 +36,24 @@
#include <mb_msg_accepter.h>
#include <stdio.h>
-static pmt_t s_data = pmt_intern("data");
+static pmt_t s_data = pmt_intern("data");
+static pmt_t s_status = pmt_intern("status");
+static pmt_t s_control = pmt_intern("control");
static pmt_t s_p0 = pmt_intern("p0");
static pmt_t s_p1 = pmt_intern("p1");
static pmt_t s_p2 = pmt_intern("p2");
+static pmt_t s_p3 = pmt_intern("p3");
static pmt_t s_e1 = pmt_intern("e1");
static pmt_t s_r1 = pmt_intern("r1");
static void
define_protocol_classes()
{
- mb_make_protocol_class(pmt_intern("simple-send"), // name
- pmt_cons(s_data, PMT_NIL), // incoming
- pmt_cons(s_data, PMT_NIL)); // outgoing
+ // Defined from client point-of-view.
+ mb_make_protocol_class(pmt_intern("qa-send-cs"), // name
+ pmt_list1(s_status), // incoming
+ pmt_list1(s_control)); // outgoing
+
}
// ================================================================
@@ -61,6 +66,7 @@
{
mb_port_sptr d_p1;
mb_port_sptr d_p2;
+ mb_port_sptr d_p3;
public:
sr1();
@@ -70,8 +76,9 @@
sr1::sr1()
{
- d_p1 = define_port("p1", "simple-send", false, mb_port::EXTERNAL);
- d_p2 = define_port("p2", "simple-send", false, mb_port::EXTERNAL);
+ d_p1 = define_port("p1", "qa-send-cs", true, mb_port::EXTERNAL);
+ d_p2 = define_port("p2", "qa-send-cs", true, mb_port::EXTERNAL);
+ d_p3 = define_port("p3", "qa-send-cs", false, mb_port::EXTERNAL);
}
sr1::~sr1(){}
@@ -83,11 +90,11 @@
// send two messages to each port
pmt_t our_name = pmt_intern(fullname());
- d_p1->send(s_data, pmt_list3(our_name, s_p1, pmt_from_long(0)));
- d_p1->send(s_data, pmt_list3(our_name, s_p1, pmt_from_long(1)));
+ d_p1->send(s_status, pmt_list3(our_name, s_p1, pmt_from_long(0)));
+ d_p1->send(s_status, pmt_list3(our_name, s_p1, pmt_from_long(1)));
- d_p2->send(s_data, pmt_list3(our_name, s_p2, pmt_from_long(0)));
- d_p2->send(s_data, pmt_list3(our_name, s_p2, pmt_from_long(1)));
+ d_p2->send(s_status, pmt_list3(our_name, s_p2, pmt_from_long(0)));
+ d_p2->send(s_status, pmt_list3(our_name, s_p2, pmt_from_long(1)));
}
// ----------------------------------------------------------------
@@ -105,13 +112,14 @@
sr0::sr0()
{
- d_p0 = define_port("p0", "simple-send", false, mb_port::INTERNAL);
+ d_p0 = define_port("p0", "qa-send-cs", false, mb_port::INTERNAL);
define_component("mb1", mb_mblock_sptr(new sr1()));
define_component("mb2", mb_mblock_sptr(new sr1()));
connect("self", "p0", "mb1", "p1");
- connect("mb1", "p2", "mb2", "p2");
+ connect("mb1", "p2", "mb2", "p3");
+ connect("mb1", "p3", "mb2", "p2");
}
sr0::~sr0(){}
@@ -123,8 +131,8 @@
// send two messages to p0
pmt_t our_name = pmt_intern(fullname());
- d_p0->send(s_data, pmt_list3(our_name, s_p0, pmt_from_long(0)));
- d_p0->send(s_data, pmt_list3(our_name, s_p0, pmt_from_long(1)));
+ d_p0->send(s_control, pmt_list3(our_name, s_p0, pmt_from_long(0)));
+ d_p0->send(s_control, pmt_list3(our_name, s_p0, pmt_from_long(1)));
}
// ----------------------------------------------------------------
@@ -164,7 +172,7 @@
// mb1 should have received
// two messages from mb0 via its p0 and
- // two messages from mb2 via its p2
+ // two messages from mb2 via its p3
mb_mblock_sptr mb1 = mb0->impl()->component("mb1");
@@ -185,14 +193,14 @@
msg = mb1->impl()->msgq().get_highest_pri_msg();
CPPUNIT_ASSERT(msg);
// std::cerr << msg->data() << std::endl;
- CPPUNIT_ASSERT_EQUAL(s_p2, msg->port_id());
+ CPPUNIT_ASSERT_EQUAL(s_p3, msg->port_id());
CPPUNIT_ASSERT(pmt_equal(pmt_list3(pmt_intern("top/mb2"), s_p2,
pmt_from_long(0)),
msg->data()));
msg = mb1->impl()->msgq().get_highest_pri_msg();
CPPUNIT_ASSERT(msg);
// std::cerr << msg->data() << std::endl;
- CPPUNIT_ASSERT_EQUAL(s_p2, msg->port_id());
+ CPPUNIT_ASSERT_EQUAL(s_p3, msg->port_id());
CPPUNIT_ASSERT(pmt_equal(pmt_list3(pmt_intern("top/mb2"), s_p2,
pmt_from_long(1)),
msg->data()));
@@ -205,26 +213,178 @@
msg = mb2->impl()->msgq().get_highest_pri_msg();
CPPUNIT_ASSERT(msg);
// std::cerr << msg->data() << std::endl;
- CPPUNIT_ASSERT_EQUAL(s_p2, msg->port_id());
+ CPPUNIT_ASSERT_EQUAL(s_p3, msg->port_id());
CPPUNIT_ASSERT(pmt_equal(pmt_list3(pmt_intern("top/mb1"), s_p2,
pmt_from_long(0)),
msg->data()));
msg = mb2->impl()->msgq().get_highest_pri_msg();
CPPUNIT_ASSERT(msg);
// std::cerr << msg->data() << std::endl;
- CPPUNIT_ASSERT_EQUAL(s_p2, msg->port_id());
+ CPPUNIT_ASSERT_EQUAL(s_p3, msg->port_id());
CPPUNIT_ASSERT(pmt_equal(pmt_list3(pmt_intern("top/mb1"), s_p2,
pmt_from_long(1)),
msg->data()));
}
// ================================================================
-// test_relay_routing
+// test_relay_routing_1
// ================================================================
// internal block for test_relay_routing
class rr2 : public mb_mblock
{
+ mb_port_sptr d_p1;
+ mb_port_sptr d_p2;
+
+public:
+ rr2();
+ ~rr2();
+ void init_fsm();
+};
+
+rr2::rr2()
+{
+ d_p1 = define_port("p1", "qa-send-cs", true, mb_port::EXTERNAL);
+ d_p2 = define_port("p2", "qa-send-cs", false, mb_port::EXTERNAL);
+}
+
+rr2::~rr2(){}
+
+void
+rr2::init_fsm()
+{
+ // std::cout << fullname() << "[rr2]: init_fsm\n";
+
+ // send two messages via p1
+ pmt_t our_name = pmt_intern(fullname());
+ d_p1->send(s_status, pmt_list3(our_name, s_p1, pmt_from_long(0)));
+ d_p1->send(s_status, pmt_list3(our_name, s_p1, pmt_from_long(1)));
+}
+
+// ----------------------------------------------------------------
+
+// intermediate block for test_relay_routing
+
+class rr1 : public mb_mblock
+{
+ mb_port_sptr d_p1;
+ mb_port_sptr d_p2;
+
+public:
+ rr1();
+ ~rr1();
+};
+
+rr1::rr1()
+{
+ d_p1 = define_port("p1", "qa-send-cs", true, mb_port::RELAY);
+ d_p2 = define_port("p2", "qa-send-cs", false, mb_port::RELAY);
+
+ define_component("c0", mb_mblock_sptr(new rr2()));
+
+ connect("self", "p1", "c0", "p1");
+ connect("self", "p2", "c0", "p2");
+}
+
+rr1::~rr1(){}
+
+// ----------------------------------------------------------------
+
+// top-level container for test_relay_routing
+
+class rr0_a : public mb_mblock
+{
+public:
+ rr0_a();
+ ~rr0_a();
+};
+
+rr0_a::rr0_a()
+{
+ define_component("c0", mb_mblock_sptr(new rr1()));
+ define_component("c1", mb_mblock_sptr(new rr2()));
+
+ connect("c0", "p1", "c1", "p2");
+ connect("c0", "p2", "c1", "p1");
+}
+
+rr0_a::~rr0_a(){}
+
+
+/*
+ * This tests basic message routing using RELAY and EXTERNAL ports.
+ * It does not rely on the guts of the runtime being complete,
+ * which is good, because at the time this is being written, it isn't.
+ */
+void
+qa_mblock_send::test_relay_routing_1()
+{
+ mb_message_sptr msg;
+
+ mb_runtime_sptr rt = mb_make_runtime();
+ mb_mblock_sptr top = mb_mblock_sptr(new rr0_a());
+ rt->run(top);
+
+ // Reach into the guts and see if the messages ended up where they should
have
+
+ mb_mblock_sptr c0 = top->impl()->component("c0");
+ mb_mblock_sptr c0c0 = c0->impl()->component("c0");
+
+ mb_mblock_sptr c1 = top->impl()->component("c1");
+
+ // c0c0 should have received
+ // two message from c1 via its p2
+
+ msg = c0c0->impl()->msgq().get_highest_pri_msg();
+ CPPUNIT_ASSERT(msg);
+ std::cerr << msg->data() << std::endl;
+ CPPUNIT_ASSERT_EQUAL(s_p2, msg->port_id());
+ CPPUNIT_ASSERT(pmt_equal(pmt_list3(pmt_intern("top/c1"), s_p1,
pmt_from_long(0)),
+ msg->data()));
+
+ msg = c0c0->impl()->msgq().get_highest_pri_msg();
+ CPPUNIT_ASSERT(msg);
+ std::cerr << msg->data() << std::endl;
+ CPPUNIT_ASSERT_EQUAL(s_p2, msg->port_id());
+ CPPUNIT_ASSERT(pmt_equal(pmt_list3(pmt_intern("top/c1"), s_p1,
pmt_from_long(1)),
+ msg->data()));
+
+#if 0
+ // c1c0 should have received
+ // two message from c0c0 via its e1
+
+ msg = c1c0->impl()->msgq().get_highest_pri_msg();
+ CPPUNIT_ASSERT(msg);
+ std::cerr << msg->data() << std::endl;
+ CPPUNIT_ASSERT_EQUAL(s_e1, msg->port_id());
+ CPPUNIT_ASSERT(pmt_equal(pmt_list3(pmt_intern("top/c0/c0"), s_e1,
pmt_from_long(0)),
+ msg->data()));
+
+ msg = c1c0->impl()->msgq().get_highest_pri_msg();
+ CPPUNIT_ASSERT(msg);
+ std::cerr << msg->data() << std::endl;
+ CPPUNIT_ASSERT_EQUAL(s_e1, msg->port_id());
+ CPPUNIT_ASSERT(pmt_equal(pmt_list3(pmt_intern("top/c0/c0"), s_e1,
pmt_from_long(1)),
+ msg->data()));
+#endif
+
+}
+
+void
+qa_mblock_send::test_relay_routing_2()
+{
+}
+
+
+#if 0
+// ================================================================
+// test_relay_routing_2
+// ================================================================
+
+// internal block for test_relay_routing
+
+class rr2 : public mb_mblock
+{
mb_port_sptr d_e1;
public:
@@ -303,6 +463,8 @@
void
qa_mblock_send::test_relay_routing()
{
+ return; // FIXME
+
mb_message_sptr msg;
mb_runtime_sptr rt = mb_make_runtime();
@@ -351,4 +513,4 @@
CPPUNIT_ASSERT(pmt_equal(pmt_list3(pmt_intern("top/c0/c0"), s_e1,
pmt_from_long(1)),
msg->data()));
}
-
+#endif
Modified: gnuradio/branches/developers/eb/mb/mblock/src/lib/qa_mblock_send.h
===================================================================
--- gnuradio/branches/developers/eb/mb/mblock/src/lib/qa_mblock_send.h
2007-02-05 22:15:17 UTC (rev 4388)
+++ gnuradio/branches/developers/eb/mb/mblock/src/lib/qa_mblock_send.h
2007-02-05 23:39:39 UTC (rev 4389)
@@ -29,12 +29,14 @@
CPPUNIT_TEST_SUITE(qa_mblock_send);
CPPUNIT_TEST(test_simple_routing);
- CPPUNIT_TEST(test_relay_routing);
+ CPPUNIT_TEST(test_relay_routing_1);
+ CPPUNIT_TEST(test_relay_routing_2);
CPPUNIT_TEST_SUITE_END();
private:
void test_simple_routing();
- void test_relay_routing();
+ void test_relay_routing_1();
+ void test_relay_routing_2();
};
#endif /* INCLUDED_QA_MBLOCK_SEND_H */
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Commit-gnuradio] r4389 - gnuradio/branches/developers/eb/mb/mblock/src/lib,
eb <=