Reads network bandwith (#39)

* updated crate version

* updated crate version

* rsblocks now reads netspeed per second
This commit is contained in:
Mustafa Salih 2021-01-26 02:44:13 +03:00 committed by GitHub
parent 9525a10751
commit 6c0dfddead
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 122 additions and 23 deletions

2
Cargo.lock generated
View File

@ -446,7 +446,7 @@ checksum = "4e1b7878800220a76a08f32c057829511440f65528b63b940f2f2bc145d7ac68"
[[package]]
name = "rsblocks"
version = "0.1.9"
version = "0.1.11"
dependencies = [
"alsa",
"breadx",

View File

@ -1,6 +1,6 @@
[package]
name = "rsblocks"
version = "0.1.9"
version = "0.1.11"
authors = ["mustafa salih <mustafasalih1991@gmail.com>"]
edition = "2018"
readme = "README.md"

View File

@ -11,6 +11,7 @@ A multi threaded fast status bar for dwm window manager written in **Rust** 🦀
## Features
* Multi Threads
* Time/Date
* Net Usage
* Memory Usage
* Disk Usage
* Weather Temperature

View File

@ -1,8 +1,6 @@
# This is the full configuration template available for rsblocks.
# NOTE: the (delay) is in **SECONDS** and the float point "." is required.
general:
seperator: '┃'
@ -13,6 +11,14 @@ time:
delay: 1.0
# ethernet/wifi bandwith
netspeed:
transmit_icon: ''
recieve_icon: ''
interface: 'wlan0'
enabled: false
memory:
icon: '▦'
enabled: true

View File

@ -1,26 +1,28 @@
mod battery;
mod cputemp;
mod disk;
mod loadavg;
mod memory;
mod mpd;
mod netspeed;
mod spotify;
mod time;
mod uptime;
mod volume;
mod weather;
mod spotify;
mod loadavg;
use self::mpd::Mpd;
use battery::Battery;
use cputemp::CpuTemp;
use disk::Disk;
use loadavg::LoadAvg;
use memory::Memory;
use netspeed::NetSpeed;
use spotify::Spotify;
use time::Time;
use uptime::Uptime;
use volume::Volume;
use weather::Weather;
use spotify::Spotify;
use loadavg::LoadAvg;
use std::default::Default;
use std::fs::File;
@ -36,7 +38,8 @@ lazy_static! {
match File::open(&yml_source) {
Ok(mut file) => {
file.read_to_string(&mut data).expect("Failed to read config to string");
file.read_to_string(&mut data)
.expect("Failed to read config to string");
serde_yaml::from_str(&data).expect("Failed to parse config")
}
Err(_) => Config::default(),
@ -80,7 +83,10 @@ pub struct Config {
pub spotify: Spotify,
#[serde(default)]
pub loadavg: LoadAvg
pub loadavg: LoadAvg,
#[serde(default)]
pub netspeed: NetSpeed,
}
impl Default for Config {
@ -97,7 +103,8 @@ impl Default for Config {
uptime: Default::default(),
mpd: Default::default(),
spotify: Default::default(),
loadavg: Default::default()
loadavg: Default::default(),
netspeed: Default::default(),
}
}
}

21
src/config/netspeed.rs Normal file
View File

@ -0,0 +1,21 @@
use serde::{Deserialize, Serialize};
use std::default::Default;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct NetSpeed {
pub transmit_icon: String,
pub recieve_icon: String,
pub interface: String,
pub enabled: bool,
}
impl Default for NetSpeed {
fn default() -> Self {
NetSpeed {
transmit_icon: String::from(""),
recieve_icon: String::from(""),
interface: String::from("wlan0"),
enabled: false,
}
}
}

View File

@ -1,12 +1,10 @@
use crate::config::CONFIG;
use crate::types::*;
use crate::utils::*;
use crate::config::CONFIG;
use std::sync::mpsc;
use std::thread;
use std::time::Duration;
/* This is ugly, maybe i will try to impliment a threadpool */
pub fn run(mut blocks: Blocks) {
let (tx, rx) = mpsc::channel();
@ -49,6 +47,16 @@ pub fn run(mut blocks: Blocks) {
});
}
// net speed thread
if CONFIG.netspeed.enabled {
let net_tx = tx.clone();
thread::spawn(move || loop {
// get_netspeed will sleep inside the function
let net_data = ThreadsData::NetSpeed(netspeed::get_netspeed());
net_tx.send(net_data).unwrap();
});
}
// Disk thread
if CONFIG.disk.enabled {
let disk_tx = tx.clone();
@ -122,7 +130,7 @@ pub fn run(mut blocks: Blocks) {
//Main
{
// NOTE: order matters to the final format
let mut bar: Vec<String> = vec![String::from(""); 11];
let mut bar: Vec<String> = vec![String::from(""); 12];
//iterating the values recieved from the threads
for data in rx {
match data {
@ -130,13 +138,14 @@ pub fn run(mut blocks: Blocks) {
ThreadsData::Mpd(x) => bar[1] = x,
ThreadsData::Sound(x) => bar[2] = x,
ThreadsData::Weather(x) => bar[3] = x,
ThreadsData::Disk(x) => bar[4] = x,
ThreadsData::Memory(x) => bar[5] = x,
ThreadsData::CpuTemp(x) => bar[6] = x,
ThreadsData::LoadAvg(x) => bar[7] = x,
ThreadsData::Battery(x) => bar[8] = x,
ThreadsData::Uptime(x) => bar[9] = x,
ThreadsData::Time(x) => bar[10] = x,
ThreadsData::NetSpeed(x) => bar[4] = x,
ThreadsData::Disk(x) => bar[5] = x,
ThreadsData::Memory(x) => bar[6] = x,
ThreadsData::CpuTemp(x) => bar[7] = x,
ThreadsData::LoadAvg(x) => bar[8] = x,
ThreadsData::Battery(x) => bar[9] = x,
ThreadsData::Uptime(x) => bar[10] = x,
ThreadsData::Time(x) => bar[11] = x,
}
// match ends here

View File

@ -13,6 +13,7 @@ pub enum ThreadsData {
Uptime(String),
Spotify(String),
LoadAvg(String),
NetSpeed(String),
}
#[derive(Clone)]
@ -113,6 +114,14 @@ pub struct LoadAvg {
pub delay: f64,
}
#[derive(Clone)]
pub struct NetSpeed {
pub transmit_icon: String,
pub recieve_icon: String,
pub interface: String,
pub enabled: bool,
}
pub struct Blocks {
pub disp: Display<name::NameConnection>,
pub root: Window,

View File

@ -4,6 +4,7 @@ pub mod disk;
pub mod load_average;
pub mod memory;
pub mod mpd;
pub mod netspeed;
pub mod spotify;
pub mod time;
pub mod uptime;

45
src/utils/netspeed.rs Normal file
View File

@ -0,0 +1,45 @@
use crate::config::CONFIG;
use std::fs::read_to_string;
use std::thread;
use std::time::Duration;
pub fn get_netspeed() -> String {
let tx1: u64 = parse_speed_file("tx_bytes");
let rx1: u64 = parse_speed_file("rx_bytes");
thread::sleep(Duration::from_secs(1));
let tx2: u64 = parse_speed_file("tx_bytes");
let rx2: u64 = parse_speed_file("rx_bytes");
let tx_bps = tx2 - tx1;
let rx_bps = rx2 - rx1;
let tx = calculate(tx_bps);
let rx = calculate(rx_bps);
format!(
" {} {} {} {} {}",
CONFIG.netspeed.recieve_icon, rx, CONFIG.netspeed.transmit_icon, tx, CONFIG.seperator
)
}
fn parse_speed_file(pth: &str) -> u64 {
let base_path = format!("/sys/class/net/{}/statistics/", CONFIG.netspeed.interface);
let x: u64 = read_to_string(base_path.to_owned() + pth)
.unwrap()
.trim()
.parse::<u64>()
.unwrap();
x
}
fn calculate(speed: u64) -> String {
let lookup = ["B", "kB", "MB"];
let mut speed = speed as f64;
let mut idx = 0;
while speed >= 1024.0 && idx < lookup.len() {
speed /= 1024.0;
idx += 1;
}
format!("{:.1} {}", speed, lookup[idx])
}