<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Artisan Numérique</title>
  <link rel="alternate" type="text/html" href="http://artisan.karma-lab.net/node/1225"/>
  <link rel="self" type="application/atom+xml" href="http://artisan.karma-lab.net/node/1225/atom/feed"/>
  <id>http://artisan.karma-lab.net/node/1225/atom/feed</id>
  <updated>2007-12-04T02:45:39+01:00</updated>
  <entry>
    <title>TuxDroid Java API - Documentation</title>
    <link rel="alternate" type="text/html" href="http://artisan.karma-lab.net/node/1225" />
    <id>http://artisan.karma-lab.net/node/1225</id>
    <published>2007-09-21T13:06:54+02:00</published>
    <updated>2007-12-04T02:45:39+01:00</updated>
    <author>
      <name>Ulhume</name>
    </author>
    <category term="TuxDroid" />
    <category term="Aucun" />
    <category term="javafr" />
    <category term="OK" />
    <category term="Tutoriel" />
    <summary type="html"><![CDATA[
	<a name='chapter_1'></a>
  
	<a name='chapter_1'></a>
  <h2>Object hierarchy</h2>
	
	
<p>
The all API is available through one simple object, <kbd>Tux</kbd>. 
</p>
<p>
First you need to create and connect your Tux object

  <div class='code-block code-block-fragment'>
  <div class='container'>
  Tux tux <span class="sy0">=</span> <span class="kw1">new</span> Tux<span class="br0">&#40;</span><span class="st0">'localhost'</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">// if your daemon is on an other machine, change localhost to its name</span><br />
tux.<span class="me1">connect</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
  </div>
  
  </div>
</p>    ]]></summary>
    <content type="html"><![CDATA[
	<a name='chapter_1'></a>
  <h2>Object hierarchy</h2>
	
<p>
The all API is available through one simple object, <kbd>Tux</kbd>. 
</p>
<p>
First you need to create and connect your Tux object

  <div class='code-block code-block-fragment'>
  <div class='container'>
  Tux tux <span class="sy0">=</span> <span class="kw1">new</span> Tux<span class="br0">&#40;</span><span class="st0">'localhost'</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">// if your daemon is on an other machine, change localhost to its name</span><br />
tux.<span class="me1">connect</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
  </div>
  
  </div>
</p>
API allows you to control your TuxDroid from it's different body parts :
<ul>
  <li><kbd>tux</kbd>. You can control speaking, turning left and right.
<ul>
  <li>
    <kbd>tux.head()</kbd>. You can listen head button on this object.
    <ul>
      <li>
        <kbd>tux.head().eyes()</kbd>. This to control eyes opening/closing and IR emitting. You can also listen Eye movements and IR reception. No motor listening yet.
        <ul>
          <li><kbd>tux.head().eyes().left()</kbd>. This to controls Blue LED. No LED listening yet.</li>
          <li><kbd>tux.head().eyes().left()</kbd>. This to controls Blue LED. No LED listening yet</li>
       </ul>
      </li>
      <li>
        <kbd>tux.head().mouth()</kbd>. You can control mouth movement here, and also listen to mouth events. No motor listening yet.
      </li>
    </ul>
  </li>
  <li>
    <kbd>tux.wings()</kbd>. You can control wings movement here. No motor listening yet implemented.
    <ul>
      <li><kbd>tux.wings().left()</kbd>. Here to listen left wing switch.<.li>
      <li><kbd>tux.wings().right()</kbd>. Here to listen right wing switch.<.li>
    </ul>
  </li>
</ul>
</li>
</ul>
</p>


	<a name='chapter_2'></a>
  <h2>Threading model</h2>
	
<p>
  Every object can have commands and events. Commands allways return a Query object that you can use to block the call or not. 

  <div class='code-block code-block-fragment'>
  <div class='container'>
  <span class="co1">// Blocking call. Eyes will not be opened if wings are not</span><br />
Query query <span class="sy0">=</span> tux.<span class="me1">wings</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">open</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
query.<span class="me1">waitForResponse</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
tux.<span class="me1">eyes</span>.<span class="me1">open</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
<span class="co1">// Non-Blocking call. Eyes and Wings will be open at (nearly) the same time. </span><br />
tux.<span class="me1">wings</span>.<span class="me1">open</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
tux.<span class="me1">eyes</span>.<span class="me1">open</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
  </div>
  
  </div>
</p>
<p>
  When the API trigger an event, the associated call to the listener methods (we'll see that latter), are in their own thread. So if you push the head button and quickly after the right wing. Both call will occur at the same time, in tow separate threads. 
</p>

	<a name='chapter_3'></a>
  <h2>Movements</h2>
	
<p>
  Basically, all parts that have motors, have methods <kbd>open</kbd>,<kbd>close</kbd>, <kbd>isOpen</kbd>, <kbd>toggle</kbd>. Parameters depends of hardware abilities. For example wings got speed and counter, eyes got counter but no speed. 
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  <span class="co1">// I gonna fly !!</span><br />
tux.<span class="me1">head</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">eyes</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">open</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
tux.<span class="me1">wings</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">toggle</span><span class="br0">&#40;</span><span class="nu0">3</span>,Speed.<span class="me1">veryQuick</span><span class="br0">&#41;</span><span class="sy0">;</span>
  </div>
  
  </div>
</p>
<div class='inline-box note'>
All movements are blocking calls for now. This because you can't use Eyes and Mouth at the same time. This is basically because they both use the same motor. Latter I'll allows wings And (Eyes or Mouth). 
</div>
<div class='inline-box attention'>
Be careful when you close Tux Eyes. As IR receptor is located here, you'll not be able to control Tux with the remote once closed. Or you'll have to be very close to go through. 
</div>
<p>
When you want to move the all tux, you can use Tux object itself

  <div class='code-block code-block-fragment'>
  <div class='container'>
  <span class="co1">// let's dance !</span><br />
tux.<span class="me1">turnLeft</span><span class="br0">&#40;</span><span class="nu0">3</span>,Speed.<span class="me1">slow</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
tux.<span class="me1">turnRight</span><span class="br0">&#40;</span><span class="nu0">2</span>,Speed.<span class="me1">quick</span><span class="br0">&#41;</span><span class="sy0">;</span>
  </div>
  
  </div>
</p>

	<a name='chapter_4'></a>
  <h2>Lights</h2>
	
<p>
  Lights are only available on Eye object. Methods are simply <kbd>lightOn</kbd> and <kbd>lightOff</kbd>.

  <div class='code-block code-block-fragment'>
  <div class='container'>
  <span class="co1">// Lets be a cyclope</span><br />
tux.<span class="me1">eyes</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">left</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">lightOn</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
tux.<span class="me1">eyes</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">left</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">lightOff</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
  </div>
  
  </div>
</p>
<div class='inline-box note'>
Calling those methods is non-blocking.
</div>
</p>


	<a name='chapter_5'></a>
  <h2>Listening to events</h2>
	
<p>
Listening is basically the same as Swing model with some little calling differences. You always have :
<ul>
<li>An XXXEventListener interface you can implements.</li>
<li>An helper class BasicXXXEventListener that is an empty implementation of the previous interface for quick inheritance. </li>
<li>A XXXEvent object given to every XXXEventListener methods.</li>
<li>A XXXEventListeners object hosted by target body part object, generaly called XXXListeners, to add/remove your listener.</li>
</li>
</p>
<p>
For now there is 3 listeners : ButtonEventListeners that you can add to head, left wing et right wing. ShutterEventListener for eye and mouth. And RemoteControlEventListener for eyes. 

  <div class='code-block code-block-fragment'>
  <div class='container'>
  <span class="co1">// I'll dance if you tap on my head</span><br />
tux.<span class="me1">head</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">buttonListeners</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">add</span><span class="br0">&#40;</span><span class="kw1">new</span> BasicButtonEventListener<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; <span class="kw1">public</span> <span class="kw4">void</span> buttonPressed<span class="br0">&#40;</span>ButtonEvent event<span class="br0">&#41;</span> <span class="kw1">throws</span> TuxException<br />
&nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; tux.<span class="me1">wings</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">toggle</span><span class="br0">&#40;</span><span class="nu0">6</span>, Speed.<span class="me1">verySlow</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; tux.<span class="me1">wings</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">toggle</span><span class="br0">&#40;</span><span class="nu0">6</span>, Speed.<span class="me1">veryQuick</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span>
  </div>
  
  </div>
</p>
<p>
Remote Control use the same concept :

  <div class='code-block code-block-fragment'>
  <div class='container'>
  <span class="co1">// I control my Tux</span><br />
&nbsp; tux.<span class="me1">head</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">eyes</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">remoteControlListeners</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">add</span><span class="br0">&#40;</span><span class="kw1">new</span> BasicRemoteControlEventListener<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">public</span> <span class="kw4">void</span> remoteButtonPressed<span class="br0">&#40;</span>RemoteControlEvent event<span class="br0">&#41;</span> <span class="kw1">throws</span> TuxException<br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">switch</span> <span class="br0">&#40;</span>event.<span class="me1">key</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">case</span> left<span class="sy0">:</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; tux.<span class="me1">turnLeft</span><span class="br0">&#40;</span><span class="nu0">1</span>, Speed.<span class="me1">quick</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">break</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">case</span> right<span class="sy0">:</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; tux.<span class="me1">turnRight</span><span class="br0">&#40;</span><span class="nu0">1</span>, Speed.<span class="me1">quick</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">break</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; <span class="br0">&#125;</span>
  </div>
  
  </div>
</p>

<H2>Voice</H2>
<p>
  For now it's a basic but working voice implementation. There is no control on voice Yet but you can make Tux speak (with a tiny cute voice <img src="http://artisan.karma-lab.net/sites/all/modules/contrib/smileys/packs/crystal/wink2.gif" title="Wink" alt="Wink" class="smiley-content"/> in a blocking or non-blocking way. 
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  tux.<span class="me1">head</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">mouth</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">open</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">// We don't want to wait here </span><br />
tux.<span class="me1">speak</span> <span class="br0">&#40;</span><span class="st0">&quot;Hello world&quot;</span><span class="br0">&#41;</span>.<span class="me1">WaitForResponse</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">// We wait tux finish speaking</span><br />
tux.<span class="me1">head</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">mouth</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">close</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
  </div>
  
  </div>
</p>


	<a name='chapter_6'></a>
  <h2>That's all folks !</h2>
	
<p>
That's it for now, more will come soon <img src="http://artisan.karma-lab.net/sites/all/modules/contrib/smileys/packs/crystal/smile.gif" title="Smiling" alt="Smiling" class="smiley-content"/>
</p>    ]]></content>
  </entry>
</feed>
