#!/usr/bin/python
"""
__version__ = "$Revision: 1.0 $"
__date__ = "$Date: 2003/11/01 08:00:29 $"
"""
import os,time
import wx
if wx.Platform == '__WXMSW__':
from wx.lib.pdfwin import PDFWindow
from PythonCard import dialog, graphic, log, model
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 textarea
from PythonCard.components import gauge
from PythonCard.components import imagebutton
from PythonCard.components import slider
import ConfigParser
from serial import *
wildcardFILE = "txt file (*.txt)|*.txt|" \
"All files (*.*)|*.*"
VER="1.6"
class MyBackground(model.Background):
def on_initialize(self,event):
self.cfg=ConfigParser.ConfigParser()
self.cfg.readfp(open('pyRS485.ini'))
#PORT
self.port=self.cfg.get('settings','port')
self.components.ComboBoxPORT.SetValue(self.port)
#FILE
self.file=self.cfg.get('settings','file')
if (len(self.file)!=0):
self.pathFILE=os.path.dirname(self.file)
else:
self.pathFILE=''
self.components.TextFieldFILE.SetValue(self.file)
self.number=0
#PORT
self.nport = int(self.port[3])-1
self.baud=9600
#open Serial port
try:
self.serial=Serial(self.nport,self.baud,EIGHTBITS,PARITY_NONE,STOPBITS_ONE,1,0,0)
except:
wx.MessageBox('Port %s already opened or not exist!' %(self.port),'Error', wx.OK)
return
self.serial.setRTS(1)
self.serial.flushInput()
self.serial.flushOutput()
def on_btnBrowseFILE_mouseClick(self, event):
dlg = wx.FileDialog(self, "Choose a file", self.pathFILE, "", wildcardFILE,wx.OPEN)
if dlg.ShowModal() == wx.ID_OK:
files = dlg.GetPaths()
self.file=files[0]
self.pathFILE=os.path.dirname(self.file)
if len(self.file)>48:
self.components.TextFieldFILE.SetValue(files[0])
self.cfg.set('settings','file',files[0])
else:
self.components.TextFieldFILE.SetValue(self.file)
self.cfg.set('settings','file',files[0])
dlg.Destroy()
def on_menuFileAbout_select(self, event):
msg="""
pyRS485 - V%s
RS485 Terminal 9600bps
Dalet Philippe
Laboratoire STS Electronique
Lyp Champollion
avenue pezet
46100 FIGEAC
FRANCE
philippe.dalet@voila.fr
""" %(VER)
dialog.scrolledMessageDialog(self, msg, "About")
def on_menuFileHelp_select(self, event):
msg="""
All characters sent are colored in blue and all received in red
Alphanumeric characters are displayed normally, the others are displayed
in hexadecimal like this "[0x81]" except '\\r' like "[\\r]"
Protocol:
MASTER: Adress:0x81 + Command + '\\r' => '\\x81GetVoltage\\r'
SLAVE: Adress:0x81 + Response +'\\r' => '\\x8112.5\\r'
"""
dialog.scrolledMessageDialog(self, msg, "Help")
def on_menuFileExit_select(self, event):
self.refresh()
try:
self.serial.close()
except:
pass
self.Close()
def on_menuFileSchema_select(self, event):
self.process = wx.Process(self)
#self.process.Redirect();
pid = wx.Execute("layout.pdf", wx.EXEC_ASYNC, self.process)
def on_btnQuit_mouseClick(self, event):
self.refresh()
try:
self.serial.close()
except:
pass
fp=open("pyRS485.ini","w")
self.cfg.write(fp)
self.Close()
def refresh(self):
if (self.components.ComboBoxPORT.GetValue()!= self.port):
self.port=self.components.ComboBoxPORT.GetValue()
self.cfg.set('settings','port',self.port)
self.nport = int(self.port[3])-1
try:
self.serial.close()
except:
pass
try:
self.serial=Serial(self.nport,self.baud,EIGHTBITS,PARITY_NONE,STOPBITS_ONE,1,0,0)
except:
wx.MessageBox('Port %s already opened or not exist!' %(self.port),'Error', wx.OK)
return
def display(self, str, color):
text=""
for i in range (0,len(str)):
if (ord (str[i]) < 128):
if str[i]!='\r':
text=text+str[i]
else:
text=text+ "[%X]" %(ord (str[i]) )
text=text+"[\\r]\r\n"
self.components.TextArea1.SetStyle(self.number, self.number+len(text), wx.TextAttr(color, "WHITE"))
self.components.TextArea1.AppendText(text)
self.number=self.number+len(text)
def pdisplay(self, str,):
text=""
for i in range (0,len(str)):
if (ord (str[i]) < 128):
if str[i]!='\r':
text=text+str[i]
else:
text=text+ "[%X]" %(ord (str[i]) )
text=text+"\r\n"
print text
def on_btnCLEAR_mouseClick(self, event):
self.components.TextArea1.SetValue("")
self.number=0
def on_btnSEND_mouseClick(self, event):
self.refresh()
#open TXT file
try:
file = open(self.file, 'rb')
except:
wx.MessageBox('File %s cannot opened !' %(self.file),'Error', wx.OK)
return
#test port COMx
try:
self.serial.setRTS(0)
except:
wx.MessageBox('Port %s not opened!' %(self.port),'Error', wx.OK)
return
str=file.read(os.path.getsize(self.file))
file.close()
self.display(str,'BLUE')
self.serial.flushInput()
self.serial.setRTS(0)
self.serial.write(str)
self.serial.write('\r') #send CR
# 20ms necessary : after write instruction the '\r' is always in the buffer, but not in the UART
# print self.serial.outWaiting() ,
time.sleep(0.01)
# print self.serial.outWaiting()
self.serial.setRTS(1)
self.serial.setTimeout(1)
programmed = self.serial.read(1)
#self.display(programmed,'RED')
#if not programmed:
# wx.MessageBox('%s: Serial Port Timeout!' %(self.port),'Error', wx.OK)
# #self.pdisplay(programmed)
# return
self.pdisplay(str[0])
self.pdisplay(programmed)
if (programmed==str[0]):
str=programmed
while (str.find('\r')==-1): #loop while this flag is true
str = str+ self.serial.read(1) #read one, with timout
self.display(str,'RED')
else:
if not programmed:
print '[NULL]'
else:
print programmed
self.display("No Response",'RED')
#self.pdisplay(programmed)
if __name__ == '__main__':
import sys
app = model.Application(MyBackground)
app.MainLoop()