Page 195 - The Unofficial Guide to Lego Mindstorms Robots
P. 195

184


              int motorCommand;

              task arbitrate() {
                  while(true) {
                      if (cruiseCommand !=     COMMAND_NONE) motorCommand = cruiseCommand;
                      if (tagCommand != COMMAND_NON      E) motorCommand = tagCommand;
                      if (avoidCo  mmand != COMMAND_NONE) motorCommand = avoidCommand;
                      if (taggedCommand != COMMAND_NONE) motorCommand           = taggedCommand;
                      motorControl();
                  }
              }

          Note that the order is important. The commands in the end of the list w ill overwrite the value of motorCommand and are
          thus higher-level be haviors. For example, if both the cruise and tagged behaviors are attempting to control the robot, the
          tagged behavior takes precedence by subs uming the lower-level behavior, cruise.

          In  this  implementation,  if no behavior asserts  control,  then   motorCommand  will be unchanged, and the  robot  will just
          continue doing whatever it d id before.  This isn't an issu e, since  cruiseCommand  is always  COMMAND_FORWARD.
          However, in a different program, you might want to set motorCommand to a de fault action at the beginning of the while
          loop in arbitrate().

          Where the rubber meets the road

          The arbitrate task hands off the actual dirty work of co ntrolling the motors to a subroutine called motorControl().
          All motorControl() has to do is examine the value of  mot orCommand and set the motors accordingly. Here it is:

              sub  mo torControl() {
                  if (motorCommand == COMMAND_FORWARD)
                      OnFwd(OUT_A    + OUT_C);
                  else if (mot  orC ommand == COMMAND_REVERSE)
                      OnRev(OUT_A   + OUT_C);
                  else if (motorCommand == COMMAND_LEFT) {
                      OnRev(OUT_A);
                      OnFwd(OUT_C);
                  }
                  else if (motorCommand == COMMAND_RIGHT) {
                      OnFwd(OUT_A);
                      OnRev(OUT_C);
                  }
                  else if (motorCommand == COMMAND_STOP)
                  Off(OUT_A + OUT_C);
                  else if (motorCommand == COMMAND_FLOAT)
                  Float(OUT_A + OUT_C);
              }

          The rel a tionship between arbitrate and motorControl is important. At first glance, you might think it makes sense to
          implement motorControl as a  separate
   190   191   192   193   194   195   196   197   198   199   200