diff --git a/obd_io.py b/obd_io.py index e30f103..ec10cb6 100755 --- a/obd_io.py +++ b/obd_io.py @@ -21,21 +21,22 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ########################################################################### +from __future__ import print_function import serial import string import time from math import ceil import wx #due to debugEvent messaging -import obd_sensors +import pyobd.obd_sensors as obd_sensors -from obd_sensors import hex_to_int +from pyobd.obd_sensors import hex_to_int GET_DTC_COMMAND = "03" CLEAR_DTC_COMMAND = "04" GET_FREEZE_DTC_COMMAND = "07" -from debugEvent import * +from pyobd.debugEvent import * #__________________________________________________________________________ def decrypt_dtc_code(code): @@ -103,7 +104,7 @@ class OBDPort: except serial.SerialException: self.State = 0 return None - + self.ELMver = self.get_result() wx.PostEvent(self._notify_window, DebugEvent([2,"atz response:" + self.ELMver])) self.send_command("ate0") # echo off @@ -125,14 +126,14 @@ class OBDPort: return None wx.PostEvent(self._notify_window, DebugEvent([2,"Connection attempt:" + str(count)])) count=count+1 - + def close(self): """ Resets device and closes all associated filehandles""" - + if (self.port!= None) and self.State==1: self.send_command("atz") self.port.close() - + self.port = None self.ELMver = "Unknown" @@ -142,8 +143,8 @@ class OBDPort: self.port.flushOutput() self.port.flushInput() for c in cmd: - self.port.write(c) - self.port.write("\r\n") + self.port.write(c.encode()) + self.port.write(b"\r\n") wx.PostEvent(self._notify_window, DebugEvent([3,"Send command:" + cmd])) def interpret_result(self,code): @@ -151,34 +152,34 @@ class OBDPort: # Code will be the string returned from the device. # It should look something like this: # '41 11 0 0\r\r' - + # 9 seems to be the length of the shortest valid response if len(code) < 7: raise "BogusCode" - + # get the first thing returned, echo should be off code = string.split(code, "\r") code = code[0] - + #remove whitespace code = string.split(code) code = string.join(code, "") - + #cables can behave differently if code[:6] == "NODATA": # there is no such sensor return "NODATA" - + # first 4 characters are code from ELM code = code[4:] return code - + def get_result(self): """Internal use only: not a public interface""" time.sleep(0.1) if self.port: buffer = "" while 1: - c = self.port.read(1) + c = self.port.read(1).decode() if c == '\r' and len(buffer) > 0: break else: @@ -196,7 +197,7 @@ class OBDPort: cmd = sensor.cmd self.send_command(cmd) data = self.get_result() - + if data: data = self.interpret_result(data) if data != "NODATA": @@ -219,25 +220,25 @@ class OBDPort: for s in obd_sensors.SENSORS: names.append(s.name) return names - + def get_tests_MIL(self): statusText=["Unsupported","Supported - Completed","Unsupported","Supported - Incompleted"] - + statusRes = self.sensor(1)[1] #GET values statusTrans = [] #translate values to text - + statusTrans.append(str(statusRes[0])) #DTCs - + if statusRes[1]==0: #MIL statusTrans.append("Off") else: statusTrans.append("On") - + for i in range(2,len(statusRes)): #Tests statusTrans.append(statusText[statusRes[i]]) - + return statusTrans - + # # fixme: j1979 specifies that the program should poll until the number # of returned DTCs matches the number indicated by a call to PID 01 @@ -250,53 +251,53 @@ class OBDPort: dtcNumber = r[0] mil = r[1] DTCCodes = [] - - - print "Number of stored DTC:" + str(dtcNumber) + " MIL: " + str(mil) + + + print("Number of stored DTC:" + str(dtcNumber) + " MIL: " + str(mil)) # get all DTC, 3 per mesg response for i in range(0, ((dtcNumber+2)/3)): self.send_command(GET_DTC_COMMAND) res = self.get_result() - print "DTC result:" + res + print("DTC result:" + res) for i in range(0, 3): val1 = hex_to_int(res[3+i*6:5+i*6]) val2 = hex_to_int(res[6+i*6:8+i*6]) #get DTC codes from response (3 DTC each 2 bytes) val = (val1<<8)+val2 #DTC val as int - + if val==0: #skip fill of last packet break - + DTCStr=dtcLetters[(val&0xC000)>14]+str((val&0x3000)>>12)+str(val&0x0fff) - + DTCCodes.append(["Active",DTCStr]) - + #read mode 7 self.send_command(GET_FREEZE_DTC_COMMAND) res = self.get_result() - + if res[:7] == "NO DATA": #no freeze frame return DTCCodes - - print "DTC freeze result:" + res + + print("DTC freeze result:" + res) for i in range(0, 3): val1 = hex_to_int(res[3+i*6:5+i*6]) val2 = hex_to_int(res[6+i*6:8+i*6]) #get DTC codes from response (3 DTC each 2 bytes) val = (val1<<8)+val2 #DTC val as int - + if val==0: #skip fill of last packet break - + DTCStr=dtcLetters[(val&0xC000)>14]+str((val&0x3000)>>12)+str(val&0x0fff) DTCCodes.append(["Passive",DTCStr]) - + return DTCCodes - + def clear_dtc(self): """Clears all DTCs and freeze frame data""" self.send_command(CLEAR_DTC_COMMAND) r = self.get_result() return r - + def log(self, sensor_index, filename): file = open(filename, "w") start_time = time.time() @@ -310,4 +311,3 @@ class OBDPort: line = "%.6f,\t%s\n" % (now - start_time, data[1]) file.write(line) file.flush() - \ No newline at end of file diff --git a/obd_sensors.py b/obd_sensors.py index 4954ba7..46b404a 100755 --- a/obd_sensors.py +++ b/obd_sensors.py @@ -21,6 +21,7 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ########################################################################### +from __future__ import print_function def hex_to_int(str): i = eval("0x" + str, {}, {}) return i @@ -36,7 +37,7 @@ def throttle_pos(code): def intake_m_pres(code): # in kPa code = hex_to_int(code) return code / 0.14504 - + def rpm(code): code = hex_to_int(code) return code / 4 @@ -78,26 +79,26 @@ def dtc_decrypt(code): mil = 1 else: mil = 0 - + # bit 0-6 are the number of dtc's. num = num & 0x7f - + res.append(num) res.append(mil) - + numB = hex_to_int(code[2:4]) #B byte - + for i in range(0,3): res.append(((numB>>i)&0x01)+((numB>>(3+i))&0x02)) - + numC = hex_to_int(code[4:6]) #C byte numD = hex_to_int(code[6:8]) #D byte - + for i in range(0,7): res.append(((numC>>i)&0x01)+(((numD>>i)&0x01)<<1)) - + res.append(((numD>>7)&0x01)) #EGR SystemC7 bit of different - + return res def hex_to_bitstring(str): @@ -167,13 +168,13 @@ SENSORS = [ Sensor(" Engine Run with MIL on", "014E", sec_to_min ,"min" ), ] - - + + #___________________________________________________________ def test(): for i in SENSORS: - print i.name, i.value("F") + print(i.name, i.value("F")) if __name__ == "__main__": test() diff --git a/pyobd b/pyobd index e015105..7c11c33 100755 --- a/pyobd +++ b/pyobd @@ -25,8 +25,9 @@ #import wxversion #wxversion.select("2.6") +from __future__ import print_function import wx - + import pyobd.obd_io as obd_io #OBD2 funcs import os #os.environ @@ -35,7 +36,7 @@ import sys import serial import platform import time -import ConfigParser #safe application configuration +from six.moves import configparser as ConfigParser #safe application configuration import webbrowser #open browser from python from pyobd.obd2_codes import pcodes @@ -63,7 +64,7 @@ EVT_RESULT_ID = 1000 def EVT_RESULT(win, func,id): """Define Result Event.""" win.Connect(-1, -1, id, func) - + #event pro akutalizaci Trace tabu class ResultEvent(wx.PyEvent): """Simple event to carry arbitrary result data.""" @@ -102,10 +103,10 @@ class TestEvent(wx.PyEvent): wx.PyEvent.__init__(self) self.SetEventType(EVT_TESTS_ID) self.data = data - + #defines notification event for debug tracewindow from pyobd.debugEvent import * - + class MyApp(wx.App): # A listctrl which auto-resizes the column boxes to fill class MyListCtrl(wx.ListCtrl, ListCtrlAutoWidthMixin): @@ -113,10 +114,10 @@ class MyApp(wx.App): size = wx.DefaultSize, style = 0): wx.ListCtrl.__init__(self,parent,id,pos,size,style) ListCtrlAutoWidthMixin.__init__(self) - + class sensorProducer(threading.Thread): def __init__(self, _notify_window,portName,SERTIMEOUT,RECONNATTEMPTS,_nb): - from Queue import Queue + from six.moves.queue import Queue self.portName = portName self.RECONNATTEMPTS=RECONNATTEMPTS self.SERTIMEOUT=SERTIMEOUT @@ -124,21 +125,21 @@ class MyApp(wx.App): self._notify_window=_notify_window self._nb=_nb threading.Thread.__init__ ( self ) - + def initCommunication(self): self.port = obd_io.OBDPort(self.portName,self._notify_window,self.SERTIMEOUT,self.RECONNATTEMPTS) - + if self.port.State==0: #Cant open serial port return None - + self.active = [] self.supp = self.port.sensor(0)[1] #read supported PIDS - + self.active.append(1); #PID 0 is always supported - + wx.PostEvent(self._notify_window, ResultEvent([0,0,"X"])) wx.PostEvent(self._notify_window, DebugEvent([1,"Communication initialized..."])) - + for i in range(1, len(self.supp)): if self.supp[i-1] == "1": #put X in coloum if PID is supported self.active.append(1) @@ -147,7 +148,7 @@ class MyApp(wx.App): self.active.append(0) wx.PostEvent(self._notify_window, ResultEvent([i,0,""])) return "OK" - + def run(self): wx.PostEvent(self._notify_window, StatusEvent([0,1,"Connecting...."])) self.initCommunication() @@ -156,7 +157,7 @@ class MyApp(wx.App): wx.PostEvent(self._notify_window, StatusEvent([666])) #signal apl, that communication was disconnected wx.PostEvent(self._notify_window, StatusEvent([0,1,"Error cant connect..."])) return None - + wx.PostEvent(self._notify_window, StatusEvent([0,1,"Connected"])) wx.PostEvent(self._notify_window, StatusEvent([2,1,self.port.ELMver])) prevstate=-1 @@ -170,7 +171,7 @@ class MyApp(wx.App): res=self.port.get_tests_MIL() for i in range(0,len(res)): wx.PostEvent(self._notify_window, TestEvent([i,1,res[i]])) - + elif curstate==2: #show sensor tab for i in range(3, len(self.active)): if self.active[i]: @@ -184,15 +185,15 @@ class MyApp(wx.App): if self._notify_window.ThreadControl==666: #before reset ThreadControl we must check if main thread did not want us to finish break - + self._notify_window.ThreadControl=0 prevstate=-1 # to reread DTC if self._notify_window.ThreadControl == 2: #reread DTC prevstate=-1 - + if self._notify_window.ThreadControl==666: break - + self._notify_window.ThreadControl=0 if prevstate!=3: wx.PostEvent(self._notify_window, DTCEvent(0)) #clear list @@ -222,15 +223,15 @@ class MyApp(wx.App): def all_on(self): for i in range(0, len(self.active)): self.off(i) - + def stop(self): if self.port != None: #if stop is called before any connection port is not defined (and not connected ) self.port.close() wx.PostEvent(self._notify_window, StatusEvent([0,1,"Disconnected"])) wx.PostEvent(self._notify_window, StatusEvent([2,1,"----"])) - + #class producer end - + def sensor_control_on(self): #after connection enable few buttons self.settingmenu.Enable(ID_CONFIG,False) self.settingmenu.Enable(ID_RESET,False) @@ -243,16 +244,16 @@ class MyApp(wx.App): def sensor_toggle(e): sel = e.m_itemIndex state = self.senprod.active[sel] - print sel, state + print(sel, state) if state == 0: self.senprod.on(sel) - self.sensors.SetStringItem(sel,1,"1") + self.sensors.SetItem(sel,1,"1") elif state == 1: self.senprod.off(sel) - self.sensors.SetStringItem(sel,1,"0") + self.sensors.SetItem(sel,1,"0") else: debug("Incorrect sensor state") - + self.sensors.Bind(wx.EVT_LIST_ITEM_ACTIVATED,sensor_toggle,id=self.sensor_id) def sensor_control_off(self): #after disconnect disable fer buttons @@ -265,57 +266,57 @@ class MyApp(wx.App): self.ClearDTCButton.Enable(False) #http://pyserial.sourceforge.net/ empty function #EVT_LIST_ITEM_ACTIVATED(self.sensors,self.sensor_id, lambda : None) - + def build_sensor_page(self): HOFFSET_LIST=0 - tID = wx.NewId() + tID = wx.ID_ANY self.sensor_id = tID panel = wx.Panel(self.nb, -1) - + self.sensors = self.MyListCtrl(panel, tID, pos=wx.Point(0,HOFFSET_LIST), style= wx.LC_REPORT | wx.SUNKEN_BORDER | wx.LC_HRULES | wx.LC_SINGLE_SEL) - + self.sensors.InsertColumn(0, "Supported",width=70) self.sensors.InsertColumn(1, "Sensor",format=wx.LIST_FORMAT_RIGHT, width=250) self.sensors.InsertColumn(2, "Value") for i in range(0, len(obd_io.obd_sensors.SENSORS)): s = obd_io.obd_sensors.SENSORS[i].name - self.sensors.InsertStringItem(i, "") - self.sensors.SetStringItem(i, 1, s) - - + self.sensors.InsertItem(i, "") + self.sensors.SetItem(i, 1, s) + + #################################################################### # This little bit of magic keeps the list the same size as the frame def OnPSize(e, win = panel): panel.SetSize(e.GetSize()) self.sensors.SetSize(e.GetSize()) - w,h = self.frame.GetClientSizeTuple() - self.sensors.SetDimensions(0,HOFFSET_LIST, w-10 , h - 35 ) + w,h = self.frame.GetClientSize() + self.sensors.SetSize(0,HOFFSET_LIST, w-10 , h - 35 ) panel.Bind(wx.EVT_SIZE,OnPSize) #################################################################### self.nb.AddPage(panel, "Sensors") - + def build_DTC_page(self): HOFFSET_LIST=30 #offset from the top of panel (space for buttons) - tID = wx.NewId() + tID = wx.ID_ANY self.DTCpanel = wx.Panel(self.nb, -1) self.GetDTCButton = wx.Button(self.DTCpanel,-1 ,"Get DTC" , wx.Point(15,0)) self.ClearDTCButton = wx.Button(self.DTCpanel,-1,"Clear DTC", wx.Point(100,0)) - + #bind functions to button click action self.DTCpanel.Bind(wx.EVT_BUTTON,self.GetDTC,self.GetDTCButton) self.DTCpanel.Bind(wx.EVT_BUTTON,self.QueryClear,self.ClearDTCButton) - + self.dtc = self.MyListCtrl(self.DTCpanel,tID, pos=wx.Point(0,HOFFSET_LIST), style=wx.LC_REPORT|wx.SUNKEN_BORDER|wx.LC_HRULES|wx.LC_SINGLE_SEL) - + self.dtc.InsertColumn(0, "Code", width=100) self.dtc.InsertColumn(1, "Status",width=100) self.dtc.InsertColumn(2, "Trouble code") @@ -324,33 +325,33 @@ class MyApp(wx.App): def OnPSize(e, win = self.DTCpanel): self.DTCpanel.SetSize(e.GetSize()) self.dtc.SetSize(e.GetSize()) - w,h = self.frame.GetClientSizeTuple() + w,h = self.frame.GetClientSize() # I have no idea where 70 comes from - self.dtc.SetDimensions(0,HOFFSET_LIST, w-16 , h - 70 ) + self.dtc.SetSize(0,HOFFSET_LIST, w-16 , h - 70 ) self.DTCpanel.Bind(wx.EVT_SIZE,OnPSize) #################################################################### - + self.nb.AddPage(self.DTCpanel, "DTC") - + def TraceDebug(self,level,msg): if self.DEBUGLEVEL<=level: self.trace.Append([str(level),msg]) - + def OnInit(self): self.ThreadControl = 0 #say thread what to do self.COMPORT = 0 self.senprod = None self.DEBUGLEVEL = 0 #debug everthing - tID = wx.NewId() + tID = wx.ID_ANY #read settings from file self.config = ConfigParser.RawConfigParser() - + #print platform.system() - #print platform.mac_ver()[] - + #print platform.mac_ver()[] + if "OS" in os.environ.keys(): #runnig under windows self.configfilepath="pyobd.ini" else: @@ -363,7 +364,7 @@ class MyApp(wx.App): self.COMPORT=self.config.get("pyOBD","COMPORT") self.RECONNATTEMPTS=self.config.getint("pyOBD","RECONNATTEMPTS") self.SERTIMEOUT=self.config.getint("pyOBD","SERTIMEOUT") - + frame = wx.Frame(None, -1, "pyOBD-II") self.frame=frame @@ -372,10 +373,10 @@ class MyApp(wx.App): EVT_RESULT(self,self.OnDtc,EVT_DTC_ID) EVT_RESULT(self,self.OnStatus,EVT_STATUS_ID) EVT_RESULT(self,self.OnTests,EVT_TESTS_ID) - + # Main notebook frames self.nb = wx.Notebook(frame, -1, style = wx.NB_TOP) - + self.status = self.MyListCtrl(self.nb, tID,style=wx.LC_REPORT|wx.SUNKEN_BORDER) self.status.InsertColumn(0, "Description",width=200) self.status.InsertColumn(1, "Value") @@ -383,21 +384,21 @@ class MyApp(wx.App): self.status.Append(["Protocol","---"]); self.status.Append(["Cable version","---"]); self.status.Append(["COM port",self.COMPORT]); - + self.nb.AddPage(self.status, "Status") - + self.OBDTests = self.MyListCtrl(self.nb, tID,style=wx.LC_REPORT|wx.SUNKEN_BORDER) self.OBDTests.InsertColumn(0, "Description",width=200) self.OBDTests.InsertColumn(1, "Value") self.nb.AddPage(self.OBDTests, "Tests") - + for i in range(0,len(ptest)): #fill MODE 1 PID 1 test description self.OBDTests.Append([ptest[i],"---"]); - + self.build_sensor_page() self.build_DTC_page() - + self.trace = self.MyListCtrl(self.nb, tID,style=wx.LC_REPORT|wx.SUNKEN_BORDER) self.trace.InsertColumn(0, "Level",width=40) self.trace.InsertColumn(1, "Message") @@ -420,7 +421,7 @@ class MyApp(wx.App): self.dtcmenu.Append(ID_LOOK ,"Code Lookup"," Lookup DTC Codes") self.helpmenu = wx.Menu() - + self.helpmenu.Append(ID_HELP_ABOUT ,"About this program", " Get DTC Codes") self.helpmenu.Append(ID_HELP_VISIT ,"Visit program homepage"," Lookup DTC Codes") self.helpmenu.Append(ID_HELP_ORDER ,"Order OBD-II interface", " Clear DTC Codes") @@ -432,9 +433,9 @@ class MyApp(wx.App): self.menuBar.Append(self.settingmenu,"&OBD-II") self.menuBar.Append(self.dtcmenu,"&Trouble codes") self.menuBar.Append(self.helpmenu,"&Help") - + frame.SetMenuBar(self.menuBar) # Adding the MenuBar to the Frame content. - + frame.Bind(wx.EVT_MENU,self.OnExit,id=ID_EXIT)# attach the menu-event ID_EXIT to the frame.Bind(wx.EVT_MENU,self.QueryClear,id=ID_CLEAR) frame.Bind(wx.EVT_MENU,self.Configure,id=ID_CONFIG) @@ -445,7 +446,7 @@ class MyApp(wx.App): frame.Bind(wx.EVT_MENU,self.OnHelpAbout,id=ID_HELP_ABOUT) frame.Bind(wx.EVT_MENU,self.OnHelpVisit,id=ID_HELP_VISIT) frame.Bind(wx.EVT_MENU,self.OnHelpOrder,id=ID_HELP_ORDER) - + self.SetTopWindow(frame) frame.Show(True) @@ -456,10 +457,10 @@ class MyApp(wx.App): def OnHelpVisit(self,event): webbrowser.open("http://www.obdtester.com/pyobd") - + def OnHelpOrder(self,event): webbrowser.open("http://www.obdtester.com/order") - + def OnHelpAbout(self,event): #todo about box Text = """ PyOBD is an automotive OBD2 diagnosting application using ELM237 cable. @@ -482,7 +483,7 @@ the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 0211 #HelpAboutDlg = wx.Dialog(self.frame, id, title="About") - + #box = wx.BoxSizer(wx.HORIZONTAL) #box.Add(wx.StaticText(reconnectPanel,-1,Text,pos=(0,0),size=(200,200))) #box.Add(wx.Button(HelpAboutDlg,wx.ID_OK),0) @@ -492,54 +493,54 @@ the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 0211 #HelpAboutDlg.SetAutoLayout(True) #sizer.Fit(HelpAboutDlg) #HelpAboutDlg.ShowModal() - + self.HelpAboutDlg = wx.MessageDialog(self.frame, Text, 'About',wx.OK | wx.ICON_INFORMATION) self.HelpAboutDlg.ShowModal() self.HelpAboutDlg.Destroy() - + def OnResult(self,event): - self.sensors.SetStringItem(event.data[0], event.data[1], event.data[2]) - + self.sensors.SetItem(event.data[0], event.data[1], event.data[2]) + def OnStatus(self,event): if event.data[0] == 666: #signal, that connection falied self.sensor_control_off() else: - self.status.SetStringItem(event.data[0], event.data[1], event.data[2]) - + self.status.SetItem(event.data[0], event.data[1], event.data[2]) + def OnTests(self,event): - self.OBDTests.SetStringItem(event.data[0], event.data[1], event.data[2]) - - def OnDebug(self,event): + self.OBDTests.SetItem(event.data[0], event.data[1], event.data[2]) + + def OnDebug(self,event): self.TraceDebug(event.data[0],event.data[1]) - + def OnDtc(self,event): if event.data == 0: #signal, that DTC was cleared self.dtc.DeleteAllItems() else: self.dtc.Append(event.data) - + def OnDisconnect(self,event): #disconnect connection to ECU self.ThreadControl=666 self.sensor_control_off() - + def OpenPort(self,e): - + if self.senprod: # signal current producers to finish self.senprod.stop() - self.ThreadControl = 0 + self.ThreadControl = 0 self.senprod = self.sensorProducer(self,self.COMPORT,self.SERTIMEOUT,self.RECONNATTEMPTS,self.nb) self.senprod.start() - + self.sensor_control_on() - + def GetDTC(self,e): self.nb.SetSelection(3) self.ThreadControl=2 - + def AddDTC(self, code): - self.dtc.InsertStringItem(0, "") - self.dtc.SetStringItem(0, 0, code[0]) - self.dtc.SetStringItem(0, 1, code[1]) + self.dtc.InsertItem(0, "") + self.dtc.SetItem(0, 0, code[0]) + self.dtc.SetItem(0, 1, code[1]) def CodeLookup(self,e = None): @@ -550,8 +551,7 @@ the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 0211 root = tree.AddRoot("Code Reference") proot = root; # tree.AppendItem(root,"Powertrain (P) Codes") - codes = pcodes.keys() - codes.sort() + codes = sorted(list(pcodes.keys())) group = "" for c in codes: if c[:3] != group: @@ -563,7 +563,7 @@ the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 0211 diag.SetSize((400,500)) diag.Show(True) - + def QueryClear(self,e): id = 0 diag = wx.Dialog(self.frame, id, title="Clear DTC?") @@ -587,8 +587,8 @@ the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 0211 def ClearDTC(self): self.ThreadControl=1 self.nb.SetSelection(3) - - + + def scanSerial(self): """scan for available ports. return a list of serial names""" available = [] @@ -620,7 +620,7 @@ the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 0211 s.close() # explicit close 'cause of delayed GC in java except serial.SerialException: pass - + # ELM-USB shows up as /dev/tty.usbmodemXXXX, where XXXX is a changing hex string # on connection; so we have to search through all 64K options if len(platform.mac_ver()[0])!=0: #search only on MAC @@ -632,46 +632,46 @@ the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 0211 s.close() except serial.SerialException: pass - + return available def Configure(self,e = None): id = 0 diag = wx.Dialog(self.frame, id, title="Configure") sizer = wx.BoxSizer(wx.VERTICAL) - + ports = self.scanSerial() rb = wx.RadioBox(diag, id, "Choose Serial Port", choices = ports, style = wx.RA_SPECIFY_COLS, majorDimension = 2) - + sizer.Add(rb, 0) - #timeOut input control + #timeOut input control timeoutPanel = wx.Panel(diag, -1) timeoutCtrl = wx.TextCtrl(timeoutPanel, -1, '',pos=(140,0), size=(35, 25)) timeoutStatic = wx.StaticText(timeoutPanel,-1,'Timeout:',pos=(3,5),size=(140,20)) timeoutCtrl.SetValue(str(self.SERTIMEOUT)) - - #reconnect attempt input control + + #reconnect attempt input control reconnectPanel = wx.Panel(diag, -1) reconnectCtrl = wx.TextCtrl(reconnectPanel, -1, '',pos=(140,0), size=(35, 25)) reconnectStatic = wx.StaticText(reconnectPanel,-1,'Reconnect attempts:',pos=(3,5),size=(140,20)) reconnectCtrl.SetValue(str(self.RECONNATTEMPTS)) - + #web open link button self.OpenLinkButton = wx.Button(diag,-1,"Click here to order ELM-USB interface",size=(260,30)) diag.Bind(wx.EVT_BUTTON,self.OnHelpOrder,self.OpenLinkButton) - + #set actual serial port choice if (self.COMPORT != 0) and (self.COMPORT in ports): rb.SetSelection(ports.index(self.COMPORT)) - - + + sizer.Add(self.OpenLinkButton) sizer.Add(timeoutPanel,0) sizer.Add(reconnectPanel,0) - + box = wx.BoxSizer(wx.HORIZONTAL) box.Add(wx.Button(diag,wx.ID_OK),0) box.Add(wx.Button(diag,wx.ID_CANCEL),1) @@ -682,27 +682,27 @@ the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 0211 sizer.Fit(diag) r = diag.ShowModal() if r == wx.ID_OK: - + #create section if self.config.sections()==[]: self.config.add_section("pyOBD") #set and save COMPORT self.COMPORT = ports[rb.GetSelection()] self.config.set("pyOBD","COMPORT",self.COMPORT) - + #set and save SERTIMEOUT self.SERTIMEOUT = int(timeoutCtrl.GetValue()) self.config.set("pyOBD","SERTIMEOUT",self.SERTIMEOUT) - self.status.SetStringItem(3,1,self.COMPORT); - + self.status.SetItem(3,1,self.COMPORT); + #set and save RECONNATTEMPTS self.RECONNATTEMPTS = int(reconnectCtrl.GetValue()) self.config.set("pyOBD","RECONNATTEMPTS",self.RECONNATTEMPTS) - + #write configuration to cfg file self.config.write(open(self.configfilepath, 'wb')) - + def OnExit(self,e = None): import sys sys.exit(0)