diff -r 9460872f1440 -r fec77f2b9e07 etherlab/EtherCATManagementEditor.py --- a/etherlab/EtherCATManagementEditor.py Fri Sep 28 17:15:53 2018 +0300 +++ b/etherlab/EtherCATManagementEditor.py Fri Sep 28 17:20:11 2018 +0300 @@ -23,7 +23,7 @@ import wx.grid as gridlib #------------------------------------------------------------- -# ------------ for register management --------------- +# ------------ for register management --------------- from xml.dom import minidom #------------------------------------------------------------- @@ -39,7 +39,7 @@ # Sync Managers Table #------------------------------------------------------------------------------- class SyncManagersTable(CustomTable): - def GetValue(self, row, col): + def GetValue(self, row, col): if row < self.GetNumberRows(): if col == 0: return row @@ -60,15 +60,15 @@ self.parent = parent self.Controler = controler self.NodeEditor = node_editor - + self.EtherCATManagementClassObject = {} - + # fill EtherCAT Management Treebook for pname, pclass, subs in [ ("Slave State", SlaveStatePanelClass, []), ("SDO Management", SDOPanelClass, []), ("PDO Monitoring", PDOPanelClass, []), - ("ESC Management", EEPROMAccessPanel, [ + ("ESC Management", EEPROMAccessPanel, [ ("Smart View", SlaveSiiSmartView), ("Hex View", HexView)]), ("Register Access", RegisterAccessPanel, [])]: @@ -78,22 +78,22 @@ self.Bind(wx.EVT_TREEBOOK_PAGE_CHANGED, self.OnPageChanged) self.Bind(wx.EVT_TREEBOOK_PAGE_CHANGING, self.OnPageChanging) - + def OnPageChanged(self, event): old = event.GetOldSelection() new = event.GetSelection() sel = event.GetSelection() event.Skip() - + def OnPageChanging(self, event): old = event.GetOldSelection() new = event.GetSelection() sel = event.GetSelection() - event.Skip() - + event.Skip() + #------------------------------------------------------------------------------- # For SlaveState Panel -#------------------------------------------------------------------------------- +#------------------------------------------------------------------------------- class SlaveStatePanelClass(wx.Panel): def __init__(self, parent, controler): """ @@ -104,13 +104,13 @@ wx.Panel.__init__(self, parent, -1, (0, 0), size=wx.DefaultSize, style = wx.SUNKEN_BORDER) self.Controler = controler self.parent = parent - + # initialize SlaveStatePanel UI dictionaries self.StaticBoxDic = {} self.StaticTextDic = {} self.TextCtrlDic = {} self.ButtonDic = {} - + # iniitalize BoxSizer and FlexGridSizer self.SizerDic = { "SlaveState_main_sizer" : wx.BoxSizer(wx.VERTICAL), @@ -120,15 +120,15 @@ "SlaveState_sizer" : wx.FlexGridSizer(cols=1, hgap=10, rows=2, vgap=10), "SlaveState_up_sizer" : wx.FlexGridSizer(cols=4, hgap=10, rows=2, vgap=10), "SlaveState_down_sizer" : wx.FlexGridSizer(cols=2, hgap=10, rows=1, vgap=10)} - + # initialize StaticBox and StaticBoxSizer for box_name, box_label in [ ("SlaveInfosDetailsBox", "Slave Informations"), ("SyncManagerBox", "Sync Manager"), ("SlaveStateBox", "Slave State Transition && Monitoring")]: self.StaticBoxDic[box_name] = wx.StaticBox(self, label=_(box_label)) - self.SizerDic[box_name] = wx.StaticBoxSizer(self.StaticBoxDic[box_name]) - + self.SizerDic[box_name] = wx.StaticBoxSizer(self.StaticBoxDic[box_name]) + for statictext_name, statictext_label, textctrl_name in [ ("VendorLabel", "Vendor:", "vendor"), ("ProductcodeLabel", "Product code:", "product_code"), @@ -136,16 +136,16 @@ ("PhysicsLabel", "Physics:", "physics")]: self.StaticTextDic[statictext_name] = wx.StaticText(self, label=_(statictext_label)) self.TextCtrlDic[textctrl_name] = wx.TextCtrl(self, size=wx.Size(130, 24), style=wx.TE_READONLY) - self.SizerDic["SlaveInfosDetailsInnerSizer"].AddMany([self.StaticTextDic[statictext_name], - self.TextCtrlDic[textctrl_name]]) - + self.SizerDic["SlaveInfosDetailsInnerSizer"].AddMany([self.StaticTextDic[statictext_name], + self.TextCtrlDic[textctrl_name]]) + self.SizerDic["SlaveInfosDetailsBox"].AddSizer(self.SizerDic["SlaveInfosDetailsInnerSizer"]) - - self.SyncManagersGrid = CustomGrid(self, size=wx.Size(605,155), style=wx.VSCROLL) - - self.SizerDic["SyncManagerInnerSizer"].Add(self.SyncManagersGrid) + + self.SyncManagersGrid = CustomGrid(self, size=wx.Size(605,155), style=wx.VSCROLL) + + self.SizerDic["SyncManagerInnerSizer"].Add(self.SyncManagersGrid) self.SizerDic["SyncManagerBox"].Add(self.SizerDic["SyncManagerInnerSizer"]) - + for button_name, button_id, button_label, button_tooltipstring, event_method, sub_item in [ ("InitButton", 0, "INIT", "State Transition to \"Init\" State", self.OnButtonClick, []), ("PreOPButton", 1, "PREOP", "State Transition to \"PreOP\" State", self.OnButtonClick, [ @@ -160,46 +160,46 @@ for statictext_name, statictext_label, textctrl_name in sub_item : self.StaticTextDic[statictext_name] = wx.StaticText(self, label=_(statictext_label)) self.TextCtrlDic[textctrl_name] = wx.TextCtrl(self, size=wx.DefaultSize, style=wx.TE_READONLY) - self.SizerDic["SlaveState_up_sizer"].AddMany([self.StaticTextDic[statictext_name], + self.SizerDic["SlaveState_up_sizer"].AddMany([self.StaticTextDic[statictext_name], self.TextCtrlDic[textctrl_name]]) - + for button_name, button_label, button_tooltipstring, event_method in [ ("StartTimerButton", "Start State Monitoring", "Slave State Update Restart", self.StartTimer), ("StopTimerButton", "Stop State Monitoring", "Slave State Update Stop", self.CurrentStateThreadStop)]: self.ButtonDic[button_name] = wx.Button(self, label=_(button_label)) self.ButtonDic[button_name].Bind(wx.EVT_BUTTON, event_method) self.ButtonDic[button_name].SetToolTipString(button_tooltipstring) - self.SizerDic["SlaveState_down_sizer"].Add(self.ButtonDic[button_name]) - - self.SizerDic["SlaveState_sizer"].AddMany([self.SizerDic["SlaveState_up_sizer"], + self.SizerDic["SlaveState_down_sizer"].Add(self.ButtonDic[button_name]) + + self.SizerDic["SlaveState_sizer"].AddMany([self.SizerDic["SlaveState_up_sizer"], self.SizerDic["SlaveState_down_sizer"]]) - + self.SizerDic["SlaveStateBox"].Add(self.SizerDic["SlaveState_sizer"]) - + self.SizerDic["SlaveState_inner_main_sizer"].AddMany([ self.SizerDic["SlaveInfosDetailsBox"], self.SizerDic["SyncManagerBox"], self.SizerDic["SlaveStateBox"]]) - + self.SizerDic["SlaveState_main_sizer"].Add(self.SizerDic["SlaveState_inner_main_sizer"]) - + self.SetSizer(self.SizerDic["SlaveState_main_sizer"]) - + # register a timer for periodic exectuion of slave state update (period: 1000 ms) self.Bind(wx.EVT_TIMER, self.GetCurrentState) - + self.CreateSyncManagerTable() - + self.Centre() - + def CreateSyncManagerTable(self): """ Create grid for "SyncManager" """ - # declare Table object + # declare Table object self.SyncManagersTable = SyncManagersTable(self, [], GetSyncManagersTableColnames()) self.SyncManagersGrid.SetTable(self.SyncManagersTable) # set grid alignment attr. (CENTER) - self.SyncManagersGridColAlignements = [wx.ALIGN_CENTRE, wx.ALIGN_CENTRE, wx.ALIGN_CENTRE, + self.SyncManagersGridColAlignements = [wx.ALIGN_CENTRE, wx.ALIGN_CENTRE, wx.ALIGN_CENTRE, wx.ALIGN_CENTRE, wx.ALIGN_CENTRE, wx.ALIGN_CENTRE] # set grid size self.SyncManagersGridColSizes = [40, 150, 100, 100, 100, 100] @@ -209,10 +209,10 @@ attr.SetAlignment(self.SyncManagersGridColAlignements[col], wx.ALIGN_CENTRE) self.SyncManagersGrid.SetColAttr(col, attr) self.SyncManagersGrid.SetColMinimalWidth(col, self.SyncManagersGridColSizes[col]) - self.SyncManagersGrid.AutoSizeColumn(col, False) - + self.SyncManagersGrid.AutoSizeColumn(col, False) + self.RefreshSlaveInfos() - + def RefreshSlaveInfos(self): """ Fill data in "Slave Information" and "SyncManager" @@ -220,7 +220,7 @@ slave_infos = self.Controler.GetSlaveInfos() sync_manager_section = ["vendor", "product_code", "revision_number", "physics"] if slave_infos is not None: - # this method is same as "TextCtrl.SetValue" + # this method is same as "TextCtrl.SetValue" for textctrl_name in sync_manager_section: self.TextCtrlDic[textctrl_name].SetValue(slave_infos[textctrl_name]) self.SyncManagersTable.SetData(slave_infos["sync_managers"]) @@ -230,7 +230,7 @@ self.TextCtrlDic[textctrl_name].SetValue("") self.SyncManagersTable.SetData([]) self.SyncManagersTable.ResetView(self.SyncManagersGrid) - + def OnButtonClick(self, event): """ Event handler for slave state transition button click (Init, PreOP, SafeOP, OP button) @@ -239,7 +239,7 @@ check_connect_flag = self.Controler.CommonMethod.CheckConnect(False) if check_connect_flag : state_dic = ["INIT", "PREOP", "SAFEOP", "OP"] - + # If target state is one of {INIT, PREOP, SAFEOP}, request slave state transition immediately. if event.GetId() < 3 : self.Controler.CommonMethod.RequestSlaveState(state_dic[event.GetId()]) @@ -254,8 +254,8 @@ self.Controler.CommonMethod.RequestSlaveState("OP") self.TextCtrlDic["TargetState"].SetValue("OP") else : - self.Controler.CommonMethod.CreateErrorDialog("PLC is Not Started") - + self.Controler.CommonMethod.CreateErrorDialog("PLC is Not Started") + def GetCurrentState(self, event): """ Timer event handler for periodic slave state monitoring (Default period: 1 sec = 1000 msec). @@ -268,8 +268,8 @@ try : self.SetCurrentState(line[self.Controler.GetSlavePos()]) except Exception: - pass - + pass + def SetCurrentState(self, line): """ Show current slave state using the executiob result of "ethercat slaves" command. @@ -281,10 +281,10 @@ # Result example : 0 0:0 PREOP + EL9800 (V4.30) (PIC24, SPI, ET1100) token = line.split(" ") if token[2] in state_array: - self.TextCtrlDic["CurrentState"].SetValue(token[2]) + self.TextCtrlDic["CurrentState"].SetValue(token[2]) except Exception: - pass - + pass + def StartTimer(self, event): """ Event handler for "Start State Monitoring" button. @@ -294,7 +294,7 @@ self.SlaveStateThread = wx.Timer(self) # set timer period (1000 ms) self.SlaveStateThread.Start(1000) - + def CurrentStateThreadStop(self, event): """ Event handler for "Stop State Monitoring" button. @@ -305,10 +305,10 @@ self.SlaveStateThread.Stop() except Exception: pass - + #------------------------------------------------------------------------------- # For SDO Management Panel -#------------------------------------------------------------------------------- +#------------------------------------------------------------------------------- class SDOPanelClass(wx.Panel): def __init__(self, parent, controler): """ @@ -317,64 +317,64 @@ @param controler: _EthercatSlaveCTN class in EthercatSlave.py """ wx.Panel.__init__(self, parent, -1) - + self.DatatypeDescription, self.CommunicationObject, self.ManufacturerSpecific, \ self.ProfileSpecific, self.Reserved, self.AllSDOData = range(6) - + self.Controler = controler - + self.SDOManagementMainSizer = wx.BoxSizer(wx.VERTICAL) self.SDOManagementInnerMainSizer = wx.FlexGridSizer(cols=1, hgap=10, rows=2, vgap=10) - - self.SDOUpdate = wx.Button(self, label=_('update')) + + self.SDOUpdate = wx.Button(self, label=_('update')) self.SDOUpdate.Bind(wx.EVT_BUTTON, self.SDOInfoUpdate) - + self.CallSDONoteBook = SDONoteBook(self, controler=self.Controler) self.SDOManagementInnerMainSizer.Add(self.SDOUpdate) - self.SDOManagementInnerMainSizer.Add(self.CallSDONoteBook, wx.ALL | wx.EXPAND) + self.SDOManagementInnerMainSizer.Add(self.CallSDONoteBook, wx.ALL | wx.EXPAND) self.SDOManagementMainSizer.Add(self.SDOManagementInnerMainSizer) - + self.SetSizer(self.SDOManagementMainSizer) - + def SDOInfoUpdate(self, event): """ Evenet handler for SDO "update" button. - - Load SDO data from current slave + - Load SDO data from current slave @param event : wx.EVT_BUTTON object - """ + """ self.Controler.CommonMethod.SaveSDOData = [] self.Controler.CommonMethod.ClearSDODataSet() self.SDOFlag = False - + # Check whether beremiz connected or not. check_connect_flag = self.Controler.CommonMethod.CheckConnect(False) if check_connect_flag: self.SDOs = self.Controler.CommonMethod.GetSlaveSDOFromSlave() # SDOFlag is "False", user click "Cancel" button - self.SDOFlag = self.SDOParser() + self.SDOFlag = self.SDOParser() if self.SDOFlag : - self.CallSDONoteBook.CreateNoteBook() + self.CallSDONoteBook.CreateNoteBook() self.Refresh() - - def SDOParser(self): + + def SDOParser(self): """ Parse SDO data set that obtain "SDOInfoUpdate" Method - @return True or False - """ + @return True or False + """ slaveSDO_progress = wx.ProgressDialog("Slave SDO Monitoring", "Now Uploading...", maximum = len(self.SDOs.splitlines()), parent=self, - style = wx.PD_CAN_ABORT | wx.PD_APP_MODAL | wx.PD_ELAPSED_TIME | - wx.PD_ESTIMATED_TIME | wx.PD_REMAINING_TIME | - wx.PD_AUTO_HIDE | wx.PD_SMOOTH) - + style = wx.PD_CAN_ABORT | wx.PD_APP_MODAL | wx.PD_ELAPSED_TIME | + wx.PD_ESTIMATED_TIME | wx.PD_REMAINING_TIME | + wx.PD_AUTO_HIDE | wx.PD_SMOOTH) + # If keep_going flag is False, SDOParser method is stop and return "False". keep_going = True count = 0 - - # SDO data example + + # SDO data example # SDO 0x1000, "Device type" # 0x1000:00,r-r-r-,uint32,32 bit,"Device type",0x00020192, 131474 for details_line in self.SDOs.splitlines(): @@ -387,64 +387,64 @@ else : # line_token = ['0x1000:00,r-r-r-,uint32,32 bit,', 'Device type', ',0x00020192, 131474'] token_head, name, token_tail = line_token - + # token_head = ['0x1000:00', 'r-r-r-', 'uint32', '32 bit', ''] token_head = token_head.split(",") ful_idx, access, type, size, empty = token_head # ful_idx.split(":") = ['0x1000', '00'] idx, sub_idx = ful_idx.split(":") - + # token_tail = ['', '0x00020192', '131474'] token_tail = token_tail.split(",") try : empty, hex_val, dec_val = token_tail - + # SDO data is not return "dec value" - # line example : - # 0x1702:01,rwr-r-,uint32,32 bit," 1st mapping", ---- + # line example : + # 0x1702:01,rwr-r-,uint32,32 bit," 1st mapping", ---- except Exception: empty, hex_val = token_tail - + name_after_check = self.StringTest(name) - + # convert hex type sub_idx = "0x" + sub_idx if type == "octet_string": hex_val = ' ---- ' - + # SResult of SlaveSDO data parsing. (data type : dictionary) - self.Data = {'idx':idx.strip(), 'subIdx':sub_idx.strip(), 'access':access.strip(), - 'type':type.strip(), 'size':size.strip(), 'name':name_after_check.strip("\""), + self.Data = {'idx':idx.strip(), 'subIdx':sub_idx.strip(), 'access':access.strip(), + 'type':type.strip(), 'size':size.strip(), 'name':name_after_check.strip("\""), 'value':hex_val.strip(), "category":title_name.strip("\"")} - + category_divide_value = [0x1000, 0x2000, 0x6000, 0xa000, 0xffff] for count in range(len(category_divide_value)) : if int(idx, 0) < category_divide_value[count]: self.Controler.CommonMethod.SaveSDOData[count].append(self.Data) break - + self.Controler.CommonMethod.SaveSDOData[self.AllSDOData].append(self.Data) - + if count >= len(self.SDOs.splitlines()) / 2: (keep_going, skip) = slaveSDO_progress.Update(count, "Please waiting a moment!!") else: (keep_going, skip) = slaveSDO_progress.Update(count) - - # If user click "Cancel" loop suspend immediately + + # If user click "Cancel" loop suspend immediately if (keep_going == False): break - - slaveSDO_progress.Destroy() - return keep_going + + slaveSDO_progress.Destroy() + return keep_going def StringTest(self, check_string): """ - Test value 'name' is alphanumeric - @param check_string : input data for check + Test value 'name' is alphanumeric + @param check_string : input data for check @return result : output data after check - """ + """ # string.printable is print this result #'0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ #!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~ \t\n\r\x0b\x0c @@ -456,11 +456,11 @@ result = check_string[:len(check_string) - i] break return result - - + + #------------------------------------------------------------------------------- # For SDO Notebook (divide category) -#------------------------------------------------------------------------------- +#------------------------------------------------------------------------------- class SDONoteBook(wx.Notebook): def __init__(self, parent, controler): """ @@ -468,23 +468,23 @@ @param parent: Reference to the parent SDOPanelClass class @param controler: _EthercatSlaveCTN class in EthercatSlave.py """ - wx.Notebook.__init__(self, parent, id = -1, size=(850,500)) + wx.Notebook.__init__(self, parent, id = -1, size=(850,500)) self.Controler = controler self.parent = parent - + self.CreateNoteBook() - + self.Bind(wx.EVT_CHOICEBOOK_PAGE_CHANGED, self.OnPageChanged) self.Bind(wx.EVT_CHOICEBOOK_PAGE_CHANGING, self.OnPageChanging) - - def CreateNoteBook(self): + + def CreateNoteBook(self): """ Create each NoteBook page, divided SDO index According to EtherCAT Communication(03/2011), 158p - """ + """ self.Data = [] count = 1 - + page_texts = [("all", self.parent.AllSDOData), ("0x0000 - 0x0ff", self.parent.DatatypeDescription), ("0x1000 - 0x1fff", self.parent.CommunicationObject), @@ -500,12 +500,12 @@ "All SDO Object"] self.DeleteAllPages() - + for txt, count in page_texts: self.Data = self.Controler.CommonMethod.SaveSDOData[count] - self.Win = SlaveSDOTable(self, self.Data) + self.Win = SlaveSDOTable(self, self.Data) self.AddPage(self.Win, txt) - + def OnPageChanged(self, event): old = event.GetOldSelection() new = event.GetSelection() @@ -520,17 +520,17 @@ #------------------------------------------------------------------------------- # For SDO Grid (fill index, subindex, etc...) -#------------------------------------------------------------------------------- -class SlaveSDOTable(wx.grid.Grid): +#------------------------------------------------------------------------------- +class SlaveSDOTable(wx.grid.Grid): def __init__(self, parent, data): """ Constructor @param parent: Reference to the parent SDOPanelClass class @param data: SDO data after parsing "SDOParser" method """ - wx.grid.Grid.__init__(self, parent, -1, size=(830,490), + wx.grid.Grid.__init__(self, parent, -1, size=(830,490), style=wx.EXPAND|wx.ALIGN_CENTRE_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL) - + self.Controler = parent.Controler self.parent = parent self.SDOFlag = True @@ -538,55 +538,55 @@ self.SDOs = [] else : self.SDOs = data - + self.CreateGrid(len(self.SDOs), 8) - SDOCellSize = [(0, 65), (1, 65), (2, 50), (3, 55), + SDOCellSize = [(0, 65), (1, 65), (2, 50), (3, 55), (4, 40), (5, 200), (6, 250), (7, 85)] - + for (index, size) in SDOCellSize: self.SetColSize(index, size) - + self.SetRowLabelSize(0) - + SDOTableLabel = [(0, "Index"), (1, "Subindex"), (2, "Access"), (3, "Type"), (4, "Size"), (5, "Category"), (6, "Name"), (7, "Value")] - + for (index, label) in SDOTableLabel: self.SetColLabelValue(index, label) self.SetColLabelAlignment(index, wx.ALIGN_CENTRE) - + attr = wx.grid.GridCellAttr() - # for SDO download + # for SDO download self.Bind(gridlib.EVT_GRID_CELL_LEFT_DCLICK, self.SDOModifyDialog) - - for i in range(7): - self.SetColAttr(i,attr) - + + for i in range(7): + self.SetColAttr(i,attr) + self.SetColLabelAlignment(wx.ALIGN_CENTER, wx.ALIGN_CENTER) - - self.SetTableValue() - + + self.SetTableValue() + def SetTableValue(self): """ Cell is filled by new parsing data """ sdo_list = ['idx', 'subIdx', 'access', 'type', 'size', 'category', 'name', 'value'] for row_idx in range(len(self.SDOs)): - for col_idx in range(len(self.SDOs[row_idx])): + for col_idx in range(len(self.SDOs[row_idx])): self.SetCellValue(row_idx, col_idx, self.SDOs[row_idx][sdo_list[col_idx]]) self.SetReadOnly(row_idx, col_idx, True) if col_idx < 5 : self.SetCellAlignment(row_idx, col_idx, wx.ALIGN_CENTRE, wx.ALIGN_CENTRE) - + def CheckSDODataAccess(self, row): """ CheckSDODataAccess method is checking that access data has "w" Access field consist 6 char, if mean rw rw rw - (preop) (safeop) (op) - Example Access field : rwrwrw, rwrw-- + (preop) (safeop) (op) + Example Access field : rwrwrw, rwrw-- @param row : Selected cell by user @return Write_flag : If data has "w", flag is true """ @@ -595,23 +595,23 @@ if check[1:2] == 'w' : self.Controler.CommonMethod.Check_PREOP = True write_flag = True - if check[3:4] == 'w' : + if check[3:4] == 'w' : self.Controler.CommonMethod.Check_SAFEOP = True write_flag = True if check[5:] =='w' : self.Controler.CommonMethod.Check_OP = True write_flag = True - + return write_flag - + def DecideSDODownload(self, state): """ - compare current state and "access" field, + compare current state and "access" field, result notify SDOModifyDialog method @param state : current slave state @return True or False """ - # Example of 'state' parameter : "0 0:0 PREOP + EL9800 (V4.30) (PIC24, SPI, ET1100)" + # Example of 'state' parameter : "0 0:0 PREOP + EL9800 (V4.30) (PIC24, SPI, ET1100)" state = state[self.Controler.GetSlavePos()].split(" ")[2] if state == "PREOP" and self.Controler.CommonMethod.Check_PREOP : return True @@ -619,9 +619,9 @@ return True elif state == "OP" and self.Controler.CommonMethod.Check_OP : return True - + return False - + def ClearStateFlag(self): """ Initialize StateFlag @@ -630,45 +630,45 @@ self.Controler.CommonMethod.Check_PREOP = False self.Controler.CommonMethod.Check_SAFEOP = False self.Controler.CommonMethod.Check_OP = False - + def SDOModifyDialog (self, event): """ Create dialog for SDO value modify - if user enter data, perform command "ethercat download" + if user enter data, perform command "ethercat download" @param event : gridlib.EVT_GRID_CELL_LEFT_DCLICK object """ self.ClearStateFlag() - - # CheckSDODataAccess is checking that OD(Object Dictionary) has "w" - if event.GetCol() == 7 and self.CheckSDODataAccess(event.GetRow()) : + + # CheckSDODataAccess is checking that OD(Object Dictionary) has "w" + if event.GetCol() == 7 and self.CheckSDODataAccess(event.GetRow()) : dlg = wx.TextEntryDialog (self, "Enter hex or dec value (if enter dec value, it automatically conversed hex value)", "SDOModifyDialog", style = wx.OK | wx.CANCEL) - start_value = self.GetCellValue(event.GetRow(), event.GetCol()) + start_value = self.GetCellValue(event.GetRow(), event.GetCol()) dlg.SetValue(start_value) - + if dlg.ShowModal() == wx.ID_OK: try : int(dlg.GetValue(), 0) # check "Access" field if self.DecideSDODownload(self.Controler.CommonMethod.SlaveState[self.Controler.GetSlavePos()]) : # Request "SDODownload" - self.Controler.CommonMethod.SDODownload(self.SDOs[event.GetRow()]['type'], self.SDOs[event.GetRow()]['idx'], + self.Controler.CommonMethod.SDODownload(self.SDOs[event.GetRow()]['type'], self.SDOs[event.GetRow()]['idx'], self.SDOs[event.GetRow()]['subIdx'], dlg.GetValue()) self.SetCellValue(event.GetRow(), event.GetCol(), hex(int(dlg.GetValue(), 0))) else : - self.Controler.CommonMethod.CreateErrorDialog('You cannot SDO download this state') + self.Controler.CommonMethod.CreateErrorDialog('You cannot SDO download this state') # Error occured process of "int(variable)" # User input is not hex, dec value except ValueError: - self.Controler.CommonMethod.CreateErrorDialog('You can input only hex, dec value') + self.Controler.CommonMethod.CreateErrorDialog('You can input only hex, dec value') #------------------------------------------------------------------------------- # For PDO Monitoring Panel -# PDO Class UI : Panel -> Choicebook (RxPDO, TxPDO) -> +# PDO Class UI : Panel -> Choicebook (RxPDO, TxPDO) -> # Notebook (PDO Index) -> Grid (PDO entry) -#------------------------------------------------------------------------------- +#------------------------------------------------------------------------------- class PDOPanelClass(wx.Panel): def __init__(self, parent, controler): """ @@ -681,12 +681,12 @@ self.PDOMonitoringEditorMainSizer = wx.BoxSizer(wx.VERTICAL) self.PDOMonitoringEditorInnerMainSizer = wx.FlexGridSizer(cols=1, hgap=10, rows=2, vgap=10) - - self.CallPDOChoicebook = PDOChoicebook(self, controler=self.Controler) - self.PDOMonitoringEditorInnerMainSizer.Add(self.CallPDOChoicebook, wx.ALL) - + + self.CallPDOChoicebook = PDOChoicebook(self, controler=self.Controler) + self.PDOMonitoringEditorInnerMainSizer.Add(self.CallPDOChoicebook, wx.ALL) + self.PDOMonitoringEditorMainSizer.Add(self.PDOMonitoringEditorInnerMainSizer) - + self.SetSizer(self.PDOMonitoringEditorMainSizer) def PDOInfoUpdate(self): @@ -701,7 +701,7 @@ #------------------------------------------------------------------------------- # For PDO Choicebook (divide Tx, Rx PDO) -#------------------------------------------------------------------------------- +#------------------------------------------------------------------------------- class PDOChoicebook(wx.Choicebook): def __init__(self, parent, controler): """ @@ -711,15 +711,15 @@ """ wx.Choicebook.__init__(self, parent, id=-1, size=(500, 500), style=wx.CHB_DEFAULT) self.Controler = controler - + RxWin = PDONoteBook(self, controler=self.Controler, name="Rx") TxWin = PDONoteBook(self, controler=self.Controler, name="Tx") self.AddPage(RxWin, "RxPDO") self.AddPage(TxWin, "TxPDO") - + self.Bind(wx.EVT_CHOICEBOOK_PAGE_CHANGED, self.OnPageChanged) self.Bind(wx.EVT_CHOICEBOOK_PAGE_CHANGING, self.OnPageChanging) - + def OnPageChanged(self, event): old = event.GetOldSelection() new = event.GetSelection() @@ -730,12 +730,12 @@ old = event.GetOldSelection() new = event.GetSelection() sel = self.GetSelection() - event.Skip() + event.Skip() #------------------------------------------------------------------------------- # For PDO Notebook (divide PDO index) -#------------------------------------------------------------------------------- +#------------------------------------------------------------------------------- class PDONoteBook(wx.Notebook): def __init__(self, parent, name, controler): """ @@ -746,12 +746,12 @@ """ wx.Notebook.__init__(self, parent, id=-1, size=(640, 400)) self.Controler = controler - + count = 0 page_texts = [] - + self.Controler.CommonMethod.RequestPDOInfo() - + if name == "Tx" : # obtain pdo_info and pdo_entry # pdo_info include (PDO index, name, number of entry) @@ -761,22 +761,22 @@ title = str(hex(tmp['pdo_index'])) page_texts.append(title) # RX PDO case - else : + else : pdo_info = self.Controler.CommonMethod.GetRxPDOCategory() pdo_entry = self.Controler.CommonMethod.GetRxPDOInfo() for tmp in pdo_info : title = str(hex(tmp['pdo_index'])) page_texts.append(title) - + # Add page depending on the number of pdo_info for txt in page_texts: win = PDOEntryTable(self, pdo_info, pdo_entry, count) self.AddPage(win, txt) - count += 1 + count += 1 self.Bind(wx.EVT_CHOICEBOOK_PAGE_CHANGED, self.OnPageChanged) self.Bind(wx.EVT_CHOICEBOOK_PAGE_CHANGING, self.OnPageChanging) - + def OnPageChanged(self, event): old = event.GetOldSelection() new = event.GetSelection() @@ -787,12 +787,12 @@ old = event.GetOldSelection() new = event.GetSelection() sel = self.GetSelection() - event.Skip() + event.Skip() #------------------------------------------------------------------------------- # For PDO Grid (fill entry index, subindex etc...) -#------------------------------------------------------------------------------- +#------------------------------------------------------------------------------- class PDOEntryTable(wx.grid.Grid): def __init__(self, parent, info, entry, count): """ @@ -802,38 +802,38 @@ @param entry : data structure including index, name, entry number @param count : page number """ - wx.grid.Grid.__init__(self, parent, -1, size=(500, 400), pos=wx.Point(0,0), + wx.grid.Grid.__init__(self, parent, -1, size=(500, 400), pos=wx.Point(0,0), style=wx.EXPAND|wx.ALIGN_CENTRE_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL) - + self.Controler = parent.Controler - + self.PDOInfo = info self.PDOEntry = entry self.Count = count - + self.CreateGrid(self.PDOInfo[self.Count]['number_of_entry'], 5) - self.SetColLabelSize(25) + self.SetColLabelSize(25) self.SetRowLabelSize(0) - + PDOTableLabel = [(0, "Index"), (1, "Subindex"), (2, "Length"), (3, "Type"), (4, "Name")] - + for (index, label) in PDOTableLabel: self.SetColLabelValue(index, label) - + PDOCellSize = [(0, 45), (1, 65), (2, 55), (3, 40), (4, 300)] - + for (index, size) in PDOCellSize: self.SetColSize(index, size) self.SetColLabelAlignment(index, wx.ALIGN_LEFT) - + attr = wx.grid.GridCellAttr() - + for i in range(5): self.SetColAttr(i, attr) - + self.SetTableValue() - + def SetTableValue(self): """ Cell is filled by new parsing data in XML @@ -844,7 +844,7 @@ list_index += self.PDOInfo[i]['number_of_entry'] start_value = list_index - self.PDOInfo[self.Count]['number_of_entry'] - + pdo_list = ['entry_index', 'subindex', 'bitlen', 'type', 'name'] for row_idx in range(self.PDOInfo[self.Count]['number_of_entry']): for col_idx in range(len(self.PDOEntry[row_idx])): @@ -863,9 +863,9 @@ #------------------------------------------------------------------------------- -# For EEPROM Access Main Panel +# For EEPROM Access Main Panel # (This class explain EEPROM Access) -#------------------------------------------------------------------------------- +#------------------------------------------------------------------------------- class EEPROMAccessPanel(wx.Panel): def __init__(self, parent, controler): """ @@ -875,19 +875,19 @@ """ wx.Panel.__init__(self, parent, -1) sizer = wx.FlexGridSizer(cols=1, hgap=20,rows=3, vgap=20) - + line = wx.StaticText(self, -1, "\n EEPROM Access is composed to SmartView and HexView. \ \n\n - SmartView shows Config Data, Device Identity, Mailbox settings, etc. \ \n\n - HexView shows EEPROM's contents.") - + sizer.Add(line) - + self.SetSizer(sizer) #------------------------------------------------------------------------------- -# For Smart View Panel -#------------------------------------------------------------------------------- +# For Smart View Panel +#------------------------------------------------------------------------------- class SlaveSiiSmartView(wx.Panel): def __init__(self, parent, controler): """ @@ -898,8 +898,8 @@ wx.Panel.__init__(self, parent, -1) self.parent = parent self.Controler = controler - - self.PDIType = {0 :['none', '00000000'], + + self.PDIType = {0 :['none', '00000000'], 4 :['Digital I/O', '00000100'], 5 :['SPI Slave', '00000101'], 7 :['EtherCAT Bridge (port3)', '00000111'], @@ -914,7 +914,7 @@ 20 :['0 Digtal Input and 32 Digital Output', '00010100'], 128:['On-chip bus', '11111111'] } - + sizer = wx.FlexGridSizer(cols=1, hgap=5, rows=2, vgap=5) button_sizer = wx.FlexGridSizer(cols=2, hgap=5, rows=1, vgap=5) @@ -923,78 +923,78 @@ btn = wx.Button(self, -1, button, size=(150, 40)) button_sizer.Add(btn, border=10, flag=wx.ALL) btn.Bind(wx.EVT_BUTTON, mapping_method) - + self.TreeListCtrl = SmartViewTreeListCtrl(self, self.Controler) - + sizer.Add(button_sizer, border=10, flag=wx.ALL) sizer.Add(self.TreeListCtrl, border=10, flag=wx.ALL) self.SetSizer(sizer) - + self.Create_SmartView() - + def Create_SmartView(self): """ SmartView shows information based on XML as initial value. - """ + """ self.Controler.CommonMethod.SmartViewInfosFromXML = self.Controler.CommonMethod.GetSmartViewInfos() self.SetXMLData() - + def WriteToEEPROM(self, event): """ Open binary file (user select) and write the selected binary data to EEPROM @param event : wx.EVT_BUTTON object - """ + """ # Check whether beremiz connected or not, and whether status is "Started" or not. check_connect_flag = self.Controler.CommonMethod.CheckConnect(False) if check_connect_flag: status, count = self.Controler.GetCTRoot()._connector.GetPLCstatus() if status is not "Started": dialog = wx.FileDialog(self, _("Choose a binary file"), os.getcwd(), "", _("bin files (*.bin)|*.bin"), wx.OPEN) - + if dialog.ShowModal() == wx.ID_OK: filepath = dialog.GetPath() try: binfile = open(filepath,"rb") self.SiiBinary = binfile.read() dialog.Destroy() - + self.Controler.CommonMethod.SiiWrite(self.SiiBinary) # refresh data structure kept by master self.Controler.CommonMethod.Rescan() - # save binary data as inner global data of beremiz + # save binary data as inner global data of beremiz # for fast loading when slave plugin node is reopened. self.Controler.CommonMethod.SiiData = self.SiiBinary self.SetEEPROMData() except Exception: self.Controler.CommonMethod.CreateErrorDialog('The file does not exist!') dialog.Destroy() - + def ReadFromEEPROM(self, event): """ Refresh displayed data based on slave EEPROM and save binary file through dialog @param event : wx.EVT_BUTTON object - """ + """ # Check whether beremiz connected or not. check_connect_flag = self.Controler.CommonMethod.CheckConnect(False) if check_connect_flag: self.SiiBinary = self.Controler.CommonMethod.LoadData() self.SetEEPROMData() - dialog = wx.FileDialog(self, _("Save as..."), os.getcwd(), - "slave0.bin", _("bin files (*.bin)|*.bin|All files|*.*"), + dialog = wx.FileDialog(self, _("Save as..."), os.getcwd(), + "slave0.bin", _("bin files (*.bin)|*.bin|All files|*.*"), wx.SAVE|wx.OVERWRITE_PROMPT) - + if dialog.ShowModal() == wx.ID_OK: filepath = dialog.GetPath() binfile = open(filepath,"wb") binfile.write(self.SiiBinary) binfile.close() - + dialog.Destroy() - + def SetXMLData(self): """ Set data based on XML initially - """ + """ # Config Data: EEPROM Size, PDI Type, Device Emulation # Find PDI Type in pdiType dictionary cnt_pdi_type = self.Controler.CommonMethod.SmartViewInfosFromXML["pdi_type"] @@ -1003,14 +1003,14 @@ cnt_pdi_type = self.PDIType[i][0] break # Set Config Data - for treelist, data in [("EEPROM Size (Bytes)", + for treelist, data in [("EEPROM Size (Bytes)", str(self.Controler.CommonMethod.SmartViewInfosFromXML["eeprom_size"])), - ("PDI Type", + ("PDI Type", cnt_pdi_type), - ("Device Emulation", + ("Device Emulation", self.Controler.CommonMethod.SmartViewInfosFromXML["device_emulation"])]: self.TreeListCtrl.Tree.SetItemText(self.TreeListCtrl.ConfigData[treelist], data, 1) - + # Device Identity: Vendor ID, Product Code, Revision No., Serial No. # Set Device Identity for treelist, data in [("Vendor ID", self.Controler.CommonMethod.SmartViewInfosFromXML["vendor_id"]), @@ -1018,30 +1018,30 @@ ("Revision No.", self.Controler.CommonMethod.SmartViewInfosFromXML["revision_no"]), ("Serial No.", self.Controler.CommonMethod.SmartViewInfosFromXML["serial_no"])]: self.TreeListCtrl.Tree.SetItemText(self.TreeListCtrl.DeviceIdentity[treelist], data, 1) - + # Mailbox: Supported Mailbox, Bootstrap Configuration, Standard Configuration # Set Mailbox for treelist, data in [("Supported Mailbox", self.Controler.CommonMethod.SmartViewInfosFromXML["supported_mailbox"]), ("Bootstrap Configuration", ""), ("Standard Configuration", "")]: - self.TreeListCtrl.Tree.SetItemText(self.TreeListCtrl.Mailbox[treelist], data, 1) + self.TreeListCtrl.Tree.SetItemText(self.TreeListCtrl.Mailbox[treelist], data, 1) # Set Bootstrap Configuration: Receive Offset, Receive Size, Send Offset, Send Size for treelist, data in [("Receive Offset", self.Controler.CommonMethod.SmartViewInfosFromXML["mailbox_bootstrapconf_outstart"]), ("Receive Size", self.Controler.CommonMethod.SmartViewInfosFromXML["mailbox_bootstrapconf_outlength"]), ("Send Offset", self.Controler.CommonMethod.SmartViewInfosFromXML["mailbox_bootstrapconf_instart"]), ("Send Size", self.Controler.CommonMethod.SmartViewInfosFromXML["mailbox_bootstrapconf_inlength"])]: - self.TreeListCtrl.Tree.SetItemText(self.TreeListCtrl.BootstrapConfig[treelist], data, 1) + self.TreeListCtrl.Tree.SetItemText(self.TreeListCtrl.BootstrapConfig[treelist], data, 1) # Set Standard Configuration: Receive Offset, Receive Size, Send Offset, Send Size for treelist, data in [("Receive Offset", self.Controler.CommonMethod.SmartViewInfosFromXML["mailbox_standardconf_outstart"]), ("Receive Size", self.Controler.CommonMethod.SmartViewInfosFromXML["mailbox_standardconf_outlength"]), ("Send Offset", self.Controler.CommonMethod.SmartViewInfosFromXML["mailbox_standardconf_instart"]), ("Send Size", self.Controler.CommonMethod.SmartViewInfosFromXML["mailbox_standardconf_inlength"])]: self.TreeListCtrl.Tree.SetItemText(self.TreeListCtrl.StandardConfig[treelist], data, 1) - + def SetEEPROMData(self): """ Set data based on slave EEPROM. - """ + """ # sii_dict = { Parameter : (WordAddress, WordSize) } sii_dict= { 'PDIControl' : ( '0', 1), 'PDIConfiguration' : ( '1', 1), @@ -1071,7 +1071,7 @@ 'Following Category Word Size' : ('41', 1), 'Category Data' : ('42', 1), } - + # Config Data: EEPROM Size, PDI Type, Device Emulation # EEPROM's data in address '0x003f' is Size of EEPROM in KBit-1 eeprom_size = str((int(self.GetWordAddressData( sii_dict.get('Size'),10 ))+1)/8*1024) @@ -1082,13 +1082,13 @@ cnt_pdi_type = self.PDIType[i][0] break # Get Device Emulation - device_emulation = str(bool(int("{:0>16b}".format(int(self.GetWordAddressData( sii_dict.get('PDIControl'),16 ), 16))[7]))) + device_emulation = str(bool(int("{:0>16b}".format(int(self.GetWordAddressData( sii_dict.get('PDIControl'),16 ), 16))[7]))) # Set Config Data for treelist, data in [("EEPROM Size (Bytes)", eeprom_size), ("PDI Type", cnt_pdi_type), ("Device Emulation", device_emulation)]: self.TreeListCtrl.Tree.SetItemText(self.TreeListCtrl.ConfigData[treelist], data, 1) - + # Device Identity: Vendor ID, Product Code, Revision No., Serial No. # Set Device Identity for treelist, data in [("Vendor ID", self.GetWordAddressData( sii_dict.get('VendorID'),16 )), @@ -1096,10 +1096,10 @@ ("Revision No.", self.GetWordAddressData( sii_dict.get('RevisionNumber'),16 )), ("Serial No.", self.GetWordAddressData( sii_dict.get('SerialNumber'),16 ))]: self.TreeListCtrl.Tree.SetItemText(self.TreeListCtrl.DeviceIdentity[treelist], data, 1) - + # Mailbox # EEORPOM's word address '1c' indicates supported mailbox protocol. - # each value of mailbox protocol : + # each value of mailbox protocol : # VoE(0x0020), SoE(0x0010), FoE(0x0008), CoE(0x0004), EoE(0x0002), AoE(0x0001) supported_mailbox = "" mailbox_protocol=["VoE, ", "SoE, ", "FoE, ", "CoE, ", "EoE, ", "AoE, "] @@ -1112,20 +1112,20 @@ for treelist, data in [("Supported Mailbox", supported_mailbox), ("Bootstrap Configuration", ""), ("Standard Configuration", "")]: - self.TreeListCtrl.Tree.SetItemText(self.TreeListCtrl.Mailbox[treelist], data, 1) + self.TreeListCtrl.Tree.SetItemText(self.TreeListCtrl.Mailbox[treelist], data, 1) # Set Bootstrap Configuration: Receive Offset, Receive Size, Send Offset, Send Size for treelist, data in [("Receive Offset", self.GetWordAddressData( sii_dict.get('BootstrapReceiveMailboxOffset'),10 )), ("Receive Size", self.GetWordAddressData( sii_dict.get('BootstrapReceiveMailboxSize'),10 )), ("Send Offset", self.GetWordAddressData( sii_dict.get('BootstrapSendMailboxOffset'),10 )), ("Send Size", self.GetWordAddressData( sii_dict.get('BootstrapSendMailboxSize'),10 ))]: - self.TreeListCtrl.Tree.SetItemText(self.TreeListCtrl.BootstrapConfig[treelist], data, 1) + self.TreeListCtrl.Tree.SetItemText(self.TreeListCtrl.BootstrapConfig[treelist], data, 1) # Set Standard Configuration: Receive Offset, Receive Size, Send Offset, Send Size for treelist, data in [("Receive Offset", self.GetWordAddressData( sii_dict.get('StandardReceiveMailboxOffset'),10 )), ("Receive Size", self.GetWordAddressData( sii_dict.get('StandardReceiveMailboxSize'),10 )), ("Send Offset", self.GetWordAddressData( sii_dict.get('StandardSendMailboxOffset'),10 )), ("Send Size", self.GetWordAddressData( sii_dict.get('StandardSendMailboxSize'),10 ))]: - self.TreeListCtrl.Tree.SetItemText(self.TreeListCtrl.StandardConfig[treelist], data, 1) - + self.TreeListCtrl.Tree.SetItemText(self.TreeListCtrl.StandardConfig[treelist], data, 1) + def MakeStaticBoxSizer(self, boxlabel): """ Make StaticBoxSizer @@ -1136,14 +1136,14 @@ sizer = wx.StaticBoxSizer(box, wx.VERTICAL) return sizer - + def GetWordAddressData(self, dict_tuple, format): """ This method converts word address data from EEPROM binary. @param dict_tuple : element of 'sii_dict' dictionary in SetEEPROMData() @param format : format of data. It can be 16(hex), 10(decimal) and 2(binary). @return formatted value - """ + """ offset = int(str(dict_tuple[0]), 16) * 2 length = int(str(dict_tuple[1]), 16) * 2 list = [] @@ -1151,21 +1151,21 @@ for index in range(length): hexdata = hex(ord(self.SiiBinary[offset + index]))[2:] list.append(hexdata.zfill(2)) - + list.reverse() data = list[0:length] if format == 16: - return '0x' + ''.join(data) + return '0x' + ''.join(data) elif format == 10: return str(int(str(''.join(data)), 16)) - elif format == 2: - ''.join(data) + elif format == 2: + ''.join(data) #------------------------------------------------------------------------------- # For Smart View TreeListCtrl -#------------------------------------------------------------------------------- +#------------------------------------------------------------------------------- class SmartViewTreeListCtrl(wx.Panel): def __init__(self, parent, Controler): """ @@ -1175,26 +1175,26 @@ """ wx.Panel.__init__(self, parent, -1, size=(350, 500)) - - self.Tree = wx.gizmos.TreeListCtrl(self, -1, size=(350, 500), + + self.Tree = wx.gizmos.TreeListCtrl(self, -1, size=(350, 500), style=wx.TR_DEFAULT_STYLE |wx.TR_FULL_ROW_HIGHLIGHT |wx.TR_HIDE_ROOT |wx.TR_COLUMN_LINES |wx.TR_ROW_LINES) - + self.Tree.AddColumn("Description", width=200) self.Tree.AddColumn("Value", width=140) self.Tree.SetMainColumn(0) - + self.Root = self.Tree.AddRoot("") - + # Add item # Level 1 nodes self.Level1Nodes = {} for lv1 in ["Config Data", "Device Identity", "Mailbox"]: self.Level1Nodes[lv1] = self.Tree.AppendItem(self.Root, lv1) - + # Level 2 nodes # Config Data self.ConfigData = {} @@ -1208,7 +1208,7 @@ self.Mailbox = {} for lv2 in ["Supported Mailbox", "Bootstrap Configuration", "Standard Configuration"]: self.Mailbox[lv2] = self.Tree.AppendItem(self.Level1Nodes["Mailbox"], lv2) - + # Level 3 nodes # Children of Bootstrap Configuration self.BootstrapConfig = {} @@ -1218,13 +1218,13 @@ self.StandardConfig = {} for lv3 in ["Receive Offset", "Receive Size", "Send Offset", "Send Size"]: self.StandardConfig[lv3] = self.Tree.AppendItem(self.Mailbox["Standard Configuration"], lv3) - + # Expand Tree - for tree in [self.Root, - self.Level1Nodes["Config Data"], - self.Level1Nodes["Device Identity"], + for tree in [self.Root, + self.Level1Nodes["Config Data"], + self.Level1Nodes["Device Identity"], self.Level1Nodes["Mailbox"], - self.Mailbox["Bootstrap Configuration"], + self.Mailbox["Bootstrap Configuration"], self.Mailbox["Standard Configuration"]]: self.Tree.Expand(tree) @@ -1232,7 +1232,7 @@ #------------------------------------------------------------------------------- # For Hex View Panel # shows EEPROM binary as hex data and characters. -#------------------------------------------------------------------------------- +#------------------------------------------------------------------------------- class HexView(wx.Panel): def __init__(self, parent, controler): """ @@ -1243,10 +1243,10 @@ wx.Panel.__init__(self, parent, -1) self.parent = parent self.Controler = controler - + self.HexRow = 8 self.HexCol = 17 - + self.HexViewSizer = {"view" : wx.FlexGridSizer(cols=1, hgap=10, rows=2, vgap=10), "siiButton" : wx.BoxSizer()} self.HexViewButton = {} @@ -1256,16 +1256,16 @@ ("Write to File", self.OnButtonWriteToBinFile), ("Read from File", self.OnButtonReadFromBinFile), ("XML to EEPROM Image", self.OnButtonXmlToEEPROMImg)]: - self.HexViewButton[key] = wx.Button(self, -1, key) + self.HexViewButton[key] = wx.Button(self, -1, key) self.HexViewButton[key].Bind(wx.EVT_BUTTON, evt_handler) self.HexViewSizer["siiButton"].Add(self.HexViewButton[key]) self.SiiBinary = self.Controler.CommonMethod.XmlToEeprom() self.HexCode, self.HexRow, self.HexCol = self.Controler.CommonMethod.HexRead(self.SiiBinary) self.SiiGrid = SiiGridTable(self, self.Controler, self.HexRow, self.HexCol) - self.HexViewSizer["view"].AddMany([self.HexViewSizer["siiButton"], self.SiiGrid]) + self.HexViewSizer["view"].AddMany([self.HexViewSizer["siiButton"], self.SiiGrid]) self.SiiGrid.CreateGrid(self.HexRow, self.HexCol) - self.SetSizer(self.HexViewSizer["view"]) + self.SetSizer(self.HexViewSizer["view"]) self.HexViewSizer["view"].FitInside(self.parent.parent) self.parent.parent.FitInside() self.SiiGrid.SetValue(self.HexCode) @@ -1275,7 +1275,7 @@ """ Destroy existing grid and recreate @param row, col : Hex View grid size - """ + """ self.HexViewSizer["view"].Detach(self.SiiGrid) self.SiiGrid.Destroy() self.SiiGrid = SiiGridTable(self, self.Controler, row, col) @@ -1290,7 +1290,7 @@ Load EEPROM data from slave and refresh Hex View grid Binded to 'Sii Upload' button. @param event : wx.EVT_BUTTON object - """ + """ # Check whether beremiz connected or not. check_connect_flag = self.Controler.CommonMethod.CheckConnect(False) if check_connect_flag: @@ -1300,29 +1300,29 @@ self.UpdateSiiGridTable(self.HexRow, self.HexCol) self.SiiGrid.SetValue(self.HexCode) self.SiiGrid.Update() - + def OnButtonSiiDownload(self, event): """ - Write current EEPROM data to slave and refresh data structure kept by master + Write current EEPROM data to slave and refresh data structure kept by master Binded to 'Sii Download' button. @param event : wx.EVT_BUTTON object - """ - # Check whether beremiz connected or not, - # and whether status is "Started" or not. + """ + # Check whether beremiz connected or not, + # and whether status is "Started" or not. check_connect_flag = self.Controler.CommonMethod.CheckConnect(False) if check_connect_flag: status, count = self.Controler.GetCTRoot()._connector.GetPLCstatus() if status is not "Started": self.Controler.CommonMethod.SiiWrite(self.SiiBinary) self.Controler.CommonMethod.Rescan() - + def OnButtonWriteToBinFile(self, event): - """ + """ Save current EEPROM data to binary file through FileDialog Binded to 'Write to File' button. @param event : wx.EVT_BUTTON object - """ - dialog = wx.FileDialog(self, _("Save as..."), os.getcwd(), "slave0.bin", + """ + dialog = wx.FileDialog(self, _("Save as..."), os.getcwd(), "slave0.bin", _("bin files (*.bin)|*.bin|All files|*.*"), wx.SAVE|wx.OVERWRITE_PROMPT) if dialog.ShowModal() == wx.ID_OK: @@ -1330,33 +1330,33 @@ binfile = open(filepath,"wb") binfile.write(self.SiiBinary) binfile.close() - - dialog.Destroy() - + + dialog.Destroy() + def OnButtonReadFromBinFile(self, event): """ Load binary file through FileDialog Binded to 'Read from File' button. @param event : wx.EVT_BUTTON object """ - dialog = wx.FileDialog(self, _("Choose a binary file"), os.getcwd(), "", + dialog = wx.FileDialog(self, _("Choose a binary file"), os.getcwd(), "", _("bin files (*.bin)|*.bin"), wx.OPEN) - + if dialog.ShowModal() == wx.ID_OK: filepath = dialog.GetPath() - + try: binfile = open(filepath, "rb") self.SiiBinary = binfile.read() self.HexCode, self.HexRow, self.HexCol = self.Controler.CommonMethod.HexRead(self.SiiBinary) - self.UpdateSiiGridTable(self.HexRow, self.HexCol) + self.UpdateSiiGridTable(self.HexRow, self.HexCol) self.SiiGrid.SetValue(self.HexCode) self.SiiGrid.Update() except Exception: self.Controler.CommonMethod.CreateErrorDialog('The file does not exist!') - + dialog.Destroy() - + def OnButtonXmlToEEPROMImg(self, event): """ Create EEPROM data based XML data that current imported @@ -1372,8 +1372,8 @@ #------------------------------------------------------------------------------- # For Hex View grid (fill hex data) -#------------------------------------------------------------------------------- -class SiiGridTable(wx.grid.Grid): +#------------------------------------------------------------------------------- +class SiiGridTable(wx.grid.Grid): def __init__(self, parent, controler, row, col): """ Constructor @@ -1384,10 +1384,10 @@ self.parent = parent self.Controler = controler self.Row = row - self.Col = col - - wx.grid.Grid.__init__(self, parent, -1, size=(830,450), - style=wx.ALIGN_CENTRE_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL) + self.Col = col + + wx.grid.Grid.__init__(self, parent, -1, size=(830,450), + style=wx.ALIGN_CENTRE_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL) def SetValue(self, value): """ @@ -1403,28 +1403,28 @@ else: self.SetColLabelValue(col, '%s'%col) self.SetColSize(col, (self.GetSize().x-120)/20) - + # set data into table row = col = 0 - for row_idx in value: + for row_idx in value: col = 0 self.SetRowLabelValue(row, "0x"+"{:0>4x}".format(row*(self.Col-1))) for hex in row_idx: self.SetCellValue(row, col, hex) - - if col == 16: + + if col == 16: self.SetCellAlignment(row, col, wx.ALIGN_LEFT, wx.ALIGN_CENTER) else: self.SetCellAlignment(row, col, wx.ALIGN_CENTRE, wx.ALIGN_CENTER) - + self.SetReadOnly(row, col, True) col = col + 1 row = row + 1 - + #------------------------------------------------------------------------------- # For Register Access Panel -#------------------------------------------------------------------------------- +#------------------------------------------------------------------------------- class RegisterAccessPanel(wx.Panel): def __init__(self, parent, controler): """ @@ -1435,31 +1435,31 @@ self.parent = parent self.Controler = controler self.__init_data() - + wx.Panel.__init__(self, parent, -1) - + sizer = wx.FlexGridSizer(cols=1, hgap=20, rows=2, vgap=5) button_sizer = wx.FlexGridSizer(cols=2, hgap=10, rows=1, vgap=10) - + self.ReloadButton = wx.Button(self, -1, "Reload") - self.CompactViewCheckbox = wx.CheckBox(self, -1, "Compact View") + self.CompactViewCheckbox = wx.CheckBox(self, -1, "Compact View") self.RegisterNotebook = RegisterNotebook(self, self.Controler) - + button_sizer.AddMany([self.ReloadButton, self.CompactViewCheckbox]) sizer.AddMany([button_sizer, self.RegisterNotebook]) self.SetSizer(sizer) - + self.ReloadButton.Bind(wx.EVT_BUTTON, self.OnReloadButton) self.CompactViewCheckbox.Bind(wx.EVT_CHECKBOX, self.ToggleCompactViewCheckbox) - + for index in range(4): self.RegisterNotebook.RegPage[index].MainTable.CreateGrid(self.MainRow[index], self.MainCol) self.RegisterNotebook.RegPage[index].MainTable.SetValue(self, 0, index*512, (index+1)*512) - + # data default setting - if self.Controler.CommonMethod.RegData == "": - self.CompactViewCheckbox.Disable() - for index in range(4): + if self.Controler.CommonMethod.RegData == "": + self.CompactViewCheckbox.Disable() + for index in range(4): self.RegisterNotebook.RegPage[index].MainTable.SetValue(self, 0, index*512, (index+1)*512) else: # If data was saved, self.BasicSetData() @@ -1473,22 +1473,22 @@ """ # flag for compact view self.CompactFlag = False - + # main grid의 rows and cols self.MainRow = [512, 512, 512, 512] self.MainCol = 4 - + # main grids' data range self.PageRange = [] for index in range(4): self.PageRange.append([512*index, 512*(index+1)]) - + # Previous value of register data for register description configuration self.PreRegSpec = {"ESCType": "", "FMMUNumber": "", "SMNumber": "", "PDIType": ""} - + def LoadData(self): """ Get data from the register. @@ -1499,26 +1499,26 @@ #return value : 0x11 for index in range(4): self.Controler.CommonMethod.RegData = self.Controler.CommonMethod.RegData + " " + self.Controler.CommonMethod.RegRead("0x"+"{:0>4x}".format(index*1024), "0x0400") - - # store previous value + + # store previous value # (ESC type, port number of FMMU, port number of SM, and PDI type)) for reg_spec in ["ESCType","FMMUNumber","SMNumber", "PDIType"]: self.PreRegSpec[reg_spec] = self.Controler.CommonMethod.CrtRegSpec[reg_spec] - - # update registers' description + + # update registers' description # (ESC type, port number of FMMU, port number of SM, and PDI type) for reg_spec, address in [("ESCType", "0x0000"), ("FMMUNumber", "0x0004"), ("SMNumber", "0x0005"), ("PDIType", "0x0140")]: self.Controler.CommonMethod.CrtRegSpec[reg_spec] = self.Controler.CommonMethod.RegRead(address, "0x0001") - + # Enable compactView checkbox self.CompactViewCheckbox.Enable() - + def BasicSetData(self): """ - Get and save the description of registers. + Get and save the description of registers. It's done by parsing register_information.xml. """ # parse the above register's value @@ -1528,11 +1528,11 @@ # If the value is 0x12, the result is 18 (It's converted to decimal value) self.FMMUNumber = int(self.Controler.CommonMethod.CrtRegSpec["FMMUNumber"], 16) self.SMNumber = int(self.Controler.CommonMethod.CrtRegSpec["SMNumber"], 16) - + # initialize description dictionary of register main table and register sub table. self.RegisterDescriptionDict = {} self.RegisterSubGridDict = {} - + # ./EthercatMaster/register_information.xml contains register description. if wx.Platform == '__WXMSW__': reg_info_file = open("../../EthercatMaster/register_information.xml", 'r') @@ -1540,7 +1540,7 @@ reg_info_file = open("./EthercatMaster/register_information.xml", 'r') reg_info_tree = minidom.parse(reg_info_file) reg_info_file.close() - + # parse register description for register_info in reg_info_tree.childNodes: for register in register_info.childNodes: @@ -1550,7 +1550,7 @@ ("pdi", "type", self.PDIType), ("fmmu", "number", self.FMMUNumber), ("sm", "number", self.SMNumber)]: - if property in register.attributes.keys(): + if property in register.attributes.keys(): if type == "type": if register.attributes[property].value == value: self.GetRegisterInfo(reg_info_tree, register) @@ -1562,7 +1562,7 @@ else: self.GetRegisterInfo(reg_info_tree, register) break - + def GetRegisterInfo(self, reg_info_tree, register): """ Save the register's description into the dictionary. @@ -1573,7 +1573,7 @@ # temporary variables for register main table idescription dictionary reg_index = "" reg_main_description = "" - + for data in register.childNodes: if data.nodeType == reg_info_tree.ELEMENT_NODE and data.nodeName == "Index": for index in data.childNodes: @@ -1581,15 +1581,15 @@ if data.nodeType == reg_info_tree.ELEMENT_NODE and data.nodeName == "Description": for description in data.childNodes: reg_main_description = description.nodeValue - - # Add description for register main table + + # Add description for register main table if reg_index is not "" and reg_main_description is not "": self.RegisterDescriptionDict[reg_index] = reg_main_description - + if data.nodeType == reg_info_tree.ELEMENT_NODE and data.nodeName == "Details": # declare register sub table description dictionary about this index self.RegisterSubGridDict[reg_index] = [] - + for detail in data.childNodes: if detail.nodeType == reg_info_tree.ELEMENT_NODE and detail.nodeName == "Detail": # If it depends on the property(ESC type, PDI type, FMMU number, SM number) @@ -1597,7 +1597,7 @@ ("pdi", "type", self.PDIType), ("fmmu", "number", self.FMMUNumber), ("sm", "number", self.SMNumber)]: - if property in detail.attributes.keys(): + if property in detail.attributes.keys(): if type == "type": if detail.attributes[property].value == value: self.GetRegisterDetailInfo(reg_info_tree, reg_index, detail) @@ -1609,7 +1609,7 @@ else: self.GetRegisterDetailInfo(reg_info_tree, reg_index, detail) break - + def GetRegisterDetailInfo(self, reg_info_tree, reg_index, detail): """ Get the resgister's detailed description(for sub table) from the reg_info_tree. @@ -1617,30 +1617,30 @@ @param reg_index: index of the register @param detail: description of the register """ - # temporary variables for register sub table description dictionary - # - It is initialized in every sub description + # temporary variables for register sub table description dictionary + # - It is initialized in every sub description reg_bit_range = "" reg_sub_description = "" reg_enum_dictionary = {} - + for detail_data in detail.childNodes: - if detail_data.nodeType == reg_info_tree.ELEMENT_NODE and detail_data.nodeName == "Range": + if detail_data.nodeType == reg_info_tree.ELEMENT_NODE and detail_data.nodeName == "Range": for range in detail_data.childNodes: reg_bit_range = range.nodeValue if detail_data.nodeType == reg_info_tree.ELEMENT_NODE and detail_data.nodeName == "Description": for description in detail_data.childNodes: reg_sub_description = description.nodeValue - + if detail_data.nodeType == reg_info_tree.ELEMENT_NODE and detail_data.nodeName == "Enum": for enum in detail_data.childNodes: if enum.nodeType == reg_info_tree.ELEMENT_NODE and enum.nodeName == "item": - - # temporary variables for a description of each value - # For example, if the bit is 1, it is 'enabled'('On', 'True', etc.), - # otherwise 'disabled'('Off', 'False', etc.). + + # temporary variables for a description of each value + # For example, if the bit is 1, it is 'enabled'('On', 'True', etc.), + # otherwise 'disabled'('Off', 'False', etc.). reg_sub_value = "" reg_sub_value_description = "" - + for item in enum.childNodes: if item.nodeType == reg_info_tree.ELEMENT_NODE and item.nodeName == "value": for value in item.childNodes: @@ -1648,16 +1648,16 @@ if item.nodeType == reg_info_tree.ELEMENT_NODE and item.nodeName == "Description": for description in item.childNodes: reg_sub_value_description = description.nodeValue - + # Add a description of each value to register enum dictionary if reg_sub_value is not "" and reg_sub_value_description is not "": reg_enum_dictionary[reg_sub_value] = reg_sub_value_description - + # add a description to register sub table description dictionary if reg_bit_range is not "" and reg_sub_description is not "": - self.RegisterSubGridDict[reg_index].append([reg_bit_range, + self.RegisterSubGridDict[reg_index].append([reg_bit_range, reg_sub_description, reg_enum_dictionary]) - + def ParseData(self): """ Transform the data into dec, hex, string, and description @@ -1665,30 +1665,30 @@ row_data = [] self.RegMonitorData = [] reg_word = "" - + reg_data = self.Controler.CommonMethod.RegData.split() - + # loop for register(0x0000:0x0fff) for address in range(0x1000): - # arrange 2 Bytes of register data + # arrange 2 Bytes of register data reg_word = reg_data[address].split('x')[1] + reg_word if (address%2) == 1: # append address hex_address = "{:0>4x}".format(address-1) row_data.append(hex_address) - + # append description if self.RegisterDescriptionDict.has_key(hex_address): row_data.append(self.RegisterDescriptionDict[hex_address]) else: row_data.append("") - + # append Decimal value row_data.append(str(int(reg_word, 16))) - + # append Hex value row_data.append('0x'+reg_word) - + # append ASCII value char_data = "" for iter in range(2): @@ -1697,11 +1697,11 @@ else: char_data = char_data + "." row_data.append(char_data) - + self.RegMonitorData.append(row_data) reg_word = "" # initialize regWord row_data = [] - + def OnReloadButton(self, event): """ Handle the click event of the 'Reload' button. @@ -1717,10 +1717,10 @@ # set data into UI if self.CompactFlag: self.ToggleCompactViewCheckbox(True) - else : + else : for index in range(4): - self.RegisterNotebook.RegPage[index].UpdateMainTable(self.MainRow[index], self.MainCol, - self.PageRange[index][0], self.PageRange[index][1], + self.RegisterNotebook.RegPage[index].UpdateMainTable(self.MainRow[index], self.MainCol, + self.PageRange[index][0], self.PageRange[index][1], self.RegMonitorData) def ToggleCompactViewCheckbox(self, event): @@ -1730,12 +1730,12 @@ If not, show all the registers. @param event: wx.EVT_CHECKBOX object """ - + # If "Compact View" Checkbox is True ## 'event' is argument of this method or event of checkbox. if event==True or event.GetEventObject().GetValue(): self.CompactFlag = True - + reg_compact_data = [] page_row = [0, 0, 0, 0] for index in range(4): @@ -1758,34 +1758,34 @@ self.PageRange[index][1] = page_row[index] for iter in range(index): self.PageRange[index][0] += page_row[iter] - self.PageRange[index][1] += page_row[iter] - + self.PageRange[index][1] += page_row[iter] + # Update table for index in range(4): - self.RegisterNotebook.RegPage[index].UpdateMainTable(self.MainRow[index], self.MainCol, - self.PageRange[index][0], self.PageRange[index][1], + self.RegisterNotebook.RegPage[index].UpdateMainTable(self.MainRow[index], self.MainCol, + self.PageRange[index][0], self.PageRange[index][1], reg_compact_data) - - # Compact View Checkbox is False + + # Compact View Checkbox is False else: self.CompactFlag = False # Setting original rows, cols and range self.MainRow = [512, 512, 512, 512] self.PageRange = [] - + for index in range(4): self.PageRange.append([512*index, 512*(index+1)]) - - # Update table + + # Update table for index in range(4): - self.RegisterNotebook.RegPage[index].UpdateMainTable(self.MainRow[index], self.MainCol, - self.PageRange[index][0], self.PageRange[index][1], + self.RegisterNotebook.RegPage[index].UpdateMainTable(self.MainRow[index], self.MainCol, + self.PageRange[index][0], self.PageRange[index][1], self.RegMonitorData) - + #------------------------------------------------------------------------------- # For Register Access Notebook (divide index range) -#------------------------------------------------------------------------------- +#------------------------------------------------------------------------------- class RegisterNotebook(wx.Notebook): def __init__(self, parent, controler): """ @@ -1794,21 +1794,21 @@ @param controler: _EthercatSlaveCTN class in EthercatSlave.py """ wx.Notebook.__init__(self, parent, id = -1) - + self.parent = parent self.Controler = controler - + # Initialize pages self.RegPage = [] for iter in range(4): self.RegPage.append(None) - + for index in range(4): - self.RegPage[index] = RegisterNotebookPanel(self, self.Controler, + self.RegPage[index] = RegisterNotebookPanel(self, self.Controler, parent.MainRow[index], parent.MainCol) - self.AddPage(self.RegPage[index], + self.AddPage(self.RegPage[index], "0x"+"{:0>4x}".format(index*1024)+" - 0x"+"{:0>4x}".format((index+1)*1024-1)) - + self.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGED, self.OnPageChanged) self.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGING, self.OnPageChanging) @@ -1826,9 +1826,9 @@ #------------------------------------------------------------------------------- -# For Register Access Notebook Panel +# For Register Access Notebook Panel # (Main UI : including main, sub table) -#------------------------------------------------------------------------------- +#------------------------------------------------------------------------------- class RegisterNotebookPanel(wx.Panel): def __init__(self, parent, controler, row, col): """ @@ -1838,26 +1838,26 @@ @param row, col: size of the table """ wx.Panel.__init__(self, parent, -1) - + self.parent = parent self.Controler = controler self.Row = row self.Col = col sub_row = 0 sub_col = 4 - + self.Sizer = wx.FlexGridSizer(cols=1, hgap=10, rows=2, vgap=30) - + self.MainTable = RegisterMainTable(self, self.Row, self.Col, self.Controler) self.SubTable = RegisterSubTable(self, sub_row, sub_col) - + self.SubTable.CreateGrid(sub_row, sub_col) self.SubTable.SetValue(self, []) - + self.Sizer.AddMany([self.MainTable, self.SubTable]) - + self.SetSizer(self.Sizer) - + def UpdateMainTable(self, row, col, low_index, high_index, data): """ Updates main table. @@ -1892,13 +1892,13 @@ self.SubTable.CreateGrid(row, col) self.SubTable.SetValue(self, data) self.SubTable.Update() - + #------------------------------------------------------------------------------- # For Register Access Notebook Panel (Main Table) -#------------------------------------------------------------------------------- +#------------------------------------------------------------------------------- class RegisterMainTable(wx.grid.Grid): - def __init__(self, parent, row, col, controler): + def __init__(self, parent, row, col, controler): """ Constructor @param parent: RegisterNotebook object @@ -1911,16 +1911,16 @@ self.Col = col self.Controler = controler self.RegisterAccessPanel = self.parent.parent.parent - - wx.grid.Grid.__init__(self, parent, -1, size=(820,300), - style=wx.EXPAND|wx.ALIGN_CENTRE_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL) - + + wx.grid.Grid.__init__(self, parent, -1, size=(820,300), + style=wx.EXPAND|wx.ALIGN_CENTRE_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL) + for evt, mapping_method in [(gridlib.EVT_GRID_CELL_LEFT_CLICK, self.OnSelectCell), (gridlib.EVT_GRID_CELL_LEFT_CLICK, self.OnSelectCell), (gridlib.EVT_GRID_CELL_LEFT_DCLICK, self.OnRegModifyDialog)]: self.Bind(evt, mapping_method) - - def SetValue(self, parent, reg_monitor_data, low_index, high_index): + + def SetValue(self, parent, reg_monitor_data, low_index, high_index): """ Set the RegMonitorData into the main table. @param parent: RegisterNotebook object @@ -1929,21 +1929,21 @@ @param high_index: the highest index of the page """ self.RegMonitorData = reg_monitor_data - + # set label name and size - register_maintable_label = [(0, "Description"), (1, "Dec"), + register_maintable_label = [(0, "Description"), (1, "Dec"), (2, "Hex"), (3, "Char")] - + for (index, label) in register_maintable_label: self.SetColLabelValue(index, label) - + self.SetColSize(0, 200) - + # if reg_monitor_data is 0, it is initialization of register access. if reg_monitor_data == 0: return 0 - - # set data into UI + + # set data into UI row = col = 0 for row_index in reg_monitor_data[low_index:high_index]: col = 0 @@ -1954,8 +1954,8 @@ self.SetReadOnly(row, col, True) col = col + 1 row = row + 1 - - def OnSelectCell(self, event): + + def OnSelectCell(self, event): """ Handles the event of the cell of the main table. @param event: gridlib object (left click) @@ -1964,17 +1964,17 @@ if self.RegMonitorData == 0: event.Skip() return 0 - + sub_row = 0 sub_col = 4 - + address = self.GetRowLabelValue(event.GetRow()) - + reg_sub_grid_data = [] - + BIT_RANGE, NAME, DESCRIPTIONS = range(3) - - # Check if this register's detail description is exist or not, + + # Check if this register's detail description is exist or not, # and create data structure for the detail description table ; sub grid if address in self.RegisterAccessPanel.RegisterSubGridDict: for element in self.RegisterAccessPanel.RegisterSubGridDict[address]: @@ -1991,11 +1991,11 @@ row_data.append('') reg_sub_grid_data.append(row_data) sub_row = sub_row + 1 - + self.parent.UpdateSubTable(sub_row, sub_col, reg_sub_grid_data) # event.Skip() updates UI of selecting cell event.Skip() - + def OnRegModifyDialog(self, event): """ Handle the event of the cell of the main table. @@ -2004,16 +2004,16 @@ """ # user can enter a value in case that user double-clicked 'Dec' or 'Hex' value. if event.GetCol() == 1 or event.GetCol() == 2: - dlg = wx.TextEntryDialog(self, "Enter hex(0xnnnn) or dec(n) value", + dlg = wx.TextEntryDialog(self, "Enter hex(0xnnnn) or dec(n) value", "Register Modify Dialog", style = wx.OK|wx.CANCEL) - + # Setting value in initial dialog value start_value = self.GetCellValue(event.GetRow(), event.GetCol()) dlg.SetValue(start_value) - + if dlg.ShowModal() == wx.ID_OK: try: - # It int(input) success, this input is dev or hex value. + # It int(input) success, this input is dev or hex value. # Otherwise, it's error, so it goes except. int(dlg.GetValue(), 0) @@ -2023,7 +2023,7 @@ if len(return_val)==0: # set dec - self.SetCellValue(event.GetRow(), 1, str(int(dlg.GetValue(), 0))) + self.SetCellValue(event.GetRow(), 1, str(int(dlg.GetValue(), 0))) # set hex hex_data = '0x'+"{:0>4x}".format(int(dlg.GetValue(), 0)) self.SetCellValue(event.GetRow(), 2, hex_data) @@ -2035,19 +2035,19 @@ char_data = char_data + chr(int(hex_data[(iter+1)*2:(iter+2)*2], 16)) else: char_data = char_data + "." - - self.SetCellValue(event.GetRow(), 3, char_data) - + + self.SetCellValue(event.GetRow(), 3, char_data) + else: self.Controler.CommonMethod.CreateErrorDialog('You can\'t modify it. This register is read-only or it\'s not connected.') - + except ValueError: self.Controler.CommonMethod.CreateErrorDialog('You entered wrong value. You can enter dec or hex value only.') - - + + #------------------------------------------------------------------------------- # For Register Access Notebook Panel (Sub Table) -#------------------------------------------------------------------------------- +#------------------------------------------------------------------------------- class RegisterSubTable(wx.grid.Grid): def __init__(self, parent, row, col): """ @@ -2060,8 +2060,8 @@ self.Row = row self.Col = col - wx.grid.Grid.__init__(self, parent, -1, size=(820,150), - style=wx.EXPAND|wx.ALIGN_CENTRE_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL) + wx.grid.Grid.__init__(self, parent, -1, size=(820,150), + style=wx.EXPAND|wx.ALIGN_CENTRE_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL) def SetValue(self, parent, data): """ @@ -2070,30 +2070,30 @@ @param data: data """ # lset label name and size - Register_SubTable_Label = [(0, "Bits"), (1, "Name"), + Register_SubTable_Label = [(0, "Bits"), (1, "Name"), (2, "Value"), (3, "Enum")] - + for (index, label) in Register_SubTable_Label: self.SetColLabelValue(index, label) - + self.SetColSize(1, 200) self.SetColSize(3, 200) - + # set data into table row = col = 0 - for rowData in data: - col = 0 + for rowData in data: + col = 0 for element in rowData: self.SetCellValue(row, col, element) self.SetCellAlignment(row, col, wx.ALIGN_CENTRE, wx.ALIGN_CENTER) self.SetReadOnly(row, col, True) col = col + 1 row = row + 1 - + #------------------------------------------------------------------------------- # For Master State Panel -#------------------------------------------------------------------------------- +#------------------------------------------------------------------------------- class MasterStatePanelClass(wx.Panel): def __init__(self, parent, controler): """ @@ -2101,14 +2101,14 @@ @param parent: wx.ScrollWindow object @Param controler: _EthercatSlaveCTN class in EthercatSlave.py """ - wx.Panel.__init__(self, parent, -1, (0, 0), + wx.Panel.__init__(self, parent, -1, (0, 0), size=wx.DefaultSize, style = wx.SUNKEN_BORDER) self.Controler = controler self.parent = parent self.StaticBox = {} self.StaticText = {} self.TextCtrl = {} - + # ----------------------- Main Sizer and Update Button -------------------------------------------- self.MasterStateSizer = {"main" : wx.BoxSizer(wx.VERTICAL)} for key, attr in [ @@ -2123,15 +2123,15 @@ self.UpdateButton = wx.Button(self, label=_('Update')) self.UpdateButton.Bind(wx.EVT_BUTTON, self.OnButtonClick) - - for key, label in [ + + for key, label in [ ('masterState', 'EtherCAT Master State'), ('deviceInfo', 'Ethernet Network Card Information'), ('frameInfo', 'Network Frame Information')]: self.StaticBox[key] = wx.StaticBox(self, label=_(label)) self.MasterStateSizer[key] = wx.StaticBoxSizer(self.StaticBox[key]) - - + + # ----------------------- Master State ----------------------------------------------------------- for key, label in [ ('Phase', 'Phase:'), @@ -2139,11 +2139,11 @@ ('Slaves', 'Slave Count:')]: self.StaticText[key] = wx.StaticText(self, label=_(label)) self.TextCtrl[key] = wx.TextCtrl(self, size=wx.Size(130, 24), style=wx.TE_READONLY) - self.MasterStateSizer['innerMasterState'].AddMany([self.StaticText[key], self.TextCtrl[key]]) - + self.MasterStateSizer['innerMasterState'].AddMany([self.StaticText[key], self.TextCtrl[key]]) + self.MasterStateSizer['masterState'].AddSizer(self.MasterStateSizer['innerMasterState']) - - # ----------------------- Ethernet Network Card Information --------------------------------------- + + # ----------------------- Ethernet Network Card Information --------------------------------------- for key, label in [ ('Main', 'MAC Address:'), ('Link', 'Link State:'), @@ -2153,24 +2153,24 @@ self.StaticText[key] = wx.StaticText(self, label=_(label)) self.TextCtrl[key] = wx.TextCtrl(self, size=wx.Size(130, 24), style=wx.TE_READONLY) self.MasterStateSizer['innerDeviceInfo'].AddMany([self.StaticText[key], self.TextCtrl[key]]) - + self.MasterStateSizer['deviceInfo'].AddSizer(self.MasterStateSizer['innerDeviceInfo']) - + # ----------------------- Network Frame Information ----------------------------------------------- for key, label in [ - ('Tx frame rate [1/s]', 'Tx Frame Rate [1/s]:'), - ('Rx frame rate [1/s]', 'Tx Rate [kByte/s]:'), + ('Tx frame rate [1/s]', 'Tx Frame Rate [1/s]:'), + ('Rx frame rate [1/s]', 'Tx Rate [kByte/s]:'), ('Loss rate [1/s]', 'Loss Rate [1/s]:'), ('Frame loss [%]', 'Frame Loss [%]:')]: self.StaticText[key] = wx.StaticText(self, label=_(label)) self.MasterStateSizer['innerFrameInfo'].Add(self.StaticText[key]) - self.TextCtrl[key] = {} - for index in ['0', '1', '2']: + self.TextCtrl[key] = {} + for index in ['0', '1', '2']: self.TextCtrl[key][index] = wx.TextCtrl(self, size=wx.Size(130, 24), style=wx.TE_READONLY) self.MasterStateSizer['innerFrameInfo'].Add(self.TextCtrl[key][index]) - + self.MasterStateSizer['frameInfo'].AddSizer(self.MasterStateSizer['innerFrameInfo']) - + # --------------------------------- Main Sizer ---------------------------------------------------- for key, sub, in [ ('innerTopHalf', [ @@ -2184,7 +2184,7 @@ self.MasterStateSizer['main'].AddSizer(self.UpdateButton) self.MasterStateSizer['main'].AddSizer(self.MasterStateSizer['innerMain']) - + self.SetSizer(self.MasterStateSizer['main']) def OnButtonClick(self, event):