Page 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. SelectPrgm expects a zero-based number, from zero to four, representing 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.
There'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 downloaded.
Programs, Tasks, and Subroutines
Each of the RCX's five programs is made up of one 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 BeginOfSub 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 the GoSub function.
As you learned in the last example, task 0 in a program 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 within a program.
The following example defines three tasks. Task 0 simply 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
.SelectPrgm 3
.BeginOfTask 0
.StartTask 1
Page 165
.StartTask 2
.EndOfTask
.BeginOfTask 1
.While 0, 0, 2, 0, 0
.PlayTone 392, 10
.PlayTone 523, 10
.PlayTone 659, 10
.PlayTone 784, 20
.PlayTone 659, 10
.PlayTone 784, 20
.Wait 2, 80
.Wait 2, 80
.EndWhile
.EndOfTask
.BeginOfTask 2
.On "02"