annotate scpisock.py @ 23:876d951bbcc0

Redo timeout in a more sensible way (also change it to 100ms)
author Daniel O'Connor <darius@dons.net.au>
date Thu, 11 Aug 2011 21:19:10 +0930
parents ef713fe03db8
children c6be52360c2f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
22
ef713fe03db8 Add SCPI socket class.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
1 #!/usr/bin/env python
ef713fe03db8 Add SCPI socket class.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
2
ef713fe03db8 Add SCPI socket class.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
3 # Copyright (c) 2011
ef713fe03db8 Add SCPI socket class.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
4 # Daniel O'Connor <darius@dons.net.au>. All rights reserved.
ef713fe03db8 Add SCPI socket class.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
5 #
ef713fe03db8 Add SCPI socket class.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
6 # Redistribution and use in source and binary forms, with or without
ef713fe03db8 Add SCPI socket class.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
7 # modification, are permitted provided that the following conditions
ef713fe03db8 Add SCPI socket class.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
8 # are met:
ef713fe03db8 Add SCPI socket class.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
9 # 1. Redistributions of source code must retain the above copyright
ef713fe03db8 Add SCPI socket class.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
10 # notice, this list of conditions and the following disclaimer.
ef713fe03db8 Add SCPI socket class.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
11 # 2. Redistributions in binary form must reproduce the above copyright
ef713fe03db8 Add SCPI socket class.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
12 # notice, this list of conditions and the following disclaimer in the
ef713fe03db8 Add SCPI socket class.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
13 # documentation and/or other materials provided with the distribution.
ef713fe03db8 Add SCPI socket class.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
14 #
ef713fe03db8 Add SCPI socket class.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
15 # THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
ef713fe03db8 Add SCPI socket class.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
16 # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
ef713fe03db8 Add SCPI socket class.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
17 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ef713fe03db8 Add SCPI socket class.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
18 # ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
ef713fe03db8 Add SCPI socket class.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
19 # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
ef713fe03db8 Add SCPI socket class.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
20 # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
ef713fe03db8 Add SCPI socket class.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
21 # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
ef713fe03db8 Add SCPI socket class.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
22 # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
ef713fe03db8 Add SCPI socket class.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
23 # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
ef713fe03db8 Add SCPI socket class.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
24 # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
ef713fe03db8 Add SCPI socket class.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
25 # SUCH DAMAGE.
ef713fe03db8 Add SCPI socket class.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
26 #
ef713fe03db8 Add SCPI socket class.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
27
ef713fe03db8 Add SCPI socket class.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
28 import select
ef713fe03db8 Add SCPI socket class.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
29 import socket
ef713fe03db8 Add SCPI socket class.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
30
ef713fe03db8 Add SCPI socket class.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
31 # See this for more info
ef713fe03db8 Add SCPI socket class.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
32 # http://www.staff.uni-bayreuth.de/~btp918/cmt2007/geraete/agilent_34410A_dmm/manual/SCPI_Sockets.pdf
ef713fe03db8 Add SCPI socket class.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
33 #
ef713fe03db8 Add SCPI socket class.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
34 # ToDo: Implement the SRQ & DCL channel (I don't have any supported hardware)
ef713fe03db8 Add SCPI socket class.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
35
ef713fe03db8 Add SCPI socket class.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
36 SCPI_PORT = 5025
ef713fe03db8 Add SCPI socket class.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
37
ef713fe03db8 Add SCPI socket class.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
38 class SCPISockDevice(object):
ef713fe03db8 Add SCPI socket class.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
39 def __init__(self, host, port = SCPI_PORT):
ef713fe03db8 Add SCPI socket class.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
40 self.sock = socket.create_connection((host, port))
ef713fe03db8 Add SCPI socket class.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
41
ef713fe03db8 Add SCPI socket class.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
42 def flush(self):
ef713fe03db8 Add SCPI socket class.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
43 while True:
ef713fe03db8 Add SCPI socket class.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
44 r, w, x = select.select([self.sock], [], [], 0)
ef713fe03db8 Add SCPI socket class.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
45 if len(r) == 0:
ef713fe03db8 Add SCPI socket class.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
46 break
ef713fe03db8 Add SCPI socket class.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
47 self.sock.recv(1024)
ef713fe03db8 Add SCPI socket class.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
48
ef713fe03db8 Add SCPI socket class.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
49 def write(self, data):
ef713fe03db8 Add SCPI socket class.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
50 trail = ''
ef713fe03db8 Add SCPI socket class.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
51 if data[-1] != '\n':
ef713fe03db8 Add SCPI socket class.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
52 trail = '\n'
ef713fe03db8 Add SCPI socket class.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
53
ef713fe03db8 Add SCPI socket class.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
54 self.sock.send(data + trail)
ef713fe03db8 Add SCPI socket class.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
55
ef713fe03db8 Add SCPI socket class.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
56 def read(self, timeout = None):
ef713fe03db8 Add SCPI socket class.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
57 res = ''
ef713fe03db8 Add SCPI socket class.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
58 if timeout == None:
ef713fe03db8 Add SCPI socket class.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
59 timeout = 0.1
ef713fe03db8 Add SCPI socket class.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
60
ef713fe03db8 Add SCPI socket class.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
61 while True:
ef713fe03db8 Add SCPI socket class.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
62 r, w, x = select.select([self.sock], [], [], timeout)
ef713fe03db8 Add SCPI socket class.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
63 if len(r) == 0:
ef713fe03db8 Add SCPI socket class.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
64 break
ef713fe03db8 Add SCPI socket class.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
65 res = res + self.sock.recv(1024)
ef713fe03db8 Add SCPI socket class.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
66 if res[-1] == '\n':
ef713fe03db8 Add SCPI socket class.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
67 break
ef713fe03db8 Add SCPI socket class.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
68
ef713fe03db8 Add SCPI socket class.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
69 return res.rstrip('\n')
ef713fe03db8 Add SCPI socket class.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
70