Python example: mrpt_system_example.py

Timers, time loggers, CRC and base64 utilities from mrpt.system.

Modules: mrpt.system

  1#!/usr/bin/env python3
  2"""
  3Timers, time loggers, CRC and base64 utilities from mrpt.system.
  4
  5Demonstrates:
  6  - CTicTac: stopwatch
  7  - CTimeLogger: named section profiling
  8  - compute_CRC16 / compute_CRC32: checksum computation
  9  - encodeBase64 / decodeBase64: base64 codec
 10  - unitsFormat: SI metric prefix formatting
 11  - Filesystem helpers: fileExists, extractFileName, pathJoin, etc.
 12  - Datetime helpers: TTimeParts, dateTimeToString, timeDifference, etc.
 13"""
 14
 15import time as _time
 16from mrpt.system import (
 17    CTicTac, CTimeLogger,
 18    compute_CRC16, compute_CRC32,
 19    encodeBase64, decodeBase64,
 20    unitsFormat,
 21    # filesystem
 22    fileExists, directoryExists, getTempFileName, getcwd,
 23    extractFileName, extractFileExtension, extractFileDirectory,
 24    fileNameChangeExtension, pathJoin, toAbsolutePath,
 25    # datetime
 26    TTimeParts, buildTimestampFromParts, buildTimestampFromPartsLocalTime,
 27    timestampToParts, timeDifference, timestampAdd,
 28    dateTimeToString, dateToString, timeToString, formatTimeInterval,
 29)
 30
 31# ── CTicTac (stopwatch) ──────────────────────────────────────────────────────
 32print("── CTicTac ─────────────────────────────────")
 33timer = CTicTac()
 34_time.sleep(0.05)
 35elapsed = timer.Tac()
 36print(f"Elapsed ≈ {elapsed:.3f} s  (expected ~0.05 s)")
 37assert elapsed > 0.03, "timer too short"
 38
 39# ── CTimeLogger (named section profiling) ────────────────────────────────────
 40print("\n── CTimeLogger ─────────────────────────────")
 41logger = CTimeLogger(name="demo")
 42logger.enter("step_A")
 43_time.sleep(0.02)
 44logger.leave("step_A")
 45logger.enter("step_B")
 46_time.sleep(0.01)
 47logger.leave("step_B")
 48print(logger.getStatsAsText())
 49assert logger.getMeanTime("step_A") > 0
 50
 51# ── CRC checksums ────────────────────────────────────────────────────────────
 52print("── CRC ─────────────────────────────────────")
 53crc16 = compute_CRC16(b"hello")
 54crc32 = compute_CRC32(b"hello")
 55print(f"CRC16('hello') = {crc16:#06x}")
 56print(f"CRC32('hello') = {crc32:#010x}")
 57assert crc16 != 0
 58
 59# ── Base64 ───────────────────────────────────────────────────────────────────
 60print("\n── Base64 ──────────────────────────────────")
 61original = b"MRPT Python bindings"
 62encoded  = encodeBase64(original)
 63decoded  = decodeBase64(encoded)
 64print(f"Original : {original}")
 65print(f"Encoded  : {encoded}")
 66print(f"Decoded  : {decoded}")
 67assert decoded == original, "round-trip mismatch"
 68print("  base64 round-trip ✓")
 69
 70# ── unitsFormat (SI prefixes) ─────────────────────────────────────────────────
 71print("\n── unitsFormat ─────────────────────────────")
 72for val in [0.001, 1.0, 1234.5, 1_500_000]:
 73    print(f"  {val:>12} → {unitsFormat(val)!r}")
 74
 75# ── Filesystem helpers ────────────────────────────────────────────────────────
 76print("\n── Filesystem ──────────────────────────────")
 77cwd = getcwd()
 78print(f"getcwd()  = {cwd}")
 79assert directoryExists(cwd), "current dir must exist"
 80
 81tmp = getTempFileName()
 82print(f"temp file = {tmp}")
 83
 84full_path = "/home/user/data/sensor.bag.gz"
 85print(f"\nextractFileName('{full_path}')         = {extractFileName(full_path)!r}")
 86print(f"extractFileExtension('{full_path}')    = {extractFileExtension(full_path)!r}")
 87print(f"  (ignore_gz=True)                    = {extractFileExtension(full_path, True)!r}")
 88print(f"extractFileDirectory('{full_path}')    = {extractFileDirectory(full_path)!r}")
 89print(f"fileNameChangeExtension(..., 'csv')   = {fileNameChangeExtension(full_path, 'csv')!r}")
 90
 91joined = pathJoin(["/home", "user", "data", "out.txt"])
 92print(f"pathJoin(['/home','user','data','out.txt']) = {joined!r}")
 93
 94abs_cwd = toAbsolutePath(".")
 95print(f"toAbsolutePath('.')  = {abs_cwd!r}")
 96
 97assert not fileExists("/this/path/does/not/exist/xyz.txt")
 98print("  fileExists('/nonexistent') = False ✓")
 99
100# ── Datetime helpers ─────────────────────────────────────────────────────────
101print("\n── Datetime ────────────────────────────────")
102# Build a UTC timestamp from parts
103parts = TTimeParts()
104parts.year   = 2026
105parts.month  = 4
106parts.day    = 12
107parts.hour   = 10
108parts.minute = 30
109parts.second = 0.0
110ts = buildTimestampFromParts(parts)
111
112dt_str = dateTimeToString(ts)
113d_str  = dateToString(ts)
114t_str  = timeToString(ts)
115print(f"Timestamp: {dt_str}")
116print(f"Date only: {d_str}")
117print(f"Time only: {t_str}")
118
119# timeDifference
120ts2 = timestampAdd(ts, 3661.5)   # +1h 1min 1.5s
121diff = timeDifference(ts, ts2)
122print(f"timeDifference(ts, ts+3661.5s) = {diff:.1f} s")
123assert abs(diff - 3661.5) < 0.01
124
125# Decompose back
126parts2 = timestampToParts(ts2, False)
127print(f"Decomposed: {parts2.year}-{parts2.month:02d}-{parts2.day:02d} "
128      f"{parts2.hour:02d}:{parts2.minute:02d}:{parts2.second:.1f} UTC")
129
130# formatTimeInterval
131for secs in [45.0, 125.0, 3723.0, 90061.0]:
132    print(f"  formatTimeInterval({secs:7.0f} s) = {formatTimeInterval(secs)!r}")
133
134print("\nAll checks ✓")