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

164


          When you run ChargeProgram, you won't hear anything. But when you select Program 5 and press the Run button, you'll
          hear the song. You have just downloaded a program to the RCX from Visual Basic!

          This example uses SelectPrgm to select the RCX's current program number. Select Prgm expects a zero-based number,
          fr om zero to four, re presenting the RCX's programs from one through five. Calling SelectPrgm 4 tells the RCX to switch
          to Program 5.

          The next unfamiliar Spirit.ocx function in this example is BeginOfTask. I'll explain more about tasks a little later; for now,
          just keep in mind that task 0 is run when you press the Run button on the RCX. Everything between the BeginOfTask and
          EndOfTask is stored as the task itself.

          T here's one  final tweak I should mention. ChargeProgram uses a helper subroutine, Pause, to give Spirit.ocx a chance to
          download the  program to the RCX before calling  CloseComm. It simply waits for a second  before shutting  down the
          communication link to the RCX. Without this pause, the program does not get fully downlo aded.

          Programs, Tasks, an d Subroutines

          Each of the RCX's five programs is made up of on e to ten tasks and zero to eight subroutines. This structure is dictated by the
          RCX firmware, and hence is  exactly the same structure that I described for NQC in Chapter 4.

          Subroutines are defined much the same  way  that tasks are defined, by framing some set of function calls with the
          B eginOfSub and EndOfSub functions.  The same restrictions on subroutines in NQC apply here; subroutines cannot call
          other subroutines or themselves. Within a task, you can call a subroutine with th e GoSub function.

          A s you learned in the last example, task 0 in a p rogram is the task that is run when you press the Run button on the RCX. It's
          up to that task  to start  whatever other tasks  you've defined.  Spirit.ocx  provides  StartTask,  StopTask, and
          StopAllTasks for controlling the execution of different tasks w ithin a program.

          The following example defines three tasks. Task 0 simp ly runs the other tasks, using StartTask. Task 1 sings a song, over
          and over, while task  2 runs the motors forward and reverse ad infinitum.

              Sub MultiTaskingProgram()
                  With DummySpiritForm.Spirit1
                      .InitComm
                      .Sel ectPrgm 3
                      .BeginOfTask 0
                           .StartTask 1
   170   171   172   173   174   175   176   177   178   179   180