EPICS Home

Experimental Physics and Industrial Control System


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

Subject: Re: [Scopes] BMP image record??
From: Rod Nussbaumer <[email protected]>
To: Pavel Masloff <[email protected]>
Cc: EPICS Tech Talk <[email protected]>
Date: Wed, 02 May 2012 08:32:41 -0700
The %c converter should do it, along with a 'width' number of expected characters (nnn in the example below). If this is to read an unknown number of bytes, then the 'nnn' quantity will result in a timeout to terminate the read. You would want to use @readtimeout to set some reasonable number for that timeout. I've used this method for reading binary formatted scope waveforms where the number of bytes in the waveform is known a priori, but never for reading a block of unknown size. There does seem to be an as yet unresolved performance issue in streamDevice when the asyn port driver is linuxGPIB, in case that is your architecture. I ended up using a bare asyn record with DTYP=asynOctetCommandResponse to solve it, coupled with a subroutine record to strip off an un-needed header and perform a converison to multi-byte words.

> PrtScr {
>      InTerminator = "";
>      ReplyTimeout = 15000;
>      out "HARDCOPY START";
>      in "%nnnc";
            ^^^^
> }

   ---   rod.



Pavel Masloff wrote:
Hey Rod,

Which IN converter should I use in the protocol file of StreamDevice?
I have tried %u and it didn't work:

record(waveform, "$(P)$(R)file") {
     field(DTYP, "stream")
     field(SCAN, "Passive")
     field(INP, "@devTPS20xx.proto PrtScr $(PORT) $(A)")
     field(NELM, "500000")
     field(FTVL, "UCHAR")
}

PrtScr {
     InTerminator = "";
     ReplyTimeout = 15000;
     out "HARDCOPY START";
     in "%u";
}

L1 TPS2024B:file: Input
"BM╩7<00><00><00><00><00><00>6<04><00><00>(<00><00><00>@<01>..." does
not match format %u

