mirror of
https://github.com/ClementTsang/bottom.git
synced 2025-07-03 11:54:36 +02:00
refactor: more data conversion cleanup (#1653)
* clean up some battery stuff * dedupe battery from data conversion * idk why we had a Value type alias * clean up dupe load avg, and remove memory use percent from memharvest * hmm * nvm
This commit is contained in:
parent
cd6c60c054
commit
dbda1ee56f
19
src/app.rs
19
src/app.rs
@ -762,8 +762,10 @@ impl App {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
BottomWidgetType::Battery => {
|
BottomWidgetType::Battery =>
|
||||||
if self.converted_data.battery_data.len() > 1 {
|
{
|
||||||
|
#[cfg(feature = "battery")]
|
||||||
|
if self.data_collection.battery_harvest.len() > 1 {
|
||||||
if let Some(battery_widget_state) = self
|
if let Some(battery_widget_state) = self
|
||||||
.states
|
.states
|
||||||
.battery_state
|
.battery_state
|
||||||
@ -823,9 +825,11 @@ impl App {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
BottomWidgetType::Battery => {
|
BottomWidgetType::Battery =>
|
||||||
if self.converted_data.battery_data.len() > 1 {
|
{
|
||||||
let battery_count = self.converted_data.battery_data.len();
|
#[cfg(feature = "battery")]
|
||||||
|
if self.data_collection.battery_harvest.len() > 1 {
|
||||||
|
let battery_count = self.data_collection.battery_harvest.len();
|
||||||
if let Some(battery_widget_state) = self
|
if let Some(battery_widget_state) = self
|
||||||
.states
|
.states
|
||||||
.battery_state
|
.battery_state
|
||||||
@ -2789,6 +2793,7 @@ impl App {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
BottomWidgetType::Battery => {
|
BottomWidgetType::Battery => {
|
||||||
|
#[cfg(feature = "battery")]
|
||||||
if let Some(battery_widget_state) = self
|
if let Some(battery_widget_state) = self
|
||||||
.states
|
.states
|
||||||
.battery_state
|
.battery_state
|
||||||
@ -2800,10 +2805,10 @@ impl App {
|
|||||||
{
|
{
|
||||||
if (x >= *tlc_x && y >= *tlc_y) && (x <= *brc_x && y <= *brc_y)
|
if (x >= *tlc_x && y >= *tlc_y) && (x <= *brc_x && y <= *brc_y)
|
||||||
{
|
{
|
||||||
if itx >= self.converted_data.battery_data.len() {
|
if itx >= self.data_collection.battery_harvest.len() {
|
||||||
// range check to keep within current data
|
// range check to keep within current data
|
||||||
battery_widget_state.currently_selected_battery_index =
|
battery_widget_state.currently_selected_battery_index =
|
||||||
self.converted_data.battery_data.len() - 1;
|
self.data_collection.battery_harvest.len() - 1;
|
||||||
} else {
|
} else {
|
||||||
battery_widget_state.currently_selected_battery_index =
|
battery_widget_state.currently_selected_battery_index =
|
||||||
itx;
|
itx;
|
||||||
|
@ -28,22 +28,19 @@ use crate::{
|
|||||||
dec_bytes_per_second_string,
|
dec_bytes_per_second_string,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub type Value = f64;
|
|
||||||
|
|
||||||
#[derive(Debug, Default, Clone)]
|
#[derive(Debug, Default, Clone)]
|
||||||
pub struct TimedData {
|
pub struct TimedData {
|
||||||
pub rx_data: Value,
|
pub rx_data: f64,
|
||||||
pub tx_data: Value,
|
pub tx_data: f64,
|
||||||
pub cpu_data: Vec<Value>,
|
pub cpu_data: Vec<f64>,
|
||||||
pub load_avg_data: [f32; 3],
|
pub mem_data: Option<f64>,
|
||||||
pub mem_data: Option<Value>,
|
|
||||||
#[cfg(not(target_os = "windows"))]
|
#[cfg(not(target_os = "windows"))]
|
||||||
pub cache_data: Option<Value>,
|
pub cache_data: Option<f64>,
|
||||||
pub swap_data: Option<Value>,
|
pub swap_data: Option<f64>,
|
||||||
#[cfg(feature = "zfs")]
|
#[cfg(feature = "zfs")]
|
||||||
pub arc_data: Option<Value>,
|
pub arc_data: Option<f64>,
|
||||||
#[cfg(feature = "gpu")]
|
#[cfg(feature = "gpu")]
|
||||||
pub gpu_data: Vec<Option<Value>>,
|
pub gpu_data: Vec<Option<f64>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug, Default)]
|
#[derive(Clone, Debug, Default)]
|
||||||
@ -246,7 +243,7 @@ impl DataCollection {
|
|||||||
|
|
||||||
// Load average
|
// Load average
|
||||||
if let Some(load_avg) = harvested_data.load_avg {
|
if let Some(load_avg) = harvested_data.load_avg {
|
||||||
self.eat_load_avg(load_avg, &mut new_entry);
|
self.eat_load_avg(load_avg);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Temp
|
// Temp
|
||||||
@ -282,11 +279,8 @@ impl DataCollection {
|
|||||||
fn eat_memory_and_swap(
|
fn eat_memory_and_swap(
|
||||||
&mut self, memory: memory::MemHarvest, swap: memory::MemHarvest, new_entry: &mut TimedData,
|
&mut self, memory: memory::MemHarvest, swap: memory::MemHarvest, new_entry: &mut TimedData,
|
||||||
) {
|
) {
|
||||||
// Memory
|
new_entry.mem_data = memory.checked_percent();
|
||||||
new_entry.mem_data = memory.use_percent;
|
new_entry.swap_data = swap.checked_percent();
|
||||||
|
|
||||||
// Swap
|
|
||||||
new_entry.swap_data = swap.use_percent;
|
|
||||||
|
|
||||||
// In addition copy over latest data for easy reference
|
// In addition copy over latest data for easy reference
|
||||||
self.memory_harvest = memory;
|
self.memory_harvest = memory;
|
||||||
@ -295,10 +289,7 @@ impl DataCollection {
|
|||||||
|
|
||||||
#[cfg(not(target_os = "windows"))]
|
#[cfg(not(target_os = "windows"))]
|
||||||
fn eat_cache(&mut self, cache: memory::MemHarvest, new_entry: &mut TimedData) {
|
fn eat_cache(&mut self, cache: memory::MemHarvest, new_entry: &mut TimedData) {
|
||||||
// Cache and buffer memory
|
new_entry.cache_data = cache.checked_percent();
|
||||||
new_entry.cache_data = cache.use_percent;
|
|
||||||
|
|
||||||
// In addition copy over latest data for easy reference
|
|
||||||
self.cache_harvest = cache;
|
self.cache_harvest = cache;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -327,9 +318,7 @@ impl DataCollection {
|
|||||||
self.cpu_harvest = cpu;
|
self.cpu_harvest = cpu;
|
||||||
}
|
}
|
||||||
|
|
||||||
fn eat_load_avg(&mut self, load_avg: cpu::LoadAvgHarvest, new_entry: &mut TimedData) {
|
fn eat_load_avg(&mut self, load_avg: cpu::LoadAvgHarvest) {
|
||||||
new_entry.load_avg_data = load_avg;
|
|
||||||
|
|
||||||
self.load_avg_harvest = load_avg;
|
self.load_avg_harvest = load_avg;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -457,7 +446,7 @@ impl DataCollection {
|
|||||||
|
|
||||||
#[cfg(feature = "zfs")]
|
#[cfg(feature = "zfs")]
|
||||||
fn eat_arc(&mut self, arc: memory::MemHarvest, new_entry: &mut TimedData) {
|
fn eat_arc(&mut self, arc: memory::MemHarvest, new_entry: &mut TimedData) {
|
||||||
new_entry.arc_data = arc.use_percent;
|
new_entry.arc_data = arc.checked_percent();
|
||||||
self.arc_harvest = arc;
|
self.arc_harvest = arc;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -467,7 +456,7 @@ impl DataCollection {
|
|||||||
// within the local copy of gpu_harvest. Since it's all sequential
|
// within the local copy of gpu_harvest. Since it's all sequential
|
||||||
// it probably doesn't matter anyways.
|
// it probably doesn't matter anyways.
|
||||||
gpu.iter().for_each(|data| {
|
gpu.iter().for_each(|data| {
|
||||||
new_entry.gpu_data.push(data.1.use_percent);
|
new_entry.gpu_data.push(data.1.checked_percent());
|
||||||
});
|
});
|
||||||
self.gpu_harvest = gpu;
|
self.gpu_harvest = gpu;
|
||||||
}
|
}
|
||||||
|
@ -335,7 +335,9 @@ impl Painter {
|
|||||||
|
|
||||||
self.draw_process(f, app_state, rect[0], widget_id);
|
self.draw_process(f, app_state, rect[0], widget_id);
|
||||||
}
|
}
|
||||||
Battery => {
|
Battery =>
|
||||||
|
{
|
||||||
|
#[cfg(feature = "battery")]
|
||||||
self.draw_battery(f, app_state, rect[0], app_state.current_widget.widget_id)
|
self.draw_battery(f, app_state, rect[0], app_state.current_widget.widget_id)
|
||||||
}
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
@ -445,7 +447,9 @@ impl Painter {
|
|||||||
Temp => {
|
Temp => {
|
||||||
self.draw_temp_table(f, app_state, vertical_chunks[3], widget_id)
|
self.draw_temp_table(f, app_state, vertical_chunks[3], widget_id)
|
||||||
}
|
}
|
||||||
Battery => {
|
Battery =>
|
||||||
|
{
|
||||||
|
#[cfg(feature = "battery")]
|
||||||
self.draw_battery(f, app_state, vertical_chunks[3], widget_id)
|
self.draw_battery(f, app_state, vertical_chunks[3], widget_id)
|
||||||
}
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
@ -722,7 +726,11 @@ impl Painter {
|
|||||||
Temp => self.draw_temp_table(f, app_state, *draw_loc, widget.widget_id),
|
Temp => self.draw_temp_table(f, app_state, *draw_loc, widget.widget_id),
|
||||||
Disk => self.draw_disk_table(f, app_state, *draw_loc, widget.widget_id),
|
Disk => self.draw_disk_table(f, app_state, *draw_loc, widget.widget_id),
|
||||||
Proc => self.draw_process(f, app_state, *draw_loc, widget.widget_id),
|
Proc => self.draw_process(f, app_state, *draw_loc, widget.widget_id),
|
||||||
Battery => self.draw_battery(f, app_state, *draw_loc, widget.widget_id),
|
Battery =>
|
||||||
|
{
|
||||||
|
#[cfg(feature = "battery")]
|
||||||
|
self.draw_battery(f, app_state, *draw_loc, widget.widget_id)
|
||||||
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
use std::{cmp::min, time::Instant};
|
use std::time::Instant;
|
||||||
|
|
||||||
use tui::{
|
use tui::{
|
||||||
layout::Rect,
|
layout::Rect,
|
||||||
@ -7,14 +7,6 @@ use tui::{
|
|||||||
|
|
||||||
use super::SIDE_BORDERS;
|
use super::SIDE_BORDERS;
|
||||||
|
|
||||||
/// Calculate how many bars are to be drawn within basic mode's components.
|
|
||||||
pub fn calculate_basic_use_bars(use_percentage: f64, num_bars_available: usize) -> usize {
|
|
||||||
min(
|
|
||||||
(num_bars_available as f64 * use_percentage / 100.0).round() as usize,
|
|
||||||
num_bars_available,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Determine whether a graph x-label should be hidden.
|
/// Determine whether a graph x-label should be hidden.
|
||||||
pub fn should_hide_x_label(
|
pub fn should_hide_x_label(
|
||||||
always_hide_time: bool, autohide_time: bool, timer: &mut Option<Instant>, draw_loc: Rect,
|
always_hide_time: bool, autohide_time: bool, timer: &mut Option<Instant>, draw_loc: Rect,
|
||||||
@ -64,20 +56,6 @@ mod test {
|
|||||||
|
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn test_calculate_basic_use_bars() {
|
|
||||||
// Testing various breakpoints and edge cases.
|
|
||||||
assert_eq!(calculate_basic_use_bars(0.0, 15), 0);
|
|
||||||
assert_eq!(calculate_basic_use_bars(1.0, 15), 0);
|
|
||||||
assert_eq!(calculate_basic_use_bars(5.0, 15), 1);
|
|
||||||
assert_eq!(calculate_basic_use_bars(10.0, 15), 2);
|
|
||||||
assert_eq!(calculate_basic_use_bars(40.0, 15), 6);
|
|
||||||
assert_eq!(calculate_basic_use_bars(45.0, 15), 7);
|
|
||||||
assert_eq!(calculate_basic_use_bars(50.0, 15), 8);
|
|
||||||
assert_eq!(calculate_basic_use_bars(100.0, 15), 15);
|
|
||||||
assert_eq!(calculate_basic_use_bars(150.0, 15), 15);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_should_hide_x_label() {
|
fn test_should_hide_x_label() {
|
||||||
use std::time::{Duration, Instant};
|
use std::time::{Duration, Instant};
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
pub mod battery_display;
|
|
||||||
pub mod cpu_basic;
|
pub mod cpu_basic;
|
||||||
pub mod cpu_graph;
|
pub mod cpu_graph;
|
||||||
pub mod disk_table;
|
pub mod disk_table;
|
||||||
@ -8,3 +7,6 @@ pub mod network_basic;
|
|||||||
pub mod network_graph;
|
pub mod network_graph;
|
||||||
pub mod process_table;
|
pub mod process_table;
|
||||||
pub mod temperature_table;
|
pub mod temperature_table;
|
||||||
|
|
||||||
|
#[cfg(feature = "battery")]
|
||||||
|
pub mod battery_display;
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
use std::cmp::min;
|
||||||
|
|
||||||
use tui::{
|
use tui::{
|
||||||
layout::{Constraint, Direction, Layout, Rect},
|
layout::{Constraint, Direction, Layout, Rect},
|
||||||
text::{Line, Span},
|
text::{Line, Span},
|
||||||
@ -8,14 +10,19 @@ use unicode_width::UnicodeWidthStr;
|
|||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
app::App,
|
app::App,
|
||||||
canvas::{
|
canvas::{drawing_utils::widget_block, Painter},
|
||||||
drawing_utils::{calculate_basic_use_bars, widget_block},
|
|
||||||
Painter,
|
|
||||||
},
|
|
||||||
constants::*,
|
constants::*,
|
||||||
data_collection::batteries::BatteryState,
|
data_collection::batteries::BatteryState,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/// Calculate how many bars are to be drawn within basic mode's components.
|
||||||
|
fn calculate_basic_use_bars(use_percentage: f64, num_bars_available: usize) -> usize {
|
||||||
|
min(
|
||||||
|
(num_bars_available as f64 * use_percentage / 100.0).round() as usize,
|
||||||
|
num_bars_available,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
impl Painter {
|
impl Painter {
|
||||||
pub fn draw_battery(
|
pub fn draw_battery(
|
||||||
&self, f: &mut Frame<'_>, app_state: &mut App, draw_loc: Rect, widget_id: u64,
|
&self, f: &mut Frame<'_>, app_state: &mut App, draw_loc: Rect, widget_id: u64,
|
||||||
@ -58,10 +65,10 @@ impl Painter {
|
|||||||
block
|
block
|
||||||
};
|
};
|
||||||
|
|
||||||
if app_state.converted_data.battery_data.len() > 1 {
|
if app_state.data_collection.battery_harvest.len() > 1 {
|
||||||
let battery_names = app_state
|
let battery_names = app_state
|
||||||
.converted_data
|
.data_collection
|
||||||
.battery_data
|
.battery_harvest
|
||||||
.iter()
|
.iter()
|
||||||
.enumerate()
|
.enumerate()
|
||||||
.map(|(itx, _)| format!("Battery {itx}"))
|
.map(|(itx, _)| format!("Battery {itx}"))
|
||||||
@ -118,8 +125,8 @@ impl Painter {
|
|||||||
.split(draw_loc)[0];
|
.split(draw_loc)[0];
|
||||||
|
|
||||||
if let Some(battery_details) = app_state
|
if let Some(battery_details) = app_state
|
||||||
.converted_data
|
.data_collection
|
||||||
.battery_data
|
.battery_harvest
|
||||||
.get(battery_widget_state.currently_selected_battery_index)
|
.get(battery_widget_state.currently_selected_battery_index)
|
||||||
{
|
{
|
||||||
let full_width = draw_loc.width.saturating_sub(2);
|
let full_width = draw_loc.width.saturating_sub(2);
|
||||||
@ -195,7 +202,7 @@ impl Painter {
|
|||||||
|
|
||||||
battery_rows.push(Row::new(["Health", &health]).style(self.styles.text_style));
|
battery_rows.push(Row::new(["Health", &health]).style(self.styles.text_style));
|
||||||
|
|
||||||
let header = if app_state.converted_data.battery_data.len() > 1 {
|
let header = if app_state.data_collection.battery_harvest.len() > 1 {
|
||||||
Row::new([""]).bottom_margin(table_gap)
|
Row::new([""]).bottom_margin(table_gap)
|
||||||
} else {
|
} else {
|
||||||
Row::default()
|
Row::default()
|
||||||
@ -314,4 +321,18 @@ mod tests {
|
|||||||
assert_eq!(short_time(3601), "1h 0m 1s".to_string());
|
assert_eq!(short_time(3601), "1h 0m 1s".to_string());
|
||||||
assert_eq!(short_time(3661), "1h 1m 1s".to_string());
|
assert_eq!(short_time(3661), "1h 1m 1s".to_string());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_calculate_basic_use_bars() {
|
||||||
|
// Testing various breakpoints and edge cases.
|
||||||
|
assert_eq!(calculate_basic_use_bars(0.0, 15), 0);
|
||||||
|
assert_eq!(calculate_basic_use_bars(1.0, 15), 0);
|
||||||
|
assert_eq!(calculate_basic_use_bars(5.0, 15), 1);
|
||||||
|
assert_eq!(calculate_basic_use_bars(10.0, 15), 2);
|
||||||
|
assert_eq!(calculate_basic_use_bars(40.0, 15), 6);
|
||||||
|
assert_eq!(calculate_basic_use_bars(45.0, 15), 7);
|
||||||
|
assert_eq!(calculate_basic_use_bars(50.0, 15), 8);
|
||||||
|
assert_eq!(calculate_basic_use_bars(100.0, 15), 15);
|
||||||
|
assert_eq!(calculate_basic_use_bars(150.0, 15), 15);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -6,6 +6,7 @@ pub mod nvidia;
|
|||||||
#[cfg(all(target_os = "linux", feature = "gpu"))]
|
#[cfg(all(target_os = "linux", feature = "gpu"))]
|
||||||
pub mod amd;
|
pub mod amd;
|
||||||
|
|
||||||
|
#[cfg(feature = "battery")]
|
||||||
pub mod batteries;
|
pub mod batteries;
|
||||||
pub mod cpu;
|
pub mod cpu;
|
||||||
pub mod disks;
|
pub mod disks;
|
||||||
|
@ -425,11 +425,6 @@ pub fn get_amd_vecs(
|
|||||||
MemHarvest {
|
MemHarvest {
|
||||||
total_bytes: mem.total,
|
total_bytes: mem.total,
|
||||||
used_bytes: mem.used,
|
used_bytes: mem.used,
|
||||||
use_percent: if mem.total == 0 {
|
|
||||||
None
|
|
||||||
} else {
|
|
||||||
Some(mem.used as f64 / mem.total as f64 * 100.0)
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
@ -10,14 +10,13 @@
|
|||||||
//!
|
//!
|
||||||
//! For more information, refer to the [starship_battery](https://github.com/starship/rust-battery) repo/docs.
|
//! For more information, refer to the [starship_battery](https://github.com/starship/rust-battery) repo/docs.
|
||||||
|
|
||||||
#[cfg(feature = "battery")]
|
|
||||||
use starship_battery::{
|
use starship_battery::{
|
||||||
units::{power::watt, ratio::percent, time::second},
|
units::{power::watt, ratio::percent, time::second},
|
||||||
Battery, Manager, State,
|
Battery, Manager, State,
|
||||||
};
|
};
|
||||||
|
|
||||||
/// Battery state.
|
/// Battery state.
|
||||||
#[derive(Debug, Default, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub enum BatteryState {
|
pub enum BatteryState {
|
||||||
Charging {
|
Charging {
|
||||||
/// Time to full in seconds.
|
/// Time to full in seconds.
|
||||||
@ -29,7 +28,6 @@ pub enum BatteryState {
|
|||||||
},
|
},
|
||||||
Empty,
|
Empty,
|
||||||
Full,
|
Full,
|
||||||
#[default]
|
|
||||||
Unknown,
|
Unknown,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -68,7 +66,6 @@ impl BatteryData {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(feature = "battery")]
|
|
||||||
pub fn refresh_batteries(manager: &Manager, batteries: &mut [Battery]) -> Vec<BatteryData> {
|
pub fn refresh_batteries(manager: &Manager, batteries: &mut [Battery]) -> Vec<BatteryData> {
|
||||||
batteries
|
batteries
|
||||||
.iter_mut()
|
.iter_mut()
|
||||||
|
@ -19,6 +19,18 @@ pub mod arc;
|
|||||||
pub struct MemHarvest {
|
pub struct MemHarvest {
|
||||||
pub used_bytes: u64,
|
pub used_bytes: u64,
|
||||||
pub total_bytes: u64,
|
pub total_bytes: u64,
|
||||||
pub use_percent: Option<f64>, /* TODO: Might be find to just make this an f64, and any
|
}
|
||||||
* consumer checks NaN. */
|
|
||||||
|
impl MemHarvest {
|
||||||
|
/// Return the use percentage. If the total bytes is 0, then this returns `None`.
|
||||||
|
pub fn checked_percent(&self) -> Option<f64> {
|
||||||
|
let used = self.used_bytes as f64;
|
||||||
|
let total = self.total_bytes as f64;
|
||||||
|
|
||||||
|
if total == 0.0 {
|
||||||
|
None
|
||||||
|
} else {
|
||||||
|
Some(used / total * 100.0)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -66,10 +66,5 @@ pub(crate) fn get_arc_usage() -> Option<MemHarvest> {
|
|||||||
Some(MemHarvest {
|
Some(MemHarvest {
|
||||||
total_bytes: mem_total,
|
total_bytes: mem_total,
|
||||||
used_bytes: mem_used,
|
used_bytes: mem_used,
|
||||||
use_percent: if mem_total == 0 {
|
|
||||||
None
|
|
||||||
} else {
|
|
||||||
Some(mem_used as f64 / mem_total as f64 * 100.0)
|
|
||||||
},
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -12,11 +12,6 @@ pub(crate) fn get_ram_usage(sys: &System) -> Option<MemHarvest> {
|
|||||||
Some(MemHarvest {
|
Some(MemHarvest {
|
||||||
used_bytes: mem_used,
|
used_bytes: mem_used,
|
||||||
total_bytes: mem_total,
|
total_bytes: mem_total,
|
||||||
use_percent: if mem_total == 0 {
|
|
||||||
None
|
|
||||||
} else {
|
|
||||||
Some(mem_used as f64 / mem_total as f64 * 100.0)
|
|
||||||
},
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -28,11 +23,6 @@ pub(crate) fn get_swap_usage(sys: &System) -> Option<MemHarvest> {
|
|||||||
Some(MemHarvest {
|
Some(MemHarvest {
|
||||||
used_bytes: mem_used,
|
used_bytes: mem_used,
|
||||||
total_bytes: mem_total,
|
total_bytes: mem_total,
|
||||||
use_percent: if mem_total == 0 {
|
|
||||||
None
|
|
||||||
} else {
|
|
||||||
Some(mem_used as f64 / mem_total as f64 * 100.0)
|
|
||||||
},
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -51,10 +41,5 @@ pub(crate) fn get_cache_usage(sys: &System) -> Option<MemHarvest> {
|
|||||||
Some(MemHarvest {
|
Some(MemHarvest {
|
||||||
total_bytes: mem_total,
|
total_bytes: mem_total,
|
||||||
used_bytes: mem_used,
|
used_bytes: mem_used,
|
||||||
use_percent: if mem_total == 0 {
|
|
||||||
None
|
|
||||||
} else {
|
|
||||||
Some(mem_used as f64 / mem_total as f64 * 100.0)
|
|
||||||
},
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -43,11 +43,6 @@ pub fn get_nvidia_vecs(
|
|||||||
MemHarvest {
|
MemHarvest {
|
||||||
total_bytes: mem.total,
|
total_bytes: mem.total,
|
||||||
used_bytes: mem.used,
|
used_bytes: mem.used,
|
||||||
use_percent: if mem.total == 0 {
|
|
||||||
None
|
|
||||||
} else {
|
|
||||||
Some(mem.used as f64 / mem.total as f64 * 100.0)
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
@ -8,13 +8,18 @@ use std::borrow::Cow;
|
|||||||
use crate::{
|
use crate::{
|
||||||
app::{data_farmer::DataCollection, AxisScaling},
|
app::{data_farmer::DataCollection, AxisScaling},
|
||||||
canvas::components::time_chart::Point,
|
canvas::components::time_chart::Point,
|
||||||
data_collection::{
|
data_collection::{cpu::CpuDataType, memory::MemHarvest, temperature::TemperatureType},
|
||||||
batteries::BatteryData, cpu::CpuDataType, memory::MemHarvest, temperature::TemperatureType,
|
|
||||||
},
|
|
||||||
utils::{data_prefixes::*, data_units::DataUnit},
|
utils::{data_prefixes::*, data_units::DataUnit},
|
||||||
widgets::{DiskWidgetData, TempWidgetData},
|
widgets::{DiskWidgetData, TempWidgetData},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// TODO: [NETWORKING] add min/max/mean of each
|
||||||
|
// min_rx : f64,
|
||||||
|
// max_rx : f64,
|
||||||
|
// mean_rx: f64,
|
||||||
|
// min_tx: f64,
|
||||||
|
// max_tx: f64,
|
||||||
|
// mean_tx: f64,
|
||||||
#[derive(Default, Debug)]
|
#[derive(Default, Debug)]
|
||||||
pub struct ConvertedNetworkData {
|
pub struct ConvertedNetworkData {
|
||||||
pub rx: Vec<Point>,
|
pub rx: Vec<Point>,
|
||||||
@ -23,13 +28,6 @@ pub struct ConvertedNetworkData {
|
|||||||
pub tx_display: String,
|
pub tx_display: String,
|
||||||
pub total_rx_display: Option<String>,
|
pub total_rx_display: Option<String>,
|
||||||
pub total_tx_display: Option<String>,
|
pub total_tx_display: Option<String>,
|
||||||
// TODO: [NETWORKING] add min/max/mean of each
|
|
||||||
// min_rx : f64,
|
|
||||||
// max_rx : f64,
|
|
||||||
// mean_rx: f64,
|
|
||||||
// min_tx: f64,
|
|
||||||
// max_tx: f64,
|
|
||||||
// mean_tx: f64,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
@ -58,6 +56,10 @@ pub struct ConvertedData {
|
|||||||
pub swap_labels: Option<(String, String)>,
|
pub swap_labels: Option<(String, String)>,
|
||||||
|
|
||||||
// TODO: Switch this and all data points over to a better data structure.
|
// TODO: Switch this and all data points over to a better data structure.
|
||||||
|
//
|
||||||
|
// We can dedupe the f64 for time by storing it alongside this data structure.
|
||||||
|
// We can also just store everything via an references and iterators to avoid
|
||||||
|
// duplicating data, I guess.
|
||||||
pub mem_data: Vec<Point>,
|
pub mem_data: Vec<Point>,
|
||||||
#[cfg(not(target_os = "windows"))]
|
#[cfg(not(target_os = "windows"))]
|
||||||
pub cache_data: Vec<Point>,
|
pub cache_data: Vec<Point>,
|
||||||
@ -74,7 +76,6 @@ pub struct ConvertedData {
|
|||||||
pub load_avg_data: [f32; 3],
|
pub load_avg_data: [f32; 3],
|
||||||
pub cpu_data: Vec<CpuWidgetData>,
|
pub cpu_data: Vec<CpuWidgetData>,
|
||||||
|
|
||||||
pub battery_data: Vec<BatteryData>,
|
|
||||||
pub disk_data: Vec<DiskWidgetData>,
|
pub disk_data: Vec<DiskWidgetData>,
|
||||||
pub temp_data: Vec<TempWidgetData>,
|
pub temp_data: Vec<TempWidgetData>,
|
||||||
}
|
}
|
||||||
@ -268,8 +269,9 @@ fn get_binary_unit_and_denominator(bytes: u64) -> (&'static str, f64) {
|
|||||||
/// Returns the unit type and denominator for given total amount of memory in
|
/// Returns the unit type and denominator for given total amount of memory in
|
||||||
/// kibibytes.
|
/// kibibytes.
|
||||||
pub fn convert_mem_label(harvest: &MemHarvest) -> Option<(String, String)> {
|
pub fn convert_mem_label(harvest: &MemHarvest) -> Option<(String, String)> {
|
||||||
if harvest.total_bytes > 0 {
|
(harvest.total_bytes > 0).then(|| {
|
||||||
Some((format!("{:3.0}%", harvest.use_percent.unwrap_or(0.0)), {
|
let percentage = harvest.used_bytes as f64 / harvest.total_bytes as f64 * 100.0;
|
||||||
|
(format!("{percentage:3.0}%"), {
|
||||||
let (unit, denominator) = get_binary_unit_and_denominator(harvest.total_bytes);
|
let (unit, denominator) = get_binary_unit_and_denominator(harvest.total_bytes);
|
||||||
|
|
||||||
format!(
|
format!(
|
||||||
@ -279,10 +281,8 @@ pub fn convert_mem_label(harvest: &MemHarvest) -> Option<(String, String)> {
|
|||||||
(harvest.total_bytes as f64 / denominator),
|
(harvest.total_bytes as f64 / denominator),
|
||||||
unit
|
unit
|
||||||
)
|
)
|
||||||
}))
|
})
|
||||||
} else {
|
})
|
||||||
None
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_network_points(
|
pub fn get_network_points(
|
||||||
@ -549,27 +549,32 @@ pub fn convert_gpu_data(current_data: &DataCollection) -> Option<Vec<ConvertedGp
|
|||||||
.gpu_harvest
|
.gpu_harvest
|
||||||
.iter()
|
.iter()
|
||||||
.zip(point_vec)
|
.zip(point_vec)
|
||||||
.map(|(gpu, points)| {
|
.filter_map(|(gpu, points)| {
|
||||||
let short_name = {
|
(gpu.1.total_bytes > 0).then(|| {
|
||||||
let last_words = gpu.0.split_whitespace().rev().take(2).collect::<Vec<_>>();
|
let short_name = {
|
||||||
let short_name = format!("{} {}", last_words[1], last_words[0]);
|
let last_words = gpu.0.split_whitespace().rev().take(2).collect::<Vec<_>>();
|
||||||
short_name
|
let short_name = format!("{} {}", last_words[1], last_words[0]);
|
||||||
};
|
short_name
|
||||||
|
};
|
||||||
|
|
||||||
ConvertedGpuData {
|
let percent = gpu.1.used_bytes as f64 / gpu.1.total_bytes as f64 * 100.0;
|
||||||
name: short_name,
|
|
||||||
points,
|
|
||||||
mem_percent: format!("{:3.0}%", gpu.1.use_percent.unwrap_or(0.0)),
|
|
||||||
mem_total: {
|
|
||||||
let (unit, denominator) = get_binary_unit_and_denominator(gpu.1.total_bytes);
|
|
||||||
|
|
||||||
format!(
|
ConvertedGpuData {
|
||||||
" {:.1}{unit}/{:.1}{unit}",
|
name: short_name,
|
||||||
gpu.1.used_bytes as f64 / denominator,
|
points,
|
||||||
(gpu.1.total_bytes as f64 / denominator),
|
mem_percent: format!("{percent:3.0}%"),
|
||||||
)
|
mem_total: {
|
||||||
},
|
let (unit, denominator) =
|
||||||
}
|
get_binary_unit_and_denominator(gpu.1.total_bytes);
|
||||||
|
|
||||||
|
format!(
|
||||||
|
" {:.1}{unit}/{:.1}{unit}",
|
||||||
|
gpu.1.used_bytes as f64 / denominator,
|
||||||
|
(gpu.1.total_bytes as f64 / denominator),
|
||||||
|
)
|
||||||
|
},
|
||||||
|
}
|
||||||
|
})
|
||||||
})
|
})
|
||||||
.collect::<Vec<ConvertedGpuData>>();
|
.collect::<Vec<ConvertedGpuData>>();
|
||||||
|
|
||||||
|
@ -509,14 +509,6 @@ pub fn start_bottom() -> anyhow::Result<()> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(feature = "battery")]
|
|
||||||
{
|
|
||||||
if app.used_widgets.use_battery {
|
|
||||||
app.converted_data.battery_data =
|
|
||||||
app.data_collection.battery_harvest.clone();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
app.update_data();
|
app.update_data();
|
||||||
try_drawing(&mut terminal, &mut app, &mut painter)?;
|
try_drawing(&mut terminal, &mut app, &mut painter)?;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user