Revision: 8115
          http://playerstage.svn.sourceforge.net/playerstage/?rev=8115&view=rev
Author:   thjc
Date:     2009-07-24 11:33:29 +0000 (Fri, 24 Jul 2009)

Log Message:
-----------
change extension so they dont show up in my copyright search script

Added Paths:
-----------
    code/player/trunk/design/module.c.doc
    code/player/trunk/design/player.c.doc

Removed Paths:
-------------
    code/player/trunk/design/module.c
    code/player/trunk/design/player.c

Deleted: code/player/trunk/design/module.c
===================================================================
--- code/player/trunk/design/module.c   2009-07-24 11:28:20 UTC (rev 8114)
+++ code/player/trunk/design/module.c   2009-07-24 11:33:29 UTC (rev 8115)
@@ -1,151 +0,0 @@
-// Implementation of mymodule, a module that does laser-based obstacle
-// avoidance
-
-// My message-processing function
-int mymodule_processmessage(player_io_t *io, player_msghdr_t* hdr, void* data);
-
-// My configuration function
-int mymodule_configure(player_io_t* io, player_module_options_t* opt);
-
-// My run function
-void mymodule_run(player_io_t* io);
-
-int
-main(int argc, char** argv)
-{
-  player_io_t* io;
-  player_tcp_io_t tcpio;
-  player_devaddr_t addr;
-  player_module_options_t* opt = NULL;
-
-  // Initialize player
-  io = player_init(argc, argv);
-
-  // Parse config file to create option table
-  player_parse_config_file(&opt, argv[1]);
-
-  // Configure module
-  mymodule_configure(opt);
-
-  // Construct my address
-  addr.host = 0; // 0 means localhost
-  addr.robot = 6665;
-  addr.interf = PLAYER_POSITION2D_CODE;
-  addr.index = 0;
-
-  // Add my interface (could add more in the same way)
-  player_add_interface(io,&addr);
-
-  // In this case we'll use TCP, so do the necessary transport-specific
-  // binding
-  player_tcp_add_io(&tcpio, io);
-  player_tcp_bind(&tcpio);
-
-  // Start up my module
-  mymodule_run(io);
-
-  return(0);
-}
-
-int 
-mymodule_configure(player_io_t* io, player_module_options_t* opt)
-{
-  // Step through table, storing options to where?
-}
-
-int 
-mymodule_processmessage(player_io_t *io, player_msghdr_t* hdr, void* data)
-{
-  // If no ack is requested, just cache it.  New messages overwrite old
-  // ones, so if I want to see *every* message, I must process them here,
-  // instead of caching them like this.
-  if(!hdr->ack)
-  {
-    player_cache_insert(io->message_cache, hdr, data);
-    return(0);
-  }
-  else
-  {
-    // An ack was requested.  What kind of message is it?
-    
-    // Is it a message to me to set odometry?
-    if(player_match_message_to(io, hdr, 
-                               io->addrs[0].host,
-                               io->addrs[0].robot,
-                               io->addrs[0].interf,
-                               io->addrs[0].index,
-                               PLAYER_POSITION2D_REQ_SET_ODOM))
-    {
-      // Try to set odometry, return 0 on success, -1 on failure
-      if(set_odometry() == 0)
-        return(0);
-      else
-        return(-1);
-    }
-    // Is it a message to me to enable motor power?
-    else if(player_match_message_to(io, hdr, 
-                                    io->addrs[0].host,
-                                    io->addrs[0].robot,
-                                    io->addrs[0].interf,
-                                    io->addrs[0].index,
-                                    PLAYER_POSITION2D_REQ_MOTOR_POWER))
-    {
-      // Forward it to the underlying device, somehow...
-    }
-    else
-    {
-      // don't know this message
-      return(-1);
-    }
-  }
-}
-
-// Run, with me in control of the event loop
-void
-mymodule_run(player_io_t* io)
-{
-  for(;;)
-  {
-    // Read incoming messages, with short timeout
-    player_tcp_readmessages(io->tcp_io,10);
-   
-    // Call my update method
-    mymodule_update(io);
-
-    // Write outgoing messages
-    player_tcp_writemessages(io->tcp_io);
-  }
-}
-
-// Execute one loop of my module
-void
-mymodule_update(player_io_t* io)
-{
-  // Read from my inqueue, processing each message:
-  //
-  player_processmessages(io, mymodule_processmessage);
-
-  // Alternatively, I could just use the default processor, which puts
-  // incoming messages into a cache:
-  //
-  //player_processmessages(io, player_processmessage_default);
-
-  // Do some module-specific stuff here
-
-  // Get latest laser scan, from anybody, to anybody, and delete it from 
-  // the cache
-  player_laser_data_t scan;
-  if(player_get_laser_scan(io, NULL, NULL, PLAYER_LASER_DATA_SCAN,
-                           &scan, 1))
-  {
-    // handle data in 'scan'
-  }
-
-  // Construct an outgoing message (fill it in)
-  player_position2d_data_t msg;
-  // Publish the message, to all interested parties, from my first address
-  player_broadcast_position2d_pose(io, 
-                                   io->addrs[0],
-                                   &msg);
-}
-

