EPICS Controls Argonne National Laboratory

Experimental Physics and
Industrial Control System

1994  1995  1996  1997  1998  1999  2000  2001  2002  2003  2004  2005  2006  2007  2008  2009  2010  2011  2012  2013  2014  2015  2016  2017  2018  2019  2020  2021  2022  <20232024  Index 1994  1995  1996  1997  1998  1999  2000  2001  2002  2003  2004  2005  2006  2007  2008  2009  2010  2011  2012  2013  2014  2015  2016  2017  2018  2019  2020  2021  2022  <20232024 
<== Date ==> <== Thread ==>

Subject: RE: Parse multiple waveforms in stream device
From: Abdalla Ahmad via Tech-talk <tech-talk at aps.anl.gov>
To: Zimoch Dirk <dirk.zimoch at psi.ch>, "tech-talk at aps.anl.gov" <tech-talk at aps.anl.gov>
Date: Thu, 7 Sep 2023 08:09:33 +0000
It is working! Thanks.

Best Regards,
Abdalla.

-----Original Message-----
From: Zimoch Dirk <dirk.zimoch at psi.ch> 
Sent: Thursday, September 7, 2023 10:21 AM
To: tech-talk at aps.anl.gov; Abdalla Ahmad <Abdalla.Ahmad at sesame.org.jo>
Subject: Re: Parse multiple waveforms in stream device

On Thu, 2023-09-07 at 06:52 +0000, Abdalla Ahmad wrote:
> Unfortunately it did not work:
> 
> Read_adc {
> 	Separator = "";
> 	InTerminator = "";
> 	out "ADC 10";
> 	in "%d";
> }
> 
> it gave me this error:
> 
> 1 byte surplus input <0a>
> After 479 bytes ......

The last newline has not been consumed. It is no InTerminator, which means it has been left in the input. And %d consumes only leading whitespace. Thus, change the in command to "%d\n" and it should work.

