Sophie

Sophie

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

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="#pub-attribs">Public Attributes</a> &#124;
<a href="#pro-methods">Protected Member Functions</a> &#124;
<a href="#pri-attribs">Private Attributes</a>  </div>
  <div class="headertitle">
<h1>Driver Class Reference</h1>  </div>
</div>
<div class="contents">
<!-- doxytag: class="Driver" -->
<p>Base class for all drivers.  
<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 Driver:</div>
<div class="dyncontent">
 <div class="center">
  <img src="classDriver.png" usemap="#Driver_map" alt=""/>
  <map id="Driver_map" name="Driver_map">
<area href="classErratic.html" alt="Erratic" shape="rect" coords="0,56,105,80"/>
<area href="classFromRanger.html" alt="FromRanger" shape="rect" coords="115,56,220,80"/>
<area href="classLaserTransform.html" alt="LaserTransform" shape="rect" coords="230,56,335,80"/>
<area href="classMapTransform.html" alt="MapTransform" shape="rect" coords="345,56,450,80"/>
<area href="classThreadedDriver.html" alt="ThreadedDriver" shape="rect" coords="460,56,565,80"/>
<area href="classToRanger.html" alt="ToRanger" shape="rect" coords="575,56,680,80"/>
<area href="classAdaptiveMCL.html" alt="AdaptiveMCL" shape="rect" coords="575,112,680,136"/>
<area href="classAlsa.html" alt="Alsa" shape="rect" coords="575,168,680,192"/>
<area href="classCameraUvc.html" alt="CameraUvc" shape="rect" coords="575,224,680,248"/>
<area href="classClodBuster.html" alt="ClodBuster" shape="rect" coords="575,280,680,304"/>
<area href="classER.html" alt="ER" shape="rect" coords="575,336,680,360"/>
<area href="classGarciaDriver.html" alt="GarciaDriver" shape="rect" coords="575,392,680,416"/>
<area href="classImageBase.html" alt="ImageBase" shape="rect" coords="575,448,680,472"/>
<area href="classKhepera.html" alt="Khepera" shape="rect" coords="575,504,680,528"/>
<area href="classP2OS.html" alt="P2OS" shape="rect" coords="575,560,680,584"/>
<area href="classREB.html" alt="REB" shape="rect" coords="575,616,680,640"/>
<area href="classRFLEX.html" alt="RFLEX" shape="rect" coords="575,672,680,696"/>
<area href="classSegwayRMP.html" alt="SegwayRMP" shape="rect" coords="575,728,680,752"/>
<area href="classSegwayRMP400.html" alt="SegwayRMP400" shape="rect" coords="575,784,680,808"/>
<area href="classsnd.html" alt="snd" shape="rect" coords="575,840,680,864"/>
<area href="classSphereDriver.html" alt="SphereDriver" shape="rect" coords="575,896,680,920"/>
<area href="classStatGrabDriver.html" alt="StatGrabDriver" shape="rect" coords="575,952,680,976"/>
<area href="classwbr914.html" alt="wbr914" shape="rect" coords="575,1008,680,1032"/>
</map>
</div>