Copied: code/player/trunk/design/module.c.doc (from rev 8112, 
code/player/trunk/design/module.c)
===================================================================
--- code/player/trunk/design/module.c.doc                               (rev 0)
+++ code/player/trunk/design/module.c.doc       2009-07-24 11:33:29 UTC (rev 
8115)
@@ -0,0 +1,151 @@
+// Implementation of mymodule, a module that does laser-based obstacle
+// avoidance
+
+// My message-processing function
+int mymodule_processmessage(player_io_t *io, player_msghdr_t* hdr, void* data);
+
+// My configuration function
+int mymodule_configure(player_io_t* io, player_module_options_t* opt);
+
+// My run function
+void mymodule_run(player_io_t* io);
+
+int
+main(int argc, char** argv)
+{
+  player_io_t* io;
+  player_tcp_io_t tcpio;
+  player_devaddr_t addr;
+  player_module_options_t* opt = NULL;
+
+  // Initialize player
+  io = player_init(argc, argv);
+
+  // Parse config file to create option table
+  player_parse_config_file(&opt, argv[1]);
+
+  // Configure module
+  mymodule_configure(opt);
+
+  // Construct my address
+  addr.host = 0; // 0 means localhost
+  addr.robot = 6665;
+  addr.interf = PLAYER_POSITION2D_CODE;
+  addr.index = 0;
+
+  // Add my interface (could add more in the same way)
+  player_add_interface(io,&addr);
+
+  // In this case we'll use TCP, so do the necessary transport-specific
+  // binding
+  player_tcp_add_io(&tcpio, io);
+  player_tcp_bind(&tcpio);
+
+  // Start up my module
+  mymodule_run(io);
+
+  return(0);
+}
+
+int 
+mymodule_configure(player_io_t* io, player_module_options_t* opt)
+{
+  // Step through table, storing options to where?
+}
+
+int 
+mymodule_processmessage(player_io_t *io, player_msghdr_t* hdr, void* data)
+{
+  // If no ack is requested, just cache it.  New messages overwrite old
+  // ones, so if I want to see *every* message, I must process them here,
+  // instead of caching them like this.
+  if(!hdr->ack)
+  {
+    player_cache_insert(io->message_cache, hdr, data);
+    return(0);
+  }
+  else
+  {
+    // An ack was requested.  What kind of message is it?
+    
+    // Is it a message to me to set odometry?
+    if(player_match_message_to(io, hdr, 
+                               io->addrs[0].host,
+                               io->addrs[0].robot,
+                               io->addrs[0].interf,
+                               io->addrs[0].index,
+                               PLAYER_POSITION2D_REQ_SET_ODOM))
+    {
+      // Try to set odometry, return 0 on success, -1 on failure
+      if(set_odometry() == 0)
+        return(0);
+      else
+        return(-1);
+    }
+    // Is it a message to me to enable motor power?
+    else if(player_match_message_to(io, hdr, 
+                                    io->addrs[0].host,
+                                    io->addrs[0].robot,
+                                    io->addrs[0].interf,
+                                    io->addrs[0].index,
+                                    PLAYER_POSITION2D_REQ_MOTOR_POWER))
+    {
+      // Forward it to the underlying device, somehow...
+    }
+    else
+    {
+      // don't know this message
+      return(-1);
+    }
+  }
+}
+
+// Run, with me in control of the event loop
+void
+mymodule_run(player_io_t* io)
+{
+  for(;;)
+  {
+    // Read incoming messages, with short timeout
+    player_tcp_readmessages(io->tcp_io,10);
+   
+    // Call my update method
+    mymodule_update(io);
+
+    // Write outgoing messages
+    player_tcp_writemessages(io->tcp_io);
+  }
+}
+
+// Execute one loop of my module
+void
+mymodule_update(player_io_t* io)
+{
+  // Read from my inqueue, processing each message:
+  //
+  player_processmessages(io, mymodule_processmessage);
+
+  // Alternatively, I could just use the default processor, which puts
+  // incoming messages into a cache:
+  //
+  //player_processmessages(io, player_processmessage_default);
+
+  // Do some module-specific stuff here
+
+  // Get latest laser scan, from anybody, to anybody, and delete it from 
+  // the cache
+  player_laser_data_t scan;
+  if(player_get_laser_scan(io, NULL, NULL, PLAYER_LASER_DATA_SCAN,
+                           &scan, 1))
+  {
+    // handle data in 'scan'
+  }
+
+  // Construct an outgoing message (fill it in)
+  player_position2d_data_t msg;
+  // Publish the message, to all interested parties, from my first address
+  player_broadcast_position2d_pose(io, 
+                                   io->addrs[0],
+                                   &msg);
+}
+


