Frame the archapp variants in compatible way
This commit is contained in:
@@ -1,5 +1,7 @@
|
|||||||
use crate::parse::PbFileReader;
|
use crate::parse::PbFileReader;
|
||||||
use crate::{EventsItem, PlainEvents, ScalarPlainEvents, WavePlainEvents, XBinnedEvents};
|
use crate::{
|
||||||
|
EventsItem, MultiBinWaveEvents, PlainEvents, ScalarPlainEvents, SingleBinWaveEvents, WavePlainEvents, XBinnedEvents,
|
||||||
|
};
|
||||||
use chrono::{TimeZone, Utc};
|
use chrono::{TimeZone, Utc};
|
||||||
use err::Error;
|
use err::Error;
|
||||||
use futures_core::Stream;
|
use futures_core::Stream;
|
||||||
@@ -8,8 +10,9 @@ use items::eventvalues::EventValues;
|
|||||||
use items::waveevents::{WaveEvents, WaveXBinner};
|
use items::waveevents::{WaveEvents, WaveXBinner};
|
||||||
use items::xbinnedscalarevents::XBinnedScalarEvents;
|
use items::xbinnedscalarevents::XBinnedScalarEvents;
|
||||||
use items::xbinnedwaveevents::XBinnedWaveEvents;
|
use items::xbinnedwaveevents::XBinnedWaveEvents;
|
||||||
use items::RangeCompletableItem::RangeComplete;
|
use items::{
|
||||||
use items::{EventsNodeProcessor, Framable, RangeCompletableItem, Sitemty, SitemtyFrameType, StreamItem};
|
EventsNodeProcessor, Framable, RangeCompletableItem, Sitemty, SitemtyFrameType, StreamItem, WithLen, WithTimestamps,
|
||||||
|
};
|
||||||
use netpod::log::*;
|
use netpod::log::*;
|
||||||
use netpod::query::RawEventsQuery;
|
use netpod::query::RawEventsQuery;
|
||||||
use netpod::timeunits::{DAY, SEC};
|
use netpod::timeunits::{DAY, SEC};
|
||||||
@@ -172,14 +175,7 @@ impl FrameMaker {
|
|||||||
where
|
where
|
||||||
T: SitemtyFrameType + Serialize + Send + 'static,
|
T: SitemtyFrameType + Serialize + Send + 'static,
|
||||||
{
|
{
|
||||||
match item {
|
err::todoval()
|
||||||
Ok(_) => err::todoval(),
|
|
||||||
Err(e) => {
|
|
||||||
//let t = Ok(StreamItem::DataItem(RangeCompletableItem::Data()))
|
|
||||||
let t: Sitemty<T> = Err(e);
|
|
||||||
Box::new(t)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -220,18 +216,104 @@ macro_rules! events_item_to_sitemty {
|
|||||||
}};
|
}};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
macro_rules! arm2 {
|
||||||
|
($item:expr, $t1:ident, $t2:ident, $t3:ident, $t4:ident, $t5:ident, $sty1:ident, $sty2:ident) => {{
|
||||||
|
type T1 = $t1<$sty1>;
|
||||||
|
let ret: Sitemty<T1> = match $item {
|
||||||
|
Ok(k) => match k {
|
||||||
|
StreamItem::DataItem(k) => match k {
|
||||||
|
RangeCompletableItem::RangeComplete => {
|
||||||
|
Ok(StreamItem::DataItem(RangeCompletableItem::RangeComplete))
|
||||||
|
}
|
||||||
|
RangeCompletableItem::Data(k) => match k {
|
||||||
|
EventsItem::$t2(k) => match k {
|
||||||
|
$t3::$t4(k) => match k {
|
||||||
|
$t5::$sty2(k) => {
|
||||||
|
//
|
||||||
|
Ok(StreamItem::DataItem(RangeCompletableItem::Data(k)))
|
||||||
|
}
|
||||||
|
_ => panic!(),
|
||||||
|
},
|
||||||
|
_ => panic!(),
|
||||||
|
},
|
||||||
|
_ => err::todoval(),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
StreamItem::Log(k) => Ok(StreamItem::Log(k)),
|
||||||
|
StreamItem::Stats(k) => Ok(StreamItem::Stats(k)),
|
||||||
|
},
|
||||||
|
Err(e) => Err(e),
|
||||||
|
};
|
||||||
|
Box::new(ret) as Box<dyn Framable>
|
||||||
|
}};
|
||||||
|
}
|
||||||
|
|
||||||
macro_rules! arm1 {
|
macro_rules! arm1 {
|
||||||
($item:expr, $sty:ident, $shape:expr, $ak:expr) => {{
|
($item:expr, $sty1:ident, $sty2:ident, $shape:expr, $ak:expr) => {{
|
||||||
match $shape {
|
match $shape {
|
||||||
Shape::Scalar => match $ak {
|
Shape::Scalar => match $ak {
|
||||||
AggKind::Plain => Self::make_frame_gen::<EventValues<$sty>>($item),
|
AggKind::Plain => arm2!(
|
||||||
AggKind::DimXBins1 => Self::make_frame_gen::<EventValues<$sty>>($item),
|
$item,
|
||||||
AggKind::DimXBinsN(_) => Self::make_frame_gen::<EventValues<$sty>>($item),
|
EventValues,
|
||||||
|
Plain,
|
||||||
|
PlainEvents,
|
||||||
|
Scalar,
|
||||||
|
ScalarPlainEvents,
|
||||||
|
$sty1,
|
||||||
|
$sty2
|
||||||
|
),
|
||||||
|
AggKind::DimXBins1 => arm2!(
|
||||||
|
$item,
|
||||||
|
EventValues,
|
||||||
|
XBinnedEvents,
|
||||||
|
XBinnedEvents,
|
||||||
|
Scalar,
|
||||||
|
ScalarPlainEvents,
|
||||||
|
$sty1,
|
||||||
|
$sty2
|
||||||
|
),
|
||||||
|
AggKind::DimXBinsN(_) => arm2!(
|
||||||
|
$item,
|
||||||
|
EventValues,
|
||||||
|
XBinnedEvents,
|
||||||
|
XBinnedEvents,
|
||||||
|
Scalar,
|
||||||
|
ScalarPlainEvents,
|
||||||
|
$sty1,
|
||||||
|
$sty2
|
||||||
|
),
|
||||||
},
|
},
|
||||||
Shape::Wave(_) => match $ak {
|
Shape::Wave(_) => match $ak {
|
||||||
AggKind::Plain => Self::make_frame_gen::<WaveEvents<$sty>>($item),
|
AggKind::Plain => arm2!(
|
||||||
AggKind::DimXBins1 => Self::make_frame_gen::<XBinnedScalarEvents<$sty>>($item),
|
$item,
|
||||||
AggKind::DimXBinsN(_) => Self::make_frame_gen::<XBinnedWaveEvents<$sty>>($item),
|
WaveEvents,
|
||||||
|
Plain,
|
||||||
|
PlainEvents,
|
||||||
|
Wave,
|
||||||
|
WavePlainEvents,
|
||||||
|
$sty1,
|
||||||
|
$sty2
|
||||||
|
),
|
||||||
|
AggKind::DimXBins1 => arm2!(
|
||||||
|
$item,
|
||||||
|
XBinnedScalarEvents,
|
||||||
|
XBinnedEvents,
|
||||||
|
XBinnedEvents,
|
||||||
|
SingleBinWave,
|
||||||
|
SingleBinWaveEvents,
|
||||||
|
$sty1,
|
||||||
|
$sty2
|
||||||
|
),
|
||||||
|
AggKind::DimXBinsN(_) => arm2!(
|
||||||
|
$item,
|
||||||
|
XBinnedWaveEvents,
|
||||||
|
XBinnedEvents,
|
||||||
|
XBinnedEvents,
|
||||||
|
MultiBinWave,
|
||||||
|
MultiBinWaveEvents,
|
||||||
|
$sty1,
|
||||||
|
$sty2
|
||||||
|
),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}};
|
}};
|
||||||
@@ -244,11 +326,11 @@ impl FrameMakerTrait for FrameMaker {
|
|||||||
// Therefore, I need to decide that based on given parameters.
|
// Therefore, I need to decide that based on given parameters.
|
||||||
// see also channel_info in this mod.
|
// see also channel_info in this mod.
|
||||||
match self.scalar_type {
|
match self.scalar_type {
|
||||||
ScalarType::I8 => arm1!(item, i8, self.shape, self.agg_kind),
|
ScalarType::I8 => arm1!(item, i8, Byte, self.shape, self.agg_kind),
|
||||||
ScalarType::I16 => arm1!(item, i16, self.shape, self.agg_kind),
|
ScalarType::I16 => arm1!(item, i16, Short, self.shape, self.agg_kind),
|
||||||
ScalarType::I32 => arm1!(item, i32, self.shape, self.agg_kind),
|
ScalarType::I32 => arm1!(item, i32, Int, self.shape, self.agg_kind),
|
||||||
ScalarType::F32 => arm1!(item, f32, self.shape, self.agg_kind),
|
ScalarType::F32 => arm1!(item, f32, Float, self.shape, self.agg_kind),
|
||||||
ScalarType::F64 => arm1!(item, f64, self.shape, self.agg_kind),
|
ScalarType::F64 => arm1!(item, f64, Double, self.shape, self.agg_kind),
|
||||||
_ => err::todoval(),
|
_ => err::todoval(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -297,7 +379,16 @@ pub async fn make_single_event_pipe(
|
|||||||
|
|
||||||
// TODO first collect all matching filenames, then sort, then open files.
|
// TODO first collect all matching filenames, then sort, then open files.
|
||||||
// TODO if dir does not exist, should notify client but not log as error.
|
// TODO if dir does not exist, should notify client but not log as error.
|
||||||
let mut rd = tokio::fs::read_dir(&dir).await?;
|
let mut rd = match tokio::fs::read_dir(&dir).await {
|
||||||
|
Ok(k) => k,
|
||||||
|
Err(e) => match e.kind() {
|
||||||
|
std::io::ErrorKind::NotFound => {
|
||||||
|
warn!("does not exist: {:?}", dir);
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
_ => return Err(e)?,
|
||||||
|
},
|
||||||
|
};
|
||||||
while let Some(de) = rd.next_entry().await? {
|
while let Some(de) = rd.next_entry().await? {
|
||||||
let s = de.file_name().to_string_lossy().into_owned();
|
let s = de.file_name().to_string_lossy().into_owned();
|
||||||
if s.starts_with(&prefix) && s.ends_with(".pb") {
|
if s.starts_with(&prefix) && s.ends_with(".pb") {
|
||||||
@@ -315,13 +406,24 @@ pub async fn make_single_event_pipe(
|
|||||||
let mut pbr = PbFileReader::new(f1).await;
|
let mut pbr = PbFileReader::new(f1).await;
|
||||||
pbr.read_header().await?;
|
pbr.read_header().await?;
|
||||||
info!("✓ read header {:?}", pbr.payload_type());
|
info!("✓ read header {:?}", pbr.payload_type());
|
||||||
loop {
|
let mut i1 = 0;
|
||||||
|
'evread: loop {
|
||||||
match pbr.read_msg().await {
|
match pbr.read_msg().await {
|
||||||
Ok(ei) => {
|
Ok(ei) => {
|
||||||
info!("read msg from file");
|
let tslast = if ei.len() > 0 { Some(ei.ts(ei.len() - 1)) } else { None };
|
||||||
|
i1 += 1;
|
||||||
|
if i1 % 1000 == 0 {
|
||||||
|
info!("read msg from file {}", i1);
|
||||||
|
}
|
||||||
let ei2 = ei.x_aggregate(&evq.agg_kind);
|
let ei2 = ei.x_aggregate(&evq.agg_kind);
|
||||||
let g = Ok(StreamItem::DataItem(RangeCompletableItem::Data(ei2)));
|
let g = Ok(StreamItem::DataItem(RangeCompletableItem::Data(ei2)));
|
||||||
tx.send(g).await?;
|
tx.send(g).await?;
|
||||||
|
if let Some(t) = tslast {
|
||||||
|
if t >= evq.range.end {
|
||||||
|
info!("after requested range, break");
|
||||||
|
break 'evread;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
error!("error while reading msg {:?}", e);
|
error!("error while reading msg {:?}", e);
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ use items::eventvalues::EventValues;
|
|||||||
use items::numops::NumOps;
|
use items::numops::NumOps;
|
||||||
use items::waveevents::{WaveEvents, WaveXBinner};
|
use items::waveevents::{WaveEvents, WaveXBinner};
|
||||||
use items::xbinnedscalarevents::XBinnedScalarEvents;
|
use items::xbinnedscalarevents::XBinnedScalarEvents;
|
||||||
|
use items::xbinnedwaveevents::XBinnedWaveEvents;
|
||||||
use items::{EventsNodeProcessor, Framable, SitemtyFrameType, WithLen, WithTimestamps};
|
use items::{EventsNodeProcessor, Framable, SitemtyFrameType, WithLen, WithTimestamps};
|
||||||
use netpod::{AggKind, HasScalarType, HasShape, ScalarType, Shape};
|
use netpod::{AggKind, HasScalarType, HasShape, ScalarType, Shape};
|
||||||
#[cfg(not(feature = "devread"))]
|
#[cfg(not(feature = "devread"))]
|
||||||
@@ -22,8 +23,8 @@ pub mod events;
|
|||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
pub mod test;
|
pub mod test;
|
||||||
|
|
||||||
fn unescape_archapp_msg(inp: &[u8]) -> Result<Vec<u8>, Error> {
|
fn unescape_archapp_msg(inp: &[u8], mut ret: Vec<u8>) -> Result<Vec<u8>, Error> {
|
||||||
let mut ret = Vec::with_capacity(inp.len() * 5 / 4);
|
ret.clear();
|
||||||
let mut esc = false;
|
let mut esc = false;
|
||||||
for &k in inp.iter() {
|
for &k in inp.iter() {
|
||||||
if k == 0x1b {
|
if k == 0x1b {
|
||||||
@@ -36,7 +37,7 @@ fn unescape_archapp_msg(inp: &[u8]) -> Result<Vec<u8>, Error> {
|
|||||||
} else if k == 0x3 {
|
} else if k == 0x3 {
|
||||||
ret.push(0xd);
|
ret.push(0xd);
|
||||||
} else {
|
} else {
|
||||||
return Err(Error::with_msg("malformed escaped archapp message"));
|
return Err(Error::with_msg_no_trace("malformed escaped archapp message"));
|
||||||
}
|
}
|
||||||
esc = false;
|
esc = false;
|
||||||
} else {
|
} else {
|
||||||
@@ -227,6 +228,92 @@ impl HasScalarType for WavePlainEvents {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub enum MultiBinWaveEvents {
|
||||||
|
Byte(XBinnedWaveEvents<i8>),
|
||||||
|
Short(XBinnedWaveEvents<i16>),
|
||||||
|
Int(XBinnedWaveEvents<i32>),
|
||||||
|
Float(XBinnedWaveEvents<f32>),
|
||||||
|
Double(XBinnedWaveEvents<f64>),
|
||||||
|
}
|
||||||
|
|
||||||
|
impl MultiBinWaveEvents {
|
||||||
|
pub fn variant_name(&self) -> String {
|
||||||
|
use MultiBinWaveEvents::*;
|
||||||
|
match self {
|
||||||
|
Byte(h) => format!("Byte"),
|
||||||
|
Short(h) => format!("Short"),
|
||||||
|
Int(h) => format!("Int"),
|
||||||
|
Float(h) => format!("Float"),
|
||||||
|
Double(h) => format!("Double"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn x_aggregate(self, ak: &AggKind) -> EventsItem {
|
||||||
|
use MultiBinWaveEvents::*;
|
||||||
|
match self {
|
||||||
|
Byte(k) => match ak {
|
||||||
|
AggKind::Plain => EventsItem::XBinnedEvents(XBinnedEvents::MultiBinWave(MultiBinWaveEvents::Byte(k))),
|
||||||
|
AggKind::DimXBins1 => err::todoval(),
|
||||||
|
AggKind::DimXBinsN(_) => EventsItem::Plain(PlainEvents::Wave(err::todoval())),
|
||||||
|
},
|
||||||
|
_ => err::todoval(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl WithLen for MultiBinWaveEvents {
|
||||||
|
fn len(&self) -> usize {
|
||||||
|
use MultiBinWaveEvents::*;
|
||||||
|
match self {
|
||||||
|
Byte(j) => j.len(),
|
||||||
|
Short(j) => j.len(),
|
||||||
|
Int(j) => j.len(),
|
||||||
|
Float(j) => j.len(),
|
||||||
|
Double(j) => j.len(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl WithTimestamps for MultiBinWaveEvents {
|
||||||
|
fn ts(&self, ix: usize) -> u64 {
|
||||||
|
use MultiBinWaveEvents::*;
|
||||||
|
match self {
|
||||||
|
Byte(j) => j.ts(ix),
|
||||||
|
Short(j) => j.ts(ix),
|
||||||
|
Int(j) => j.ts(ix),
|
||||||
|
Float(j) => j.ts(ix),
|
||||||
|
Double(j) => j.ts(ix),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl HasShape for MultiBinWaveEvents {
|
||||||
|
fn shape(&self) -> Shape {
|
||||||
|
use MultiBinWaveEvents::*;
|
||||||
|
match self {
|
||||||
|
Byte(h) => Shape::Scalar,
|
||||||
|
Short(h) => Shape::Scalar,
|
||||||
|
Int(h) => Shape::Scalar,
|
||||||
|
Float(h) => Shape::Scalar,
|
||||||
|
Double(h) => Shape::Scalar,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl HasScalarType for MultiBinWaveEvents {
|
||||||
|
fn scalar_type(&self) -> ScalarType {
|
||||||
|
use MultiBinWaveEvents::*;
|
||||||
|
match self {
|
||||||
|
Byte(h) => ScalarType::I8,
|
||||||
|
Short(h) => ScalarType::I16,
|
||||||
|
Int(h) => ScalarType::I32,
|
||||||
|
Float(h) => ScalarType::F32,
|
||||||
|
Double(h) => ScalarType::F64,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub enum SingleBinWaveEvents {
|
pub enum SingleBinWaveEvents {
|
||||||
Byte(XBinnedScalarEvents<i8>),
|
Byte(XBinnedScalarEvents<i8>),
|
||||||
@@ -256,7 +343,7 @@ impl SingleBinWaveEvents {
|
|||||||
AggKind::DimXBins1 => err::todoval(),
|
AggKind::DimXBins1 => err::todoval(),
|
||||||
AggKind::DimXBinsN(_) => EventsItem::Plain(PlainEvents::Wave(err::todoval())),
|
AggKind::DimXBinsN(_) => EventsItem::Plain(PlainEvents::Wave(err::todoval())),
|
||||||
},
|
},
|
||||||
_ => panic!(),
|
_ => err::todoval(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -317,7 +404,7 @@ impl HasScalarType for SingleBinWaveEvents {
|
|||||||
pub enum XBinnedEvents {
|
pub enum XBinnedEvents {
|
||||||
Scalar(ScalarPlainEvents),
|
Scalar(ScalarPlainEvents),
|
||||||
SingleBinWave(SingleBinWaveEvents),
|
SingleBinWave(SingleBinWaveEvents),
|
||||||
//MultiBinWave,
|
MultiBinWave(MultiBinWaveEvents),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl XBinnedEvents {
|
impl XBinnedEvents {
|
||||||
@@ -326,6 +413,7 @@ impl XBinnedEvents {
|
|||||||
match self {
|
match self {
|
||||||
Scalar(h) => format!("Scalar({})", h.variant_name()),
|
Scalar(h) => format!("Scalar({})", h.variant_name()),
|
||||||
SingleBinWave(h) => format!("SingleBinWave({})", h.variant_name()),
|
SingleBinWave(h) => format!("SingleBinWave({})", h.variant_name()),
|
||||||
|
MultiBinWave(h) => format!("MultiBinWave({})", h.variant_name()),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -334,6 +422,7 @@ impl XBinnedEvents {
|
|||||||
match self {
|
match self {
|
||||||
Scalar(k) => EventsItem::Plain(PlainEvents::Scalar(k)),
|
Scalar(k) => EventsItem::Plain(PlainEvents::Scalar(k)),
|
||||||
SingleBinWave(k) => k.x_aggregate(ak),
|
SingleBinWave(k) => k.x_aggregate(ak),
|
||||||
|
MultiBinWave(k) => k.x_aggregate(ak),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -344,6 +433,7 @@ impl WithLen for XBinnedEvents {
|
|||||||
match self {
|
match self {
|
||||||
Scalar(j) => j.len(),
|
Scalar(j) => j.len(),
|
||||||
SingleBinWave(j) => j.len(),
|
SingleBinWave(j) => j.len(),
|
||||||
|
MultiBinWave(j) => j.len(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -354,6 +444,7 @@ impl WithTimestamps for XBinnedEvents {
|
|||||||
match self {
|
match self {
|
||||||
Scalar(j) => j.ts(ix),
|
Scalar(j) => j.ts(ix),
|
||||||
SingleBinWave(j) => j.ts(ix),
|
SingleBinWave(j) => j.ts(ix),
|
||||||
|
MultiBinWave(j) => j.ts(ix),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -364,6 +455,7 @@ impl HasShape for XBinnedEvents {
|
|||||||
match self {
|
match self {
|
||||||
Scalar(h) => h.shape(),
|
Scalar(h) => h.shape(),
|
||||||
SingleBinWave(h) => h.shape(),
|
SingleBinWave(h) => h.shape(),
|
||||||
|
MultiBinWave(h) => h.shape(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -374,6 +466,7 @@ impl HasScalarType for XBinnedEvents {
|
|||||||
match self {
|
match self {
|
||||||
Scalar(h) => h.scalar_type(),
|
Scalar(h) => h.scalar_type(),
|
||||||
SingleBinWave(h) => h.scalar_type(),
|
SingleBinWave(h) => h.scalar_type(),
|
||||||
|
MultiBinWave(h) => h.scalar_type(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ use serde::Serialize;
|
|||||||
use serde_json::Value as JsonValue;
|
use serde_json::Value as JsonValue;
|
||||||
use std::collections::{BTreeMap, VecDeque};
|
use std::collections::{BTreeMap, VecDeque};
|
||||||
use std::fs::FileType;
|
use std::fs::FileType;
|
||||||
|
use std::mem;
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use std::time::Instant;
|
use std::time::Instant;
|
||||||
@@ -23,6 +24,7 @@ use tokio::io::AsyncReadExt;
|
|||||||
pub struct PbFileReader {
|
pub struct PbFileReader {
|
||||||
file: File,
|
file: File,
|
||||||
buf: Vec<u8>,
|
buf: Vec<u8>,
|
||||||
|
escbuf: Vec<u8>,
|
||||||
wp: usize,
|
wp: usize,
|
||||||
rp: usize,
|
rp: usize,
|
||||||
channel_name: String,
|
channel_name: String,
|
||||||
@@ -81,13 +83,14 @@ macro_rules! wave_parse {
|
|||||||
}};
|
}};
|
||||||
}
|
}
|
||||||
|
|
||||||
const MIN_BUF_FILL: usize = 1024 * 16;
|
const MIN_BUF_FILL: usize = 1024 * 64;
|
||||||
|
|
||||||
impl PbFileReader {
|
impl PbFileReader {
|
||||||
pub async fn new(file: File) -> Self {
|
pub async fn new(file: File) -> Self {
|
||||||
Self {
|
Self {
|
||||||
file,
|
file,
|
||||||
buf: vec![0; MIN_BUF_FILL * 4],
|
buf: vec![0; MIN_BUF_FILL * 4],
|
||||||
|
escbuf: vec![],
|
||||||
wp: 0,
|
wp: 0,
|
||||||
rp: 0,
|
rp: 0,
|
||||||
channel_name: String::new(),
|
channel_name: String::new(),
|
||||||
@@ -100,8 +103,9 @@ impl PbFileReader {
|
|||||||
self.fill_buf().await?;
|
self.fill_buf().await?;
|
||||||
let k = self.find_next_nl()?;
|
let k = self.find_next_nl()?;
|
||||||
let buf = &mut self.buf;
|
let buf = &mut self.buf;
|
||||||
let m = unescape_archapp_msg(&buf[self.rp..k])?;
|
let m = unescape_archapp_msg(&buf[self.rp..k], mem::replace(&mut self.escbuf, vec![]))?;
|
||||||
let payload_info = crate::generated::EPICSEvent::PayloadInfo::parse_from_bytes(&m)
|
self.escbuf = m;
|
||||||
|
let payload_info = crate::generated::EPICSEvent::PayloadInfo::parse_from_bytes(&self.escbuf)
|
||||||
.map_err(|_| Error::with_msg("can not parse PayloadInfo"))?;
|
.map_err(|_| Error::with_msg("can not parse PayloadInfo"))?;
|
||||||
self.channel_name = payload_info.get_pvname().into();
|
self.channel_name = payload_info.get_pvname().into();
|
||||||
self.payload_type = payload_info.get_field_type();
|
self.payload_type = payload_info.get_field_type();
|
||||||
@@ -114,45 +118,51 @@ impl PbFileReader {
|
|||||||
self.fill_buf().await?;
|
self.fill_buf().await?;
|
||||||
let k = self.find_next_nl()?;
|
let k = self.find_next_nl()?;
|
||||||
let buf = &mut self.buf;
|
let buf = &mut self.buf;
|
||||||
let m = unescape_archapp_msg(&buf[self.rp..k])?;
|
let m = mem::replace(&mut self.escbuf, vec![]);
|
||||||
|
let m = unescape_archapp_msg(&buf[self.rp..k], m)?;
|
||||||
|
self.escbuf = m;
|
||||||
|
let m = &self.escbuf;
|
||||||
use PayloadType::*;
|
use PayloadType::*;
|
||||||
let ei = match self.payload_type {
|
let ei = match self.payload_type {
|
||||||
SCALAR_BYTE => parse_scalar_byte(&m, self.year)?,
|
SCALAR_BYTE => parse_scalar_byte(m, self.year)?,
|
||||||
SCALAR_ENUM => {
|
SCALAR_ENUM => {
|
||||||
scalar_parse!(&m, self.year, ScalarEnum, Int, i32)
|
scalar_parse!(m, self.year, ScalarEnum, Int, i32)
|
||||||
}
|
}
|
||||||
SCALAR_SHORT => {
|
SCALAR_SHORT => {
|
||||||
scalar_parse!(&m, self.year, ScalarShort, Short, i16)
|
scalar_parse!(m, self.year, ScalarShort, Short, i16)
|
||||||
}
|
}
|
||||||
SCALAR_INT => {
|
SCALAR_INT => {
|
||||||
scalar_parse!(&m, self.year, ScalarInt, Int, i32)
|
scalar_parse!(m, self.year, ScalarInt, Int, i32)
|
||||||
}
|
}
|
||||||
SCALAR_FLOAT => {
|
SCALAR_FLOAT => {
|
||||||
scalar_parse!(&m, self.year, ScalarFloat, Float, f32)
|
scalar_parse!(m, self.year, ScalarFloat, Float, f32)
|
||||||
}
|
}
|
||||||
SCALAR_DOUBLE => {
|
SCALAR_DOUBLE => {
|
||||||
scalar_parse!(&m, self.year, ScalarDouble, Double, f64)
|
scalar_parse!(m, self.year, ScalarDouble, Double, f64)
|
||||||
}
|
}
|
||||||
WAVEFORM_BYTE => {
|
WAVEFORM_BYTE => {
|
||||||
wave_parse!(&m, self.year, VectorChar, Byte, i8)
|
wave_parse!(m, self.year, VectorChar, Byte, i8)
|
||||||
}
|
}
|
||||||
WAVEFORM_SHORT => {
|
WAVEFORM_SHORT => {
|
||||||
wave_parse!(&m, self.year, VectorShort, Short, i16)
|
wave_parse!(m, self.year, VectorShort, Short, i16)
|
||||||
}
|
}
|
||||||
WAVEFORM_ENUM => {
|
WAVEFORM_ENUM => {
|
||||||
wave_parse!(&m, self.year, VectorEnum, Int, i32)
|
wave_parse!(m, self.year, VectorEnum, Int, i32)
|
||||||
}
|
}
|
||||||
WAVEFORM_INT => {
|
WAVEFORM_INT => {
|
||||||
wave_parse!(&m, self.year, VectorInt, Int, i32)
|
wave_parse!(m, self.year, VectorInt, Int, i32)
|
||||||
}
|
}
|
||||||
WAVEFORM_FLOAT => {
|
WAVEFORM_FLOAT => {
|
||||||
wave_parse!(&m, self.year, VectorFloat, Float, f32)
|
wave_parse!(m, self.year, VectorFloat, Float, f32)
|
||||||
}
|
}
|
||||||
WAVEFORM_DOUBLE => {
|
WAVEFORM_DOUBLE => {
|
||||||
wave_parse!(&m, self.year, VectorDouble, Double, f64)
|
wave_parse!(m, self.year, VectorDouble, Double, f64)
|
||||||
}
|
}
|
||||||
SCALAR_STRING | WAVEFORM_STRING | V4_GENERIC_BYTES => {
|
SCALAR_STRING | WAVEFORM_STRING | V4_GENERIC_BYTES => {
|
||||||
return Err(Error::with_msg(format!("not supported: {:?}", self.payload_type)));
|
return Err(Error::with_msg_no_trace(format!(
|
||||||
|
"not supported: {:?}",
|
||||||
|
self.payload_type
|
||||||
|
)));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
self.rp = k + 1;
|
self.rp = k + 1;
|
||||||
@@ -163,11 +173,12 @@ impl PbFileReader {
|
|||||||
if self.wp - self.rp >= MIN_BUF_FILL {
|
if self.wp - self.rp >= MIN_BUF_FILL {
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
if self.rp >= self.buf.len() - MIN_BUF_FILL {
|
if self.rp + MIN_BUF_FILL >= self.buf.len() {
|
||||||
let n = self.wp - self.rp;
|
let n = self.wp - self.rp;
|
||||||
for i in 0..n {
|
self.buf.copy_within(self.rp..self.rp + n, 0);
|
||||||
self.buf[i] = self.buf[self.rp + i];
|
//for i in 0..n {
|
||||||
}
|
// self.buf[i] = self.buf[self.rp + i];
|
||||||
|
//}
|
||||||
self.rp = 0;
|
self.rp = 0;
|
||||||
self.wp = n;
|
self.wp = n;
|
||||||
}
|
}
|
||||||
@@ -219,7 +230,7 @@ pub struct EpicsEventPayloadInfo {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// TODO remove in favor of PbFileRead
|
// TODO remove in favor of PbFileRead
|
||||||
async fn read_pb_file(mut f1: File) -> Result<(EpicsEventPayloadInfo, File), Error> {
|
async fn _read_pb_file(mut f1: File) -> Result<(EpicsEventPayloadInfo, File), Error> {
|
||||||
let mut buf = vec![0; 1024 * 4];
|
let mut buf = vec![0; 1024 * 4];
|
||||||
{
|
{
|
||||||
let mut i1 = 0;
|
let mut i1 = 0;
|
||||||
@@ -254,7 +265,7 @@ async fn read_pb_file(mut f1: File) -> Result<(EpicsEventPayloadInfo, File), Err
|
|||||||
}
|
}
|
||||||
if i2 != usize::MAX {
|
if i2 != usize::MAX {
|
||||||
//info!("got NL {} .. {}", j1, i2);
|
//info!("got NL {} .. {}", j1, i2);
|
||||||
let m = unescape_archapp_msg(&buf[j1..i2])?;
|
let m = unescape_archapp_msg(&buf[j1..i2], vec![])?;
|
||||||
if j1 == 0 {
|
if j1 == 0 {
|
||||||
payload_info = crate::generated::EPICSEvent::PayloadInfo::parse_from_bytes(&m)
|
payload_info = crate::generated::EPICSEvent::PayloadInfo::parse_from_bytes(&m)
|
||||||
.map_err(|_| Error::with_msg("can not parse PayloadInfo"))?;
|
.map_err(|_| Error::with_msg("can not parse PayloadInfo"))?;
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ fn read_pb_00() -> Result<(), Error> {
|
|||||||
}
|
}
|
||||||
if i2 != usize::MAX {
|
if i2 != usize::MAX {
|
||||||
info!("got NL {} .. {}", j1, i2);
|
info!("got NL {} .. {}", j1, i2);
|
||||||
let m = unescape_archapp_msg(&f1[j1..i2])?;
|
let m = unescape_archapp_msg(&f1[j1..i2], vec![])?;
|
||||||
if j1 == 0 {
|
if j1 == 0 {
|
||||||
let payload_info = crate::generated::EPICSEvent::PayloadInfo::parse_from_bytes(&m).unwrap();
|
let payload_info = crate::generated::EPICSEvent::PayloadInfo::parse_from_bytes(&m).unwrap();
|
||||||
info!("got payload_info: {:?}", payload_info);
|
info!("got payload_info: {:?}", payload_info);
|
||||||
|
|||||||
Reference in New Issue
Block a user