Tasks contain the instructions for the attached devices and the program flow. V-Control knows three types of tasks, Cuelists, Scripts and Timestrips. Cuelists are very easy to use without real programming. Scripts contain (native compiled) Basic scripts, which makes them very powerful for all kind of applications. Timestrips are a kind of timeline and can be useful in Show Control.
V-Control can run many tasks at the same time. If multiple tasks running together, the programmer has to take care that not more then one task at a time is using the same resource. A resource is a channel or a device.
If one task is accessing a device, and another task wants to access the same device at the same time, the first task wins, the command of the second one is stored in a queue and performed if the device is free.
In Cuelists, the commands stored in a table that is processed from top to bottom. It is possible to branch to other tasks and call them as function or thread, but conditional branching is available in Scripts only.
To Create a Cuelist, select Cuelists in the Task area.
Then select Tasks → Add in main menu or via Cuelist context menu (right click) select Add Task. Alternatively the Add Task tool button or Ctrl+A does the same job.
Each task needs a unique name that is entered in the dialog box as shown above. Then we have a new (Cuelist) task that is selectable and ready to take the instructions.
So lets add the first command. In the Device List select a device (PJLink in this case). Select a Command in the Command List (SetInputVideo here) and change the parameter to match your needs. Click the Add Cmd button to add the command in the list.
The next command is a CueUp instruction for a Player. Same procedure here. Select the Device, select the command, enter a parameter and click Add Cmd.
Finally we need a Play command
Now the task is finished. The projector switches to a video input, and the player starts playing from the beginning.
To start this task switch to Run mode, select the task and click the Run Task button.
This is only possible if all the involved devices use the same driver. If you have a couple of players, all from the same type, then you can select some or all of them in the Device List. The Command that is send to the Players is generated by the last selected device.
Notice that the Channel Parameter in the Cuelist now has all the channels of the involved devices. So the command string is generated by V7300_8, but send to all selected devices.
To edit a Cue, double click on it. If the Cue contains a control command for a device, the “Add Cmd” button changes to “Update”. You can now modify the command and press the “Update” button“
In the example above we saw how to add commands to a cuelist that concerns devices. But with only that, a cuelist is to limited. If you right-click into the cue list, you will get a context menu with further commands.
One option to control a cuelists flow is the WaitForVariable command. If inserted, a window pops up to select the variable to wait for.
Let's complete the example above with the “MyBrandNewTask” cuelist. Remember that we send the player a CueUp command and a Play command. What's missing is a condition to stop playback and switch back the projectors input to another source.
In the Search field type the device name (V7300_1). now only variables are shown that belong to this device. Select the variable Position. Next we need a condition how long to wait for this variable.
At the bottom of the window there is the selected variable (V7300_1.Position in this case) and a drop down box with comparing parameters.
enter a value in the field right and click OK
If Show WaitForVariable Countdowns is set in the Options->System dialog, the a Countdown window appears showing how long the cue will wait.
Now lets complete the task and stop the player and switch the input of the projector.
The Repeat command is used to build loops. The instructions between Repeat and EndRepeat are looped as many times as entered. The Repeat command is available via Cuelist context menu (right click → Insert → Repeat) or main menu (Insert → Repeat). A dialog box asks for the number of repeats. To create endless loops, enter 0 as value.
Next, fill the part between Repeat and Endrepeat with instructions. It is possible to move the Repeat or EndRepeat command via Cut (Ctrl+X) and Paste (Ctrl+V).
In the example below we created an endless loop that plays a video from position 0 to position 500. The Delay between the Play command and the WaitForVariable command is necessary for the following reason: The player receives the two commands CueUp and Play. During this sequence, the device driver can not ask for the position, because the player is busy with the two commands. That means that the device variable Position still has the last value (500 or more). In that case the WaitForVariable Condition is true and the cue is skipped. One solution to avoid this is to set a small Delay, so the driver has time ti update the correct position. Another solution is to modify the driver. With the CueUp command we can set the Device Variable position to the value of the CueUp command. In this case we don't need the delay.
The loop sequence now looks like this:
It might be necessary to have a Delay between two commands to pause the task for a given amount of time (see example above). In the main menu select Insert → Delay or use the context menu. The Delay is specified by the value in milliseconds.
Delays displayed with a violet background in the list.
Even in complex projects it makes sense to split the whole project into several subroutines. This makes maintenance easier and gives a better overview over the projects structure. Every Task, whether a Cuelist or Script, can be a function. If a task is executed, it is usually processed from top to bottom. A CallAsFunction branches to the task specified, finishes the called task and returns to the next command in the calling task.
To call a task as function, select Insert → CallAsFunction in main menu or Cuelist context menu (right click Insert → CallAsFunction). That opens the Task Selector presenting all tasks (Cuelists and Scripts). Choose the task that has to be called.
Finally, the new CallAsFunction command in´s inserted in the Cuelist.
In contrast to CallAsFunction, a CallAsThread instruction launches the new task parallel to the calling task. The calling task is not paused during the time, the called task is executed. The programmer / operator has to take care that the two parallel running tasks don't use the same resources (devices / channels).
To create a CallAsThread instruction select Insert → CallAsThread in main menu or use the Cuelists context menu (right click Insert → CallAsThread). That opens the Task Selector presenting all tasks (Cuelists and Scripts). Choose the task that has to be called.
It might be necessary to stop a running task before it terminates regularly. This can be done manually via Stop Task tool button or as instruction from a running task. Assuming there is an endless loop working with two Players. Now the Players needed for some other action, but it is impossible to use them as long as the endless loop is running. With the StopTask command it is possible to terminate the endless loop and then use the Players in another task.
The command is available via main menu Insert → Stop Task or the Cuelists context menu. That opens the Task Selector presenting all tasks (Cuelists and Scripts). Choose the task that has to be stoped.
same as StopTask, but stops all tasks except the one that is calling this command.
The ShowMessage command is used to display a message in the status bar. Via main menu Insert → Show Message or Cuelist context menu this command is available.
If the instruction is executed, the message appears in the status bar.
Insert → Comment allows to insert a comment to the list. A comment is only for documentation purpose and should describe what happens in this part of the Cuelist.
A comment appears in the Cuelist with a dark red background.
A comment has no functionality for the script. During task execution it is ignored. The only purpose is to make notes for the user to have a documentation for the script.
The ShellExecuteAsFunction command is used to launch shell commands / scripts. It works similar to CallAsFunction, and is available via main menu Insert → Shell Execute As Function or the cuelist context menu.
A dialog asks for the shell command and optional parameters:
ShellExecute commands are displayed with red background in the cuelist.
ShellExecuteAsThread launches programs / scripts as thread ( see Shell Execute as Function). V-Control launch the shell command and returns immediately, without waiting for the shell command to finish.