etherlab/EtherCATManagementEditor.py
changeset 2355 fec77f2b9e07
parent 2354 9460872f1440
child 2356 c26e0c66d8d5
--- 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):