Skip to content

Timer

Overview

The Timer API is used to set repeating timers. It is fundamental for creating many types of Intelligent Modules that use polling to update the UI and perform repeating actions. Every time the timer completes, an EventHandler function will be called. This is typically used to poll and update aspects of the UI and/or perform some repeating operations at a regular interval.

Timer.

Type Comment
Timer.New() Method Creates new Timer Object

Timer.New

User Timer.New() to create a new named Timer Object.

MyTimer = Timer.New()         --Creates a new Timer called MyTimer
You will then use that object to run the timer. Up to 8 timers may be created per Intelligent Module.

TimerName

The following methods and properties are available for a Timer object with name TimerName.

Type Comment
TimerName.ID Int 1-8 index of timer.
TimerName:Start(period) Method Starts the named timer with the supplied period in seconds.
TimerName:Stop() Method Stops the named timer.
TimerName.EventHandler(TimerName) Callback Function to call when the timer completes.

TimerName.ID

Get the ID index for a timer.

MyTimer = Timer.New()
MyTimerID = MyTimer.ID                    -- MyTimerID = 1
IDs are assigned in order of creation starting with 1. This can be used to learn the ID of a timer and then use it in the EventHandler callback function described below.

TimerName:Start(period)

This method starts the named timer with a period given in seconds.

MyTimer:Start(1)        --Starts the timer with a period of 1 second
The timer is updated at a maximum of 4 Hz so the smallest allowable time is 0.25 seconds.

TimerName:Stop

This method stops the named timer. It can be restarted

MyTimer:Stop            --Stops the timer

TimerName.EventHandler(TimerName)

Assign the callback function for the named timer that will be called whenever the timer reaches its set time.

This can be done in two ways. With a dedicated function:

function TimerClick ()
      --Do lots of stuff every time
end

MyTimer.EventHandler = TimerClick
Alternately, you can use an anonymous function:
MyTimer.EventHandler = function ()
--Do lots of stuff every time
end

You can optionally pass the Timer object as an argument in the callback function. This allows access to the Timer.ID, which allows you to use the same callback function for multiple timers.

function TimerClick (TimerName)
      if TimerName.ID == MyTimerID then
            --Do stuff for the first timer
      else
            --Do different stuff for every other timer
      end
end

MyTimer.EventHandler = TimerClick
MyTimerID = MyTimer.ID
MyOtherTimer.EventHandler = TimerClick

Usage Examples

The following examples illustrate how these can be used:

Example 1 – Putting it all together

This example shows how Timers are used to update the UI and/or perform some repeating actions at a regular interval.

function TimerClick ()
      --Do lots of stuff every time
end

MyTimer = Timer.New()
MyTimer.EventHandler = TimerClick
MyTimer:Start(.25)

First define the function to be called every time the timer completes. Then create the Timer and set the function as the EventHandler for the timer. Finally, start the timer.

Example 2 – What goes in the Event Handler?

One of the more common things you will put within your TimerClick () function is to get the input value of named components in your user interface, and then do something with them.

function TimerClick ()
      currentFaderValue = NamedControl.getValue("MyFader")
      if currentFaderValue > .5 then
            NamedControl.setValue("MyLED", 1)
      end
end

Normally, you will never stop this type of Timer. It will simply go forever, checking the status of the UI and updating it. But you will often want to check if each UI element has actually changed, and only perform the processing if it has.

Example 3 - Stop it Now!

If you want the actions to only be performed a single time when the timer completes, simply add a Timer.Stop() to the end of your TimerClick() function:

function TimerClick ()
      --Do lots of stuff one time after 10 seconds
      MyTimer:Stop() --Stop the Timer.
end

MyTimer = Timer.New()
MyTimer.EventHandler = TimerClick
MyTimer:Start(10)

Example 4 - Multiple Timers - But you probably don’t want to do this

If you need multiple timers at different rates, you can simply create more than one timer.

function FastTimerClick ()
      --Do stuff that needs to be done very often
end

function SlowTimerClick ()
      --Do other stuff that can happen less regularly
end

FastTimer = Timer.New()
FastTimer.EventHandler = FastTimerClick
FastTimer:Start(.25)                -- Calls EventHandler every .25s

SlowtTimer = Timer.New()
SlowTimer.EventHandler = SlowTimerClick
SlowTimer:Start(10)                 -- Calls EventHandler every 10s

This can alternately be handled with a single event handler.

function TimerClick (ID)
      if ID == 1 then
            --Do stuff for the fast timer
      elseif ID == 2 then
            --Do different stuff for the slow timer
      end
end

FastTimer = Timer.New()
FastTimer.EventHandler = TimerClick
FastTimer:Start(.25)                -- Calls EventHandler ever .25s

SlowtTimer = Timer.New()
SlowTimer.EventHandler = TimerClick
SlowTimer:Start(10)                 -- Calls EventHandler ever 10s

This is useful for updating some internal control processing at a fast rate, while polling and updating the UI at a slower rate.

But this isn’t the most efficient way to handle this need in most cases; instead, see the next example.

Example 5 - Multiple Timers - The Better Way!

A better way to handle the need for multiple timers than described in the example above, is to have a single fast timer with a multiplier counter limiting some of the work in the callback to occur less frequently.

timerMultiplier = 10
timerCounter = 0

function TimerClick ()
      -- Do stuff every timer the timer occur

      timerCounter = timerCounter + 1

      if timerCounter >= timerMultiplier then
            --Do other stuff that can happen less regularly
            timerCounter = 0              --Reset the timerCounter
      end
end

MyTimer = Timer.New()
MyTimer.EventHandler = TimerClick
MyTimer:Start(.25)

This is more efficient using less processing and can be used as long as the slow timer is a multiple of the fast timer.