<p><a href="classDriver-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"><a class="anchor" id="a5e8b4349913875538c3f3b8d7c86224e"></a><!-- doxytag: member="Driver::HasSubscriptions" ref="a5e8b4349913875538c3f3b8d7c86224e" args="()" -->
bool&nbsp;</td><td class="memItemRight" valign="bottom"><b>HasSubscriptions</b> ()</td></tr>
<tr><td class="memItemLeft" align="right" valign="top">virtual void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classDriver.html#a8ac61526abb8989ca115bd773b7cbc1a">Publish</a> (<a class="el" href="structplayer__devaddr.html">player_devaddr_t</a> addr, <a class="el" href="classQueuePointer.html">QueuePointer</a> &amp;queue, uint8_t type, uint8_t subtype, void *src=NULL, size_t deprecated=0, double *timestamp=NULL, bool copy=true)</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Publish a message via one of this driver's interfaces.  <a href="#a8ac61526abb8989ca115bd773b7cbc1a"></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="classDriver.html#a7a20aab1835fb5429da5290d55c19fc5">Publish</a> (<a class="el" href="structplayer__devaddr.html">player_devaddr_t</a> addr, uint8_t type, uint8_t subtype, void *src=NULL, size_t deprecated=0, double *timestamp=NULL, bool copy=true)</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Publish a message via one of this driver's interfaces.  <a href="#a7a20aab1835fb5429da5290d55c19fc5"></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="classDriver.html#ae26a6bd68ba5c3d114811b6789aa1542">Publish</a> (<a class="el" href="classQueuePointer.html">QueuePointer</a> &amp;queue, <a class="el" href="structplayer__msghdr.html">player_msghdr_t</a> *hdr, void *src, bool copy=true)</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Publish a message via one of this driver's interfaces.  <a href="#ae26a6bd68ba5c3d114811b6789aa1542"></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="classDriver.html#ad26174a11b4ed4837d7cd584b69cbd58">Publish</a> (<a class="el" href="structplayer__msghdr.html">player_msghdr_t</a> *hdr, void *src, bool copy=true)</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Publish a message via one of this driver's interfaces.  <a href="#ad26174a11b4ed4837d7cd584b69cbd58"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classDriver.html#ad232705313cf9168f763b1d70ee60235">Driver</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 for single-interface drivers.  <a href="#ad232705313cf9168f763b1d70ee60235"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classDriver.html#af54e042eca17926aca9c6e62a9b160fc">Driver</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="#af54e042eca17926aca9c6e62a9b160fc"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a2864fd05273f30e23aa959c92ef8a5b9"></a><!-- doxytag: member="Driver::~Driver" ref="a2864fd05273f30e23aa959c92ef8a5b9" args="()" -->
virtual&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classDriver.html#a2864fd05273f30e23aa959c92ef8a5b9">~Driver</a> ()</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Destructor. <br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classDriver.html#a3781aea32de338e42d0eb619094c29fc">GetError</a> ()</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Get last error value.  <a href="#a3781aea32de338e42d0eb619094c29fc"></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="classDriver.html#ad56aad9b98662be96c000f4e3baf0ee3">Subscribe</a> (<a class="el" href="structplayer__devaddr.html">player_devaddr_t</a> addr)</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Subscribe to this driver.  <a href="#ad56aad9b98662be96c000f4e3baf0ee3"></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="classDriver.html#a3eadafb2c33fd4565ec1d028ee34e72c">Subscribe</a> (<a class="el" href="classQueuePointer.html">QueuePointer</a> &amp;queue, <a class="el" href="structplayer__devaddr.html">player_devaddr_t</a> addr)</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Subscribe to this driver.  <a href="#a3eadafb2c33fd4565ec1d028ee34e72c"></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="classDriver.html#a0f9daeb9fbb8fd0097e3e388fef686be">Unsubscribe</a> (<a class="el" href="structplayer__devaddr.html">player_devaddr_t</a> addr)</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Unsubscribe from this driver.  <a href="#a0f9daeb9fbb8fd0097e3e388fef686be"></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="classDriver.html#a2b661ed3095dcff76137af0ea93371c0">Unsubscribe</a> (<a class="el" href="classQueuePointer.html">QueuePointer</a> &amp;queue, <a class="el" href="structplayer__devaddr.html">player_devaddr_t</a> addr)</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Unsubscribe from this driver.  <a href="#a2b661ed3095dcff76137af0ea93371c0"></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="classDriver.html#a04699918bf106faeb122d0af7bc66862">Terminate</a> ()</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Terminate the driver.  <a href="#a04699918bf106faeb122d0af7bc66862"></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="classDriver.html#a5873d50541d254ec1eb6f472ded097b0">Setup</a> ()</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Initialize the driver.  <a href="#a5873d50541d254ec1eb6f472ded097b0"></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="classDriver.html#ac5c2d2b54949846f4f4f9c3047371b24">Shutdown</a> ()</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Finalize the driver.  <a href="#ac5c2d2b54949846f4f4f9c3047371b24"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classDriver.html#a24f15e0e5b8931805f734862f5bc8a7d">ProcessMessages</a> (int maxmsgs)</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Process pending messages.  <a href="#a24f15e0e5b8931805f734862f5bc8a7d"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classDriver.html#a91c6a959c611b5ff76623e82de665f68">ProcessMessages</a> (void)</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Process pending messages.  <a href="#a91c6a959c611b5ff76623e82de665f68"></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="classDriver.html#ab05d0e8502a494a83d0442a48095a35c">ProcessMessage</a> (<a class="el" href="classQueuePointer.html">QueuePointer</a> &amp;resp_queue, <a class="el" href="structplayer__msghdr.html">player_msghdr</a> *hdr, void *data)</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><a class="el" href="classMessage.html" title="Reference-counted message objects.">Message</a> handler.  <a href="#ab05d0e8502a494a83d0442a48095a35c"></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="classDriver.html#a6e6a19955689517a877c02afa1500822">Update</a> ()</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Update non-threaded drivers.  <a href="#a6e6a19955689517a877c02afa1500822"></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="classDriver.html#a0a708bd5da3ca4ac861043e0761f2bf0">ProcessInternalMessages</a> (<a class="el" href="classQueuePointer.html">QueuePointer</a> &amp;resp_queue, <a class="el" href="structplayer__msghdr.html">player_msghdr</a> *hdr, void *data)</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Internal message handler.  <a href="#a0a708bd5da3ca4ac861043e0761f2bf0"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">virtual bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classDriver.html#a541cff86aaa91b25bba7f331adff7433">RegisterProperty</a> (const char *key, <a class="el" href="classProperty.html">Property</a> *prop, <a class="el" href="classConfigFile.html">ConfigFile</a> *cf, int section)</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><a class="el" href="classProperty.html" title="Property base class.">Property</a> registration.  <a href="#a541cff86aaa91b25bba7f331adff7433"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">virtual bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classDriver.html#a55822b2ebf41f4bd8be1427a6b1a32c3">RegisterProperty</a> (<a class="el" href="classProperty.html">Property</a> *prop, <a class="el" href="classConfigFile.html">ConfigFile</a> *cf, int section)</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight"><a class="el" href="classProperty.html" title="Property base class.">Property</a> registration.  <a href="#a55822b2ebf41f4bd8be1427a6b1a32c3"></a><br/></td></tr>
<tr><td colspan="2"><h2><a name="pub-attribs"></a>
Public Attributes</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="classQueuePointer.html">QueuePointer</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classDriver.html#a75f76dccef5f9e45877df163c984d044">ret_queue</a></td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Last requester's queue.  <a href="#a75f76dccef5f9e45877df163c984d044"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a98fc106a6ad39263aa769b37bd58905c"></a><!-- doxytag: member="Driver::device_addr" ref="a98fc106a6ad39263aa769b37bd58905c" args="" -->
<a class="el" href="structplayer__devaddr.html">player_devaddr_t</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classDriver.html#a98fc106a6ad39263aa769b37bd58905c">device_addr</a></td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Default device address (single-interface drivers). <br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classDriver.html#aa54d190deb343fcb2ace9ef133370e6d">entries</a></td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Total number of entries in the device table using this driver.  <a href="#aa54d190deb343fcb2ace9ef133370e6d"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classDriver.html#a1b4592b534e81c8ef8621c7c73c6e133">alwayson</a></td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Always on flag.  <a href="#a1b4592b534e81c8ef8621c7c73c6e133"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a125eab00b72ad55885162aef7024e09b"></a><!-- doxytag: member="Driver::InQueue" ref="a125eab00b72ad55885162aef7024e09b" args="" -->
<a class="el" href="classQueuePointer.html">QueuePointer</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classDriver.html#a125eab00b72ad55885162aef7024e09b">InQueue</a></td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Queue for all incoming messages for this driver. <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">int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classDriver.html#acc3440a6247ddb1965f670a3988e0b9d">AddInterface</a> (<a class="el" href="structplayer__devaddr.html">player_devaddr_t</a> addr)</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Add an interface.  <a href="#acc3440a6247ddb1965f670a3988e0b9d"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classDriver.html#a03584f522392eaffcf92cef4cb829664">AddInterface</a> (<a class="el" href="structplayer__devaddr.html">player_devaddr_t</a> *addr, <a class="el" href="classConfigFile.html">ConfigFile</a> *cf, int section, int code, const char *key=NULL)</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Add an interface.  <a href="#a03584f522392eaffcf92cef4cb829664"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a2995d175e821a1cd0030fd9c81e4c425"></a><!-- doxytag: member="Driver::SetError" ref="a2995d175e821a1cd0030fd9c81e4c425" args="(int code)" -->
void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classDriver.html#a2995d175e821a1cd0030fd9c81e4c425">SetError</a> (int code)</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Set/reset error code. <br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">virtual bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classDriver.html#ad34ec968daab0ff82af4c01c33676003">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="#ad34ec968daab0ff82af4c01c33676003"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aa34d9affe859655fc3535b1bc9844c5b"></a><!-- doxytag: member="Driver::AddFileWatch" ref="aa34d9affe859655fc3535b1bc9844c5b" args="(int fd, bool ReadWatch=true, bool WriteWatch=false, bool ExceptWatch=true)" -->
int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classDriver.html#aa34d9affe859655fc3535b1bc9844c5b">AddFileWatch</a> (int fd, bool ReadWatch=true, bool WriteWatch=false, bool ExceptWatch=true)</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Wake up the driver if the specified event occurs on the file descriptor. <br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a47a8a1f48b22f419809259f4f3bdb5db"></a><!-- doxytag: member="Driver::RemoveFileWatch" ref="a47a8a1f48b22f419809259f4f3bdb5db" args="(int fd, bool ReadWatch=true, bool WriteWatch=false, bool ExceptWatch=true)" -->
int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classDriver.html#a47a8a1f48b22f419809259f4f3bdb5db">RemoveFileWatch</a> (int fd, bool ReadWatch=true, bool WriteWatch=false, bool ExceptWatch=true)</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Remove a previously added watch, call with the same arguments as when adding the watch. <br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">virtual void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classDriver.html#a41a8e864600558fa601d213d229c6f81">Lock</a> (void)</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Lock access between the server and driver threads.  <a href="#a41a8e864600558fa601d213d229c6f81"></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="classDriver.html#a8bef680bc003e617ef519f6da9e116b8">Unlock</a> (void)</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Unlock access to driver internals.  <a href="#a8bef680bc003e617ef519f6da9e116b8"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ae26e814dbf896ee2cfa234cb2f03fb41"></a><!-- doxytag: member="Driver::SubscriptionLock" ref="ae26e814dbf896ee2cfa234cb2f03fb41" args="(void)" -->
virtual void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classDriver.html#ae26e814dbf896ee2cfa234cb2f03fb41">SubscriptionLock</a> (void)</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Lock to protect the subscription count for the driver. <br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">virtual void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classDriver.html#a43c1d380daa674586703eb11faf51b51">SubscriptionUnlock</a> (void)</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Unlock to protect the subscription count for the driver.  <a href="#a43c1d380daa674586703eb11faf51b51"></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="classDriver.html#aeb92d42c9416db0d0f037b38e23c4012">TestCancel</a> ()</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">enable thread cancellation and test for cancellation  <a href="#aeb92d42c9416db0d0f037b38e23c4012"></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"><a class="anchor" id="aabc652b025753167941b3fc4c18f8bbd"></a><!-- doxytag: member="Driver::error" ref="aabc652b025753167941b3fc4c18f8bbd" args="" -->
int&nbsp;</td><td class="memItemRight" valign="bottom"><b>error</b></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a56f6c0758b0346c304c0775068f8ed1c"></a><!-- doxytag: member="Driver::propertyBag" ref="a56f6c0758b0346c304c0775068f8ed1c" args="" -->
<a class="el" href="classPropertyBag.html">PropertyBag</a>&nbsp;</td><td class="memItemRight" valign="bottom"><b>propertyBag</b></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classDriver.html#aef3ca23e3cb9edd6865976d09e1f7dc4">subscriptions</a></td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Number of subscriptions to this driver.  <a href="#aef3ca23e3cb9edd6865976d09e1f7dc4"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">pthread_mutex_t&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classDriver.html#ad8a8a8a44d1f499ff5ff8d85f9436830">accessMutex</a></td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Mutex used to lock access, via <a class="el" href="classDriver.html#a41a8e864600558fa601d213d229c6f81" title="Lock access between the server and driver threads.">Lock()</a> and <a class="el" href="classDriver.html#a8bef680bc003e617ef519f6da9e116b8" title="Unlock access to driver internals.">Unlock()</a>, to driver internals, like the list of subscribed queues.  <a href="#ad8a8a8a44d1f499ff5ff8d85f9436830"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">pthread_mutex_t&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classDriver.html#abd875af4e130ef752644e0813711c45b">subscriptionMutex</a></td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Mutex used to protect the subscription count for the driver.  <a href="#abd875af4e130ef752644e0813711c45b"></a><br/></td></tr>
</table>
<hr/><a name="_details"></a><h2>Detailed Description</h2>
<p>Base class for all drivers. </p>
<p>This class manages driver subscriptions, and data marshalling to/from device interfaces. Non threaded drivers inherit directly from this class, and most will overload the <a class="el" href="classDriver.html#a5873d50541d254ec1eb6f472ded097b0" title="Initialize the driver.">Setup()</a>, <a class="el" href="classDriver.html#ac5c2d2b54949846f4f4f9c3047371b24" title="Finalize the driver.">Shutdown()</a> methods. </p>
<hr/><h2>Constructor &amp; Destructor Documentation</h2>
<a class="anchor" id="ad232705313cf9168f763b1d70ee60235"></a><!-- doxytag: member="Driver::Driver" ref="ad232705313cf9168f763b1d70ee60235" 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">Driver::Driver </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 for single-interface drivers. </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>interf</em>&nbsp;</td><td>Player interface code; e.g., PLAYER_POSITION2D_CODE </td></tr>
  </table>
  </dd>
