Files
daqbuf-series/src/msp.rs
2025-02-28 09:14:18 +01:00

117 lines
3.4 KiB
Rust

use netpod::DtMs;
use netpod::TsMs;
use std::fmt;
autoerr::create_error_v1!(
name(Error, "BinMsp"),
enum variants {
PrebinnedPartitioningInvalid,
},
);
#[derive(Debug, Clone)]
pub enum PrebinnedPartitioning {
Sec1,
Sec10,
Min1,
Min10,
Hour1,
Day1,
}
impl fmt::Display for PrebinnedPartitioning {
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
fmt::Debug::fmt(self, fmt)
}
}
impl PrebinnedPartitioning {
pub fn bin_len(&self) -> DtMs {
use PrebinnedPartitioning::*;
match self {
Sec1 => DtMs::from_ms_u64(1000 * 1),
Sec10 => DtMs::from_ms_u64(1000 * 10),
Min1 => DtMs::from_ms_u64(1000 * 60 * 1),
Min10 => DtMs::from_ms_u64(1000 * 60 * 10),
Hour1 => DtMs::from_ms_u64(1000 * 60 * 60 * 1),
Day1 => DtMs::from_ms_u64(1000 * 60 * 60 * 24),
}
}
pub fn msp_div(&self) -> DtMs {
use PrebinnedPartitioning::*;
if true {
match self {
Sec1 => DtMs::from_ms_u64(1000 * 60 * 20),
Sec10 => DtMs::from_ms_u64(1000 * 60 * 60 * 2),
Min1 => DtMs::from_ms_u64(1000 * 60 * 60 * 12),
Min10 => DtMs::from_ms_u64(1000 * 60 * 60 * 24 * 7),
Hour1 => DtMs::from_ms_u64(1000 * 60 * 60 * 24 * 40),
Day1 => DtMs::from_ms_u64(1000 * 60 * 60 * 24 * 800),
}
} else {
match self {
Sec1 => DtMs::from_ms_u64(1000 * 60 * 10),
Sec10 => DtMs::from_ms_u64(1000 * 60 * 60 * 2),
Min1 => DtMs::from_ms_u64(1000 * 60 * 60 * 8),
Min10 => DtMs::from_ms_u64(1000 * 60 * 60 * 24 * 4),
Hour1 => DtMs::from_ms_u64(1000 * 60 * 60 * 24 * 28),
Day1 => DtMs::from_ms_u64(1000 * 60 * 60 * 24 * 400),
}
}
}
pub fn quo_rem(&self, val: TsMs) -> (u64, u32, u32, u32) {
let dv1 = self.msp_div().ms();
let dv2 = self.bin_len().ms();
let valms = val.ms();
let quo = valms / dv1;
let rrr = valms % dv1;
let rem = rrr / dv2;
(quo, rem as u32, dv1 as u32, dv2 as u32)
}
pub fn off_max(&self) -> u32 {
self.msp_div().ms() as u32 / self.bin_len().ms() as u32
}
pub fn clamp_off(&self, off: u32) -> u32 {
self.off_max().min(off)
}
pub fn uses_index_hour1(&self) -> bool {
use PrebinnedPartitioning::*;
match self {
Sec1 => true,
Sec10 => true,
Min1 => true,
Min10 => false,
Hour1 => false,
Day1 => false,
}
}
}
impl TryFrom<DtMs> for PrebinnedPartitioning {
type Error = Error;
fn try_from(value: DtMs) -> Result<Self, Self::Error> {
use PrebinnedPartitioning::*;
if value == DtMs::from_ms_u64(1000) {
Ok(Sec1)
} else if value == DtMs::from_ms_u64(1000 * 10) {
Ok(Sec10)
} else if value == DtMs::from_ms_u64(1000 * 60) {
Ok(Min1)
} else if value == DtMs::from_ms_u64(1000 * 60 * 10) {
Ok(Min10)
} else if value == DtMs::from_ms_u64(1000 * 60 * 60) {
Ok(Hour1)
} else if value == DtMs::from_ms_u64(1000 * 60 * 60 * 24) {
Ok(Day1)
} else {
Err(Error::PrebinnedPartitioningInvalid)
}
}
}