> 
> Even with the InTerminator and Separator are set to "" or removed. Does that mean it still interprets the new line as an input terminator? I tried playing with asyn input EOS settings:
> 
> asynInterposeEosConfig PORT 0 1 0
> asynOctetSetInputEOS PORT 0 ""
> 
> But it started to say no reply from device.
> 
> Best Regards,
> Abdalla.
> 
> -----Original Message-----
> From: Zimoch Dirk <dirk.zimoch at psi.ch>
> Sent: Wednesday, September 6, 2023 2:46 PM
> To: tech-talk at aps.anl.gov; Abdalla Ahmad <Abdalla.Ahmad at sesame.org.jo>
> Subject: Re: Parse multiple waveforms in stream device
> 
> I think you don't need it. %d automatically ignores all leading white space and regex is rather expensive. Simply use no Separator and you should be fine.
> 
> On Wed, 2023-09-06 at 10:06 +0000, Abdalla Ahmad wrote:
> > I have used the following regex to read the table into a single 
> > waveform
> > 
> > OutTerminator = LF;
> > InTerminator = "";
> > ReadTimeout = 100;
> > 
> > Read_adc {
> > 	Separator = " ";
> > 	Out "ADC 10";
> > 	In "%#/\n/ /%d";
> > }
> > 
> > I will work on the aSub record to parse this array into individual channels.
> > 
> > Thanks!
> > Abdalla.
> > 
> > -----Original Message-----
> > From: Zimoch Dirk <dirk.zimoch at psi.ch>
> > Sent: Wednesday, September 6, 2023 12:51 PM
> > To: tech-talk at aps.anl.gov; Abdalla Ahmad 
> > <Abdalla.Ahmad at sesame.org.jo>
> > Subject: Re: Parse multiple waveforms in stream device
> > 
> > Hi Abdalla,
> > 
> > Unfortunately, StreamDevice currently cannot read "tables", i.e. vertical columns of multiple arrays. Sorry.
> > 
> > There are ways to work around this problem but they are not easy and 
> > involve a compress record for each array. The trick is to read one 
> > line at a time in "I/O Intr" mode and use redirections to write the 
> > 4 values to 4 records (e.g. ai or
> > longin) which then trigger 4 compress records to add one value to their buffer.
> > This happens then 10 times for each readout and after that the compress records should be "full". But many things may go wrong with this approach causing the records to go out of sync with the input data, e.g. other commands that result
> > in lines like "  1        2        3        4". Tricky stuff.
> > 
> > Also a custom format converter will not help, because those are 
> > always bound to
> > 1 record, not 4 as you need it here.
> > 
> > You can write your own custom client connecting to the same asyn port.
> > StreamDevice will lock the port before sending a command until the end of the protocol. This guarantees clean serialization among StreamDevice records connecting to the same port but also with any other client connecting to the same port. You must lock the port between sending the command and reading the table as well.
> > 
> > But maybe the easier solution is to read the whole table into one big waveform and then let an asubRecord do the sorting and splitting. To allow this, the whole table must appear to StreamDevice as one input. That means the newline must NOT be an InTerminator. However, it would be nice to have an "end of table"
> > terminator which is different from the "end of line" (two newlines?). If you don't have that, you can try MaxInput if your input has always the same number of bytes (i.e. digits+signs+spaces+newlines). Otherwise the only table terminator left is ReadTimeout which will lead to some latency. You will not need a Separator, as all your data is separated by either space or newline, which is all whitespace and thus ignored by %d. Thus, your protocol will look something like this:
> > 
> > readADC {
> >   InTerminator="";
> >   MaxInput=360; # My guess: 9*4*10, if possible #  ReadTimeout=....; # You have to test what works
> >   out "ADC 10";
> >   in "%d";
> > }
> > 
> > Yours
> > Dirk
> > 
> > On Wed, 2023-09-06 at 09:22 +0000, Abdalla Ahmad via Tech-talk wrote:
> > > Hi
> > >  
> > > We have a device that performs data read-out as follows:
> > >  
> > > We send the command “ADC 10” that collects 10 ADC samples for each of the 4 channels, the response is as follows:
> > >  
> > >        1        2        3        4
> > >       -5       -8       0        1
> > >  
> > > And so on until the 10th sample. The target is to read each channel individually in its own waveform record. Here are my questions:
> > > 1.       Is it possible to parse such output in stream device? I tried the “Separator” command as explained here https://paulscherrerinstitute.github.io/StreamDevice/tipsandtricks.html along with this input command (in “%d%*d%*d%*d”) but it always read one sample. This input command should choose the channel and then with the separator command should convert the output into the waveform but that is not what happening. I also tried using PCRE to skip or substitute parts of the input but it is still the same.
> > > 2.       Is it possible to use the stream device format converter API to create a custom parser for this case? If yes, is there a tutorial on how to do it?
> > > 3.       Can I write an asynPortDriver class that uses the same asyn port as the stream device?
> > >  
> > > Thanks!
> > > Abdalla
> > >  

References:
Parse multiple waveforms in stream device Abdalla Ahmad via Tech-talk
Re: Parse multiple waveforms in stream device Zimoch Dirk via Tech-talk
RE: Parse multiple waveforms in stream device Abdalla Ahmad via Tech-talk
Re: Parse multiple waveforms in stream device Zimoch Dirk via Tech-talk
RE: Parse multiple waveforms in stream device Abdalla Ahmad via Tech-talk
Re: Parse multiple waveforms in stream device Zimoch Dirk via Tech-talk

Navigate by Date:
Prev: Re: Parse multiple waveforms in stream device Zimoch Dirk via Tech-talk
Next: EPICS try to compile on Windows: module machine type 'x86' conflicts with target machine type 'x64' Heinz Junkes via Tech-talk
Index: 1994  1995  1996  1997  1998  1999  2000  2001  2002  2003  2004  2005  2006  2007  2008  2009  2010  2011  2012  2013  2014  2015  2016  2017  2018  2019  2020  2021  2022  <20232024 
Navigate by Thread:
Prev: Re: Parse multiple waveforms in stream device Zimoch Dirk via Tech-talk
Next: Re: Parse multiple waveforms in stream device Maren Purves via Tech-talk
Index: 1994  1995  1996  1997  1998  1999  2000  2001  2002  2003  2004  2005  2006  2007  2008  2009  2010  2011  2012  2013  2014  2015  2016  2017  2018  2019  2020  2021  2022  <20232024 
ANJ, 07 Sep 2023 Valid HTML 4.01! · Home · News · About · Base · Modules · Extensions · Distributions · Download ·
· Search · EPICS V4 · IRMIS · Talk · Bugs · Documents · Links · Licensing ·