</dl>

</div>
</div>
<a class="anchor" id="af54e042eca17926aca9c6e62a9b160fc"></a><!-- doxytag: member="Driver::Driver" ref="af54e042eca17926aca9c6e62a9b160fc" 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">Driver::Driver </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="acc3440a6247ddb1965f670a3988e0b9d"></a><!-- doxytag: member="Driver::AddInterface" ref="acc3440a6247ddb1965f670a3988e0b9d" args="(player_devaddr_t addr)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">int Driver::AddInterface </td>
          <td>(</td>
          <td class="paramtype"><a class="el" href="structplayer__devaddr.html">player_devaddr_t</a>&nbsp;</td>
          <td class="paramname"> <em>addr</em></td>
          <td>&nbsp;)&nbsp;</td>
          <td><code> [protected]</code></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Add an 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>addr</em>&nbsp;</td><td>Player device address.</td></tr>
  </table>
  </dd>
</dl>
<dl class="return"><dt><b>Returns:</b></dt><dd>0 on success, non-zero otherwise. </dd></dl>

<p>Referenced by <a class="el" href="classSegwayRMP400.html#acb6a15335d0c3af344f7dd183f844767">SegwayRMP400::SegwayRMP400()</a>, and <a class="el" href="classSphereDriver.html#aae00afd6dde3191c6393252f037fb178">SphereDriver::SphereDriver()</a>.</p>

