From e17edd053343c13c7d703c2c8173405c71d016d8 Mon Sep 17 00:00:00 2001 From: Dominik Werder Date: Fri, 9 Jul 2021 06:39:46 +0200 Subject: [PATCH] Cover more types --- archapp/src/lib.rs | 2 +- archapp/src/parse.rs | 123 ++++++++++++++++++++++--------------------- 2 files changed, 65 insertions(+), 60 deletions(-) diff --git a/archapp/src/lib.rs b/archapp/src/lib.rs index f7771a7..07c6cc6 100644 --- a/archapp/src/lib.rs +++ b/archapp/src/lib.rs @@ -49,7 +49,7 @@ pub enum EventsItem { ScalarInt(EventValues), ScalarFloat(EventValues), ScalarDouble(EventValues), - WaveByte(WaveEvents), + WaveByte(WaveEvents), WaveShort(WaveEvents), WaveInt(WaveEvents), WaveFloat(WaveEvents), diff --git a/archapp/src/parse.rs b/archapp/src/parse.rs index 98316c2..2574ad5 100644 --- a/archapp/src/parse.rs +++ b/archapp/src/parse.rs @@ -23,7 +23,40 @@ pub struct PbFileReader { channel_name: String, payload_type: PayloadType, year: u32, - month: u32, +} + +macro_rules! scalar_parse { + ($m:expr, $pbt:ident, $eit:ident, $evty:ident) => {{ + let msg = crate::generated::EPICSEvent::$pbt::parse_from_bytes($m) + .map_err(|_| Error::with_msg(format!("can not parse pb-type {}", stringify!($pbt))))?; + let mut t = EventValues::<$evty> { + tss: vec![], + values: vec![], + }; + // TODO Translate by the file-time-offset. + let ts = msg.get_secondsintoyear() as u64; + let v = msg.get_val(); + t.tss.push(ts); + t.values.push(v); + EventsItem::$eit(t) + }}; +} + +macro_rules! wave_parse { + ($m:expr, $pbt:ident, $eit:ident, $evty:ident) => {{ + let msg = crate::generated::EPICSEvent::$pbt::parse_from_bytes($m) + .map_err(|_| Error::with_msg(format!("can not parse pb-type {}", stringify!($pbt))))?; + let mut t = WaveEvents::<$evty> { + tss: vec![], + vals: vec![], + }; + // TODO Translate by the file-time-offset. + let ts = msg.get_secondsintoyear() as u64; + let v = msg.get_val(); + t.tss.push(ts); + t.vals.push(v.to_vec()); + EventsItem::$eit(t) + }}; } impl PbFileReader { @@ -36,7 +69,6 @@ impl PbFileReader { channel_name: String::new(), payload_type: PayloadType::V4_GENERIC_BYTES, year: 0, - month: 0, } } @@ -50,9 +82,6 @@ impl PbFileReader { self.channel_name = payload_info.get_pvname().into(); self.payload_type = payload_info.get_field_type(); self.year = payload_info.get_year() as u32; - - // TODO only the year in the pb? - self.month = 0; self.rp = k + 1; Ok(()) } @@ -62,70 +91,46 @@ impl PbFileReader { let k = self.find_next_nl()?; let buf = &mut self.buf; let m = unescape_archapp_msg(&buf[self.rp..k])?; - // TODO - // Handle the different types. - // Must anyways reuse the Events NTY types. Where are they? - // Attempt with big enum... use PayloadType::*; let ei = match self.payload_type { + SCALAR_BYTE => { + //scalar_parse!(&m, ScalarByte, ScalarByte, u8) + err::todoval() + } + SCALAR_ENUM => { + scalar_parse!(&m, ScalarEnum, ScalarInt, i32) + } + SCALAR_SHORT => { + scalar_parse!(&m, ScalarShort, ScalarShort, i32) + } SCALAR_INT => { - let msg = crate::generated::EPICSEvent::ScalarInt::parse_from_bytes(&m) - .map_err(|_| Error::with_msg("can not parse ScalarInt"))?; - let mut t = EventValues:: { - tss: vec![], - values: vec![], - }; - // TODO Translate by the file-time-offset. - let ts = msg.get_secondsintoyear() as u64; - let v = msg.get_val(); - t.tss.push(ts); - t.values.push(v); - EventsItem::ScalarInt(t) + scalar_parse!(&m, ScalarInt, ScalarInt, i32) + } + SCALAR_FLOAT => { + scalar_parse!(&m, ScalarFloat, ScalarFloat, f32) } SCALAR_DOUBLE => { - let msg = crate::generated::EPICSEvent::ScalarDouble::parse_from_bytes(&m) - .map_err(|_| Error::with_msg("can not parse ScalarDouble"))?; - let mut t = EventValues:: { - tss: vec![], - values: vec![], - }; - // TODO Translate by the file-time-offset. - let ts = msg.get_secondsintoyear() as u64; - let v = msg.get_val(); - t.tss.push(ts); - t.values.push(v); - EventsItem::ScalarDouble(t) + scalar_parse!(&m, ScalarDouble, ScalarDouble, f64) + } + WAVEFORM_BYTE => { + wave_parse!(&m, VectorChar, WaveByte, u8) + } + WAVEFORM_SHORT => { + wave_parse!(&m, VectorShort, WaveShort, i32) + } + WAVEFORM_ENUM => { + wave_parse!(&m, VectorEnum, WaveInt, i32) + } + WAVEFORM_INT => { + wave_parse!(&m, VectorInt, WaveInt, i32) } WAVEFORM_FLOAT => { - let msg = crate::generated::EPICSEvent::VectorFloat::parse_from_bytes(&m) - .map_err(|_| Error::with_msg("can not parse VectorFloat"))?; - // TODO homogenize struct and field names w.r.t. EventValues: - let mut t = WaveEvents:: { - tss: vec![], - vals: vec![], - }; - // TODO Translate by the file-time-offset. - let ts = msg.get_secondsintoyear() as u64; - let v = msg.get_val().to_vec(); - t.tss.push(ts); - t.vals.push(v); - EventsItem::WaveFloat(t) + wave_parse!(&m, VectorFloat, WaveFloat, f32) } WAVEFORM_DOUBLE => { - let msg = crate::generated::EPICSEvent::VectorDouble::parse_from_bytes(&m) - .map_err(|_| Error::with_msg("can not parse VectorDouble"))?; - let mut t = WaveEvents:: { - tss: vec![], - vals: vec![], - }; - // TODO Translate by the file-time-offset. - let ts = msg.get_secondsintoyear() as u64; - let v = msg.get_val().to_vec(); - t.tss.push(ts); - t.vals.push(v); - EventsItem::WaveDouble(t) + wave_parse!(&m, VectorDouble, WaveDouble, f64) } - _ => { + SCALAR_STRING | WAVEFORM_STRING | V4_GENERIC_BYTES => { return Err(Error::with_msg(format!("not supported: {:?}", self.payload_type))); } };