Pulse id diff in events endpoint via transform chain
This commit is contained in:
@@ -26,6 +26,7 @@ use serde::Deserialize;
|
||||
use serde::Serialize;
|
||||
use std::any;
|
||||
use std::any::Any;
|
||||
use std::collections::VecDeque;
|
||||
use std::fmt;
|
||||
use std::time::Duration;
|
||||
use std::time::SystemTime;
|
||||
@@ -666,8 +667,11 @@ impl TimeBinnable for ChannelEvents {
|
||||
}
|
||||
|
||||
impl EventsNonObj for ChannelEvents {
|
||||
fn into_tss_pulses(self: Box<Self>) -> (std::collections::VecDeque<u64>, std::collections::VecDeque<u64>) {
|
||||
todo!()
|
||||
fn into_tss_pulses(self: Box<Self>) -> (VecDeque<u64>, VecDeque<u64>) {
|
||||
match *self {
|
||||
ChannelEvents::Events(k) => k.into_tss_pulses(),
|
||||
ChannelEvents::Status(k) => (VecDeque::new(), VecDeque::new()),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -751,6 +755,17 @@ impl Events for ChannelEvents {
|
||||
fn pulses(&self) -> &std::collections::VecDeque<u64> {
|
||||
todo!()
|
||||
}
|
||||
|
||||
fn frame_type_id(&self) -> u32 {
|
||||
<Self as FrameTypeInnerStatic>::FRAME_TYPE_ID
|
||||
}
|
||||
|
||||
fn to_min_max_avg(&mut self) -> Box<dyn Events> {
|
||||
match self {
|
||||
ChannelEvents::Events(item) => Box::new(ChannelEvents::Events(Events::to_min_max_avg(item))),
|
||||
ChannelEvents::Status(item) => Box::new(ChannelEvents::Status(item.take())),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Collectable for ChannelEvents {
|
||||
@@ -771,6 +786,8 @@ pub struct ChannelEventsTimeBinner {
|
||||
impl fmt::Debug for ChannelEventsTimeBinner {
|
||||
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
|
||||
fmt.debug_struct("ChannelEventsTimeBinner")
|
||||
.field("binrange", &self.binrange)
|
||||
.field("do_time_weight", &self.do_time_weight)
|
||||
.field("conn_state", &self.conn_state)
|
||||
.finish()
|
||||
}
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
use crate::binsdim0::BinsDim0;
|
||||
use crate::framable::FrameType;
|
||||
use crate::framable::FrameTypeStatic;
|
||||
use crate::IsoDateTime;
|
||||
use crate::RangeOverlapInfo;
|
||||
use crate::TimeBinnableType;
|
||||
@@ -11,6 +13,7 @@ use items_0::collect_s::CollectorType;
|
||||
use items_0::collect_s::ToJsonBytes;
|
||||
use items_0::collect_s::ToJsonResult;
|
||||
use items_0::container::ByteEstimate;
|
||||
use items_0::framable::FrameTypeInnerStatic;
|
||||
use items_0::scalar_ops::ScalarOps;
|
||||
use items_0::timebin::TimeBinnable;
|
||||
use items_0::timebin::TimeBinned;
|
||||
@@ -922,6 +925,21 @@ impl<STY: ScalarOps> Events for EventsDim0<STY> {
|
||||
fn pulses(&self) -> &VecDeque<u64> {
|
||||
&self.pulses
|
||||
}
|
||||
|
||||
fn frame_type_id(&self) -> u32 {
|
||||
error!("TODO frame_type_id should not be called");
|
||||
// TODO make more nice
|
||||
panic!()
|
||||
}
|
||||
|
||||
fn to_min_max_avg(&mut self) -> Box<dyn Events> {
|
||||
let dst = Self {
|
||||
tss: mem::replace(&mut self.tss, Default::default()),
|
||||
pulses: mem::replace(&mut self.pulses, Default::default()),
|
||||
values: mem::replace(&mut self.values, Default::default()),
|
||||
};
|
||||
Box::new(dst)
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
use crate::binsdim0::BinsDim0;
|
||||
use crate::framable::FrameType;
|
||||
use crate::IsoDateTime;
|
||||
use crate::RangeOverlapInfo;
|
||||
use crate::TimeBinnableType;
|
||||
@@ -813,6 +814,15 @@ impl<STY: ScalarOps> Events for EventsDim1<STY> {
|
||||
fn pulses(&self) -> &VecDeque<u64> {
|
||||
&self.pulses
|
||||
}
|
||||
|
||||
fn frame_type_id(&self) -> u32 {
|
||||
// TODO make more nice
|
||||
panic!()
|
||||
}
|
||||
|
||||
fn to_min_max_avg(&mut self) -> Box<dyn Events> {
|
||||
todo!()
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
|
||||
@@ -15,6 +15,7 @@ use items_0::streamitem::StreamItem;
|
||||
use items_0::streamitem::ERROR_FRAME_TYPE_ID;
|
||||
use items_0::streamitem::EVENT_QUERY_JSON_STRING_FRAME;
|
||||
use items_0::streamitem::SITEMTY_NONSPEC_FRAME_TYPE_ID;
|
||||
use items_0::Events;
|
||||
use serde::de::DeserializeOwned;
|
||||
use serde::Deserialize;
|
||||
use serde::Serialize;
|
||||
@@ -50,6 +51,12 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
impl FrameType for Box<dyn Events> {
|
||||
fn frame_type_id(&self) -> u32 {
|
||||
self.as_ref().frame_type_id()
|
||||
}
|
||||
}
|
||||
|
||||
pub trait Framable {
|
||||
fn make_frame(&self) -> Result<BytesMut, Error>;
|
||||
}
|
||||
|
||||
@@ -10,6 +10,7 @@ use items_0::streamitem::StreamItem;
|
||||
use items_0::transform::EventTransform;
|
||||
use items_0::transform::TransformProperties;
|
||||
use items_0::transform::WithTransformProperties;
|
||||
use items_0::Events;
|
||||
use items_0::MergeError;
|
||||
use items_0::WithLen;
|
||||
use netpod::log::*;
|
||||
@@ -451,8 +452,11 @@ impl<T> WithTransformProperties for Merger<T> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<T> EventTransform for Merger<T> {
|
||||
fn transform(&mut self, src: Box<dyn items_0::Events>) -> Box<dyn items_0::Events> {
|
||||
impl<T> EventTransform for Merger<T>
|
||||
where
|
||||
T: Send,
|
||||
{
|
||||
fn transform(&mut self, src: Box<dyn Events>) -> Box<dyn Events> {
|
||||
todo!()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -62,9 +62,9 @@ where
|
||||
|
||||
impl<T> EventTransform for Enumerate2<T>
|
||||
where
|
||||
T: WithTransformProperties,
|
||||
T: WithTransformProperties + Send,
|
||||
{
|
||||
fn transform(&mut self, src: Box<dyn items_0::Events>) -> Box<dyn items_0::Events> {
|
||||
fn transform(&mut self, src: Box<dyn Events>) -> Box<dyn Events> {
|
||||
todo!()
|
||||
}
|
||||
}
|
||||
@@ -148,9 +148,11 @@ where
|
||||
|
||||
impl<T, F, Fut> EventTransform for Then2<T, F, Fut>
|
||||
where
|
||||
T: EventTransform,
|
||||
T: EventTransform + Send,
|
||||
F: Send,
|
||||
Fut: Send,
|
||||
{
|
||||
fn transform(&mut self, src: Box<dyn items_0::Events>) -> Box<dyn items_0::Events> {
|
||||
fn transform(&mut self, src: Box<dyn Events>) -> Box<dyn Events> {
|
||||
todo!()
|
||||
}
|
||||
}
|
||||
@@ -219,8 +221,11 @@ impl<T> WithTransformProperties for VecStream<T> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<T> EventTransform for VecStream<T> {
|
||||
fn transform(&mut self, src: Box<dyn items_0::Events>) -> Box<dyn items_0::Events> {
|
||||
impl<T> EventTransform for VecStream<T>
|
||||
where
|
||||
T: Send,
|
||||
{
|
||||
fn transform(&mut self, src: Box<dyn Events>) -> Box<dyn Events> {
|
||||
todo!()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -42,8 +42,8 @@ impl WithTransformProperties for TransformEventMinMaxAvg {
|
||||
}
|
||||
|
||||
impl EventTransform for TransformEventMinMaxAvg {
|
||||
fn transform(&mut self, src: Box<dyn Events>) -> Box<dyn Events> {
|
||||
todo!()
|
||||
fn transform(&mut self, mut src: Box<dyn Events>) -> Box<dyn Events> {
|
||||
src.to_min_max_avg()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -51,7 +51,9 @@ pub fn make_transform_min_max_avg() -> TransformEvent {
|
||||
TransformEvent(Box::new(TransformEventMinMaxAvg {}))
|
||||
}
|
||||
|
||||
struct TransformEventPulseIdDiff {}
|
||||
struct TransformEventPulseIdDiff {
|
||||
pulse_last: Option<u64>,
|
||||
}
|
||||
|
||||
impl WithTransformProperties for TransformEventPulseIdDiff {
|
||||
fn query_transform_properties(&self) -> TransformProperties {
|
||||
@@ -61,36 +63,22 @@ impl WithTransformProperties for TransformEventPulseIdDiff {
|
||||
|
||||
impl EventTransform for TransformEventPulseIdDiff {
|
||||
fn transform(&mut self, src: Box<dyn Events>) -> Box<dyn Events> {
|
||||
let mut src = src;
|
||||
if let Some(chevs) = src.as_any_mut().downcast_mut::<ChannelEvents>() {
|
||||
let chevs2 = chevs;
|
||||
let chevs = mem::replace(chevs2, ChannelEvents::Status(None));
|
||||
let mut pulse_last = None;
|
||||
match chevs {
|
||||
ChannelEvents::Events(item) => {
|
||||
let (tss, pulses) = EventsNonObj::into_tss_pulses(item);
|
||||
let mut item = EventsDim0::empty();
|
||||
for (ts, pulse) in tss.into_iter().zip(pulses) {
|
||||
let value = if let Some(last) = pulse_last {
|
||||
pulse as i64 - last as i64
|
||||
} else {
|
||||
0
|
||||
};
|
||||
item.push(ts, pulse, value);
|
||||
pulse_last = Some(pulse);
|
||||
}
|
||||
*chevs2 = ChannelEvents::Events(Box::new(item));
|
||||
}
|
||||
ChannelEvents::Status(_) => {}
|
||||
}
|
||||
src
|
||||
} else {
|
||||
warn!("make_transform_pulse_id_diff item is not ChannelEvents");
|
||||
src
|
||||
let (tss, pulses) = EventsNonObj::into_tss_pulses(src);
|
||||
let mut item = EventsDim0::empty();
|
||||
let pulse_last = &mut self.pulse_last;
|
||||
for (ts, pulse) in tss.into_iter().zip(pulses) {
|
||||
let value = if let Some(last) = pulse_last {
|
||||
pulse as i64 - *last as i64
|
||||
} else {
|
||||
0
|
||||
};
|
||||
item.push(ts, pulse, value);
|
||||
*pulse_last = Some(pulse);
|
||||
}
|
||||
Box::new(ChannelEvents::Events(Box::new(item)))
|
||||
}
|
||||
}
|
||||
|
||||
pub fn make_transform_pulse_id_diff() -> TransformEvent {
|
||||
TransformEvent(Box::new(TransformEventPulseIdDiff {}))
|
||||
TransformEvent(Box::new(TransformEventPulseIdDiff { pulse_last: None }))
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user