Property changes on: code/player/trunk/design/module.c.doc
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:mergeinfo
   + 
/code/player/branches/release-2-1-patches/design/module.c:6672-6673,6738,6834,6886,6905,6930,6936,6946,6951,6955,6975,6979-6981,6985,6987-6996,7087-7088,7204,7226,7230,7248,7250-7252,7256,7262-7263,7276,7300,7602
/code/player/trunk/design/module.c:6985
Added: svn:eol-style
   + native

Deleted: code/player/trunk/design/player.c
===================================================================
--- code/player/trunk/design/player.c   2009-07-24 11:28:20 UTC (rev 8114)
+++ code/player/trunk/design/player.c   2009-07-24 11:33:29 UTC (rev 8115)
@@ -1,308 +0,0 @@
-typedef struct player_devaddr
-{
-  /** The "host" on which the device resides.  Transport-dependent. */
-  uint32_t host;
-  /** The "robot" or device collection in which the device resides.
-      Transport-dependent */
-  uint32_t robot;
-  /** The interface provided by the device; must be one of PLAYER_*_CODE */
-  uint16_t interf;
-  /** Which device of that interface */
-  uint16_t index;
-} player_devaddr_t;
-
-// Generic message header.
-typedef struct player_msghdr
-{
-  /** Origin address */
-  player_devaddr_t from;
-  /** Destination address */
-  player_devaddr_t to;
-  /** Message type; interface-specific */
-  uint8_t type;
-  /** Time associated with message contents (seconds since epoch) */
-  double timestamp;
-  /** For keeping track of associated messages.  Transport-specific. */
-  uint32_t seq;
-  /** Whether an acknowledgement is requeested */
-  uint8_t ack;
-  /** Size in bytes of the payload to follow */
-  uint32_t size;
-} player_msghdr_t;
-
-// An acknowledgement message
-typedef struct player_player_ack
-{
-  uint8_t value;
-} player_player_ack_t;
-
-typedef struct player_msgqueue
-{
-  // A linked list gets implemented here, using glib
-} player_msgqueue_t;
-
-typedef struct player_cache
-{
-  // A dictionary of messages, keyed by message signature, goes here
-  // (use glib).  New messages overwrite old ones with the same signature.
-} player_cache_t;
-
-// Insert data, with signature hdr, into the cache
-int player_cache_insert(player_cache_t* cache, 
-                        player_msghdr_t* hdr,
-                        void* data);
-// Retrieve message with signature hdr, and put it in data.
-int player_cache_retrieve(player_cache_t* cache, 
-                          player_msghdr_t* hdr,
-                          void* data);
-
-// Similar to player_cache_retrieve, but deletes message from the cache 
-// after retrieval
-int player_cache_remove(player_cache_t* cache,
-                        player_msghdr_t* hdr,
-                        void* data);
-
-// Forward declaration of TCP manager;
-struct player_tcp_io;
-
-// A player_io_t object contains all the state necessary for a single
-// module.  A single module may have multiple addresses.
-typedef struct player_io
-{
-  // A list of my addresses
-  player_devaddr_t* addrs;
-  // My input queue
-  player_msgqueue_t* inqueue;
-  // My output queue
-  player_msgqueue_t* outqueue;
-  // A cache of incoming message
-  player_cache_t* message_cache;
-  // Which transport are we using?
-  uint8_t transport_id;
-  // TCP manager object, in case we're using TCP
-  player_tcp_io_t* tcp_io;
-  // Other local state goes here
-} player_io_t; 
-
-typedef struct player_module_options
-{
-  // A dictionary/hash-table of module name-value options goes here, 
-  // using glib
-} player_module_options_t;
-
-// initialize player. returns some local state.
-player_io_t* player_init(int argc, char* argv);
-
-// clean up
-int player_fini(player_io_t* io);
-
-// Parse a config file to build an option table
-//
-// If (*opt) is NULL, a new table is created.
-int
-player_parse_config_file(player_module_options_t** opt,
-                         const char* fname);
-
-// Declare an interface that I'll support
-int player_add_interface(player_io_t* io, player_devaddr_t* addr);
-
-// A message structure
-typedef struct player_$(INTERFACE)_$(TYPE)
-{
-  // ...
-} player_$(INTERFACE)_$(TYPE)_t;
-
-// connect to a device somewhere out there. returns a handle to the device.
-int
-player_subscribe_$(INTERFACE)_$(TYPE)(player_io_t* io, 
-                                      player_devaddr_t* addr)
-{
-  // Contact the device.  Now, this should be done in a transport-specific
-  // way.
-  if(io->transport == PLAYER_TRANSPORT_TCP)
-  {
-    // Do a TCP-specific subscription
-  }
-}
-
-// disconnect from a device somewhere out there.
-int
-player_unsubscribe_$(INTERFACE)_$(TYPE)(player_io_t* io, 
-                                        player_devaddr_t* addr);
-{
-  // Contact the device.  Now, this should be done in a transport-specific
-  // way.
-  if(io->transport == PLAYER_TRANSPORT_TCP)
-  {
-    // Do a TCP-specific unsubscription
-  }
-}
-
-// Publish a message.
-//
-//   io: Local io handle
-//   from: Address of originating device.  Needed to distinguish between
-//         multiple interfaces.  If NULL, 
-//   to: Address of destination device.  If NULL, then the message is sent
-//       to all subscribers.
-//   data: The message itself.
-//   ack: If 1, then an acknowledgement from the destination device is
-//        requested.  Cannot be 1 if 'to' is NULL (i.e., cannot request
-//        acknowledgement for a multicast message).
-//   ack_timeout: how long to wait for acknowledgement; 0 for no waiting,
-//                -1 for indefinite timeout
-//
-// Returns: 0 on success, non-zero on error.  If ack is 0, then the return
-// value only indicates whether the message was sent.  If ack is 1, then
-// the return value is a response from the destination device (may need a
-// special value to distinguish timeout from device-generated error).
-int 
-player_publish_$(INTERFACE)_$(TYPE)(player_io_t* io, 
-                                     player_devaddr_t* from, 
-                                     player_devaddr_t* to, 
-                                     player_$(INTERFACE)_$(TYPE)_t* data,
-                                     int ack,
-                                     int ack_timeout);
-
-// Short form of publishing, for convenience
-int player_broadcast_$(INTERFACE)_$(TYPE)(player_io_t* io,
-                                          player_devaddr_t* from,
-                                          player_$(INTERFACE)_$(TYPE)_t* data)
-{
-  return(player_publish_$(INTERFACE)_$(TYPE)(io, from, NULL, data, 0, -1));
-}
-
-// A utility function to retrieve a certain type of message from the local 
-// cache.  The 'remove' argument indicates whether the message should be
-// removed from the cache.
-int player_get_$(INTERFACE)_$(TYPE)(player_io_t* io,
-                                    player_devaddr_t* from,
-                                    player_devaddr_t* to,
-                                    player_$(INTERFACE)_$(TYPE)_t* data,
-                                    int remove)
-{
-  player_msghdr_t hdr;
-  hdr.from = from;
-  hdr.to = to;
-  hdr.type = $(TYPE);
-  if(remove)
-    return(player_cache_remove(io->cache, &hdr, data));
-  else
-    return(player_cache_retrieve(io->cache, &hdr, data));
-}
-
-// A utility function to wait for a specific message to arrive on my
-// inqueue.   The message is popped (?)
-int player_waitfor_$(INTERFACE)_$(THING)(player_io_t* io, 
-                                         player_devaddr_t* from, 
-                                         player_devaddr_t* to, 
-                                         player_$(INTERFACE)_$(TYPE)_t* data);
-
-// A utility function to send an acknowledgement
-int player_send_ack(player_io_t* io,
-                    player_devaddr_t* from,
-                    player_devaddr_t* to,
-                    uint8_t value)
-{
-  player_player_ack_t ack;
-  ack.value = value;
-  return(player_publish_player_ack(io, from, to, &ack, 0, 0));
-}
-
-// A utility function to match message signature, using from address.  -1
-// for any field means don't care
-int player_match_message_from(player_io_t* io,
-                              player_msghdr_t* hdr,
-                              int host,
-                              int robot,
-                              int interf,
-                              int index,
-                              int type);
-
-// A utility function to match message signature, using to address.  -1
-// for any field means don't care
-int player_match_message_to(player_io_t* io,
-                            player_msghdr_t* hdr,
-                            int host,
-                            int robot,
-                            int interf,
-                            int index,
-                            int type);
-
-// Other message-match functions could be provided....
-
-// Signature for a message-processing function
-typedef int 
-(*player_processmessage_fn_t)(player_io_t *io,
-                              player_msghdr_t* hdr,
-                              void* data);
-
-// A default message processer, which simply caches the messages for later
-// perusal
-int
-player_processmessage_default(player_io_t* io,
-                              player_msghdr_t* hdr,
-                              void* data)
-{
-  player_cache_insert(io->message_cache, hdr, data);
-
-  // If an ack was requested, send a success code (might not be the right
-  // behavior, but what other option is there if the module is not
-  // personally processing each messagee?)
-  if(hdr->ack)
-    player_send_ack(io, hdr->to, hdr->from, 0);
-}
-
-// A utility function to pop and process messages, one by one
-int player_processmessages(player_io_t* io, 
-                           player_processmessage_fn_t process_fn)
-{
-  int retval;
-  while(!player_queue_empty(io->inqueue))
-  {
-    // Pop a message off the queue
-    player_msghdr_t* hdr;
-    void* data;
-    player_queue_pop(&hdr, &data, io->inqueue);
-
-    // Process the message and catch the return value
-    retval = (process_fn)(io,hdr,data);
-
-    // If an ack was requested, send it
-    if(hdr->ack)
-      player_send_ack(io, hdr->to, hdr->from, retval);
-  }
-}
-
-
-/////////////////////////////////////////////////////////////////////////
-//
-// TCP-specific functionality
-//
-typedef struct player_tcp_io
-{
-  // List of player_io objects that I'm managing (one per module)
-  player_io_t** ios;
-  // TCP state, like ports and sockets that I'm managing
-} player_tcp_io_t;
-
-// Add an io object (i.e., a module) to this TCP manager
-int player_tcp_add_io(player_tcp_io_t* tcpio, player_io_t* io);
-
-// Bind to one or more TCP ports, as indicated by the modules embedded
-// in 'tcpio'.
-int player_tcp_bind(player_tcp_io_t* io);
-
-// Read incoming messages from bound TCP sockets and push them onto
-// appropriate tcpio->io->inqueue.
-int player_tcp_readmessages(player_tcp_io_t* tcpio, int timeout);
-
-// Pop outgoing messages from all tcpio->io->outqueue and write them out 
-// on TCP sockets
-int player_tcp_writemessages(player_tcp_io_t* tcpio);
-/////////////////////////////////////////////////////////////////////////
-
-
-
-
-

