#-----------------------------------------------------------------------------
# Name: pyGPIBcope.py
# Purpose:
#
# Author: Dalet Philippe
# Inspiration: Gordon Williams
#
# Created: 2003/01/06
# Release: 2005/04/16
#
# Copyright: (c) 2004
# Licence: Use as you wish.
#-----------------------------------------------------------------------------
"""
pyGPIBscope - 3.4
Based on wxPlotCanvas, Written by K.Hinsen, R. Srinivasan;
Ported to wxPython Harm van der Heijden, feb 1999
Based on wxPyPlot, Written by Gordon Williams
Tested with
Python 2.3.5
wxPython 2.6.0.0
Numarray 1.3.0
Philippe DALET
Lycee Champollion
46100 FIGEAC
FRANCE
philippe.dalet@voila.fr
"""
VER="3.4"
TITLE= "pyGPIBscope"
import string
import numarray
import re
import wx
import wx.lib.dialogs
from scope import *
from acquire import *
from pspicebinaryfile import *
import ConfigParser
#---------------------------------------------------------------------------
class AppFrame(wx.Frame):
def __init__(self, parent, id, title):
wx.Frame.__init__(self, parent, id, title,wx.DefaultPosition, wx.Size(800, 600))
#path du script ou se trouvent les icones
self.pathpic=os.path.abspath(os.path.dirname(sys.argv[0]))+os.sep
#self.pathpic=".\bmp"
# Now Create the Toolbar
self.tb = self.CreateToolBar(wx.TB_HORIZONTAL | wx.RAISED_BORDER | wx.TB_FLAT)
self.tb.SetToolBitmapSize(wx.Size(22,22))
self._AddTool(".\\bmp\\exit.bmp","Exit",self.OnFileExit)
self._AddTool(".\\bmp\\Save.bmp","Save Plot",self.OnSaveFile)
self._AddTool(".\\bmp\\Preview.bmp","Print Preview",self.OnFilePrintPreview)
self._AddTool(".\\bmp\\Print.bmp","Print Plot",self.OnFilePrint)
self._AddTool(".\\bmp\\Pspice.bmp","Save Plot as Binary Pspice File",self.OnPspiceSaveFile)
self._AddTool(".\\bmp\\Stimuli.bmp","Save Plot as Stimuli Pspice File",self.OnStimuliSaveFile)
self._AddTool(".\\bmp\\Help.bmp","Help",self.OnHelpAbout)
self.tb.AddSeparator()
self._AddTool(".\\bmp\\back.bmp","Back",self.OnBack)
self._AddTool(".\\bmp\\forward.bmp","Forward",self.OnForward)
self._AddTool(".\\bmp\\comment.bmp","Comments",self.OnTitle)
self._AddTool(".\\bmp\\IEEE.bmp","Acquire",self.OnAcquire)
#combo box
self.tb.AddSeparator()
cbID=wx.NewId()
self.combo=wx.ComboBox(self.tb, cbID , 'Left', choices=['Left', 'Center', 'Right'],
size=(70,-1), style=wx.CB_DROPDOWN )
self.tb.AddControl(self.combo)
self.Bind(wx.EVT_COMBOBOX, self.OnCombo, id=cbID)
# Final thing to do for a toolbar is call the Realize() method. This
# causes it to render (more or less, that is).
self.tb.Realize()
# Now Create the menu bar and items
self.mainmenu = wx.MenuBar()
menu = wx.Menu()
menu.Append(200, 'Page Setup...', 'Setup the printer page')
self.Bind(wx.EVT_MENU,self.OnFilePageSetup, id=200)
menu.Append(201, 'Print Preview...', 'Show the current plot on page')
self.Bind(wx.EVT_MENU,self.OnFilePrintPreview, id=201)
menu.Append(202, 'Print Preview...', 'Show the current plot on page')
self.Bind(wx.EVT_MENU,self.OnFilePrintPreview, id=202)
menu.Append(203, 'Print...', 'Print the current plot')
self.Bind(wx.EVT_MENU,self.OnFilePrint, id=203)
menu.Append(204, 'GPIB Adress/SERIAL Port...', 'Change Adress')
self.Bind(wx.EVT_MENU,self.OnAdress, id=204)
menu.Append(205, 'Save Plot as Image', 'Save current plot image')
self.Bind(wx.EVT_MENU,self.OnSaveFile, id=205)
menu.Append(206, 'Save Plot as Binary Pspice File', 'Save current plot as binary file')
self.Bind(wx.EVT_MENU,self.OnPspiceSaveFile, id=206)
menu.Append(207, 'Save Plot as Stimuli Pspice File', 'Save current plot as stimuli file')
self.Bind(wx.EVT_MENU,self.OnPspiceSaveFile, id=207)
menu.Append(208, 'E&xit', '')
self.Bind(wx.EVT_MENU,self.OnFileExit, id=208)
self.mainmenu.Append(menu, '&File')
menu = wx.Menu()
menu.Append(300, '&About', 'About this thing...')
self.Bind(wx.EVT_MENU,self.OnHelpAbout, id=300)
self.mainmenu.Append(menu, '&Help')
self.SetMenuBar(self.mainmenu)
# A status bar to tell people what's happening
self.CreateStatusBar(1)
self.client = PlotCanvas(self)
#Create mouse event for showing cursor coords in status bar
self.client.Bind(wx.EVT_LEFT_DOWN, self.OnMouseLeftDown)
_icon = wx.Icon('py.ico', wx.BITMAP_TYPE_ICO)
self.SetIcon(_icon)
self.combo.SetValue('Center')
#acquire from oscilloscope IEEE or demo
self.cfg = ConfigParser.ConfigParser()
self.cfg.readfp(open("pyGPIBscope.ini"))
self.lst=[]
for i in range(100):
field=self.cfg.get('modules','%d' %(i))
if (field==''):
break
self.lst.append(field)
dlg = wx.SingleChoiceDialog(self, '', 'Devices',self.lst, wx.CHOICEDLG_STYLE)
current = int(self.cfg.get('settings','default'))
dlg.SetSelection(current)
if dlg.ShowModal() == wx.ID_OK:
self.field= dlg.GetStringSelection()
self.index = dlg.GetSelection()
else:
self.field='TDS200'
self.index=1
dlg.Destroy()
self.Adress = self.cfg.get('%s' %(self.field),'Adress')
self.Title = self.cfg.get('%s' %(self.field),'Title')
#default plot
self.resetDefaults()
self._drawObjects()
#windows centre
self.Centre(wx.BOTH)
def OnCombo(self, event):
st=event.GetString()
if (st == 'Left'):
self.start=self.left
elif (st == 'Center'):
self.start=self.center
else:
self.start=self.right
self.DrawPlot()
def _AddTool(self,pic,help,fonc):
id=wx.NewId()
self.tb.AddSimpleTool(id,wx.Bitmap(self.pathpic+pic,wx.BITMAP_TYPE_BMP),help)
wx.EVT_TOOL(self,id,fonc)
def OnMouseLeftDown(self,event):
s= "Left Mouse Down at Point: (%.4f, %.4f)" % self.client.GetXY(event)
self.SetStatusText(s)
event.Skip()
def OnFilePageSetup(self, event):
self.client.PageSetup()
def OnFilePrintPreview(self, event):
self.client.PrintPreview()
def OnFilePrint(self, event):
self.client.Printout()
def OnSaveFile(self, event):
self.client.SaveFile()
def OnPspiceSaveFile(self, event):
dlg1 = wx.FileDialog(self,"Choose a filename", ".", "",
"Dat files (*.dat)|*.dat", wx.SAVE|wx.OVERWRITE_PROMPT )
if dlg1.ShowModal() == wx.ID_OK:
fileName = dlg1.GetPath()
data = zeros ((self.ChannelNumber ,self.buffersize ) , Float)
#print data
data [0,:]= self.data1[:,1]
#print data [0,:]
#print data
data [1,:]= self.data2[:,1]
#print data [1,:]
#print data
#print self.acquire.getXinc()
if (self.ChannelNumber==4):
data [2,:]= self.data1[:,1]
data [3,:]= self.data2[:,1]
str=self.field+' - '+self.Title+self.acquire.isDemo()
file = PspiceBinaryFile(self.ChannelNumber, self.buffersize , \
self.acquire.getXinc(), str)
file.Open(fileName)
for i in range (0, self.buffersize /100 ,1):
file.Write( take(data, range(i*100,i*100+100,1) ,1 ) ,100)
file.Close()
def OnStimuliSaveFile(self, event):
dlg1 = wx.FileDialog(self,"Choose a filename", ".", "",
"Stl files (*.stl)|*.stl", wx.SAVE|wx.OVERWRITE_PROMPT )
if dlg1.ShowModal() == wx.ID_OK:
fileName = dlg1.GetPath()
data = zeros ((self.ChannelNumber ,self.buffersize ) , Float)
data [0,:]= self.data1[:,1]
data [1,:]= self.data2[:,1]
if (self.ChannelNumber==4):
data [2,:]= self.data1[:,1]
data [3,:]= self.data2[:,1]
file = PspiceStimuliFile(self.buffersize, self.acquire.getXinc())
file.Open(fileName)
file.Write( data [0,:] , "CH1")
file.Write( data [1,:] , "CH2")
if (self.ChannelNumber==4):
file.Write( data [2,:] , "CH3")
file.Write( data [3,:] , "CH4")
file.Close()
def OnAdress(self, event):
dlg = wx.TextEntryDialog(self, 'Enter the adress','GPIB Adress or SERIAL Port', '')
dlg.SetValue(self.acquire.getAdress())
if dlg.ShowModal() == wx.ID_OK:
st=dlg.GetValue()
self.acquire.setAdress(st)
self.cfg.set('%s' %(self.field),'adress',st)
self.acquire.Restart()
#print 'You entered: <<%s>>\n' % dlg.GetValue()
dlg.Destroy()
def OnTitle(self, event):
dlg = wx.TextEntryDialog(self, 'Enter your Title','', self.Title)
if dlg.ShowModal() == wx.ID_OK:
self.Title=dlg.GetValue()
self.cfg.set('%s' %(self.field),'Title',self.Title)
dlg.Destroy()
def OnFileExit(self, event):
self.acquire.close()
fp=open("pyGPIBscope.ini","w")
self.cfg.write(fp)
self.Close(True)
def OnReset(self,event):
self.client.Reset()
def OnForward(self,event):
if (self.start<self.right):
self.start=self.start+self.pointsperdiv
#print self.start , self.right
self.DrawPlot()
def OnBack(self,event):
if (self.start>=self.pointsperdiv):
self.start=self.start-self.pointsperdiv
#print self.start,self.pointsperdiv
self.DrawPlot()
def OnHelpAbout(self, event):
from wx.lib.dialogs import ScrolledMessageDialog
about = ScrolledMessageDialog(self, __doc__, "About...")
about.ShowModal()
def resetDefaults(self):
"""Just to reset the fonts back to the PlotCanvas defaults"""
self.client.SetFont(wx.Font(10,wx.SWISS,wx.NORMAL,wx.NORMAL))
self.client.SetFontSizeAxis(12)
self.client.SetEnableZoom(False)
self.client.SetFontSizeLegend(9)
def DrawPlot(self):
self.client.SetXoffset(self.start*self.acquire.getXinc())
#print self.start, '%.16f' % (self.start*self.acquire.getXinc())
self.pdata1 = self.data1[self.start:self.start + self.pointsperdiv*10]
self.pdata2 = self.data2[self.start:self.start + self.pointsperdiv*10]
channel1 = PolyLine(self.pdata1, legend='CH1', colour='red')
channel2 = PolyLine(self.pdata2, legend='CH2', colour='green')
str=self.field+' - '+self.Title+self.acquire.isDemo()
if (self.ChannelNumber==2):
self.client.Draw( PlotGraphics([channel1, channel2],str, \
self.acquire.getYdivision ('1')+" - "+ self.acquire.getYdivision ('2')\
+" "+ self.acquire.getXdivision () , ""))
else:
self.pdata3 = self.data3[self.start:self.start + self.pointsperdiv*10]
self.pdata4 = self.data4[self.start:self.start + self.pointsperdiv*10]
channel3 = PolyLine(self.pdata3, legend='CH3', colour='blue')
channel4 = PolyLine(self.pdata4, legend='CH4', colour='orange')
self.client.Draw( PlotGraphics([channel1, channel2,channel3,channel4],str, \
self.acquire.getYdivision ('1')+" - "+ self.acquire.getYdivision ('2')\
+self.acquire.getYdivision ('3')+" - "+ self.acquire.getYdivision ('4')\
+" "+ self.acquire.getXdivision () , ""))
def OnAcquire(self,event):
self.acquire.ViewAll()
dlg = wx.ProgressDialog("pyGPIBscope","Acquisition running ....",100, self, wx.PD_APP_MODAL)
dlg.Update(0, "Acquisition running ....")
self.acquire.GetPreamble()
self.Origin()
self.client.SetDiv(self.acquire.getXDIV(),self.acquire.getYDIV('1'))
dlg.Update(25,"Acquisition running ....")
self.acquire.NormalAcquire()
self.data1[:,0]= self.data2[:,0] = self.acquire.getX()
self.data1[:,1]= self.acquire.getY('1')
self.data2[:,1]= self.acquire.getY('2')
if (self.ChannelNumber==4):
self.data3[:,0]= self.data4[:,0] =self.acquire.getX()
self.data3[:,1]= self.acquire.getY('3')
self.data4[:,1]= self.acquire.getY('4')
if (self.acquire.getReference()=='LEFT '):
self.start=self.left
choice='Left'
elif (self.acquire.getReference()=='RIGH '):
self.start=self.right
choice='Right'
else:
self.start=self.center
choice='Center'
self.combo.SetValue(choice)
#print "Plotting"
dlg.Update(50,"Acquisition running ....")
self.DrawPlot()
dlg.Destroy()
def Origin(self):
self.pointsperdiv=self.acquire.getPointsPerDiv()
#print self.pointsperdiv
self.left=0
self.right=self.buffersize-10*self.pointsperdiv
if (self.right==0):
self.center=0
else:
self.center=100*(int(1.0*self.buffersize/200))-5*self.pointsperdiv
#print self.left, self.center, self.right
def _drawObjects(self):
self.acquire=ACQUIRE(self.Adress,self.field,self.Title)
self.acquire.ViewAll()
self.acquire.Acquire('1')
self.acquire.Acquire('2')
self.acquire.GetPreamble()
self.buffersize=self.acquire.getSize()
self.Origin()
self.pdata1 = zeros ( (10*self.pointsperdiv,2) , Float)
self.pdata2 = zeros ( (10*self.pointsperdiv,2) , Float)
self.data1 = zeros ( (self.buffersize,2) , Float)
self.data2 = zeros ( (self.buffersize,2) , Float)
self.ChannelNumber=self.acquire.getChannelNumber()
if (self.ChannelNumber==4):
self.pdata3 = zeros ( (10*self.pointsperdiv,2) , Float)
self.pdata4 = zeros ( (10*self.pointsperdiv,2) , Float)
self.data3 = zeros ( (self.buffersize,2) , Float)
self.data4 = zeros ( (self.buffersize,2) , Float)
self.client.SetDiv(self.acquire.getXDIV(),self.acquire.getYDIV('1'))
#print "getX"
self.data1[:,0]= self.acquire.getX()
self.start=self.left
self.DrawPlot()
class App(wx.App):
def OnInit(self):
wx.InitAllImageHandlers()
frame = AppFrame(None, -1, "%s - %s" %(TITLE,VER) )
frame.Show(True)
self.SetTopWindow(frame)
return True
if __name__ == '__main__':
app = App(0)
app.MainLoop()