def OnInit(self): ''' Load the main window from the main.xrc ''' self.mainXrc = wx.xrc.XmlResource(cfg.ResourcePath('main.xrc')) self.InitFrame() return True
def Connect(self, port): ''' port - the name of the serial port. This works on unix and windows systems, given the appropriate name ''' # This works only in windows, so port numbers are COM1,COM2 etc. portNumber = int(port.replace('COM', '')) tempDirChange = Chdir(cfg.ResourcePath()) self.DLL = CDLL('uProcessDriver_C_V1_2_1.dll') del tempDirChange self.EIB = self.DLL.NewEIB() if self.EIB == 0: return False retCode = self.DLL.ConnectEIB(self.EIB, portNumber) if retCode != 0: return False self.syringePumps = {} self.valves = None self.sensors = None DeviceDataArray = c_ubyte * (self.MAX_DEVICE_ADDRESS + 1) deviceAddresses = DeviceDataArray() deviceTypes = DeviceDataArray() devicesNum = self.DLL.ScanDevices(self.EIB, byref(deviceAddresses), byref(deviceTypes)) print str(devicesNum) + ' devices found:' if not devicesNum > 0: return False for idx in range(devicesNum): if deviceTypes[idx] == self.DEVICE_TYPE_SPS01: print 'SPS01 @' + str(deviceAddresses[idx]) self.syringePumps[deviceAddresses[idx]] = self.DLL.NewSPS01( self.EIB, c_ubyte(deviceAddresses[idx])) retCode = self.DLL.InitSyringe( self.syringePumps[deviceAddresses[idx]]) if retCode == 0: return False if deviceTypes[idx] == self.DEVICE_TYPE_4VM01: print '4VM01 @' + str(deviceAddresses[idx]) self.valves = self.DLL.New4VM01(self.EIB, c_ubyte(deviceAddresses[idx])) retCode = self.DLL.InitValves(self.valves) if retCode == 0: return False if deviceTypes[idx] == self.DEVICE_TYPE_4AM01: print '4AM01 @' + str(deviceAddresses[idx]) self.sensors = self.DLL.New4AM01(self.EIB, c_ubyte(deviceAddresses[idx])) retCode = self.DLL.InitSensors(self.sensors) if retCode == 0: return False return True
def InitFrame(self): ''' Init the main window ''' self.listButtons = [] self.runButtons = [] self.mainFrame = self.mainXrc.LoadFrame(None, 'mainFrame') self.splitter = wx.xrc.XRCCTRL(self.mainFrame, 'splitter') self.mainFrame.SetTitle(self.system.name) self.mainFrame.Bind(wx.EVT_CLOSE, self.OnClose) # log self.logGraph = LogGraphPanel( wx.xrc.XRCCTRL(self.mainFrame, 'logGraphPage'), self.sysComps) self.Connect(-1, -1, cfg.EVT_LOG_UPDATE, self.OnLogUpdate) # update framework cfg.InitVariables(self) # Menu self.mainFrame.Bind(wx.EVT_MENU, self.OnLoadSequence, id=wx.xrc.XRCID('loadSequenceMenuItem')) self.mainFrame.Bind(wx.EVT_MENU, self.OnSaveSequence, id=wx.xrc.XRCID('saveSequenceMenuItem')) self.mainFrame.Bind(wx.EVT_MENU, self.OnLoadMethod, id=wx.xrc.XRCID('loadMethodMenuItem')) self.mainFrame.Bind(wx.EVT_MENU, self.OnSaveMethod, id=wx.xrc.XRCID('saveMethodMenuItem')) self.mainFrame.Bind(wx.EVT_MENU, self.OnClose, id=wx.xrc.XRCID('quitMenuItem')) self.mainFrame.Bind(wx.EVT_MENU, self.OnAbout, id=wx.xrc.XRCID('aboutMenuItem')) menusDict = dict(self.mainFrame.GetMenuBar().GetMenus()) commMenu = [ key for key, value in menusDict.iteritems() if value == 'Comm' ][0] for comp in self.sysComps: cfg.AddControllerIfNeeded(comp.controllerClass) for controller in cfg.controllers: menu = commMenu.Append(-1, controller.name, 'Connect the ' + controller.name) self.mainFrame.Bind(wx.EVT_MENU, controller.OnMenuConnect, menu) # sysCompsPanel monitorPanel = wx.xrc.XRCCTRL(self.mainFrame, 'monitorPanel') self.stopButton = wx.BitmapButton( monitorPanel, -1, wx.Bitmap(cfg.ResourcePath('stopButton.png'), wx.BITMAP_TYPE_PNG)) monitorPanel.GetSizer().Add(self.stopButton, flag=wx.BOTTOM | wx.ALIGN_CENTRE_HORIZONTAL) self.stopButton.Bind(wx.EVT_BUTTON, self.OnStopButton) self.sysCompsPanel = wx.xrc.XRCCTRL(self.mainFrame, 'sysCompsPanel') sysCompsPanelBoxSizer = self.sysCompsPanel.GetSizer() for sysComp in self.sysComps: panel = sysComp.CreatePanel(self.sysCompsPanel) if panel != None: sysCompsPanelBoxSizer.Add(panel) # make all sysComps fill their given area for sysCompPanel in sysCompsPanelBoxSizer.GetChildren(): sysCompPanel.SetFlag(wx.GROW) sysCompsPanelBoxSizer.Fit(self.mainFrame) self.Connect(-1, -1, cfg.EVT_UPDATE_CONTROLS, self.OnUpdateControls) self.Connect(-1, -1, cfg.EVT_POP_MESSAGE, self.OnPopMessage) # Method self.actionsListCtrl = ActionsListCtrl( wx.xrc.XRCCTRL(self.mainFrame, 'methodPage'), self.sysActions) self.runButtons.append(self.actionsListCtrl.runButton) self.listButtons.extend([ self.actionsListCtrl.list, self.actionsListCtrl.addButton, self.actionsListCtrl.removeButton ]) # Sequence self.methodsListCtrl = MethodsListCtrl( wx.xrc.XRCCTRL(self.mainFrame, 'sequencePage')) self.runButtons.append(self.methodsListCtrl.runButton) self.listButtons.extend([ self.methodsListCtrl.list, self.methodsListCtrl.addButton, self.methodsListCtrl.removeButton ]) # This makes sure both pages are drawn notebook = wx.xrc.XRCCTRL(self.mainFrame, 'methodsAndSequences') notebook.SendPageChangedEvent(0, 1) self.mainFrame.GetSizer().Fit(self.mainFrame) notebook.SendPageChangedEvent(1, 0) # main frame self.splitter.SetSashPosition(400, True) self.mainFrame.GetSizer().Fit(self.mainFrame) self.UpdateControls() self.mainFrame.Show() # Monitor periodically self.timer = wx.Timer(self) self.Bind(wx.EVT_TIMER, self.MonitorUpdate, self.timer) self.timer.Start(self.monitorUpdateDelayMilisec)