import Toybox.Application; import Toybox.Lang; import Toybox.Time; // Lightweight crash / diagnostic logger. Entries live in // Application.Storage and are pruned with the same retention window // as events so the watch storage never fills up. module Logger { const KEY = "logs"; const MAX_ENTRIES = 50; function log(msg as String) as Void { var raw = Application.Storage.getValue(KEY); var arr = (raw instanceof Array) ? raw : []; arr.add({ "ts" => Time.now().value(), "msg" => msg }); if (arr.size() > MAX_ENTRIES) { arr = arr.slice(arr.size() - MAX_ENTRIES, arr.size()); } Application.Storage.setValue(KEY, arr); } function getAll() as Array { var raw = Application.Storage.getValue(KEY); return (raw instanceof Array) ? raw : []; } function pruneOld() as Void { var raw = Application.Storage.getValue(KEY); if (!(raw instanceof Array) || raw.size() == 0) { return; } var cutoff = Time.now().value() - Config.RETENTION_SEC; var kept = []; for (var i = 0; i < raw.size(); i++) { var d = raw[i] as Dictionary; var ts = d["ts"]; if (ts != null && (ts as Number) >= cutoff) { kept.add(d); } } if (kept.size() != raw.size()) { Application.Storage.setValue(KEY, kept); } } }