ea854a71d9ea7dde3dd3e12e9ac26ee0bcf3ce78
9 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
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. |