refactor container and stacked series
This commit is contained in:
parent
cb8247b6f1
commit
822622d9a9
|
|
@ -1,6 +1,6 @@
|
||||||
pub struct Container {
|
pub struct Container {
|
||||||
max_samples: u32,
|
max_samples: u32,
|
||||||
pub data: Vec<Vec<f32>>, // TODO: make this private, pass iterator instead
|
data: Vec<Vec<f32>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Container {
|
impl Container {
|
||||||
|
|
@ -17,4 +17,8 @@ impl Container {
|
||||||
}
|
}
|
||||||
self.data.push(data)
|
self.data.push(data)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn iter(&self) -> std::slice::Iter<'_, Vec<f32>> {
|
||||||
|
self.data.iter()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1,3 +1,5 @@
|
||||||
|
mod container;
|
||||||
mod stacked;
|
mod stacked;
|
||||||
|
|
||||||
|
pub use container::Container;
|
||||||
pub use stacked::{StackedConfig, StackedSeries, StackedSeriesConfig, stacked};
|
pub use stacked::{StackedConfig, StackedSeries, StackedSeriesConfig, stacked};
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,8 @@ use imageproc::{
|
||||||
rect::Rect,
|
rect::Rect,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
use crate::Container;
|
||||||
|
|
||||||
pub struct StackedConfig {
|
pub struct StackedConfig {
|
||||||
pub width_px_per_sample: u32,
|
pub width_px_per_sample: u32,
|
||||||
pub height_px: u32,
|
pub height_px: u32,
|
||||||
|
|
@ -15,12 +17,27 @@ pub struct StackedSeriesConfig {
|
||||||
pub color: (u8, u8, u8),
|
pub color: (u8, u8, u8),
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct StackedSeries<'a> {
|
pub struct StackedSeries {
|
||||||
pub config: &'a StackedConfig,
|
pub config: StackedConfig,
|
||||||
pub data: &'a Vec<Vec<f32>>,
|
data: Container,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn stacked(graph: StackedSeries) -> RgbImage {
|
impl StackedSeries {
|
||||||
|
pub fn new(config: StackedConfig) -> StackedSeries {
|
||||||
|
let max_samples = config.max_samples;
|
||||||
|
|
||||||
|
StackedSeries {
|
||||||
|
config: config,
|
||||||
|
data: Container::new(max_samples),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn push(&mut self, data: Vec<f32>) {
|
||||||
|
self.data.push(data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn stacked(graph: &StackedSeries) -> RgbImage {
|
||||||
let mut image = RgbImage::new(
|
let mut image = RgbImage::new(
|
||||||
graph.config.width_px_per_sample * graph.config.max_samples,
|
graph.config.width_px_per_sample * graph.config.max_samples,
|
||||||
graph.config.height_px as u32,
|
graph.config.height_px as u32,
|
||||||
|
|
@ -31,7 +48,7 @@ pub fn stacked(graph: StackedSeries) -> RgbImage {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// return scale factor to scale stacked series sum to range 0..1
|
/// return scale factor to scale stacked series sum to range 0..1
|
||||||
fn get_scale(series: &Vec<Vec<f32>>) -> f32 {
|
fn get_scale(series: &Container) -> f32 {
|
||||||
let max = series
|
let max = series
|
||||||
.iter()
|
.iter()
|
||||||
.map(|s| s.iter().sum())
|
.map(|s| s.iter().sum())
|
||||||
|
|
@ -42,7 +59,7 @@ fn get_scale(series: &Vec<Vec<f32>>) -> f32 {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn draw_scaled_graph(image: &mut RgbImage, graph: &StackedSeries) {
|
fn draw_scaled_graph(image: &mut RgbImage, graph: &StackedSeries) {
|
||||||
let scale = get_scale(graph.data);
|
let scale = get_scale(&graph.data);
|
||||||
let colors = graph
|
let colors = graph
|
||||||
.config
|
.config
|
||||||
.series
|
.series
|
||||||
|
|
@ -52,7 +69,7 @@ fn draw_scaled_graph(image: &mut RgbImage, graph: &StackedSeries) {
|
||||||
|
|
||||||
let mut x_offset = 0f32;
|
let mut x_offset = 0f32;
|
||||||
|
|
||||||
for point_in_time in graph.data {
|
for point_in_time in graph.data.iter() {
|
||||||
let mut y_offset = graph.config.height_px as f32;
|
let mut y_offset = graph.config.height_px as f32;
|
||||||
|
|
||||||
let mut series_idx = 0usize;
|
let mut series_idx = 0usize;
|
||||||
|
|
@ -77,11 +94,13 @@ mod test {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_get_scale() {
|
fn test_get_scale() {
|
||||||
let conf = vec![
|
let mut c = Container::new(10);
|
||||||
vec![1., 2., 3., 4., 5.],
|
c.push(vec![1., 0., 0.]);
|
||||||
vec![0., 1., 0., 0., 0.],
|
c.push(vec![2., 1., 0.]);
|
||||||
vec![0., 0., 0., 0., 5.],
|
c.push(vec![3., 0., 0.]);
|
||||||
];
|
c.push(vec![4., 0., 5.]);
|
||||||
assert_eq!(get_scale(&conf), 0.1);
|
c.push(vec![5., 0., 5.]);
|
||||||
|
|
||||||
|
assert_eq!(get_scale(&c), 0.1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,5 @@
|
||||||
mod container;
|
|
||||||
mod observables;
|
mod observables;
|
||||||
|
|
||||||
use container::Container;
|
|
||||||
use draw::{StackedConfig, StackedSeries, StackedSeriesConfig, stacked};
|
use draw::{StackedConfig, StackedSeries, StackedSeriesConfig, stacked};
|
||||||
use observables::CpuObservable;
|
use observables::CpuObservable;
|
||||||
use protocol::Protocol;
|
use protocol::Protocol;
|
||||||
|
|
@ -22,15 +20,12 @@ fn main() {
|
||||||
if let Ok(mut proto) = Protocol::new("/var/run/collectd-unixsock") {
|
if let Ok(mut proto) = Protocol::new("/var/run/collectd-unixsock") {
|
||||||
// loop {
|
// loop {
|
||||||
let cpu = CpuObservable::discover(&mut proto).unwrap();
|
let cpu = CpuObservable::discover(&mut proto).unwrap();
|
||||||
let mut container = Container::new(cfg.max_samples);
|
let mut series = StackedSeries::new(cfg);
|
||||||
for _ in 1..10 {
|
for _ in 1..10 {
|
||||||
let sample = cpu.sample(&mut proto).unwrap();
|
let sample = cpu.sample(&mut proto).unwrap();
|
||||||
container.push(sample);
|
series.push(sample);
|
||||||
|
|
||||||
let img = stacked(StackedSeries {
|
let img = stacked(&series);
|
||||||
config: &cfg,
|
|
||||||
data: &container.data,
|
|
||||||
});
|
|
||||||
img.save("bzn.png").unwrap();
|
img.save("bzn.png").unwrap();
|
||||||
|
|
||||||
thread::sleep(time::Duration::from_secs(1));
|
thread::sleep(time::Duration::from_secs(1));
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue