-- BeamLib.lua by Egalware s.r.l. 2025/11/24 -- Libreria calcolo tempo automatismo -- Tabella per definizione modulo local TimeLib = {} EgtOutLog( ' TimeLib started', 1) TimeLib.__index = TimeLib function TimeLib.new() local TimeLibInstance = setmetatable({}, TimeLib) TimeLibInstance.dStartTime = os.clock() TimeLibInstance.Measurements = {} return TimeLibInstance end -- reset entire timer function TimeLib:start() self.dStartTime = os.clock() self.Measurements = {} end -- start elapsed measurement for a specific name function TimeLib:startElapsed(sName) local sMeasurementName = sName or "Default" local dNow = os.clock() if not self.Measurements[sMeasurementName] then self.Measurements[sMeasurementName] = { dStart = dNow, dLast = 0, dCumulative = 0, dRecent = 0, nCount = 0 } else self.Measurements[sMeasurementName].dStart = dNow end end -- stop elapsed measurement (increments count and updates cumulative) function TimeLib:stopElapsed(sName) local sMeasurementName = sName or "Default" local dNow = os.clock() local Measurement = self.Measurements[sMeasurementName] if Measurement and Measurement.dStart then local dDuration = dNow - Measurement.dStart Measurement.dRecent = dDuration Measurement.dCumulative = Measurement.dCumulative + dDuration Measurement.dLast = dNow Measurement.nCount = Measurement.nCount + 1 Measurement.dStart = nil else -- if stop called without start, initialize with zero self.Measurements[sMeasurementName] = { dStart = nil, dLast = dNow, dCumulative = 0, dRecent = 0, nCount = 0 } end end -- reset elapsed for a specific measurement function TimeLib:resetElapsed(sName) local sMeasurementName = sName or "Default" self.Measurements[sMeasurementName] = nil end -- return elapsed times: total, cumulative, recent, count function TimeLib:getElapsed(sName) local dTotal = os.clock() - self.dStartTime local sMeasurementName = sName or "Default" local Measurement = self.Measurements[sMeasurementName] if Measurement then return dTotal, Measurement.dCumulative, Measurement.dRecent, Measurement.nCount else return dTotal, nil, nil, 0 end end -- log elapsed times for one measurement function TimeLib:logElapsed(sName) local dTotal, dCumulative, dRecent, nCount = self:getElapsed(sName) local sMeasurementName = sName or "Default" if dCumulative then EgtOutLog(string.format( "%s(#%d): recent %.3f, cumulative %.3f, total %.3f", sMeasurementName, nCount, dRecent, dCumulative, dTotal)) else EgtOutLog(string.format("Total %.3f (no '%s' measurement started)", dTotal, sMeasurementName)) end end -- log elapsed times for all measurements function TimeLib:logAllElapsed() local dTotal = os.clock() - self.dStartTime if next(self.Measurements) == nil then EgtOutLog(string.format("Total %.3f (no measurements started)", dTotal)) return end for sMeasurementName, Measurement in pairs(self.Measurements) do local dCumulative = Measurement.dCumulative local dRecent = Measurement.dRecent local nCount = Measurement.nCount EgtOutLog(string.format( "%s(#%d): recent %.3f, cumulative %.3f, total %.3f", sMeasurementName, nCount, dRecent, dCumulative, dTotal)) end end return TimeLib