diff options
Diffstat (limited to 'apps/plugins/lua/include_lua/timer.lua')
| -rw-r--r-- | apps/plugins/lua/include_lua/timer.lua | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/apps/plugins/lua/include_lua/timer.lua b/apps/plugins/lua/include_lua/timer.lua new file mode 100644 index 0000000..6797874 --- /dev/null +++ b/apps/plugins/lua/include_lua/timer.lua @@ -0,0 +1,114 @@ +--[[ Lua Timer functions +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2017 William Wilgus + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ +]] + +--[[ Exposed Functions + + _timer.active + _timer.check + _timer.split + _timer.start + _timer.stop + +]] + +local _timer = {} do + + --internal constants + local _NIL = nil -- _NIL placeholder + + -- newer versions of lua use table.unpack + local unpack = unpack or table.unpack + + --stores time elapsed at call to split; only vaid for unique timers + local function split(index) + if type(index) ~= "table" then return end + index[#index + 1] = rb.current_tick() - _timer[index] + end + + -- starts a new timer, if index is not specified a unique index is returned + -- numeric or string indices are valid to use directly for permanent timers + -- in this case its up to you to make sure you keep the index unique + local function start(index) + if index == _NIL then + ---if you have _timer.start create timer it returns a unique Id which + -- then has the same methods of _timer :start :stop :check :split + index = setmetatable({}, {__index = _timer}) + end + if _timer[index] == _NIL then + _timer[index] = rb.current_tick() + end + return index + end + + -- returns time elapsed in centiseconds, assigning bCheckonly keeps timer active + local function stop(index, bCheckonly) + + local time_end = rb.current_tick() + index = index or 0 + if not _timer[index] then + return 0 + else + local time_start = _timer[index] + if not bCheckonly then _timer[index] = _NIL end -- destroy timer + if type(index) ~= "table" then + return time_end - time_start + else + return time_end - time_start, unpack(index) + end + end + end + + -- returns time elapsed in centiseconds, assigning to bUpdate.. updates timer + local function check(index, bUpdate) + local elapsed = stop(index, true) + if bUpdate ~= _NIL and index then + _timer[index] = rb.current_tick() + end + return elapsed + end + + -- returns table of active timers + local function active() + local t_active = {} + local n = 0 + for k,v in pairs(_timer) do + if type(_timer[k]) ~= "function" then + n = n + 1 + t_active[n]=(k) + end + end + return n, t_active + end + + -- expose functions to the outside through _timer table + _timer.active = active + _timer.check = check + _timer.split = split + _timer.start = start + _timer.stop = stop + + -- allows a call to _timer.start() by just calling _timer() + _timer = setmetatable(_timer,{__call = function(t, i) return start(i) end}) +end -- timer functions + +return _timer |