blob: 6b1a1dbc9ddbffa38a7da8b82133c4f39074c943 [file] [log] [blame]
cliechti8f376e72003-10-03 00:16:11 +00001#!/usr/bin/env python
2# generated by wxGlade 0.3.1 on Thu Oct 02 23:25:44 2003
3
cliechtid5d51982008-04-10 23:48:55 +00004#from wxPython.wx import *
5import wx
cliechti8f376e72003-10-03 00:16:11 +00006import serial
cliechti24c3a882014-08-01 03:36:27 +00007import serial.tools.list_ports
cliechti8f376e72003-10-03 00:16:11 +00008
9SHOW_BAUDRATE = 1<<0
10SHOW_FORMAT = 1<<1
11SHOW_FLOW = 1<<2
12SHOW_TIMEOUT = 1<<3
13SHOW_ALL = SHOW_BAUDRATE|SHOW_FORMAT|SHOW_FLOW|SHOW_TIMEOUT
14
cliechti80a0ed12003-10-03 23:53:42 +000015
cliechtid5d51982008-04-10 23:48:55 +000016class SerialConfigDialog(wx.Dialog):
cliechti24c3a882014-08-01 03:36:27 +000017 """Serial Port configuration dialog, to be used with pySerial 2.0+
cliechti8f376e72003-10-03 00:16:11 +000018 When instantiating a class of this dialog, then the "serial" keyword
19 argument is mandatory. It is a reference to a serial.Serial instance.
20 the optional "show" keyword argument can be used to show/hide different
cliechti24c3a882014-08-01 03:36:27 +000021 settings. The default is SHOW_ALL which corresponds to
cliechti8f376e72003-10-03 00:16:11 +000022 SHOW_BAUDRATE|SHOW_FORMAT|SHOW_FLOW|SHOW_TIMEOUT. All constants can be
cliechti24c3a882014-08-01 03:36:27 +000023 found in this module (not the class)."""
24
cliechti8f376e72003-10-03 00:16:11 +000025 def __init__(self, *args, **kwds):
Chris Liechti4caf6a52015-08-04 01:07:45 +020026 # grab the serial keyword and remove it from the dict
cliechti8f376e72003-10-03 00:16:11 +000027 self.serial = kwds['serial']
28 del kwds['serial']
29 self.show = SHOW_ALL
30 if kwds.has_key('show'):
31 self.show = kwds['show']
32 del kwds['show']
33 # begin wxGlade: SerialConfigDialog.__init__
34 # end wxGlade
cliechtid5d51982008-04-10 23:48:55 +000035 kwds["style"] = wx.DEFAULT_DIALOG_STYLE
36 wx.Dialog.__init__(self, *args, **kwds)
37 self.label_2 = wx.StaticText(self, -1, "Port")
38 self.combo_box_port = wx.ComboBox(self, -1, choices=["dummy1", "dummy2", "dummy3", "dummy4", "dummy5"], style=wx.CB_DROPDOWN)
cliechti8f376e72003-10-03 00:16:11 +000039 if self.show & SHOW_BAUDRATE:
cliechtid5d51982008-04-10 23:48:55 +000040 self.label_1 = wx.StaticText(self, -1, "Baudrate")
41 self.choice_baudrate = wx.Choice(self, -1, choices=["choice 1"])
cliechti8f376e72003-10-03 00:16:11 +000042 if self.show & SHOW_FORMAT:
cliechtid5d51982008-04-10 23:48:55 +000043 self.label_3 = wx.StaticText(self, -1, "Data Bits")
44 self.choice_databits = wx.Choice(self, -1, choices=["choice 1"])
45 self.label_4 = wx.StaticText(self, -1, "Stop Bits")
46 self.choice_stopbits = wx.Choice(self, -1, choices=["choice 1"])
47 self.label_5 = wx.StaticText(self, -1, "Parity")
48 self.choice_parity = wx.Choice(self, -1, choices=["choice 1"])
cliechti8f376e72003-10-03 00:16:11 +000049 if self.show & SHOW_TIMEOUT:
cliechtid5d51982008-04-10 23:48:55 +000050 self.checkbox_timeout = wx.CheckBox(self, -1, "Use Timeout")
51 self.text_ctrl_timeout = wx.TextCtrl(self, -1, "")
52 self.label_6 = wx.StaticText(self, -1, "seconds")
cliechti8f376e72003-10-03 00:16:11 +000053 if self.show & SHOW_FLOW:
cliechtid5d51982008-04-10 23:48:55 +000054 self.checkbox_rtscts = wx.CheckBox(self, -1, "RTS/CTS")
55 self.checkbox_xonxoff = wx.CheckBox(self, -1, "Xon/Xoff")
56 self.button_ok = wx.Button(self, -1, "OK")
57 self.button_cancel = wx.Button(self, -1, "Cancel")
cliechti8f376e72003-10-03 00:16:11 +000058
59 self.__set_properties()
60 self.__do_layout()
cliechti24c3a882014-08-01 03:36:27 +000061 # fill in ports and select current setting
62 preferred_index = 0
cliechti8f376e72003-10-03 00:16:11 +000063 self.combo_box_port.Clear()
cliechti24c3a882014-08-01 03:36:27 +000064 self.ports = []
cliechtif2f8b532014-08-03 17:31:09 +000065 for n, (portname, desc, hwid) in enumerate(sorted(serial.tools.list_ports.comports())):
cliechti24c3a882014-08-01 03:36:27 +000066 self.combo_box_port.Append('%s (%s [%s])' % (portname, desc, hwid))
67 self.ports.append(portname)
cliechti8f376e72003-10-03 00:16:11 +000068 if self.serial.portstr == portname:
cliechti24c3a882014-08-01 03:36:27 +000069 preferred_index = n
70 self.combo_box_port.SetSelection(preferred_index)
cliechti8f376e72003-10-03 00:16:11 +000071 if self.show & SHOW_BAUDRATE:
Chris Liechti4caf6a52015-08-04 01:07:45 +020072 # fill in baud rates and select current setting
cliechti8f376e72003-10-03 00:16:11 +000073 self.choice_baudrate.Clear()
74 for n, baudrate in enumerate(self.serial.BAUDRATES):
75 self.choice_baudrate.Append(str(baudrate))
76 if self.serial.baudrate == baudrate:
77 index = n
78 self.choice_baudrate.SetSelection(index)
79 if self.show & SHOW_FORMAT:
Chris Liechti4caf6a52015-08-04 01:07:45 +020080 # fill in data bits and select current setting
cliechti8f376e72003-10-03 00:16:11 +000081 self.choice_databits.Clear()
82 for n, bytesize in enumerate(self.serial.BYTESIZES):
83 self.choice_databits.Append(str(bytesize))
84 if self.serial.bytesize == bytesize:
85 index = n
86 self.choice_databits.SetSelection(index)
Chris Liechti4caf6a52015-08-04 01:07:45 +020087 # fill in stop bits and select current setting
cliechti8f376e72003-10-03 00:16:11 +000088 self.choice_stopbits.Clear()
89 for n, stopbits in enumerate(self.serial.STOPBITS):
90 self.choice_stopbits.Append(str(stopbits))
91 if self.serial.stopbits == stopbits:
92 index = n
93 self.choice_stopbits.SetSelection(index)
Chris Liechti4caf6a52015-08-04 01:07:45 +020094 # fill in parities and select current setting
cliechti8f376e72003-10-03 00:16:11 +000095 self.choice_parity.Clear()
96 for n, parity in enumerate(self.serial.PARITIES):
97 self.choice_parity.Append(str(serial.PARITY_NAMES[parity]))
98 if self.serial.parity == parity:
99 index = n
100 self.choice_parity.SetSelection(index)
101 if self.show & SHOW_TIMEOUT:
Chris Liechti4caf6a52015-08-04 01:07:45 +0200102 # set the timeout mode and value
cliechti8f376e72003-10-03 00:16:11 +0000103 if self.serial.timeout is None:
104 self.checkbox_timeout.SetValue(False)
105 self.text_ctrl_timeout.Enable(False)
106 else:
107 self.checkbox_timeout.SetValue(True)
108 self.text_ctrl_timeout.Enable(True)
109 self.text_ctrl_timeout.SetValue(str(self.serial.timeout))
110 if self.show & SHOW_FLOW:
Chris Liechti4caf6a52015-08-04 01:07:45 +0200111 # set the rtscts mode
cliechti8f376e72003-10-03 00:16:11 +0000112 self.checkbox_rtscts.SetValue(self.serial.rtscts)
Chris Liechti4caf6a52015-08-04 01:07:45 +0200113 # set the rtscts mode
cliechti8f376e72003-10-03 00:16:11 +0000114 self.checkbox_xonxoff.SetValue(self.serial.xonxoff)
Chris Liechti4caf6a52015-08-04 01:07:45 +0200115 # attach the event handlers
cliechti8f376e72003-10-03 00:16:11 +0000116 self.__attach_events()
117
118 def __set_properties(self):
119 # begin wxGlade: SerialConfigDialog.__set_properties
120 # end wxGlade
121 self.SetTitle("Serial Port Configuration")
122 if self.show & SHOW_TIMEOUT:
123 self.text_ctrl_timeout.Enable(0)
124 self.button_ok.SetDefault()
125
126 def __do_layout(self):
127 # begin wxGlade: SerialConfigDialog.__do_layout
128 # end wxGlade
cliechtid5d51982008-04-10 23:48:55 +0000129 sizer_2 = wx.BoxSizer(wx.VERTICAL)
130 sizer_3 = wx.BoxSizer(wx.HORIZONTAL)
131 sizer_basics = wx.StaticBoxSizer(wx.StaticBox(self, -1, "Basics"), wx.VERTICAL)
132 sizer_5 = wx.BoxSizer(wx.HORIZONTAL)
133 sizer_5.Add(self.label_2, 1, wx.ALL|wx.ALIGN_CENTER_VERTICAL, 4)
cliechti8f376e72003-10-03 00:16:11 +0000134 sizer_5.Add(self.combo_box_port, 1, 0, 0)
cliechtid5d51982008-04-10 23:48:55 +0000135 sizer_basics.Add(sizer_5, 0, wx.RIGHT|wx.EXPAND, 0)
cliechti8f376e72003-10-03 00:16:11 +0000136 if self.show & SHOW_BAUDRATE:
cliechtid5d51982008-04-10 23:48:55 +0000137 sizer_baudrate = wx.BoxSizer(wx.HORIZONTAL)
138 sizer_baudrate.Add(self.label_1, 1, wx.ALL|wx.ALIGN_CENTER_VERTICAL, 4)
139 sizer_baudrate.Add(self.choice_baudrate, 1, wx.ALIGN_RIGHT, 0)
140 sizer_basics.Add(sizer_baudrate, 0, wx.EXPAND, 0)
141 sizer_2.Add(sizer_basics, 0, wx.EXPAND, 0)
cliechti8f376e72003-10-03 00:16:11 +0000142 if self.show & SHOW_FORMAT:
cliechtid5d51982008-04-10 23:48:55 +0000143 sizer_8 = wx.BoxSizer(wx.HORIZONTAL)
144 sizer_7 = wx.BoxSizer(wx.HORIZONTAL)
145 sizer_6 = wx.BoxSizer(wx.HORIZONTAL)
146 sizer_format = wx.StaticBoxSizer(wx.StaticBox(self, -1, "Data Format"), wx.VERTICAL)
147 sizer_6.Add(self.label_3, 1, wx.ALL|wx.ALIGN_CENTER_VERTICAL, 4)
148 sizer_6.Add(self.choice_databits, 1, wx.ALIGN_RIGHT, 0)
149 sizer_format.Add(sizer_6, 0, wx.EXPAND, 0)
150 sizer_7.Add(self.label_4, 1, wx.ALL|wx.ALIGN_CENTER_VERTICAL, 4)
151 sizer_7.Add(self.choice_stopbits, 1, wx.ALIGN_RIGHT, 0)
152 sizer_format.Add(sizer_7, 0, wx.EXPAND, 0)
153 sizer_8.Add(self.label_5, 1, wx.ALL|wx.ALIGN_CENTER_VERTICAL, 4)
154 sizer_8.Add(self.choice_parity, 1, wx.ALIGN_RIGHT, 0)
155 sizer_format.Add(sizer_8, 0, wx.EXPAND, 0)
156 sizer_2.Add(sizer_format, 0, wx.EXPAND, 0)
cliechti8f376e72003-10-03 00:16:11 +0000157 if self.show & SHOW_TIMEOUT:
cliechtid5d51982008-04-10 23:48:55 +0000158 sizer_timeout = wx.StaticBoxSizer(wx.StaticBox(self, -1, "Timeout"), wx.HORIZONTAL)
159 sizer_timeout.Add(self.checkbox_timeout, 0, wx.ALL|wx.ALIGN_CENTER_VERTICAL, 4)
cliechti8f376e72003-10-03 00:16:11 +0000160 sizer_timeout.Add(self.text_ctrl_timeout, 0, 0, 0)
cliechtid5d51982008-04-10 23:48:55 +0000161 sizer_timeout.Add(self.label_6, 0, wx.ALL|wx.ALIGN_CENTER_VERTICAL, 4)
cliechti8f376e72003-10-03 00:16:11 +0000162 sizer_2.Add(sizer_timeout, 0, 0, 0)
163 if self.show & SHOW_FLOW:
cliechtid5d51982008-04-10 23:48:55 +0000164 sizer_flow = wx.StaticBoxSizer(wx.StaticBox(self, -1, "Flow Control"), wx.HORIZONTAL)
165 sizer_flow.Add(self.checkbox_rtscts, 0, wx.ALL|wx.ALIGN_CENTER_VERTICAL, 4)
166 sizer_flow.Add(self.checkbox_xonxoff, 0, wx.ALL|wx.ALIGN_CENTER_VERTICAL, 4)
167 sizer_flow.Add((10,10), 1, wx.EXPAND, 0)
168 sizer_2.Add(sizer_flow, 0, wx.EXPAND, 0)
cliechti8f376e72003-10-03 00:16:11 +0000169 sizer_3.Add(self.button_ok, 0, 0, 0)
170 sizer_3.Add(self.button_cancel, 0, 0, 0)
cliechtid5d51982008-04-10 23:48:55 +0000171 sizer_2.Add(sizer_3, 0, wx.ALL|wx.ALIGN_RIGHT, 4)
cliechti8f376e72003-10-03 00:16:11 +0000172 self.SetAutoLayout(1)
173 self.SetSizer(sizer_2)
174 sizer_2.Fit(self)
175 sizer_2.SetSizeHints(self)
176 self.Layout()
177
178 def __attach_events(self):
cliechtid5d51982008-04-10 23:48:55 +0000179 wx.EVT_BUTTON(self, self.button_ok.GetId(), self.OnOK)
180 wx.EVT_BUTTON(self, self.button_cancel.GetId(), self.OnCancel)
cliechti8f376e72003-10-03 00:16:11 +0000181 if self.show & SHOW_TIMEOUT:
cliechtid5d51982008-04-10 23:48:55 +0000182 wx.EVT_CHECKBOX(self, self.checkbox_timeout.GetId(), self.OnTimeout)
cliechti8f376e72003-10-03 00:16:11 +0000183
184 def OnOK(self, events):
185 success = True
cliechti24c3a882014-08-01 03:36:27 +0000186 self.serial.port = self.ports[self.combo_box_port.GetSelection()]
cliechti8f376e72003-10-03 00:16:11 +0000187 if self.show & SHOW_BAUDRATE:
188 self.serial.baudrate = self.serial.BAUDRATES[self.choice_baudrate.GetSelection()]
189 if self.show & SHOW_FORMAT:
190 self.serial.bytesize = self.serial.BYTESIZES[self.choice_databits.GetSelection()]
191 self.serial.stopbits = self.serial.STOPBITS[self.choice_stopbits.GetSelection()]
192 self.serial.parity = self.serial.PARITIES[self.choice_parity.GetSelection()]
193 if self.show & SHOW_FLOW:
194 self.serial.rtscts = self.checkbox_rtscts.GetValue()
195 self.serial.xonxoff = self.checkbox_xonxoff.GetValue()
196 if self.show & SHOW_TIMEOUT:
197 if self.checkbox_timeout.GetValue():
198 try:
199 self.serial.timeout = float(self.text_ctrl_timeout.GetValue())
200 except ValueError:
cliechtid5d51982008-04-10 23:48:55 +0000201 dlg = wx.MessageDialog(self, 'Timeout must be a numeric value',
202 'Value Error', wx.OK | wx.ICON_ERROR)
cliechti8f376e72003-10-03 00:16:11 +0000203 dlg.ShowModal()
204 dlg.Destroy()
205 success = False
206 else:
207 self.serial.timeout = None
208 if success:
cliechtid5d51982008-04-10 23:48:55 +0000209 self.EndModal(wx.ID_OK)
cliechti8f376e72003-10-03 00:16:11 +0000210
211 def OnCancel(self, events):
cliechtid5d51982008-04-10 23:48:55 +0000212 self.EndModal(wx.ID_CANCEL)
cliechti8f376e72003-10-03 00:16:11 +0000213
214 def OnTimeout(self, events):
215 if self.checkbox_timeout.GetValue():
216 self.text_ctrl_timeout.Enable(True)
217 else:
218 self.text_ctrl_timeout.Enable(False)
219
220# end of class SerialConfigDialog
221
222
cliechtid5d51982008-04-10 23:48:55 +0000223class MyApp(wx.App):
cliechti8f376e72003-10-03 00:16:11 +0000224 """Test code"""
225 def OnInit(self):
cliechtid5d51982008-04-10 23:48:55 +0000226 wx.InitAllImageHandlers()
cliechti24c3a882014-08-01 03:36:27 +0000227
cliechti8f376e72003-10-03 00:16:11 +0000228 ser = serial.Serial()
Chris Liechti4caf6a52015-08-04 01:07:45 +0200229 print(ser)
230 # loop until cancel is pressed, old values are used as start for the next run
231 # show the different views, one after the other
232 # value are kept.
cliechti8f376e72003-10-03 00:16:11 +0000233 for flags in (SHOW_BAUDRATE, SHOW_FLOW, SHOW_FORMAT, SHOW_TIMEOUT, SHOW_ALL):
234 dialog_serial_cfg = SerialConfigDialog(None, -1, "", serial=ser, show=flags)
235 self.SetTopWindow(dialog_serial_cfg)
236 result = dialog_serial_cfg.ShowModal()
Chris Liechti4caf6a52015-08-04 01:07:45 +0200237 print(ser)
cliechtid5d51982008-04-10 23:48:55 +0000238 if result != wx.ID_OK:
cliechti8f376e72003-10-03 00:16:11 +0000239 break
Chris Liechti4caf6a52015-08-04 01:07:45 +0200240 # the user can play around with the values, CANCEL aborts the loop
cliechti8f376e72003-10-03 00:16:11 +0000241 while 1:
242 dialog_serial_cfg = SerialConfigDialog(None, -1, "", serial=ser)
243 self.SetTopWindow(dialog_serial_cfg)
244 result = dialog_serial_cfg.ShowModal()
Chris Liechti4caf6a52015-08-04 01:07:45 +0200245 print(ser)
cliechtid5d51982008-04-10 23:48:55 +0000246 if result != wx.ID_OK:
cliechti8f376e72003-10-03 00:16:11 +0000247 break
248 return 0
249
250# end of class MyApp
251
252if __name__ == "__main__":
253 app = MyApp(0)
254 app.MainLoop()