// ═══════════════════════════════════════════════════════════ // 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. }