98 lines
2.4 KiB
Rust
98 lines
2.4 KiB
Rust
use crate::cpustats::get_cpu_usage;
|
|
use crate::cpustats::get_clk_tck;
|
|
use crate::ansiiescape;
|
|
use crate::braille::braille_symbol;
|
|
use crate::vectools::ValuePairs;
|
|
|
|
pub struct CpuUsageBuffer {
|
|
clk_tck: u32,
|
|
last_value: Vec<u32>,
|
|
buffer: Vec<Vec<u32>>,
|
|
}
|
|
|
|
fn calc_diff(a: Vec<u32>, b: Vec<u32>) -> Vec<u32> {
|
|
a.into_iter().zip(b).map(|(a, b)| b - a).collect()
|
|
}
|
|
|
|
fn cpu_usage_to_braille(cu: u32) -> u8 {
|
|
match cu {
|
|
0..=24 => 0b01000000,
|
|
25..=49 => 0b01000100,
|
|
50..=74 => 0b01000110,
|
|
75..=100 => 0b01000111,
|
|
_ => 0,
|
|
}
|
|
}
|
|
|
|
fn cpu_usage_to_color(cu: u32) -> String {
|
|
match cu {
|
|
0..=19 => ansiiescape::color(0x00, 0xFF, 0x00),
|
|
20..=39 => ansiiescape::color(0x88, 0xFF, 0x00),
|
|
40..=59 => ansiiescape::color(0xFF, 0xFF, 0x00),
|
|
60..=79 => ansiiescape::color(0xFF, 0x88, 0x00),
|
|
80..=100 => ansiiescape::color(0xFF, 0x00, 0x00),
|
|
_ => "".to_string(),
|
|
}
|
|
}
|
|
|
|
fn shift_braille_one_col(b: u8) -> u8 {
|
|
let upper = (b & 0b0000111) << 3;
|
|
let lower = (b & 0b01000000) << 1;
|
|
|
|
upper + lower
|
|
}
|
|
|
|
fn cpu_usages_to_braille(a: u32, b: u32) -> u8 {
|
|
let a_braille = cpu_usage_to_braille(a);
|
|
let b_braille = cpu_usage_to_braille(b);
|
|
|
|
a_braille + shift_braille_one_col(b_braille)
|
|
}
|
|
|
|
fn max(a: u32, b: u32) -> u32 {
|
|
if a > b {
|
|
return a;
|
|
}
|
|
else {
|
|
return b;
|
|
}
|
|
}
|
|
|
|
impl CpuUsageBuffer {
|
|
pub fn new() -> Self {
|
|
let first_value = get_cpu_usage();
|
|
Self {
|
|
clk_tck: get_clk_tck(),
|
|
last_value: first_value.clone(),
|
|
buffer: vec![vec![0;first_value.len()];100],
|
|
}
|
|
}
|
|
|
|
pub fn push(&mut self) {
|
|
let new_value = get_cpu_usage();
|
|
|
|
self.buffer.rotate_right(1);
|
|
self.buffer[0] = calc_diff(self.last_value.clone(), new_value.clone()).into_iter().map(|v| (v * 100) / self.clk_tck).collect();
|
|
self.last_value = new_value;
|
|
}
|
|
|
|
pub fn cpu_num(&self) -> usize {
|
|
self.buffer[0].len()
|
|
}
|
|
|
|
pub fn braille(&self) -> String {
|
|
let mut out: String = String::new();
|
|
for n in 0..(self.cpu_num()) {
|
|
for u in ValuePairs::new(self.buffer.clone().into_iter()) {
|
|
out += &cpu_usage_to_color(max(u.0[n], u.1[n]));
|
|
out += &braille_symbol(cpu_usages_to_braille(u.0[n], u.1[n]));
|
|
}
|
|
out += &ansiiescape::reset();
|
|
out += "\n";
|
|
}
|
|
|
|
out
|
|
}
|
|
}
|
|
|