<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="https://wiki.zenerves.net/skins/common/feed.css?301"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-gb">
		<id>https://wiki.zenerves.net/index.php?action=history&amp;feed=atom&amp;title=Spitter</id>
		<title>Spitter - Revision history</title>
		<link rel="self" type="application/atom+xml" href="https://wiki.zenerves.net/index.php?action=history&amp;feed=atom&amp;title=Spitter"/>
		<link rel="alternate" type="text/html" href="https://wiki.zenerves.net/index.php?title=Spitter&amp;action=history"/>
		<updated>2026-05-04T12:43:54Z</updated>
		<subtitle>Revision history for this page on the wiki</subtitle>
		<generator>MediaWiki 1.17.0</generator>

	<entry>
		<id>https://wiki.zenerves.net/index.php?title=Spitter&amp;diff=26&amp;oldid=prev</id>
		<title>Admin: 1 revision</title>
		<link rel="alternate" type="text/html" href="https://wiki.zenerves.net/index.php?title=Spitter&amp;diff=26&amp;oldid=prev"/>
				<updated>2011-10-14T20:49:21Z</updated>
		
		<summary type="html">&lt;p&gt;1 revision&lt;/p&gt;
&lt;table style=&quot;background-color: white; color:black;&quot;&gt;
		&lt;tr valign='top'&gt;
		&lt;td colspan='1' style=&quot;background-color: white; color:black;&quot;&gt;← Older revision&lt;/td&gt;
		&lt;td colspan='1' style=&quot;background-color: white; color:black;&quot;&gt;Revision as of 20:49, 14 October 2011&lt;/td&gt;
		&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>https://wiki.zenerves.net/index.php?title=Spitter&amp;diff=25&amp;oldid=prev</id>
		<title>Lola: Protected &quot;Spitter&quot; [edit=autoconfirmed:move=autoconfirmed]</title>
		<link rel="alternate" type="text/html" href="https://wiki.zenerves.net/index.php?title=Spitter&amp;diff=25&amp;oldid=prev"/>
				<updated>2011-04-10T15:48:20Z</updated>
		
		<summary type="html">&lt;p&gt;Protected &amp;quot;&lt;a href=&quot;/index.php?title=Spitter&quot; title=&quot;Spitter&quot;&gt;Spitter&lt;/a&gt;&amp;quot; [edit=autoconfirmed:move=autoconfirmed]&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt; /*&lt;br /&gt;
 * spitter.nxc&lt;br /&gt;
 * Version 1.1, December 2006&lt;br /&gt;
 *&lt;br /&gt;
 * Sivan Toledo&lt;br /&gt;
 *&lt;br /&gt;
 * Physical Robot Structure:&lt;br /&gt;
 * spitting motor A turns the wheels&lt;br /&gt;
 * throat   motor B opens the throat&lt;br /&gt;
 * scanning motor C turns the US sensor&lt;br /&gt;
 * light sensor senses paper pellets, port 1&lt;br /&gt;
 * sound sensor waits for long quiet periods and complains, port 2&lt;br /&gt;
 * US sensor searches for something close, turns to him/her&lt;br /&gt;
 *    to ask for food, on port 4&lt;br /&gt;
 * see http://www.tau.ac.il/~stoledo/lego/Spitter/ for details&lt;br /&gt;
 *&lt;br /&gt;
 * Version 1.0 was compiled successfully with beta 15 of NBC/NXC&lt;br /&gt;
 * Version 1.1 work in progress for beta 16&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
 &lt;br /&gt;
 u8 y_sound_level        = 0;&lt;br /&gt;
 u8 y_light_level        = 10;&lt;br /&gt;
 u8 y_us_level           = 20;&lt;br /&gt;
 u8 y_angle              = 30;&lt;br /&gt;
 u8 y_time_since_eating  = 40;&lt;br /&gt;
 u8 y_time_since_loud    = 50;&lt;br /&gt;
 u8 y_time_since_calling = 60;&lt;br /&gt;
 u8 x_number             = 72;&lt;br /&gt;
 &lt;br /&gt;
 u32 quiet_timeout  = 15000;&lt;br /&gt;
 u32 feedme_timeout = 30000;&lt;br /&gt;
 &lt;br /&gt;
 u32 base_quiet_timeout  = 15000;&lt;br /&gt;
 u32 base_feedme_timeout = 30000;&lt;br /&gt;
 &lt;br /&gt;
 u32 max_quiet_timeout  = 150000;&lt;br /&gt;
 u32 max_feedme_timeout = 300000;&lt;br /&gt;
 &lt;br /&gt;
 u8 l;&lt;br /&gt;
 mutex eating_state_mutex;&lt;br /&gt;
 u8    eating_state = 0; // not eating&lt;br /&gt;
 u32   eating_time  = 0; // already hungry!&lt;br /&gt;
 &lt;br /&gt;
 task eating()&lt;br /&gt;
 {&lt;br /&gt;
  //Follows(main);&lt;br /&gt;
 &lt;br /&gt;
  SetSensorType(IN_1, IN_TYPE_LIGHT_ACTIVE);&lt;br /&gt;
  SetSensorMode(IN_1, IN_MODE_PCTFULLSCALE);&lt;br /&gt;
  ResetSensor(IN_1);&lt;br /&gt;
 &lt;br /&gt;
  while (TRUE) {&lt;br /&gt;
    l = Sensor(IN_1);&lt;br /&gt;
 &lt;br /&gt;
    TextOut(0,        y_light_level, &amp;quot;light level: &amp;quot; );&lt;br /&gt;
    TextOut(x_number, y_light_level, &amp;quot;    &amp;quot; );&lt;br /&gt;
    NumOut (x_number, y_light_level, l );&lt;br /&gt;
 &lt;br /&gt;
    if (l &amp;gt; 40) {&lt;br /&gt;
      // the light sensor saw a white paper pellet&lt;br /&gt;
 &lt;br /&gt;
      Acquire(eating_state_mutex);&lt;br /&gt;
      StopSound(); // stop talking, if we're taking&lt;br /&gt;
      eating_state = 1;&lt;br /&gt;
      eating_time  = CurrentTick();&lt;br /&gt;
      Release(eating_state_mutex);&lt;br /&gt;
 &lt;br /&gt;
      PlayFile(&amp;quot;yuck.rso&amp;quot;);&lt;br /&gt;
      while (SoundFlags() != SOUND_FLAGS_IDLE);&lt;br /&gt;
 &lt;br /&gt;
      quiet_timeout  = base_quiet_timeout;&lt;br /&gt;
      feedme_timeout = base_feedme_timeout;&lt;br /&gt;
 &lt;br /&gt;
      // turn motor A on&lt;br /&gt;
      OnFwd(OUT_A, 100);&lt;br /&gt;
      // wait for them to spin fast&lt;br /&gt;
      Wait(2000);&lt;br /&gt;
      // open the throat&lt;br /&gt;
      OnFwd(OUT_B, 40);&lt;br /&gt;
      // wait for the throat to open fully&lt;br /&gt;
      Wait(500);&lt;br /&gt;
      Off(OUT_B);&lt;br /&gt;
      Wait(1000);&lt;br /&gt;
      // wait for the pellets to drop and be spitted out&lt;br /&gt;
      Wait(2000);&lt;br /&gt;
      // close the mouth and stop the wheels&lt;br /&gt;
      OnRev(OUT_B, 40);&lt;br /&gt;
      Coast(OUT_A);&lt;br /&gt;
      Wait(500);&lt;br /&gt;
      Off(OUT_B);&lt;br /&gt;
      Off(OUT_A);&lt;br /&gt;
 &lt;br /&gt;
      Acquire(eating_state_mutex);&lt;br /&gt;
      eating_state = 0;&lt;br /&gt;
      Release(eating_state_mutex);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 task listening()&lt;br /&gt;
 {&lt;br /&gt;
  u32 last_loud;&lt;br /&gt;
  u8  sound_level;&lt;br /&gt;
  SetSensorType(IN_2, IN_TYPE_SOUND_DB);&lt;br /&gt;
  SetSensorMode(IN_2, IN_MODE_PCTFULLSCALE);&lt;br /&gt;
  ResetSensor(IN_2);&lt;br /&gt;
 &lt;br /&gt;
  last_loud = CurrentTick(); // pretend it's loud when we start&lt;br /&gt;
 &lt;br /&gt;
  while (TRUE) {&lt;br /&gt;
    sound_level = Sensor(IN_2);&lt;br /&gt;
    if (sound_level &amp;gt; 20)&lt;br /&gt;
      last_loud = CurrentTick();&lt;br /&gt;
    if (sound_level &amp;gt; 50)&lt;br /&gt;
      quiet_timeout = base_quiet_timeout; // loud, Spitter gets impatient&lt;br /&gt;
 &lt;br /&gt;
    TextOut(0,        y_sound_level, &amp;quot;sound level: &amp;quot; );&lt;br /&gt;
    TextOut(x_number, y_sound_level, &amp;quot;    &amp;quot; );&lt;br /&gt;
    NumOut(x_number,  y_sound_level, sound_level);&lt;br /&gt;
 &lt;br /&gt;
    TextOut(0,        y_time_since_loud, &amp;quot;T loud: &amp;quot; );&lt;br /&gt;
    TextOut(x_number, y_time_since_loud, &amp;quot;    &amp;quot; );&lt;br /&gt;
    NumOut(x_number,  y_time_since_loud, (CurrentTick()-last_loud)/1000);&lt;br /&gt;
 &lt;br /&gt;
    if (CurrentTick() - last_loud &amp;gt; quiet_timeout) {&lt;br /&gt;
      last_loud = CurrentTick(); // I'm talking!&lt;br /&gt;
      PlayFile(&amp;quot;itsquiet.rso&amp;quot; );&lt;br /&gt;
      quiet_timeout = 2*quiet_timeout;&lt;br /&gt;
      if (quiet_timeout &amp;gt; max_quiet_timeout)&lt;br /&gt;
        quiet_timeout = max_quiet_timeout;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    Wait(500);&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 task scanning()&lt;br /&gt;
 {&lt;br /&gt;
  u8  usdist;&lt;br /&gt;
  u8  mindist;&lt;br /&gt;
  s16 scn_deg;&lt;br /&gt;
  s16 mindeg;&lt;br /&gt;
  u8  hungry = FALSE;&lt;br /&gt;
  u32 time_since_calling;&lt;br /&gt;
  u32 time_since_eating;&lt;br /&gt;
  u32 calling_time = 0;&lt;br /&gt;
 &lt;br /&gt;
  while (TRUE) {&lt;br /&gt;
 &lt;br /&gt;
    Acquire(eating_state_mutex);&lt;br /&gt;
    time_since_eating = CurrentTick() - eating_time;&lt;br /&gt;
    Release(eating_state_mutex);&lt;br /&gt;
 &lt;br /&gt;
    TextOut(0,        y_time_since_eating, &amp;quot;T feeding: &amp;quot; );&lt;br /&gt;
    TextOut(x_number, y_time_since_eating, &amp;quot;    &amp;quot; );&lt;br /&gt;
    NumOut(x_number,  y_time_since_eating, time_since_eating/1000);&lt;br /&gt;
 &lt;br /&gt;
    TextOut(0,        y_time_since_calling, &amp;quot;T calling: &amp;quot; );&lt;br /&gt;
    TextOut(x_number, y_time_since_calling, &amp;quot;    &amp;quot; );&lt;br /&gt;
    NumOut(x_number,  y_time_since_calling, (CurrentTick() - calling_time)/1000);&lt;br /&gt;
 &lt;br /&gt;
    if (time_since_eating &amp;gt; feedme_timeout &amp;amp;&amp;amp;&lt;br /&gt;
        (CurrentTick() - calling_time) &amp;gt; feedme_timeout) {&lt;br /&gt;
 &lt;br /&gt;
      calling_time = CurrentTick();&lt;br /&gt;
 &lt;br /&gt;
      mindist = 255;&lt;br /&gt;
      SetSensorLowspeed(IN_4);&lt;br /&gt;
      RotateMotor( OUT_C, 30, -100 );&lt;br /&gt;
      Wait(100);&lt;br /&gt;
      for (scn_deg=-100; scn_deg &amp;lt; 100; scn_deg += 10) {&lt;br /&gt;
        usdist = SensorUS(IN_4);&lt;br /&gt;
        if (usdist &amp;lt; mindist) {&lt;br /&gt;
          mindist = usdist;&lt;br /&gt;
          mindeg  = scn_deg;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        TextOut(0,        y_us_level, &amp;quot;us distance: &amp;quot; );&lt;br /&gt;
        TextOut(x_number, y_us_level, &amp;quot;    &amp;quot; );&lt;br /&gt;
        NumOut(x_number,  y_us_level, usdist );&lt;br /&gt;
 &lt;br /&gt;
        TextOut(0,        y_angle, &amp;quot;angle: &amp;quot; );&lt;br /&gt;
        TextOut(x_number, y_angle, &amp;quot;    &amp;quot; );&lt;br /&gt;
        NumOut(x_number,  y_angle, scn_deg);&lt;br /&gt;
 &lt;br /&gt;
        RotateMotor( OUT_C, 30,  10 );&lt;br /&gt;
        Wait(100);&lt;br /&gt;
      }&lt;br /&gt;
      RotateMotor( OUT_C, 30, -100 );&lt;br /&gt;
      Wait(500);&lt;br /&gt;
 &lt;br /&gt;
      if (mindist &amp;lt; 255) {&lt;br /&gt;
        RotateMotor( OUT_C, 30,  mindeg );&lt;br /&gt;
        PlayFile(&amp;quot;feedme.rso&amp;quot;);&lt;br /&gt;
        //while (SoundState() != SOUND_STATE_IDLE) // || SoundFlags() != SOUND_FLAGS_IDLE)&lt;br /&gt;
        while (SoundFlags() != SOUND_FLAGS_IDLE);&lt;br /&gt;
        PlayFile(&amp;quot;feedme.rso&amp;quot;);&lt;br /&gt;
        while (SoundFlags() != SOUND_FLAGS_IDLE);&lt;br /&gt;
        PlayFile(&amp;quot;feedme.rso&amp;quot;);&lt;br /&gt;
        while (SoundFlags() != SOUND_FLAGS_IDLE);&lt;br /&gt;
        RotateMotor( OUT_C, 30,  -mindeg );&lt;br /&gt;
      }&lt;br /&gt;
 &lt;br /&gt;
      feedme_timeout = 2*feedme_timeout;&lt;br /&gt;
      if (feedme_timeout &amp;gt; max_feedme_timeout)&lt;br /&gt;
        feedme_timeout = max_feedme_timeout;&lt;br /&gt;
 &lt;br /&gt;
    }&lt;br /&gt;
    Wait(1000);&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 task keepalive()&lt;br /&gt;
 {&lt;br /&gt;
  while (true) {&lt;br /&gt;
    ResetSleepTimer();&lt;br /&gt;
    Wait(60000);&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // the main task only starts the other ones&lt;br /&gt;
 &lt;br /&gt;
 task main()&lt;br /&gt;
 {&lt;br /&gt;
  //Precedes(listening, eating, scanning, keepalive);&lt;br /&gt;
  Precedes(listening, eating, scanning, keepalive);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:NXT]][[Category:Snippets]]&lt;/div&gt;</summary>
		<author><name>Lola</name></author>	</entry>

	</feed>