aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMustafa Salih <37256744+MustafaSalih1993@users.noreply.github.com>2021-01-26 02:44:13 +0300
committerGitHub <noreply@github.com>2021-01-26 02:44:13 +0300
commit6c0dfddead48e603826fbf637fe51f02e8320223 (patch)
tree3ac7796df10cd487598e4c256c96a84ab08a39fd /src
parent9525a1075199d5fd202d1744dc502ff5a766aa99 (diff)
Reads network bandwith (#39)
* updated crate version * updated crate version * rsblocks now reads netspeed per second
Diffstat (limited to 'src')
-rw-r--r--src/config/mod.rs21
-rw-r--r--src/config/netspeed.rs21
-rw-r--r--src/run.rs31
-rw-r--r--src/types.rs9
-rw-r--r--src/utils/mod.rs1
-rw-r--r--src/utils/netspeed.rs45
6 files changed, 110 insertions, 18 deletions
diff --git a/src/config/mod.rs b/src/config/mod.rs
index 1a1ffd5..5741b11 100644
--- a/src/config/mod.rs
+++ b/src/config/mod.rs
@@ -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(),
}
}
}
diff --git a/src/config/netspeed.rs b/src/config/netspeed.rs
new file mode 100644
index 0000000..3e6a536
--- /dev/null
+++ b/src/config/netspeed.rs
@@ -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,
+ }
+ }
+}
diff --git a/src/run.rs b/src/run.rs
index c6c72a6..141e32d 100644
--- a/src/run.rs
+++ b/src/run.rs
@@ -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
diff --git a/src/types.rs b/src/types.rs
index a4d597e..7184d47 100644
--- a/src/types.rs
+++ b/src/types.rs
@@ -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,
diff --git a/src/utils/mod.rs b/src/utils/mod.rs
index 6834d49..3b4eb7b 100644
--- a/src/utils/mod.rs
+++ b/src/utils/mod.rs
@@ -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;
diff --git a/src/utils/netspeed.rs b/src/utils/netspeed.rs
new file mode 100644
index 0000000..59f740f
--- /dev/null
+++ b/src/utils/netspeed.rs
@@ -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])
+}