commit-gnuradio
[Top][All Lists]
Advanced

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

[Commit-gnuradio] r4374 - gnuradio/branches/developers/eb/mb/mblock/src/


From: eb
Subject: [Commit-gnuradio] r4374 - gnuradio/branches/developers/eb/mb/mblock/src/lib
Date: Sun, 4 Feb 2007 21:27:33 -0700 (MST)

Author: eb
Date: 2007-02-04 21:27:32 -0700 (Sun, 04 Feb 2007)
New Revision: 4374

Modified:
   gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_connection.cc
   gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_connection.h
   gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_exception.cc
   gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_exception.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/mb_port_simple.cc
   gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_port_simple.h
   gnuradio/branches/developers/eb/mb/mblock/src/lib/qa_mblock_send.cc
Log:
Work-in-progress on mblocks: sends to INTERNAL & EXTERNAL ports are
being resolved correctly.


Modified: gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_connection.cc
===================================================================
--- gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_connection.cc  
2007-02-05 02:39:43 UTC (rev 4373)
+++ gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_connection.cc  
2007-02-05 04:27:32 UTC (rev 4374)
@@ -52,17 +52,17 @@
 }
 
 bool
-mb_conn_table::lookup_conn_by_port(mb_port_sptr port,
+mb_conn_table::lookup_conn_by_port(const mb_port *port,
                                   mb_conn_iter *itp, int *which_ep)
 {
   mb_conn_iter end = d_connections.end();
   for (mb_conn_iter it = d_connections.begin(); it != end; ++it){
-    if (it->d_ep[0].port() == port){
+    if (it->d_ep[0].port().get() == port){
       *itp = it;
       *which_ep = 0;
       return true;
     }
-    if (it->d_ep[1].port() == port){
+    if (it->d_ep[1].port().get() == port){
       *itp = it;
       *which_ep = 1;
       return true;

Modified: gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_connection.h
===================================================================
--- gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_connection.h   
2007-02-05 02:39:43 UTC (rev 4373)
+++ gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_connection.h   
2007-02-05 04:27:32 UTC (rev 4374)
@@ -53,8 +53,8 @@
                      mb_conn_iter *it, int *which_ep);
 
   bool
-  lookup_conn_by_port(mb_port_sptr port,
-                      mb_conn_iter *it, int *which_ep);
+  lookup_conn_by_port(const mb_port *port,
+                     mb_conn_iter *it, int *which_ep);
 
   void
   create_conn(const mb_endpoint &ep0, const mb_endpoint &ep1);

Modified: gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_exception.cc
===================================================================
--- gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_exception.cc   
2007-02-05 02:39:43 UTC (rev 4373)
+++ gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_exception.cc   
2007-02-05 04:27:32 UTC (rev 4374)
@@ -33,6 +33,11 @@
 {
 }
 
+mbe_not_implemented::mbe_not_implemented(const std::string &msg)
+  : mbe_base(0, "Not implemented: " + msg)
+{
+}
+
 mbe_no_such_component::mbe_no_such_component(mb_mblock *mb, const std::string 
&component_name)
   : mbe_base(mb, "No such component: " + component_name)
 {

Modified: gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_exception.h
===================================================================
--- gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_exception.h    
2007-02-05 02:39:43 UTC (rev 4373)
+++ gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_exception.h    
2007-02-05 04:27:32 UTC (rev 4374)
@@ -32,6 +32,11 @@
   mbe_base(mb_mblock *mb, const std::string &msg);
 };
 
+class mbe_not_implemented : public mbe_base
+{
+public:
+  mbe_not_implemented(const std::string &msg);
+};
 
 
 class mbe_no_such_component : public mbe_base

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 02:39:43 UTC (rev 4373)
+++ gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_mblock_impl.cc 
2007-02-05 04:27:32 UTC (rev 4374)
@@ -234,3 +234,27 @@
 
   return mb_msg_accepter_sptr(ma);
 }
+
+mb_port_sptr
+mb_mblock_impl::lookup_port_on_other_end(const mb_port *port)
+{
+  mb_conn_iter it;
+  int          which_ep = 0;
+
+  if (!d_conn_table.lookup_conn_by_port(port, &it, &which_ep))
+    return mb_port_sptr();     // eqv to null pointer
+  
+  return it->d_ep[which_ep^1].port();
+}
+
+mb_mblock_sptr
+mb_mblock_impl::component(const std::string &comp_name)
+{
+  if (comp_name == "self")
+    return d_mb->shared_from_this();
+
+  if (d_comp_map.count(comp_name) == 0)
+    return mb_mblock_sptr();   // null pointer
+
+  return d_comp_map[comp_name];
+}

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 02:39:43 UTC (rev 4373)
+++ gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_mblock_impl.h  
2007-02-05 04:27:32 UTC (rev 4374)
@@ -150,6 +150,20 @@
   //! Return full name of this block
   std::string fullname() const { return d_fullname; }
 
+  //! If bound, return port on the other end of the connection, else null.
+  mb_port_sptr
+  lookup_port_on_other_end(const mb_port *port);
+
+
+  mb_mblock *
+  mblock() const { return d_mb; }
+
+  mb_mblock *
+  mblock_parent() const { return d_mb_parent; }
+
+  mb_mblock_sptr
+  component(const std::string &comp_name);
+
   /*
    * Our implementation methods
    */

Modified: gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_port_simple.cc
===================================================================
--- gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_port_simple.cc 
2007-02-05 02:39:43 UTC (rev 4373)
+++ gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_port_simple.cc 
2007-02-05 04:27:32 UTC (rev 4374)
@@ -25,7 +25,11 @@
 
 #include <mb_port_simple.h>
 #include <mb_msg_accepter.h>
+#include <mb_exception.h>
+#include <mb_mblock.h>
+#include <mb_mblock_impl.h>
 
+
 mb_port_simple::mb_port_simple(mb_mblock *mblock,
                               const std::string &port_name,
                               const std::string &protocol_class_name,
@@ -52,8 +56,56 @@
 mb_port_simple::find_accepter()
 {
   mb_msg_accepter_sptr r;
+  mb_mblock            *mb = 0;
 
-  // FIXME, actually do the work ;)
+  switch(port_type()){
+  case mb_port::INTERNAL:      // binding is in our name space
+    mb = d_mblock;
+    break;
 
-  return r;
+  case mb_port::EXTERNAL:      // binding is in parent's name space
+    mb = d_mblock->impl()->mblock_parent();
+    break;
+
+  case mb_port::RELAY:
+    throw std::logic_error("Can't happen: mb_port_simple::find_accepter send 
to relay [1]");
+
+  default:
+    throw std::logic_error("Can't happen: mb_port_simple::find_accepter [2]");
+  }
+
+  //  std::cerr << d_mblock->fullname() << ":" << port_name();
+
+  mb_port_sptr peer = mb->impl()->lookup_port_on_other_end(this);
+  // std::cerr << "\n@@@ find_accepter: peer = " << peer << std::endl;
+  if (!peer){  // not bound, return equivalent of null pointer.
+    // std::cerr << std::endl;
+    return r;
+  }
+
+
+  mb_port_simple *ps_peer = 0;
+  
+  switch (peer->port_type()){
+  case mb_port::INTERNAL:
+  case mb_port::EXTERNAL:
+    // FIXME if we ever instantiate other types of ports, this will need work
+    ps_peer = dynamic_cast<mb_port_simple *>(peer.get());
+    // std::cerr << " --> " << ps_peer->d_mblock->fullname() << ":" << 
ps_peer->port_name() << std::endl;
+    r = ps_peer->make_accepter();
+    // FIXME cache the result
+    return r;
+
+  case mb_port::RELAY:
+    throw mbe_not_implemented("mb_port_simple::find_accepter(RELAY)");
+
+  default:
+    throw std::logic_error("Can't happen: mb_port_simple::find_accepter [3]");
+  }
 }
+
+mb_msg_accepter_sptr
+mb_port_simple::make_accepter()
+{
+  return d_mblock->impl()->make_accepter(port_name());
+}

Modified: gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_port_simple.h
===================================================================
--- gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_port_simple.h  
2007-02-05 02:39:43 UTC (rev 4373)
+++ gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_port_simple.h  
2007-02-05 04:27:32 UTC (rev 4374)
@@ -32,6 +32,9 @@
   mb_msg_accepter_sptr
   find_accepter();
 
+  mb_msg_accepter_sptr
+  make_accepter();
+
 public:
   mb_port_simple(mb_mblock *mblock,
                 const std::string &port_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 02:39:43 UTC (rev 4373)
+++ gnuradio/branches/developers/eb/mb/mblock/src/lib/qa_mblock_send.cc 
2007-02-05 04:27:32 UTC (rev 4374)
@@ -146,11 +146,70 @@
   // mb0 should have received two messages sent from mb1 via its p1
   msg = mb0->impl()->msgq().get_highest_pri_msg();
   CPPUNIT_ASSERT(msg);
-  CPPUNIT_ASSERT_EQUAL(pmt_list3(pmt_intern("top/mb1"), s_p1, 
pmt_from_long(0)),
-                      msg->data());
+  // std::cerr << msg->data() << std::endl;
+  CPPUNIT_ASSERT_EQUAL(s_p0, msg->port_id());
+  CPPUNIT_ASSERT(pmt_equal(pmt_list3(pmt_intern("top/mb1"), s_p1, 
pmt_from_long(0)),
+                          msg->data()));
+
   msg = mb0->impl()->msgq().get_highest_pri_msg();
   CPPUNIT_ASSERT(msg);
-  CPPUNIT_ASSERT_EQUAL(pmt_list3(pmt_intern("top/mb1"), s_p1, 
pmt_from_long(1)),
-                      msg->data());
+  // std::cerr << msg->data() << std::endl;
+  CPPUNIT_ASSERT_EQUAL(s_p0, msg->port_id());
+  CPPUNIT_ASSERT(pmt_equal(pmt_list3(pmt_intern("top/mb1"), s_p1, 
pmt_from_long(1)),
+                          msg->data()));
+
+  // mb1 should have received
+  //   two messages from mb0 via its p0 and
+  //   two messages from mb2 via its p2
+
+  mb_mblock_sptr mb1 = mb0->impl()->component("mb1");
+
+  msg = mb1->impl()->msgq().get_highest_pri_msg();
+  CPPUNIT_ASSERT(msg);
+  // std::cerr << msg->data() << std::endl;
+  CPPUNIT_ASSERT_EQUAL(s_p1, msg->port_id());
+  CPPUNIT_ASSERT(pmt_equal(pmt_list3(pmt_intern("top"), s_p0, 
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_p1, msg->port_id());
+  CPPUNIT_ASSERT(pmt_equal(pmt_list3(pmt_intern("top"), s_p0, 
pmt_from_long(1)),
+                          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(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(pmt_equal(pmt_list3(pmt_intern("top/mb2"), s_p2, 
pmt_from_long(1)),
+                          msg->data()));
+
+
+  // mb2 should have received
+  //   two messages from mb2 via its p2
+
+  mb_mblock_sptr mb2 = mb0->impl()->component("mb2");
+
+  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(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(pmt_equal(pmt_list3(pmt_intern("top/mb1"), s_p2, 
pmt_from_long(1)),
+                          msg->data()));
 }
 





reply via email to

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