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