Copied: code/player/trunk/design/player.c.doc (from rev 8112, 
code/player/trunk/design/player.c)
===================================================================
--- code/player/trunk/design/player.c.doc                               (rev 0)
+++ code/player/trunk/design/player.c.doc       2009-07-24 11:33:29 UTC (rev 
8115)
@@ -0,0 +1,308 @@
+typedef struct player_devaddr
+{
+  /** The "host" on which the device resides.  Transport-dependent. */
+  uint32_t host;
+  /** The "robot" or device collection in which the device resides.
+      Transport-dependent */
+  uint32_t robot;
+  /** The interface provided by the device; must be one of PLAYER_*_CODE */
+  uint16_t interf;
+  /** Which device of that interface */
+  uint16_t index;
+} player_devaddr_t;
+
+// Generic message header.
+typedef struct player_msghdr
+{
+  /** Origin address */
+  player_devaddr_t from;
+  /** Destination address */
+  player_devaddr_t to;
+  /** Message type; interface-specific */
+  uint8_t type;
+  /** Time associated with message contents (seconds since epoch) */
+  double timestamp;
+  /** For keeping track of associated messages.  Transport-specific. */
+  uint32_t seq;
+  /** Whether an acknowledgement is requeested */
+  uint8_t ack;
+  /** Size in bytes of the payload to follow */
+  uint32_t size;
+} player_msghdr_t;
+
+// An acknowledgement message
+typedef struct player_player_ack
+{
+  uint8_t value;
+} player_player_ack_t;
+
+typedef struct player_msgqueue
+{
+  // A linked list gets implemented here, using glib
+} player_msgqueue_t;
+
+typedef struct player_cache
+{
+  // A dictionary of messages, keyed by message signature, goes here
+  // (use glib).  New messages overwrite old ones with the same signature.
+} player_cache_t;
+
+// Insert data, with signature hdr, into the cache
+int player_cache_insert(player_cache_t* cache, 
+                        player_msghdr_t* hdr,
+                        void* data);
+// Retrieve message with signature hdr, and put it in data.
+int player_cache_retrieve(player_cache_t* cache, 
+                          player_msghdr_t* hdr,
+                          void* data);
+
+// Similar to player_cache_retrieve, but deletes message from the cache 
+// after retrieval
+int player_cache_remove(player_cache_t* cache,
+                        player_msghdr_t* hdr,
+                        void* data);
+
+// Forward declaration of TCP manager;
+struct player_tcp_io;
+
+// A player_io_t object contains all the state necessary for a single
+// module.  A single module may have multiple addresses.
+typedef struct player_io
+{
+  // A list of my addresses
+  player_devaddr_t* addrs;
+  // My input queue
+  player_msgqueue_t* inqueue;
+  // My output queue
+  player_msgqueue_t* outqueue;
+  // A cache of incoming message
+  player_cache_t* message_cache;
+  // Which transport are we using?
+  uint8_t transport_id;
+  // TCP manager object, in case we're using TCP
+  player_tcp_io_t* tcp_io;
+  // Other local state goes here
+} player_io_t; 
+
+typedef struct player_module_options
+{
+  // A dictionary/hash-table of module name-value options goes here, 
+  // using glib
+} player_module_options_t;
+
+// initialize player. returns some local state.
+player_io_t* player_init(int argc, char* argv);
+
+// clean up
+int player_fini(player_io_t* io);
+
+// Parse a config file to build an option table
+//
+// If (*opt) is NULL, a new table is created.
+int
+player_parse_config_file(player_module_options_t** opt,
+                         const char* fname);
+
+// Declare an interface that I'll support
+int player_add_interface(player_io_t* io, player_devaddr_t* addr);
+
+// A message structure
+typedef struct player_$(INTERFACE)_$(TYPE)
+{
+  // ...
+} player_$(INTERFACE)_$(TYPE)_t;
+
+// connect to a device somewhere out there. returns a handle to the device.
+int
+player_subscribe_$(INTERFACE)_$(TYPE)(player_io_t* io, 
+                                      player_devaddr_t* addr)
+{
+  // Contact the device.  Now, this should be done in a transport-specific
+  // way.
+  if(io->transport == PLAYER_TRANSPORT_TCP)
+  {
+    // Do a TCP-specific subscription
+  }
+}
+
+// disconnect from a device somewhere out there.
+int
+player_unsubscribe_$(INTERFACE)_$(TYPE)(player_io_t* io, 
+                                        player_devaddr_t* addr);
+{
+  // Contact the device.  Now, this should be done in a transport-specific
+  // way.
+  if(io->transport == PLAYER_TRANSPORT_TCP)
+  {
+    // Do a TCP-specific unsubscription
+  }
+}
+
+// Publish a message.
+//
+//   io: Local io handle
+//   from: Address of originating device.  Needed to distinguish between
+//         multiple interfaces.  If NULL, 
+//   to: Address of destination device.  If NULL, then the message is sent
+//       to all subscribers.
+//   data: The message itself.
+//   ack: If 1, then an acknowledgement from the destination device is
+//        requested.  Cannot be 1 if 'to' is NULL (i.e., cannot request
+//        acknowledgement for a multicast message).
+//   ack_timeout: how long to wait for acknowledgement; 0 for no waiting,
+//                -1 for indefinite timeout
+//
+// Returns: 0 on success, non-zero on error.  If ack is 0, then the return
+// value only indicates whether the message was sent.  If ack is 1, then
+// the return value is a response from the destination device (may need a
+// special value to distinguish timeout from device-generated error).
+int 
+player_publish_$(INTERFACE)_$(TYPE)(player_io_t* io, 
+                                     player_devaddr_t* from, 
+                                     player_devaddr_t* to, 
+                                     player_$(INTERFACE)_$(TYPE)_t* data,
+                                     int ack,
+                                     int ack_timeout);
+
+// Short form of publishing, for convenience
+int player_broadcast_$(INTERFACE)_$(TYPE)(player_io_t* io,
+                                          player_devaddr_t* from,
+                                          player_$(INTERFACE)_$(TYPE)_t* data)
+{
+  return(player_publish_$(INTERFACE)_$(TYPE)(io, from, NULL, data, 0, -1));
+}
+
+// A utility function to retrieve a certain type of message from the local 
+// cache.  The 'remove' argument indicates whether the message should be
+// removed from the cache.
+int player_get_$(INTERFACE)_$(TYPE)(player_io_t* io,
+                                    player_devaddr_t* from,
+                                    player_devaddr_t* to,
+                                    player_$(INTERFACE)_$(TYPE)_t* data,
+                                    int remove)
+{
+  player_msghdr_t hdr;
+  hdr.from = from;
+  hdr.to = to;
+  hdr.type = $(TYPE);
+  if(remove)
+    return(player_cache_remove(io->cache, &hdr, data));
+  else
+    return(player_cache_retrieve(io->cache, &hdr, data));
+}
+
+// A utility function to wait for a specific message to arrive on my
+// inqueue.   The message is popped (?)
+int player_waitfor_$(INTERFACE)_$(THING)(player_io_t* io, 
+                                         player_devaddr_t* from, 
+                                         player_devaddr_t* to, 
+                                         player_$(INTERFACE)_$(TYPE)_t* data);
+
+// A utility function to send an acknowledgement
+int player_send_ack(player_io_t* io,
+                    player_devaddr_t* from,
+                    player_devaddr_t* to,
+                    uint8_t value)
+{
+  player_player_ack_t ack;
+  ack.value = value;
+  return(player_publish_player_ack(io, from, to, &ack, 0, 0));
+}
+
+// A utility function to match message signature, using from address.  -1
+// for any field means don't care
+int player_match_message_from(player_io_t* io,
+                              player_msghdr_t* hdr,
+                              int host,
+                              int robot,
+                              int interf,
+                              int index,
+                              int type);
+
+// A utility function to match message signature, using to address.  -1
+// for any field means don't care
+int player_match_message_to(player_io_t* io,
+                            player_msghdr_t* hdr,
+                            int host,
+                            int robot,
+                            int interf,
+                            int index,
+                            int type);
+
+// Other message-match functions could be provided....
+
+// Signature for a message-processing function
+typedef int 
+(*player_processmessage_fn_t)(player_io_t *io,
+                              player_msghdr_t* hdr,
+                              void* data);
+
+// A default message processer, which simply caches the messages for later
+// perusal
+int
+player_processmessage_default(player_io_t* io,
+                              player_msghdr_t* hdr,
+                              void* data)
+{
+  player_cache_insert(io->message_cache, hdr, data);
+
+  // If an ack was requested, send a success code (might not be the right
+  // behavior, but what other option is there if the module is not
+  // personally processing each messagee?)
+  if(hdr->ack)
+    player_send_ack(io, hdr->to, hdr->from, 0);
+}
+
+// A utility function to pop and process messages, one by one
+int player_processmessages(player_io_t* io, 
+                           player_processmessage_fn_t process_fn)
+{
+  int retval;
+  while(!player_queue_empty(io->inqueue))
+  {
+    // Pop a message off the queue
+    player_msghdr_t* hdr;
+    void* data;
+    player_queue_pop(&hdr, &data, io->inqueue);
+
+    // Process the message and catch the return value
+    retval = (process_fn)(io,hdr,data);
+
+    // If an ack was requested, send it
+    if(hdr->ack)
+      player_send_ack(io, hdr->to, hdr->from, retval);
+  }
+}
+
+
+/////////////////////////////////////////////////////////////////////////
+//
+// TCP-specific functionality
+//
+typedef struct player_tcp_io
+{
+  // List of player_io objects that I'm managing (one per module)
+  player_io_t** ios;
+  // TCP state, like ports and sockets that I'm managing
+} player_tcp_io_t;
+
+// Add an io object (i.e., a module) to this TCP manager
+int player_tcp_add_io(player_tcp_io_t* tcpio, player_io_t* io);
+
+// Bind to one or more TCP ports, as indicated by the modules embedded
+// in 'tcpio'.
+int player_tcp_bind(player_tcp_io_t* io);
+
+// Read incoming messages from bound TCP sockets and push them onto
+// appropriate tcpio->io->inqueue.
+int player_tcp_readmessages(player_tcp_io_t* tcpio, int timeout);
+
+// Pop outgoing messages from all tcpio->io->outqueue and write them out 
+// on TCP sockets
+int player_tcp_writemessages(player_tcp_io_t* tcpio);
+/////////////////////////////////////////////////////////////////////////
+
+
+
+
+


Property changes on: code/player/trunk/design/player.c.doc
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:mergeinfo
   + 
/code/player/branches/release-2-1-patches/design/player.c:6672-6673,6738,6834,6886,6905,6930,6936,6946,6951,6955,6975,6979-6981,6985,6987-6996,7087-7088,7204,7226,7230,7248,7250-7252,7256,7262-7263,7276,7300,7602
/code/player/trunk/design/player.c:6985
Added: svn:eol-style
   + native


This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.

------------------------------------------------------------------------------
_______________________________________________
Playerstage-commit mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/playerstage-commit

Reply via email to