-- these globals can be referenced in function and telemetry scripts
local announcements = { 720, 660, 600, 540, 480, 420, 360, 300, 240, 180, 120, 105, 90, 75, 60, 55, 50, 45, 40, 35, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0}
local annIndex -- index into the announcements table (1 based)
local minUnit -- used by playNumber() for unit announcement
{ "switch", SOURCE}, -- switch used to activate count down
{ "mins", VALUE, 1, 12, 2 }, -- minutes to count down
{ "sw_high", VALUE, 0, 1, 1 } -- 0 = active when low, otherwise active when high
local output = {"ctup", "ctdn" }
local version = getVersion()
minUnit = 16 -- unit for minutes in OpenTX 2.0
elseif version < "2.2" then
minUnit = 23 -- unit for minutes in OpenTX 2.1
minUnit = 25 -- unit for minutes in OpenTX 2.2
local function countdownIsRunning(switch, sw_high)
-- evaluate switch - return true if we should be counting down
local function run(switch, mins, sw_high)
local timenow = getTime() -- 10ms tick count
if (not countdownIsRunning(switch, sw_high)) then
return 0, 0 -- ***** NOTE: early exit *****
return 0, 0 -- must reset the switch before we go again
target = timenow + ((mins * 60) * 100)
gCountDown = math.floor(((target - timenow) / 100) + .7) -- + is adj. to for announcement lag
gCountUp = (mins * 60) - gCountDown
while gCountDown < announcements[annIndex] do
annIndex = annIndex + 1 -- catch up
if gCountDown == announcements[annIndex] then
minutes = math.floor(gCountDown / 60)
seconds = gCountDown % 60
playNumber(minutes, minUnit, 0)
playNumber(seconds, 0, 0)
return gCountUp * 10.24, gCountDown * 10.24
return { input=input, output=output, init=init, run=run }