App type changed to widget for glance support. GlanceView shows event type, date/time, and street+housenumber (or coordinates as fallback). Addresses are cached in Event storage on first view in history. Glance-required modules annotated with (:glance). Address distance threshold raised to 70m. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
50 lines
1.5 KiB
MonkeyC
50 lines
1.5 KiB
MonkeyC
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.
|
|
(:glance)
|
|
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<Dictionary> {
|
|
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);
|
|
}
|
|
}
|
|
}
|