etherlab/EtherCATManagementEditor.py
changeset 2375 cfa68a06a24d
parent 2374 aed3ca79a10a
child 2377 88a9d64560d3
equal deleted inserted replaced
2374:aed3ca79a10a 2375:cfa68a06a24d
    23 import wx.grid as gridlib
    23 import wx.grid as gridlib
    24 # -------------------------------------------------------------
    24 # -------------------------------------------------------------
    25 
    25 
    26 # ------------ for register management ---------------
    26 # ------------ for register management ---------------
    27 from xml.dom import minidom
    27 from xml.dom import minidom
       
    28 from util.TranslationCatalogs import NoTranslate
    28 # -------------------------------------------------------------
    29 # -------------------------------------------------------------
    29 
    30 
    30 
    31 
    31 # ----------------------------- For Sync Manager Table -----------------------------------
    32 # ----------------------------- For Sync Manager Table -----------------------------------
    32 def GetSyncManagersTableColnames():
    33 def GetSyncManagersTableColnames():
    33     """
    34     """
    34     Returns column names of SyncManager Table in Slave state panel.
    35     Returns column names of SyncManager Table in Slave state panel.
    35     """
    36     """
    36     _ = lambda x : x
    37     _ = NoTranslate
    37     return ["#", _("Name"), _("Start Address"), _("Default Size"), _("Control Byte"), _("Enable")]
    38     return ["#", _("Name"), _("Start Address"), _("Default Size"), _("Control Byte"), _("Enable")]
    38 
    39 
    39 
    40 
    40 # -------------------------------------------------------------------------------
    41 # -------------------------------------------------------------------------------
    41 #                    Sync Managers Table
    42 #                    Sync Managers Table
   115         self.TextCtrlDic = {}
   116         self.TextCtrlDic = {}
   116         self.ButtonDic = {}
   117         self.ButtonDic = {}
   117 
   118 
   118         # iniitalize BoxSizer and FlexGridSizer
   119         # iniitalize BoxSizer and FlexGridSizer
   119         self.SizerDic = {
   120         self.SizerDic = {
   120             "SlaveState_main_sizer" : wx.BoxSizer(wx.VERTICAL),
   121             "SlaveState_main_sizer": wx.BoxSizer(wx.VERTICAL),
   121             "SlaveState_inner_main_sizer" : wx.FlexGridSizer(cols=1, hgap=50, rows=3, vgap=10),
   122             "SlaveState_inner_main_sizer": wx.FlexGridSizer(cols=1, hgap=50, rows=3, vgap=10),
   122             "SlaveInfosDetailsInnerSizer" : wx.FlexGridSizer(cols=4, hgap=10, rows=2, vgap=10),
   123             "SlaveInfosDetailsInnerSizer": wx.FlexGridSizer(cols=4, hgap=10, rows=2, vgap=10),
   123             "SyncManagerInnerSizer" : wx.FlexGridSizer(cols=1, hgap=5, rows=1, vgap=5),
   124             "SyncManagerInnerSizer": wx.FlexGridSizer(cols=1, hgap=5, rows=1, vgap=5),
   124             "SlaveState_sizer" : wx.FlexGridSizer(cols=1, hgap=10, rows=2, vgap=10),
   125             "SlaveState_sizer": wx.FlexGridSizer(cols=1, hgap=10, rows=2, vgap=10),
   125             "SlaveState_up_sizer" : wx.FlexGridSizer(cols=4, hgap=10, rows=2, vgap=10),
   126             "SlaveState_up_sizer": wx.FlexGridSizer(cols=4, hgap=10, rows=2, vgap=10),
   126             "SlaveState_down_sizer" : wx.FlexGridSizer(cols=2, hgap=10, rows=1, vgap=10)}
   127             "SlaveState_down_sizer": wx.FlexGridSizer(cols=2, hgap=10, rows=1, vgap=10)}
   127 
   128 
   128         # initialize StaticBox and StaticBoxSizer
   129         # initialize StaticBox and StaticBoxSizer
   129         for box_name, box_label in [
   130         for box_name, box_label in [
   130                 ("SlaveInfosDetailsBox", "Slave Informations"),
   131                 ("SlaveInfosDetailsBox", "Slave Informations"),
   131                 ("SyncManagerBox", "Sync Manager"),
   132                 ("SyncManagerBox", "Sync Manager"),
   148         self.SyncManagersGrid = CustomGrid(self, size=wx.Size(605, 155), style=wx.VSCROLL)
   149         self.SyncManagersGrid = CustomGrid(self, size=wx.Size(605, 155), style=wx.VSCROLL)
   149 
   150 
   150         self.SizerDic["SyncManagerInnerSizer"].Add(self.SyncManagersGrid)
   151         self.SizerDic["SyncManagerInnerSizer"].Add(self.SyncManagersGrid)
   151         self.SizerDic["SyncManagerBox"].Add(self.SizerDic["SyncManagerInnerSizer"])
   152         self.SizerDic["SyncManagerBox"].Add(self.SizerDic["SyncManagerInnerSizer"])
   152 
   153 
   153         for button_name, button_id, button_label, button_tooltipstring, event_method, sub_item in [
   154         buttons = [
   154                 ("InitButton",   0, "INIT", "State Transition to \"Init\" State",     self.OnButtonClick, []),
   155             ("InitButton",   0, "INIT", "State Transition to \"Init\" State",     self.OnButtonClick, []),
   155                 ("PreOPButton",  1, "PREOP", "State Transition to \"PreOP\" State",   self.OnButtonClick, [
   156             ("PreOPButton",  1, "PREOP", "State Transition to \"PreOP\" State",   self.OnButtonClick, [
   156                         ("TargetStateLabel", "Target State:" , "TargetState")]),
   157                 ("TargetStateLabel", "Target State:", "TargetState")]),
   157                 ("SafeOPButton", 2, "SAFEOP", "State Transition to \"SafeOP\" State", self.OnButtonClick, []),
   158             ("SafeOPButton", 2, "SAFEOP", "State Transition to \"SafeOP\" State", self.OnButtonClick, []),
   158                 ("OPButton",     3, "OP",  "State Transition to \"OP\" State",        self.OnButtonClick, [
   159             ("OPButton",     3, "OP",  "State Transition to \"OP\" State",        self.OnButtonClick, [
   159                         ("CurrentStateLabel", "Current State:", "CurrentState")])]:
   160                 ("CurrentStateLabel", "Current State:", "CurrentState")])
       
   161         ]
       
   162         for button_name, button_id, button_label, button_tooltipstring, event_method, sub_item in buttons:
   160             self.ButtonDic[button_name] = wx.Button(self, id=button_id, label=_(button_label))
   163             self.ButtonDic[button_name] = wx.Button(self, id=button_id, label=_(button_label))
   161             self.ButtonDic[button_name].Bind(wx.EVT_BUTTON, event_method)
   164             self.ButtonDic[button_name].Bind(wx.EVT_BUTTON, event_method)
   162             self.ButtonDic[button_name].SetToolTipString(button_tooltipstring)
   165             self.ButtonDic[button_name].SetToolTipString(button_tooltipstring)
   163             self.SizerDic["SlaveState_up_sizer"].Add(self.ButtonDic[button_name])
   166             self.SizerDic["SlaveState_up_sizer"].Add(self.ButtonDic[button_name])
   164             for statictext_name, statictext_label, textctrl_name in sub_item :
   167             for statictext_name, statictext_label, textctrl_name in sub_item:
   165                 self.StaticTextDic[statictext_name] = wx.StaticText(self, label=_(statictext_label))
   168                 self.StaticTextDic[statictext_name] = wx.StaticText(self, label=_(statictext_label))
   166                 self.TextCtrlDic[textctrl_name] = wx.TextCtrl(self, size=wx.DefaultSize, style=wx.TE_READONLY)
   169                 self.TextCtrlDic[textctrl_name] = wx.TextCtrl(self, size=wx.DefaultSize, style=wx.TE_READONLY)
   167                 self.SizerDic["SlaveState_up_sizer"].AddMany([self.StaticTextDic[statictext_name],
   170                 self.SizerDic["SlaveState_up_sizer"].AddMany([self.StaticTextDic[statictext_name],
   168                                                                self.TextCtrlDic[textctrl_name]])
   171                                                                self.TextCtrlDic[textctrl_name]])
   169 
   172 
   239         """
   242         """
   240         Event handler for slave state transition button click (Init, PreOP, SafeOP, OP button)
   243         Event handler for slave state transition button click (Init, PreOP, SafeOP, OP button)
   241         @param event : wx.EVT_BUTTON object
   244         @param event : wx.EVT_BUTTON object
   242         """
   245         """
   243         check_connect_flag = self.Controler.CommonMethod.CheckConnect(False)
   246         check_connect_flag = self.Controler.CommonMethod.CheckConnect(False)
   244         if check_connect_flag :
   247         if check_connect_flag:
   245             state_dic = ["INIT", "PREOP", "SAFEOP", "OP"]
   248             state_dic = ["INIT", "PREOP", "SAFEOP", "OP"]
   246 
   249 
   247             # If target state is one of {INIT, PREOP, SAFEOP}, request slave state transition immediately.
   250             # If target state is one of {INIT, PREOP, SAFEOP}, request slave state transition immediately.
   248             if event.GetId() < 3 :
   251             if event.GetId() < 3:
   249                 self.Controler.CommonMethod.RequestSlaveState(state_dic[event.GetId()])
   252                 self.Controler.CommonMethod.RequestSlaveState(state_dic[event.GetId()])
   250                 self.TextCtrlDic["TargetState"].SetValue(state_dic[event.GetId()])
   253                 self.TextCtrlDic["TargetState"].SetValue(state_dic[event.GetId()])
   251 
   254 
   252             # If target state is OP, first check "PLC status".
   255             # If target state is OP, first check "PLC status".
   253             #  (1) If current PLC status is "Started", then request slave state transition
   256             #  (1) If current PLC status is "Started", then request slave state transition
   254             #  (2) Otherwise, show error message and return
   257             #  (2) Otherwise, show error message and return
   255             else :
   258             else:
   256                 status, count = self.Controler.GetCTRoot()._connector.GetPLCstatus()
   259                 status, count = self.Controler.GetCTRoot()._connector.GetPLCstatus()
   257                 if status == "Started" :
   260                 if status == "Started":
   258                     self.Controler.CommonMethod.RequestSlaveState("OP")
   261                     self.Controler.CommonMethod.RequestSlaveState("OP")
   259                     self.TextCtrlDic["TargetState"].SetValue("OP")
   262                     self.TextCtrlDic["TargetState"].SetValue("OP")
   260                 else :
   263                 else:
   261                     self.Controler.CommonMethod.CreateErrorDialog("PLC is Not Started")
   264                     self.Controler.CommonMethod.CreateErrorDialog("PLC is Not Started")
   262 
   265 
   263     def GetCurrentState(self, event):
   266     def GetCurrentState(self, event):
   264         """
   267         """
   265         Timer event handler for periodic slave state monitoring (Default period: 1 sec = 1000 msec).
   268         Timer event handler for periodic slave state monitoring (Default period: 1 sec = 1000 msec).
   267         """
   270         """
   268         check_connect_flag = self.Controler.CommonMethod.CheckConnect(True)
   271         check_connect_flag = self.Controler.CommonMethod.CheckConnect(True)
   269         if check_connect_flag:
   272         if check_connect_flag:
   270             returnVal = self.Controler.CommonMethod.GetSlaveStateFromSlave()
   273             returnVal = self.Controler.CommonMethod.GetSlaveStateFromSlave()
   271             line = returnVal.split("\n")
   274             line = returnVal.split("\n")
   272             try :
   275             try:
   273                 self.SetCurrentState(line[self.Controler.GetSlavePos()])
   276                 self.SetCurrentState(line[self.Controler.GetSlavePos()])
   274             except Exception:
   277             except Exception:
   275                 pass
   278                 pass
   276 
   279 
   277     def SetCurrentState(self, line):
   280     def SetCurrentState(self, line):
   278         """
   281         """
   279         Show current slave state using the executiob result of "ethercat slaves" command.
   282         Show current slave state using the executiob result of "ethercat slaves" command.
   280         @param line : result of "ethercat slaves" command
   283         @param line : result of "ethercat slaves" command
   281         """
   284         """
   282         state_array = ["INIT", "PREOP", "SAFEOP", "OP"]
   285         state_array = ["INIT", "PREOP", "SAFEOP", "OP"]
   283         try :
   286         try:
   284             # parse the execution result of  "ethercat slaves" command
   287             # parse the execution result of  "ethercat slaves" command
   285             # Result example : 0  0:0  PREOP  +  EL9800 (V4.30) (PIC24, SPI, ET1100)
   288             # Result example : 0  0:0  PREOP  +  EL9800 (V4.30) (PIC24, SPI, ET1100)
   286             token = line.split("  ")
   289             token = line.split("  ")
   287             if token[2] in state_array:
   290             if token[2] in state_array:
   288                 self.TextCtrlDic["CurrentState"].SetValue(token[2])
   291                 self.TextCtrlDic["CurrentState"].SetValue(token[2])
   357         if check_connect_flag:
   360         if check_connect_flag:
   358             self.SDOs = self.Controler.CommonMethod.GetSlaveSDOFromSlave()
   361             self.SDOs = self.Controler.CommonMethod.GetSlaveSDOFromSlave()
   359             # SDOFlag is "False", user click "Cancel" button
   362             # SDOFlag is "False", user click "Cancel" button
   360             self.SDOFlag = self.SDOParser()
   363             self.SDOFlag = self.SDOParser()
   361 
   364 
   362             if self.SDOFlag :
   365             if self.SDOFlag:
   363                 self.CallSDONoteBook.CreateNoteBook()
   366                 self.CallSDONoteBook.CreateNoteBook()
   364                 self.Refresh()
   367                 self.Refresh()
   365 
   368 
   366     def SDOParser(self):
   369     def SDOParser(self):
   367         """
   370         """
   387             line_token = details_line.split("\"")
   390             line_token = details_line.split("\"")
   388             # len(line_token[2]) case : SDO 0x1000, "Device type"
   391             # len(line_token[2]) case : SDO 0x1000, "Device type"
   389             if len(line_token[2]) == 0:
   392             if len(line_token[2]) == 0:
   390                 title_name = line_token[1]
   393                 title_name = line_token[1]
   391             # else case : 0x1000:00,r-r-r-,uint32,32 bit,"Device type",0x00020192, 131474
   394             # else case : 0x1000:00,r-r-r-,uint32,32 bit,"Device type",0x00020192, 131474
   392             else :
   395             else:
   393                 # line_token = ['0x1000:00,r-r-r-,uint32,32 bit,', 'Device type', ',0x00020192, 131474']
   396                 # line_token = ['0x1000:00,r-r-r-,uint32,32 bit,', 'Device type', ',0x00020192, 131474']
   394                 token_head, name, token_tail = line_token
   397                 token_head, name, token_tail = line_token
   395 
   398 
   396                 # token_head = ['0x1000:00', 'r-r-r-', 'uint32', '32 bit', '']
   399                 # token_head = ['0x1000:00', 'r-r-r-', 'uint32', '32 bit', '']
   397                 token_head = token_head.split(",")
   400                 token_head = token_head.split(",")
   399                 # ful_idx.split(":") = ['0x1000', '00']
   402                 # ful_idx.split(":") = ['0x1000', '00']
   400                 idx, sub_idx = ful_idx.split(":")
   403                 idx, sub_idx = ful_idx.split(":")
   401 
   404 
   402                 # token_tail = ['', '0x00020192', '131474']
   405                 # token_tail = ['', '0x00020192', '131474']
   403                 token_tail = token_tail.split(",")
   406                 token_tail = token_tail.split(",")
   404                 try :
   407                 try:
   405                     empty, hex_val, dec_val = token_tail
   408                     empty, hex_val, dec_val = token_tail
   406 
   409 
   407                 # SDO data is not return "dec value"
   410                 # SDO data is not return "dec value"
   408                 # line example :
   411                 # line example :
   409                 # 0x1702:01,rwr-r-,uint32,32 bit," 1st mapping", ----
   412                 # 0x1702:01,rwr-r-,uint32,32 bit," 1st mapping", ----
   423                              'type': type.strip(), 'size': size.strip(),  'name': name_after_check.strip("\""),
   426                              'type': type.strip(), 'size': size.strip(),  'name': name_after_check.strip("\""),
   424                              'value': hex_val.strip(), "category": title_name.strip("\"")}
   427                              'value': hex_val.strip(), "category": title_name.strip("\"")}
   425 
   428 
   426                 category_divide_value = [0x1000, 0x2000, 0x6000, 0xa000, 0xffff]
   429                 category_divide_value = [0x1000, 0x2000, 0x6000, 0xa000, 0xffff]
   427 
   430 
   428                 for count in range(len(category_divide_value)) :
   431                 for count in range(len(category_divide_value)):
   429                     if int(idx, 0) < category_divide_value[count]:
   432                     if int(idx, 0) < category_divide_value[count]:
   430                         self.Controler.CommonMethod.SaveSDOData[count].append(self.Data)
   433                         self.Controler.CommonMethod.SaveSDOData[count].append(self.Data)
   431                         break
   434                         break
   432 
   435 
   433                 self.Controler.CommonMethod.SaveSDOData[self.AllSDOData].append(self.Data)
   436                 self.Controler.CommonMethod.SaveSDOData[self.AllSDOData].append(self.Data)
   455         # !"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~ \t\n\r\x0b\x0c
   458         # !"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~ \t\n\r\x0b\x0c
   456         allow_range = string.printable
   459         allow_range = string.printable
   457         result = check_string
   460         result = check_string
   458         for i in range(0, len(check_string)):
   461         for i in range(0, len(check_string)):
   459             # string.isalnum() is check whether string is alphanumeric or not
   462             # string.isalnum() is check whether string is alphanumeric or not
   460             if check_string[len(check_string)-1-i:len(check_string)-i] in allow_range :
   463             if check_string[len(check_string)-1-i:len(check_string)-i] in allow_range:
   461                 result = check_string[:len(check_string) - i]
   464                 result = check_string[:len(check_string) - i]
   462                 break
   465                 break
   463         return result
   466         return result
   464 
   467 
   465 
   468 
   538                               style=wx.EXPAND | wx.ALIGN_CENTRE_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL)
   541                               style=wx.EXPAND | wx.ALIGN_CENTRE_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL)
   539 
   542 
   540         self.Controler = parent.Controler
   543         self.Controler = parent.Controler
   541         self.parent = parent
   544         self.parent = parent
   542         self.SDOFlag = True
   545         self.SDOFlag = True
   543         if data is None :
   546         if data is None:
   544             self.SDOs = []
   547             self.SDOs = []
   545         else :
   548         else:
   546             self.SDOs = data
   549             self.SDOs = data
   547 
   550 
   548         self.CreateGrid(len(self.SDOs), 8)
   551         self.CreateGrid(len(self.SDOs), 8)
   549         SDOCellSize = [(0, 65), (1, 65), (2, 50), (3, 55),
   552         SDOCellSize = [(0, 65), (1, 65), (2, 50), (3, 55),
   550                          (4, 40), (5, 200), (6, 250), (7, 85)]
   553                          (4, 40), (5, 200), (6, 250), (7, 85)]
   581         sdo_list = ['idx', 'subIdx', 'access', 'type', 'size', 'category', 'name', 'value']
   584         sdo_list = ['idx', 'subIdx', 'access', 'type', 'size', 'category', 'name', 'value']
   582         for row_idx in range(len(self.SDOs)):
   585         for row_idx in range(len(self.SDOs)):
   583             for col_idx in range(len(self.SDOs[row_idx])):
   586             for col_idx in range(len(self.SDOs[row_idx])):
   584                 self.SetCellValue(row_idx, col_idx, self.SDOs[row_idx][sdo_list[col_idx]])
   587                 self.SetCellValue(row_idx, col_idx, self.SDOs[row_idx][sdo_list[col_idx]])
   585                 self.SetReadOnly(row_idx, col_idx, True)
   588                 self.SetReadOnly(row_idx, col_idx, True)
   586                 if col_idx < 5 :
   589                 if col_idx < 5:
   587                     self.SetCellAlignment(row_idx, col_idx, wx.ALIGN_CENTRE, wx.ALIGN_CENTRE)
   590                     self.SetCellAlignment(row_idx, col_idx, wx.ALIGN_CENTRE, wx.ALIGN_CENTRE)
   588 
   591 
   589     def CheckSDODataAccess(self, row):
   592     def CheckSDODataAccess(self, row):
   590         """
   593         """
   591         CheckSDODataAccess method is checking that access data has "w"
   594         CheckSDODataAccess method is checking that access data has "w"
   596         @param row : Selected cell by user
   599         @param row : Selected cell by user
   597         @return Write_flag : If data has "w", flag is true
   600         @return Write_flag : If data has "w", flag is true
   598         """
   601         """
   599         write_flag = False
   602         write_flag = False
   600         check = self.SDOs[row]['access']
   603         check = self.SDOs[row]['access']
   601         if check[1:2] == 'w' :
   604         if check[1:2] == 'w':
   602             self.Controler.CommonMethod.Check_PREOP = True
   605             self.Controler.CommonMethod.Check_PREOP = True
   603             write_flag = True
   606             write_flag = True
   604         if check[3:4] == 'w' :
   607         if check[3:4] == 'w':
   605             self.Controler.CommonMethod.Check_SAFEOP = True
   608             self.Controler.CommonMethod.Check_SAFEOP = True
   606             write_flag = True
   609             write_flag = True
   607         if check[5:] == 'w' :
   610         if check[5:] == 'w':
   608             self.Controler.CommonMethod.Check_OP = True
   611             self.Controler.CommonMethod.Check_OP = True
   609             write_flag = True
   612             write_flag = True
   610 
   613 
   611         return write_flag
   614         return write_flag
   612 
   615 
   617         @param state : current slave state
   620         @param state : current slave state
   618         @return True or False
   621         @return True or False
   619         """
   622         """
   620         # Example of 'state' parameter : "0  0:0  PREOP  +  EL9800 (V4.30) (PIC24, SPI, ET1100)"
   623         # Example of 'state' parameter : "0  0:0  PREOP  +  EL9800 (V4.30) (PIC24, SPI, ET1100)"
   621         state = state[self.Controler.GetSlavePos()].split("  ")[2]
   624         state = state[self.Controler.GetSlavePos()].split("  ")[2]
   622         if state == "PREOP" and self.Controler.CommonMethod.Check_PREOP :
   625         if state == "PREOP" and self.Controler.CommonMethod.Check_PREOP:
   623             return True
   626             return True
   624         elif state == "SAFEOP" and self.Controler.CommonMethod.Check_SAFEOP :
   627         elif state == "SAFEOP" and self.Controler.CommonMethod.Check_SAFEOP:
   625             return True
   628             return True
   626         elif state == "OP" and self.Controler.CommonMethod.Check_OP :
   629         elif state == "OP" and self.Controler.CommonMethod.Check_OP:
   627             return True
   630             return True
   628 
   631 
   629         return False
   632         return False
   630 
   633 
   631     def ClearStateFlag(self):
   634     def ClearStateFlag(self):
   644         @param event : gridlib.EVT_GRID_CELL_LEFT_DCLICK object
   647         @param event : gridlib.EVT_GRID_CELL_LEFT_DCLICK object
   645         """
   648         """
   646         self.ClearStateFlag()
   649         self.ClearStateFlag()
   647 
   650 
   648         # CheckSDODataAccess is checking that OD(Object Dictionary) has "w"
   651         # CheckSDODataAccess is checking that OD(Object Dictionary) has "w"
   649         if event.GetCol() == 7 and self.CheckSDODataAccess(event.GetRow()) :
   652         if event.GetCol() == 7 and self.CheckSDODataAccess(event.GetRow()):
   650             dlg = wx.TextEntryDialog (self, "Enter hex or dec value (if enter dec value, it automatically conversed hex value)",
   653             dlg = wx.TextEntryDialog (self, "Enter hex or dec value (if enter dec value, it automatically conversed hex value)",
   651                                       "SDOModifyDialog", style=wx.OK | wx.CANCEL)
   654                                       "SDOModifyDialog", style=wx.OK | wx.CANCEL)
   652 
   655 
   653             start_value = self.GetCellValue(event.GetRow(), event.GetCol())
   656             start_value = self.GetCellValue(event.GetRow(), event.GetCol())
   654             dlg.SetValue(start_value)
   657             dlg.SetValue(start_value)
   655 
   658 
   656             if dlg.ShowModal() == wx.ID_OK:
   659             if dlg.ShowModal() == wx.ID_OK:
   657                 try :
   660                 try:
   658                     int(dlg.GetValue(), 0)
   661                     int(dlg.GetValue(), 0)
   659                     # check "Access" field
   662                     # check "Access" field
   660                     if self.DecideSDODownload(self.Controler.CommonMethod.SlaveState[self.Controler.GetSlavePos()]) :
   663                     if self.DecideSDODownload(self.Controler.CommonMethod.SlaveState[self.Controler.GetSlavePos()]):
   661                         # Request "SDODownload"
   664                         # Request "SDODownload"
   662                         self.Controler.CommonMethod.SDODownload(self.SDOs[event.GetRow()]['type'], self.SDOs[event.GetRow()]['idx'],
   665                         self.Controler.CommonMethod.SDODownload(self.SDOs[event.GetRow()]['type'], self.SDOs[event.GetRow()]['idx'],
   663                                                    self.SDOs[event.GetRow()]['subIdx'], dlg.GetValue())
   666                                                    self.SDOs[event.GetRow()]['subIdx'], dlg.GetValue())
   664                         self.SetCellValue(event.GetRow(), event.GetCol(), hex(int(dlg.GetValue(), 0)))
   667                         self.SetCellValue(event.GetRow(), event.GetCol(), hex(int(dlg.GetValue(), 0)))
   665                     else :
   668                     else:
   666                         self.Controler.CommonMethod.CreateErrorDialog('You cannot SDO download this state')
   669                         self.Controler.CommonMethod.CreateErrorDialog('You cannot SDO download this state')
   667                 # Error occured process of "int(variable)"
   670                 # Error occured process of "int(variable)"
   668                 # User input is not hex, dec value
   671                 # User input is not hex, dec value
   669                 except ValueError:
   672                 except ValueError:
   670                     self.Controler.CommonMethod.CreateErrorDialog('You can input only hex, dec value')
   673                     self.Controler.CommonMethod.CreateErrorDialog('You can input only hex, dec value')
   756         count = 0
   759         count = 0
   757         page_texts = []
   760         page_texts = []
   758 
   761 
   759         self.Controler.CommonMethod.RequestPDOInfo()
   762         self.Controler.CommonMethod.RequestPDOInfo()
   760 
   763 
   761         if name == "Tx" :
   764         if name == "Tx":
   762             # obtain pdo_info and pdo_entry
   765             # obtain pdo_info and pdo_entry
   763             # pdo_info include (PDO index, name, number of entry)
   766             # pdo_info include (PDO index, name, number of entry)
   764             pdo_info = self.Controler.CommonMethod.GetTxPDOCategory()
   767             pdo_info = self.Controler.CommonMethod.GetTxPDOCategory()
   765             pdo_entry = self.Controler.CommonMethod.GetTxPDOInfo()
   768             pdo_entry = self.Controler.CommonMethod.GetTxPDOInfo()
   766             for tmp in pdo_info :
   769             for tmp in pdo_info:
   767                 title = str(hex(tmp['pdo_index']))
   770                 title = str(hex(tmp['pdo_index']))
   768                 page_texts.append(title)
   771                 page_texts.append(title)
   769         # RX PDO case
   772         # RX PDO case
   770         else :
   773         else:
   771             pdo_info = self.Controler.CommonMethod.GetRxPDOCategory()
   774             pdo_info = self.Controler.CommonMethod.GetRxPDOCategory()
   772             pdo_entry = self.Controler.CommonMethod.GetRxPDOInfo()
   775             pdo_entry = self.Controler.CommonMethod.GetRxPDOInfo()
   773             for tmp in pdo_info :
   776             for tmp in pdo_info:
   774                 title = str(hex(tmp['pdo_index']))
   777                 title = str(hex(tmp['pdo_index']))
   775                 page_texts.append(title)
   778                 page_texts.append(title)
   776 
   779 
   777         # Add page depending on the number of pdo_info
   780         # Add page depending on the number of pdo_info
   778         for txt in page_texts:
   781         for txt in page_texts:
   844         """
   847         """
   845         Cell is filled by new parsing data in XML
   848         Cell is filled by new parsing data in XML
   846         """
   849         """
   847         list_index = 0
   850         list_index = 0
   848         # number of entry
   851         # number of entry
   849         for i in range(self.Count + 1) :
   852         for i in range(self.Count + 1):
   850             list_index += self.PDOInfo[i]['number_of_entry']
   853             list_index += self.PDOInfo[i]['number_of_entry']
   851 
   854 
   852         start_value = list_index - self.PDOInfo[self.Count]['number_of_entry']
   855         start_value = list_index - self.PDOInfo[self.Count]['number_of_entry']
   853 
   856 
   854         pdo_list = ['entry_index', 'subindex', 'bitlen', 'type', 'name']
   857         pdo_list = ['entry_index', 'subindex', 'bitlen', 'type', 'name']
   855         for row_idx in range(self.PDOInfo[self.Count]['number_of_entry']):
   858         for row_idx in range(self.PDOInfo[self.Count]['number_of_entry']):
   856             for col_idx in range(len(self.PDOEntry[row_idx])):
   859             for col_idx in range(len(self.PDOEntry[row_idx])):
   857                 # entry index is converted hex value.
   860                 # entry index is converted hex value.
   858                 if col_idx == 0 :
   861                 if col_idx == 0:
   859                     self.SetCellValue(row_idx, col_idx, hex(self.PDOEntry[start_value][pdo_list[col_idx]]))
   862                     self.SetCellValue(row_idx, col_idx, hex(self.PDOEntry[start_value][pdo_list[col_idx]]))
   860                 else :
   863                 else:
   861                     self.SetCellValue(row_idx, col_idx, str(self.PDOEntry[start_value][pdo_list[col_idx]]))
   864                     self.SetCellValue(row_idx, col_idx, str(self.PDOEntry[start_value][pdo_list[col_idx]]))
   862                 if col_idx != 4 :
   865                 if col_idx != 4:
   863                     self.SetCellAlignment(row_idx, col_idx, wx.ALIGN_CENTRE, wx.ALIGN_CENTRE)
   866                     self.SetCellAlignment(row_idx, col_idx, wx.ALIGN_CENTRE, wx.ALIGN_CENTRE)
   864                 else :
   867                 else:
   865                     self.SetCellAlignment(row_idx, col_idx, wx.ALIGN_LEFT, wx.ALIGN_CENTRE)
   868                     self.SetCellAlignment(row_idx, col_idx, wx.ALIGN_LEFT, wx.ALIGN_CENTRE)
   866                 self.SetReadOnly(row_idx, col_idx, True)
   869                 self.SetReadOnly(row_idx, col_idx, True)
   867                 self.SetRowSize(row_idx, 25)
   870                 self.SetRowSize(row_idx, 25)
   868             start_value += 1
   871             start_value += 1
   869 
   872 
   904         wx.Panel.__init__(self, parent, -1)
   907         wx.Panel.__init__(self, parent, -1)
   905         self.parent = parent
   908         self.parent = parent
   906         self.Controler = controler
   909         self.Controler = controler
   907 
   910 
   908         self.PDIType = {
   911         self.PDIType = {
   909             0  : ['none', '00000000'],
   912             0: ['none', '00000000'],
   910             4  : ['Digital I/O', '00000100'],
   913             4: ['Digital I/O', '00000100'],
   911             5  : ['SPI Slave', '00000101'],
   914             5: ['SPI Slave', '00000101'],
   912             7  : ['EtherCAT Bridge (port3)', '00000111'],
   915             7: ['EtherCAT Bridge (port3)', '00000111'],
   913             8  : ['uC async. 16bit', '00001000'],
   916             8: ['uC async. 16bit', '00001000'],
   914             9  : ['uC async. 8bit', '00001001'],
   917             9: ['uC async. 8bit', '00001001'],
   915             10 : ['uC sync. 16bit', '00001010'],
   918             10: ['uC sync. 16bit', '00001010'],
   916             11 : ['uC sync. 8bit', '00001011'],
   919             11: ['uC sync. 8bit', '00001011'],
   917             16 : ['32 Digtal Input and 0 Digital Output', '00010000'],
   920             16: ['32 Digtal Input and 0 Digital Output', '00010000'],
   918             17 : ['24 Digtal Input and 8 Digital Output', '00010001'],
   921             17: ['24 Digtal Input and 8 Digital Output', '00010001'],
   919             18 : ['16 Digtal Input and 16 Digital Output', '00010010'],
   922             18: ['16 Digtal Input and 16 Digital Output', '00010010'],
   920             19 : ['8 Digtal Input and 24 Digital Output', '00010011'],
   923             19: ['8 Digtal Input and 24 Digital Output', '00010011'],
   921             20 : ['0 Digtal Input and 32 Digital Output', '00010100'],
   924             20: ['0 Digtal Input and 32 Digital Output', '00010100'],
   922             128: ['On-chip bus', '11111111']
   925             128: ['On-chip bus', '11111111']
   923         }
   926         }
   924 
   927 
   925         sizer = wx.FlexGridSizer(cols=1, hgap=5, rows=2, vgap=5)
   928         sizer = wx.FlexGridSizer(cols=1, hgap=5, rows=2, vgap=5)
   926         button_sizer = wx.FlexGridSizer(cols=2, hgap=5, rows=1, vgap=5)
   929         button_sizer = wx.FlexGridSizer(cols=2, hgap=5, rows=1, vgap=5)
  1049         """
  1052         """
  1050         Set data based on slave EEPROM.
  1053         Set data based on slave EEPROM.
  1051         """
  1054         """
  1052         # sii_dict = { Parameter : (WordAddress, WordSize) }
  1055         # sii_dict = { Parameter : (WordAddress, WordSize) }
  1053         sii_dict = {
  1056         sii_dict = {
  1054             'PDIControl' :                          ('0', 1),
  1057             'PDIControl':                          ('0', 1),
  1055             'PDIConfiguration' :                    ('1', 1),
  1058             'PDIConfiguration':                    ('1', 1),
  1056             'PulseLengthOfSYNCSignals' :            ('2', 1),
  1059             'PulseLengthOfSYNCSignals':            ('2', 1),
  1057             'ExtendedPDIConfiguration' :            ('3', 1),
  1060             'ExtendedPDIConfiguration':            ('3', 1),
  1058             'ConfiguredStationAlias' :              ('4', 1),
  1061             'ConfiguredStationAlias':              ('4', 1),
  1059             'Checksum' :                            ('7', 1),
  1062             'Checksum':                            ('7', 1),
  1060             'VendorID' :                            ('8', 2),
  1063             'VendorID':                            ('8', 2),
  1061             'ProductCode' :                         ('a', 2),
  1064             'ProductCode':                         ('a', 2),
  1062             'RevisionNumber' :                      ('c', 2),
  1065             'RevisionNumber':                      ('c', 2),
  1063             'SerialNumber' :                        ('e', 2),
  1066             'SerialNumber':                        ('e', 2),
  1064             'Execution Delay' :                     ('10', 1),
  1067             'Execution Delay':                     ('10', 1),
  1065             'Port0Delay' :                          ('11', 1),
  1068             'Port0Delay':                          ('11', 1),
  1066             'Port1Delay' :                          ('12', 1),
  1069             'Port1Delay':                          ('12', 1),
  1067             'BootstrapReceiveMailboxOffset' :       ('14', 1),
  1070             'BootstrapReceiveMailboxOffset':       ('14', 1),
  1068             'BootstrapReceiveMailboxSize' :         ('15', 1),
  1071             'BootstrapReceiveMailboxSize':         ('15', 1),
  1069             'BootstrapSendMailboxOffset' :          ('16', 1),
  1072             'BootstrapSendMailboxOffset':          ('16', 1),
  1070             'BootstrapSendMailboxSize' :            ('17', 1),
  1073             'BootstrapSendMailboxSize':            ('17', 1),
  1071             'StandardReceiveMailboxOffset' :        ('18', 1),
  1074             'StandardReceiveMailboxOffset':        ('18', 1),
  1072             'StandardReceiveMailboxSize' :          ('19', 1),
  1075             'StandardReceiveMailboxSize':          ('19', 1),
  1073             'StandardSendMailboxOffset' :           ('1a', 1),
  1076             'StandardSendMailboxOffset':           ('1a', 1),
  1074             'StandardSendMailboxSize' :             ('1b', 1),
  1077             'StandardSendMailboxSize':             ('1b', 1),
  1075             'MailboxProtocol' :                     ('1c', 1),
  1078             'MailboxProtocol':                     ('1c', 1),
  1076             'Size' :                                ('3e', 1),
  1079             'Size':                                ('3e', 1),
  1077             'Version' :                             ('3f', 1),
  1080             'Version':                             ('3f', 1),
  1078             'First Category Type/Vendor Specific' : ('40', 1),
  1081             'First Category Type/Vendor Specific': ('40', 1),
  1079             'Following Category Word Size' :        ('41', 1),
  1082             'Following Category Word Size':        ('41', 1),
  1080             'Category Data' :                       ('42', 1),
  1083             'Category Data':                       ('42', 1),
  1081         }
  1084         }
  1082 
  1085 
  1083         # Config Data: EEPROM Size, PDI Type, Device Emulation
  1086         # Config Data: EEPROM Size, PDI Type, Device Emulation
  1084         # EEPROM's data in address '0x003f' is Size of EEPROM in KBit-1
  1087         # EEPROM's data in address '0x003f' is Size of EEPROM in KBit-1
  1085         eeprom_size = str((int(self.GetWordAddressData(sii_dict.get('Size'), 10))+1)/8*1024)
  1088         eeprom_size = str((int(self.GetWordAddressData(sii_dict.get('Size'), 10))+1)/8*1024)
  1256         self.Controler = controler
  1259         self.Controler = controler
  1257 
  1260 
  1258         self.HexRow = 8
  1261         self.HexRow = 8
  1259         self.HexCol = 17
  1262         self.HexCol = 17
  1260 
  1263 
  1261         self.HexViewSizer = {"view" : wx.FlexGridSizer(cols=1, hgap=10, rows=2, vgap=10),
  1264         self.HexViewSizer = {"view": wx.FlexGridSizer(cols=1, hgap=10, rows=2, vgap=10),
  1262                              "siiButton" : wx.BoxSizer()}
  1265                              "siiButton": wx.BoxSizer()}
  1263         self.HexViewButton = {}
  1266         self.HexViewButton = {}
  1264 
  1267 
  1265         for key, evt_handler in [("Sii Upload", self.OnButtonSiiUpload),
  1268         for key, evt_handler in [("Sii Upload", self.OnButtonSiiUpload),
  1266                                 ("Sii Download", self.OnButtonSiiDownload),
  1269                                 ("Sii Download", self.OnButtonSiiDownload),
  1267                                 ("Write to File", self.OnButtonWriteToBinFile),
  1270                                 ("Write to File", self.OnButtonWriteToBinFile),
  1726             self.BasicSetData()
  1729             self.BasicSetData()
  1727             self.ParseData()
  1730             self.ParseData()
  1728             # set data into UI
  1731             # set data into UI
  1729             if self.CompactFlag:
  1732             if self.CompactFlag:
  1730                 self.ToggleCompactViewCheckbox(True)
  1733                 self.ToggleCompactViewCheckbox(True)
  1731             else :
  1734             else:
  1732                 for index in range(4):
  1735                 for index in range(4):
  1733                     self.RegisterNotebook.RegPage[index].UpdateMainTable(self.MainRow[index], self.MainCol,
  1736                     self.RegisterNotebook.RegPage[index].UpdateMainTable(self.MainRow[index], self.MainCol,
  1734                                                                          self.PageRange[index][0], self.PageRange[index][1],
  1737                                                                          self.PageRange[index][0], self.PageRange[index][1],
  1735                                                                          self.RegMonitorData)
  1738                                                                          self.RegMonitorData)
  1736 
  1739 
  2119         self.StaticBox = {}
  2122         self.StaticBox = {}
  2120         self.StaticText = {}
  2123         self.StaticText = {}
  2121         self.TextCtrl = {}
  2124         self.TextCtrl = {}
  2122 
  2125 
  2123         # ----------------------- Main Sizer and Update Button --------------------------------------------
  2126         # ----------------------- Main Sizer and Update Button --------------------------------------------
  2124         self.MasterStateSizer = {"main" : wx.BoxSizer(wx.VERTICAL)}
  2127         self.MasterStateSizer = {"main": wx.BoxSizer(wx.VERTICAL)}
  2125         for key, attr in [
  2128         for key, attr in [
  2126             ("innerMain",           [1, 10, 2, 10]),
  2129             ("innerMain",           [1, 10, 2, 10]),
  2127             ("innerTopHalf",        [2, 10, 1, 10]),
  2130             ("innerTopHalf",        [2, 10, 1, 10]),
  2128             ("innerBottomHalf",     [2, 10, 1, 10]),
  2131             ("innerBottomHalf",     [2, 10, 1, 10]),
  2129             ("innerMasterState",    [2, 10, 3, 10]),
  2132             ("innerMasterState",    [2, 10, 3, 10]),
  2210                     if isinstance(self.TextCtrl[key], dict):
  2213                     if isinstance(self.TextCtrl[key], dict):
  2211                         for index in self.TextCtrl[key]:
  2214                         for index in self.TextCtrl[key]:
  2212                             self.TextCtrl[key][index].SetValue(self.MasterState[key][int(index)])
  2215                             self.TextCtrl[key][index].SetValue(self.MasterState[key][int(index)])
  2213                     else:
  2216                     else:
  2214                         self.TextCtrl[key].SetValue(self.MasterState[key][0])
  2217                         self.TextCtrl[key].SetValue(self.MasterState[key][0])
  2215         else :
  2218         else:
  2216             self.Controler.CommonMethod.CreateErrorDialog('PLC not connected!')
  2219             self.Controler.CommonMethod.CreateErrorDialog('PLC not connected!')