Files
ksp-kos-scripts/logger.ks
T

84 lines
2.4 KiB
Plaintext

// ═══════════════════════════════════════════════════════════
// logger.ks
// CSV logger with buffered writes.
//
// Usage:
// local log to loggerCreate("0:/logs/flight.csv", list("time", "altitude", "apoapsis")).
// loggerUpdate(log, list(time:seconds, altitude, apoapsis)).
// loggerFlush(log). // call at end of script to flush remaining buffer
// ═══════════════════════════════════════════════════════════
// ── Creates a logger and writes the CSV header.
// Parameters:
// filePath : string — destination path, e.g. "0:/logs/flight.csv"
// columns : list — ordered list of column name strings
// flushPeriod : scalar — seconds between buffer flushes (default 1.0)
// Returns a logger lexicon to be passed to loggerUpdate / loggerFlush.
function loggerCreate {
parameter filePath.
parameter columns.
parameter flushPeriod is 1.0.
// Create or overwrite the file and write the header row
local f to open(filePath).
f:clear().
f:writeln(_loggerFormatRow(columns)).
local logger to lexicon(
"file", f,
"columns", columns,
"buffer", list(),
"flushPeriod", flushPeriod,
"lastFlush", time:seconds
).
return logger.
}
// ── Appends a data row to the buffer.
// Values must be in the same order as the columns list passed to loggerCreate.
// Flushes the buffer to disk if the flush period has elapsed.
function loggerUpdate {
parameter logger.
parameter values.
logger["buffer"]:add(_loggerFormatRow(values)).
if time:seconds - logger["lastFlush"] >= logger["flushPeriod"] {
loggerFlush(logger).
}
}
// ── Flushes all buffered rows to disk immediately.
// Call at the end of a script to ensure no data is lost.
function loggerFlush {
parameter logger.
local f to logger["file"].
local buf to logger["buffer"].
local i to 0.
until i >= buf:length {
f:writeln(buf[i]).
set i to i + 1.
}
buf:clear().
set logger["lastFlush"] to time:seconds.
}
// ── Formats a list of values as a CSV row string.
function _loggerFormatRow {
parameter values.
local row to "".
local i to 0.
until i >= values:length {
if i > 0 { set row to row + ",". }
set row to row + values[i].
set i to i + 1.
}
return row.
}