# $Id: pyTDS.py, # 2003/04/17 # 2005/05/30 # Author: Ph Dalet (philippe.dalet@voila.fr) # from PythonCard import dialog, graphic, log, model import os,time import wx.lib.iewin from threading import * from struct import * import time, math from GaugeDialog import * from PythonCard import EXIF from PythonCard.components import button from PythonCard.components import staticline from PythonCard.components import statictext from PythonCard.components import image from PythonCard.components import combobox from PythonCard.components import textfield from PythonCard.components import bitmapcanvas from PythonCard.components import gauge import ConfigParser from serial import * from constants import * VER = "1.9" BORDER = 5 RESIZE_LEFT = 1 RESIZE_RIGHT = 2 DRAG_X = 3 RESIZE_TOP = 4 RESIZE_BOTTOM = 5 DRAG_Y = 6 class MyBackground(model.Background): def on_initialize(self,event): self.cfg=ConfigParser.ConfigParser() self.cfg.readfp(open('pyTDS.ini')) #PORT self.port=self.cfg.get('settings','port') self.components.cmbComboBox.SetValue(self.port) #FULLNAME self.fullname=self.cfg.get('settings','name') self.name=os.path.basename(self.fullname) self.path=self.fullname[:len(self.fullname)-len(self.name)] self.components.fldTextField.SetValue(self.fullname) self.bitmapCanvasLoad() self.Gauge = GaugeDialog(self,0) self.Timer = wx.Timer(self.components.btnTransfert, -1) #PORT self.nport = int(self.port[3])-1 self.FILESIZE=FILESIZE_DEFAULT self.ID(); def bitmapCanvasLoad(self): bufOff = self.components.bufOff if os.path.isfile(self.fullname) : self.ofile=open(self.fullname, 'rb') self.bitmap = wx.Bitmap(self.fullname) if os.path.getsize(self.fullname)==TDS210: bufOff.drawBitmap(self.bitmap, (0, 0)) else: bufOff.drawBitmapScaled(self.bitmap, (0, 0) , (640,480)) self.ofile.close() else: bufOff.clear() #print 'File ', self.fullname, ' doesn''t exist...' def on_btnTransfert_mouseClick(self, event): try: self.serial=Serial(self.nport,19200,EIGHTBITS,PARITY_NONE,STOPBITS_ONE,1,0,0) except: wx.MessageBox('Port %s already opened or does not exist!' %(self.port),'Error', wx.OK) return n=self.components.fldTextField.GetValue() if n!=self.fullname: self.fullname=n self.name=os.path.basename(self.fullname) self.path=self.fullname[:len(self.fullname)-len(self.name)] while (os.path.isfile(self.fullname)): DotChunks=string.split(self.name ,".") extension =DotChunks[-1] name=DotChunks[0] DotChunks=string.split(self.name ,"0") N=int(name[len(DotChunks[0]):])+1 self.name=DotChunks[0] + '%03d.'%N + extension self.fullname=self.path+self.name self.components.fldTextField.SetValue(self.fullname) try: self.ofile=open(self.fullname, 'wb') #print 'File ', self.fullname, ' opened...' except: #print 'Could not open file ', self.fullname, ' for writing...' return self.components.bufOff.clear() #print "command sended" time.sleep(.5) self.serial.flushInput() self.command('HARDC:LAY PORTR\n') self.command('HARDC:FORM BMP\n') self.command('HARDC:PORT RS232\n') self.command('ACQU:STATE STOP\n') self.command('*WAI\n') self.command('HARDC STAR\n') self.Size=0 self.Timer.Start(3000) # necessary for no detect 0 bytes [len(data)] self.Gauge.showModal() # PB 19200bps No protocol , sending commands must be # slow => def command(self,st) def command(self,st): length=4 i=len(st) while (i>0): self.serial.write(st[:length]) st=st[length:] time.sleep(0.01) i-=length def on_timer(self, event): if ( self.Gauge.getstate()==1 ): data=self.serial.read(1920) # 19200/10 bytes in 1 second #print len(data) if (len(data)!=0): self.Size=self.Size +len(data) self.ofile.write(data) self.Gauge.update((self.Size*100)/self.FILESIZE) self.Timer.Start(1000) # 1 second else: self.ofile.close() self.Gauge.reset() self.Gauge.close() self.Timer.Stop() self.bitmapCanvasLoad() self.serial.close() else: print "abort" self.ofile.close() self.Gauge.reset() self.Gauge.close() self.Timer.Stop() self.bitmapCanvasLoad() self.serial.close() def on_btnQuit_mouseClick(self, event): self.Gauge.destroy() fp=open("pyTDS.ini","w") self.cfg.write(fp) self.Close() def ID(self): try: self.serial=Serial(self.nport,19200,EIGHTBITS,PARITY_NONE,STOPBITS_ONE,1,0,0) except: wx.MessageBox('Port %s already opened or does not exist!' %(self.port),'Error', wx.OK) return for i in range(0,3): self.serial.write('ID?\n') ch=self.serial.read(100) id=ch[:6] if id=="ID TEK": pos=ch.find(',') id=ch[:pos] id=id[7:] break if i==2: wx.MessageBox('No Link with a TDS Family Oscilloscope !','Error', wx.OK) else: wx.MessageBox('%s Oscilloscope Found!' %(id),'pyTDS', wx.OK) if id=="TDS 210": self.FILESIZE= TDS210 elif id=="TDS 1002": self.FILESIZE= TDS1002 else: print "Unknow FILESIZE !!!" self.serial.close() def on_btnId_mouseClick(self, event): self.ID(); def on_btnFolder_mouseClick(self, event): result = dialog.directoryDialog(self, 'Choose a directory', '') if result['accepted']==1: path = result['path'] self.path=path self.fullname=path+'\\'+self.name self.cfg.set('settings','name',self.fullname) self.components.fldTextField.SetValue(self.fullname) def on_cmbComboBox_select(self, event): select=self.components.cmbComboBox.GetSelection() if select==0: self.port='COM1' elif select==1: self.port='COM2' elif select==2: self.port='COM3' elif select==3: self.port='COM4' elif select==4: self.port='COM5' elif select==5: self.port='COM6' elif select==6: self.port='COM7' elif select==7: self.port='COM8' self.cfg.set('settings','port',self.port) self.nport = int(self.port[3])-1 def on_menuFileExit_select(self, event): self.Gauge.destroy() self.Close() def on_menuAbout_select(self, event): msg=""" pyTDS - V%s - TDS Family Oscilloscope Hardcopy Utility Format: 19200bps, 8 bits, 1 stop, No protocol 19200 NONE LF NONE Dalet Philippe Laboratoire STS Electronique Lyp Champollion avenue pezet 46100 FIGEAC FRANCE philippe.dalet@voila.fr """ %(VER) dialog.scrolledMessageDialog(self, msg, "About") def on_btnPrint_mouseClick(self, event): pd = wx.PrintData() pd.SetPrinterName('') pd.SetOrientation(wx.LANDSCAPE) pd.SetPaperId(wx.PAPER_A4) pd.SetQuality(wx.PRINT_QUALITY_DRAFT) pd.SetColour(False) # black & white print pd.SetNoCopies(1) pd.SetCollate(True) pdd = wx.PrintDialogData() pdd.SetPrintData(pd) pdd.SetSetupDialog(False) pdd.SetMinPage(1) pdd.SetMaxPage(1) pdd.SetFromPage(1) pdd.SetToPage(1) pdd.SetPrintToFile(False) printdialog = wx.PrintDialog(self, pdd) if printdialog.ShowModal() != wx.ID_OK: return dc = printdialog.GetPrintDC() dc.StartDoc(self.fullname) dc.StartPage() dc.SetUserScale(8,8) #scale if os.path.isfile(self.fullname) and os.path.getsize(self.fullname)==self.FILESIZE: self.ofile=open(self.fullname, 'rb') bitmap = wx.Bitmap(self.fullname,wx.BITMAP_TYPE_BMP) dc.DrawBitmap(bitmap, 100, 100,true) self.ofile.close() dc.EndPage() dc.EndDoc() del dc if __name__ == '__main__': import sys app = model.Application(MyBackground) wx.InitAllImageHandlers() # bitmap print necessary app.MainLoop()