Таймеры uLua
Таймеры позволяют отложить действие или повторять его с заданным периодом, пока основная программа занимается другой работой.
hw.timer_after(ms, func)
hw.timer_after(ms, func, arg1)
hw.timer_after(ms, func, arg1, arg2)
hw.timer_every(ms, func)
hw.timer_every(ms, func, arg1)
hw.timer_every(ms, func, arg1, arg2)
hw.timer_cancel(timer_id)
hw.timer_after(...) -> intсоздаёт однократный таймер;hw.timer_every(...) -> intсоздаёт периодический таймер;hw.timer_cancel(timer_id)отменяет таймер.
Обе функции создания возвращают идентификатор, который нужен для отмены.
Таймеры действуют только пока выполняется текущая программа на uLua. Если
основная функция завершится, прошивка отменит все ожидающие вызовы. После
настройки таймеров оставьте основной цикл работающим; hw.delay_ms() внутри
него не мешает обработчикам.
Ограничения
- функция-обработчик должна быть именованной функцией верхнего уровня;
- можно передать не больше двух аргументов;
- одновременно работают не более двух таймеров;
- задержка или период — от
1до65535мс.
Аргументом может быть int, bool, nil, строковый литерал или встроенное
значение наподобие pin и bitset. Строку, созданную во время выполнения
оператором .., передавать нельзя: её буфер может быть перезаписан до вызова
функции.
Если период истёк несколько раз, пока прежний вызов ещё ожидает выполнения или выполняется, события объединяются в один следующий вызов. Обработчик не прерывает собственное выполнение и не запускается одновременно сам с собой.
Однократный вызов
function blink_once()
hw.gled(true)
hw.delay_ms(50)
hw.gled(false)
end
hw.timer_after(1000, blink_once)
while true do
hw.delay_ms(100)
end
Через одну секунду функция мигнёт зелёным индикатором один раз.
Периодический вызов с аргументами
function pulse(pin, duration_ms)
hw.gpio_set(pin, 1)
hw.delay_ms(duration_ms)
hw.gpio_set(pin, 0)
end
hw.gpio_init(hw.p1, hw.out)
local timer_id = hw.timer_every(1000, pulse, hw.p1, 25)
while true do
hw.delay_ms(100)
end
Каждую секунду на hw.p1 формируется импульс длительностью 25 мс.
Отмена
function turn_on_red()
hw.rled(true)
end
local timer_id = hw.timer_after(500, turn_on_red)
hw.timer_cancel(timer_id)
hw.delay_ms(600)
return 1
После отмены обработчик не будет вызван. Краткое описание этих же функций есть в аппаратном API.