Sometimes you may want to perform a command if a particular variable is within a certain range. For example, you might want to show a "Save energy" button only when there were between 3 and 6 pieces of equipment in the On state. Okay, so this is a weird example...

In my case, I have an overlay with 9 buttons on them, and if I only need 6, then I want to clear the 3 I don't need and display the 6 I do.

Dependencies

This structure utilitizes MLConditional and MLMath.

Command structure

If (myVar <= maxValue) And (myVar >= minValue) Then ...

Code: Select all

`MLServeCmd.Macro|`

SetVariable|testValue~{{myVar}}

MLConditional|IsEqual##{{testValue}}##maxValue##MLMath|SUBTRACT~testValue~1##!

MLConditional|IsEqual##{{testValue}}##maxValue - 1##MLMath|SUBTRACT~testValue~1##!

.

.

MLConditional|IsEqual##{{testValue}}##minValue##Command1##ElseCommand1!

MLConditional|IsEqual##{{testValue}}##minValue##Command2##ElseCommand2!

.

.

MLConditional|IsEqual##{{testValue}}##minValue##CommandN##ElseCommandN

Of course you don't have to populate all the Else commands.

Sample for "If (myVar >= 2) and (myVar <= 5) Then Set Variable Result to CarPoolOK Else Set Variable Result to NoCarPool"

Code: Select all

`MLServeCmd.Macro|`

SetVariable|testValue~{{myVar}}

MLConditional|IsEqual##{{testValue}}##5##MLMath|SUBTRACT~testValue~1##!

MLConditional|IsEqual##{{testValue}}##4##MLMath|SUBTRACT~testValue~1##!

MLConditional|IsEqual##{{testValue}}##3##MLMath|SUBTRACT~testValue~1##!

MLConditional|IsEqual##{{testValue}}##2##SetVariable|Result~CarPoolOK##SetVariable|Result~NoCarPool

So what's really going on in there?

MLServeCmd.Macro|

Yes, it's a macro.

SetVariable|testValue~{{myVar}}

First, we copy {{myVar}}'s value to a temporary variable. If we don't do this, we'll destroy the original value of {{myVar}} and potentially confuse ourselves up later.

If you really don't need to preserve the value of {{myVar}} you can skip this step, but I highly recommend leaving it in for consistency.

MLConditional|IsEqual##{{testValue}}##5##MLMath|SUBTRACT~testValue~1##!

Now we check if testValue is equal to the maximum value, which was 5. If it is, then we decrement it by one. You'll see why shortly.

MLConditional|IsEqual##{{testValue}}##4##MLMath|SUBTRACT~testValue~1##!

Now we check if testValue is equal to one less than the maximum value, which is 4. Note that if testValue started as 5 (the previous condition was true), then it's already been set to 4, which magically makes this condition true too.

MLConditional|IsEqual##{{testValue}}##3##MLMath|SUBTRACT~testValue~1##!

We continue to check values in the range, essentially looking to see where we "catch" the right value. Once we "catch" the right value, we

"hold on to" it by decrementing it. As soon as one comparison results true, all the comparisons that follow result true as well because we're making testValue "follow" the path of the comparisons.

MLConditional|IsEqual##{{testValue}}##2##SetVariable|Result~CarPoolOK##SetVariable|Result~NoCarPool

At the minimum value, we have "collected" all values from the maximum value down to the minimum value, so now we execute whatever command we wanted to.

If we have multiple commands, we do the same comparison again.

We do not decrement testVal here, because it's unnecessary.

Besides, if we do, we'll "fall into" whatever processing we're doing for minimum value - 1.

If you need to process groups of commands, say A, B and C if the value is 3, A and B if the value is 2, and only A if the value is 1, add another MLConditional before the one that performs the subtraction.

Here is a slightly-more-complex example illustrating per-value and else processing.

Let's assume you have a five "Additional passengers" status buttons, referencing variables {{passenger2}} through {{passenger5}} and you want to display the status of each.

Code: Select all

`MLServeCmd.Macro|`

SetVariable|testValue~{{myVar}}

MLConditional|IsEqual##{{testValue}}##5##SetVariable|passenger5~Present##SetVariable|passenger5~Not present!

MLConditional|IsEqual##{{testValue}}##5##MLMath|SUBTRACT~testValue~1##!

MLConditional|IsEqual##{{testValue}}##4##SetVariable|passenger4~Present##SetVariable|passenger4~Not present!

MLConditional|IsEqual##{{testValue}}##4##MLMath|SUBTRACT~testValue~1##!

MLConditional|IsEqual##{{testValue}}##3##SetVariable|passenger3~Present##SetVariable|passenger3~Not present!

MLConditional|IsEqual##{{testValue}}##3##MLMath|SUBTRACT~testValue~1##!

MLConditional|IsEqual##{{testValue}}##2##SetVariable|passenger2~Present##SetVariable|passenger2~Not present!

MLConditional|IsEqual##{{testValue}}##2##SetVariable|Result~CarPoolOK##SetVariable|Result~NoCarPool

MLServeCmd.Macro|

Again, it's a macro 'cause macros make the world go 'round.

SetVariable|testValue~{{myVar}}

Make a copy so we don't lose the original value of myVar.

You could copy myVar to testValue, use myVar instead of testValue in the conditionals, then reset myVar to testValue at the end instead if that code reads better to you.

MLConditional|IsEqual##{{testValue}}##5##SetVariable|passenger5~Present##SetVariable|passenger5~Not present!

If we have 5 passengers, indicate Passenger 5 as Present, otherwise indicate Passenger 5 as Not present.

MLConditional|IsEqual##{{testValue}}##5##MLMath|SUBTRACT~testValue~1##!

Decrement the testValue because if we have 5 passengers, we should do the processing for 4 passengers too, otherwise passengers 2-4 won't get listed at all.

MLConditional|IsEqual##{{testValue}}##4##SetVariable|passenger4~Present##SetVariable|passenger4~Not present!

If we have 4 passengers, indicate Passenger 4 as Present, otherwise indicate Passenger 4 as Not present.

MLConditional|IsEqual##{{testValue}}##4##MLMath|SUBTRACT~testValue~1##!

If we have 4 passengers, we also need to "trickle down" to the processing for 3 passengers. By now you should get the idea.

.

.

.

MLConditional|IsEqual##{{testValue}}##2##SetVariable|passenger2~Present##SetVariable|passenger2~Not present!

Here we set or clear the value for Passenger 2.

MLConditional|IsEqual##{{testValue}}##2##SetVariable|Result~CarPoolOK##SetVariable|Result~NoCarPool

And now we set our result value for "Is 2 <= myVar <= 5?" to note whether car pool is OK or not for that number of passengers.

Disclaimer: Car pool requirements vary from region to region.

Additional notes:

You could do the same thing by reversing the process and checking the minimum condition first then incrementing the value.

To make it a strict less-than and/or strict greater-than, just increase the max value by one and/or reduce the min value by one. You can do this manually if you're checking fixed values, or by using MLMath if you're checking against variables.

Well, I hope that helps someone because it took me a while to write!

Brandon