RoGeorge / DS1054Z_screen_capture

Capture the display of a Rigol DS1000Z series oscilloscope by LAN only, using LXI SCPI commands. No USB, no VISA, no IVI and no Rigol drivers are required.
https://hackaday.io/project/5807-driverless-rigol-ds1054z-screen-capture-over-lan
GNU General Public License v2.0
209 stars 53 forks source link

Python 3 version #13

Open N0ury opened 5 years ago

N0ury commented 5 years ago

Python 2 will be shortly deprecated. Do you intend to port DS1054Z_screen_capture to Python 3 ? Some people like me, have completely removed Python 2.

ehiverson commented 5 years ago

I ran the 2to3 script in an attempt to port it over. But I quickly ran into other issues: https://stackoverflow.com/questions/33003498/typeerror-a-bytes-like-object-is-required-not-str The top rated answer there explains the issue. I haven't solved the problem, either.

DavidAntliff commented 5 years ago

I have some experience porting Python code from 2 to 3 and may be able to help - is there a branch or fork currently underway?

asyd commented 5 years ago

You should create a Pull Requests! I'll try to help as well.

@ehiverson You can convert a string to bytes by using 'string'.encode('ascii')

ehiverson commented 5 years ago

Ok! Here it is so far: github.com/ehiverson/DS1054Z_screen_capture All I've done is run 2to3 and used @anielson001 fix for pip_installed_distributions()

ehiverson commented 5 years ago

I made really good progress and have the port complete. I have a GUI using pyqt5. Right now it works over USB only, but soon I'll have it working over LAN too.

DavidAntliff commented 5 years ago

@ehiverson how's it going? Do you have LAN working yet? That's my use-case and I'd be happy to help test it.

ehiverson commented 5 years ago

@DavidAntliff yes I do. I added a small user interface so it is no longer a command line tool. It also works with a tektronix 2024b. I couldn't confirm why the telnet library didn't work out of the box for RoGeorge, so I started using the regular telnet library and it works fine. For the rigol, one can also save the full memory of the scope, not just what is on the screen.

N0ury commented 5 years ago

Here's what I'm doing now: echo ":DISPLAY:DATA? ON,OFF,PNG" | nc -w1 192.168.1.24 5555 | tail -c +12 > captures/DS1104Z_$(date '+%Y-%m-%d_%H.%M.%S').png or echo ":DISPLAY:DATA? ON,OFF,PNG" | nc -w1 192.168.1.24 5555 | dd bs=1 skip=11 of=captures/DS1104Z_$(date '+%Y-%m-%d_%H.%M.%S').png with param1: color ON or OFF (default: ON) param2: inversion ON or OFF (default: OFF) param3: BMP24|BMP8|PNG|JPEG|TIFF (default: BMP24) 192.168.1.24 is the Rigol's IP address

N0ury commented 5 years ago

To get data only, you can do this (example with channel 1):

echo ":WAV:SOUR CHAN1
:WAV:MODE NORM
:WAV:FORM ASCii
:WAV:DATA?" | nc -w1 192.168.1.24 5555 > fic_out

You can then plot a graph in the way you like (matplotlib...)

DavidAntliff commented 4 years ago

Here's what I'm doing now: echo ":DISPLAY:DATA? ON,OFF,PNG" | nc -w1 192.168.1.24 5555 | tail -c +12 > captures/DS1104Z_$(date '+%Y-%m-%d_%H.%M.%S').png or echo ":DISPLAY:DATA? ON,OFF,PNG" | nc -w1 192.168.1.24 5555 | dd bs=1 skip=11 of=captures/DS1104Z_$(date '+%Y-%m-%d_%H.%M.%S').png with param1: color ON or OFF (default: ON) param2: inversion ON or OFF (default: OFF) param3: BMP24|BMP8|PNG|JPEG|TIFF (default: BMP24) 192.168.1.24 is the Rigol's IP address

Thanks @nbenm, this is useful to know because it doesn't require the heavier dependencies of this or @ehiverson's project.

For me, the first method creates a PNG that looks OK in an image viewer for about a split second, then turns all blue. The file size is a few kilobytes smaller than those generated by the second method. The second method seems to create a proper PNG that I can view properly. However both methods require manually terminating the capture with CTRL-C - is that expected?

N0ury commented 4 years ago

@DavidAntliff this is how this works: the main command is "nc". It sends the string ":DISPLAY:DATA? ON,OFF,PNG" to rigol's ip on port 5555. Rigol in turn, executes the command (which is a capture), and sends the result back. This result goes then to "dd" or "tail" command. We need then to skip the first 11 characters. They are not part of the PNG data. Last result goes to the output file. "dd" works better than "tail" with binary data. "tail" doesn't work always. That's why the second method is better. But there's no reason to type CTRL-C to end the capture. I don't need to do this.

DavidAntliff commented 4 years ago

@nbenm ah, so your capture ends automatically? I'm running your command on Mac so I wonder if that accounts for the difference - maybe nc from brew doesn't support timeouts. I'll look into it.

N0ury commented 4 years ago

@DavidAntliff try -w duration (in seconds) option. That said, I use homebrew nc on Mac, and don't have any problem.

N0ury commented 4 years ago

If you want to get real data, and not just a screen capture, you can do this:

echo ":WAV:SOUR CHAN1
:WAV:MODE NORM
:WAV:FORM ASCii
:WAV:DATA?" | nc -w1 192.168.1.24 5555 > file_out

replace 192.168.1.24 with your ip address Here we get data from channel 1 (CHAN1)

You can then use matplotlib to draw graph, or simply use these data.

DavidAntliff commented 4 years ago

@nbenm I'm using netcat installed with brew:

$ which nc
/usr/local/bin/nc
$ brew list netcat
/usr/local/Cellar/netcat/0.7.1/bin/nc
/usr/local/Cellar/netcat/0.7.1/bin/netcat
/usr/local/Cellar/netcat/0.7.1/share/info/netcat.info
/usr/local/Cellar/netcat/0.7.1/share/man/man1/netcat.1
$ /usr/local/bin/nc --version
netcat (The GNU Netcat) 0.7.1
Copyright (C) 2002 - 2003  Giovanni Giacobbi
..  -w, --wait=SECS            timeout for connects and final net reads
...

The timeout option doesn't seem to work for me if a valid connection is made. It just waits for data on the socket indefinitely regardless of the -w X value. The timeout only applies if the connection is bad (wrong IP address or port number).

However OSX's nc (in /usr/bin) does honour the timeout, so this works:

$ /usr/bin/nc -w1 $ipaddress $port

Can you check you're not inadvertently using the OSX nc rather than brew's nc?

N0ury commented 4 years ago

@DavidAntliff you are right. I use OSX nc. brew's nc isn't even installed. I'm sorry for the confusion.