main.rs 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. extern crate timer;
  2. extern crate termion;
  3. extern crate systemstat;
  4. use std::thread;
  5. use termion::{cursor, color, clear, terminal_size};
  6. use termion::color::Color;
  7. use termion::raw::{IntoRawMode};
  8. use termion::screen::{AlternateScreen};
  9. use termion::async_stdin;
  10. use std::io::{Read, Write, stdout};
  11. use std::time::{Duration, Instant};
  12. use std::cmp::min;
  13. use systemstat::{System, Platform, Memory};
  14. use systemstat::data::{LoadAverage};
  15. fn update_values<T>(value:T, values:&mut Vec<T>, max_length:usize)
  16. {
  17. values.push(value);
  18. if values.len() > max_length
  19. {
  20. let number = values.len()-max_length;
  21. values.drain(0..number);
  22. }
  23. }
  24. fn print_cpu_load_time<W:Write>(stdout:&mut W, load_time:LoadAverage)
  25. {
  26. write!(stdout, "{}{}{}{} {}{} {}{}", cursor::Goto(1,3), clear::CurrentLine,
  27. color::Fg(color::Yellow), load_time.one,
  28. color::Fg(color::LightYellow), load_time.five,
  29. color::Fg(color::White), load_time.fifteen
  30. ).unwrap();
  31. }
  32. fn print_mem_load<W:Write>(stdout:&mut W, memory:Memory)
  33. {
  34. write!(stdout, "{}{}{}{}/{}{}", cursor::Goto(1,4), clear::CurrentLine,
  35. color::Fg(color::Yellow), memory.total - memory.free,
  36. color::Fg(color::White), memory.total
  37. ).unwrap();
  38. }
  39. fn print_graph<W:Write, C:Color>(stdout:&mut W, values:&[f32], y_pos:u16, color:color::Fg<C>)
  40. {
  41. const GRAPH:&'static str = "▁▂▃▄▅▆▇█";
  42. write!(stdout, "{}{}{}", cursor::Goto(1, y_pos), clear::CurrentLine, color).unwrap();
  43. for value in values {
  44. if *value <= 1. as f32
  45. {
  46. let i:usize = (value * (GRAPH.chars().count() as f32)) as usize;
  47. match GRAPH.chars().nth(i)
  48. {
  49. Some(c) => write!(stdout, "{}", c).unwrap(),
  50. None => write!(stdout, "#").unwrap()
  51. }
  52. }
  53. else
  54. {
  55. write!(stdout, "{}█{}", color::Fg(color::Red), color).unwrap();
  56. }
  57. }
  58. }
  59. fn main() {
  60. let mut screen = AlternateScreen::from(stdout().into_raw_mode().unwrap());
  61. let mut stdin = async_stdin().bytes();
  62. let system = System::new();
  63. let mut cpu_load_graph:Vec<f32> = Vec::new();
  64. let mut mem_load_graph:Vec<f32> = Vec::new();
  65. let start_time = Instant::now();
  66. let mut num_seconds:u64 = 0;
  67. let mut previous_size:(u16, u16) = (0,0);
  68. write!(screen, "{}", cursor::Hide).unwrap();
  69. loop {
  70. let b = stdin.next();
  71. match terminal_size()
  72. {
  73. Ok(size) => {
  74. if size != previous_size
  75. {
  76. write!(screen, "{}", clear::All).unwrap();
  77. previous_size = size;
  78. }
  79. let x:usize = size.0 as usize & 0xFFFF;
  80. let new_time = start_time.elapsed().as_secs();
  81. if new_time > num_seconds
  82. {
  83. let cpu = system.load_average();
  84. if let Ok(cpu_load) = cpu
  85. {
  86. update_values(cpu_load.one, &mut cpu_load_graph, x);
  87. print_cpu_load_time(&mut screen, cpu_load);
  88. }
  89. if let Ok(mem_load) = system.memory()
  90. {
  91. update_values(((mem_load.total.as_usize() - mem_load.free.as_usize()) as f32) / (mem_load.total.as_usize() as f32), &mut mem_load_graph, x);
  92. print_mem_load(&mut screen, mem_load);
  93. }
  94. print_graph(&mut screen, &cpu_load_graph[0..min(x, cpu_load_graph.len())], 1, color::Fg(color::White));
  95. print_graph(&mut screen, &mem_load_graph[0..min(x, mem_load_graph.len())], 2, color::Fg(color::Blue));
  96. screen.flush().unwrap();
  97. num_seconds = new_time;
  98. }
  99. if let Some(Ok(b'q')) = b {
  100. break;
  101. }
  102. thread::sleep(Duration::from_millis(50));
  103. },
  104. Err(e) => {
  105. println!("{}{}Error : {}", clear::All, cursor::Goto(1,1), e);
  106. break
  107. }
  108. }
  109. }
  110. write!(screen, "{}", cursor::Show).unwrap();
  111. }