diff scpisock.py @ 22:ef713fe03db8

Add SCPI socket class.
author Daniel O'Connor <darius@dons.net.au>
date Thu, 11 Aug 2011 21:18:09 +0930
parents
children c6be52360c2f
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/scpisock.py	Thu Aug 11 21:18:09 2011 +0930
@@ -0,0 +1,70 @@
+#!/usr/bin/env python
+
+# Copyright (c) 2011
+#      Daniel O'Connor <darius@dons.net.au>.  All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+
+import select
+import socket
+
+# See this for more info
+# http://www.staff.uni-bayreuth.de/~btp918/cmt2007/geraete/agilent_34410A_dmm/manual/SCPI_Sockets.pdf
+#
+# ToDo: Implement the SRQ & DCL channel (I don't have any supported hardware)
+
+SCPI_PORT = 5025
+
+class SCPISockDevice(object):
+    def __init__(self, host, port = SCPI_PORT):
+        self.sock = socket.create_connection((host, port))
+
+    def flush(self):
+        while True:
+            r, w, x = select.select([self.sock], [], [], 0)
+            if len(r) == 0:
+                break
+            self.sock.recv(1024)
+
+    def write(self, data):
+        trail = ''
+        if data[-1] != '\n':
+            trail = '\n'
+            
+        self.sock.send(data + trail)
+
+    def read(self, timeout = None):
+        res = ''
+        if timeout == None:
+            timeout = 0.1
+            
+        while True:
+            r, w, x = select.select([self.sock], [], [], timeout)
+            if len(r) == 0:
+                break
+            res = res + self.sock.recv(1024)
+            if res[-1] == '\n':
+                break
+
+        return res.rstrip('\n')
+