fuedra-schwitzt/src/cpuusagebuffer.rs

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
}
}