// Author: cirakg & claude ai // Summary: Debug-only diagnostics (start-up time, memory) for `make perf` and `make memtest`. // // Debug builds print one machine-readable line per event to the simulator // console: "DIAG", the event name, then key=value pairs, for example // DIAG first_frame startup_ms=1 mem_used=6984 mem_total=781888 // tools/check_budgets.py reads these lines and compares them with // tools/budgets.json. Plain key=value pairs are used instead of JSON because // the simulator console escapes quotes. Release builds compile the empty // (:release) versions instead, so a real watch running a release build never // logs anything. // // Security rule: only timings and memory counters ever go through here, never // secrets, codes or entry names. This is the only file allowed to call // System.println outside tests (enforced by tools/lint_project.py). import Toybox.Lang; import Toybox.System; module Diag { // System.getTimer() value when the app object was created. (:debug) var startMs as Number = 0; // Start the start-up timer. Called from OtpWalletApp.initialize(). (:debug) function markStart() as Void { startMs = System.getTimer(); } (:release) function markStart() as Void { } // Report start-up time and memory use after the first complete frame. // startup_ms covers app object creation to the end of the first draw. The // time the system needs to load the program before that is invisible to // the app; app-diag.sh measures it from outside (README section 18). (:debug) function firstFrame() as Void { var stats = System.getSystemStats(); System.println("DIAG first_frame startup_ms=" + (System.getTimer() - startMs) + " mem_used=" + stats.usedMemory + " mem_total=" + stats.totalMemory); } (:release) function firstFrame() as Void { } }