</div>
</div>
<a class="anchor" id="a03584f522392eaffcf92cef4cb829664"></a><!-- doxytag: member="Driver::AddInterface" ref="a03584f522392eaffcf92cef4cb829664" args="(player_devaddr_t *addr, ConfigFile *cf, int section, int code, const char *key=NULL)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">int Driver::AddInterface </td>
          <td>(</td>
          <td class="paramtype"><a class="el" href="structplayer__devaddr.html">player_devaddr_t</a> *&nbsp;</td>
          <td class="paramname"> <em>addr</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></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">int&nbsp;</td>
          <td class="paramname"> <em>code</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">const char *&nbsp;</td>
          <td class="paramname"> <em>key</em> = <code>NULL</code></td><td>&nbsp;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td><td><code> [protected]</code></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Add an interface. </p>
<p>This form loads the address details from the config file and then adds the 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>addr</em>&nbsp;</td><td>Pointer to Player device address, this is filled in with the address details.</td></tr>
  </table>
  </dd>
</dl>
<dl class="return"><dt><b>Returns:</b></dt><dd>0 on success, non-zero otherwise. </dd></dl>

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

<p>Get last error value. </p>
<p>Call this after the constructor to check whether anything went wrong. </p>

</div>
</div>
<a class="anchor" id="a41a8e864600558fa601d213d229c6f81"></a><!-- doxytag: member="Driver::Lock" ref="a41a8e864600558fa601d213d229c6f81" args="(void)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">virtual void Driver::Lock </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>Lock access between the server and driver threads. </p>
<p>In particular used to procect the drivers thread pointer </p>

</div>
</div>
<a class="anchor" id="a0a708bd5da3ca4ac861043e0761f2bf0"></a><!-- doxytag: member="Driver::ProcessInternalMessages" ref="a0a708bd5da3ca4ac861043e0761f2bf0" args="(QueuePointer &amp;resp_queue, player_msghdr *hdr, void *data)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">virtual int Driver::ProcessInternalMessages </td>
          <td>(</td>
          <td class="paramtype"><a class="el" href="classQueuePointer.html">QueuePointer</a> &amp;&nbsp;</td>
          <td class="paramname"> <em>resp_queue</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype"><a class="el" href="structplayer__msghdr.html">player_msghdr</a> *&nbsp;</td>
          <td class="paramname"> <em>hdr</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">void *&nbsp;</td>
          <td class="paramname"> <em>data</em></td><td>&nbsp;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td><td><code> [virtual]</code></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Internal message handler. </p>
<p>This function handles messages internal to the driver's operation.</p>
<dl><dt><b>Parameters:</b></dt><dd>
  <table border="0" cellspacing="2" cellpadding="0">
    <tr><td valign="top"></td><td valign="top"><em>resp_queue</em>&nbsp;</td><td>The queue to which any response should go. </td></tr>
    <tr><td valign="top"></td><td valign="top"><em>hdr</em>&nbsp;</td><td>The message header </td></tr>
    <tr><td valign="top"></td><td valign="top"><em>data</em>&nbsp;</td><td>The message body </td></tr>
  </table>
  </dd>
</dl>

</div>
</div>
<a class="anchor" id="ab05d0e8502a494a83d0442a48095a35c"></a><!-- doxytag: member="Driver::ProcessMessage" ref="ab05d0e8502a494a83d0442a48095a35c" args="(QueuePointer &amp;resp_queue, player_msghdr *hdr, void *data)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">virtual int Driver::ProcessMessage </td>
          <td>(</td>
          <td class="paramtype"><a class="el" href="classQueuePointer.html">QueuePointer</a> &amp;&nbsp;</td>
          <td class="paramname"> <em>resp_queue</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype"><a class="el" href="structplayer__msghdr.html">player_msghdr</a> *&nbsp;</td>
          <td class="paramname"> <em>hdr</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">void *&nbsp;</td>
          <td class="paramname"> <em>data</em></td><td>&nbsp;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td><td><code> [virtual]</code></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p><a class="el" href="classMessage.html" title="Reference-counted message objects.">Message</a> handler. </p>
<p>This function is called once for each message in the incoming queue. Reimplement it to provide message handling. Return 0 if you handled the message and -1 otherwise</p>
<dl><dt><b>Parameters:</b></dt><dd>
  <table border="0" cellspacing="2" cellpadding="0">
    <tr><td valign="top"></td><td valign="top"><em>resp_queue</em>&nbsp;</td><td>The queue to which any response should go. </td></tr>
    <tr><td valign="top"></td><td valign="top"><em>hdr</em>&nbsp;</td><td>The message header </td></tr>
    <tr><td valign="top"></td><td valign="top"><em>data</em>&nbsp;</td><td>The message body </td></tr>
  </table>
  </dd>
</dl>

<p>Reimplemented in <a class="el" href="classAlsa.html#a7ed88e541c2471cc7bb1cebda8025e41">Alsa</a>, <a class="el" href="classImageBase.html#ae5a2a84cbe890dd5b257b2c7bb43d250">ImageBase</a>, <a class="el" href="classSphereDriver.html#aa28d5b13e311c66f663c1f68f4b09ce4">SphereDriver</a>, <a class="el" href="classCameraUvc.html#ad92b2ea6329e6f355ba350b66e1ed398">CameraUvc</a>, <a class="el" href="classLaserTransform.html#ad85a020e370ec75e3977bed61a0624f7">LaserTransform</a>, <a class="el" href="classAdaptiveMCL.html#a97cf8c8a874e314c852c73d9ee967df6">AdaptiveMCL</a>, <a class="el" href="classMapTransform.html#a4a4fc2e74cfd93df0c7c08ad2c1dca73">MapTransform</a>, <a class="el" href="classClodBuster.html#aae4c6405f68dba4402aea3d95e641c4f">ClodBuster</a>, <a class="el" href="classErratic.html#aa5efa738ad74d1bd6e6e053459f395a9">Erratic</a>, <a class="el" href="classER.html#a12a52473e8b394db5147bb9bc0624dea">ER</a>, <a class="el" href="classGarciaDriver.html#af0f620f101f28c478f3623d308247adf">GarciaDriver</a>, <a class="el" href="classKhepera.html#a7677b4bb9f6eb25531b7c418935ba9f1">Khepera</a>, <a class="el" href="classP2OS.html#a91bda6c36ac50b99c6cf4a3f9258cb8c">P2OS</a>, <a class="el" href="classRFLEX.html#ac7e6af9460ce66489b3cdb094950dbe0">RFLEX</a>, <a class="el" href="classSegwayRMP.html#a17e359d0e45f05a98a0891ffab1f2731">SegwayRMP</a>, <a class="el" href="classwbr914.html#ace8ddb319d524ee9137f150d3e03358b">wbr914</a>, <a class="el" href="classSegwayRMP400.html#a349a66282dd9c799c541014713d2cec4">SegwayRMP400</a>, <a class="el" href="classsnd.html#a92897857622d982630d9d93104fd3b42">snd</a>, <a class="el" href="classFromRanger.html#a95869a189fba3c194cad01e92639fa6d">FromRanger</a>, and <a class="el" href="classToRanger.html#a2a0a688951f0f51460c259584493e7ea">ToRanger</a>.</p>

</div>
</div>
<a class="anchor" id="a24f15e0e5b8931805f734862f5bc8a7d"></a><!-- doxytag: member="Driver::ProcessMessages" ref="a24f15e0e5b8931805f734862f5bc8a7d" args="(int maxmsgs)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">void Driver::ProcessMessages </td>
          <td>(</td>
          <td class="paramtype">int&nbsp;</td>
          <td class="paramname"> <em>maxmsgs</em></td>
          <td>&nbsp;)&nbsp;</td>
          <td></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Process pending messages. </p>
<p>Call this to automatically process messages using registered handler, <a class="el" href="classDriver.html#ab05d0e8502a494a83d0442a48095a35c" title="Message handler.">Driver::ProcessMessage</a>.</p>
<dl><dt><b>Parameters:</b></dt><dd>
  <table border="0" cellspacing="2" cellpadding="0">
    <tr><td valign="top"></td><td valign="top"><em>maxmsgs</em>&nbsp;</td><td>The maximum number of messages to process. If -1, then process until the queue is empty (this may result in an infinite loop if messages are being added to the queue faster than they are processed). If 0, then check the current length and process up to that many messages. If &gt; 0, process up to the indicated number of messages. </td></tr>
  </table>
  </dd>
</dl>

</div>
</div>
<a class="anchor" id="a91c6a959c611b5ff76623e82de665f68"></a><!-- doxytag: member="Driver::ProcessMessages" ref="a91c6a959c611b5ff76623e82de665f68" args="(void)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">void Driver::ProcessMessages </td>
          <td>(</td>
          <td class="paramtype">void&nbsp;</td>
          <td class="paramname"></td>
          <td>&nbsp;)&nbsp;</td>
          <td></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Process pending messages. </p>
<p>Equivalent to ProcessMessages(0). </p>

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

</div>
</div>
<a class="anchor" id="ad26174a11b4ed4837d7cd584b69cbd58"></a><!-- doxytag: member="Driver::Publish" ref="ad26174a11b4ed4837d7cd584b69cbd58" args="(player_msghdr_t *hdr, void *src, bool copy=true)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">virtual void Driver::Publish </td>
          <td>(</td>
          <td class="paramtype"><a class="el" href="structplayer__msghdr.html">player_msghdr_t</a> *&nbsp;</td>
          <td class="paramname"> <em>hdr</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">void *&nbsp;</td>
          <td class="paramname"> <em>src</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">bool&nbsp;</td>
          <td class="paramname"> <em>copy</em> = <code>true</code></td><td>&nbsp;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td><td><code> [virtual]</code></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Publish a message via one of this driver's interfaces. </p>
<p>Use this form of Publish if you already have the message header assembled and wish to broadcast the message to all subscribed parties. </p>
<dl><dt><b>Parameters:</b></dt><dd>
  <table border="0" cellspacing="2" cellpadding="0">
    <tr><td valign="top"></td><td valign="top"><em>hdr</em>&nbsp;</td><td>The message header </td></tr>
    <tr><td valign="top"></td><td valign="top"><em>src</em>&nbsp;</td><td>The message body </td></tr>
    <tr><td valign="top"></td><td valign="top"><em>copy</em>&nbsp;</td><td>if set to false the data will be claimed and the caller should no longer use or free it </td></tr>
  </table>
  </dd>
</dl>

</div>
</div>
<a class="anchor" id="a8ac61526abb8989ca115bd773b7cbc1a"></a><!-- doxytag: member="Driver::Publish" ref="a8ac61526abb8989ca115bd773b7cbc1a" args="(player_devaddr_t addr, QueuePointer &amp;queue, uint8_t type, uint8_t subtype, void *src=NULL, size_t deprecated=0, double *timestamp=NULL, bool copy=true)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">virtual void Driver::Publish </td>
          <td>(</td>
          <td class="paramtype"><a class="el" href="structplayer__devaddr.html">player_devaddr_t</a>&nbsp;</td>
          <td class="paramname"> <em>addr</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype"><a class="el" href="classQueuePointer.html">QueuePointer</a> &amp;&nbsp;</td>
          <td class="paramname"> <em>queue</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">uint8_t&nbsp;</td>
          <td class="paramname"> <em>type</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">uint8_t&nbsp;</td>
          <td class="paramname"> <em>subtype</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">void *&nbsp;</td>
          <td class="paramname"> <em>src</em> = <code>NULL</code>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">size_t&nbsp;</td>
          <td class="paramname"> <em>deprecated</em> = <code>0</code>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">double *&nbsp;</td>
          <td class="paramname"> <em>timestamp</em> = <code>NULL</code>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">bool&nbsp;</td>
          <td class="paramname"> <em>copy</em> = <code>true</code></td><td>&nbsp;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td><td><code> [virtual]</code></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Publish a message via one of this driver's interfaces. </p>
<p>This form of Publish will assemble the message header for you.</p>
<dl><dt><b>Parameters:</b></dt><dd>
  <table border="0" cellspacing="2" cellpadding="0">
    <tr><td valign="top"></td><td valign="top"><em>addr</em>&nbsp;</td><td>The origin address </td></tr>
    <tr><td valign="top"></td><td valign="top"><em>queue</em>&nbsp;</td><td>If non-NULL, the target queue; if NULL, then the message is sent to all interested parties. </td></tr>
    <tr><td valign="top"></td><td valign="top"><em>type</em>&nbsp;</td><td>The message type </td></tr>
    <tr><td valign="top"></td><td valign="top"><em>subtype</em>&nbsp;</td><td>The message subtype </td></tr>
    <tr><td valign="top"></td><td valign="top"><em>src</em>&nbsp;</td><td>The message body </td></tr>
    <tr><td valign="top"></td><td valign="top"><em>deprecated</em>&nbsp;</td><td>Used to be the length of the message this is now calculated </td></tr>
    <tr><td valign="top"></td><td valign="top"><em>timestamp</em>&nbsp;</td><td>Timestamp for the message body (if NULL, then the current time will be filled in) </td></tr>
    <tr><td valign="top"></td><td valign="top"><em>copy</em>&nbsp;</td><td>if set to false the data will be claimed and the caller should no longer use or free it </td></tr>
  </table>
  </dd>
</dl>

<p>Referenced by <a class="el" href="classSegwayRMP.html#a533bab32d35b2733f40e9083d0df0531">SegwayRMP::Main()</a>, <a class="el" href="classRFLEX.html#a521224f2064ccf8a4c8b3529af3dc807">RFLEX::Main()</a>, <a class="el" href="classER.html#af2d9f11435db5bf7851fdc2a2295f00e">ER::Main()</a>, <a class="el" href="classClodBuster.html#a17e7205d0e32302d52aa4dc1ef0d6c5e">ClodBuster::Main()</a>, <a class="el" href="classCameraUvc.html#aa36dfa343b6711548bcc0a09565c4bb6">CameraUvc::Main()</a>, <a class="el" href="classSegwayRMP400.html#af9a7d2442e7dbd619197c7219afd3b26">SegwayRMP400::ProcessData()</a>, <a class="el" href="classToRanger.html#a2a0a688951f0f51460c259584493e7ea">ToRanger::ProcessMessage()</a>, <a class="el" href="classSphereDriver.html#aa28d5b13e311c66f663c1f68f4b09ce4">SphereDriver::ProcessMessage()</a>, <a class="el" href="classsnd.html#a92897857622d982630d9d93104fd3b42">snd::ProcessMessage()</a>, <a class="el" href="classSegwayRMP400.html#a349a66282dd9c799c541014713d2cec4">SegwayRMP400::ProcessMessage()</a>, <a class="el" href="classRFLEX.html#ac7e6af9460ce66489b3cdb094950dbe0">RFLEX::ProcessMessage()</a>, <a class="el" href="classMapTransform.html#a4a4fc2e74cfd93df0c7c08ad2c1dca73">MapTransform::ProcessMessage()</a>, <a class="el" href="classLaserTransform.html#ad85a020e370ec75e3977bed61a0624f7">LaserTransform::ProcessMessage()</a>, <a class="el" href="classKhepera.html#a7677b4bb9f6eb25531b7c418935ba9f1">Khepera::ProcessMessage()</a>, <a class="el" href="classFromRanger.html#a95869a189fba3c194cad01e92639fa6d">FromRanger::ProcessMessage()</a>, <a class="el" href="classER.html#a12a52473e8b394db5147bb9bc0624dea">ER::ProcessMessage()</a>, <a class="el" href="classClodBuster.html#aae4c6405f68dba4402aea3d95e641c4f">ClodBuster::ProcessMessage()</a>, and <a class="el" href="classAdaptiveMCL.html#a97cf8c8a874e314c852c73d9ee967df6">AdaptiveMCL::ProcessMessage()</a>.</p>

</div>
</div>
<a class="anchor" id="a7a20aab1835fb5429da5290d55c19fc5"></a><!-- doxytag: member="Driver::Publish" ref="a7a20aab1835fb5429da5290d55c19fc5" args="(player_devaddr_t addr, uint8_t type, uint8_t subtype, void *src=NULL, size_t deprecated=0, double *timestamp=NULL, bool copy=true)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">virtual void Driver::Publish </td>
          <td>(</td>
          <td class="paramtype"><a class="el" href="structplayer__devaddr.html">player_devaddr_t</a>&nbsp;</td>
          <td class="paramname"> <em>addr</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">uint8_t&nbsp;</td>
          <td class="paramname"> <em>type</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">uint8_t&nbsp;</td>
          <td class="paramname"> <em>subtype</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">void *&nbsp;</td>
          <td class="paramname"> <em>src</em> = <code>NULL</code>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">size_t&nbsp;</td>
          <td class="paramname"> <em>deprecated</em> = <code>0</code>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">double *&nbsp;</td>
          <td class="paramname"> <em>timestamp</em> = <code>NULL</code>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">bool&nbsp;</td>
          <td class="paramname"> <em>copy</em> = <code>true</code></td><td>&nbsp;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td><td><code> [virtual]</code></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Publish a message via one of this driver's interfaces. </p>
<p>This form of Publish will assemble the message header for you. The message is broadcast to all interested parties</p>
<dl><dt><b>Parameters:</b></dt><dd>
  <table border="0" cellspacing="2" cellpadding="0">
    <tr><td valign="top"></td><td valign="top"><em>addr</em>&nbsp;</td><td>The origin address </td></tr>
    <tr><td valign="top"></td><td valign="top"><em>type</em>&nbsp;</td><td>The message type </td></tr>
    <tr><td valign="top"></td><td valign="top"><em>subtype</em>&nbsp;</td><td>The message subtype </td></tr>
    <tr><td valign="top"></td><td valign="top"><em>src</em>&nbsp;</td><td>The message body </td></tr>
    <tr><td valign="top"></td><td valign="top"><em>deprecated</em>&nbsp;</td><td>Used to be the length of the message this is now calculated </td></tr>
    <tr><td valign="top"></td><td valign="top"><em>timestamp</em>&nbsp;</td><td>Timestamp for the message body (if NULL, then the current time will be filled in) </td></tr>
    <tr><td valign="top"></td><td valign="top"><em>copy</em>&nbsp;</td><td>if set to false the data will be claimed and the caller should no longer use or free it </td></tr>
  </table>
  </dd>
</dl>

</div>
</div>
<a class="anchor" id="ae26a6bd68ba5c3d114811b6789aa1542"></a><!-- doxytag: member="Driver::Publish" ref="ae26a6bd68ba5c3d114811b6789aa1542" args="(QueuePointer &amp;queue, player_msghdr_t *hdr, void *src, bool copy=true)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">virtual void Driver::Publish </td>
          <td>(</td>
          <td class="paramtype"><a class="el" href="classQueuePointer.html">QueuePointer</a> &amp;&nbsp;</td>
          <td class="paramname"> <em>queue</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype"><a class="el" href="structplayer__msghdr.html">player_msghdr_t</a> *&nbsp;</td>
          <td class="paramname"> <em>hdr</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">void *&nbsp;</td>
          <td class="paramname"> <em>src</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">bool&nbsp;</td>
          <td class="paramname"> <em>copy</em> = <code>true</code></td><td>&nbsp;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td><td><code> [virtual]</code></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Publish a message via one of this driver's interfaces. </p>
<p>Use this form of Publish if you already have the message header assembled and have a target queue to send to. </p>
<dl><dt><b>Parameters:</b></dt><dd>
  <table border="0" cellspacing="2" cellpadding="0">
    <tr><td valign="top"></td><td valign="top"><em>queue</em>&nbsp;</td><td>the target queue. </td></tr>
    <tr><td valign="top"></td><td valign="top"><em>hdr</em>&nbsp;</td><td>The message header </td></tr>
    <tr><td valign="top"></td><td valign="top"><em>src</em>&nbsp;</td><td>The message body </td></tr>
    <tr><td valign="top"></td><td valign="top"><em>copy</em>&nbsp;</td><td>if set to false the data will be claimed and the caller should no longer use or free it </td></tr>
  </table>
  </dd>
</dl>

</div>
</div>
<a class="anchor" id="a55822b2ebf41f4bd8be1427a6b1a32c3"></a><!-- doxytag: member="Driver::RegisterProperty" ref="a55822b2ebf41f4bd8be1427a6b1a32c3" args="(Property *prop, ConfigFile *cf, int section)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">virtual bool Driver::RegisterProperty </td>
          <td>(</td>
          <td class="paramtype"><a class="el" href="classProperty.html">Property</a> *&nbsp;</td>
          <td class="paramname"> <em>prop</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></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><td>&nbsp;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td><td><code> [virtual]</code></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p><a class="el" href="classProperty.html" title="Property base class.">Property</a> registration. </p>
<p>Simplified form that uses the key already in the property </p>
<dl><dt><b>Parameters:</b></dt><dd>
  <table border="0" cellspacing="2" cellpadding="0">
    <tr><td valign="top"></td><td valign="top"><em>property</em>&nbsp;</td><td>Pointer to a <a class="el" href="classProperty.html" title="Property base class.">Property</a> object - must exist for as long as the property bag does </td></tr>
    <tr><td valign="top"></td><td valign="top"><em>cf</em>&nbsp;</td><td>Configuration file </td></tr>
    <tr><td valign="top"></td><td valign="top"><em>section</em>&nbsp;</td><td>Configuration file section that may define the property value </td></tr>
  </table>
  </dd>
</dl>
<dl class="return"><dt><b>Returns:</b></dt><dd>True if the property was registered, false otherwise </dd></dl>

</div>
</div>
<a class="anchor" id="a541cff86aaa91b25bba7f331adff7433"></a><!-- doxytag: member="Driver::RegisterProperty" ref="a541cff86aaa91b25bba7f331adff7433" args="(const char *key, Property *prop, ConfigFile *cf, int section)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">virtual bool Driver::RegisterProperty </td>
          <td>(</td>
          <td class="paramtype">const char *&nbsp;</td>
          <td class="paramname"> <em>key</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype"><a class="el" href="classProperty.html">Property</a> *&nbsp;</td>
          <td class="paramname"> <em>prop</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></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><td>&nbsp;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td><td><code> [virtual]</code></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p><a class="el" href="classProperty.html" title="Property base class.">Property</a> registration. </p>
<dl><dt><b>Parameters:</b></dt><dd>
  <table border="0" cellspacing="2" cellpadding="0">
    <tr><td valign="top"></td><td valign="top"><em>key</em>&nbsp;</td><td><a class="el" href="classProperty.html" title="Property base class.">Property</a> key </td></tr>
    <tr><td valign="top"></td><td valign="top"><em>property</em>&nbsp;</td><td>Pointer to a <a class="el" href="classProperty.html" title="Property base class.">Property</a> object - must exist for as long as the property bag does </td></tr>
    <tr><td valign="top"></td><td valign="top"><em>cf</em>&nbsp;</td><td>Configuration file </td></tr>
    <tr><td valign="top"></td><td valign="top"><em>section</em>&nbsp;</td><td>Configuration file section that may define the property value </td></tr>
  </table>
  </dd>
</dl>
<dl class="return"><dt><b>Returns:</b></dt><dd>True if the property was registered, false otherwise </dd></dl>

</div>
</div>
<a class="anchor" id="a5873d50541d254ec1eb6f472ded097b0"></a><!-- doxytag: member="Driver::Setup" ref="a5873d50541d254ec1eb6f472ded097b0" args="()" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">virtual int Driver::Setup </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>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 in <a class="el" href="classThreadedDriver.html#a94bf4534088c9d13beaaa6dc1e968ca2">ThreadedDriver</a>, <a class="el" href="classLaserTransform.html#aa3c5273497a2e440f689b9e5dced38b3">LaserTransform</a>, <a class="el" href="classMapTransform.html#aa81c864ae658640deb8b086a43ebfa1a">MapTransform</a>, <a class="el" href="classErratic.html#ac059b19b88420b27819e7b7ad7c6a590">Erratic</a>, <a class="el" href="classsnd.html#a72a5e2138eb746897909123a6a969784">snd</a>, <a class="el" href="classFromRanger.html#a5232df1398be6656d195da74dfab7269">FromRanger</a>, and <a class="el" href="classToRanger.html#af2ab9db1f9c039b0565109eb9a3058ca">ToRanger</a>.</p>

</div>
</div>
<a class="anchor" id="ac5c2d2b54949846f4f4f9c3047371b24"></a><!-- doxytag: member="Driver::Shutdown" ref="ac5c2d2b54949846f4f4f9c3047371b24" args="()" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">virtual int Driver::Shutdown </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>Finalize the driver. </p>
<p>This function is called with the last client unsubscribes.</p>
<dl class="return"><dt><b>Returns:</b></dt><dd>Returns 0 on success. </dd></dl>

<p>Reimplemented in <a class="el" href="classThreadedDriver.html#a7e75af74ea086e8bfc96486fde229d4c">ThreadedDriver</a>, <a class="el" href="classLaserTransform.html#a069f34add7646ae39ce850dbd06c6cc7">LaserTransform</a>, <a class="el" href="classMapTransform.html#a993c2ff83f8f64baf4408c46d25caa3c">MapTransform</a>, <a class="el" href="classErratic.html#a4360024f074e706497fc0fb6aa570100">Erratic</a>, <a class="el" href="classsnd.html#a0c601e3520ca8e8ba5c13e6677c4cc5a">snd</a>, <a class="el" href="classFromRanger.html#a1592dd31f607650a5df7325bb4108f64">FromRanger</a>, and <a class="el" href="classToRanger.html#a66f110ef2e487636e608c553150bddf3">ToRanger</a>.</p>

</div>
</div>
<a class="anchor" id="ad56aad9b98662be96c000f4e3baf0ee3"></a><!-- doxytag: member="Driver::Subscribe" ref="ad56aad9b98662be96c000f4e3baf0ee3" args="(player_devaddr_t addr)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">virtual int Driver::Subscribe </td>
          <td>(</td>
          <td class="paramtype"><a class="el" href="structplayer__devaddr.html">player_devaddr_t</a>&nbsp;</td>
          <td class="paramname"> <em>addr</em></td>
          <td>&nbsp;)&nbsp;</td>
          <td><code> [virtual]</code></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Subscribe to this driver. </p>
<p>The <a class="el" href="classDriver.html#ad56aad9b98662be96c000f4e3baf0ee3" title="Subscribe to this driver.">Subscribe()</a> and <a class="el" href="classDriver.html#a0f9daeb9fbb8fd0097e3e388fef686be" title="Unsubscribe from this driver.">Unsubscribe()</a> methods are used to control subscriptions to the driver; a driver MAY override them, but usually won't.</p>
<dl><dt><b>Parameters:</b></dt><dd>
  <table border="0" cellspacing="2" cellpadding="0">
    <tr><td valign="top"></td><td valign="top"><em>addr</em>&nbsp;</td><td>Address of the device to subscribe to (the driver may have more than one interface). </td></tr>
  </table>
  </dd>
</dl>
<dl class="return"><dt><b>Returns:</b></dt><dd>Returns 0 on success. </dd></dl>

<p>Reimplemented in <a class="el" href="classErratic.html#aa299b2b9882799be7d1d3eafa8deea20">Erratic</a>, <a class="el" href="classKhepera.html#a47a43c15af6c6503d65695ce26ca56b7">Khepera</a>, <a class="el" href="classP2OS.html#a41b9cfcee8fa3fd74bd1aa27d8286fac">P2OS</a>, <a class="el" href="classRFLEX.html#a7a5a79107a96615809121178a7cb1457">RFLEX</a>, and <a class="el" href="classwbr914.html#a93132cdd0e2122bf0c632b74b935384b">wbr914</a>.</p>

<p>Referenced by <a class="el" href="classSegwayRMP400.html#a844d25800afd96bc5f5fe61e0a352757">SegwayRMP400::MainSetup()</a>, <a class="el" href="classRFLEX.html#a7a5a79107a96615809121178a7cb1457">RFLEX::Subscribe()</a>, <a class="el" href="classP2OS.html#a41b9cfcee8fa3fd74bd1aa27d8286fac">P2OS::Subscribe()</a>, <a class="el" href="classKhepera.html#a47a43c15af6c6503d65695ce26ca56b7">Khepera::Subscribe()</a>, and <a class="el" href="classErratic.html#aa299b2b9882799be7d1d3eafa8deea20">Erratic::Subscribe()</a>.</p>

</div>
</div>
<a class="anchor" id="a3eadafb2c33fd4565ec1d028ee34e72c"></a><!-- doxytag: member="Driver::Subscribe" ref="a3eadafb2c33fd4565ec1d028ee34e72c" args="(QueuePointer &amp;queue, player_devaddr_t addr)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">virtual int Driver::Subscribe </td>
          <td>(</td>
          <td class="paramtype"><a class="el" href="classQueuePointer.html">QueuePointer</a> &amp;&nbsp;</td>
          <td class="paramname"> <em>queue</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype"><a class="el" href="structplayer__devaddr.html">player_devaddr_t</a>&nbsp;</td>
          <td class="paramname"> <em>addr</em></td><td>&nbsp;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td><td><code> [inline, virtual]</code></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Subscribe to this driver. </p>
<p>The <a class="el" href="classDriver.html#ad56aad9b98662be96c000f4e3baf0ee3" title="Subscribe to this driver.">Subscribe()</a> and <a class="el" href="classDriver.html#a0f9daeb9fbb8fd0097e3e388fef686be" title="Unsubscribe from this driver.">Unsubscribe()</a> methods are used to control subscriptions to the driver; a driver MAY override them, but usually won't. This alternative form includes the clients queue so you can map future requests and unsubscriptions to a specific queue.</p>
<p>If this methods returns a value other than 1 then the other form of subscribe wont be called</p>
<dl><dt><b>Parameters:</b></dt><dd>
  <table border="0" cellspacing="2" cellpadding="0">
    <tr><td valign="top"></td><td valign="top"><em>queue</em>&nbsp;</td><td>The queue of the subscribing client </td></tr>
    <tr><td valign="top"></td><td valign="top"><em>addr</em>&nbsp;</td><td>Address of the device to subscribe to (the driver may have more than one interface). </td></tr>
  </table>
  </dd>
</dl>
<dl class="return"><dt><b>Returns:</b></dt><dd>Returns 0 on success, -ve on error and 1 for unimplemented. </dd></dl>

</div>
</div>
<a class="anchor" id="a43c1d380daa674586703eb11faf51b51"></a><!-- doxytag: member="Driver::SubscriptionUnlock" ref="a43c1d380daa674586703eb11faf51b51" args="(void)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">virtual void Driver::SubscriptionUnlock </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>Unlock to protect the subscription count for the driver. </p>

</div>
</div>
<a class="anchor" id="a04699918bf106faeb122d0af7bc66862"></a><!-- doxytag: member="Driver::Terminate" ref="a04699918bf106faeb122d0af7bc66862" args="()" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">virtual int Driver::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 in <a class="el" href="classThreadedDriver.html#aaea0c3049bc818bebe4c8e851eed077e">ThreadedDriver</a>.</p>

</div>
</div>
<a class="anchor" id="aeb92d42c9416db0d0f037b38e23c4012"></a><!-- doxytag: member="Driver::TestCancel" ref="aeb92d42c9416db0d0f037b38e23c4012" args="()" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">virtual void Driver::TestCancel </td>
          <td>(</td>
          <td class="paramname"></td>
          <td>&nbsp;)&nbsp;</td>
          <td><code> [inline, 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 in <a class="el" href="classThreadedDriver.html#a234e9ba39fbc96d1c15ad4bb023c2938">ThreadedDriver</a>.</p>

</div>
</div>
<a class="anchor" id="a8bef680bc003e617ef519f6da9e116b8"></a><!-- doxytag: member="Driver::Unlock" ref="a8bef680bc003e617ef519f6da9e116b8" args="(void)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">virtual void Driver::Unlock </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>Unlock access to driver internals. </p>

</div>
</div>
<a class="anchor" id="a2b661ed3095dcff76137af0ea93371c0"></a><!-- doxytag: member="Driver::Unsubscribe" ref="a2b661ed3095dcff76137af0ea93371c0" args="(QueuePointer &amp;queue, player_devaddr_t addr)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">virtual int Driver::Unsubscribe </td>
          <td>(</td>
          <td class="paramtype"><a class="el" href="classQueuePointer.html">QueuePointer</a> &amp;&nbsp;</td>
          <td class="paramname"> <em>queue</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype"><a class="el" href="structplayer__devaddr.html">player_devaddr_t</a>&nbsp;</td>
          <td class="paramname"> <em>addr</em></td><td>&nbsp;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td><td><code> [inline, virtual]</code></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Unsubscribe from this driver. </p>
<p>The <a class="el" href="classDriver.html#ad56aad9b98662be96c000f4e3baf0ee3" title="Subscribe to this driver.">Subscribe()</a> and <a class="el" href="classDriver.html#a0f9daeb9fbb8fd0097e3e388fef686be" title="Unsubscribe from this driver.">Unsubscribe()</a> methods are used to control subscriptions to the driver; a driver MAY override them, but usually won't.This alternative form includes the clients queue so you can map future requests and unsubscriptions to a specific queue.</p>
<p>If this methods returns a value other than 1 then the other form of subscribe wont be called</p>
<dl><dt><b>Parameters:</b></dt><dd>
  <table border="0" cellspacing="2" cellpadding="0">
    <tr><td valign="top"></td><td valign="top"><em>queue</em>&nbsp;</td><td>The queue of the subscribing client </td></tr>
    <tr><td valign="top"></td><td valign="top"><em>addr</em>&nbsp;</td><td>Address of the device to unsubscribe from (the driver may have more than one interface). </td></tr>
  </table>
  </dd>
</dl>
<dl class="return"><dt><b>Returns:</b></dt><dd>Returns 0 on success. </dd></dl>

</div>
</div>
<a class="anchor" id="a0f9daeb9fbb8fd0097e3e388fef686be"></a><!-- doxytag: member="Driver::Unsubscribe" ref="a0f9daeb9fbb8fd0097e3e388fef686be" args="(player_devaddr_t addr)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">virtual int Driver::Unsubscribe </td>
          <td>(</td>
          <td class="paramtype"><a class="el" href="structplayer__devaddr.html">player_devaddr_t</a>&nbsp;</td>
          <td class="paramname"> <em>addr</em></td>
          <td>&nbsp;)&nbsp;</td>
          <td><code> [virtual]</code></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Unsubscribe from this driver. </p>
<p>The <a class="el" href="classDriver.html#ad56aad9b98662be96c000f4e3baf0ee3" title="Subscribe to this driver.">Subscribe()</a> and <a class="el" href="classDriver.html#a0f9daeb9fbb8fd0097e3e388fef686be" title="Unsubscribe from this driver.">Unsubscribe()</a> methods are used to control subscriptions to the driver; a driver MAY override them, but usually won't.</p>
<dl><dt><b>Parameters:</b></dt><dd>
  <table border="0" cellspacing="2" cellpadding="0">
    <tr><td valign="top"></td><td valign="top"><em>addr</em>&nbsp;</td><td>Address of the device to unsubscribe from (the driver may have more than one interface). </td></tr>
  </table>
  </dd>
</dl>
<dl class="return"><dt><b>Returns:</b></dt><dd>Returns 0 on success. </dd></dl>

<p>Reimplemented in <a class="el" href="classErratic.html#a6b9ad903cdbc6a8576191159e5d8432f">Erratic</a>, <a class="el" href="classKhepera.html#a7cbbb56dd32d38b9b834414aa51da37f">Khepera</a>, <a class="el" href="classP2OS.html#a9a9a48fe08bc40aafb73bf6e5ead1368">P2OS</a>, <a class="el" href="classRFLEX.html#ab408a9d0713a56603480a4c52a7d41e9">RFLEX</a>, and <a class="el" href="classwbr914.html#aeac8601fe05d521fde33f008d29879a9">wbr914</a>.</p>

<p>Referenced by <a class="el" href="classSegwayRMP400.html#a5748fd3e2f481374b0c41d60bf5b09f7">SegwayRMP400::MainQuit()</a>, <a class="el" href="classRFLEX.html#ab408a9d0713a56603480a4c52a7d41e9">RFLEX::Unsubscribe()</a>, <a class="el" href="classP2OS.html#a9a9a48fe08bc40aafb73bf6e5ead1368">P2OS::Unsubscribe()</a>, <a class="el" href="classKhepera.html#a7cbbb56dd32d38b9b834414aa51da37f">Khepera::Unsubscribe()</a>, and <a class="el" href="classErratic.html#a6b9ad903cdbc6a8576191159e5d8432f">Erratic::Unsubscribe()</a>.</p>

</div>
</div>
<a class="anchor" id="a6e6a19955689517a877c02afa1500822"></a><!-- doxytag: member="Driver::Update" ref="a6e6a19955689517a877c02afa1500822" args="()" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">virtual void Driver::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 in <a class="el" href="classThreadedDriver.html#ab9670f60356423813c7f263073416d66">ThreadedDriver</a>.</p>

</div>
</div>
<a class="anchor" id="ad34ec968daab0ff82af4c01c33676003"></a><!-- doxytag: member="Driver::Wait" ref="ad34ec968daab0ff82af4c01c33676003" args="(double TimeOut=0.0)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">virtual bool Driver::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> [protected, 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 in <a class="el" href="classThreadedDriver.html#a73fa72f806458014c9608d0945032f64">ThreadedDriver</a>.</p>

</div>
</div>
<hr/><h2>Member Data Documentation</h2>
<a class="anchor" id="ad8a8a8a44d1f499ff5ff8d85f9436830"></a><!-- doxytag: member="Driver::accessMutex" ref="ad8a8a8a44d1f499ff5ff8d85f9436830" args="" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">pthread_mutex_t <a class="el" href="classDriver.html#ad8a8a8a44d1f499ff5ff8d85f9436830">Driver::accessMutex</a><code> [private]</code></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Mutex used to lock access, via <a class="el" href="classDriver.html#a41a8e864600558fa601d213d229c6f81" title="Lock access between the server and driver threads.">Lock()</a> and <a class="el" href="classDriver.html#a8bef680bc003e617ef519f6da9e116b8" title="Unlock access to driver internals.">Unlock()</a>, to driver internals, like the list of subscribed queues. </p>

</div>
</div>
<a class="anchor" id="a1b4592b534e81c8ef8621c7c73c6e133"></a><!-- doxytag: member="Driver::alwayson" ref="a1b4592b534e81c8ef8621c7c73c6e133" args="" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">bool <a class="el" href="classDriver.html#a1b4592b534e81c8ef8621c7c73c6e133">Driver::alwayson</a></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Always on flag. </p>
<p>If true, driver should be "always on", i.e., player will "subscribe" at startup, before any clients subscribe. The "alwayson" parameter in the config file can be used to turn this feature on as well (in which case this flag will be set to reflect that setting). </p>

</div>
</div>
<a class="anchor" id="aa54d190deb343fcb2ace9ef133370e6d"></a><!-- doxytag: member="Driver::entries" ref="aa54d190deb343fcb2ace9ef133370e6d" args="" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">int <a class="el" href="classDriver.html#aa54d190deb343fcb2ace9ef133370e6d">Driver::entries</a></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Total number of entries in the device table using this driver. </p>
<p>This is updated and read by the <a class="el" href="classDevice.html" title="Encapsulates a device (i.e., a driver bound to an interface).">Device</a> class. </p>

</div>
</div>
<a class="anchor" id="a75f76dccef5f9e45877df163c984d044"></a><!-- doxytag: member="Driver::ret_queue" ref="a75f76dccef5f9e45877df163c984d044" args="" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname"><a class="el" href="classQueuePointer.html">QueuePointer</a> <a class="el" href="classDriver.html#a75f76dccef5f9e45877df163c984d044">Driver::ret_queue</a></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Last requester's queue. </p>
<p>Pointer to a queue to which this driver owes a reply. Used mainly by non-threaded drivers to cache the return address for requests that get forwarded to other devices. </p>

<p>Referenced by <a class="el" href="classToRanger.html#a2a0a688951f0f51460c259584493e7ea">ToRanger::ProcessMessage()</a>, <a class="el" href="classLaserTransform.html#ad85a020e370ec75e3977bed61a0624f7">LaserTransform::ProcessMessage()</a>, and <a class="el" href="classFromRanger.html#a95869a189fba3c194cad01e92639fa6d">FromRanger::ProcessMessage()</a>.</p>

</div>
</div>
<a class="anchor" id="abd875af4e130ef752644e0813711c45b"></a><!-- doxytag: member="Driver::subscriptionMutex" ref="abd875af4e130ef752644e0813711c45b" args="" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">pthread_mutex_t <a class="el" href="classDriver.html#abd875af4e130ef752644e0813711c45b">Driver::subscriptionMutex</a><code> [private]</code></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Mutex used to protect the subscription count for the driver. </p>

</div>
</div>
<a class="anchor" id="aef3ca23e3cb9edd6865976d09e1f7dc4"></a><!-- doxytag: member="Driver::subscriptions" ref="aef3ca23e3cb9edd6865976d09e1f7dc4" args="" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">int <a class="el" href="classDriver.html#aef3ca23e3cb9edd6865976d09e1f7dc4">Driver::subscriptions</a><code> [private]</code></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Number of subscriptions to this driver. </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>