summaryrefslogtreecommitdiffstatshomepage
path: root/plugins/timer/init.lua
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/timer/init.lua')
-rw-r--r--plugins/timer/init.lua140
1 files changed, 55 insertions, 85 deletions
diff --git a/plugins/timer/init.lua b/plugins/timer/init.lua
index 56ccd6b39ed..1d67472b3c2 100644
--- a/plugins/timer/init.lua
+++ b/plugins/timer/init.lua
@@ -1,109 +1,79 @@
-- license:BSD-3-Clause
--- copyright-holders:Carl
-require('lfs')
-local sqlite3 = require('lsqlite3')
-local exports = {}
-exports.name = "timer"
-exports.version = "0.0.2"
-exports.description = "Game play timer"
-exports.license = "The BSD 3-Clause License"
-exports.author = { name = "Carl" }
+-- copyright-holders:Vas Crabb
+-- TODO: track time properly across soft reset and state load
+local exports = {
+ name = 'timer',
+ version = '0.0.3',
+ description = 'Game play timer',
+ license = 'BSD-3-Clause',
+ author = { name = 'Vas Crabb' } }
local timer = exports
+local reset_subscription, stop_subscription
+
function timer.startplugin()
- local dir = lfs.env_replace(manager:options().entries.homepath:value())
- local timer_db = dir .. "/timer/timer.db"
- local timer_started = false
local total_time = 0
local start_time = 0
local play_count = 0
+ local emu_total = emu.attotime()
- local function save()
- total_time = total_time + (os.time() - start_time)
-
- local db = assert(sqlite3.open(timer_db))
-
- local insert_stmt = assert( db:prepare("INSERT OR IGNORE INTO timer VALUES (?, ?, 0, 0)") )
- insert_stmt:bind_values(emu.romname(), emu.softname())
- insert_stmt:step()
- insert_stmt:reset()
-
- local update_stmt = assert( db:prepare("UPDATE timer SET total_time=?, play_count=? WHERE driver=? AND software=?") )
- update_stmt:bind_values(total_time, play_count,emu.romname(), emu.softname())
- update_stmt:step()
- update_stmt:reset()
-
- assert(db:close() == sqlite3.OK)
- end
-
-
- emu.register_start(function()
- local file
- if timer_started then
- save()
- end
- timer_started = true
- lfs.mkdir(dir .. '/timer')
- local db = assert(sqlite3.open(timer_db))
- local found=false
- db:exec([[select * from sqlite_master where name='timer';]], function(...) found=true return 0 end)
- if not found then
- db:exec[[ CREATE TABLE timer (
- driver VARCHAR(32) PRIMARY KEY,
- software VARCHAR(40),
- total_time INTEGER NOT NULL,
- play_count INTEGER NOT NULL
- ); ]]
- end
-
- local stmt, row
- stmt = db:prepare("SELECT total_time, play_count FROM timer WHERE driver = ? AND software = ?")
- stmt:bind_values(emu.romname(), emu.softname())
- if (stmt:step() == sqlite3.ROW) then
- row = stmt:get_named_values()
- play_count = row.play_count
- total_time = row.total_time
- else
- play_count = 0
- total_time = 0
- end
+ local reference = 0
+ local lastupdate
+ local highlight -- hacky - workaround for the menu not remembering the selected item if its ref is nullptr
- assert(db:close() == sqlite3.OK)
-
- start_time = os.time()
- play_count = play_count + 1
- end)
-
- emu.register_stop(function()
- timer_started = false
- save()
- total_time = 0
- play_count = 0
- end)
local function sectohms(time)
- local hrs = math.floor(time / 3600)
- local min = math.floor((time % 3600) / 60)
+ local hrs = time // 3600
+ local min = (time % 3600) // 60
local sec = time % 60
- return string.format("%03d:%02d:%02d", hrs, min, sec)
+ return string.format(_p('plugin-timer', '%03d:%02d:%02d'), hrs, min, sec)
end
local function menu_populate()
- local time = os.time() - start_time
- return {{ _("Current time"), "", "off" },
- { sectohms(time), "", "off" },
- { _("Total time"), "", "off" },
- { sectohms(total_time + time), "", "off" },
- { _("Play Count"), "", "off" },
- { play_count, "", "off" }}
+ lastupdate = os.time()
+ local refname = (reference == 0) and _p('plugin-timer', 'Wall clock') or _p('plugin-timer', 'Emulated time')
+ local time = (reference == 0) and (lastupdate - start_time) or manager.machine.time.seconds
+ local total = (reference == 0) and (total_time + time) or (manager.machine.time + emu_total).seconds
+ return
+ {
+ { _p("plugin-timer", "Reference"), refname, (reference == 0) and 'r' or 'l' },
+ { '---', '', '' },
+ { _p("plugin-timer", "Current time"), sectohms(time), "off" },
+ { _p("plugin-timer", "Total time"), sectohms(total), "off" },
+ { _p("plugin-timer", "Play Count"), tostring(play_count), "off" } },
+ highlight,
+ "idle"
end
local function menu_callback(index, event)
- return true
+ if (index == 1) and ((event == 'left') or (event == 'right') or (event == 'select')) then
+ reference = reference ~ 1
+ return true
+ end
+ highlight = index
+ return os.time() > lastupdate
end
- emu.register_menu(menu_callback, menu_populate, _("Timer"))
+
+ reset_subscription = emu.add_machine_reset_notifier(
+ function ()
+ if emu.romname() ~= '___empty' then
+ start_time = os.time()
+ local persister = require('timer/timer_persist')
+ total_time, play_count, emu_total = persister:start_session()
+ end
+ end)
+
+ stop_subscription = emu.add_machine_stop_notifier(
+ function ()
+ if emu.romname() ~= '___empty' then
+ local persister = require('timer/timer_persist')
+ persister:update_totals(start_time)
+ end
+ end)
+
+ emu.register_menu(menu_callback, menu_populate, _p("plugin-timer", "Timer"))
end
return exports