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 ✓")