Differences
This shows you the differences between two versions of the page.
Next revision | Previous revision | ||
blocks:tasks [2019-04-16 18:58] admin created |
blocks:tasks [2025-02-24 19:48] (current) admin [Tasks and Expressions] |
||
---|---|---|---|
Line 33: | Line 33: | ||
While the //Trigger// is the mere occurrence of the specified event (such as the time being 8:00 in the morning), the //Trigger Condition// can apply arbitrarily complex conditions on top of this event in order to decide whether to actually start the task. For instance, in the case of a time-of-day trigger, you can specify that it should only start the task if it's Saturday and a certain Block is playing on a particular Spot. | While the //Trigger// is the mere occurrence of the specified event (such as the time being 8:00 in the morning), the //Trigger Condition// can apply arbitrarily complex conditions on top of this event in order to decide whether to actually start the task. For instance, in the case of a time-of-day trigger, you can specify that it should only start the task if it's Saturday and a certain Block is playing on a particular Spot. | ||
- | A //Trigger Condition// often uses the predefined variable named // | + | A //Trigger Condition// often uses the predefined variable named // |
===== JavaScript Expressions ===== | ===== JavaScript Expressions ===== | ||
Line 39: | Line 39: | ||
Expressions in Blocks use JavaScript syntax. There are numerous excellent sources of information on this subject, such as this one: | Expressions in Blocks use JavaScript syntax. There are numerous excellent sources of information on this subject, such as this one: | ||
- | https:// | + | [[https:// |
Here we'll only provide a brief overview of the syntax, enough to get you started with programming of Tasks in Blocks. | Here we'll only provide a brief overview of the syntax, enough to get you started with programming of Tasks in Blocks. | ||
Line 80: | Line 80: | ||
* **"" | * **"" | ||
- | While this well known behaviors | + | While this behavior |
==== Optional Parameters ==== | ==== Optional Parameters ==== | ||
- | Task statements may need multiple parameters. The //do/ statement | + | Task statements may need multiple parameters. The //gotoControlCue/ |
- The name of the cue to go to (String). | - The name of the cue to go to (String). | ||
- Whether to search forward and then backwards, or backwards in time only (Boolean). | - Whether to search forward and then backwards, or backwards in time only (Boolean). | ||
- Which timeline to control (String). | - Which timeline to control (String). | ||
+ | |||
+ | {{ : | ||
Of these three parameters, only the first two are required. An Optional parameter is indicated by a question mark following its name, and is also marked as // | Of these three parameters, only the first two are required. An Optional parameter is indicated by a question mark following its name, and is also marked as // | ||
Line 116: | Line 118: | ||
=== Relational Operators === | === Relational Operators === | ||
- | Another type of operators allow you to compare things, such as numbers. As hey evaluate the // | + | Another type of operators allow you to compare things, such as numbers. As they evaluate the // |
- | | + | * < for "left is less than right" |
- | | + | * > for "left is greater than right" |
- | | + | * == for "left is equal to right" |
- | | + | * != for "left is not equal to right" |
For example, in the trigger condition of a task triggered by time of day, you can write: | For example, in the trigger condition of a task triggered by time of day, you can write: | ||
Line 129: | Line 131: | ||
</ | </ | ||
- | This uses the fact that the //trigger// variable (more on that below under Predefined Variables) of a task triggered by time of day is a Date object, which provides a getDay() method, returning the number of the weekday represented, | + | This uses the fact that the //trigger// variable (more on that below under "Predefined Variables") of a task triggered by time of day is a Date object, which provides a getDay() method, returning the number of the weekday represented, |
https:// | https:// | ||
Line 145: | Line 147: | ||
Here are some common boolean operators: | Here are some common boolean operators: | ||
- | | + | * && for //and//. |
- | | + | * || for //or//. |
- | | + | * ! for //not//. |
The && and || operators take two values (one on each side of the operator). Thus, if you want to run a task //only// on weekends, you could write a condition like this: | The && and || operators take two values (one on each side of the operator). Thus, if you want to run a task //only// on weekends, you could write a condition like this: | ||
Line 157: | Line 159: | ||
Which reads "day is equal to 0 //or// day is equal to 6". | Which reads "day is equal to 0 //or// day is equal to 6". | ||
- | The last of the three boolean | + | The //not// (exclamation point) |
For instance, assume you want to trigger a task only if an contact closure input is //not// activated, then you could write a condition like this | For instance, assume you want to trigger a task only if an contact closure input is //not// activated, then you could write a condition like this | ||
Line 202: | Line 204: | ||
===== Variables ===== | ===== Variables ===== | ||
- | The true power of expressions | + | The true power of expressions |
As an example, to trigger a task only if a certain input signal is present, simply refer to the value of that input in the trigger condition: | As an example, to trigger a task only if a certain input signal is present, simply refer to the value of that input in the trigger condition: | ||
Line 222: | Line 224: | ||
==== Predefined Variables ==== | ==== Predefined Variables ==== | ||
- | In addition to all system properties of you Blocks system, you also have access to the following predefined variables in tasks and their trigger condition field: | + | In addition to all system properties of your Blocks system, you also have access to the following predefined variables in tasks and their trigger condition field: |
* **trigger** contains the value of whatever triggered the task. | * **trigger** contains the value of whatever triggered the task. | ||
Line 230: | Line 232: | ||
* If the triggering mode is “Time of Day”; it's a JavaScript Date object. | * If the triggering mode is “Time of Day”; it's a JavaScript Date object. | ||
- | * If the triggering mode is “Property Change” it's a number, boolean | + | * For “Property Change” it's a number, boolean, string |
+ | * For " | ||
If no trigger is assigned to the task, the value of //trigger// is undefined, and should not be used. Note that //trigger// will contain the current value of the tasks trigger even if the task was started by other means, such as manually clicking the //play// arrow next to the task's name, or by setting the task's //running// property to true. | If no trigger is assigned to the task, the value of //trigger// is undefined, and should not be used. Note that //trigger// will contain the current value of the tasks trigger even if the task was started by other means, such as manually clicking the //play// arrow next to the task's name, or by setting the task's //running// property to true. | ||
Line 236: | Line 239: | ||
==== Realm Variables ==== | ==== Realm Variables ==== | ||
- | You can add externally visible variables to a Realm. When doing o, you specify the data type used by that variable (number, boolean or string). Such a variable can be set frmo the outside, for example using a button on a panel, or by another task (using a //set realm variable// statement). | + | You can add externally visible variables to a Realm. When doing so, you specify the data type used by that variable (number, boolean or string). Such a variable can be set frmo the outside, for example using a button on a panel, or by another task (using a //set realm variable// statement). |
The value of such a realm variable can be used as a trigger, just like any other system property. You can also directly reference the value of a realm variable in any task within the same realm using the name of the variable followed by a period and the work //value//. Assuming you have a realm variable named // | The value of such a realm variable can be used as a trigger, just like any other system property. You can also directly reference the value of a realm variable in any task within the same realm using the name of the variable followed by a period and the work //value//. Assuming you have a realm variable named // | ||
Line 246: | Line 249: | ||
==== Local Variables ==== | ==== Local Variables ==== | ||
- | A local variable is often useful to hold intermediate results, or other values you want to use multiple times in a task. For example, to create a simple lighting chaser effect, you can use a //while// loop with the sequence of statements needed to control the lights, interspersed with /7wait// statements to control the speed of the effect. If you're unsure of what speed will work best, you can assign the value to a local variable called //speed//, and then use that variable in the wait statements: | + | A local variable is often useful to hold intermediate results, or other values you want to use multiple times in a task. For example, to create a simple lighting chaser effect, you can use a //while// loop with the sequence of statements needed to control the lights, interspersed with //wait// statements to control the speed of the effect. If you're unsure of what speed will work best, you can assign the value to a local variable called //speed//, and then use that variable in the wait statements: |
{{ : | {{ : | ||
Line 257: | Line 260: | ||
==== Property References ==== | ==== Property References ==== | ||
- | As seen in some of the example | + | As seen in some of the examples |
- | Some properties are //read only//. An example of such a read only property is the // | + | Some properties are //read only//. An example of such a read only property is the // |
The value of a system property can also be directly used in expressions. Since such an expression typically consists of more than just a single property reference, you need to enter the full path to the property manually here. | The value of a system property can also be directly used in expressions. Since such an expression typically consists of more than just a single property reference, you need to enter the full path to the property manually here. | ||
Line 289: | Line 292: | ||
</ | </ | ||
- | The expression inside the brackets performa string concatenation, | + | The expression inside the brackets performa string concatenation, |