commit-gnuradio
[Top][All Lists]
Advanced

[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 */





reply via email to

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