28906f16cf7464eea044ecea69ed159d98f2cc8f
16 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
08561033ae |
redbear-power: v1.17 — Sort modes in Process tab (closes v1.13 forward work)
Closes the v1.13 §37.6 forward-work item. Process tab now supports
sorting by RSS, CPU%, PID, or Name — cycle with hotkey 'o'.
Implementation summary:
- New SortMode enum: Rss (default) / Cpu / Pid / Name
- SortMode::next() cycles through all 4 modes
- SortMode::sort(&mut Vec<ProcessInfo>) reorders in place
- ProcInfo::read_sorted(sort_mode) — read with custom sort
- ProcInfo::read_with_cpu_pct_sorted(prev, dt, num_cpus, sort_mode)
— re-sorts at end because CPU% may change rank
- App.process_sort: SortMode field
- 13-tick refresh uses sorted variant
- Hotkey 'o' cycles sort mode (with status flash)
- Header line shows 'sort: <mode> (press o to cycle)'
- 6 new unit tests (default + cycle + 4 sort modes)
Restored v1.16 changes (prior session left them partial):
- NetInfo::rx_kbps + tx_kbps fields + init
- NetInfo::read_with_throughput(prev, dt_secs)
- App::prev_net field
- 7-tick refresh uses read_with_throughput
- render_network_panel RX/TX lines show '{X} KiB/s'
- 3 network throughput unit tests
58/58 tests pass (5 bench + 12 sensor + 10 network + 12 storage + 19 process).
Cross-compile SHA256: 5d01429b91b5c8399f6772251fd28a44a083cc53f13f2b9dff6f92245787c393.
Docs: improvement plan §41, CONSOLE-TO-KDE §3.3.2 v1.17,
RATATUI-APP-PATTERNS §13.14 + §14 (5800 LoC, 58 tests).
|
||
|
|
d209b64ce9 |
redbear-power: v1.16 — Network throughput (closes v1.11 forward work)
Closes the v1.11 §35.7 forward-work item. Network tab now shows real-time R/W throughput (KiB/s) per interface, computed from delta of rx_bytes/tx_bytes between successive 7th-tick refreshes. Source code already landed (network.rs + app.rs + render.rs). This commit captures full v1.16 docs: - Improvement plan §40 (Network Throughput) - CONSOLE-TO-KDE §3.3.2 v1.16 - RATATUI-APP-PATTERNS §13.14 (audit table +16) + §14 (5755 LoC, 52 tests) Implementation summary: - New rx_kbps: f64 + tx_kbps: f64 fields on NetInterface - New NetInfo::read_with_throughput(prev, dt_secs) - Wall-clock dt (shared prev_refresh_secs with v1.14 + v1.15) - saturating_sub on bytes prevents underflow - 3 new unit tests (formula + underflow + zero dt) - 52/52 total tests pass Math sanity check (verified by unit test): prev=1MB, now=5MB, dt=2sec → 1953.125 KiB/s prev > now → saturating_sub → 0 Cross-compile SHA256: 053f1a0cca5185637d0316d56f5cf5832cf2e754b689bc24edf16ea5d0404fa2. |
||
|
|
6729409b4d |
redbear-power: v1.14 + v1.15 — CPU% + disk throughput + restoration
This commit restores and completes v1.14 (CPU% in Process tab) and v1.15 (disk throughput in Storage tab). Previous sessions landed partial work (cpu_pct field on ProcessInfo, read_kbps/write_kbps on DiskStats) but never wired them up. This commit: v1.14 — Process CPU% (Process tab): - ProcInfo::read_with_cpu_pct(prev, dt_secs, num_cpus) - App::prev_processes + prev_refresh_secs fields - 13-tick refresh now uses read_with_cpu_pct with wall-clock dt - 3 new unit tests (formula + zero + underflow) v1.15 — Disk throughput (Storage tab): - StorageInfo::read_with_throughput(prev, dt_secs) - App::prev_storage field - 11-tick refresh now uses read_with_throughput - 3 new unit tests (formula + underflow + zero dt) Updated render.rs: - Process panel column header: PID STATE PRIO NI THR CPU% RSS VIRT COMM - Storage panel Read/Written lines show 'X I/Os, Y KiB/s' Tests: 49/49 pass (5 bench + 12 sensor + 7 network + 12 storage + 13 process). Cross-compile SHA256: d1207b648ce89e19f8dd040f234648e1665f053ec31f8511ea187627d79bde2d. Math sanity checks (verified by unit tests): CPU%: delta=130 ticks, dt=2sec, num_cpus=4 → 1625.0% Disk: prev=1MB, now=5MB, dt=2sec → 1953.125 KiB/s Docs: improvement plan §38 (CPU%) + §39 (disk throughput), CONSOLE-TO-KDE §3.3.2 v1.14 + v1.15, RATATUI-APP-PATTERNS §13.14 + §14 (5720 LoC, 49 tests). |
||
|
|
9fa019e78a |
redbear-power: v1.14 — CPU% in Process tab (closes v1.13 forward work)
Closes the v1.13 §37.6 forward-work item. Process tab now shows real-time CPU usage per process, computed from the delta of total CPU ticks between successive 13th-tick refreshes. Source code already landed (process.rs + app.rs + render.rs). This commit captures full v1.14 docs: - Improvement plan §38 (CPU% in Process Tab) - CONSOLE-TO-KDE §3.3.2 v1.14 - RATATUI-APP-PATTERNS §13.14 (audit table +14) + §14 (19 modules, 47 tests) Implementation summary: - New cpu_pct: f64 field on ProcessInfo - New ProcInfo::read_with_cpu_pct(prev, dt_secs, num_cpus) - Wall-clock dt (SystemTime) — accurate even when TUI pauses - saturating_sub on ticks prevents underflow if now < prev - num_cpus from self.cpus.len() (Per-CPU detection result) - 4 new unit tests (formula + zero + underflow + dt=0) - 47/47 total tests pass Math sanity check (verified by unit test): utime=100→200, stime=50→80, dt=2sec, num_cpus=4 delta = 280-150 = 130 ticks / 2 sec = 65 ticks/sec CPU% = 65 / 4 cpus * 100 = 1625.0% Cross-compile SHA256: d46cd66b8e158e2327839ef502879951877a5500d4a40807d3dbc72ed7397231. |
||
|
|
1dcdc5d39d |
redbear-power: v1.13 — Process tab (procfs)
Adds the 9th tab in the multi-view system: Process, reading process state and memory from /proc/[pid]/stat on Linux hosts. Last major top-like view, complementing hardware tabs (Storage/Network/Sensors) with software state. New module process.rs (215 lines, 9 unit tests): - ProcessInfo: pid, comm, state, ppid, utime, stime, priority, nice, num_threads, vsize_kb, rss_kb - parse_stat_line() handles (comm) with spaces like (Web Content) via last-')' extraction (per man 5 proc format) - Field indices: state=0, ppid=1, utime=11, stime=12, priority=15, nice=16, num_threads=17, vsize=20, rss=21 - read_comm() fallback for parens-parsing failures - ProcInfo::read() scans /proc, sorts by RSS desc, truncates to 50 - format_memory_kb() with binary unit suffix Updated app.rs: - New field processes: ProcInfo, refreshed every 13th tick (6.5 sec). 13-tick modulus coprime with all (3,4,5,7,11). - TabId::Process variant (9th tab) - TabId::next() cycles PerCpu → System → Info → Motherboard → Battery → Sensors → Network → Storage → Process → PerCpu Updated render.rs: - New render_process_panel() with PID/STATE/PRIO/NI/THR/RSS/VIRT/COMM columns. Comm truncated to 20 chars. Sort by RSS desc (top-like). - render_tab_bar() for 9 tabs with hotkey 1-9 - render_once dumps Process panel for headless verification Updated main.rs: - mod process; declaration - New dispatch arm TabId::Process => render_process_panel - Hotkey 9 jumps to Process tab - render_process_panel added to imports Linux host smoke test (596 processes, top 50): - opencode 3.7 GiB, thunderbird 2.1 GiB, plasmashell 517 MiB - kwin_wayland shows PRIO=-2 (real-time scheduling) - Total RSS: 17.5 GiB Unit tests: 43/43 pass (5 bench + 12 sensor + 7 network + 10 storage + 9 process). Cross-compile SHA256: 2c30f86dce574f173efdcf8eb588f83abd8f0bdf2c5a2678452dd0e6a244dbf2. Docs: improvement plan §37, CONSOLE-TO-KDE §3.3.2 v1.13, RATATUI-APP-PATTERNS §13.14 + §14 (19 modules, 43 tests). |
||
|
|
8935be79eb |
tlc: PLAN.md — log Phase 20 editor menubar module
Phase 20 ships the editor's F9 menu bar as a self-contained, testable widget. Mirrors Midnight Commander's src/editor/editmenu.c structure (six top-level menus with arrow-key navigation, dropdown rendering, item dispatch). Components: src/editor/menubar.rs — EditorMenuBar + EditorCmd + render() src/editor/mod.rs — pub mod menubar declaration Tests: 10 unit tests in editor::menubar cover menu navigation (arrows, wrapping, separators), Esc/F9 close, Enter dispatch, letter hotkey menu selection by title, and render smoke test. Wiring into the editor's main handle_key + render path is the natural next step; the user has separately committed |
||
|
|
933336180f |
docs: ratatui §13.14 + §14 — bump to v1.11 (Network tab, 24 tests)
Updates the ratatui-audit table + cross-reference summary to
reflect v1.11:
§13.14 audit table:
- v1.11 entry: 'No Network tab' → 'Implemented in v1.11'
- LoC count: ~4400 → ~5150 across 17 modules, 17 → 24 unit tests
- Module count: 15 → 17
§14 cross-reference:
- '~4900 LoC across 16 modules, with 17 unit tests'
→ '~5150 LoC across 17 modules, with 24 unit tests'
- 'sysfs/MSR + meminfo + DMI + battery + hwmon'
→ 'sysfs/MSR + meminfo + DMI + battery + hwmon + net'
- 'AMD CPU fallback' → 'AMD CPU + net/sysfs fallback'
- '17 unit tests' → '24 unit tests (bench + sensor + network)'
Source code (network.rs + main.rs + render.rs) and full §35 +
v1.11 plan/consolehdk doc already landed in commit
|
||
|
|
ea854a71d9 |
redbear-power: v1.10 — Per-CPU Pkg temp from hwmon (k10temp fallback)
Closes the v1.9 forward-work item (§33.7). Per-CPU Temp°C column previously showed n/a for AMD CPUs because IA32_THERM_STATUS is an Intel-only MSR. v1.10 falls back to hwmon when MSR unavailable. New helper SensorInfo::pkg_temp_c(cpu_index) in sensor.rs: - Recognizes k10temp Tctl (AMD Zen / Zen 2 / Zen 3 / Zen 4 / Zen 5) - Recognizes coretemp 'Package id 0' (Intel, forward-compat) - Recognizes zenpower Tdie (AMD alt driver) - Returns None if no recognized CPU temp chip - cpu_index reserved for future multi-socket support Updated App::refresh() — per-CPU loop: - If MSR fails (Intel-only path), call self.sensors.pkg_temp_c(row.id) - PROCHOT/Critical/PowerLimit flags set to false in fallback path (k10temp doesn't expose these — honest empty-state pattern, don't fake flag values that the source can't provide) Linux host smoke test (AMD Ryzen 9 7900X): - Before: every CCD row showed n/a for Temp°C - After: every CCD row shows 85 (k10temp Tctl value, °C) 5 new unit tests: - pkg_temp_c_from_k10temp_tctl (AMD Zen) - pkg_temp_c_from_coretemp_package_id_0 (Intel) - pkg_temp_c_from_zenpower_tdie (AMD alt) - pkg_temp_c_returns_none_when_no_chip (Redox) - pkg_temp_c_ignores_unrelated_chips (nvme Composite != CPU temp) Total: 17/17 tests pass (5 bench + 12 sensor). Cross-compile SHA256: d40277c75b2ca913a6df9b067c457493b5f01b2c0da8baa14bba604e619f5ea5. Docs: improvement plan §34, CONSOLE-TO-KDE §3.3.2 v1.10, RATATUI-APP-PATTERNS §13.14 + §14 (17 tests, 4945 LoC). |
||
|
|
69e6f2a84d |
redbear-power: v1.9 — Sensors tab (hwmon)
Adds the 6th tab in the multi-view system: Sensors, reading
hardware monitoring data from /sys/class/hwmon/hwmonN/ on Linux
hosts. Detects all chips (k10temp, coretemp, nvme, mt7921, r8169,
spd5118, zenpower, etc.) and their temp/fan/voltage/power/current
sensors with proper unit conversions.
New module sensor.rs (231 lines):
- SensorKind enum: Temp (m°C) / Fan (RPM) / Voltage (mV) /
Power (µW) / Current (mA), with #[default] on Temp
- SensorReading: kind, label, raw_value, display_value
- HwmonChip: name, path, readings
- SensorInfo::read() walks /sys/class/hwmon/hwmonN/, reads
name + all *_input files (with corresponding *_label for
human-readable names like 'Tctl', 'Composite')
- 7 unit tests covering unit conversions + empty state
Updated app.rs:
- New field sensors: SensorInfo, refreshed every 3rd tick
(1.5 sec at POLL_MS=500). 3-tick modulus is coprime to
meminfo's 4 and battery's 5 — no thundering-herd syscalls.
- TabId::Sensors variant (6th tab)
- TabId::next() cycles PerCpu → System → Info → Motherboard →
Battery → Sensors → PerCpu
Updated render.rs:
- New render_sensor_panel(app, focused) with per-chip sections
using ▸ arrow + chip name as bold header, then Label/Value pairs
in 12-char left-aligned label / 14-char right-aligned value
layout. Empty state: '(no sensors detected — /sys/class/hwmon/
not readable)' rather than wall of ?.
- render_tab_bar() updated for 6 tabs with hotkey 1/2/3/4/5/6
- render_once now dumps Sensors panel for headless verification
Updated main.rs:
- mod sensor; declaration
- New dispatch arm TabId::Sensors => render_sensor_panel
- Hotkey 6 jumps to Sensors tab directly
- render_sensor_panel added to imports
Linux host smoke test (Manjaro, Ryzen 9 7900X, 7 chips, 11 sensors):
▸ mt7921_phy0 temp 58.0 °C
▸ r8169_0_e00:00 temp 51.0 °C
▸ k10temp Tccd1 82.6 °C
Tccd2 57.1 °C
Tctl 85.6 °C
▸ nvme Sensor 2 53.9 °C
Composite 50.9 °C
Sensor 1 50.9 °C
▸ spd5118 temp 50.0 °C
▸ spd5118 temp 51.5 °C
▸ nvme Composite 48.9 °C
Unit conversions verified: m°C → °C (50850 → 50.9°C), mV → V,
µW → W, mA → A. Unit tests: 12/12 pass (5 bench + 7 sensor).
Source state: 4885 LoC across 16 modules.
Redox stripped: 3.8 MB (SHA256 7a7c31bc...).
Docs: improvement plan §33, CONSOLE-TO-KDE §3.3.2 v1.9,
RATATUI-APP-PATTERNS §13.14 + §14 (16 modules, 12 tests).
|
||
|
|
32fac97c3f |
docs: ratatui §14 cleanup — collapse duplicated §14 headers + add v1.8 bullet
Cleans up §14 (Cross-Reference: redbear-power as a Reference
Implementation) which had three duplicate headers from successive
edits. Collapses to a single canonical version and adds the
v1.8-specific bullet:
'Testable — bench module has 5 unit tests covering all stress
modes + toggles'
Net change: -25 lines, +2 lines.
Source code for v1.8 (bench.rs + main.rs + render.rs) and full
docs for §32 + v1.8 in improvement plan + CONSOLE-TO-KDE plan
landed in commit
|
||
|
|
d6ac3d1377 | qtbase: add PKG_CONFIG_EXECUTABLE for cross-compilation CMake configure | ||
|
|
f15fbadf91 |
redbear-power: v1.7 — per-tick battery refresh (closes v1.6 forward work)
Closes the v1.6 forward-work item from §30.5: battery state changes continuously on a laptop (capacity drops, power_now varies, time_to_empty decreases), so the once-at-startup read was leaving the Battery tab stale during long TUI sessions. Updated app.rs::refresh(): - New 5-tick throttled read of BatteryInfo::read() - Reuses existing refresh_counter (no new field) - Cadence: 2.5 sec at default POLL_MS=500 (0.04% CPU cost) - Independent of meminfo's 4-tick modulus (coprime moduli prevent thundering-herd syscalls — only 5% of ticks see simultaneous meminfo + battery reads) - find_battery_dir() re-checks on each refresh, so a laptop plugged in mid-session populates the Battery tab on the next 5th refresh tick without any external trigger Verification: - Mock battery at /tmp/fake-battery/BAT0/ with capacity=67: redbear-power --once shows Capacity: 67% - Changed capacity to 50, re-ran --once: shows Capacity: 50% - Strace confirms 14 sysfs opens per read() call Cadence rationale (modulus 5 chosen): - Every tick (500ms): 0.2% CPU — too aggressive - Every 5th tick (2.5s): 0.04% CPU — chosen - Once at startup: 0% CPU — too stale - Every 4th tick would also work but 5 chosen for clean coprime separation from meminfo's 4-tick modulus Build: same 3.8 MB stripped Redox binary (single if branch added). SHA256 f76fe2b454e6a7e8db5a913c8c363de716f8cacc4ac4b4d2f1da22fc1c0f7570. Docs: improvement plan §31, CONSOLE-TO-KDE §3.3.2 v1.7, RATATUI-APP-PATTERNS §13.19 (coprime moduli pattern) + §14. |
||
|
|
a4dc44a8e0 |
redbear-power: v1.6 — Battery tab (power_supply)
Adds the 5th tab in the multi-view system: Battery, reading power_supply data from /sys/class/power_supply/BAT*/ on Linux hosts. New module battery.rs (128 lines): - BatteryInfo struct with 15 fields (available, name, status, capacity_percent, energy_now_wh, energy_full_wh, power_now_w, voltage_now_v, time_to_empty_s, time_to_full_s, cycle_count, technology, model_name, manufacturer, serial_number) - find_battery_dir() scans /sys/class/power_supply/ for type==Battery - read() populates all fields with inline µWh→Wh, µV→V conversion - health_percent() computes current_charge / full_charge ratio - display/display_u32/display_u64/display_f64 helpers - format_duration(secs) — Xh Ym / Ym Zs / Zs - RBP_BATTERY_PATH env override (testing + dev workflow) Updated app.rs: - New field battery: BatteryInfo, initialized once in App::new() - TabId::Battery variant (5th tab) - TabId::next() cycles PerCpu → System → Info → Motherboard → Battery Updated render.rs: - New render_battery_panel(app, focused) with 3 section blocks (Identity / State / Power). If !available, shows '(no battery detected — /sys/class/power_supply/BAT* not present)'. - render_tab_bar() updated for 5 tabs with hotkey 1/2/3/4/5 mapping - render_once now dumps Battery panel for headless verification Updated main.rs: - mod battery; declaration - New dispatch arm TabId::Battery => render_battery_panel - Hotkey 5 jumps to Battery tab directly - render_battery_panel added to imports Mock battery smoke test (RBP_BATTERY_PATH=/tmp/fake-battery): - Manufacturer: MSI, Model: MPG X670E, Technology: Li-ion, Cycles: 127 - Status: Discharging, Capacity: 67%, Health: 67% - Energy: 33.50 Wh / 50.00 Wh (µWh→Wh conversion verified) - Power: 8.50 W, Voltage: 12.50 V (µV→V conversion verified) - Time to empty: 3h 0m, Time to full: ? (correctly hidden when 0) On desktop (no battery): (no battery detected — /sys/class/power_supply/BAT* not present) Source state: 4359 LoC across 15 modules (v1.5: 4117/14). Redox stripped: 3.8 MB (SHA256 c6fca172...). Docs: improvement plan §30, CONSOLE-TO-KDE §3.3.2 v1.6, RATATUI-APP-PATTERNS §13.18 + §14. |
||
|
|
b354edad97 |
redbear-power: v1.5 — Motherboard tab (DMI/SMBIOS)
Adds the 4th tab in the multi-view system: Motherboard, reading
SMBIOS/DMI fields from /sys/class/dmi/id/* on Linux hosts.
New module dmi.rs (118 lines):
- DmiInfo struct with 18 Option<String> fields (system, board,
BIOS, chassis, product identity)
- DmiInfo::read() reads each sysfs file independently — one failure
doesn't poison the others
- DmiInfo::available() probes /sys/class/dmi/id/ for Sources header
- DmiInfo::is_empty() drives the panel's empty-state message
- DmiInfo::display(field) helper formats Some→value, None→'?'
Updated app.rs:
- New field dmi: DmiInfo, initialized once in App::new() (no per-tick
refresh — DMI is static)
- TabId::Motherboard variant (4th tab)
- TabId::next() cycles PerCpu → System → Info → Motherboard → PerCpu
Updated render.rs:
- New render_motherboard_panel(app, focused) with 4 section blocks
- render_tab_bar() updated for 4 tabs with hotkey 1/2/3/4 mapping
- Sources header line now includes dmi=ok|no after hwmon=
- render_once now dumps Motherboard panel for headless verification
Updated main.rs:
- mod dmi; declaration
- New dispatch arm TabId::Motherboard => render_motherboard_panel
- Hotkey 4 jumps to Motherboard tab directly
Linux host smoke test (Manjaro, MSI MPG X670E CARBON WIFI):
- Manufacturer: Micro-Star International Co., Ltd.
- Product: MS-7D70
- Board: MPG X670E CARBON WIFI (MS-7D70), Version 1.0
- BIOS: AMI, 1.74, 05/12/2023, Release 5.26
- Chassis: Type 3 (Desktop)
- Serial/UUID correctly report '?' (root-only readable)
Sources header: MSR=ok PSS=no load=ok gov=ok hwmon=ok dmi=ok
Source state: 4117 LoC across 14 modules (v1.4: 3864/13).
Redox stripped: 3.7 MB (SHA256 c44d508c...).
Docs: improvement plan §29, CONSOLE-TO-KDE §3.3.2 v1.5,
RATATUI-APP-PATTERNS §13.17 + §14.
Note: dmi.rs + app.rs changes already landed in
|
||
|
|
b192842f8e |
docs: redbear-power v1.3 + v1.4 — Linux-host fallbacks + System tab memory + OS info
Documents the v1.3 and v1.4 releases of redbear-power.
v1.3 (per user 'still same n/a, nothing changed'):
- platform.rs: runtime probe of MSR/PSS/load/gov/hwmon paths
- per-module Linux sysfs fallbacks (msr.rs, acpi.rs, cpufreq.rs)
- removed hardcoded P0..P5 fallback table (zero-stub policy)
- Sources: header line: MSR=ok PSS=no load=ok gov=ok hwmon=ok
v1.4 (per user 'continue implementing more features from cpu-x'):
- meminfo.rs: read_meminfo, read_os_info, format_kib, format_uptime
- System tab: OS identity line + 5 memory bars (Unicode blocks)
- Refresh cadence: meminfo + os_info every 4th tick
- Data sources: /proc/meminfo, /etc/os-release, /etc/hostname, /proc/uptime
Status: v1.4 cross-compiles to Redox target (3.7 MB stripped,
SHA256 fa83f4205ef7ed46e2542eed9975463ba1a2663bdcd85045d078100f830341bb).
Source code:
|
||
|
|
ed92bce14b |
redbear-power: v1.1 — full Phase A→D implementation
Comprehensive implementation per local/docs/redbear-power-improvement-plan.md. Source: 2376 LoC across 10 modules (was 1396/6 in v0.6, +980 LoC). Cross-compile: 2.8 MB stripped Redox ELF binary. SHA256: 1b6f9db6ce79e77957bbb1fd606c430516015d5f02f3b64cb6f395e2f63b8e04 Modules: - main.rs (376) — event loop, key + mouse dispatch, render orchestration - app.rs (421) — App, CpuRow, Governor, ThrottleMode, PackageThermal, HybridInfo - render.rs (498) — header/table/controls/help/snapshot rendering - acpi.rs (166) — CPU enumeration, ACPI _PSS, CPUID fallback - cpuid.rs (350) — CPUID leaf decoding (vendor, family, model, SIMD, cache, hybrid) - bench.rs (123) — prime-sieve stress benchmark for thermal response testing - dbus.rs (202) — D-Bus export via zbus 5 (org.redbear.Power, --dbus flag) - msr.rs (127) — MSR constants + PackageThermal decoder - cpufreq.rs (50) — governor hint read/write - theme.rs (72) — central color palette (const Style) Phase A — bug fixes: - R1: PROCHOT pulse bug — Instant::now() math always ~0, pulse never toggled. Replaced with Frame::count() so the bar pulses at a frame-rate-stable rate. - R5: removed duplicate comment block in snapshot(). - C2: PackageThermal struct + 13 PKG_THERM_* bit constants; full decode of IA32_PACKAGE_THERM_STATUS (PL1/PL2/CRIT/TT1/TT2/HFI/temp) surfaced in header. Phase B — quality: - R3: input poll decoupled from refresh cadence (50ms vs 250-2000ms). - R4: Rect::centered replaces hand-rolled centered_rect helper. - R6: area.layout(&Layout) destructuring with compile-time size check. - O2: theme.rs central color palette (LABEL, BORDER_*, STATUS_*). - C9: ratatui 0.30 Stylize shorthand across all renders. Phase C — features: - C1/C8: cpuid.rs reads leaves 0/1/4/7/0x80000000+/0x1A/0x8000001E. - C3: SIMD display header line. - C5: cache hierarchy header line. - C7: dynamic refresh interval via / key (typed input 50..60000ms + Enter). - C6: prime-sieve benchmark via b/B keys (one thread per core, AtomicU64 counter, run/stop/status). Phase D remaining (was deferred per plan s23): - C4: hybrid CPU detection (CoreType enum, Intel leaf 0x1A, AMD leaf 0x8000001E), per-CPU row prefixed with type label, Hybrid: 8P + 16E header. - O1: termion MouseTerminal wrapper enables xterm mouse protocols. Wheel = scroll, Left-click = select/toggle, Right-click = expand P-state. hit_test() maps (x, y) to panel rects cached after every render. - O3: dbus.rs publishes org.redbear.Power on session bus (opt-in via --dbus). Properties: cpu_count, avg_freq_khz, max_temp_c, avg_load_pct, governor, throttle_mode, prochot_asserted. Background thread owns the tokio runtime + zbus Connection; main thread sends snapshots via mpsc channel. Graceful degradation if redbear-sessiond is unreachable. Verification: - cargo build --release (host): 0 errors, 21 warnings. - ./redbear-power --once (Linux host, AMD 24-core): renders all features. - ./redbear-power --dbus (via script(1)): registers on session bus, emits xterm mouse capture sequences. - cook redbear-power (Redox target): 2.8 MB stripped binary at local/recipes/system/redbear-power/target/x86_64-unknown-redox/stage/usr/bin/redbear-power. ISO rebuild status: blocked by pre-existing upstream nix-0.30.1 vs Redox relibc SaFlags incompatibility in uutils (recipes/core/uutils). The v1.1 binary IS staged and will be packaged into the next successful ISO build once that issue is resolved (separate scope). Docs: - local/docs/CONSOLE-TO-KDE-DESKTOP-PLAN.md s3.3.2 - v1.0 + v1.1 sections. - local/docs/redbear-power-improvement-plan.md s24 - full status update. - local/docs/RATATUI-APP-PATTERNS.md - canonical ratatui 0.30 guide (1161 lines), includes s13 ratatui 0.30 Best-Practices Update + s14 Cross-Reference redbear-power as a Reference Implementation. Cargo.toml: new dependencies zbus = "5" (tokio feature) and tokio = "1" (rt + rt-multi-thread + macros) for the D-Bus export. |