On Mon, Apr 30, 2012 at 12:24 AM, Rod Nussbaumer <[email protected]
<mailto:[email protected]>> wrote:

    In principle, you should be able to read the binary data just as if
    you were receiving a binary formatted waveform. The EPICS waveform
    record will need to be set to an unsigned char data type. The trick
    will be to properly handle ending the transmission. Since your
    Python code seems to use a timeout to determine the end of the file,
    you could do that in streamDevice, too, by setting ' InTerminator =
    "" ' & setting some reasonable number for the 'ReadTimeout' in the
    protocol for the image file reader. Perhaps Dirk can confirm this.

    You will need to set the NELM field to something large enough to
    hold the largest image file that can be transmitted. I do not know
    how you could automatically get the image data from the waveform
    record into a file without some assistance from a host-based tool.

    Rod Nussbaumer
    ISAC Controls, TRIUMF
    Vancouver, Canada.


    Pavel Masloff wrote:

        Why can't I?
        In Hyperterminal (as well as in Python) you simply send a
        command and
        receive bytes, which you forward to a binary file. Sth like this:

        |import sys
        import os
        import time
        import serial

        # create target file
        print os.getcwd()
        f = open('hardcopy.png', 'wb')

        # configure the serial connection
        ser = serial.Serial()
        ser.port = 0
        ser.timeout = 0
        ser.baudrate = 9600

        ser.open()

        # configure the hardcopy settings
        cmd = ':HARDCOPY:FORMAT PNG;PALETTE NORMAL;PORT RS232;LAYOUT
        PORTRAIT;\
        PREVIEW 0;INKSAVER 0;COMPRESSION 0\n'
        a = ser.write(cmd)
        print "bytes sent: {:d}".format(a)

        # start hardcopy
        a = ser.write("HARDCOPY START\n")
        print "bytes sent: {:d}".format(a)

        # begin receiving data and writing to file
        total_bytes = 0;
        a = ser.inWaiting()
        while a>0:
             time.sleep(0.5)
             data = ser.read(a)
             total_bytes += a
             f.write(data)
             time.sleep(0.5)
             a = ser.inWaiting()
             sys.stdout.write(".")

        # close file and serial port
        sys.stdout.write("\n")
        f.close()
        ser.close()

        print "bytes read: {:d}".format(total_bytes)
        print "script completed"|


        Are you sure StreamDevice won't write the input to a waveform
        record?


        On Sun, Apr 29, 2012 at 7:47 PM, Mark Rivers
        <[email protected] <mailto:[email protected]>
        <mailto:[email protected].__edu
        <mailto:[email protected]>>> wrote:

            I don't think you can get the image into a waveform record
        from the
            scope with StreamDevice.  You would have to write another driver
            that does what you were doing with Hyperterminal and Python.
          You
            could perhaps use an SNL program for this.

            To display an image in BOY you use the Intensity Plot
        widget.  The
            waveform record is 1-D, but you tell the BOY widget the
        actual X and
            Y dimensions of the array.

            Mark


            __________________________________
            From: Pavel Masloff [[email protected]
        <mailto:[email protected]>
        <mailto:pavel.masloff@gmail.__com <mailto:[email protected]>>]

            Sent: Sunday, April 29, 2012 9:22 AM
            To: Mark Rivers
            Cc: EPICS Tech Talk
            Subject: Re: [Scopes] BMP image record??

            Is there any working example on how to get the image into a
        waveform
            record using StreamDevice? I haven't used the waveform
        record yet,
            reading up on this in the db reference manual, not that
            comprehensible :(

            Another question is how to read a waveform (image type) in BOY?

            Pavel

            On Sat, Apr 28, 2012 at 5:53 PM, Mark Rivers
        <[email protected] <mailto:[email protected]>
        <mailto:[email protected].__edu
        <mailto:[email protected]>><mailto:rivers@cars.__uchicago.edu
        <mailto:[email protected]>

        <mailto:[email protected].__edu
        <mailto:[email protected]>>>> wrote:
            If you can get the image into a waveform record, using
        streamDevice
            for example, then you can display that waveform as in image
        in EDM,
            CSS BOY, ImageJ or other applications.  You need to create a few
            other records that tell the client what the actual image
        dimensions are.

            It may be just as easy to implement reading the actual waveforms
            into waveform records, and display those with Cartesian plot
        widgets
            in your display manager.

            Mark

            __________________________________
            From: [email protected]
        <mailto:[email protected]>
        <mailto:tech-talk-bounces@aps.__anl.gov
        <mailto:[email protected]>><mailto:[email protected]
        <mailto:[email protected]>
        <mailto:tech-talk-bounces@aps.__anl.gov
        <mailto:[email protected]>>>
            [[email protected]
        <mailto:[email protected]>
        <mailto:tech-talk-bounces@aps.__anl.gov
        <mailto:[email protected]>><mailto:[email protected]
        <mailto:[email protected]>

        <mailto:tech-talk-bounces@aps.__anl.gov
        <mailto:[email protected]>>>] on behalf of Pavel Masloff
            [[email protected] <mailto:[email protected]>
        <mailto:pavel.masloff@gmail.__com
        <mailto:[email protected]>><mailto:pavel.masloff@__gmail.com
        <mailto:[email protected]>

        <mailto:pavel.masloff@gmail.__com
        <mailto:[email protected]>>>]
            Sent: Saturday, April 28, 2012 2:17 AM
            To: EPICS Tech Talk
            Subject: [Scopes] BMP image record??

            Hello again,


            As I mentioned earlier we are running a series of
        experiments with
            our high current switches. I have written simple support
        ("...with a
            little help from my friend" Dirk Zimoch) for the Tektronix
        TPS2000
            over RS232 using StreamDevice and ASYN, so now I can
        remotely arm
            the scopes, set its properties, save waveforms on to the CF
        card,
            etc. But...

            In order to not run back and forth and see if everything went OK
            (which is rather tiresome and time consuming), we need a
            confirmation from the scopes. I don't want to deal with the
            implementation of the waveform records for now, all I have
        got so
            far is that I save them on the flash card.
            As such a confirmation I see transferring the BMP (or PNG) image
            from the scope (sort of Print screen) on to the operator PC
        somehow.

            There is a special SCPI command "Hardcopy start". Which
        mimics the
            Print button on the scope's front panel. I have tried to
        transfer a
            BMP file via Hyperterminal (and Python script) and it worked out
            well (more or less).
            How could this be ported to the EPICS database from the IOC and
            client standpoint, so an operator could see the oscillogram
        on the
            screen and decide whether the experiment went well, so she
        will save
            the waveforms and move on to the next experiment?

            The image file is maximum ~ 46Kb (20Kb on average).
            Any thoughts?


            --
            Best regards,


            Pavel Maslov, MS
            Controls Engineer at Pulsed power Lab
            Efremov Institute for Electro-Physical Apparatus
            St. Petersburg, Russia

            Mobile: +7 (951) 672 22 19
            Landline: +7 (812) 461 01 01



            --
            Best regards,


            Pavel Maslov, MS
            Controls Engineer at Pulsed power Lab
            Efremov Institute for Electro-Physical Apparatus
            St. Petersburg, Russia

            Mobile: +7 (951) 672 22 19
            Landline: +7 (812) 461 01 01




        --
        Best regards,


        Pavel Maslov, MS
        Controls Engineer at Pulsed power Lab
        Efremov Institute for Electro-Physical Apparatus
        St. Petersburg, Russia

        Mobile: +7 (951) 672 22 19
        Landline: +7 (812) 461 01 01





--
Best regards,


Pavel Maslov, MS
Controls Engineer at Pulsed power Lab
Efremov Institute for Electro-Physical Apparatus
St. Petersburg, Russia

Mobile: +7 (951) 672 22 19
Landline: +7 (812) 461 01 01


Replies:
Re: [Scopes] BMP image record?? Pavel Masloff
References:
[Scopes] BMP image record?? Pavel Masloff
RE: [Scopes] BMP image record?? Mark Rivers
Re: [Scopes] BMP image record?? Pavel Masloff
RE: [Scopes] BMP image record?? Mark Rivers
Re: [Scopes] BMP image record?? Pavel Masloff
Re: [Scopes] BMP image record?? Rod Nussbaumer
Re: [Scopes] BMP image record?? Pavel Masloff

Navigate by Date:
Prev: RE: CA_PROTO_READ_NOTIFY Response Hill, Jeffrey O
Next: Re: iocshCmd, redirection, and function pointers Andrew Johnson
Index: 1994  1995  1996  1997  1998  1999  2000  2001  2002  2003  2004  2005  2006  2007  2008  2009  2010  2011  <20122013  2014  2015  2016  2017  2018  2019  2020  2021  2022  2023  2024 
Navigate by Thread:
Prev: Re: [Scopes] BMP image record?? Pavel Masloff
Next: Re: [Scopes] BMP image record?? Pavel Masloff
Index: 1994  1995  1996  1997  1998  1999  2000  2001  2002  2003  2004  2005  2006  2007  2008  2009  2010  2011  <20122013  2014  2015  2016  2017  2018  2019  2020  2021  2022  2023  2024