Sophie

Sophie

distrib > Fedora > 14 > x86_64 > media > updates > by-pkgid > 727fa15453fcace956b835e2377d4269 > files > 365

player-doc-3.0.2-5.fc14.noarch.rpm

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
   "http://www.w3.org/TR/html4/strict.dtd">

<html>
<!-- $Id: header.html 8799 2010-06-28 04:12:42Z jpgr87 $ -->

<HEAD>


<meta HTTP-EQUIV="Content-Type" CONTENT="text/html;CHARSET=utf-8">
<meta name="keywords" content="stage, robot, simulation, player, player/stage">
<link href="doxygen.css" rel="stylesheet" type="text/css">

<style type="text/css">

.floatright { float: right; margin: 0 0 1em 1em; }

body {
  font-family: sans-serif;
  #font-family: Geneva, Verdana, Helvetica, Arial, sans-serif;
  background-color: #FFF;
  color:#000;
}


a:link { 
	color: #A00;
}

a:visited { 
	color: #800;
}

a { text-decoration: none; }
a:hover { text-decoration: underline; }


.timestamp { text-align:right; background-color: #DDD; font-size:75%;}

h1 { 
  font-size:160%; 
}

h2 {
  font-size:110%;
  #color: #FFF;
  #background-color: #666;
  #padding:3px;
}

h3 { text-align:left; }

img {
  border: 0;
}

ul.menu { 
    position:relative;
    left:-2.5em;
    margin-bottom:0px;
    margin-top:0px;
}

ul.menu1 { 
    position:relative;
    left:-2.1em;
    margin-bottom:0px;
    margin-top:0px;
}

li.menu { 
    list-style-type: none;
    position:relative;
    #left:-0.5em;
}


#sidebar { position: absolute; left:0px; padding:2em; top:0em; width:12em;}

#content { position: absolute; left:12em; top:0em; padding-left:3em; padding-right:3em; padding-bottom:2em; margin-top:1em; margin-right:2em; }

div.box { background-color:#EEE; border: 1px solid #000; padding: 0.5ex 0.4em 0.5ex 0.6em; margin:1em;  }
div.title { font-weight:bold; background-color:#eee; margin-bottom:2px;}

div.topbar { position: absolute; top:0px; left:9em; margin:1em; }

</style>

<TITLE>Player Manual</TITLE>

</HEAD>

<body>

<div id="sidebar"> 

<h2 style="text-align:center;">
<a href="index.html">
<img width=140 src="http://playerstage.sourceforge.net/images/player_button_v3.png" alt="Player logo"><br></a>
</h2>



<div class="box">
<div class=title>Player</div>

<ul class=menu>
<li class=menu><a href="index.html">Frontpage</a>
<li class=menu><a href="modules.html">Contents</a>
</ul>
</div>

<div class="box">
<div class=title>User</div>

<ul class=menu>
<li class=menu><a href="install.html">Installation</a>
<li class=menu><a href="start.html">Quick start</a>
<li class=menu><a href="supported_hardware.html">Supported&nbsp;devices</a>
<li class=menu><a href="group__tutorials.html">Tutorials</a>
<li class=menu><a href="group__utils.html">Utilities</a>
<li class=menu><a href="group__clientlibs.html">Client&nbsp;libraries</a>
<li class=menu><a href="http://playerstage.sourceforge.net/wiki/Basic_FAQ">FAQ</a>
<li class=menu><a href="help.html">Help</a>

</ul>
</div>

<div class=box>
<div class="title">Developer</div>
<ul class=menu>
<li class=menu><a href="architecture.html">Architecture</a>
<li class=menu><a href="group__libplayercore.html">libplayercore</a>
<ul class=menu1>
<li class=menu><a href="group__interfaces.html">interfaces</a></li>
</ul>
<li class=menu><a href="group__libplayerdrivers.html">libplayerdrivers</a>
<ul class=menu1>
<li class=menu><a href="group__drivers.html">drivers</a></li>
</ul>
<li class=menu><a href="group__libplayercommon.html">libplayercommon</a>
<li class=menu><a href="group__libplayerutils.html">libplayerutils</a>
<li class=menu><a href="group__libplayersd.html">libplayersd</a>
<li class=menu><a href="group__libplayertcp.html">libplayertcp</a>
<li class=menu><a href="group__libplayerxdr.html">libplayerxdr</a>
<li class=menu><a href="todo.html">TODO</a>
</ul>
</div>

<div class=box>
<!-- <a href="http://sourceforge.net"><img border=0 src="http://sourceforge.net/sflogo.php?group_id=42445&type=1"></a> -->
<div class="title">Online</div>
<a href="http://playerstage.sourceforge.net">Homepage</a><br>
<a href="http://sourceforge.net/project/showfiles.php?group_id=42445">Download</a><br>
<a href="http://sourceforge.net/projects/playerstage">Project</a><br>
<a href="http://sourceforge.net/tracker/?group_id=42445">Bugs</a><br>
<a href="http://sourceforge.net/mail/?group_id=42445">Help</a>
</div>


</div>

<div id="content" >
<!-- Generated by Doxygen 1.7.1 -->
<div class="header">
  <div class="summary">
<a href="#pub-methods">Public Member Functions</a> &#124;
<a href="#pro-methods">Protected Member Functions</a> &#124;
<a href="#pro-static-methods">Static Protected Member Functions</a> &#124;
<a href="#pri-attribs">Private Attributes</a>  </div>
  <div class="headertitle">
<h1>ThreadedDriver Class Reference</h1>  </div>
</div>
<div class="contents">
<!-- doxytag: class="ThreadedDriver" --><!-- doxytag: inherits="Driver" -->
<p>Base class for drivers which oeprate with a thread.  
<a href="#_details">More...</a></p>

<p><code>#include &lt;<a class="el" href="driver_8h_source.html">driver.h</a>&gt;</code></p>
<div class="dynheader">
Inheritance diagram for ThreadedDriver:</div>
<div class="dyncontent">
 <div class="center">
  <img src="classThreadedDriver.png" usemap="#ThreadedDriver_map" alt=""/>
  <map id="ThreadedDriver_map" name="ThreadedDriver_map">
<area href="classDriver.html" alt="Driver" shape="rect" coords="0,0,105,24"/>
<area href="classAdaptiveMCL.html" alt="AdaptiveMCL" shape="rect" coords="115,112,220,136"/>
<area href="classAlsa.html" alt="Alsa" shape="rect" coords="115,168,220,192"/>
<area href="classCameraUvc.html" alt="CameraUvc" shape="rect" coords="115,224,220,248"/>
<area href="classClodBuster.html" alt="ClodBuster" shape="rect" coords="115,280,220,304"/>
<area href="classER.html" alt="ER" shape="rect" coords="115,336,220,360"/>
<area href="classGarciaDriver.html" alt="GarciaDriver" shape="rect" coords="115,392,220,416"/>
<area href="classImageBase.html" alt="ImageBase" shape="rect" coords="115,448,220,472"/>
<area href="classKhepera.html" alt="Khepera" shape="rect" coords="115,504,220,528"/>
<area href="classP2OS.html" alt="P2OS" shape="rect" coords="115,560,220,584"/>
<area href="classREB.html" alt="REB" shape="rect" coords="115,616,220,640"/>
<area href="classRFLEX.html" alt="RFLEX" shape="rect" coords="115,672,220,696"/>
<area href="classSegwayRMP.html" alt="SegwayRMP" shape="rect" coords="115,728,220,752"/>
<area href="classSegwayRMP400.html" alt="SegwayRMP400" shape="rect" coords="115,784,220,808"/>
<area href="classsnd.html" alt="snd" shape="rect" coords="115,840,220,864"/>
<area href="classSphereDriver.html" alt="SphereDriver" shape="rect" coords="115,896,220,920"/>
<area href="classStatGrabDriver.html" alt="StatGrabDriver" shape="rect" coords="115,952,220,976"/>
<area href="classwbr914.html" alt="wbr914" shape="rect" coords="115,1008,220,1032"/>
</map>
</div>

<p><a href="classThreadedDriver-members.html">List of all members.</a></p>
<table class="memberdecls">
<tr><td colspan="2"><h2><a name="pub-methods"></a>
Public Member Functions</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classThreadedDriver.html#ac3e2d72fc21c731da8cc1948accb737b">ThreadedDriver</a> (<a class="el" href="classConfigFile.html">ConfigFile</a> *cf, int section, bool overwrite_cmds, size_t queue_maxlen, int interf)</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Constructor with implicit interface.  <a href="#ac3e2d72fc21c731da8cc1948accb737b"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classThreadedDriver.html#af5695475789e559cba90afea53603cbb">ThreadedDriver</a> (<a class="el" href="classConfigFile.html">ConfigFile</a> *cf, int section, bool overwrite_cmds=true, size_t queue_maxlen=PLAYER_MSGQUEUE_DEFAULT_MAXLEN)</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Constructor for multiple-interface drivers.  <a href="#af5695475789e559cba90afea53603cbb"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a15b40350b35008be4de9f97387e0354c"></a><!-- doxytag: member="ThreadedDriver::~ThreadedDriver" ref="a15b40350b35008be4de9f97387e0354c" args="()" -->
virtual&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classThreadedDriver.html#a15b40350b35008be4de9f97387e0354c">~ThreadedDriver</a> ()</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Destructor. <br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">virtual int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classThreadedDriver.html#a94bf4534088c9d13beaaa6dc1e968ca2">Setup</a> ()</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Initialize the driver.  <a href="#a94bf4534088c9d13beaaa6dc1e968ca2"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">virtual int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classThreadedDriver.html#a7e75af74ea086e8bfc96486fde229d4c">Shutdown</a> ()</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Finalize the driver.  <a href="#a7e75af74ea086e8bfc96486fde229d4c"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">virtual int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classThreadedDriver.html#aaea0c3049bc818bebe4c8e851eed077e">Terminate</a> ()</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Terminate the driver.  <a href="#aaea0c3049bc818bebe4c8e851eed077e"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">virtual void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classThreadedDriver.html#a962ea9c4e4e36570dd33604552726ae9">Main</a> (void)=0</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Main method for driver thread.  <a href="#a962ea9c4e4e36570dd33604552726ae9"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a7d2a2e0196fddd2399a31bbb5d56231b"></a><!-- doxytag: member="ThreadedDriver::MainSetup" ref="a7d2a2e0196fddd2399a31bbb5d56231b" args="(void)" -->
virtual int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classThreadedDriver.html#a7d2a2e0196fddd2399a31bbb5d56231b">MainSetup</a> (void)</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Sets up the resources needed by the driver thread. <br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">virtual void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classThreadedDriver.html#ae35d4f9522aace06af1ca7056af9a2ae">MainQuit</a> (void)</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Cleanup method for driver thread (called when main exits).  <a href="#ae35d4f9522aace06af1ca7056af9a2ae"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classThreadedDriver.html#a73fa72f806458014c9608d0945032f64">Wait</a> (double TimeOut=0.0)</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Wait for new data to arrive on the driver's queue.  <a href="#a73fa72f806458014c9608d0945032f64"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">virtual void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classThreadedDriver.html#ab9670f60356423813c7f263073416d66">Update</a> ()</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Update non-threaded drivers.  <a href="#ab9670f60356423813c7f263073416d66"></a><br/></td></tr>
<tr><td colspan="2"><h2><a name="pro-methods"></a>
Protected Member Functions</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a92d8d1c005bc4cd24681855daa91971a"></a><!-- doxytag: member="ThreadedDriver::StartThread" ref="a92d8d1c005bc4cd24681855daa91971a" args="(void)" -->
virtual void&nbsp;</td><td class="memItemRight" valign="bottom"><b>StartThread</b> (void)</td></tr>
<tr><td class="memItemLeft" align="right" valign="top">virtual void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classThreadedDriver.html#aa4da24d7ea63c4f720fa5e06f5e24e84">StopThread</a> (void)</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Cancel (and wait for termination) of the driver thread.  <a href="#aa4da24d7ea63c4f720fa5e06f5e24e84"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classThreadedDriver.html#a234e9ba39fbc96d1c15ad4bb023c2938">TestCancel</a> ()</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">enable thread cancellation and test for cancellation  <a href="#a234e9ba39fbc96d1c15ad4bb023c2938"></a><br/></td></tr>
<tr><td colspan="2"><h2><a name="pro-static-methods"></a>
Static Protected Member Functions</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">static void *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classThreadedDriver.html#ab1efb31b5b34becd38aca31831377728">DummyMain</a> (void *driver)</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Dummy main (just calls real main).  <a href="#ab1efb31b5b34becd38aca31831377728"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">static void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classThreadedDriver.html#a51be05f19b13727590d13aed09e4ab76">DummyMainQuit</a> (void *driver)</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Dummy main cleanup (just calls real main cleanup).  <a href="#a51be05f19b13727590d13aed09e4ab76"></a><br/></td></tr>
<tr><td colspan="2"><h2><a name="pri-attribs"></a>
Private Attributes</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">pthread_t&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classThreadedDriver.html#a6caae020be1468b7c92900c5674fa58c">driverthread</a></td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">The driver's thread.  <a href="#a6caae020be1468b7c92900c5674fa58c"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">player_thread_state_t&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classThreadedDriver.html#a10ff739ac9f6260b8046999b85b52407">ThreadState</a></td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">TODO: insert state machine here <a href="#a10ff739ac9f6260b8046999b85b52407"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a55759823eb7f505c5163076e53e10720"></a><!-- doxytag: member="ThreadedDriver::SetupSuccessful" ref="a55759823eb7f505c5163076e53e10720" args="" -->
bool&nbsp;</td><td class="memItemRight" valign="bottom"><b>SetupSuccessful</b></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a3c3c9b8f77427c1f96e3b3dfbbcbb272"></a><!-- doxytag: member="ThreadedDriver::SetupBarrier" ref="a3c3c9b8f77427c1f96e3b3dfbbcbb272" args="" -->
<a class="el" href="classPlayerBarrier.html">PlayerBarrier</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classThreadedDriver.html#a3c3c9b8f77427c1f96e3b3dfbbcbb272">SetupBarrier</a></td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Barrier to synchronise threads on setup. <br/></td></tr>
</table>
<hr/><a name="_details"></a><h2>Detailed Description</h2>
<p>Base class for drivers which oeprate with a thread. </p>
<p>This class manages driver subscriptions, threads, and data marshalling to/from device interfaces. All drivers inherit from this class, and most will overload the <a class="el" href="classThreadedDriver.html#a7d2a2e0196fddd2399a31bbb5d56231b" title="Sets up the resources needed by the driver thread.">MainSetup()</a>, <a class="el" href="classThreadedDriver.html#ae35d4f9522aace06af1ca7056af9a2ae" title="Cleanup method for driver thread (called when main exits).">MainQuit()</a> and <a class="el" href="classThreadedDriver.html#a962ea9c4e4e36570dd33604552726ae9" title="Main method for driver thread.">Main()</a> methods.</p>
<p>The <a class="el" href="classThreadedDriver.html" title="Base class for drivers which oeprate with a thread.">ThreadedDriver</a> uses a fairly simple thread model with the only complications coming from the deferred cancellation.</p>
<p>The default setup method simply calls StartThread and likewise the default Shutdown method calls StopThread. Resources for the driver should be allocated in MainSetup and cleaned up in MainQuit, these two methods will be called in the driver thread before and after the main method respectively.</p>
<p>When StopThread is called it will request the driver thread to be cancelled, this cancellation will be deffered until one of three cancellation points, ProcessMessages, Wait or TestCancel. In this way the driver has control over when the thread is cancelled.</p>
<p>If a new subscription arrives before the thread has terminated then upon completion of the MainQuit method the thread will be relaunched and MainSetup run. In this way it is gaurunteed that there is only ever one thread running for the driver and that Main is always proceeded by MainSetup and followed by MainQuit before any new threads are launched.</p>
<p>To manage the thread lifetime a small state machine is implemented, containing four states: STOPPED, RUNNING, STOPPING and RESTARTING. Initially the thread is in STOPPED state.</p>
<p>From the STOPPED state the only valid transition is to RUNNING, this is triggered by a call to StartThread.</p>
<p>From the RUNNING state the driver can transition to STOPPING, triggered by a call to StopThread.</p>
<p>In the STOPPING state the driver can transition to STOPPED, triggered by MainQuit running, or to RESTARTING on a call to StartThread.</p>
<p>From RESTARTING the driver can transition to RUNNING once MainQuit has run and the new thread is started, or to STOPPING if StopThread is called before the original thread terminates. </p>
<hr/><h2>Constructor &amp; Destructor Documentation</h2>
<a class="anchor" id="ac3e2d72fc21c731da8cc1948accb737b"></a><!-- doxytag: member="ThreadedDriver::ThreadedDriver" ref="ac3e2d72fc21c731da8cc1948accb737b" args="(ConfigFile *cf, int section, bool overwrite_cmds, size_t queue_maxlen, int interf)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">ThreadedDriver::ThreadedDriver </td>
          <td>(</td>
          <td class="paramtype"><a class="el" href="classConfigFile.html">ConfigFile</a> *&nbsp;</td>
          <td class="paramname"> <em>cf</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">int&nbsp;</td>
          <td class="paramname"> <em>section</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">bool&nbsp;</td>
          <td class="paramname"> <em>overwrite_cmds</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">size_t&nbsp;</td>
          <td class="paramname"> <em>queue_maxlen</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">int&nbsp;</td>
          <td class="paramname"> <em>interf</em></td><td>&nbsp;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td><td></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Constructor with implicit interface. </p>
<dl><dt><b>Parameters:</b></dt><dd>
  <table border="0" cellspacing="2" cellpadding="0">
    <tr><td valign="top"></td><td valign="top"><em>cf</em>&nbsp;</td><td>Current configuration file </td></tr>
    <tr><td valign="top"></td><td valign="top"><em>section</em>&nbsp;</td><td>Current section in configuration file </td></tr>
    <tr><td valign="top"></td><td valign="top"><em>overwrite_cmds</em>&nbsp;</td><td>Do new commands overwrite old ones? </td></tr>
    <tr><td valign="top"></td><td valign="top"><em>queue_maxlen</em>&nbsp;</td><td>How long can the incoming queue grow? </td></tr>
    <tr><td valign="top"></td><td valign="top"><em>interface</em>&nbsp;</td><td>The interface that you want this driver to provide </td></tr>
  </table>
  </dd>
</dl>

</div>
</div>
<a class="anchor" id="af5695475789e559cba90afea53603cbb"></a><!-- doxytag: member="ThreadedDriver::ThreadedDriver" ref="af5695475789e559cba90afea53603cbb" args="(ConfigFile *cf, int section, bool overwrite_cmds=true, size_t queue_maxlen=PLAYER_MSGQUEUE_DEFAULT_MAXLEN)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">ThreadedDriver::ThreadedDriver </td>
          <td>(</td>
          <td class="paramtype"><a class="el" href="classConfigFile.html">ConfigFile</a> *&nbsp;</td>
          <td class="paramname"> <em>cf</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">int&nbsp;</td>
          <td class="paramname"> <em>section</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">bool&nbsp;</td>
          <td class="paramname"> <em>overwrite_cmds</em> = <code>true</code>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">size_t&nbsp;</td>
          <td class="paramname"> <em>queue_maxlen</em> = <code>PLAYER_MSGQUEUE_DEFAULT_MAXLEN</code></td><td>&nbsp;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td><td></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Constructor for multiple-interface drivers. </p>
<p>Use <a class="el" href="classDriver.html#acc3440a6247ddb1965f670a3988e0b9d" title="Add an interface.">AddInterface()</a> to specify individual interfaces. </p>
<dl><dt><b>Parameters:</b></dt><dd>
  <table border="0" cellspacing="2" cellpadding="0">
    <tr><td valign="top"></td><td valign="top"><em>cf</em>&nbsp;</td><td>Current configuration file </td></tr>
    <tr><td valign="top"></td><td valign="top"><em>section</em>&nbsp;</td><td>Current section in configuration file </td></tr>
    <tr><td valign="top"></td><td valign="top"><em>overwrite_cmds</em>&nbsp;</td><td>Do new commands overwrite old ones? </td></tr>
    <tr><td valign="top"></td><td valign="top"><em>queue_maxlen</em>&nbsp;</td><td>How long can the incoming queue grow? </td></tr>
  </table>
  </dd>
</dl>

</div>
</div>
<hr/><h2>Member Function Documentation</h2>
<a class="anchor" id="ab1efb31b5b34becd38aca31831377728"></a><!-- doxytag: member="ThreadedDriver::DummyMain" ref="ab1efb31b5b34becd38aca31831377728" args="(void *driver)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">static void* ThreadedDriver::DummyMain </td>
          <td>(</td>
          <td class="paramtype">void *&nbsp;</td>
          <td class="paramname"> <em>driver</em></td>
          <td>&nbsp;)&nbsp;</td>
          <td><code> [static, protected]</code></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Dummy main (just calls real main). </p>
<p>This is used to simplify thread creation. </p>

</div>
</div>
<a class="anchor" id="a51be05f19b13727590d13aed09e4ab76"></a><!-- doxytag: member="ThreadedDriver::DummyMainQuit" ref="a51be05f19b13727590d13aed09e4ab76" args="(void *driver)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">static void ThreadedDriver::DummyMainQuit </td>
          <td>(</td>
          <td class="paramtype">void *&nbsp;</td>
          <td class="paramname"> <em>driver</em></td>
          <td>&nbsp;)&nbsp;</td>
          <td><code> [static, protected]</code></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Dummy main cleanup (just calls real main cleanup). </p>
<p>This is used to simplify thread termination. </p>

</div>
</div>
<a class="anchor" id="a962ea9c4e4e36570dd33604552726ae9"></a><!-- doxytag: member="ThreadedDriver::Main" ref="a962ea9c4e4e36570dd33604552726ae9" args="(void)=0" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">virtual void ThreadedDriver::Main </td>
          <td>(</td>
          <td class="paramtype">void&nbsp;</td>
          <td class="paramname"></td>
          <td>&nbsp;)&nbsp;</td>
          <td><code> [pure virtual]</code></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Main method for driver thread. </p>
<p>drivers have their own thread of execution, created using StartThread(); this is the entry point for the driver thread, and must be overloaded by all threaded drivers. </p>

<p>Implemented in <a class="el" href="classAlsa.html#a46a695a8a788d0039c1465389a54d855">Alsa</a>, <a class="el" href="classImageBase.html#af65bd0ce994de91ccd6ba6cc7a18f6a9">ImageBase</a>, <a class="el" href="classSphereDriver.html#a35bb7ec3584b467cf67115ea7628f385">SphereDriver</a>, <a class="el" href="classCameraUvc.html#aa36dfa343b6711548bcc0a09565c4bb6">CameraUvc</a>, <a class="el" href="classStatGrabDriver.html#a741887f2b714853541ddd2b29dddbb56">StatGrabDriver</a>, <a class="el" href="classAdaptiveMCL.html#a3d8ba8af1478245e860bc5e16f0ebb10">AdaptiveMCL</a>, <a class="el" href="classClodBuster.html#a17e7205d0e32302d52aa4dc1ef0d6c5e">ClodBuster</a>, <a class="el" href="classER.html#af2d9f11435db5bf7851fdc2a2295f00e">ER</a>, <a class="el" href="classGarciaDriver.html#a89c32a2cb2a2e8f6c5a38eed2b61a50c">GarciaDriver</a>, <a class="el" href="classKhepera.html#ae1cb404b43b6779ad8dbb715e555ae2e">Khepera</a>, <a class="el" href="classP2OS.html#ac3d15930f59fe70567cb4db0eadb6e6b">P2OS</a>, <a class="el" href="classREB.html#ab8d0630b1443e0741798613fb2bd4dc0">REB</a>, <a class="el" href="classRFLEX.html#a521224f2064ccf8a4c8b3529af3dc807">RFLEX</a>, <a class="el" href="classSegwayRMP.html#a533bab32d35b2733f40e9083d0df0531">SegwayRMP</a>, <a class="el" href="classwbr914.html#a09f9f9a3acba4e002b8f1a3b646ae392">wbr914</a>, <a class="el" href="classSegwayRMP400.html#a9307e1f4218a1fc424dc91938960fb06">SegwayRMP400</a>, and <a class="el" href="classsnd.html#aee309bd90b33851006be59b8782331d5">snd</a>.</p>

</div>
</div>
<a class="anchor" id="ae35d4f9522aace06af1ca7056af9a2ae"></a><!-- doxytag: member="ThreadedDriver::MainQuit" ref="ae35d4f9522aace06af1ca7056af9a2ae" args="(void)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">virtual void ThreadedDriver::MainQuit </td>
          <td>(</td>
          <td class="paramtype">void&nbsp;</td>
          <td class="paramname"></td>
          <td>&nbsp;)&nbsp;</td>
          <td><code> [inline, virtual]</code></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Cleanup method for driver thread (called when main exits). </p>
<p>Overload this method and to do additional cleanup when the driver thread exits. </p>

<p>Reimplemented in <a class="el" href="classAlsa.html#a7b553f911e3a72797a493eac04ed6201">Alsa</a>, <a class="el" href="classImageBase.html#afcc6276236e652af29f2c590e1a05de5">ImageBase</a>, <a class="el" href="classSphereDriver.html#a54c7eaae54358897a1211739b9db357e">SphereDriver</a>, <a class="el" href="classCameraUvc.html#ae7ea982d84a01754801ab6b75a0aeccb">CameraUvc</a>, <a class="el" href="classAdaptiveMCL.html#a8821574e1677052e8a2c0fe746884200">AdaptiveMCL</a>, <a class="el" href="classClodBuster.html#ad46b7e3b71d424825a90cef4b8817b55">ClodBuster</a>, <a class="el" href="classER.html#a5e241e5ee09297d8643916872fe27f6f">ER</a>, <a class="el" href="classGarciaDriver.html#a3223d9c9fc51ef35a7db6adcb632462e">GarciaDriver</a>, <a class="el" href="classKhepera.html#ab7d4552fbe1ac8a15eed2380b5114545">Khepera</a>, <a class="el" href="classP2OS.html#a9304ae4d2fb1750d6fd77f62cc76be6b">P2OS</a>, <a class="el" href="classREB.html#aa7dfcaa4d2bf904ed874b121bce56c2e">REB</a>, <a class="el" href="classRFLEX.html#affff879f42f059254b14430ec2b2bc83">RFLEX</a>, <a class="el" href="classSegwayRMP.html#aef2368b2aca07a6a3aa8cc7234101ad1">SegwayRMP</a>, <a class="el" href="classwbr914.html#a19ca8513ac13c5aecb821cc4ead15614">wbr914</a>, and <a class="el" href="classSegwayRMP400.html#a5748fd3e2f481374b0c41d60bf5b09f7">SegwayRMP400</a>.</p>

</div>
</div>
<a class="anchor" id="a94bf4534088c9d13beaaa6dc1e968ca2"></a><!-- doxytag: member="ThreadedDriver::Setup" ref="a94bf4534088c9d13beaaa6dc1e968ca2" args="()" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">virtual int ThreadedDriver::Setup </td>
          <td>(</td>
          <td class="paramname"></td>
          <td>&nbsp;)&nbsp;</td>
          <td><code> [virtual]</code></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Initialize the driver. </p>
<p>This function is called with the first client subscribes; it MUST be implemented by the driver.</p>
<dl class="return"><dt><b>Returns:</b></dt><dd>Returns 0 on success. </dd></dl>

<p>Reimplemented from <a class="el" href="classDriver.html#a5873d50541d254ec1eb6f472ded097b0">Driver</a>.</p>

<p>Reimplemented in <a class="el" href="classsnd.html#a72a5e2138eb746897909123a6a969784">snd</a>.</p>

<p>Referenced by <a class="el" href="classAdaptiveMCL.html#a707e47ff968aa2e91354f2602ac9bfde">AdaptiveMCL::MainSetup()</a>.</p>

</div>
</div>
<a class="anchor" id="a7e75af74ea086e8bfc96486fde229d4c"></a><!-- doxytag: member="ThreadedDriver::Shutdown" ref="a7e75af74ea086e8bfc96486fde229d4c" args="()" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">virtual int ThreadedDriver::Shutdown </td>
          <td>(</td>
          <td class="paramname"></td>
          <td>&nbsp;)&nbsp;</td>
          <td><code> [virtual]</code></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Finalize the driver. </p>
<p>This function is called with the last client unsubscribes; the default version simple stops the driver thread if one is present. In this case resources should be cleaned up in MainQuit.</p>
<dl class="return"><dt><b>Returns:</b></dt><dd>Returns 0 on success. </dd></dl>

<p>Reimplemented from <a class="el" href="classDriver.html#ac5c2d2b54949846f4f4f9c3047371b24">Driver</a>.</p>

<p>Reimplemented in <a class="el" href="classsnd.html#a0c601e3520ca8e8ba5c13e6677c4cc5a">snd</a>.</p>

<p>Referenced by <a class="el" href="classAdaptiveMCL.html#a8821574e1677052e8a2c0fe746884200">AdaptiveMCL::MainQuit()</a>.</p>

</div>
</div>
<a class="anchor" id="aa4da24d7ea63c4f720fa5e06f5e24e84"></a><!-- doxytag: member="ThreadedDriver::StopThread" ref="aa4da24d7ea63c4f720fa5e06f5e24e84" args="(void)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">virtual void ThreadedDriver::StopThread </td>
          <td>(</td>
          <td class="paramtype">void&nbsp;</td>
          <td class="paramname"></td>
          <td>&nbsp;)&nbsp;</td>
          <td><code> [protected, virtual]</code></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Cancel (and wait for termination) of the driver thread. </p>
<p>This method is usually called from the overloaded <a class="el" href="classThreadedDriver.html#a7e75af74ea086e8bfc96486fde229d4c" title="Finalize the driver.">Shutdown()</a> method to terminate the driver thread. </p>

<p>Referenced by <a class="el" href="classsnd.html#a0c601e3520ca8e8ba5c13e6677c4cc5a">snd::Shutdown()</a>.</p>

</div>
</div>
<a class="anchor" id="aaea0c3049bc818bebe4c8e851eed077e"></a><!-- doxytag: member="ThreadedDriver::Terminate" ref="aaea0c3049bc818bebe4c8e851eed077e" args="()" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">virtual int ThreadedDriver::Terminate </td>
          <td>(</td>
          <td class="paramname"></td>
          <td>&nbsp;)&nbsp;</td>
          <td><code> [virtual]</code></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Terminate the driver. </p>
<p>This method doesnt go through the niceities of unsubscribing etc, only use when the server is actually shutting down as it takes a few shortcuts</p>
<dl class="return"><dt><b>Returns:</b></dt><dd>Returns 0 on success. </dd></dl>

<p>Reimplemented from <a class="el" href="classDriver.html#a04699918bf106faeb122d0af7bc66862">Driver</a>.</p>

</div>
</div>
<a class="anchor" id="a234e9ba39fbc96d1c15ad4bb023c2938"></a><!-- doxytag: member="ThreadedDriver::TestCancel" ref="a234e9ba39fbc96d1c15ad4bb023c2938" args="()" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">void ThreadedDriver::TestCancel </td>
          <td>(</td>
          <td class="paramname"></td>
          <td>&nbsp;)&nbsp;</td>
          <td><code> [protected, virtual]</code></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>enable thread cancellation and test for cancellation </p>
<p>This should only ever be called from the driver thread with *no* locks held </p>

<p>Reimplemented from <a class="el" href="classDriver.html#aeb92d42c9416db0d0f037b38e23c4012">Driver</a>.</p>

</div>
</div>
<a class="anchor" id="ab9670f60356423813c7f263073416d66"></a><!-- doxytag: member="ThreadedDriver::Update" ref="ab9670f60356423813c7f263073416d66" args="()" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">virtual void ThreadedDriver::Update </td>
          <td>(</td>
          <td class="paramtype">void&nbsp;</td>
          <td class="paramname"></td>
          <td>&nbsp;)&nbsp;</td>
          <td><code> [inline, virtual]</code></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Update non-threaded drivers. </p>

<p>Reimplemented from <a class="el" href="classDriver.html#a6e6a19955689517a877c02afa1500822">Driver</a>.</p>

</div>
</div>
<a class="anchor" id="a73fa72f806458014c9608d0945032f64"></a><!-- doxytag: member="ThreadedDriver::Wait" ref="a73fa72f806458014c9608d0945032f64" args="(double TimeOut=0.0)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">bool ThreadedDriver::Wait </td>
          <td>(</td>
          <td class="paramtype">double&nbsp;</td>
          <td class="paramname"> <em>TimeOut</em> = <code>0.0</code></td>
          <td>&nbsp;)&nbsp;</td>
          <td><code> [virtual]</code></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Wait for new data to arrive on the driver's queue. </p>
<p>Call this method to block until a new message arrives on <a class="el" href="classDriver.html#a125eab00b72ad55885162aef7024e09b" title="Queue for all incoming messages for this driver.">Driver::InQueue</a>. This method will return true immediately if at least one message is already waiting.</p>
<p>If TimeOut is set to a positive value this method will return false if the timeout occurs before and update is recieved. </p>

<p>Reimplemented from <a class="el" href="classDriver.html#ad34ec968daab0ff82af4c01c33676003">Driver</a>.</p>

<p>Referenced by <a class="el" href="classsnd.html#aee309bd90b33851006be59b8782331d5">snd::Main()</a>, and <a class="el" href="classRFLEX.html#a521224f2064ccf8a4c8b3529af3dc807">RFLEX::Main()</a>.</p>

</div>
</div>
<hr/><h2>Member Data Documentation</h2>
<a class="anchor" id="a6caae020be1468b7c92900c5674fa58c"></a><!-- doxytag: member="ThreadedDriver::driverthread" ref="a6caae020be1468b7c92900c5674fa58c" args="" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">pthread_t <a class="el" href="classThreadedDriver.html#a6caae020be1468b7c92900c5674fa58c">ThreadedDriver::driverthread</a><code> [private]</code></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>The driver's thread. </p>
<p>The driver's thread, when managed by StartThread() and <a class="el" href="classThreadedDriver.html#aa4da24d7ea63c4f720fa5e06f5e24e84" title="Cancel (and wait for termination) of the driver thread.">StopThread()</a>. </p>

</div>
</div>
<a class="anchor" id="a10ff739ac9f6260b8046999b85b52407"></a><!-- doxytag: member="ThreadedDriver::ThreadState" ref="a10ff739ac9f6260b8046999b85b52407" args="" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">player_thread_state_t <a class="el" href="classThreadedDriver.html#a10ff739ac9f6260b8046999b85b52407">ThreadedDriver::ThreadState</a><code> [private]</code></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>TODO: insert state machine here</p>

</div>
</div>
<hr/>The documentation for this class was generated from the following file:<ul>
<li><a class="el" href="driver_8h_source.html">driver.h</a></li>
</ul>
</div>
<!-- render the modification time of the source file -->


<div class="timestamp">
<hr>

<table style="width:100%;">
<tr>
<td style="text-align:left;">
Last updated 12 September 2005 21:38:45
<!--
<td style="text-align:right;">
<a href="http://validator.w3.org/check/referer"><img style="vertical-align:middle;border:0;width:88px;height:31px"
          src="http://www.w3.org/Icons/valid-html401"
          alt="Valid HTML 4.01!"></a>

 <a href="http://jigsaw.w3.org/css-validator/">
  <img style="vertical-align:middle;border:0;width:88px;height:31px"
       src="http://jigsaw.w3.org/css-validator/images/vcss"
       alt="Valid CSS!">
 </a>
-->
</tr>
</table>
</div>


</tr>
</table>

</BODY>
</HTML>