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]] [[package]]
name = "rsblocks" name = "rsblocks"
version = "0.1.9" version = "0.1.11"
dependencies = [ dependencies = [
"alsa", "alsa",
"breadx", "breadx",

View File

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

View File

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

View File

@ -1,9 +1,7 @@
# This is the full configuration template available for rsblocks. # This is the full configuration template available for rsblocks.
# NOTE: the (delay) is in **SECONDS** and the float point "." is required. # NOTE: the (delay) is in **SECONDS** and the float point "." is required.
general: seperator: '┃'
seperator: '┃'
# Time always running, no enabled option for this # Time always running, no enabled option for this
@ -12,6 +10,14 @@ time:
format: '%d %b, %I:%M:%S %p' format: '%d %b, %I:%M:%S %p'
delay: 1.0 delay: 1.0
# ethernet/wifi bandwith
netspeed:
transmit_icon: ''
recieve_icon: ''
interface: 'wlan0'
enabled: false
memory: memory:
icon: '▦' icon: '▦'

View File

@ -1,26 +1,28 @@
mod battery; mod battery;
mod cputemp; mod cputemp;
mod disk; mod disk;
mod loadavg;
mod memory; mod memory;
mod mpd; mod mpd;
mod netspeed;
mod spotify;
mod time; mod time;
mod uptime; mod uptime;
mod volume; mod volume;
mod weather; mod weather;
mod spotify;
mod loadavg;
use self::mpd::Mpd; use self::mpd::Mpd;
use battery::Battery; use battery::Battery;
use cputemp::CpuTemp; use cputemp::CpuTemp;
use disk::Disk; use disk::Disk;
use loadavg::LoadAvg;
use memory::Memory; use memory::Memory;
use netspeed::NetSpeed;
use spotify::Spotify;
use time::Time; use time::Time;
use uptime::Uptime; use uptime::Uptime;
use volume::Volume; use volume::Volume;
use weather::Weather; use weather::Weather;
use spotify::Spotify;
use loadavg::LoadAvg;
use std::default::Default; use std::default::Default;
use std::fs::File; use std::fs::File;
@ -36,7 +38,8 @@ lazy_static! {
match File::open(&yml_source) { match File::open(&yml_source) {
Ok(mut file) => { 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") serde_yaml::from_str(&data).expect("Failed to parse config")
} }
Err(_) => Config::default(), Err(_) => Config::default(),
@ -80,7 +83,10 @@ pub struct Config {
pub spotify: Spotify, pub spotify: Spotify,
#[serde(default)] #[serde(default)]
pub loadavg: LoadAvg pub loadavg: LoadAvg,
#[serde(default)]
pub netspeed: NetSpeed,
} }
impl Default for Config { impl Default for Config {
@ -97,7 +103,8 @@ impl Default for Config {
uptime: Default::default(), uptime: Default::default(),
mpd: Default::default(), mpd: Default::default(),
spotify: 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::types::*;
use crate::utils::*; use crate::utils::*;
use crate::config::CONFIG;
use std::sync::mpsc; use std::sync::mpsc;
use std::thread; use std::thread;
use std::time::Duration; use std::time::Duration;
/* This is ugly, maybe i will try to impliment a threadpool */
pub fn run(mut blocks: Blocks) { pub fn run(mut blocks: Blocks) {
let (tx, rx) = mpsc::channel(); 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 // Disk thread
if CONFIG.disk.enabled { if CONFIG.disk.enabled {
let disk_tx = tx.clone(); let disk_tx = tx.clone();
@ -122,7 +130,7 @@ pub fn run(mut blocks: Blocks) {
//Main //Main
{ {
// NOTE: order matters to the final format // 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 //iterating the values recieved from the threads
for data in rx { for data in rx {
match data { match data {
@ -130,13 +138,14 @@ pub fn run(mut blocks: Blocks) {
ThreadsData::Mpd(x) => bar[1] = x, ThreadsData::Mpd(x) => bar[1] = x,
ThreadsData::Sound(x) => bar[2] = x, ThreadsData::Sound(x) => bar[2] = x,
ThreadsData::Weather(x) => bar[3] = x, ThreadsData::Weather(x) => bar[3] = x,
ThreadsData::Disk(x) => bar[4] = x, ThreadsData::NetSpeed(x) => bar[4] = x,
ThreadsData::Memory(x) => bar[5] = x, ThreadsData::Disk(x) => bar[5] = x,
ThreadsData::CpuTemp(x) => bar[6] = x, ThreadsData::Memory(x) => bar[6] = x,
ThreadsData::LoadAvg(x) => bar[7] = x, ThreadsData::CpuTemp(x) => bar[7] = x,
ThreadsData::Battery(x) => bar[8] = x, ThreadsData::LoadAvg(x) => bar[8] = x,
ThreadsData::Uptime(x) => bar[9] = x, ThreadsData::Battery(x) => bar[9] = x,
ThreadsData::Time(x) => bar[10] = x, ThreadsData::Uptime(x) => bar[10] = x,
ThreadsData::Time(x) => bar[11] = x,
} }
// match ends here // match ends here

View File

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

View File

@ -4,6 +4,7 @@ pub mod disk;
pub mod load_average; pub mod load_average;
pub mod memory; pub mod memory;
pub mod mpd; pub mod mpd;
pub mod netspeed;
pub mod spotify; pub mod spotify;
pub mod time; pub mod time;
pub mod uptime; 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])
}